342. Copiar los bits de scroll vertical

Copiar los campos de scroll vertical de la dirección temporal t a la dirección actual v.

Lección 342 de 356 · tests/chapter_13_scrolling/test_342_copy_vertical_scroll_bits.py

Archivo a actualizar

emulator/ppu/ppu.py

Referencias

https://www.nesdev.org/wiki/PPU_scrolling#During_dots_280_to_304_of_the_pre-render_scanline_(end_of_vblank)

Por qué existe este paso

Las escrituras de la CPU preparan los campos de scroll vertical en la dirección temporal t, mientras que el renderizado usa la dirección actual v. Durante el scanline de pre-render, la PPU refresca selectivamente los campos verticales:

yyy NN YYYYY XXXXX
||| |  |||||
||| |  +++++-- coarse Y: bits 5-9
||| +--------- vertical nametable: bit 11
+++----------- fine Y: bits 12-14

Máscara vertical

0b111_10_11111_00000 = 0x7BE0

Resultado requerido

fine Y                       <- t
vertical nametable           <- t
coarse Y                     <- t
coarse X                     <- original v
horizontal nametable         <- original v
every other unrelated bit    <- original v

Ejemplo mínimo

v: horizontal state A, vertical state B
t: horizontal state C, vertical state D

result: horizontal state A, vertical state D

Concepto erróneo común

La recarga vertical no es v = t. Copiar todo t sobrescribiría el estado horizontal después de que este se preparara de forma independiente mediante la recarga horizontal.

Fuera de alcance

  • modificar PPU.step()
  • el incremento vertical del dot 256
  • los dots 280-304 del pre-render
  • el registro del estado por scanline
  • el renderizado del framebuffer

Implementación de ejemplo completa

# emulator/ppu/ppu.py

# --- NEW LINE: FINE Y, VERTICAL NAMETABLE, AND COARSE Y ---
VERTICAL_SCROLL_BITS = 0b111_10_11111_00000


# --- NEW BLOCK: PURE VERTICAL t-TO-v COPY ---
def copy_vertical_scroll_bits(
    vram_addr: int,
    temp_vram_addr: int,
) -> int:
    return (
        (vram_addr & ~VERTICAL_SCROLL_BITS)
        | (temp_vram_addr & VERTICAL_SCROLL_BITS)
    )

Ejecutar esta lección

uv run pytest tests/chapter_13_scrolling/test_342_copy_vertical_scroll_bits.py -v