標準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
前へ
次へ
ホームページトップへ戻る