標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第228回]
●DAA命令の実行結果の確認です
前回はDAA命令のテストプログラムを実行して、クロック毎の写真をお見せしました。
テストプログラムはADDとDAAの計算結果を順次スタックに格納するように考えました。
今回は前回実行したプログラムの実行結果を確認していくことにします。
ADD命令での加算と、それに続くDAA命令によって補正された結果のAレジスタとフラグレジスタはスタックアドレスの7FFF〜7FF2に格納されました。
それを、トグルスイッチをパチパチやりながら、順に見ていくことにします。
アドレス7FFFの写真です。
左下のディップスイッチとトグルスイッチでアドレスを指定します。
右側の8個のトグルスイッチはデータ入力用です。
今回はメモリに値を書き込むのではなくて、値を見ていくだけですから、スイッチは全部OFF(11111111)にしておきます。
スイッチの上に並んでいるLEDが、左から外部アドレスバスA15〜A8、A7〜A0、その右が外部データバスD7〜D0です。
メモリアドレス7FFFの中身、12(00010010)が表示されています。
最初に行った下記の計算結果(Aレジスタの値)です。
16進数 10進数(BCD)
05 05
07(+ 07(+
0C 12
DAA補正(16進数)
0C
06(+
12
アドレス7FFEの写真です。
今回実行したテストプログラムは、計算の結果をPUSH PSW命令でスタックに保存しました。
PUSH PSWは、最初にAレジスタをスタックに保存し、その次のスタックアドレス(−1したアドレス)にフラグレジスタを保存します。
ですからアドレス7FFEにはフラグレジスタの値が入っています。
●フラグレジスタ
今までフラグは何回も出てきました。
8080には、S(サイン)フラグ、Z(ゼロ)フラグ、H(ハーフキャリー)フラグ、P(パリティ)フラグ、C(キャリー)フラグの5個のフラグがあります。
「つくるCPU」の基板では、一番上の列のLEDです(今回の写真では、LEDは範囲外で写っていません)。
フラグも他のレジスタと同じように、8ビットのレジスタとしてアクセスされます。
今まで、フラグレジスタとしての説明をどこかでしてきたかなぁ、と思ってホームページのトップの見出しをざっと読んでみたのですが、わかりません。
ひょっとすると、どこかで説明済みかもしれませんが、あらためて、ここで書いておきます。
8080では、上に書いたように、フラグは5個しかありません。
ですから8ビットのレジスタのうち、3ビットは未使用です。
フラグレジスタkの構造です。
下のように、ビット7がS(サイン)フラグ、ビット6がZ(ゼロ)フラグ、ビット4がH(ハーフキャリー)フラグ、ビット2がP(パリティ)フラグ、ビット0がC(キャリー)フラグを示しています。各ビットの1がそのフラグのON、0がそのフラグのOFFを示しています。
S | Z | H | P | C |
さて、そこで、上の写真です。
保存されたフラグレジスタの値は00010100です。
H(ハーフキャリー)フラグとP(パリティ)フラグがONになっています。
パリティフラグは数値演算では変化しませんから、今回は無関係です(実際には、8080では、数値演算でもパリティフラグは変化しますが、「つくるCPU」では変化させないことにしました。[第19回]参照)。
DAA補正のための+06加算によって、ビット3からの桁上がりが発生するために、HフラグもONになっていますが、DAA補正後のHフラグには、さしたる意味はありません。
それはともかくとして、DAA補正の結果も、フラグの状態も、正しいことが確認されました。
この調子で、次の結果も見ていくことにします。
アドレス7FFDの写真です。
下記の計算結果です。
16進数 10進数
19 19
38(+ 38(+
51 57
↑Hフラグセット
DAA補正(16進数)
51
06(+
57
アドレス7FFCの写真です。
フラグレジスタです。Pフラグ以外はOFFになっています。
アドレス7FFBの写真です。
下記の計算結果です。
16進数 10進数
65 65
82(+ 82(+
E7 147
DAA補正(16進数)
E7
60(+
1 47
↑Cフラグ
アドレス7FFAの写真です。
右端のビット0、C(キャリー)フラグがONになっています。
アドレス7FF9の写真です。
下記の計算結果です。
16進数 10進数
96 96
72(+ 72(+
1 08 168
↑Cフラグ
DAA補正(16進数)
08
60(+
1 68
↑Cフラグ
アドレス7FF8の写真です。
今回も、右端のビット0、C(キャリー)フラグがONになっています。
アドレス7FF7の写真です。
下記の計算結果です。
16進数 10進数
87 87
15(+ 15(+
9C 102
DAA補正(16進数)
9C
66(+
1 02
↑Cフラグ
アドレス7FF6の写真です。
ビット4のHフラグと、ビット0のCフラグがONになっています。
アドレス7FF5の写真です。
下記の計算結果です。
16進数 10進数
87 87
13(+ 13(+
9A 100
DAA補正(16進数)
9A
66(+
1 00
↑Cフラグ
アドレス7FF4の写真です。
今回は結果が0なので、ビット6のZ(ゼロ)フラグがONになっています。
ビット4のHフラグと、ビット0のCフラグもONになっています。
アドレス7FF3の写真です。
下記の計算結果です。
16進数 10進数
97 97
85(+ 85(+
1 1C 182
↑Cフラグ
DAA補正(16進数)
1C
66(+
1 82
↑Cフラグ
アドレス7FF2の写真です。
計算結果の82を符号付2進数として見たときは、負数になるので、ビット7のS(サイン)フラグがONになっています。
ビット4のHフラグと、ビット0のCフラグもONになっています。
2009.5.20upload
前へ
次へ
ホームページトップへ戻る