224. Atributos de registro de la dataclass PPU

Crear la dataclass PPU con atributos de registro explícitos.

Lección 224 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_224_ppu_dataclass_register_attributes.py

Archivo a crear

emulator/ppu/ppu.py

Clase a implementar

PPU

Por qué existe este paso

La CPU se comunica con la Unidad de Procesamiento de Imagen (PPU) de la NES mediante registros hardware visibles para la CPU en las direcciones $2000-$2007. No son bytes normales de RAM; son registros hardware con nombre y significados específicos.

Para este primer paso de la PPU, solo creamos el estado de los registros. Todavía no implementamos lecturas, escrituras, renderizado, VBlank, scroll, VRAM ni DMA.

Esta prueba verifica que existen los campos originales de registro de PPU visibles para la CPU. No exige que estos sean los únicos campos para siempre. Pasos posteriores pueden añadir estado interno de la PPU como ppu_bus, vram_addr o addr_latch.

Ventana de registros de PPU visibles para la CPU

$2000 PPUCTRL   -> ctrl
$2001 PPUMASK   -> mask
$2002 PPUSTATUS -> status
$2003 OAMADDR   -> oam_addr
$2004 OAMDATA   -> oam_data
$2005 PPUSCROLL -> scroll
$2006 PPUADDR   -> addr
$2007 PPUDATA   -> data

Decisión de diseño importante

Usa campos enteros explícitos, de forma similar a los registros de la CPU. Esto mantiene sencilla la depuración y hace visible el modelo hardware:

assert ppu.ctrl == 0x80

No añadas OAMDMA aquí. OAMDMA se accede en la dirección de CPU $4014 y dispara una copia DMA de 256 bytes a la memoria de sprites. Está relacionado con la PPU, pero no forma parte de la ventana normal de registros de PPU $2000-$2007.

Pseudocódigo de implementación sugerido

from dataclasses import dataclass


@dataclass
class PPU:
    ctrl: int = 0
    mask: int = 0
    status: int = 0
    oam_addr: int = 0
    oam_data: int = 0
    scroll: int = 0
    addr: int = 0
    data: int = 0

Ejecutar esta lección

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