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

●MVI M,I8の動作をクロックごとに実行させてみました

[第50回]でMVI r,I8命令をクロックごとに実行させたときに使ったプログラムと同じものを使いました。

0000 2600     MVI H,00
0002 2E06     MVI L,06
0004 3676     MVI M,76
0006 AA       ”AA”

このプログラムは全部MVI命令だけで構成されています。
最初の2つのMVI命令で、HLアドレスに”0006”が入れられます。
次のMVI命令でメモリアドレス”0006”に、データ”76”が書き込まれます。
[第50回]では、2番目のMVI L,06のステップ動作を写真に撮って説明しました。
今回は、その続きを見ていくことになります。

●クロック毎の動作の様子です

最初の写真は、MVI L,06の実行が完了して、次のMVI M,76命令の最初のステップに移ったところです(MVI L,06命令のときの最後の写真と同じです)。
OPコードフェッチサイクルのT0です。


プログラムカウンタ下位8ビットPC(L)の値は00000100です。
アドレスバス下位8ビット(A0−A7)にも00000100が表示されています。
PCADoutが点灯しているので、プログラムカウンタの値が外部アドレスバス(A0〜A15)に出力されていることがわかります。

MEMRDがアクティブなので、メモリから0004番地の値”36”(00110110)が外部データバスD0−D7に出力されています。
DataEnableもDataDIRも点灯していて、innerBUS(内部データバス)に、外部データバスから00110110が入っていることがわかります。
OPreg(OPコードレジスタ)には、まだひとつ前の命令(”2E”)がラッチされたままです。

Hレジスタ(regH)とLレジスタ(regL)には、0000〜0003番地のMVI命令が実行された結果、”0006”が入っています。

写真中央右上寄りにあるA〜Dは、T、M、Wパルスの元になる74HC161からの出力信号Qa〜Qdです。今はT0ですから全部消灯しています(Qa〜Qd=0)。

T1の写真です。


Aのみ点灯して、T1サイクルであることを示しています。

T1になって、OPコードレジスタに命令コード00110110(”36”)が表示されました。
ラッチパルスが入力されていることを示す、OPcodeFetchが点灯しています。
このタイミングでは命令コードは「筒抜け」になっているだけで、まだラッチはされていません。
OPcadeFetchの点灯→消灯のタイミングで、命令コードがOPコードレジスタにラッチされます。

d2〜d0はOP5〜OP3がそのまま出力されるので、”110”に変わりました。
s2〜s0もOP2〜OP0と同じ”110”が表示されています。
このタイミングでは、d3とs3はまだ前の命令が実行されたときのままになっています。
T0〜T3はOPコードフェッチサイクル(命令コードをOPコードレジスタにラッチするだけ)なので、d3〜d0、s3〜s0が、命令の実行に必要な状態になっていなくても構いません。

T2の写真です。


ステップが進み、Bのみ点灯して、T2であることを示しています。
OPcodeFetchが消灯しました。

T3の写真です。


A、Bが点灯して、T3サイクルであることを示しています。
PCincが点灯しました。
プログラムカウンタはT3の終了時にカウントアップされるので、この時点ではまだ変化はしません(PCincが点灯→消灯のタイミングでカウントアップされます)。

T4の写真です。


Cのみ点灯して、T4サイクルであることを示しています。
PCincが消灯しました。
プログラムカウンタが+1されて、PC(L)は00000101(”05”)になりました。
外部アドレスバスも”0005”になっています。
PCADoutが点灯していてプログラムカウンタの値が出力されていることがわかります。

MEMRDが点灯しているので、メモリアドレス”0005”の値(”76”)が外部データバスに出力されていることがわかります。
DataEnableもDataDIRも点灯しているので、innerBUS(内部データバス)も、外部データバスと同じ01110110になっています。

d3、s3が消灯しました。
画面左上、regWRが点灯しています。
regWRが点灯していてd3〜d0=0110なので、WKHレジスタ(regWKH)が筒抜けになって、内部データバスと同じ01110110が表示されています。
WKHレジスタは筒抜けになっているだけで、まだデータはラッチされていません。
regWRが点灯→消灯に変わるタイミングでラッチされます。

OPコードレジスタにはまだMVI M,76命令の00110110(”36”)がラッチされています。

T5の写真です。


AとCが点灯して、T5サイクルであることを示しています。
regWRが消灯しました。
これでレジスタWKHにデータがラッチされました。
しかしPCADout、MEMRD、DataEnable、DataDIRは点灯していて、メモリアドレス”0005”のデータがまだ内部データバスにあることがわかります。

PCincが点灯しました。
プログラムカウンタはT5の終わりのタイミングで+1されますから、この時点ではまだカウントアップされていません。

T6の写真です。


BとCが点灯して、T6サイクルであることを示しています。
PCincが消灯しました。
プログラムカウンタが+1されて、PC(L)は00000110(”06”)になりました。
外部アドレスバスA0〜A15も”0006”になっていますが、PCADoutは消灯しているので、プログラムカウンタの値が外部アドレスバスに出力されているのではないことがわかります。
PCADoutの代わりに、HLselが点灯しているので、外部アドレスバスA0〜A15には、HLレジスタの値が出力されていることがわかります。

regRDが点灯し、s3〜s0=0110なのでWKHレジスタが選択されます。
WKHregRDが点灯し、WKHレジスタのデータが内部バスに出力されていることがわかります。

DataEnableは点灯していますが、DataDIRは消灯しました。
データバスの向きが、外部データバス←内部データバスの向きになっているので、内部データバスの値(=WKHレジスタの値)が、外部データバスに出力されていることがわかります。

d3が点灯し、d3〜d0=1110になりました。
regWRも点灯し、d3〜d0が1110なので、MEMWRがアクティブになります。
MEMWRが点灯し、メモリアドレス”0006”にデータバスの値(”76”)が書き込まれます。
このタイミングではメモリに書かれるデータはまだ確定していません。MEMWRがL→Hになるタイミングで、データがそのメモリアドレスに完全に書き込まれます。

T7の写真です。


A〜Cが点灯して、T7サイクルであることを示しています。
regWR、MEMWRが消灯しました。
これでメモリアドレス”0006”にデータ”76”が書き込まれました。
しかしHLsel、regRD、WKHregRD、DataEnable、は点灯していて、s3〜s0は0110のままなので、外部アドレスバスA0〜A15には、メモリアドレス”0006”が出力されていて、外部データバスD0〜D7には、WKHレジスタのデータがまだ出力されていることがわかります。

T8の写真です。


T8サイクルは一瞬で完了し、またT0サイクルに戻るため、A〜Dは全部消灯しています。
regRD、WKHregRD、HLselは消灯しました。
PCADoutが点灯していて、プログラムカウンタの値が外部アドレスバスA0〜A15に出力されていることがわかります。
2008.8.30upload

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