243. PPUCTRL controla el incremento de PPUDATA

PPUCTRL controla en cuánto incrementa PPUDATA vram_addr.

Lección 243 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_243_ppuctrl_controls_ppudata_increment.py

Referencia

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

Archivo a actualizar

emulator/ppu/ppu.py

Constante a añadir

CTRL_VRAM_INCREMENT_BY_32 = 1 << 2

Por qué existe este paso

PPUDATA ($2007) accede a la memoria de la PPU en la dirección de VRAM interna actual. Después de cada acceso, la PPU incrementa esa dirección.

La cantidad de incremento se controla con el bit 2 de PPUCTRL ($2000):

bit 2 clear -> increment by 1
bit 2 set   -> increment by 32

Por qué es importante

El incremento de 1 es útil para escribir a lo largo de una fila consecutiva de memoria de la PPU. El incremento de 32 es útil para escribir hacia abajo en una columna de la memoria de nametable.

Pseudocódigo de implementación sugerido

CTRL_VRAM_INCREMENT_BY_32 = 1 << 2

case 0x2007:
    self.data = value
    self.ppu_bus.write(self.vram_addr, value)

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

Importante

Sigue enmascarando vram_addr con 0x3FFF porque el espacio de direcciones de la PPU es de 14 bits:

$0000-$3FFF

Fuera del alcance

  • otros bits de PPUCTRL
  • habilitación de NMI
  • selección de pattern table
  • selección de nametable base
  • renderizado

Ejecutar esta lección

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