Относительный прыжок в эмуляторе GameBoy не прыгает туда, куда должен - PullRequest
0 голосов
/ 15 мая 2019

Я работаю над эмулятором GameBoy на C # и тестирую его с помощью тестовых ПЗУ Blargg (cpu_instrs из здесь ).Я прохожу тесты индивидуально, и теперь я использую 07-jr, jp, call, ret и rst.Я сравниваю свои результаты с отладчиком bgb.Теперь, когда я добираюсь до 0209, где он запускает код операции 0x20 (JR NZ), bgb переходит к 0x206, но мой эмулятор переходит к 0x306.

Это мой текущий код для этой инструкции:

if (Processor.GetZeroFlag() == 0)
{
    byte jumpOffset = Processor.ReadNextByte();
    ushort targetAddr = (ushort)(Processor.GetPC() + 2 + jumpOffset);

    Processor.SetPC(targetAddr);
    Processor.FinishedIntruction(0, 8, 2);
    break;
}
else
{
    Console.WriteLine("Not taking the branch");
    Processor.FinishedIntruction(2, 8, 2);
    break;
}

ReadNextByte() возвращает следующий байт из памяти (считывает с ПК + 1), в данном случае это FB (что, согласно bgb, правильно).Насколько я понял, я должен добавить FB к текущему ПК и длину инструкции (2), но после этого я получаю 306, как я уже объяснил.

Есть ли здесь что-то, чего мне не хватает - какая-то ошибка в моем коде, которую я не вижу?

1 Ответ

0 голосов
/ 16 мая 2019
byte jumpOffset = Processor.ReadNextByte();

Это должно быть sbyte, давая -5 вместо 0xFB.

...