225. Escritura de registro de la PPU

Añadir PPU.write_register(addr, value).

Lección 225 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_225_ppu_write_register.py

Archivo a actualizar

emulator/ppu/ppu.py

Método a implementar

PPU.write_register(addr: int, value: int) -> None

Por qué existe este paso

La CPU escribe en los registros de la PPU mediante E/S mapeada en memoria. Cuando la CPU escribe en la dirección $2000, no está escribiendo en RAM; está actualizando el registro PPUCTRL.

Para este paso, PPU.write_register recibe direcciones de registro de PPU normalizadas en el rango $2000-$2007. El mirroring de CpuBus para $2008-$3FFF se implementará en un paso posterior.

Registros escribibles para esta etapa simplificada

$2000 -> ctrl
$2001 -> mask
$2003 -> oam_addr
$2004 -> oam_data / OAMDATA port
$2005 -> scroll
$2006 -> addr
$2007 -> data

Observa que $2002 falta intencionadamente.

Por qué $2002 no es escribible: $2002 es PPUSTATUS. Desde el lado de la CPU, es de solo lectura. Las pruebas pueden establecer directamente ppu.status cuando necesitan simular un valor de estado, pero write_register($2002, value) debería fallar.

Política de un byte

Los registros de la PPU son de 8 bits. Por ahora, las escrituras deben conservar solo el byte bajo del valor. Esto significa que escribir 0x123 almacena 0x23.

Pseudocódigo de implementación sugerido

def write_register(self, addr: int, value: int) -> None:
    value = value & 0xFF

    match addr:
        case 0x2000:
            self.ctrl = value
        case 0x2001:
            self.mask = value
        case 0x2003:
            self.oam_addr = value
        case 0x2004:
            self.oam_data = value
        case 0x2005:
            self.scroll = value
        case 0x2006:
            self.addr = value
        case 0x2007:
            self.data = value
        case _:
            raise ValueError(...)

Nota futura

Más adelante, $2004/OAMDATA se convertirá en un puerto hacia la memoria interna de sprites OAM. En ese momento, escribir en $2004 también podría incrementar oam_addr. Esta prueba temprana no debería exigir que oam_addr permanezca sin cambios tras una escritura en OAMDATA.

Ejecutar esta lección

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