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