Эмулятор Gameboy - флаг керри и полуперенос

Я работаю над эмулятором GameBoy в C и в настоящее время я работаю над ядром процессора. Тем не менее, я не уверен, что понимаю, когда установлены флаги переноса и переноса, особенно в таких операциях, как:

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;
}

0 ответов

Другие вопросы по тегам