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#PPUCTRLArchivo a actualizar
emulator/ppu/ppu.pyConstante a añadir
CTRL_VRAM_INCREMENT_BY_32 = 1 << 2Por 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 32Por 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) & 0x3FFFImportante
Sigue enmascarando vram_addr con 0x3FFF porque el espacio de direcciones de la PPU es de 14 bits:
$0000-$3FFFFuera 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