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

●STA、LDA、STAX、LDAXのテストプログラム

今回はSTA、LDA、STAX、LDAXの各命令のテストプログラムです。
いずれもAレジスタの値をメモリにSTORE、またはメモリからLOADする命令です。
STA、LDAはSTORE、LOADするメモリアドレスを直接指定します。
STAX、LDAXはメモリアドレスをBCレジスタ、DEレジスタで指定する「間接アドレッシング」命令です。
STA、LDA命令は[第64回]で説明しました。
STAX、LDAX命令は[第66回]で説明しました。

前回に続いて、今回のテストプログラムも、0.5secサブルーチンを使ってしまいました。

0000 310000   LXI SP,0000
0003 210000   LXI H,0000
0006 115100   LXI D,0051
0009 015000   LXI B,0050
000C CD3000   CALL 0030
000F 23       INX H
0010 7D       MOV A,L
0011 325200   STA 0052
0014 3A5200   LDA 0052
0017 12       STAX D
0018 1A       LDAX D
0019 02       STAX B
001A 0A       LDAX B
001B 6F       MOV L,A
001C C30C00   JMP 000C

今回も簡単なプログラムです。
HLレジスタには初期値0000を入れます。
DEレジスタにはメモリアドレスとして0051を、そしてBCレジスタにはメモリアドレスとして0050を入れてスタートします。

0.5秒サブルーチンをCALLしてから、HLレジスタの値を+1します。
そして、HLレジスタの下位8ビット、Lレジスタの値をAレジスタに転送(コピー)します。
そのAレジスタの値をメモリアドレス0052に書き込み、すぐにまた同じ0052からデータを読み出してAレジスタに入れます。

次にAレジスタの値をDEレジスタで指定するメモリアドレス(0051)に書き込み、すぐに同じDEレジスタで指定するメモリアドレス(0051)からデータを読み出して、Aレジスタに入れます。
さらにAレジスタの値をBCレジスタで指定するメモリアドレス(0050)に書き込み、すぐに同じBCレジスタで指定するメモリアドレス(0050)からデータを読み出して、Aレジスタに入れます。

最後にAレジスタの値をLレジスタに入れます。
000Cに戻って、この動作を繰り返します。

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



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

DEレジスタは0051、BCレジスタは0050を表示しています。
HLレジスタの値は1BF7を表示しています。
ストップウォッチは59’39”です。

HLレジスタは0.5secごとに+1加算されます。
1BF7は十進数では7159になります。0.5secごとに+1された結果、7159になったのですから、
7159×0.5=3579.5秒になります。

ストップウォッチの値59’39”は、秒に直すと、
59×60+39=3579秒です。
0.5秒の誤差は出てもおかしくはありませんから、ぴったり一致、と考えてもいいと思います。

この携帯のストップウォッチは最長60分しか測定できません。
ぎりぎりのところで、もう一枚写真を撮りました。



HLレジスタの値は1C20を表示しています。
ストップウォッチはジャスト60’00”00です。
ストップウォッチはちょうど60’00”で停止してしまいますから、ジャストかどうかわかりません。
多分多少は60’00”を過ぎてからの写真です。

1C20は十進数では7200になります。0.5secごとに+1された結果、7200になったのですから、
7200×0.5=3600秒になります。

ストップウォッチの値60’00”は、秒に直すと、
60×60=3600秒です。
ぴったりになりましたね。
2009.2.11upload

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