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

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

POP PSWは、スタックのデータをAレジスタとF(フラグ)レジスタに戻す命令です。
普通は「戻す」ために使うのですが、必ず戻さなければならないというものではありません。
目的によってはわざと別のレジスタに「移す」こともあります。

今回実行したプログラムも、PUSH PSW命令に続いて、PUSH H命令を実行したあとで、POP PSW、POP Hの順で実行しますから、HLレジスタの値がPSW(AレジスタとFレジスタ)に入り、AレジスタとFレジスタの値がHLレジスタに入ってしまいます。
これはしかし前回にも書きましたが、PUSH、POPの動作をよりはっきりと確認できるように、わざとそのような順番で実行させているのです。

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

前回スタックにPUSHされた、A、F、H、Lの各レジスタの値は、以下の通りです。
Aレジスタは”02”、フラグレジスタは”45”、Hレジスタは”00”、Lレジスタは”80”です。
スタックには、”02”、”45”、”00”、”80”の順に格納されました。

今回ははじめにPOP PSWを、次にPOP Hを実行しますから、フラグレジスタに”80”が入り、Aレジスタに”00”、Lレジスタに”45”、Hレジスタに”02”がそれぞれ入れられます。
その様子をクロックごとに確認していくことにします。

POP命令はPUSH命令とは違って、その他の命令と同じように、命令としての動作はT4から始まります。

T4の写真です。


PC(プログラムカウンタ)は”0006”になっていて、OPコードレジスタには”F1”(POP PSWのOPコード)がラッチされていますが、PCADoutが消灯していて、PC(プログラムカウンタ)の値は、外部アドレスバスA15−A0には出力されていません。

SP(スタックポインタ)は前回のPOP H命令を実行したあとの、”7FFC”のままになっています。
SPselがアクティブになって、SPの値が外部アドレスバスA15−A0に出力されています。
MEMRDが点灯し、メモリアドレス”7FFC”の値”80”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”80”になっています。

regWRが点灯し、d3−d0は”0001”なので、データの受け手としてF(フラグ)レジスタが選択されて、FregWRが点灯しています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。

FregWRはフラグレジスタを構成するDフリップフロップ74HC74のCLK端子の入力信号です。
FregWRの消灯するタイミングで入力データ(内部データバスの値)がラッチされ、フラグレジスタの出力に反映されます。

T5の写真です。


regWR、FregWRが消灯し、フラグレジスタ(regF)に、内部データバスの値”80”がラッチされました。
その結果、S(サイン)フラグだけが点灯しています。その他のレジスタは全て消灯(クリア)されました。
このように、PUSH H(またはPUSH B、PUSH D)とPOP PSWを組み合わせて実行することで、フラグを強制的にセット、リセットさせることができます。

SPclkが点灯しました。
POP命令はPUSH命令の反対の動作をします。スタックアドレスを+1させながら、スタックに格納されているデータをレジスタに”ダウンロード”します。
スタックポインタを構成しているUP/DOWNカウンタ74HC191のUP/DOWNを決定するd/u端子(pin5)はUP(Lレベル)にセットされ、SPupが点灯しています。
SPupはUPのとき点灯し、DOWNのとき消灯します。

T6の写真です。


SPclkが消灯し、SPの値が+1されて”7FFD”になりました。
SPの値が外部アドレスバスA15−A0に出力されています。
MEMRDが点灯し、メモリアドレス”7FFD”の値”00”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”00”になっています。

regWRが点灯し、d3−d0は”1111”なので、データの受け手としてAレジスタが選択されています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
AregWRが点灯し、Aレジスタ(regA)に内部データバスの値”00”が入っています。

T7の写真です。


regWR、AregWRが消灯しました。
Aレジスタに”00”がラッチされました。

SPclkが点灯しています。
SPclkが消灯するタイミングでスタックポインタが+1されます。

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


T8は一瞬で終了し、次の命令のT0になります。
SPclkが消灯し、SP(スタックポインタ)が+1されて、”7FFE”になりました。

外部アドレスバスA15−A0にPC(プログラムカウンタ)の値”0006”が出力され、次の命令コード”E1”(POP H)が外部データバスD7−D0に出力されています。

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

T4の写真です。


PC(プログラムカウンタ)は”0007”になっていて、OPコードレジスタには”E1”(POP HのOPコード)がラッチされていますが、PCADoutが消灯していて、PC(プログラムカウンタ)の値は、外部アドレスバスA15−A0には出力されていません。

SPselがアクティブになって、SPの値”7FFE”が外部アドレスバスA15−A0に出力されています。
MEMRDが点灯し、メモリアドレス”7FFE”の値”45”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”45”になっています。

regWRが点灯し、d3−d0は”1101”なので、データの受け手としてLレジスタが選択されます。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
LregWRが点灯し、Lレジスタ(regL)に内部データバスの値”45”が入っています。

T5の写真です。


regWR、LregWRが消灯し、Lレジスタ(regL)に、内部データバスの値”45”がラッチされました。
このように、PUSH PSWとPOP H(またはPOP B、POP D)を組み合わせて実行することで、フラグレジスタの値を汎用レジスタL(またはC、E)に入れることができます。

SPclkが点灯しました。

T6の写真です。


SPclkが消灯し、SPの値が+1されて”7FFF”になりました。
SPの値が外部アドレスバスA15−A0に出力されています。
MEMRDが点灯し、メモリアドレス”7FFF”の値”02”が外部データバスD7−D0に出力されています。
内部データバスinnerBUSも”02”になっています。

regWRが点灯し、d3−d0は”1100”なので、データの受け手としてHレジスタが選択されています。
d3−d0とレジスタの関係については、「レジスタコード表」([第27回])を参照してください。
HregWRが点灯し、Hレジスタ(regH)に内部データバスの値”02”が入っています。

T7の写真です。


regWR、HregWRが消灯しました。
Hレジスタに”02”がラッチされました。

SPclkが点灯しています。
SPclkが消灯するタイミングでスタックポインタが+1されます。

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


T8は一瞬で終了し、次の命令のT0になります。
SPclkが消灯し、SP(スタックポインタ)が+1されて、”8000”になりました。
2008.10.2upload

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