228. CPU 总线 PPU 寄存器读取路由
将 CpuBus 对 $2000-$3FFF 的读取路由到 PPU 寄存器。
第 228 / 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_228_cpu_bus_ppu_register_read_routing.py
待更新文件
emulator/bus/cpu_bus.py该步骤存在的原因
CPU 通过 CPU 地址映射看到 PPU 寄存器
$2000-$3FFF -> PPU registers, mirrored every 8 bytes只有 $2000-$2007 是基本的 PPU 寄存器地址。其余范围都是这同 8 个寄存器的镜像。
镜像公式
unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)工作原理
1. addr - 0x2000 converts the CPU address into an offset from the start of
the PPU register window.
2. % 8 folds that offset into the repeating 8-register range.
3. + 0x2000 converts the folded offset back into a base PPU register address.示例
$2002:
0x2000 + ((0x2002 - 0x2000) % 8)
= 0x2000 + (2 % 8)
= $2002
$200A:
0x2000 + ((0x200A - 0x2000) % 8)
= 0x2000 + (10 % 8)
= $2002
$3FFF:
0x2000 + ((0x3FFF - 0x2000) % 8)
= 0x2000 + (8191 % 8)
= $2007为何该公式由 CpuBus 负责
镜像属于 CPU 地址映射的解码工作。PPU.read_register 应当接收一个规范化在 $2000-$2007 范围内的寄存器地址。
建议的实现伪代码
if 0x2000 <= addr <= 0x3FFF:
unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)
return self.ppu.read_register(unmirrored_addr)运行本课
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_228_cpu_bus_ppu_register_read_routing.py -v