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

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

[第167回]で説明した、STC、CMC命令と[第168回][第169回]で説明したローテイト命令のうちの、RRC、RAL命令をステップ動作させて、クロック毎の写真を撮りました。

STCはC(キャリー)フラグをセットする命令です。
CMCはC(キャリー)フラグを反転させる命令です。
RRCはAレジスタのみを右(D7→D0)に1ビット回転させる命令です。D7とC(キャリー)フラグにはD0の値が入ります。
RALはAレジスタとC(キャリー)フラグをつないで仮に9ビットのレジスタにして、左(D7←D0)に1ビット回転させる命令です。D0にはC(キャリー)フラグの値が入り、C(キャリー)フラグにはD7の値が入ります。

ローテイト命令には、そのほかにも、RLCとRARがあります。
RLCはRRCの動作を左方向に行う命令で、RARはRALの動作を右方向に行う命令です。
ステップ動作の写真を全部の命令について掲載するのもなんだか冗長になってしまうようですので、RLCとRARについては写真には撮りませんでした。
写真には撮りませんでしたが、それぞれステップ動作はちゃんと実行して、正しく動作することは確認済みです。

ステップ動作でテストしたプログラムです。

0000 37      STC
0001 3EF0    MVI A,F0
0003 0F      RRC
0004 3F      CMC
0005 17      RAL
0006 37      STC

0003のRRC命令でC(キャリー)フラグとAレジスタの動作が確認できるように、最初にSTC命令でC(キャリー)フラグをセットし、Aレジスタには初期値としてF0を入れます。
実は、たまたま0000のSTC命令を実行させるときに、すでにC(キャリー)フラグがセットされてしまっていましたので、写真は撮ったのですけれど、STCの動作の前と後とで、C(キャリー)フラグの変化を確認することができませんでした。
そこでSTCの写真としては、最後の0006で実行したときのものをお見せすることにします。

MVI命令については、ずっと以前に[第50回]で、クロック毎の写真は、すでにお見せしています。
このときは、最初に作った試作基板での動作テストでしたが、動作としては同じですので、今回は、0003のRRC命令の写真からスタートすることにします。

RRC命令のT0の写真です
             これがフラグレジスタです↓      これ↓がローテイトレジスタです

フラグレジスタは、右からS(サイン)、Z(ゼロ)、H(ハーフキャリー)、P(パリティ)、C(キャリー)です。現在はZフラグのみ消灯していて、残りのフラグは点灯しています。Zフラグは0で残りのフラグの値は1であることを示しています。
ローテイト用レジスタには、以前の値が入っています。
その下に少し離れて一列に並んでいるのが、左からD、E、B、C、Aの各レジスタです。
0001のMVI A,F0を実行した結果、Aレジスタには、F0が入っています。
その下の列は、左からH、Lレジスタと、スタックポインタSPH、SPLです。
さらにその下は、左から、ワークレジスタWKH、WKLとプログラムカウンタPCH、PCLです。
今回は、Aレジスタ以外のレジスタは使われません。

プログラムカウンタは、0003を保持しています。
一番下の列は、左からアドレスバスA15〜A8、A7〜A0、データバスD7〜D0です。
アドレスバスA15〜A0は0003を表示していて、データバスD7〜D0はアドレス0003のメモリ内容0Fを表示しています。
右に少し下がって、内部データバスiB7〜iB0があります。内部データバスにも0Fが表示されています。
その右上はOPコードレジスタで、ここにはまだ前の命令コード(3E)がラッチされています。
さらにその右は制御信号を表示しています。一番左はMEMRDで、右から3番目はステップ動作中の表示です。
その右側の5個のLEDは、マシンクロックの出力パルス5ビットE、D、C、B、Aを示します。
現在は全部消灯していますから、クロックの状態は00000でT0であることを示しています。

T1の写真です。

OPコードレジスタに命令コード0Fが書き込まれています。
OPコードレジスタのwrite信号を示す緑LEDが点灯しています。
OPコードレジスタに命令コードがラッチされるのは、このT1の終りのタイミングです。
クロック表示のAが点灯して、T1であることを示しています。

T2の写真です

MEMRDが消灯しました。
OPコードレジスタの緑LED(write信号)が消灯して、OPコードレジスタに命令コード0Fがラッチされました。

T2と次のT3はクロックが進むだけで、内部的には何も変化しません。
実は、この期間は、割り込みやバスリクエストなどの特殊な制御のために用意されたものです。
この写真では、T2とT3では、アドレスバスA15〜A0とデータバスD7〜D0がCPUから開放されるため、全点灯しています。
これは、TK80のLED表示回路が、メモリのDMA(direct memory access)を行うために、この期間を開放するようにしたためです。
しかし、こうやって写真を見ると、なんとなく気持ちが良くありません。
TK80はオプションの機能として考えています。
オプションのために標準の動作が規制されるというのも、考えてみればおかしな話です。

ということで、写真では、T2とT3では、バスが開放されるため、アドレスバスとデータバスが全点灯していますが、ここはTK80の回路を使用しないときには、開放しないように設計を直すことにしました。

T3の写真です

PC(プログラムカウンタ)にクロック(右上の緑LED)が入っています。T3の終りのタイミングでPCがカウントアップされます。

T4の写真です

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

T5の写真です

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

T6の写真です

ローテイト用レジスタにクロックが入っているのですが、この写真ではわかりません。
ローテイトレジスタのクロックもLED表示するほうがいいですね。検討してみます。
T6の終りのタイミングで、ローテイト動作が行われます。

T7の写真です

ローテイト用レジスタの値が1ビット右にローテイトして、F0だったものが、78になりました。
まだC(キャリー)フラグは変化していません。

前回、ローテイト命令では、C(キャリー)フラグのセット、リセットはT4の終りに行う、と説明してしまいました。
自分で設計しておいて、時間がたつとすぐに忘れてしまいます。
ここは、そうではなくて、CFをセット、リセットする条件(つまりローテイト前のD7またはD0)をT4の終りにフリップフロップに保持しておいて、その保持した条件によって、T8のときにC(キャリー)フラグをセット、リセットします、でした。

T6の終りに、ローテイト動作が完了するまで、C(キャリー)フラグは変化させてはいけませんから、そのような回路にしておく必要がありました(そのように考えたことを、すっかり忘れていました)。
ですから、その前段のフリップフロップは不要だったのです(前回の説明を、そのように訂正いたしました09.2.25)。

T8の写真です

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

T9の写真です

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

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

T10は一瞬で終了し、次の命令(CMC、命令コード3F)のT0になります。
アドレスバスA15〜A0には、PC(プログラムカウンタ)の値0004が出力され、データバスD7〜D0には、3Fが表示されています。

T0〜T3のOPコードフェッチサイクルの動作は各命令とも同じですから、T2、T3の写真は省略して、T4の写真からお見せすることにします。
本日は時間がなくなってしまいました。この続きは次回にすることにいたします。
2009.2.24upload
2009.2.25些細な部分をあちこち少しずつ訂正しました
前へ
次へ
ホームページトップへ戻る