229. Enrutamiento de escrituras de registros de PPU en CpuBus
Enrutar las escrituras de CpuBus desde $2000-$3FFF a los registros de la PPU.
Lección 229 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_229_cpu_bus_ppu_register_write_routing.py
Archivo a actualizar
emulator/bus/cpu_bus.pyPor qué existe este paso
Instrucciones de CPU como STA absoluto escriben en el bus de CPU. Cuando la dirección de destino está dentro de $2000-$3FFF, la escritura debe ir a la ventana de registros de la PPU.
La misma regla de mirroring de 8 bytes usada para las lecturas se aplica a las escrituras
unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)Por qué es necesaria esta fórmula
La PPU solo tiene 8 registros base visibles para la CPU en $2000-$2007, pero el mapa de direcciones de la CPU repite esos registros hasta $3FFF.
Ejemplos
$2000 -> $2000 -> ctrl
$2008 -> $2000 -> ctrl
$2009 -> $2001 -> mask
$3FFF -> $2007 -> dataPseudocódigo de implementación sugerido
if 0x2000 <= addr <= 0x3FFF:
unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)
self.ppu.write_register(unmirrored_addr, value)
returnRegla de límite
CpuBus no debería establecer directamente ppu.ctrl, ppu.mask, etc. Debería enrutar hacia PPU.write_register para que la semántica de los registros permanezca dentro de la PPU.
Ejecutar esta lección
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_229_cpu_bus_ppu_register_write_routing.py -v