標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第99回]
●CALL命令のクロック毎の動作の写真です
今回は前々回に説明したCALL命令と、前回説明したRET命令のクロック毎の動作の写真をお見せします。
テストに使ったプログラムです。
0000 310008 LXI SP,0800
0003 CD1000 CALL 0010
0006 00
0010 47 MOV B,A
0011 C9 RET
最初にスタックポインタを設定します。
スタックを0800番地におくことにします。
SP(スタックポインタ)を設定しないでCALL命令を実行すると、RET命令でもとのアドレスに戻ることができなくて暴走してしまいます。
SP(スタックポインタ)の設定は、CALL命令のつど必要なものではなく、プログラムの先頭で一度だけ実行させるようにします。
メモリアドレス0003のCALL命令が実行されると、PC(プログラムカウンタ)が0010に書き換えられ、その結果0010番地にジャンプすることになります。
0010番地には、適当な命令としてMOV命令が書いてあります。
MOV命令が実行されたあと、次のRET命令が実行されます。
RET命令が実行されると、スタックから戻り先アドレスを取り出してPC(プログラムカウンタ)に格納します。
その結果、CALL命令の次のメモリアドレス0006番地に戻ることになります。
以上の動作を順に見ていきます。
LXI SP命令のクロック毎の動作の写真は[第84回]でお見せしていますから、今回は省略します。
最初はCALL命令です。
CALL命令のT4からお見せします。
T4の写真です。
CALL命令の前にLXI SP命令が実行されているので、SP(スタックポインタ)は”0800”になっています。
PC(プログラムカウンタ)は”0004”になっています。
OPコードレジスタには、CALL命令のOPコード、”CD”がラッチされています。
PCの値が外部アドレスバスに出力され、外部アドレスバスも”0004”になっています。
データバスにはメモリアドレス”0004”番地の値、”10”が出力されていて、内部データバス(innerBUS)も”10”になっています。
regWRが点灯し、d3〜d0が”0111”なので、WKLレジスタが選択されます。
WKLregWRが点灯し、WKLレジスタに内部データバスの値”10”が書き込まれています。
CALL命令で指定するメモリアドレスの下位8ビットです。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
T5の写真です。
PCclkが点灯しました。
regWR、WKLregWRは消灯しました。
高級な一眼レフなどではなくて、お手軽デジカメのところへもってきて、照明が不足していてシャッタースピードが遅いので注意しないとブレてしまいます。
でも撮りなおそうとするとまた最初から全部やり直ししなくてはならないのでたまりません。
ま、LEDの表示が見えればいいか、ということで、お見苦しいところもありますが、なにとぞご容赦くださいませ。
T6の写真です。
PCclkが消灯し、PC(プログラムカウンタ)が+1されて”0005”になりました。
PCADoutが点灯していて、外部アドレスバスA15−A8、A7−A0にPCの値がそのまま出力されています。
外部データバスD7−D0にはメモリアドレス”0005”番地の値、”00”が出力されていて、内部データバス(innerBUS)も”00”になっています。
regWRが点灯し、d3〜d0が”0110”なので、WKHレジスタが選択されます。
WKHregWRが点灯し、WKHレジスタに内部データバスの値”00”が書き込まれています。
CALL命令で指定するメモリアドレスの上位8ビットです。
T7の写真です。
regWR、WKHregWRは消灯しました。
PCclkが点灯しています。
T8の写真です。
CALL命令のT8は何もしないダミーサイクルです。
PC(プログラムカウンタ)は”0006”になりましたが、PCADoutが消灯しているので、外部アドレスバスには出力されません。
T9の写真です。
SPclkが点灯しました。
T10の写真です。
SP(スタックポインタ)が−1されて、”07FF”になりました。
SPselが点灯して、SP(スタックポインタ)の値が外部アドレスバスA15−A0に出力されています。
regRDが点灯していて、s3−s0が”0010”なので、データの送り元としてPC(H)レジスタ(プログラムカウンタの上位8ビット)が選択されています。
PCHrdが点灯して、PC(H)レジスタ(プログラムカウンタの上位8ビット)の値”00”が内部データバスinnerBUSに出力されています。
外部データバスD7−D0にも出力されていて、MEMWRが点灯しているので、メモリアドレス”07FF”(スタック)にPC(プログラムカウンタ)の上位8ビットの値”00”が書き込まれます。
s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
T11の写真です。
MEMWRが消灯し、SPclkが点灯しました。
T12の写真です。
SP(スタックポインタ)が−1されて、”07FE”になりました。
SPselが点灯して、SP(スタックポインタ)の値が外部アドレスバスA15−A0に出力されています。
regRDが点灯していて、s3−s0が”0011”なので、データの送り元としてPC(L)レジスタ(プログラムカウンタの下位8ビット)が選択されています。
PCLrdが点灯して、PC(L)レジスタ(プログラムカウンタの下位8ビット)の値”06”が内部データバスinnerBUSに出力されています。
外部データバスD7−D0にも出力されていて、MEMWRが点灯しているので、メモリアドレス”07FE”(スタック)にPC(プログラムカウンタ)の下位8ビットの値”06”が書き込まれます。
PC(プログラムカウンタ)はCALL命令の次のアドレス”0006”を示しています。このアドレスをスタックに保存することで、RET命令で戻ってくることが可能になります。
s3−s0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
T13の写真です。
MEMWRが消灯しました。
T14の写真です。
regRDとregWRが両方とも点灯しています。
s3−s0は”0110”で、データの送り元としてWKHレジスタが選択されています。
d3−d0は”0010”で、データの受け手としてPCH(プログラムカウンタの上位8ビット)が選択されています。
s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
WKHregRDが点灯していて、CALL命令の上位8ビットを格納している、WKHレジスタから”00”が読み出されて、内部データバス(innerBUS)に出力されています。
PCHwrが点灯していて、PCHレジスタに”00”が読み込まれていることがわかります。
プログラムカウンタを書き換えています。
T15の写真です。
PCHwrが消灯しました。
T16の写真です。
A〜Dが全部消灯しているのでT0のように見えますが、もう1桁上のEを表示するLEDがないので、T0と区別がつきませんが、T0ではなくて、T16(2進数では”10000”)です。
regRDとregWRが両方とも点灯しています。
s3−s0は”0111”で、データの送り元としてWKLレジスタが選択されています。
d3−d0は”0011”で、データの受け手としてPCL(プログラムカウンタの下位8ビット)が選択されています。
s3−s0、d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
WKLregRDが点灯していて、CALL命令の下位8ビットを格納している、WKLレジスタから”10”が読み出されて、内部データバス(innerBUS)に出力されています。
PCLwrが点灯していて、PCLレジスタに”10”が読み込まれていることがわかります。
T17の写真です。
A−DのLEDはAしか点灯していませんが、T1ではなくてT17(2進数では”10001”)です。上位ビットのEを表示するLEDがないのでT1と同じように見えます。
PCLwrが消灯しました。
PC(プログラムカウンタ)が”0010”に書き換えられました。
T18(次の命令のT0)の写真です。
T18は一瞬で終了し、次の命令のT0になります。
外部アドレスバスA15−A0にはPC(プログラムカウンタ)の値”0010”が出力されています。
CALL命令が実行された結果、”0010”番地にジャンプしたことがわかります。
●MOV B,A命令のクロック毎の写真です
MOV命令のクロック毎の動作は[第41回]で説明済みですから、T4からの動作の写真を説明無しでお見せします。
MOV命令のT4の写真です。
T5の写真です。
T6(次の命令のT0)の写真です。
メモリアドレス”0011”のRET命令のT0です。
外部アドレスバスA15−A0は”0011”になって、データバスD7−D0には”C9”(RETのOPコード)が出力されています。
●RET命令のクロック毎の動作の写真です
RET命令の動作もT4から見ていくことにします。
RET命令のT4の写真です。
SPselが点灯していて、外部アドレスバスA15−A0にはSP(スタックポインタ)の値”07FE”が出力されています。
外部データバスD7−D0には、スタックの値の”06”(保存されていた戻り先アドレスの下位8ビット)が出力されていて、内部データバスinnerBUSにも読み込まれています。
regWRが点灯しています。
d3−d0は”0011”で、データの受け手としてPCL(プログラムカウンタの下位8ビット)が選択されています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
PCLwrが点灯していて、PCLレジスタに”06”が読み込まれています。
T5の写真です。
PCLwrは消灯しました。
SPclkが点灯しました。
SPd/uが点灯しています。
SPd/uが点灯しているときは、SPclkの入力によって、SP(スタックポインタ)はUPカウントします(+1されます)。消灯しているときはDOWNカウント(−1)します。
T6の写真です。
SPclkが消灯し、SP(スタックポインタ)の値は+1されて、”07FF”になりました。
SPselが点灯していて、外部アドレスバスA15−A0にはSP(スタックポインタ)の値”07FF”が出力されています。
外部データバスD7−D0には、スタックの値の”00”(保存されていた戻り先アドレスの上位8ビット)が出力されていて、内部データバスinnerBUSにも読み込まれています。
regWRが点灯しています。
d3−d0は”0010”で、データの受け手としてPCH(プログラムカウンタの下位8ビット)が選択されています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
PCHwrが点灯していて、PCHレジスタに”00”が読み込まれています。
PCHwrが消灯しました。
PC(プログラムカウンタ)に、スタックから取り出した、戻り先のアドレス”0006”が書き込まれました。
SPclkが点灯しました。
SPclkが消灯するタイミングでSP(スタックポインタ)が+1されます。
T8(次の命令のT0)の写真です。
SP(スタックポインタ)が+1されて、”0800”になりました。
T8は一瞬で終了して、次の命令のT0になります。
外部アドレスバスA15−A0にはPC(プログラムカウンタ)の値”0006”が出力されています。
RET命令の実行によって、CALL命令の次のメモリアドレスの”0006”番地に戻ったことがわかります。
2008.10.19upload
前へ
次へ
ホームページトップへ戻る