標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第203回]
●SBB命令のクロック毎の動作の写真です
今回は前回のSUB命令のテストの続きです。
前回は2バイトの減算(下記)のうちの下位バイトの減算が済んだところまでの写真をお見せしました。
3489
12CD(−
21BC
2バイトの減算部分のプログラムです。
前回は、プログラムの先頭から実行してきたのですが、クロック毎のステップ動作の写真は、0111のSUB E命令の写真だけをお見せしました。
今回は、その続きですが、前回と同じように、今度は0114のSBB D命令をクロック毎にステップ動作させた写真だけをお見せすることにします。
アドレス0114のSBB D命令のT4の写真です。
このSBB命令の前に実行された、MOV A,H命令によってAレジスタにはHレジスタの値、34が入れられています。
T4のタイミングで、そのAレジスタの値が内部データバスに読み出され、ALUのレジスタ”A”に書き込まれています。
Aレジスタの左にある、AregRD(黄LED)が点灯しています。
ALUのレジスタ”A”の左にある、ALUreg”A”WR(緑LED)が点灯しています。
今回は上位8ビットの減算、34−12の計算を実行します。
ALUレジスタ”B”には、まだ先に実行したSUB命令のときの値、32がそのまま残っていますが、加算器からの結果を表示する、ADDレジスタLEDには、レジスタ”A”とレジスタ”B”の加算結果がただちに表示されます。もちろん過渡的な表示で、意味のない計算結果の表示です。
減算ですけれど、計算としてはつねに加算が行われます。
34+32+1=67です。式の最後の+1はキャリーの加算です。
まだ、先の計算のときのキャリーがそのまま残っていますから、それが加算されています(ADDレジスタの表示の右にあるLEDが点灯しています)。
SBB D命令のT5の写真です。
ALUreg”A”WR(緑LED)が消灯しました。
ADDレジスタの右にある、下位4ビットの74HC283のC0に加える、桁上げのキャリー(減算のときはボロー)を示すLEDが消灯しました。
先に実行した下位バイトに対するSUB Eの計算(89−CD)の結果、上位桁へのボローが発生しました(キャリーフラグが点灯しています)。
今回のSBB D命令は、そのボローを含めて減算を行います。
前回と同様、74HC283周りの回路図([第191回]加算回路)を見ながら説明をすることにします。
今はSBB D命令(OPコードは10011010)の実行中です。
SBB命令はOP3=1、OP4=1です。このとき、74HC74のD入力はCF(キャリーフラグ)を反転した値になります。
74HC74のD入力はCKが↑のときに出力に伝わります。
CKにはALUreg”A”WRが入っています(「regAWR」になっていますが、記載ミスです)。
ALUreg”A”WRは、前回にも説明しましたように、T4のときにアクティブになります。
T4のときに、↓_↑という信号が、74HC74のCK端子に入力されますから、T4の終りに、Dに入力されているCF(キャリーフラグ)の反転した値がQから出力されます。
下位4ビットの加算をする74HC283のC0入力に、この時点(T4の終り、つまりT5になったとき)で、CF(キャリーフラグ)の反転した値が伝えられたために、上記LEDが消灯したのです。
SBB D命令のT6の写真です。
Dレジスタの値、12が内部データバスに読み出されました。
Dレジスタの左にある、DregRD(黄LED)が点灯しています。
内部データバスも12になっています。
ALUレジスタ”B”の左側にあるALUreg”B”WR(緑LED)が点灯しています。
しかし、そのときALUのレジスタ”B”には、内部データバスの12ではなくて、EDという値が書き込まれています。
EDは12を反転させた値です。
12は00010010で、EDは11101101です。1と0が全部反転しています。減算のときに使う「1の補数」です。
ALUレジスタ”B”LEDの右上にある黄LEDが点灯しています。
INVselです。ALUレジスタ”B”に、内部データバスの値を反転(invert)させた値が選択されます([第179回]ALUレジスタ”A”およびレジスタ”B”回路図)。
ALUレジスタ”A”とALUレジスタ”B”の値は即座に加算されて、ADDレジスタに表示されます。
34+ED=121の計算が行われて、ADDレジスタの表示が21になりました。
加算の結果、上位桁への桁上げが発生しますから、上位桁への桁上げを示す左側のLEDが点灯しています。
減算のときは、この桁上げの有無を逆転させた値が、上位桁へのキャリー(ボロー)になります。
ですから、今回の計算の結果、キャリーフラグはクリアされることになります。
しかし、まだこの段階では、キャリーフラグへの反映は行われません。
SBB D命令のT7の写真です。
ALUreg”B”WR(緑LED)が消灯しました。
SBB D命令のT8の写真です。
ADDレジスタのLED表示の左側にある、AddRD(黄LED)が点灯して、加算の結果(21)が内部データバスに出されています。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、21が書き込まれています。
フラグレジスタは、左端のS(サイン)フラグ、その右のZ(ゼロ)フラグ、その右のH(ハーフキャリー)フラグと、右端のC(キャリー)フラグが消灯しました。
SBB D命令のT9の写真です。
AregWR(緑LED)が消灯しました。
2009.4.14upload
前へ
次へ
ホームページトップへ戻る