標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第158回]

●タイマールーチンをCALLする、XCHG命令のテストプログラム

やっと今回の目的のプログラムにたどりつきました。
XCHG命令のテストが目的ですが、ついでに、M(メモリ)関係の命令、MOV M,r、MOV r,M、INR M、DCR Mも一緒にテストできるプログラムを作ってみました。

8080では、メモリのデータも、A、B、C…Lの8ビットの各レジスタと同じように扱うことができる命令を備えています。
8080のレジスタはA〜Lの7個です。
メモリアドレスを、HLレジスタの値で示したときに、それを、Mという記号で表して、A〜Lと同じように、いわば第8のレジスタとして、扱うことができるようになっています。

このテストプログラムでは、そのメモリに対する命令動作についてもテストできるようにしました。

0000 310000   LXI SP,0000
0003 215000   LXI H,0050
0006 115100   LXI D,0051
0009 010000   LXI B,0000
000C 70       MOV M,B
000D EB       XCHG
000E 70       MOV M,B
000F EB       XCHG
0010 CD3000   CALL 0030
0013 34       INR M
0014 46       MOV B,M
0015 EB       XCHG
0016 CD3000   CALL 0030
0019 35       DCR M
001A 4E       MOV C,M
001B C30F00   JMP 000F

000C〜000Fで、HLで指定するメモリアドレス、0050と0051を0クリアしています。
0.5秒後に、0050番地の値を+1し、その結果をBレジスタに格納します。
CALL 0030 は、前回作った0.5secサブルーチンをCALLしているところです。

次の0.5秒後に0051番地の値を−1して、その結果をCレジスタに格納します。
そしてまた000Fに戻って、0.5秒後に0050番地の値を+1する、というように、000F〜001Dの命令を繰り返し実行します。

XCHGはHLレジスタとDEレジスタの値を交換する命令です。
XCHG命令については[第91回]で説明をしました。

このプログラムの実行によって、0.5秒ごとに、HLレジスタとDEレジスタのLED表示が交互に0050と0051になり、Bレジスタがインクリメント(+1)、Cレジスタがデクリメント(−1)されることを繰り返します。

●テストプログラムを実行中の写真です



上の列のLEDは、左から、D、E、B、C、Aレジスタで、その下の列のLEDは、左から、H、L、SPH、SPLレジスタです。

DEレジスタが0050、HLレジスタが0051を表示しています。
BレジスタがE4を、Cレジスタが1Dを表示しています。

Bレジスタは00から+1加算を繰り返した結果を格納し、Cレジスタは00から−1減算を繰り返した結果を格納しています。
加算と減算が同時に行われていれば、BとCを加算した結果はつねに00(または100)になりますが、0.5秒ごとに交互に加算、減算しますから、B+Cの結果は1だけ端数が生じます。

Bレジスタ   11100100
Cレジスタ   00011101
加算結果  100000001

加算結果から、プログラムが正しく動作していることがわかります。

今回は、0.5秒ごとに表示が交互に変わることで、XCHG命令の動作を確認できるようにしたい、という目的で、こういうテストプログラムを作ってみましたが、こうやって、写真に撮ってみると、どれだけ連続動作させたのかということは、見ることができません。
それに、最も多く繰り返して実行されているのは、タイマーサブルーチンの部分だけで、その他の命令は0.5秒に1回実行されるだけですから、その命令回路のエージングテストとしては不足です。

うーん。タイマールーチンは、それなりに利用価値はあると思うのですけれどねー。
ま。今回はこんなところでOKとしたうえで、次回、別の命令のテストプログラムでは、タイマールーチンなしのプログラムを作ってみることにいたしましょう。
2009.2.9upload

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