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.pyReferencias
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-14Máscara vertical
0b111_10_11111_00000 = 0x7BE0Resultado requerido
fine Y <- t
vertical nametable <- t
coarse Y <- t
coarse X <- original v
horizontal nametable <- original v
every other unrelated bit <- original vEjemplo mínimo
v: horizontal state A, vertical state B
t: horizontal state C, vertical state D
result: horizontal state A, vertical state DConcepto 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