標準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

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