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

●DAD命令のクロック毎の動作の写真です(前回の続きです)

前回は下記のテストプログラムをステップ動作で実行して、そのうちのDAD Bの動作について、T4〜T15までの写真を見ながら、動作の説明をしました。



ところが、最初に各レジスタに入れる数値を適当に選んだものですから、加算後の上位桁へのキャリーフラグの動作を確認することができませんでした。
仕方がありませんので、次のDAD SPについても、写真をお見せしながら、キャリーフラグの動作に注目した説明をすることにいたします。

●DAD SP命令の動作の写真です

最初はアドレス010DのDAD SP命令のT0の写真です。



上から4列目、左から、H、Lの各レジスタです。その右はスタックポインタのSPH、SPLです。
LXI命令の実行によって、スタックポインタSPHにはCDが、SPLにはEFがそれぞれ入れられています。
この前に実行されたDAD B命令の結果、Hレジスタには8Aが、LレジスタにはCEが入っています。

今回は、

  8ACE
  CDEF(
1 58BD

の計算をすることになります。
今回は下位8ビットの加算で、上位桁へのキャリーが発生しますから、その様子を見ることができます。

DAD SP命令のT4の写真です。



Lレジスタの値(CE)が内部データバスに読み出され、ALUのレジスタ”A”に書き込まれています。
Lレジスタの左にある、LregRD(黄LED)が点灯しています。
ALUのレジスタ”A”の左にある、ALUreg”A”WR(緑LED)が点灯しています。

DAD SP命令のT5の写真です。



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

DAD SP命令のT6の写真です。



SPLレジスタの値、EFが内部データバスに読み出され、ALUのレジスタ”B”に書き込まれています。
SPLレジスタの左にある、SPLregRD(黄LED)が点灯しています。内部データバスに読み出されたEFは、ALUレジスタ”B”に書き込まれていて、ALUレジスタ”B”もEFになりました。
ALUレジスタ”B”の左側にあるALUreg”B”WR(緑LED)が点灯しています。

ALUレジスタ”A”とALUレジスタ”B”の値は即座に加算されて、ADDレジスタに表示されます。
CE+EF=1BDの計算が行われて、ADDレジスタの表示がBDになりました。

今回は、加算の結果、上位桁への桁上げが発生しますから、上位桁への桁上げを示す左側のLEDが点灯しました。
しかし、まだこの段階では、キャリーフラグへの反映は行われません。

DAD SP命令のT7の写真です。



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

DAD SP命令のT8の写真です。



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

フラグレジスタは、一番上の列の中央に5個並んだLEDです。
真中のH(ハーフキャリー)フラグと、右端のC(キャリー)フラグが点灯しました。

DAD SP命令のT9の写真です。



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

DAD SP命令のT10の写真です。



Hレジスタの値(8A)が内部データバスに読み出され、ALUのレジスタ”A”に書き込まれています。
Hレジスタの左にある、HregRD(黄LED)が点灯しています。
ALUのレジスタ”A”の左にある、ALUreg”A”WR(緑LED)が点灯しています。

DAD SP命令のT11の写真です。



ALUreg”A”WR(緑LED)が消灯しました。
さきの下位レジスタ加算で、桁上げが発生して、C(キャリー)フラグがセットされました。
ここでは、そのキャリーの状態が加算されます。
Addレジスタの右側のLEDが点灯しました。
C(キャリー)フラグの状態が反映されて、下位4ビットの加算を行う、74HC283のC0入力が1になっていることを示しています。

キャリーフラグをC0に反映するための回路は、ALU加算回路にあります。
[第191回]のALU加算回路を見てみましょう。
加算器74HC283の左下に、DADがインバータ(74HC04)と負論理OR(74HC08)を通して、データセレクタ74HC157のpin1に入力されています。
そのため74HC157の4Aに入力されたCF(キャリーフラグ)が4Yから出力されます。
DAD命令の命令コードのOP3は1ですから、4Yから出力された信号が、Dフリップフロップ74HC74のD入力になります。
ここまでの動作はタイミングクロックのT信号とは無関係に行われますから、DAD命令がデコードされた直後に74HC74のD入力に伝えられます。
そのD入力はALUのreg”A”WR信号の終り(立ち上がりエッジ)でQ出力に伝えられます。
ALUreg”A”WRの終りのタイミングで、ADDレジスタの右側のLEDが点灯したのは、以上の動作が行われた結果です。

ところで、ALUreg”A”WRは、下位レジスタの加算でもアクティブになります。
T4のときです。
するとT5でも、C0加算を示す右側LEDが点灯するはずです。
たまたま今回のDAD SPの計算では、下位レジスタの加算前には、C(キャリー)フラグはセットされていませんでしたから、Addレジスタの右側のLEDが消灯していてもおかしくはありません。

これについては、前回、[第215回]のDAD BのT4の写真と、その説明を見ていただくと、よくわかります。
DAD Bの下位レジスタの加算では、それ以前にC(キャリー)フラグがセットされていて、さらにADDレジスタの右側のLEDも点灯していたことがわかります。
それがT4のときに消灯しています。
前回のDAD BのT4の説明にも書いてありますが、さきほど説明しましたように、74HC283のC0入力へのC(キャリー)フラグの伝達は、さきほどの説明の通りならば、下位レジスタの加算でも行われてしまいます。
その伝達(74HC74のD入力がQから出力される)タイミングはALUreg”A”WRの終りです(T4またはT10の終り)。
そこで、T4の終りのときだけ、Q出力をクリアするために、M2の期間中、74HC74のCLRをアクティブにしているのです([第214回]のDAD回路図および[第191回]の加算回路参照)。

DAD SP命令のT12の写真です。



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

ALUレジスタ”A”とALUレジスタ”B”の値は即座に加算されて、ADDレジスタに表示されます。
8A+CD+1=158の計算が行われて、ADDレジスタの表示が58になりました(計算式の最後の+1は下位桁からの桁上げの加算です)。

加算の結果、上位桁への桁上げが発生しますから、上位桁への桁上げを示す左側のLEDが点灯しています。

DAD SP命令のT13の写真です。



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

DAD SP命令のT14の写真です。



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

フラグレジスタは、H(ハーフキャリー)フラグと、C(キャリー)フラグがセット、リセットされます。
うーん。
今回はどちらもセットされるのですが、下位桁の計算の結果、すでにセットされてしまっているので、そのところの動作を確認することができませんね。なかなかうまくいきません。

この次のDAD Dの計算では、下位桁の加算では桁上げが行われて、上位桁の加算ではキャリーは発生しませんから、やっと、そこのところの動作が確認できそうです。

DAD SP命令のT15の写真です。



HregWRが消灯しました。

  8ACE
  CDEF(
1 58BD

の計算が行われて、結果がHLレジスタに格納されました。
Hレジスタが58、LレジスタがBDになっています。

●DAD D命令のT0の写真です



今度は、HL+DEの計算です。
さきほどのDAD SPの結果、HLは58BDになっています。
DEには、最初のLXI D命令の実行によって、4567が入れられています。

  58BD
  4567(
  9E24

という計算になります。下位レジスタのBD+67の計算では上位桁へのキャリーが発生しますから、下位桁の加算を終了した時点で、C(キャリー)フラグがセットされます。
しかし上位レジスタの58+45+1の計算では、キャリーは発生しませんから、DAD D命令の実行が終了した時点では、C(キャリー)フラグはクリアされます。

途中の動作の写真は、DAD B命令と、DAD SP命令で見てきましたから、今回は、DAD D命令の実行が終了したときの写真のみを見てみることにします。
DAD DのT16、つまりその次のDAD HのT0の写真です。

●DAD H命令のT0の写真です



C(キャリー)フラグがクリアされています。
H(ハーフキャリー)フラグもクリアされています。
DAD D命令が実行された結果、Hレジスタには9E、Lレジスタには24が入れられました。

せっかくここまでやってきましたから、最後の、DAD Hの計算結果も見てみることにしましょう。

さきほどのDAD D命令の実行の結果、HLは9E24になりました。
次のDAD Hは、HL+HLを計算します。

  9E24
  9E24(
1 3C48

という計算です。

DAD H命令のT16(次の命令、HLTのT0)の写真です。



DAD H命令が実行された結果、Hレジスタは3C、Lレジスタは48になりました。

C(キャリー)フラグがセットされました。
H(ハーフキャリー)フラグもセットされています。

ずっと、C(キャリー)フラグと、H(ハーフキャリー)フラグが同じように、セット、リセットされていますが、これはたまたまそうなっているだけです。
数値の選択は本当に難しいですねぇ。
たとえば、今回の上位桁の加算、9E+9Eでは、その下位4ビットの加算E+Eでも、ビット3からビット4へのキャリーが発生するため、H(ハーフキャリー)フラグもセットされたのです。
これがたとえば、94+94ならば、H(ハーフキャリー)フラグはセットされません。
2009.4.30upload

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