我正在编写一个简单的GB模拟器(哇,现在这是一个新的东西,不是它),因为我真的在emu中迈出了第一步。
我似乎无法理解的是如何正确实现CPU周期和无条件跳转。
考虑命令JP nn(无条件跳转到内存地址指出),如JP 1000h,如果我有一个基本循环:
increment PC
read opcode
execute command
然后在读取JP操作码并执行命令后(从内存读取1000h并设置PC = 1000h),PC增加并变为1001h,从而导致模拟错误。
tl; dr你如何模拟仿真器中的跳转,以便在拥有增加PC的cpu循环时PC值保持正确?
答案 0 :(得分:0)
将increment PC
移动到循环的末尾,并根据操作码有条件地执行它?
答案 1 :(得分:0)
我对仿真几乎一无所知,但我想到了两种明显的方法。
不是将PC += 1
硬编码到主循环中,而是让评估每个操作码是否返回下一个PC值(或偏移量,或者标记是否增加它,或者等等)。然后跳转和其他操作码之间的区别(它们对程序计数器的影响)可以与其他所有操作相关联。
知道主循环总是将PC增加1,只需执行跳转就可以将PC设置为target - 1
而不是target
。
答案 2 :(得分:0)
PC应该作为“原子”递增。每次用于返回一个字节时的操作。这意味着立即操作数和操作码。
在您的示例中,PC将使用三次,一次用于操作码,两次用于两个操作数字节。当CPU已经取出三个字节并且处于加载PC的位置时,PC已经指向第二个操作数之后的下一个指令操作码,但是,由于实际执行该指令会重新加载PC,因此它不会。无所谓。