ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.7
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆ルート計算プログラム
ND80ZVをご購入いただいたお客様からTK−80応用プログラムを送っていただきました。
プログラムを解析する過程でND80ZV組立キットに附属しているZ80アセンブラ、Z80逆アセンブラを使います。それらのプログラムの使用例としても参考になると思います。

[第117回]

●ルート計算プログラム(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になりました。
CPUをつくろう!第658回(2010.11.11upload)を再編集

ワンボードマイコンをつくろう![第117回]
2011.7.7upload

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