238. La ppu posee el bus de la ppu

Conecta la PPU a PpuBus.

Lección 238 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_238_ppu_owns_ppu_bus.py

Archivo a actualizar

emulator/ppu/ppu.py

Campo a añadir

ppu_bus: PpuBus = field(default_factory=PpuBus)

Por qué existe este paso

La PPU tiene registros a los que la CPU puede acceder a través de CpuBus, pero la PPU también tiene su propio espacio de direcciones:

PPU address space: $0000-$3FFF

Ese espacio de direcciones debería ser enrutado por PpuBus.

Esto crea el límite estable necesario antes de implementar PPUADDR/PPUDATA:

CPU writes $2006 / $2007
    -> CpuBus routes to PPU.write_register(...)
    -> PPU uses internal PPU address state
    -> PPU writes through PpuBus

Dirección de dependencia importante

PPU -> PpuBus -> VRAM / mapper CHR later

No

PPU -> raw VRAM directly

Por qué esto importa

El comportamiento de PPUDATA no debería necesitar cambiar cuando PpuBus se vuelva más preciso más adelante. Hoy PpuBus puede usar una gran VRAM. Más adelante puede enrutar hacia:

$0000-$1FFF -> mapper CHR ROM/RAM
$2000-$3EFF -> nametable VRAM/mirrors
$3F00-$3FFF -> palette RAM/mirrors

Pseudocódigo de implementación sugerido

from dataclasses import dataclass, field
from emulator.bus.ppu_bus import PpuBus


@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

    ppu_bus: PpuBus = field(default_factory=PpuBus)

Fuera de alcance

  • comportamiento del latch de PPUADDR
  • escrituras de PPUDATA a través de PpuBus
  • precisión de paletas/nametables
  • escrituras en CHR RAM

Ejecutar esta lección

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