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

●STA、LDA、JMP命令のクロック毎の動作を見ていきます

いつものように各命令の動作を、クロック毎の写真を見ながら説明していきます。

STAは命令コードに続く2バイトで直接指定するメモリアドレスにAレジスタの値を書き込む命令です。
LDAはその逆の動作をします。命令コードに続く2バイトで直接指定するメモリアドレスの値をAレジスタに書き込みます。
STA、LDAについては[第66回]で説明しています。

JMPは命令コードに続く2バイトで直接指定するメモリアドレスにジャンプします。
JMP命令は[第61回]で説明しました。

これらの命令の動作をわかりやすくするために、次のプログラムをクロック毎に実行させてみます。

0000 3E55       MVI A,55
0002 323412     STA 1234
0005 3EF0       MVI A,F0
0007 3A3412     LDA 1234
000A C33412     JMP 1234

まずプログラムの先頭で、Aレジスタに適当な値を入れておきます。
その値を、STA命令でメモリの1234番地に書き込みます。
次にLDA命令で同じメモリアドレスから、今書き込んだ値を読み出してAレジスタに書き込みますが、STAの次にすぐLDAを実行したのでは、本当にメモリからAレジスタにデータを読み込んだのかどうか確認ができません。
そこで、Aレジスタに別の値(ここではF0)を書き込んでおいてから、LDA命令を実行させることにします。
こうすることで、メモリから読み出した値でAレジスタが書き換わる様子を確認することができます。
最後にJMP命令で1234番地にジャンプします。
Aレジスタの値を書き込んだメモリアドレスにジャンプすることに特別の意味はありません。
こうすることによって、JMP命令が実行されたとき、ジャンプ先のメモリアドレス(1234番地)の値がデータバスに表示されるので、そのことによって、STA、JMPの各命令が正しく実行されていることの確認ができる、と考えたからです。

●まずは、MVI A命令のクロック毎の動作の写真です

MVI命令のクロック毎の動作の写真は、[第50回]でお見せしました。
ですから説明はごく簡単に済ませます。
MVI命令のタイミングチャート([第49回])を見ながら、写真を見ていくと、より理解しやすいと思います。

OPコードフェッチサイクルのT0です。


またLEDを追加しました。
今回はJMP命令で、PC(プログラムカウンタ)の上位8ビットも確認したくなりますから、PCH(プログラムカウンタの上位8ビット)を表示するLEDを追加しました。今までは下位8ビットのみを表示していました。

T1の写真です。


T2の写真です。


T3の写真です。


T4の写真です。


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

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

画面左上、regWRが点灯しています。
regWRが点灯していてd3〜d0=1111なので、Aレジスタ(regA)が筒抜けになって、内部データバスと同じ01010101が表示されています。
AregWRも点灯しています。

T5の写真です。


AとCが点灯して、T5サイクルであることを示しています。

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

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

STA命令のタイミングチャート([第64回])を参照しながら、写真をみていくと、より理解しやすいと思います。

T0の写真です。


PC(プログラムカウンタ)が+1されて、PC(L)は00000010(”02”)になりました。
外部データバスには0002番地のメモリの値”32”が出力され、内部データバスにも同じ”32”が表示されています。

T1の写真です。


OPcodeFetchが点灯し、”32”がOPコードレジスタ(OPreg)に入りました。

T2の写真です。


OPcodeFetchが消灯し、”32”がOPコードレジスタにラッチされました。

T3の写真です


PCclkが点灯しました。

T4の写真です


PC(プログラムカウンタ)が+1されて”0003”になりました。
PCの値が外部アドレスバスに出力され、外部アドレスバスも”0003”になっています。
データバスにはメモリアドレス”0003”番地の値、”34”が出力されていて、WKLレジスタに読み込まれています。
STA命令で指定するメモリアドレスの下位8ビットです。

プログラムカウンタはプログラムアドレスを保持していなければいけないため、STA命令で指定するアドレスを入れておくことはできません。そのため、ワークレジスタが使われます。
STA命令が指定するアドレス2バイトをメモリからワークレジスタに読み込んでから、そのワークレジスタの値をアドレスバスに出力します。

regWRが点灯し、d3〜d0が”0111”なので、WKLレジスタが選択され、WKLregWRが点灯しています。

T5の写真です


PCclkが点灯しました。
regWR、WKLregWRは消灯しました。

T6の写真です。


PCclkが消灯し、PC(プログラムカウンタ)が+1されて”0004”になりました。
PCADoutが点灯していて、外部アドレスバスA15−A8、A7−A0にPCの値がそのまま出力されています。
外部データバスD7−D0にはメモリアドレス”0004”番地の値、”12”が出力されていて、WKHレジスタに読み込まれています。
STA命令で指定するメモリアドレスの上位8ビットです。

regWRが点灯し、d3〜d0が”0110”なので、WKHレジスタが選択され、WKHregWRが点灯しています。

T7の写真です。


regWR、WKHregWRは消灯しました。
PCclkが点灯しています。

T8の写真です。


PCclkが消灯し、PC(プログラムカウンタ)が+1されて”0005”になりました。
しかしPCADoutは消灯しています。PC(プログラムカウンタ)の値は外部アドレスバスには出力されていません。

代わりにWKselが点灯していて、WKH、WKLレジスタの値”1234”が外部アドレスバスA15−A8、A7−A0に出力されています。

regRDとAregRDが点灯しています。
regRDがアクティブでs3−s0が”1111”なのでAレジスタ(regA)が選択され、内部データバスに、Aレジスタの値”55”が出力されています。

DataEnableは点灯していますが、DataDIRが消灯していますから、データバスのゲートが、内部データバス→外部データバスの向きになっていることがわかります。
外部データバスも”55”になっています。

MEMWRが点灯していて、データバスの値”55”をメモリアドレス”1234”に書き込み中でであることを示しています。

T9の写真です。


MEMWRが消灯しました。
T9でSTA命令の動作は終了です。
T10は一瞬で終わり、次の命令のT0になります。

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


PCADoutが点灯し、PC(プログラムカウンタ)の値”0005”が外部アドレスバスA15−A8、A7−A0に出力されています。
2008.9.21upload
2008.9.22追加
前へ
次へ
ホームページトップへ戻る