2013.11.24
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第514回]


●PICのテーブル参照 retlw命令とPCLATHレジスタ(2)

前回からの続きです。
PICの命令はZ80などに比べるとちょっと変わっています。
テーブル参照の方法もその例外ではなく、retlwというこれまた一風変わった命令を使います。
もっともretlw命令は必須ではなく、他にいろいろ応用が利きます。
むしろ注目すべきはテーブルの先頭に置かれる
addwf PCL,f
です。

PCLはプログラムカウンタの下位8ビットです。
上の命令を実行すると、wレジスタの値がPCLに加算されます。
たとえば今 addwf PCL,f がアドレス0087に置かれていたとすると、この命令が読み込まれた時点でプログラムカウンタはその次のアドレスを示しますから、PCLには88が入ります。
このときwレジスタの値が03だったとすると、この命令の実行後はPCLの値は8Bになります。
つまりプログラムカウンタの値は008Bになるので、その次にはアドレス008Bに置かれた命令が実行されることになります。

これは実は計算型GOTO文であると考えることができます。
上の動作に近い計算型のGOTO文をZ80の命令で書いてみますと、
LD HL,tabletop
ADD A,L
LD L,A
JP (HL)
になります。
もっともZ80にはretlwに相当する命令はありませんから、これだけでは本当のテーブル参照のプログラムにはなりません。
これはあくまで addwf PCL,f を説明するために例示しただけのプログラムで実用性はありません。

さて、このようにZ80の命令に置き換えてみますとすぐに気がつきますように、このままでは加算後の桁上がりが結果に反映されませんから、テーブルアドレスには注意が必要になります。
安全のためにはテーブルの開始アドレスがL=00になるようにし、かつテーブルのデータが256バイトを越えないようにしなければなりません。

Z80の場合、そのような制約にとらわれないようにするには、たとえば
LD HL,tabletop
LD D,00
LD E,A
ADD HL,DE
JP (HL)
というようにすることが考えられます。

しかしPICにはそのようにプログラムカウンタの上位アドレスを含めて加算するような命令は用意されていません。
PIC16Fの場合、プログラムカウンタは13ビットです。
つまり0 0000 0000 0000〜1 1111 1111 1111(0000〜1FFF)の8KBのアドレス空間が直接アクセスできるプログラム空間となります。

余談になりますが、CALL GOTO命令のオペランドは11ビットしかありません。
ということはCALL、GOTO命令が直接アクセスできるアドレスは000〜7FFの2KBになります。
しかしPIC16F887の場合プログラムメモリは8KBあります。
そこでその8KBのアドレスをアクセスするためにページングの手法がとられています。


[出典]Microchip Technology Inc. PIC16F887 Data Sheet

ああ。いけません。
だんだんわき道にそれていってしまいます。
お話をテーブル参照に戻します。

PIC16Fの場合、プログラムカウンタは13ビットです、というところまで説明をしました。
その13ビットのうち下位8ビットがPCLですから、
addlw PCL,f
を実行してもプログラムカウンタの上位5ビットを変えることはできない、ということは不満ではありますが納得するしかありませんでしょう。

さてここからが、今回私がはまってしまった問題です。
そのようにプログラムカウンタの下位8ビットしか変えることはできないとしましても、しかし上位5ビットには addlw PCL,f が置かれているアドレスが入っているはずです。
なぜなら、そこへはCALL命令を実行した結果来ているのですから、当然プログラムカウンタにはそのアドレスが入っていなければならないはずだからです。

それならば、たとえばテーブルを置くアドレスを下位8ビットが00になるように考えて
   org 0300
table
   addwf PCL,f
   retlw XX
   …
のようにしても、CALL tableを実行すれば、プログラムカウンタの上位アドレスは03になるはずだから、正しくアクセスされるはず、と考えたのです。
実際このときプログラムカウンタの上位アドレスが03になることは間違いはありません。
しかし。
このプログラムを実行させてみますと、見事に暴走してしまいます。
なぜだ???

いろいろ調べてみました結果、この場合にはどうやらPCLATHレジスタに03を入れておかなければならないらしいということがわかってきました。


[出典]Microchip Technology Inc. PIC16F887 Data Sheet

しかし、しかし。
それはおかしいではないか。
なんで、PCLATHなんてレジスタがいるのさ。
それは面倒なだけで、全く余計なことではないか。
Microchipの技術者は一体何を考えているのだ?
この時点では、私はPCLATHが必要なわけを全く理解していませんでした。

かくして、PCLATHレジスタの本当の存在理由が把握できるまで、およそ丸1日を費やしてしまうことになったのでありました。

時間がなくなってしまいました。
次回に続きます。

ワンボードマイコンでCP/Mを![第514回]
2013.11.24upload

前へ
次へ
ホームページトップへ戻る