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.pyMétodo a implementar
PPU.read_register(addr: int) -> intPor 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 -> dataNota 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