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