質問

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

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

役に立ちましたか?

解決

ビット3からビット4へのキャリーです。通常のキャリーフラグレコードがビット7から運ぶのと同じように、たとえば、ハーフキャリービットを追加してください。

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

それ以外の場合は、ハーフキャリーを設定する必要がある場合は0x10が得られます。他の関連するOPSからハーフキャリーを取得することは自然に続きます - 質問は、低いニブルから高値までの持ち込みがあったかどうかです。

物事を視野に入れるために、Z80には4ビットALUがあり、2つの4ビットOPSを実行して8ビットOPSを実行します。したがって、中間の結果として、非常に自然に半分運ぶことができます。

DAAはフラグに興味があります。なぜなら、キャリーが半分のキャリーが設定されている場合、16を超える2桁が低いニブルに追加されたからです。それは上部ニブルにキャリーを正しく生成しましたが、10の間にさらに6つの値があり、キャリーを生成するはずの10の間、そして16がそれが行われたときに、低いニブル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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top