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.pyReferencias
https://www.nesdev.org/wiki/PPU_scrolling#During_rendering
https://www.nesdev.org/wiki/PPU_scrolling#At_dot_257_of_each_scanlinePor 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 hereMáscara horizontal
0b000_01_00000_11111 = 0x041FResultado requerido
coarse X <- t
horizontal nametable <- t
coarse Y <- original v
fine Y <- original v
vertical nametable <- original v
every other unrelated bit <- original vEjemplo 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 AError 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