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

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

前々回はADD命令、前回はADC命令の動作テストを行いました。
今回はテストプログラムの後半部分、SUB命令とSBB命令のクロック毎の動作を、写真を撮って確認します。

加算と同じように、2バイトの減算を行います。

  3489
  12CD(
  21BC

減算部分のプログラムです。



プログラムは、前回の続きを、そのままステップ毎に動作させていったのですが、今回も、前回と同じように、0111のSUB E命令と0114のSBB D命令をクロック毎にステップ動作させた写真を撮りました。

SUB E命令のT4の写真です。



このSUB命令の前に実行された、XCHG命令とLXI D命令によって、HLレジスタには、DEレジスタにあった3489が入り、DEレジスタには新たに12CDが入れられました。
そしてその次のMOV A,L命令によってAレジスタにはLレジスタの値、89が入れられています。

まず下位8ビットの減算、89−CDです。

T4のタイミングで、そのAレジスタの値が内部データバスに読み出され、ALUのレジスタ”A”に書き込まれています。
Aレジスタの左にある、AregRD(黄LED)が点灯しています。
ALUのレジスタ”A”の左にある、ALUreg”A”WR(緑LED)が点灯しています。

ALUレジスタ”B”には、まだ先に実行したADC命令のときの値、34がそのまま残っていますが、加算器からの結果を表示する、ADDレジスタLEDには、レジスタ”A”とレジスタ”B”の加算結果がただちに表示されます。

今回はSUB命令ですが、まだステップが進んでいないので、そのまま加算された結果が表示されます。
89+34+1=BEです。式の最後の+1はキャリーの加算です。
まだ、先の計算のときのキャリーがそのまま残っていますから、それが加算されています(ADDレジスタの表示の右にあるLEDが点灯しています)。

SUB E命令のT5の写真です。



ALUreg”A”WR(緑LED)が消灯しました。

こうやって、あらためて写真を見ると、動作テストとしては、行き届かなかった点に気がつきます。
ADDレジスタ表示の右にある、加算前のキャリーを示すLEDは点灯したままです。
しかし、じつはこのときの点灯は、その前からの表示の結果がそのまま続いているのではなくて、SUB命令なので、ここで点灯したのです。
でも、上の写真と、この写真からでは、そのことはわかりません。ですから、不行き届きです。

でもまあ、そういう写真になってしまったものですから、仕方がありません。
前回と同様、74HC283周りの回路図([第191回]加算回路)を見ながら説明をすることにいたします。

今はSUB E命令(OPコードは10010011)の実行中です。
SUB命令はOP3=0、OP4=1です。このとき、74HC74のD入力は1になります。

SUB命令はつねに1を加算しますから、下位4ビットの加算器の74HC283のC0には、1が入れられるのです。

74HC74のD入力はCKが↑のときに出力に伝わります。
CKにはALUreg”A”WRが入っています(「regAWR」になっていますが、記載ミスです)。

ALUreg”A”WRは、前回にも説明しましたように、T4のときにアクティブになります。
T4のときに、↓_↑という信号が、74HC74のCK端子に入力されますから、T4の終りに、D入力の1がそのまま、Qから出力されます。

下位4ビットの加算をする74HC283のC0入力に、この時点(T4の終り、つまりT5になったとき)で、74HC74のD入力の1がそのまま伝えられたために、上記LEDが点灯しているのです。

SUB E命令のT6の写真です。



Eレジスタの値、CDが内部データバスに読み出されました。
Eレジスタの左にある、EregRD(黄LED)が点灯しています。
内部データバスもCDになっています。
ALUレジスタ”B”の左側にあるALUreg”B”WR(緑LED)が点灯しています。

しかし、そのときALUのレジスタ”B”には、内部データバスのCDではなくて、32という値が書き込まれています。
32はCDを反転させた値です。
CDは11001101で、32は00110010です。1と0が全部反転しています。減算のときに使う「1の補数」です。

[2009.4.13追記ここから]
ALUレジスタ”B”LEDの右上にある黄LEDが点灯しています。
INVselです。ALUレジスタ”B”に、内部データバスの値を反転(invert)させた値が選択されます([第179回]ALUレジスタ”A”およびレジスタ”B”回路図)。
[2009.4.13追記ここまで]

ALUレジスタ”A”とALUレジスタ”B”の値は即座に加算されて、ADDレジスタに表示されます。
89+32+1=BCの計算が行われて、ADDレジスタの表示がBCになりました(左の計算の最後の+1は上で説明した、SUBのときに、常に加えられる1です)。

今回は、加算の結果、上位桁への桁上げは発生しませんから、上位桁への桁上げを示す左側のLEDは消灯しています。
減算のときは、この桁上げの有無を逆転させた値が、上位桁へのキャリー(ボロー)になります。
ですから、今回の計算の結果、キャリーフラグがセットされることになります。
しかし、まだこの段階では、キャリーフラグへの反映は行われません。

SUB E命令のT7の写真です。



ALUreg”B”WR(緑LED)が消灯しました。

SUB E命令のT8の写真です。



ADDレジスタのLED表示の左側にある、AddRD(黄LED)が点灯して、加算の結果(BC)が内部データバスに出されています。
Aレジスタの右側にあるAregWR(緑LED)が点灯して、Aレジスタに内部データバスの値、BCが書き込まれています。

フラグレジスタは、左端のS(サイン)フラグが点灯し、その右のZ(ゼロ)フラグは消灯、その右のH(ハーフキャリー)フラグと、右端のC(キャリー)フラグが点灯しました。

SUB E命令のT9の写真です。



AregWR(緑LED)が消灯しました。

次回はSBB命令の動作の写真をお見せすることにいたします。
2009.4.12upload
2009.4.13追記

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