ゲームボーイZ80CPUにはハーフキャリーフラグがあり、いつ設定/クリアするかについて多くの情報を見つけることができないようです。
私がこれまでに理解していることは、8ビットの加算、減算、シフト、または回転操作(およびおそらく他の操作)が結果のビット4に設定し(?)、DAA命令がこれを何らかの方法で設定/使用することです。私がよくわからないのは、16ビット命令がそれにどのように影響するか、そして特定のレジスタの使用によって影響を受けるかどうかです。
これは、ビット3からビット4へのキャリーであり、通常のキャリーフラグレコードがビット7からキャリーするのと同じです。たとえば、追加でハーフキャリービットを取得するには、次のようにします。
((a&0xf) + (value&0xf))&0x10
ハーフキャリーを設定する必要がある場合は0x10、それ以外の場合は0になります。他の関連するオペレーションから半分のキャリーを取得することは当然続きます-問題は、低いニブルから高いニブルへのキャリーがあったかどうかです。
物事を概観するために、z80は4ビットALUを備えており、2つの4ビット演算を実行することによって8ビット演算を実行します。したがって、中間結果として、それは非常に自然に半分のキャリーを取得します。
DAAはフラグに関心があります。これは、ハーフキャリーが設定されている場合、合計で16を超える2桁がローニブルに追加されたためです。これにより、上部ニブルへのキャリーが正しく生成されますが、キャリーを生成するはずだった10と生成した16の間に6つの値があったため、低いニブル6は本来よりも低くなります。
16ビット演算の場合、レジスタの上位バイトのビット3からビット4へのキャリーによってフラグが設定されます。つまり、ビット11からビット12です。
(上記のビットには、最下位から最上位まで0〜15のラベルが付いていることに注意してください)
ここを参照してください:http ://www.z80.info/z80code.htm
16 bit arithmetic
If you want to add numbers that are more than the 0-255 that can
be stored in the A register, then the HL, IX or IY registers can
be used. Thus LD HL,1000H:LD BC,2000H:ADD HL,BC will give
A CZPSNH BC DE HL IX IY A' CZPSNH' BC' DE' HL' SP
00 000000 2000 0000 3000 0000 0000 00 000000 0000 0000 0000 0000
The flags are set as follows.
C or carry flag 1 if answer >65535 else 0
Z or zero flag not changed
P flag not changed
S or sign flag not changed
N flag 0
H or half carry flag 1 if carry from bit 11 to bit 12 else 0
ハーフキャリーフラグはゲームボーイエミュレーターメーカーにとって最も一般的な障害の1つであるため、このテーマに関する最近の質問へのリンクを自由に投稿します。
ゲームボーイ:ハーフキャリーフラグと16ビット命令(特にオペコード0xE8)
上記のスレッドの要約(@gekkioによる回答):
命令にもよりますが、8ビット値で考えるとフラグは常に同じビット位置に基づいて更新されます...16ビットの上位バイトと下位バイトのどちらについて話しているかによって異なります。価値。ビット11は上位バイトのビット3です。
ADD SP, e
:ビット3からのH、ビット7からのC(下位バイト操作からのフラグ)LD HL, SP+e
:ビット3からのH、ビット7からのC(下位バイト操作からのフラグ)ADD HL, rr
:ビット11からのH、ビット15からのC(上位バイト操作からのフラグ)INC rr
:フラグの更新なし(16ビットのinc / decユニットで実行)DEC rr
:フラグの更新なし(16ビットのinc / decユニットで実行)