229. CPU 总线 PPU 寄存器写入路由

将 CpuBus 对 $2000-$3FFF 的写入路由到 PPU 寄存器。

229 / 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_229_cpu_bus_ppu_register_write_routing.py

待更新文件

emulator/bus/cpu_bus.py

该步骤存在的原因

诸如 STA 绝对寻址之类的 CPU 指令会写入 CPU 总线。当目标地址位于 $2000-$3FFF 范围内时,该写入应当进入 PPU 寄存器窗口。

用于读取的同一套 8 字节镜像规则同样适用于写入

unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)

该公式为何是必需的

PPU 在 $2000-$2007 只有 8 个 CPU 可见的基本寄存器,但 CPU 地址映射会一直重复这些寄存器直到 $3FFF。

示例

$2000 -> $2000 -> ctrl
$2008 -> $2000 -> ctrl
$2009 -> $2001 -> mask
$3FFF -> $2007 -> data

建议的实现伪代码

if 0x2000 <= addr <= 0x3FFF:
    unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)
    self.ppu.write_register(unmirrored_addr, value)
    return

边界规则

CpuBus 不应直接设置 ppu.ctrl、ppu.mask 等字段,而应路由到 PPU.write_register,使寄存器的语义保留在 PPU 内部。

运行本课

uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_229_cpu_bus_ppu_register_write_routing.py -v