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

●JNZ命令のクロック毎の動作の写真です(2)

前回は条件JMP命令のうち、JZ命令とJNZ命令のクロック毎の動作について説明しました。
前回実行したテストプログラムでは、JZ命令は条件不成立の場合の動作で、JNZ命令は条件成立のときの動作になりました。
今回はそれぞれその逆の場合について見てみます。

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

0000 3EFF    MVI A,FF
0002 3C      DCR A
0003 C23412  JNZ 1234
0006 CA7856  JZ 5678

前回はDCR A命令でしたが、今回はZ(ゼロ)フラグをセットさせるために、Aレジスタに”FF”を入れておいて、INR Aを実行します。
INR A命令が終わってフラグがセットされたあとの、JNZ 1234命令から、クロック毎の動作を見ていくことにします。
JNZ命令も、JZ命令もT0〜T3は省略します。

●INR A命令実行後のフラグの状態です


最初にAレジスタに”FF”を入れて、それをINR Aで+1したのですから、結果は”00”になって、Z(ゼロ)フラグがセットされ、S(サイン)フラグはリセットされます。
[注意]最初にMVI A,FFを実行しても、S(サイン)フラグはセットされません(変化しません)。次にINR Aが実行されると、S(サイン)フラグは(もしセットされていたなら)クリアされます。

JNZ 1234命令のT4の写真です。


JNZ命令のクロック毎の動作については、条件JMP命令(条件不成立の時)のタイミングチャート([第63回])を参照しながら写真を見ると、わかりやすいと思います。

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

MEMRDが点灯していて、メモリアドレス”0004”の値”34”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”34”になっています。
regWRが点灯していて、d3−d0が”0111”なのでWKLレジスタが選択されます。
WKLregWRが点灯していて、WKLレジスタに内部データバスの値”34”が読み込まれています。

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

T5の写真です。


regWR、WKLregWRが消灯し、WKLレジスタに、内部データバスの値”34”がラッチされました。
PCclkが点灯しました。

T6の写真です。


PC(プログラムカウンタ)は”0005”になりました。
PC(プログラムカウンタ)の値が、外部アドレスバスA15−A0に出力されています。

MEMRDが点灯していて、メモリアドレス”0005”の値”12”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”12”になっています。
regWRが点灯していて、d3−d0が”0110”なのでWKHレジスタが選択されます。
WKHregWRが点灯していて、WKHレジスタに内部データバスの値”12”が読み込まれています。

T7の写真です。


regWR、WKHregWRが消灯しました。
WKHレジスタに”12”がラッチされました。
PCclkが点灯しました。

T8の写真です。


Z(ゼロ)フラグがセットされているため、JNZ命令は実行されません。T8は一瞬で終わって次の命令のT0になります。
PC(プログラムカウンタ)は”0006”になりました。
外部アドレスバスA15−A0にPCの値が出力され、外部データバスD7−D0にメモリアドレス”0006”の値”CA”が出力されています。
”CA”はJZ命令のOPコードです。

●JZ命令のクロック毎の動作の写真です(2)

今度のJZ命令は条件が成立するので通常のJMP命令と同じ動作になります。
JMP命令のタイミングチャート([第61回])を参照しながら写真を見てください。

T4〜T7はJNZ命令と全く同じですから、説明は省略します。

T4の写真です。


T5の写真です。


T6の写真です。


T7の写真です。


T8の写真です。


条件が成立したため、WKレジスタの値がPC(プログラムカウンタ)に送られます。
regRDとregWRが両方とも点灯しています。
s3−s0が”0111”なのでデータの送り手としてWKLレジスタが選択されます。
WKLregRDが点灯して、WKLレジスタの値”78”が内部データバスinnerBUSに出力されています。
d3−d0が”0011”なのでデータの受け手としてPCL(プログラムカウンタの下位8ビット)が選択されます。
PCLregWRが点灯して、内部データバスの値”78”がPC(L)レジスタに読み込まれています。

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

T9の写真です。


regWR、PCLregWRが消灯しました。
PC(L)レジスタに”78”がラッチされました。

T10の写真です。


regRDとregWRが点灯しています。
s3−s0が”0110”なのでデータの送り手としてWKHレジスタが選択されます。
WKHregRDが点灯して、WKHレジスタの値”56”が内部データバスinnerBUSに出力されています。
d3−d0が”0010”なのでデータの受け手としてPCH(プログラムカウンタの上位8ビット)が選択されます。
PCHregWRが点灯して、内部データバスの値”56”がPC(H)レジスタに読み込まれています。

T11の写真です。


regWR、PCLregWRが消灯しました。
PC(H)レジスタに”56”がラッチされました。

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


T12は一瞬で終了し、次の命令のT0になります。
PCADoutが点灯し、PC(プログラムカウンタ)の新しい値”5678”が外部アドレスバスA15−A0に出力されました。
JZ命令の実行が完了し、指定したアドレスにジャンプしました。
2008.10.5upload

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