仿真:无条件跳转和PC通过CPU周期递增

时间:2012-05-15 22:40:21

标签: emulation gameboy

我正在编写一个简单的GB模拟器(哇,现在这是一个新的东西,不是它),因为我真的在emu中迈出了第一步。

我似乎无法理解的是如何正确实现CPU周期和无条件跳转。

考虑命令JP nn(无条件跳转到内存地址指出),如JP 1000h,如果我有一个基本循环:

increment PC
read opcode
execute command

然后在读取JP操作码并执行命令后(从内存读取1000h并设置PC = 1000h),PC增加并变为1001h,从而导致模拟错误。

tl; dr你如何模拟仿真器中的跳转,以便在拥有增加PC的cpu循环时PC值保持正确?

3 个答案:

答案 0 :(得分:0)

increment PC移动到循环的末尾,并根据操作码有条件地执行它?

答案 1 :(得分:0)

我对仿真几乎一无所知,但我想到了两种明显的方法。

  1. 不是将PC += 1硬编码到主循环中,而是让评估每个操作码是否返回下一个PC值(或偏移量,或者标记是否增加它,或者等等)。然后跳转和其他操作码之间的区别(它们对程序计数器的影响)可以与其他所有操作相关联。

  2. 知道主循环总是将PC增加1,只需执行跳转就可以将PC设置为target - 1而不是target

答案 2 :(得分:0)

PC应该作为“原子”递增。每次用于返回一个字节时的操作。这意味着立即操作数和操作码。

在您的示例中,PC将使用三次,一次用于操作码,两次用于两个操作数字节。当CPU已经取出三个字节并且处于加载PC的位置时,PC已经指向第二个操作数之后的下一个指令操作码,但是,由于实际执行该指令会重新加载PC,因此它不会。无所谓。