【发布时间】:2011-10-30 16:20:01
【问题描述】:
我计划在接下来的几个月里创建一个 Sega Master System 模拟器,作为 Java 的一个业余项目(我知道它不是最好的语言,但我觉得使用它很舒服,并且作为一个Windows 和 Linux 的频繁用户,我认为跨平台应用程序会很棒)。我的问题是关于周期盘点的;
我查看了另一个 Z80 模拟器和其他模拟器的源代码,特别是执行循环让我很感兴趣 - 当它被调用时,一个 int 作为参数传递(假设 1000 作为例子)。现在我知道每个操作码需要不同数量的周期来执行,并且在执行这些操作时,周期数会从整体数字中减少。一旦剩余的循环数
我的问题是,这些仿真器中的许多都没有考虑到要执行的最后一条指令可以将周期数推为负值这一事实 - 这意味着在执行循环之间,最终可能会说,执行了 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 个周期很低,但这只是一个示例。
非常感谢, 菲尔
【问题讨论】:
标签: emulation z80 cpu-cycles