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

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

ここ数日、ちょっとこみいったプログラムの作業で泥沼状態になっていますので、ホームページの更新がなかなか進みません。
あ。「つくるCPU」のプログラムではありません。
別のお仕事の作業です。
そんなわけで、3日ぶりの更新です(土曜も日曜もありません。因果な稼業です)。

プログラムリストは前回にもお見せしていますが、間があいてしまいましたので、もう一度お見せします。



DAA命令は、その前に実行された2進数の加算命令の結果を、BCD(2進化十進数)の加算結果に補正する命令です。
したがってDAAだけを単独で使っても何の意味もありません。
ADDなどの加算命令とペアで使ってこそ、はじめて意味があります。

そこで今回の動作テストも、いくつかの加算と組み合わせて動作を確認するようにしました。
複数の計算を続けて行いますから、DAA命令の実行の結果は、スタックに保存しておいて、実行終了後に、スタック(メモリ)を確認することにしました。

今回お見せする写真は、DAA命令をクロック毎にステップ動作させた写真です。
プログラムの実行の結果を格納したスタックの値も1バイトずつトグルスイッチをパチパチさせながら写真に撮りましたが、今回はちょっと時間が足りませんから、そちらの写真まで、お見せすることができません。それについては、また次回で、ということにいたします。

●MOV C,MのT0の写真です



アドレス0108 MOV C,MのT0です。
計算を始める準備ができて、いよいよこれからADDとDAAを繰り返し実行します。
写真の上から2列目、各LEDは、左からDレジスタ、Eレジスタ(この2つは今回は使いません)、B、C、Aレジスタです。
Bレジスタには07が入れられました。計算の繰り返し回数です。
3列目は、左からH、Lの各レジスタです。その右はスタックポインタ、SPH、SPLです。
HLには計算データの置かれているアドレス0114が入れられています。
スタックポインタは8000にセットされました。

●ADD C命令のT0の写真です



途中の写真は省略します。
アドレス010C ADD CのT0の写真です。
Cレジスタには05、Aレジスタには07がセットされています。

●DAA命令のステップ動作の写真です

ここからが今回の目的、DAA命令の動作の写真です。

アドレス010D DAAのT0の写真です。



その前のADD C命令の実行の結果が表示されています。
ここは、[第225回]で説明した、最初の加算例です。

  16進数     10進数(BCD)
   05        05 
   07(+      07(+ 
   0C        12

DAA補正(16進数)
   0C
   06(
   12

という補正結果が得られるはずです。
Aレジスタには、ADDの結果0Cが入れられています。

DAA命令のT4の写真です



DAA命令の動作については[第224回]を、またタイミングチャートについては[第223回]を参照していただくと、より理解しやすいかと思います。

T4のタイミングで、Aレジスタの値(0C)が内部データバスに読み出され、ALUのレジスタ”A”に書き込まれています。
写真上から2列目、左端がALUレジスタ”A”、その右がレジスタ”B”です。
Aレジスタの左にある、AregRD(黄LED)が点灯しています。
ALUのレジスタ”A”の左にある、ALUreg”A”WR(緑LED)が点灯しています。

DAA命令のT5の写真です。



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

DAA命令のT6の写真です。



補正に必要な加算値06が内部データバスに読み出され、ALUのレジスタ”B”に書き込まれています。
ALUレジスタ”B”の左側にあるALUreg”B”WR(緑LED)が点灯しています。

ALUレジスタ”A”とALUレジスタ”B”の値は即座に加算されて、ADDレジスタに表示されます。
ADDレジスタは上から2列目の右端です。
0C+06=12の計算が行われて、ADDレジスタの表示が12になりました。

DAA命令のT7の写真です。



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

DAA命令のT8の写真です。



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

フラグレジスタは、一番上の列の真中の5個のLEDです。
左端のS(サイン)フラグと、その右のZ(ゼロ)フラグは消灯、その右のH(ハーフキャリー)フラグは点灯しています。右端のC(キャリー)フラグは消灯しています。

DAA命令のT9の写真です。



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

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



DAA命令が終了しました。

●HLT命令の写真です



ADDとDAAが繰り返し実行され、最後のHLT命令で停止しています。
外部アドレスバスA15〜A0はHLT命令の書かれている0113を表示しています。
写真下の行の左から、外部アドレスバスのA15〜A8、A7〜A0、その右が外部データバスです。HLT命令のOPコード76が表示されています。
その右、少し下に下がって、内部データバスで、ここも76になっています。
その右上にあるのがOPコードレジスタです。
HLレジスタ(下から3列目左端がH、その右がLレジスタ)は、データテーブルの最後の次のアドレス0122になっています。
スタックポインタは7FF2になっています。
繰り返し回数のカウンタに使ったBレジスタは00になっています。
2009.5.18upload

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