# レジスタとフラグ ## レジスタ 16-bit |Hi |Lo | 名前/内容 -------|---|---|-------------- AF | A | - | アキュームレータ & フラグ BC | B | C | 汎用 DE | D | E | 汎用 HL | H | L | 汎用 + メモリアクセス SP | - | - | スタックポインタ PC | - | - | プログラムカウンタ ほとんどのレジスタは、1つの16bitレジスタとして、または2つの別々の8bitレジスタとして利用することができます。 ## フラグ (AFレジスタの下位8bit) ビット | 名前 | 内容 ----|------|------- 7 | Z | ゼロフラグ 6 | N | 減算フラグ (BCD) 5 | H | ハーフキャリーフラグ (BCD) 4 | C | キャリーフラグ 直近の命令がフラグに影響を与える命令である場合、その結果に関する情報が含まれています。 ### ゼロフラグ (Z) このフラグは、演算の結果がゼロである場合にのみセットされます。条件付きジャンプで使用します。 ## キャリーフラグ (C もしくは Cy) - 8bitの加算の結果が$FFよりも大きい場合。 - 16bitの加算の結果が$FFFFよりも大きい場合。 - 減算/比較の結果が0未満(マイナス)になる場合(挙動としては65XXやARMよりもZ80や8086に近いです) - 回転/シフト操作でビット`1`をシフトアウトするとき。 条件付きジャンプや、特定の命令(ADC, SBC, RL, RLAなど)で利用されます。 ## BCDフラグ (N, H) これらのフラグはDAA命令でのみ使用されます。 Nは前の命令が減算であったかどうかを示し、Hは結果の下位4ビットのキャリーを示します。 DAAはCフラグも使用しますが、これは上位4ビットのキャリーを示す必要があります。 2つのBCD数値を加算/減算した後、DAAを使用して結果をBCD形式に変換します。 BCDは、\$00〜\$FFではなく、\$00〜\$99の範囲の数字です。 BCD桁の繰り上がりを示すフラグはCとHの2つしかないため、4桁の16ビット演算ではDAAは有効ではなく、Cフラグに影響を与えないINC/DEC演算での使用にも限界があります。 **ハーフキャリー(H)に関して** 変数`a`と`b`を足す命令のハーフキャリーは次のように計算できます。([出典](https://discord.com/channels/465585922579103744/465586075830845475/783312657951883284)) ```c++ half_carry = (a & 0xF) + (b & 0xF) > 0xF; ```