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

●RAL、CMC、STCのクロック毎の動作の写真です

前回は、説明の途中でタイムアウトになってしまいました。
今回は前回の続きからのスタートです。

前回、そのさらに前の[第169回]に説明した、回路図のC(キャリー)フラグのセット、リセット信号についての説明に誤りがあることに気がつきました、と書きました。
本日(2009.2.25)、[第169回]のその部分を加筆訂正いたしました。

さて、ステップ動作の前回からの続きです。
前回は、RRC命令の最後のT10(CMC命令のT0)の写真までお見せしました。
T1〜T3のOPコードフェッチサイクルはどの命令でも共通ですから省略することにして、T4から始めます。

CMC命令のT4の写真です。

OPコードレジスタに3Fがラッチされています。
C(キャリー)フラグはまだ変化していません。
RRC命令の実行によって、リセットされた状態のままです。
PC(プログラムカウンタ)は0005になりました。

T5の写真です

C(キャリー)フラグが反転し、それまで消灯していたLEDが点灯しました。

ところでRRC命令のときに活躍した、ローテイト用レジスタですが、T4ではRRC命令を実行したときのままの78になっていたのが、T5ではFFになってしまいました。

じつは74HC194のRES(リセット)端子はこのときはまだVccにつないでありました。
ローテイト命令以外では使用されないレジスタなので、他の命令のときには、どういう状態でもいい、と考えたからです。
そのため、今回のように、関係の無い、他の命令のT4、T6の終りのタイミングで内部データバスiB7〜iB0の値を勝手にLOADしてしまったり、右や左にローテイトしてしまいます。

外から中のレジスタが見えなければ、まだよいのですが、なにしろ全てのレジスタにLEDがついていて、その状態が丸見えなものですから、そんな風に勝手にガチャガチャされると、気になって仕方がありません。
そこで[第169回]の回路図のように、74HC194のRES端子には、ローテイト命令のセレクト信号を入れて、それ以外の命令のときには常にクリアされているように、回路を変更しました。

現在は回路図の通りに変更済みですが、この写真を撮ったときは、まだ変更前でしたから、ローテイト用レジスタが勝手に変化しています。

T6(次の命令のT0)の写真です

T6は一瞬で終了し、次の命令(RAL、命令コード17)のT0になります。
アドレスバスA15〜A0には、PC(プログラムカウンタ)の値0005が出力され、データバスD7〜D0には、17が表示されています。
内部データバスiB7〜iB0にも17が表示されています。
OPコードレジスタには、まだ前の命令コード(3F)がラッチされています。
T6が一瞬で終わったタイミングで、ローテイト用レジスタが、どうやら勝手に右にシフトしてしまったようです。これはさきほど説明した理由によるものですから、気にしないでください。

今回も、T1〜T3は飛ばして、T4から始めます。

RAL命令のT4の写真です

Aレジスタにread信号が入って(左の黄LED)、Aレジスタの値(78)が内部データバスに出力されています。
PC(プログラムカウンタ)は0006になりました。

T5の写真です

内部データバスに出力されていた、Aレジスタの値(78)がローテイト用レジスタにラッチされました。

T6の写真です

ローテイト用レジスタにクロックが入っているのですが、この写真ではわかりません。
T6の終りのタイミングで、ローテイト動作が行われます。

T7の写真です

ローテイト用レジスタの値が1ビット左にローテイトして、78だったものが、F1になりました。
レジスタの値が左に1ビットシフトして、C(キャリー)フラグの値(1)が、D0に入れられた結果です。
まだC(キャリー)フラグは変化していません。
C(キャリー)フラグはT8でセット、リセットされます。

T8の写真です

C(キャリー)フラグが消灯しました。
これはローテイト前のAレジスタのD7の値が入ったためです。
ローテイト用レジスタのread信号(左の黄LED)がアクティブになって、内部データバスに、その値F1が出力されています。
同時にAレジスタのwrite信号(右の緑LED)がアクティブになって、AレジスタにF1が書き込まれています。

T9の写真です

Aレジスタの緑LED(write信号)が消灯しました。

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

T10は一瞬で終了し、次の命令(STC、命令コード37)のT0になります。
MEMRDがアクティブになっています。
アドレスバスA15〜A0には、PC(プログラムカウンタ)の値0006が出力され、データバスD7〜D0には、37が表示されています。
内部データバスiB7〜iB0にも37が表示されています。
OPコードレジスタには、まだ前の命令コード(17)がラッチされています。

次の命令のSTCは、C(キャリー)フラグをセットする命令ですが、短い命令なので、T4のときに、もうC(キャリー)フラグをセットしてしまいます。
ですから、T1〜T3を省略してしまうと、いきなりT4で結果が出てしまいますから、今回は、省略しないでT1から順に写真をお見せすることにします。

STC命令のT1の写真です

OPコードレジスタに命令コード37が書き込まれています。
OPコードレジスタのwrite信号を示す緑LEDが点灯しています。
OPコードレジスタに命令コードがラッチされるのは、このT1の終りのタイミングです。
C(キャリー)フラグは、RAL命令の実行によって、クリアされたままです(消灯しています)。

T2の写真です

MEMRDが消灯しました。
OPコードレジスタの緑LED(write信号)が消灯して、OPコードレジスタに命令コード37がラッチされました。
C(キャリー)フラグは、まだクリアされたままです。

T3の写真です

PC(プログラムカウンタ)にクロック(右上の緑LED)が入っています。T3の終りのタイミングでPCがカウントアップされます。
C(キャリー)フラグは、まだクリアされたままです。

T4の写真です

PC(プログラムカウンタ)は0007になりました。
C(キャリー)フラグがセットされました(点灯しました)。

T5の写真です

STC命令のT5は何もしません(ダミーサイクル)です。

T6(次の命令のT0)の写真です

T6は一瞬で終了し、次の命令のT0になります。

2009.2.25upload

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