我在多个地方看到过 - 以下的模仿方式
即循环被传递到模拟函数
int CPU_execute(int cycles) {
int cycle_count;
cycle_count = cycles;
do {
/* OPCODE execution here */
} while(cycle_count > 0);
return cycles - cycle_count;
}
我很难理解你为什么要用这种方法来模拟,为什么你会模仿一定数量的周期?你能举出一些这种方法有用的场景吗?
衷心感谢任何帮助!!!
答案 0 :(得分:6)
仿真器倾向于愚弄为多个芯片设备编写的软件 - 就Z80和最畅销的设备而言,除了CPU之外,你可能至少谈论的是图形芯片和声音芯片。 / p>
在现实世界中,这些芯片都同时发挥作用。会有一些总线逻辑允许他们所有人进行交流,但他们在其他人的世界中也是如此。
您通常不会将不同芯片的仿真作为并发进程运行,因为执行同步事件的成本太高,尤其是在通常的安排中,在几个芯片之间共享类似RAM的块。< / p>
因此,最基本的方法是协同多任务处理不同的芯片 - 运行Z80几个周期,然后运行图形芯片相同的时间等,无限制。这就是运行n个循环和返回的方法来自。
这通常不是复制真实计算机总线行为的准确方法,但它很容易实现,而且通常可以欺骗大多数软件。
在您发布的特定代码中,作者进一步确定仿真将循环次数直到下一条整个指令的末尾。这又是关于实现的简单性,而不是与真实机器的实际内部有关。返回实际运行的周期数,以便其他子系统可以尝试进行调整。
答案 1 :(得分:3)
由于您提到z80,我碰巧知道平台的完美示例,有时需要这种精确仿真:ZX Spectrum。 ZX Spectrum上的标准图形输出区域是一个256 x 192像素的盒子,位于屏幕的中央,周围是一个由纯色填充的相当宽的“边框”区域。通过将值输出到特殊输出端口来控制边框的颜色。计算机设计师的想法是,只需选择最适合主屏幕上发生的边框颜色。
ZX Spectrum没有精确计时器。但程序员很快意识到z80的“刚性”(按现代标准)时序允许人们进行与显示器光束移动同步的绘图。在ZX Spectrum上,可以等待每帧开始时产生的中断,然后逐字计算实现各种效果所需的精确周期数。例如,ZX Spectrum上的单个完整扫描线在224个循环中被扫描。因此,可以每224个周期更改边框颜色,并在边框上生成像素粗线。
ZX Spectrum的图形容量限制在某种意义上,屏幕被划分为8x8像素块,在任何给定时间只能使用两种颜色。程序员通过每224个循环更改这两种颜色来克服此限制,因此,有效地将颜色分辨率提高了8倍。
我可以看到另一个答案下的讨论集中在一条扫描线是否对模拟器来说是足够精确的分辨率。好吧,我在ZX Spectrum上看到的一些边框滚动效果基本上是定时到单个z80循环。想要重现这些代码的正确输出的仿真器也必须精确到一个机器周期。
答案 2 :(得分:2)
如果您想将处理器与其他硬件同步,那么这样做可能会很有用。例如,如果要将其与计时器同步,则需要控制在计时器中断CPU之前可以通过的周期数。