我计划在接下来的几个月里创建一个 Sega Master System 模拟器,作为 Java 的一个业余项目(我知道它不是最好的语言,但我发现它工作起来很舒服,并且作为一个经常使用Windows 和 Linux 我认为跨平台应用程序会很棒)。我的问题是关于周期盘点的;
我查看了另一个 Z80 仿真器和其他仿真器的源代码,特别是执行循环让我很感兴趣——当它被调用时,一个 int 作为参数传递(比如说 1000 作为示例)。现在我知道每个操作码需要不同数量的周期来执行,并且在执行这些操作时,周期数会从整体数字中减少。一旦剩余的循环数 <= 0,执行循环就结束了。
我的问题是,这些仿真器中的许多都没有考虑到要执行的最后一条指令可以将周期数推为负值这一事实——这意味着在执行循环之间,最终可能会出现 1002 个周期执行而不是 1000。这重要吗?一些模拟器通过在下一个执行循环上进行补偿来解决这个问题,而有些则没有——哪种方法最好?请允许我说明我的问题,因为我不是特别擅长自我介绍:
public void execute(int numOfCycles)
{ //this is an execution loop method, called with 1000.
while (numOfCycles > 0)
{
instruction = readInstruction();
switch (instruction)
{
case 0x40: dowhatever, then decrement numOfCycles by 5;
break;
//lets say for arguments sake this case is executed when numOfCycles is 3.
}
}
在这个特定的循环示例结束后,numOfCycles 将为 -2。这只会是一个很小的不准确,但它在人们的经验中是否重要?我很感激任何人对此的见解。我计划在每一帧之后中断 CPU,因为这看起来很合适,所以我知道 1000 个周期很低,但这只是一个例子。
非常感谢,菲尔