標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第101回]
●XTHL命令のクロック毎の動作の写真です
☆このところ多忙で、ホームページの更新が1日おきのペースになっています。
時間が無くて、なかなか大変です。
気長にお付き合いをお願いします。
動作の確認をするために次のプログラムを実行させました。
0000 310008 LXI SP,0800
0003 013412 LXI B,1234
0006 217856 LXI H,5678
0009 C5 PUSH B
000A E3 XTHL
000B C1 POP B
最初にSP(スタックポインタ)の設定が必要です。
スタックは0800番地に置くことにします。
BCレジスタに”1234”を入れて、PUSH B命令でBCレジスタの値をスタックに保存します。
HLレジスタに”5678”を入れておいて、XTHL命令でスタックトップの値(PUSH Bで保存したBCレジスタの値)とHLレジスタの値が入れ替わることを確認します。
スタックトップの値が入れ替わったことを確認するために、最後にPOP Bでスタックトップの値をBCレジスタに戻して確認してみます。
LXI命令、PUSH命令のクロック毎の動作の写真については、すでに説明済みですから、メモリアドレス”000A”のXTHL命令のT4から、クロック毎の動作を見ていくことにします。
XTHL命令のT4の写真です。
OPコードレジスタには”E3”(XTHL命令のOPコード)がラッチされています。
PC(プログラムカウンタ)は”000B”になっていますが、PCADoutが消灯していて、PC(プログラムカウンタ)の値は、外部アドレスバスA15−A0には出力されていません。
regRDとregWRが共に点灯しています。
regRDが点灯していて、s3−s0が”1101”なのでデータの送り手としてLレジスタが選択されます。
LregRDが点灯していて、Lレジスタの値、”78”が内部データバスinnerBUSに出力されています。
regWRが点灯していて、d3−d0が”0111”なのでデータの受け手としてWKLレジスタが選択されます。
WKLregWRが点灯していて、WKLレジスタに内部データバスの値”78”が読み込まれています。
s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
T5の写真です。
regWR、WKLregWRが消灯し、WKLレジスタに、内部データバスの値”78”がラッチされました。
T6の写真です。
regRDとregWRが共に点灯しています。
regRDが点灯していて、s3−s0が”1100”なのでデータの送り手としてHレジスタが選択されます。
HregRDが点灯していて、Hレジスタの値、”56”が内部データバスinnerBUSに出力されています。
regWRが点灯していて、d3−d0が”0110”なのでデータの受け手としてWKHレジスタが選択されます。
WKHregWRが点灯していて、WKHレジスタに内部データバスの値”56”が読み込まれています。
T7の写真です。
regWR、WKHregWRが消灯しました。
WKHレジスタに”56”がラッチされました。
T8の写真です。
うーん。ピンボケになってしまいました。
SPselがアクティブになって、SPの値”07FE”が外部アドレスバスA15−A0に出力されています。
MEMRDが点灯し、メモリアドレス”07FE”(スタックトップ)の値”34”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”34”になっています。
regWRが点灯していて、d3−d0が”1101”なのでデータの受け手としてLレジスタが選択されます。
LregWRが点灯していて、Lレジスタに内部データバスの値”34”が読み込まれています。
T9の写真です。
regWR、LregWRが消灯しました。
Lレジスタに”34”がラッチされました。
SPclkが点灯しました。
スタックポインタを構成しているUP/DOWNカウンタ74HC191のUP/DOWNを決定するd/u端子(pin5)はUP(Lレベル)にセットされ、SPd/uが点灯しています。
SPd/uはUPのとき点灯し、DOWNのとき消灯します。
T10の写真です。
SPclkが消灯し、SPの値が+1されて”07FF”になりました。
SPの値が外部アドレスバスA15−A0に出力されています。
MEMRDが点灯し、メモリアドレス”07FF”の値”12”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”12”になっています。
regWRが点灯していて、d3−d0が”1100”なのでデータの受け手としてHレジスタが選択されます。
HregWRが点灯していて、Hレジスタに内部データバスの値”12”が読み込まれています。
T11の写真です。
regWR、HregWRが消灯しました。
Hレジスタに”12”がラッチされました。
スタックからHLにデータが移りました。
T12の写真です。
SPselがアクティブになって、SPの値が外部アドレスバスA15−A0に出力されています。
LEDの状態が少しわかりづらいですけれど、regRDが点灯し、s3−s0は”1110”なので、データの送り元としてWKHレジスタが選択されています。
WKHregRDが点灯していて、WKHレジスタの値、”56”が内部データバスinnerBUSに出力されています。
外部データバスD7−D0も”56”になっていて、MEMWRがアクティブになっています。
メモリアドレス”07FF”に”56”が書き込まれていることを示しています。
T13の写真です。
MEMWRが消灯しました。
SPclkが点灯しました。
SPd/uは消灯していますから、SPclkが消灯するタイミングでSP(スタックポインタ)は−1されます。
T14の写真です。
SPclkが消灯し、SPの値が−1されて”07FE”になりました。
SPの値が外部アドレスバスA15−A0に出力されています。
regRDが点灯していて、s3−s0が”0111”なのでデータの送り手としてWKLレジスタが選択されます。
WKLregRDが点灯していて、WKLレジスタの値、”78”が内部データバスinnerBUSに出力されています。
外部データバスD7−D0も”78”になっていて、MEMWRがアクティブになっています。
メモリアドレス”07FE”に”78”が書き込まれていることを示しています。
T15の写真です。
MEMWRが消灯しました。
スタックに、最初にHLに入っていた値”5678”が移されたはずです。
ちょっとおかしいことに気がつきました。
この写真は変です。
T15は、MEMWRは終わりますが、まだSP(スタックポインタ)をメモリアドレスA15−A0に出力していなければいけませんし、WKLレジスタの値もデータバスに維持していなければならないはずです。
ところが写真では、SPselもWKLregRDも点灯していません。
XTHLの回路図([第100回])には間違いはありません。
どうも基板の配線ミスのようです。
のちほど調べてみることにします。
T16(次の命令のT0)の写真です。
T16は一瞬で終了し、次の命令のT0になります。
●POP B命令のクロック毎の写真です
XTHL命令によってスタックトップにあった値”1234”がHLレジスタに入れられました。代わりにスタックにはHLレジスタに入っていた値”5678”が入れられたはずです。
POP B命令によって、それを確認してみます。
POP命令のクロック毎の動作の写真もすでに説明していますから、説明はごく簡単に済ませます。
T4の写真から見ていきます。
POP B命令のT4の写真です。
レジスタトップ”07FE”の値”78”がCレジスタに読み込まれています。
T5の写真です。
SPclkが点灯しました。
T6の写真です。
SP(スタックポインタ)が+1されて”07FF”になりました。
メモリアドレス”07FF”の値”56”がBレジスタに読み込まれています。
T7の写真です。
POP B命令によってBCレジスタには、最初にHLレジスタにあった”5678”が入りました。
これで、XTHL命令によって、スタックにHLレジスタの値が入れられたことが確認できました。
2008.10.23upload
前へ
次へ
ホームページトップへ戻る