標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第658回]
●ルート計算プログラム(TK−80応用プログラム)(その5)
前回はTK−80用のルート計算プログラムで使われている、減算用レジスタに2を加算するサブルーチンの動作を確認するために、そのサブルーチンだけを取り出してブレークポイントを設定して少しずつ実行するところを、はじめの少しだけ説明して終わってしまいました。
今回はその続きです。
前回はアドレス8009でブレークさせるため、
bp 8009
と入力したあと、
rt
を入力して、そこでブレークしてレジスタ表示されたところまで説明をしました。
そこまでのところでは、まず99に02が加算されてAレジスタの値が9Bになりました。
まだ十進数の加算ではなくて2進数の加算になっています。
そのあとDAAが実行されて、Aレジスタの値が十進数加算99+02の結果に正しく補正されて、01になりました。
また上位桁に桁上げがあることを示すキャリーフラグ(右端のC)がセットされて1になっています。
もういちど、プログラムリストをお見せします。
8000 0603 HIKUSUADD2:LD B,03 8002 21B382 LD HL,HIKUSU78 8005 7E LD A,(HL) 8006 C602 ADD A,02 8008 27 DAA 8009 77 LD (HL),A 800A 2B HIKUSUADD2_2:DEC HL 800B 7E LD A,(HL) 800C CE00 ADC A,00 800E 27 DAA 800F 77 LD (HL),A 8010 05 DEC B 8011 C20A80 JP NZ,HIKUSUADD2_2 8014 C9 RET
アドレス8009の前でブレークしたところまで進みました。
上のコマンドプロンプト画面では、このあと、800C、800E、800Fにブレークポイントを設定しながら実行をしています。
上の画面までいちいち戻るのは面倒ですから、前回と同じように、ZB3BASICのログファイルから、少しずつ切り取って示しながら説明をしていくことにいたします。
次はアドレス800Cにブレークポイントを設定してrtを入力します。
>bp 800c >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 9911 0306 4FCD 82B2 0044 0000 0000 0000 800C F7FA 0000 F1A1 FF 00010001
800AのDEC HLと800BのLD A,(HL)が実行されたあとブレークしますから、HLレジスタはひとつ前のアドレス82B2になり、Aレジスタにはアドレス82B2の値99が入りました。
そのあとアドレス800Eにブレークポイントを設定してrtを入力します。
>bp 800e >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 9A88 0306 4FCD 82B2 0044 0000 0000 0000 800E F7FA 0000 F1A1 FF 10001000
800CのADC A,00が実行されたあと、800Eの直前でブレークしました。
先に実行した下位桁でのDAA命令によって上位桁への桁上げを示すキャリーフラグがセットされていましたから、Aレジスタに加算される値は00ですが、それに下位桁からの桁上げの1が加算されます。
Aレジスタの値は99+1=9Aになっています。
まだ十進数の加算ではなくて2進数の加算になっています。
次はアドレス800Fにブレークポイントを設定してrtを入力します。
>bp 800f >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0055 0306 4FCD 82B2 0044 0000 0000 0000 800F F7FA 0000 F1A1 FF 01010101
800EのDAAが実行されたあと、800Fの直前でブレークしました。
DAAが実行されたので、Aレジスタの値が十進数加算99+1の結果に正しく補正されて、00になりました。
また上位桁に桁上げがあることを示すキャリーフラグ(右端のC)がセットされて1になっています。
さてここからが肝心のところです。
次はアドレス8011にブレークポイントを設定してrtを入力しました。
>bp 8011 >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0003 0206 4FCD 82B2 0044 0000 0000 0000 8011 F7FA 0000 F1A1 FF 00000011
8010のDEC Bが実行されたあとでブレークしましたから、Bレジスタの値は−1されて02になりました。
ここで注目していただきたいのは、右端に表示されているフラグビットです。
DEC Bが実行された結果、フラグビットもさきほどのブレーク結果から変化していますが、一番右端のキャリーフラグCはセットされたままで1になっています。
これでDEC Bがキャリーフラグに影響を与えないことが確認できました。
このあとはJP NZ命令でアドレス800Aに戻って、さきほどと同じ計算を繰り返しますから、次はアドレス800Cにブレークポイントを設定してrtを入力します。
>bp 800c >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0903 0206 4FCD 82B1 0044 0000 0000 0000 800C F7FA 0000 F1A1 FF 00000011
アドレス8011のJP NZ命令でアドレス800Aに戻って、また
DEC HL
LD A,(HL)
が実行されました。
その結果HLレジスタは−1されて82B1になり、Aレジスタにはアドレス82B1の値09が入れられました。
もう一度その部分のプログラムリストを下に示します。
800A 2B HIKUSUADD2_2:DEC HL 800B 7E LD A,(HL) 800C CE00 ADC A,00 800E 27 DAA 800F 77 LD (HL),A 8010 05 DEC B 8011 C20A80 JP NZ,HIKUSUADD2_2
次にアドレス800Eにブレークポイントを設定してrtを入力しました。
>bp 800e >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 0A08 0206 4FCD 82B1 0044 0000 0000 0000 800E F7FA 0000 F1A1 FF 00001000
800CのADC A,00が実行されたあと、800Eの直前でブレークしました。
先に実行した下位桁でのDAA命令によって上位桁への桁上げを示すキャリーフラグがセットされていましたから、Aレジスタに加算される値は00ですが、それに下位桁からの桁上げの1が加算されます。
Aレジスタの値は09+1=0Aになっています。
まだ十進数の加算ではなくて2進数の加算になっています。
次にアドレス800Fにブレークポイントを設定してrtを入力しました。
>bp 800f >rt A F B C D E H L A'F' B'C' D'E' H'L' PC SP IX IY I SZ H PNC 1010 0206 4FCD 82B1 0044 0000 0000 0000 800F F7FA 0000 F1A1 FF 00010000
800EのDAAが実行されたあと、800Fの直前でブレークしました。
DAAが実行されたので、Aレジスタの値が十進数加算09+1の結果に正しく補正されて、10になりました。
今回は上位桁への桁上げはありませんから、キャリーフラグ(右端のC)はリセットされて0になっています。
これでプログラムの動作は確認できましたから、あとはブレイクポイントを設定しないでrtを入力します。
するとプログラムが最後まで実行されて、最後のret命令の実行でZB3BASICシステムに戻ります。
下のコマンドプロンプト画面は、アドレス800Fでブレークしたあと、最後にブレークポイントを設定しないで、rtを入力してZB3BASICに戻ってから、dmコマンドでアドレス82B0〜82B3の値を確認しているところです。
00099999+02の計算が正しく行なわれた結果、アドレス82B0〜82B3の値は00100001になりました。
2010.11.11upload
前へ
次へ
ホームページトップへ戻る