242. PPUDATA escribe a través del bus de la PPU

Implementa las escrituras de PPUDATA ($2007) a través de PpuBus.

Lección 242 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_242_ppudata_writes_through_ppu_bus.py

Referencia

https://www.nesdev.org/wiki/PPU_registers#PPUDATA

Archivo a actualizar

emulator/ppu/ppu.py

Método a actualizar

PPU.write_register(addr, value)

Por qué existe este paso

PPUDATA es el registro visible para la CPU en $2007. La CPU escribe en $2007, pero la dirección real de memoria de la PPU en la que se escribe no es la dirección de CPU $2007. El destino real es la dirección de VRAM interna de la PPU:

vram_addr

Esa dirección la establece PPUADDR ($2006) y después PPUDATA ($2007) escribe a través del

bus del lado de la PPU

PPU.write_register($2007, value)
    -> ppu_bus.write(vram_addr, value)
    -> increment vram_addr

Decisiones importantes de compatibilidad futura en este test

- Use non-CHR addresses such as $2000, not $0000-$1FFF.
  CHR writes will later involve mapper.write_chr / CHR RAM behavior.

- Test increment-by-1 only when PPUCTRL increment mode is clear.
  Later, PPUCTRL bit 2 may select increment-by-32. These tests should not
  block that future behavior.

Pseudocódigo de implementación sugerido para la etapa actual

case 0x2007:
    self.data = value
    self.ppu_bus.write(self.vram_addr, value)
    self.vram_addr = (self.vram_addr + 1) & 0x3FFF

Nota sobre la implementación futura

Más adelante, el incremento puede pasar a ser

increment = 32 if self.ctrl & VRAM_INCREMENT_BY_32 else 1
self.vram_addr = (self.vram_addr + increment) & 0x3FFF

Fuera del alcance

  • lecturas de PPUDATA
  • almacenamiento en búfer de lecturas de PPUDATA
  • excepciones de lectura de paleta
  • escrituras en CHR RAM
  • comportamiento de incremento de 32 de PPUCTRL

Ejecutar esta lección

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