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

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

すでに説明しましたように、DAD命令は、対象になるレジスタによって、つぎの4つの命令があります。

DAD B
DAD D
DAD H
DAD SP

計算のもとになるレジスタは異なりますが、計算はALUの加算回路を使って行われますから、どの命令でも動作は同じです。
同じ動作の写真を繰り返しお見せしても仕方がありませんから、DAD Bの動作について、T4〜T15までの写真をお見せすることにして、その他の命令については、計算結果の写真のみ、お見せすることにいたします。

●DAD命令のテストプログラムです



計算を始める前に、LXI命令を使って、BCレジスタに0123を、DEレジスタに4567を、HLレジスタに89ABを、そしてSP(スタックポインタ)にCDEFを入れます。
そのあと、DAD B命令から順に実行していきます。

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

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



上から3列目、左からD、E、B、C、Aの各レジスタです。
その下、左から、H、Lの各レジスタです。その右はスタックポインタのSPH、SPLです。
LXI命令の実行によって、Dレジスタには45が、Eレジスタには67が、Bレジスタには01が、Cレジスタには23が、Hレジスタには89が、LレジスタにはABが、そしてスタックポインタSPHにはCDが、SPLにはEFがそれぞれ入れられています。

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



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

ADDレジスタ表示LEDの右下にある、下位桁からの桁上げを示すLEDが消灯しました。
下位レジスタの加算では、キャリーの加算は行いません(ADCではなくてADDの計算を行います)。
ADDレジスタの下位4ビットの加算を行う74HC283のC0への出力をラッチするDフリップフロップ(74HC74)のCLR端子を、M2(T4、T5)の期間Lにして、C0入力をLにしています(前回、[第214回]のDAD回路図および[第191回]の加算回路参照)。
DADについての、この部分の動作は、上位8ビットの加算のところで、詳しく説明します。

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



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

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



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

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

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

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



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

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



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

フラグレジスタは、一番上の列の中央に5個並んだLEDです。
真中のH(ハーフキャリー)フラグと、右端のC(キャリー)フラグが消灯しました。
前回コメントしましたように、DAD命令は本当はC(キャリー)フラグしか、セット、リセットしないのですが、この「つくるCPU」回路では、ALUのADD回路をそのまま利用したために、H(ハーフキャリー)フラグも変化してしまいます。

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



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

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



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

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



ALUreg”A”WR(緑LED)が消灯しました。
本当はここで、下位レジスタ加算からの桁上げがある場合には、キャリーの加算が行われるのですが、今回は下位からの桁上げが発生しなかったために、その部分の動作を確認することができません(写真を見ていて、そのことに気がつきました)。
はじめのところで、DADの動作はみんな同じなので、DAD Bの写真だけお見せします、と書きましたが、どうやらそうはいかないようです。
下位桁からの桁上げを加算する様子については、次回、別のDAD命令の写真で説明することにします。

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



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

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

今回は、加算の結果、上位桁への桁上げは発生しませんから、上位桁への桁上げを示す左側のLEDは消灯しています。

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



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

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



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

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

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



HregWRが消灯しました。

  0123
  89AB(
  8ACE

の計算が行われて、結果がHLレジスタに格納されました。
2009.4.28upload

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