GPU/PPU 计时在 Gameboy 上是如何工作的?

How do GPU/PPU timings work on the Gameboy?

我正在写一个 gameboy 模拟器,我来实现图形。但是,就 timing/clock 周期而言,我不太明白它是如何与 cpu 一起工作的。 CPU 是否执行一定数量的周期(如果有多少)然后将其交给 GPU?或者 gameboy 是否始终处于 hblank/vblank 状态,而 GPU 使用它们之间的 CPU?我找不到任何对此有帮助的信息,只能找到如何使用控制寄存器。

已在 https://forums.nesdev.com/viewtopic.php?f=20&t=17754&p=225009#p225009

回答此问题

原来我完全错了,他们完全不一样

这里是 post:

The Game Boy CPU and PPU run in parallel. The 4.2 MHz master clock is also the dot clock. It's divided by 2 to form the PPU's 2.1 MHz memory access clock, and divided by 4 to form a multi-phase 1.05 MHz clock used by the CPU.

Each scanline is 456 dots (114 CPU cycles) long and consists of mode 2 (OAM search), mode 3 (active picture), and mode 0 (horizontal blanking). Mode 2 is 80 dots long (2 for each OAM entry), mode 3 is about 168 plus about 10 more for each sprite on a given line, and mode 0 is the rest. After 144 scanlines are drawn are 10 lines of mode 1 (vertical blanking), for a total of 154 lines or 70224 dots per screen. The CPU can't see VRAM (writes are ignored and reads are $FF) during mode 3, but it can during other modes. The CPU can't see OAM during modes 2 and 3, but it can during blanking modes (0 and 1).

link 给出了更多的一般性答案,而不是实现细节,所以我想给我 2 美分。

CPU 通常是模拟器的主要部分,也是真正计算周期的部分。每次您的 CPU 为任意数量的周期执行某项操作时,您都会将该数量的周期传递给模拟器的其他组件,以便它们可以同步。

例如,一些 CPU 指令将内存读写作为单个指令的一部分。这意味着需要 Gameboy CPU 4(读取)+ 4(写入)周期来完成指令。所以在模拟器中你进行读取,将 4 个周期传递给 GPU,进行写入,将 4 个周期传递给 GPU。您对 运行 与 CPU 并行的其他组件执行相同的操作,例如计时器和声音。

这样做实际上很重要,而不是模拟整个指令然后同步其他所有指令。不知道真正的 ROM,但有测试 ROM 可以验证这种确切的行为。 8 个周期是很长的时间,在多次内存访问中间,其他 Gameboy 组件可能会做出更改。