私は C でゲームボーイ エミュレーターに取り組んでおり、現在は CPU コアに取り組んでいます。それにもかかわらず、特に次のような操作で、キャリーフラグとハーフキャリーフラグがいつ設定されるかを理解しているかどうかはわかりません。
LD HL, SP+n
( http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html )
このオペコードの私の実装は次のとおりです。
DELETED
それは正しい実装ですか、それともフラグを誤解しましたか?
編集:私の実装は間違っていました。この質問は別の質問と重複しています。これが正しい実装です (私は願っています)。
case 0xF8:
{
int8_t n = (int8_t)readmem(PC+1); /* Load n and use it as signed integer */
/* HL and SP are declared as uint16_t */
HL = SP + n; /* Put the value of SP + n to 16-bit register HL*/
resetf(FZ); /* Reset zero flag*/
resetf(FN); /* Reset subtract flag*/
if((SP & 0x000F + n & 0x000F) & 0x00F0)
{
setf(FH); /* Set half-carry flag */
}
else
{
resetf(FH); /* Reset half-carry flag */
}
if((SP & 0x00FF + n & 0x00FF) & 0x0F00)
{
setf(FC); /* Set carry flag */
}
else
{
resetf(FC); /* Reset carry flag */
}
PC+=2; /* Increase program counter */
break;
}