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

●RST命令のテストプログラムです

RST命令の動作の様子がわかるような、テストプログラムを書きました。
そして、いつものように、マシンクロック毎にステップ動作をさせて写真を撮りました。
テストプログラムは、これもいつもと同じように、0100から書きました。

0100 310080   LXI SP,$8000
0103 AF       XRA A
0104 F7       RST 6
0105 76       HLT

RST命令はCALL命令と同じ動作をしますから、SP(スタックポインタ)を設定しておく必要があります。
スタックは8000番地に置くことにします。
RST命令の動作を確認するために、Aレジスタの値を変化させてみます。
XRA A命令で、Aレジスタに00をセットします。
MVI A,00でもよいのですが、Aレジスタを0クリアするときはXRA Aがよく使われます(ただしMVI A,00はフラグが変化しませんが、XRA Aはフラグが変化します)。

RST命令はCALLするアドレスの違いによって、8個の異なる命令があることについては、すでに説明をしました。
一番よく使われるのがRST 7(命令コードFF)ですが、RST 7でなくても、その動作はすべて同じです。
今回はRST 6(命令コードF7)を使いました。
RST 6は、0030番地のサブルーチンをCALLします。
サブルーチンですから、CALL後にまたもとのプログラムに戻ってきます。
戻ってきたあとで、そこで停止するように、最後にはHLT命令を置きました。

RST 6命令でCALLされるメモリアドレス0030には、次のプログラムを書きました。

0030 3C       INR A
0031 C9       RET

RST命令は大抵は特殊な例外処理や、エラー処理などに利用されます。
RST命令のCALLアドレスは8バイト毎に並んでいますから、大したプログラムは書けません。そこで大抵は、処理プログラムへのジャンプ命令だけを書くことが多いことになります。
しかし今回は動作テストですから、Aレジスタを+1してすぐにリターンするという、簡単なプログラムを書きました。

●テストプログラムを実行したあとの写真です



0105番地のHLT命令(コード76)で停止しています。
Aレジスタ(上から3列目、左端)は00000001になっています。
うまく動作したようです。

今度はステップ動作をさせてみましょう。

●RST命令のクロック毎の動作の写真です

SP(スタックポインタ)に8000をセットして、そのあとXRA A命令でAレジスタを00にした後の写真から見ていきます。

RST 6命令のT0の写真です



Aレジスタは、00になっています。
SP(スタックポインタ)は8000になっています。
SPは下から3列目の左から3番目がSPH(上位8ビット)で、右端がSPL(下位8ビット)です。

RST 6命令のT4の写真です



SP(スタックポインタ)は−1されて、7FFFになっています。
SPsel(スタックポインタ中央の上方にある黄LED)がアクティブになって、SPの値が外部アドレスバス(A15〜A0)に出力されています。
一番下の列の左が外部アドレスバスのA15〜A8で、その右がA7〜A0です。

PC(プログラムカウンタ)は、次のアドレス0105になっています。
PCは下から2行目、左から3番目がPCH(上位8ビット)で、右端がPCL(下位8ビット)です。
PCHrd(PCHの左側の黄LED)がアクティブになって、PCHの値(01)が内部データバスに読み出され、そのまま外部データバスにも出力されています。
外部アドレスバスの右が、外部データバスで、その右の少し下に下がったところにあるのが内部データバスです。

一番下の列の右5個のLEDはTクロックを示しています。
その左にあるのが、制御信号の表示です。
8個のうち、左から2番目が点灯しています。MEMWRです。
データバスの01がメモリアドレス7FFFに書き込まれています。

RST 6命令のT5の写真です



MEMWRが消灯しました。
SP(スタックポインタ)の右側にある緑LEDが点灯しています。SPclkです。
SPclkがLからHになるとき(LEDが消灯するとき)にSPが−1されます。

RST 6命令のT6の写真です



SP(スタックポインタ)が−1されて、7FFEになりました。
SPsel(中央上方にある黄LED)がアクティブになって、SPの値が外部アドレスバス(A15〜A0)に出力されています。
PCLrd(PCLの左側の黄LED)がアクティブになって、PCLの値(05)が内部データバスに読み出され、そのまま外部データバスにも出力されています。
MEMWRが点灯しています。
データバスの05がメモリアドレス7FFEに書き込まれています。

RST 6命令のT7の写真です



MEMWRが消灯しました。

RST 6命令のT8の写真です



内部データバスが30になっています。
PCL(プログラムカウンタ下位8ビット)の右側の緑LEDが点灯しています。PCLwrです。
PCLに内部データバスの値30が書き込まれています。

RST 6命令のT9の写真です



PCLwrが消灯しました。

RST 6命令のT10の写真です



内部データバスが00になっています。
PCH(プログラムカウンタ上位8ビット)の右側の緑LEDが点灯しています。PCHwrです。
PCHに内部データバスの値00が書き込まれています。

RST 6命令のT11の写真です



PCHwrが消灯しました。
PC(プログラムカウンタ)に0030がセットされました。

RST 6命令のT12(次の命令のT0)の写真です



PC(プログラムカウンタ)の値が外部アドレスバスに出力され、メモリの0030番地の内容が外部データバスに読み出されています。
0030にはINR A命令(コード3C)が書かれています。

INR A命令のT4の写真です



OPコードレジスタに3Cがラッチされています。
OPコードレジスタは一番下の列の右から3番目です。

PC(プログラムカウンタ)が+1されて、0031になっています。

Aレジスタの左にある黄LED(AregRD)が点灯して、Aレジスタの値(00)が内部データバスに読み出されています。
一番上の左端にあるINRレジスタに、内部データバスの値(00)が書き込まれています。

RET命令のT0の写真です



INR Aの次の命令、RET命令のT0です。
Aレジスタは+1されて、01になりました。
外部アドレスバスは0031になって、メモリアドレス0031に入っているRET命令(コードC9)が外部データバスに読み出されています。

HLT命令のT0の写真です



RET命令が実行されて、もとのメモリアドレス0105に戻りました。
PC(プログラムカウンタ)は0105になりました。
外部アドレスバスに0105が出力され、そのメモリ内容76(HLT命令)が、外部データバスに読み出されています。

RST命令は、正しく実行されました。
2009.5.6upload

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