239. Registros internos de dirección/scroll de la ppu

Introduce los registros internos de scroll/dirección de la PPU.

Lección 239 de 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_239_ppu_internal_scroll_address_registers.py

Referencia

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

Archivo a actualizar

emulator/ppu/ppu.py

Campos a añadir

vram_addr: int = 0
temp_vram_addr: int = 0
fine_x: int = 0
second_write_toggle: bool = False

Por qué existe este paso

PPUADDR ($2006), PPUSCROLL ($2005), PPUDATA ($2007) y el renderizado no usan únicamente campos de registro simples de un byte. La PPU tiene un estado interno de dirección/scroll.

Nombres habituales en nesdev

v = current VRAM address
t = temporary VRAM address
x = fine X scroll
w = first/second write toggle

Nombres del tutorial

vram_addr           -> v
temp_vram_addr      -> t
fine_x              -> x
second_write_toggle -> w

Significado breve

  • vram_addr es la dirección de memoria actual de la PPU usada por PPUDATA y el renderizado.
  • temp_vram_addr se construye mediante escrituras de PPUADDR/PPUSCROLL antes de copiarse.
  • fine_x almacena el desplazamiento de scroll horizontal fino, 0-7. (desplazamiento de scroll horizontal a nivel de píxel dentro de un tile)
  • second_write_toggle registra si la próxima escritura a $2005/$2006 es la primera o la segunda.

Pseudocódigo de implementación sugerido

@dataclass
class PPU:
    ...
    vram_addr: int = 0
    temp_vram_addr: int = 0
    fine_x: int = 0
    second_write_toggle: bool = False

Fuera de alcance

  • comportamiento de PPUSCROLL
  • temporización precisa de recarga de scroll en el renderizado
  • renderizado de nametables

Ejecutar esta lección

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