GameBoy 模拟器中的相对跳转未跳转到应有的位置
Relative Jump in GameBoy emulator isn't jumping to where it should
我正在使用 C# 开发 GameBoy 模拟器,并使用 Blargg 的测试 ROM 对其进行测试(cpu_instrs 来自 here)。我正在单独进行测试,现在我正在使用 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()
returns 内存中的下一个字节(从 PC + 1 读取),在这种情况下它是 FB(根据 bgb,这是正确的)。据我所知,我必须将 FB 添加到当前 PC 和指令的长度 (2),但这样做我最终会得到 306,正如我已经解释过的那样。
这里有没有我遗漏的东西——我的代码中有一些我看不到的错误?
byte jumpOffset = Processor.ReadNextByte();
应该sbyte
给出-5而不是0xFB。
我正在使用 C# 开发 GameBoy 模拟器,并使用 Blargg 的测试 ROM 对其进行测试(cpu_instrs 来自 here)。我正在单独进行测试,现在我正在使用 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()
returns 内存中的下一个字节(从 PC + 1 读取),在这种情况下它是 FB(根据 bgb,这是正确的)。据我所知,我必须将 FB 添加到当前 PC 和指令的长度 (2),但这样做我最终会得到 306,正如我已经解释过的那样。
这里有没有我遗漏的东西——我的代码中有一些我看不到的错误?
byte jumpOffset = Processor.ReadNextByte();
应该sbyte
给出-5而不是0xFB。