2014.9.14

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第38回]


●Dレジスタがおかしい?そしてRBレジスタがクリアされてしまう?

前回の続きです。
テストプログラムを作って実行してみたところ、アドレス820Bから8221の間で異常が発生していることがわかりました。
テストプログラムのその部分ではRBレジスタの仮数部を右にシフトしています。
FAレジスタに加算するためにFAレジスタに桁位置を合わせるためです。
FAレジスタの指数部は00で、RBレジスタの指数部はFA(−6)ですから、RBレジスタの仮数部を右に6ビットシフトするとともに、RBレジスタの指数部を00にします。
プログラムを見ますと確かにそういう処理を行なっています。

              ;shift right RB & RBE++;till A=0
8206 47       RBFA4:MOV B,A
8207 3A10F1     LDA RB7
820A 57         MOV D,A
820B CD1D83     CALL FADSP
820E 210FF1   RBFA42:LXI H,RB6
8211 0E04       MVI C,04
8213 AF         XRA A;reset cf
8214 7E       RBFA43:MOV A,M
8215 1F         RAR
8216 77         MOV M,A
8217 2B         DCX H
8218 0D         DCR C
8219 C21482     JNZ RBFA43
821C 14         INR D
821D 05         DCR B
821E C20E82   JNZ RBFA42
8221 CD1D83     CALL FADSP
8224 7A         MOV A,D
8225 3210F1     STA RB7
8228 3AFFF1   RBFA5:LDA FA8

アドレス820Bの直前で、その前に計算で求めたFAレジスタとRBレジスタの指数の差(Aレジスタに入れられています)をBレジスタに入れています。
このBレジスタは右シフト回数のカウンタとして使います。
そしてRBレジスタの指数部の値をDレジスタに入れています。
右シフトはRBレジスタの仮数部4バイトをつないで1つのものとして行ないますから、Cレジスタにはバイト数(=4)を入れています。
このプログラムが正しく実行されれば、もとのRBレジスタの仮数部の値は右に6ビットシフトされ、Bレジスタは00になり、Dレジスタも00になります。
ところが。

820B 800052AEF000017801CC 00FA481075D1 FA95 0684 FA12 F200
8221 800052AEF000017801CC 00FA00000000 0044 0000 FF12 F10B

アドレス8221のデータでは、RBレジスタ(3番目のブロック)の仮数部は、なんと00000000になってしまいました。
その後ろのブロックは、CPUのレジスタで、
AF BC DE HL
の順に並んでいます。
アドレス820BではBレジスタは06、DレジスタはFAです。
ところがプログラム実行後のアドレス8221のデータでは、Bレジスタは00なのですが、DレジスタはFFです。
うーん。
Dレジスタがおかしい?
それにどうしてRBレジスタの仮数部が00000000になってしまうのか?
これはミステリーです。

下は同じことを正常なMYCPU80で実行したときの結果です。

820B 800052AEF000017801CC 00FA481075D1 FA95 0684 FA12 F200
8221 800052AEF000017801CC 00FA012041D7 D744 0000 0012 F10B

こちらはちゃんとBレジスタとDレジスタが、ともに00になっています。
そしてRBレジスタの仮数部も6ビット分右にシフトされているようです。
481075D1 は 01001000 00010000 01110101 11010001 です。
012041D7 は 00000001 00100000 01000001 11010111 です。
確かに6ビット右シフトされています。

うーん。
誤動作しているMYCPU80がこのプログラム部分でおかしな動作をしている、ということははっきりしました。
しかし一体どこがおかしくてそのような結果が出てくるのか、そこのところはまだ謎のままです。
というか調べてみて、ますます謎が深まったようにも思えます。

ただかなり範囲は絞り込まれてきています。
どうやら右シフトを6回繰り返す間のどこかで異常が発生していることには間違いなさそうです。
そういうことならば。

今度はブレークポイントを設定して6回の繰り返しのどこで異常が発生するかをステップを追って確かめてみることにしました。

MYCPU80でCP/Mを![第38回]
2014.9.14upload

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