Я работаю над эмулятором 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, как я уже объяснил.
Есть ли здесь что-то, чего мне не хватает - какая-то ошибка в моем коде, которую я не вижу?