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

●DAA命令の回路の動作テストです

いつものように、プログラムを作って回路が正しく動作するかどうかテストをしてみます。
DAA命令はその前に行われたADD命令(またはADC命令)の結果によって、補正のために加算する数値が異なるなどの違いがでてきます。
そこで、それぞれの場合に適するような値のADD命令を行って、テストをしてみることにしました。

前回の説明で、DAA命令の補正の計算は、大きくわけると2通りになることがわかりました。
しかし、せっかく一所懸命に考えて1)〜5)に整理したのですから、それにしたがってテストをしてみたいと思います。

●まずは、先に実行するADDの値を決めましょう

前回説明した1)〜5)の補正のルールに合う計算例を選びました。

1)下位桁がA〜Fの場合は、下位桁に6を加算する
先に行うADD命令は、05+07です。
下の例のように、ADD命令の実行の結果は、0Cになります。
この値に対して、DAA命令を実行することで、05+07をBCD数として加算したと考えた場合の答えである12になれば、正しく補正できたことになります。

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

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

2)下位桁が0〜3で、かつHフラグが立っているときも、下位桁に6を加算する
先に行うADD命令は、19+38です。

  16進数     10進数
   19        19 
   38(+      38(+ 
   51        57
   ↑Hフラグセット

DAA補正(16進数)
   51
   06(
   57

3)上位桁がA〜Fの場合は、上位桁に6を加算する
先に行うADD命令は、65+82です。

  16進数     10進数
   65        65 
   82(+      82(+ 
   E7       147

DAA補正(16進数)
   E7
   60(
 1 47
 ↑Cフラグ

4)上位桁が0〜3で、かつCフラグが立っているときは、上位桁に6を加算後、Cフラグをセットする
先に行うADD命令は、96+72です。

  16進数     10進数
   96        96 
   72(+      72(+ 
 1 08       168
 ↑Cフラグ

DAA補正(16進数)
   08
   60(
 1 68
 ↑Cフラグ
 
5)上位桁が9で下位桁がA〜Fの場合には、66を加算する
先に行うADD命令は、87+15です。

  16進数     10進数
   87        87 
   15(+      15(+ 
   9C       102

DAA補正(16進数)
   9C
   66(
 1 02
 ↑Cフラグ

以上で5通りのテストデータが揃いましたが、もうすこし追加をしたいと思います。
補正の結果が00になった場合にZ(ゼロ)フラグがセットされるかどうかを確認するために、87+13の計算をします。

  16進数     10進数
   87        87 
   13(+      13(+ 
   9A       100

DAA補正(16進数)
   9A
   66(
 1 00
 ↑Cフラグ

もうひとつ、以上のテスト例は、結果の数値を符号付の数として見た場合に、正の数ばかりであることに気がつきました。そこで補正の結果が負数(80〜FF)になるものを考えます。S(サイン)フラグがセットされることを確認するためです。
上のZ(ゼロ)フラグはともかくとして、BCD数の計算に対してS(サイン)フラグに何の意味があるか、という気がしますけれど、まあ、ことのついでですから、あまり意味はないですけれど、一応テストしておくことにいたします。

  16進数     10進数
   97        97 
   85(+      85(+ 
 1 1C       182
 ↑Cフラグ

DAA補正(16進数)
   1C
   66(
 1 82
 ↑Cフラグ

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



短いプログラムですけれど、いかにもプログラムだなあ、という感じがしませんでしょうか?

というところで、本日は、時間がなくなってしまいましたので、プログラムの説明は、次回にすることにいたします。
2009.5.14upload

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