2

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

我似乎不明白的是如何正确实现 CPU 周期和无条件跳转。

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

increment PC
read opcode
execute command

然后在读取 JP 操作码并执行命令后(从内存中读取 1000h 并设置 PC = 1000h),PC 会递增并变为 1001h,从而导致仿真不良。

tl; dr 当有增加 PC 的 cpu 循环时,您如何模拟模拟器中的跳转,以使 PC 值保持正确?

4

3 回答 3

0

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

于 2012-05-15T22:44:07.703 回答
0

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

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

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

于 2012-05-15T22:55:45.120 回答
0

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

在您的示例中,PC 将被使用三次,一次用于操作码,两次用于两个操作数字节。当 CPU 获取三个字节并可以加载 PC 时,PC 已经指向第二个操作数之后的下一条指令操作码,但是,由于实际执行指令会重新加载 PC,所以没关系.

于 2012-05-15T23:00:45.167 回答