226. Lectura de registro de la PPU

Añadir PPU.read_register(addr).

Lección 226 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_226_ppu_read_register.py

Archivo a actualizar

emulator/ppu/ppu.py

Método a implementar

PPU.read_register(addr: int) -> int

Por qué existe este paso

Algunos registros de la PPU pueden ser leídos por la CPU. Las lecturas también son E/S mapeada en memoria, no un acceso normal a RAM. La PPU decide qué valor recibe la CPU.

Registros legibles para esta etapa simplificada

$2002 -> status
$2007 -> data

Nota sobre $2004/OAMDATA: OAMDATA es legible, pero más adelante se convertirá en un puerto hacia la memoria interna de sprites OAM. Ese comportamiento se prueba en el paso específico de OAM. Esta prueba temprana de read_register no se ata al comportamiento antiguo del campo provisional oam_data.

Nota sobre $2007/PPUDATA: PPUDATA es legible, pero más adelante se convertirá en un puerto de lectura de memoria de la PPU con búfer. Ese comportamiento se prueba en el paso específico de PPUDATA. Esta prueba temprana de read_register no se ata al comportamiento antiguo del campo provisional data.

Por qué solo estos

Varios registros de la PPU son, desde el lado de la CPU, principalmente de solo escritura. Las lecturas no soportadas deben fallar de forma explícita en lugar de simular que todos los registros de la PPU son RAM normal.

Nota importante sobre precisión futura

Las lecturas reales de PPUSTATUS tienen efectos secundarios. Leer $2002 borra el flag de VBlank y reinicia el latch interno de dirección/scroll. Deliberadamente no modelamos aún esos efectos secundarios. Este paso solo crea el límite básico de registros.

Pseudocódigo de implementación sugerido

def read_register(self, addr: int) -> int:
    match addr:
        case 0x2002:
            return self.status
        case 0x2007:
            return self.data
        case _:
            raise ValueError(...)

Ejecutar esta lección

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