339. Copiar los bits de desplazamiento horizontales

Copia los campos de desplazamiento horizontales de la dirección temporal t a la dirección actual v.

Lección 339 de 356 · tests/chapter_13_scrolling/test_339_copy_horizontal_scroll_bits.py

Archivo a actualizar

emulator/ppu/ppu.py

Referencias

https://www.nesdev.org/wiki/PPU_scrolling#During_rendering
https://www.nesdev.org/wiki/PPU_scrolling#At_dot_257_of_each_scanline

Por qué existe este paso

Las escrituras de la CPU preparan los campos de desplazamiento en la dirección temporal t, pero el renderizado de fondo usa la dirección actual v. La PPU transfiere solo los campos horizontales en el punto de recarga horizontal:

yyy NN YYYYY XXXXX
    ||       +++++-- coarse X: bits 0-4
    |+-------------- horizontal nametable: bit 10
    +--------------- vertical nametable: bit 11, not copied here

Máscara horizontal

0b000_01_00000_11111 = 0x041F

Resultado requerido

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

Ejemplo mínimo

v: coarse X 3,  horizontal nametable 0, vertical state A
t: coarse X 20, horizontal nametable 1, vertical state B

result: coarse X 20, horizontal nametable 1, vertical state A

Error común

La recarga horizontal no es v = t. Copiar todo t reemplazaría el estado vertical en el momento equivocado. Un paso posterior aplicará esta operación ya probada en el dot 257.

Fuera del alcance

  • modificar PPU.step()
  • temporización del dot 257
  • incrementos de dirección horizontales
  • copias verticales de t a v
  • renderizado de framebuffer

Implementación de ejemplo completa

# emulator/ppu/ppu.py

# --- NEW LINE: COARSE X AND HORIZONTAL NAMETABLE FIELDS ---
HORIZONTAL_SCROLL_BITS = 0b000_01_00000_11111


# --- NEW BLOCK: PURE HORIZONTAL t-TO-v COPY ---
def copy_horizontal_scroll_bits(
    vram_addr: int,
    temp_vram_addr: int,
) -> int:
    return (
        (vram_addr & ~HORIZONTAL_SCROLL_BITS)
        | (temp_vram_addr & HORIZONTAL_SCROLL_BITS)
    )

Ejecutar esta lección

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