標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第84回]
●LXI SP命令のクロック毎の動作の写真です
前回、前々回と続いて、PUSH命令、POP命令のクロック毎の動作を写真に撮るためのアプローチをしてきました。
[第82回]でクロック動作のためのプログラムについて紹介しました。
回が進んでしまいましたので、そのプログラムを下に再掲します。
0000 310080 LXI SP,8000
0003 F5 PUSH PSW
0004 E5 PUSH H
0005 F1 POP PSW
0006 E1 POP H
今回はこのプログラムを実行させて、写真に撮ります。
最初のLXI SP命令はSP(スタックポインタ)にスタックトップのアドレスを設定するための命令です。
スタックについては[第67回]で説明しました。
またLXI命令については[第65回]で説明をしました。LXI命令のクロック毎の動作の写真は、[第71回]で紹介済みです。[第79回]でも紹介しています。
ですから、説明は簡単に済ませます。
LXI SP命令のタイミングチャート([第65回])を参照しながら、写真を見ていくと、より理解しやすいと思います。
例外を除いては、T0〜T3のOPコードフェッチサイクルは、どの命令もみな同じ動作なので、クロックごとの動作の写真も、T0〜T3は省略して、T4からお見せします。
T4の写真です。
PC(プログラムカウンタ)は”0001”になっています。
OPコードレジスタには、LXI SP命令のOPコード、”31”がラッチされています。
PCの値が外部アドレスバスに出力され、外部アドレスバスも”0001”になっています。
外部データバスにはメモリアドレス”0001”番地の値、”00”が出力されていて、内部データバスも”00”になっています。
regWRが点灯し、d3〜d0が”0101”なので、SP(L)レジスタが選択され、SPLwrが点灯しているので、SP(L)レジスタに内部データバスの値”00”が書き込まれていることがわかります。
SP(スタックポインタ)は写真右下にあります。
d3−d0とレジスタの関係は、レジスタコード表([第27回])を参照してください。
T5の写真です。
PCclkが点灯しました。
regWR、SPLwrは消灯しました。
T6の写真です。
PCclkが消灯し、PC(プログラムカウンタ)が+1されて”0002”になりました。
外部データバスD7−D0にはメモリアドレス”0002”番地の値、”80”が出力されていて、内部データバス(innerBUS)も”80”になっています。
regWRが点灯し、d3〜d0が”0100”なので、SP(H)レジスタが選択され、SPHwrが点灯しているので、SP(H)レジスタに内部データバスの値”80”が書き込まれていることがわかります。
T7の写真です。
regWR、SPHwrは消灯しました。
PCclkが点灯しています。
T8(次の命令のT0)の写真です。
T8は一瞬で終了し、次の命令のT0になります。
次の命令は、0003番地のPUSH PSW命令(OPコードは”F5”)です。
●PUSH PSW命令のクロック毎の動作の写真です
PUSH PSWは、AレジスタとF(フラグ)レジスタを、スタックに格納する命令です。
今回はPUSH PSW命令に続いて、PUSH H命令も実行します。
PUSH Hは、HLレジスタの値を、スタックに格納する命令です。
PUSH命令のクロック毎の動作については、PUSH命令のタイミングチャート([第83回])を参照しながら写真を見ると、わかりやすいと思います。
PUSHされる、A、F、H、Lの各レジスタの値は、[第81回]のINR L命令、DCR H命令を実行した後の値になっています。
Aレジスタは”02”、フラグはZ(ゼロ)フラグ、P(パリティ)フラグ、C(キャリー)フラグがセットされています。
Hレジスタは”00”、Lレジスタは”80”です。
T3の写真です。
SPclkが点灯しています。
PUSH命令は、他の命令と違って、OPコードフェッチサイクルの終わりのクロック、T3のときにSPclkパルスを出します。
SP(スタックポインタ)をUPまたはDOWNさせるためのクロックです。
PUSH命令はスタックの値をDOWN(−1)させながら、レジスタの値をメモリに書き込んでいくので、SPを構成する74HC191のD/U端子(pin5)への入力信号SPupは消灯しています。
SPupはLのときにUP(点灯)でHのときにDOWN(消灯)です。
フラグレジスタの値が見えるようにLEDを追加しました。
INRレジスタとフラグレジスタは2枚目の基板の右上の方にあって見にくいので切り取って、1枚目の基板の空いたところに張り付けてあります。
うっかりしてフラグレジスタのLEDにネームを付けるのを忘れてしまいました。
S〜Cの各フラグビット表示LEDの右側に8個並んだ赤色LEDがフラグレジスタです。
ちょっと並びがゆがんでしまいました。
各フラグと、フラグレジスタのビット位置の関係は次の通りです。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
S | Z | - | H | - | P | - | C |
8080のフラグレジスタは、空きになっているbit5、bit3、bit1には”1”が入ります。
しかし、そうすると空きのビットのLEDがつねに点灯していることになって面白くないので、「つくるCPU」では空きビットには”0”が入るようにしました。
今回はZ、P、Cがセットされていますから、フラグレジスタの値は、”01000101”つまり”45”になります。
T4の写真です。
SPclkが消灯し、SPの値が−1されて”7FFF”になりました。
SPselがアクティブになって、SPの値が外部アドレスバスA15−A0に出力されています。
regRDが点灯し、s3−s0は”1111”なので、データの送り元としてAレジスタが選択されています。
AregRDが点灯し、Aレジスタの値”02”が内部データバスinnerBUSに出力されています。
s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
外部データバスD7−D0も”02”になっていて、MEMWRがアクティブになっています。
メモリアドレス”7FFF”に”02”が書き込まれていることを示しています。
T5の写真です。
MEMWRが消灯しました。
SPclkが点灯しました。
T6の写真です。
SPclkが消灯し、SPの値が−1されて”7FFE”になりました。
SPの値が外部アドレスバスA15−A0に出力されています。
regRDが点灯し、s3−s0は”0001”なので、データの送り元としてF(フラグ)レジスタが選択されています。
FregRDが点灯し、Fレジスタの値”45”が内部データバスinnerBUSに出力されています。
s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
外部データバスD7−D0も”45”になっていて、MEMWRがアクティブになっています。
メモリアドレス”7FFE”に”45”が書き込まれていることを示しています。
T7の写真です。
MEMWRが消灯しました。
T8(次の命令のT0)の写真です。
T8は一瞬で終了し、次の命令のT0になります。
次の命令は、0004番地のPUSH H命令(OPコードは”E5”)です。
●PUSH H命令のクロック毎の動作の写真です
T3の写真です。
SPclkが点灯しています。
PUSH命令はスタックの値をDOWN(−1)させながら、レジスタの値をメモリに書き込んでいくので、SPを構成する74HC191のD/U端子(pin5)への入力信号SPupは消灯しています。
SPupはLのときにUP(点灯)でHのときにDOWN(消灯)です。
T4の写真です。
SPclkが消灯し、SPの値が−1されて”7FFD”になりました。
SPselがアクティブになって、SPの値が外部アドレスバスA15−A0に出力されています。
regRDが点灯し、s3−s0は”1100”なので、データの送り元としてHレジスタが選択されています。
HregRDが点灯し、Hレジスタの値”00”が内部データバスinnerBUSに出力されています。
s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
外部データバスD7−D0も”00”になっていて、MEMWRがアクティブになっています。
メモリアドレス”7FFD”に”00”が書き込まれていることを示しています。
T5の写真です。
MEMWRが消灯しました。
SPclkが点灯しました。
T6の写真です。
SPclkが消灯し、SPの値が−1されて”7FFC”になりました。
SPの値が外部アドレスバスA15−A0に出力されています。
regRDが点灯し、s3−s0は”1101”なので、データの送り元としてLレジスタが選択されています。
LregRDが点灯し、Lレジスタの値”80”が内部データバスinnerBUSに出力されています。
s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
外部データバスD7−D0も”80”になっていて、MEMWRがアクティブになっています。
メモリアドレス”7FFC”に”80”が書き込まれていることを示しています。
T7の写真です。
MEMWRが消灯しました。
T8(次の命令のT0)の写真です。
T8は一瞬で終了し、次の命令のT0になります。
次の命令は、0005番地のPOP PSW命令(OPコードは”F1”)です。
2008.10.1upload
前へ
次へ
ホームページトップへ戻る