4

我在不止一个地方看到过-以下模仿方式

即循环被传递到模拟函数

int CPU_execute(int cycles) {
    int cycle_count;

    cycle_count = cycles;
    do {

         /* OPCODE execution here */

    } while(cycle_count > 0);

    return cycles - cycle_count;
}     

我很难理解您为什么要使用这种方法进行模拟,即为什么要模拟一定数量的周期?你能给出一些这种方法有用的场景吗?

衷心感谢任何帮助!

4

3 回答 3

6

仿真器往往对欺骗为多个芯片设备编写的软件感兴趣——就 Z80 和最畅销的设备而言,除了 CPU 之外,您可能至少会谈论图形芯片和声音芯片。

在现实世界中,这些芯片都是同时运行的。将有一些总线逻辑允许它们所有人进行通信,但它们在其他方面处于自己的世界中。

您通常不会将不同芯片的仿真作为并发进程运行,因为执行同步事件的成本太高,尤其是在几个芯片之间共享同一个 RAM 块之类的常见安排中。

因此,最基本的方法是协同处理不同芯片的多任务——运行 Z80 几个周期,然后运行图形芯片相同的时间,等等,无止境。这就是运行n个循环并返回的方法的来源。

这通常不是重现真实计算机总线行为的准确方法,但它很容易实现,并且通常可以欺骗大多数软件。

在您发布的特定代码中,作者进一步决定仿真将四舍五入到下一条完整指令结束的周期数。同样,这与实现的简单性有关,而不是与真实机器的实际内部有关。返回实际运行的周期数,以便其他子系统可以尝试适应。

于 2012-12-05T07:32:35.107 回答
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 周期的。想要重现此类代码的正确输出的仿真器还必须精确到单个机器周期。

于 2013-03-12T22:18:32.113 回答
2

如果您想将处理器与其他硬件同步,这样做可能会很有用。例如,如果您想将其与定时器同步,您想控制在定时器中断 CPU 之前可以经过多少个周期。

于 2012-12-04T08:50:33.747 回答