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.py

Por 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 -> data

Pseudocódigo de implementación sugerido

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

Regla 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