39

ゲームボーイZ80CPUにはハーフキャリーフラグがあり、いつ設定/クリアするかについて多くの情報を見つけることができないようです。

私がこれまでに理解していることは、8ビットの加算、減算、シフト、または回転操作(およびおそらく他の操作)が結果のビット4に設定し(?)、DAA命令がこれを何らかの方法で設定/使用することです。私がよくわからないのは、16ビット命令がそれにどのように影響するか、そして特定のレジスタの使用によって影響を受けるかどうかです。

4

3 に答える 3

33

これは、ビット3からビット4へのキャリーであり、通常のキャリーフラグレコードがビット7からキャリーするのと同じです。たとえば、追加でハーフキャリービットを取得するには、次のようにします。

((a&0xf) + (value&0xf))&0x10

ハーフキャリーを設定する必要がある場合は0x10、それ以外の場合は0になります。他の関連するオペレーションから半分のキャリーを取得することは当然続きます-問題は、低いニブルから高いニブルへのキャリーがあったかどうかです。

物事を概観するために、z80は4ビットALUを備えており、2つの4ビット演算を実行することによって8ビット演算を実行します。したがって、中間結果として、それは非常に自然に半分のキャリーを取得します。

DAAはフラグに関心があります。これは、ハーフキャリーが設定されている場合、合計で16を超える2桁がローニブルに追加されたためです。これにより、上部ニブルへのキャリーが正しく生成されますが、キャリーを生成するはずだった10と生成した16の間に6つの値があったため、低いニブル6は本来よりも低くなります。

于 2012-01-16T00:23:15.047 に答える
10

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
于 2012-01-16T08:11:42.027 に答える
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ユニットで実行)
于 2020-01-19T08:48:45.097 に答える