標準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
前へ
次へ
ホームページトップへ戻る