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

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

動作の確認をするために次のプログラムを実行させました。

0000 210000    LXI H,0000
0003 2B        DCX H
0004 23        INX H
0005 23        INX H

HLレジスタに”0000”を入れておいて、DCX H命令で値が−1されて、結果がFFFFになることを確認します。
下位8ビットが00のときに、−1すると結果がFFになって、上位8ビットへのキャリー(ボロー)が発生して、上位8ビツトも−1されます。

次にINX命令の動作を確認します。
DCX Hの実行によって、FFFFになったところに、今度はINX Hで+1します。
下位8ビットがFFのところに+1すると、結果は00になって上位8ビットへのキャリーが発生して、上位8ビットも+1されます。

もうひとつ次もINX Hを実行させます。
先のINX Hの実行によって、0000になったところに、さらにINX Hで+1します。
下位8ビットが00のところに、INX H命令で+1すると結果は01になります。しかし今回は上位8ビットへのキャリーは発生しません。
上位8ビットへのキャリーが発生しないときは、下位8ビットの計算のみで処理は終了します。

以上の動作をクロック毎に写真に撮りました。
T0〜T3は省略します。

DCX H命令のT4の写真です。


INRレジスタの部分は切り取って、一枚目の基板の写真の空いているところに重ねました。

OPコードレジスタには”2B”(DCX命令のOPコード)がラッチされています。
PC(プログラムカウンタ)は”0004”になっていますが、PCADoutが消灯していて、PC(プログラムカウンタ)の値は、外部アドレスバスA15−A0には出力されていません。

regRDが点灯しています。
regRDが点灯していて、s3−s0が”1101”なのでデータの送り手としてLレジスタが選択されます。
LregRDが点灯していて、Lレジスタの値、”00”が内部データバスinnerBUSに出力されています。
INRレジスタはregWR、regRDとd3−d0、s3−s0によってではなくて、直接INRregWR、INRregRD信号によって、書き込み、読み出しをします。
INRregWRが点灯していて、INRレジスタに内部データバスの値”00”が読み込まれています。

s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

T5の写真です。


INRregclkが点灯しました。INRregclkが点灯→消灯のタイミングでINRレジスタが+1または−1されます。
+1か−1かを決める、INRregUPは消灯しています。INRregUPが点灯しているときがincrement(+1)で、消灯しているときはdecrement(−1)です。

T6の写真です。


INRレジスタの結果が−1されて”FF”になりました。
INRregRDが点灯していて、INRレジスタの値、”FF”が内部データバスinnerBUSに出力されています。
regWRが点灯していて、d3−d0が”1101”なのでデータの受け手としてLレジスタが選択されます。
LregWRが点灯していて、Lレジスタに内部データバスの値”FF”が読み込まれています。

T7の写真です。


regWR、LregWRが消灯しました。
Lレジスタに”FF”がラッチされました。

T8の写真です。


regRDが点灯しています。
regRDが点灯していて、s3−s0が”1100”なのでデータの送り手としてHレジスタが選択されます。
HregRDが点灯していて、Hレジスタの値、”00”が内部データバスinnerBUSに出力されています。
INRregWRが点灯していて、INRレジスタに内部データバスの値”00”が読み込まれています。

s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

T9の写真です。


INRregclkが点灯しました。INRregclkが点灯→消灯のタイミングでINRレジスタが+1または−1されます。
+1か−1かを決める、INRregUPは消灯しています。
INRregUPが点灯しているときがincrement(+1)で、消灯しているときはdecrement(−1)です。

T10の写真です。


INRレジスタの結果が−1されて”FF”になりました。
INRregRDが点灯していて、INRレジスタの値、”FF”が内部データバスinnerBUSに出力されています。
regWRが点灯していて、d3−d0が”1100”なのでデータの受け手としてHレジスタが選択されます。
HregWRが点灯していて、Hレジスタに内部データバスの値”FF”が読み込まれています。

T11の写真です。


regWR、HregWRが消灯しました。
Hレジスタに”FF”がラッチされました。
DCX Hの実行の結果、”0000”だったHLレジスタの値が”FFFF”になりました。

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


T12は一瞬で終了し、次の命令のT0になります。

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

続いて今度はINX Hを実行します。
”FFFF”を+1しますから、結果はもとの”0000”になるはずです。

T4の写真です。


OPコードレジスタには”23”(INX命令のOPコード)がラッチされています。
PC(プログラムカウンタ)は”0005”になっていますが、PCADoutが消灯していて、PC(プログラムカウンタ)の値は、外部アドレスバスA15−A0には出力されていません。

regRDが点灯しています。
regRDが点灯していて、s3−s0が”1101”なのでデータの送り手としてLレジスタが選択されます。
LregRDが点灯していて、Lレジスタの値、”FF”が内部データバスinnerBUSに出力されています。
INRレジスタはregWR、regRDとd3−d0、s3−s0によってではなくて、直接INRregWR、INRregRD信号によって、書き込み、読み出しをします。
INRregWRが点灯していて、INRレジスタに内部データバスの値”FF”が読み込まれています。

s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

T5の写真です。


INRregclkが点灯しました。INRregclkが点灯→消灯のタイミングでINRレジスタが+1または−1されます。
+1か−1かを決める、INRregUPは点灯しています。INRregUPが点灯しているときがincrement(+1)で、消灯しているときはdecrement(−1)です。

T6の写真です。


INRレジスタの結果が+1されて”00”になりました。
INRregRDが点灯していて、INRレジスタの値、”00”が内部データバスinnerBUSに出力されています。
regWRが点灯していて、d3−d0が”1101”なのでデータの受け手としてLレジスタが選択されます。
LregWRが点灯していて、Lレジスタに内部データバスの値”00”が読み込まれています。

T7の写真です。


regWR、LregWRが消灯しました。
Lレジスタに”00”がラッチされました。

T8の写真です。


regRDが点灯しています。
regRDが点灯していて、s3−s0が”1100”なのでデータの送り手としてHレジスタが選択されます。
HregRDが点灯していて、Hレジスタの値、”FF”が内部データバスinnerBUSに出力されています。
INRregWRが点灯していて、INRレジスタに内部データバスの値”FF”が読み込まれています。

s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

T9の写真です。


INRregclkが点灯しました。INRregclkが点灯→消灯のタイミングでINRレジスタが+1または−1されます。
+1か−1かを決める、INRregUPは点灯しています。
INRregUPが点灯しているときがincrement(+1)で、消灯しているときはdecrement(−1)です。

T10の写真です。


INRレジスタの結果が+1されて”00”になりました。
INRregRDが点灯していて、INRレジスタの値、”00”が内部データバスinnerBUSに出力されています。
regWRが点灯していて、d3−d0が”1100”なのでデータの受け手としてHレジスタが選択されます。
HregWRが点灯していて、Hレジスタに内部データバスの値”00”が読み込まれています。

T11の写真です。


regWR、HregWRが消灯しました。
Hレジスタに”00”がラッチされました。
INX Hの実行の結果、”FFFF”だったHLレジスタの値が”0000”になりました。

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


T12は一瞬で終了し、次の命令のT0になります。

●もう一度、INX命令のクロック毎の動作の写真です

続いてもう一度INX Hを実行します。
”0000”を+1しますから、結果は”0001”になるはずです。

T4〜T7までの動作は上で説明したものと同じですから説明は省略します。

T4の写真です。


T5の写真です。


T6の写真です。


T7の写真です。


T8(次の命令のT0)の写真です。


上位8ビットへのキャリーが発生しないので、下位8ビットの計算終了後のT8にMclrパルスが出され、T8は一瞬で終了し、次の命令のT0になります。
INX Hの実行によって、”0000”だったHLレジスタの値が”0001”になりました。
2008.10.15upload

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