239. Внутренние регистры прокрутки и адреса PPU
Ввести внутренние регистры прокрутки/адреса PPU.
Урок 239 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_239_ppu_internal_scroll_address_registers.py
Справочник
https://www.nesdev.org/wiki/PPU_registers#Internal_registersФайл для обновления
emulator/ppu/ppu.pyПоля для добавления
vram_addr: int = 0
temp_vram_addr: int = 0
fine_x: int = 0
second_write_toggle: bool = FalseЗачем нужен этот шаг
PPUADDR ($2006), PPUSCROLL ($2005), PPUDATA ($2007) и рендеринг не используют только простые однобайтовые поля регистров. У PPU есть внутреннее состояние адреса/прокрутки.
Общепринятые названия из nesdev
v = current VRAM address
t = temporary VRAM address
x = fine X scroll
w = first/second write toggleНазвания в руководстве
vram_addr -> v
temp_vram_addr -> t
fine_x -> x
second_write_toggle -> wКраткое значение
- vram_addr — текущий адрес памяти PPU, используемый PPUDATA и рендерингом.
- temp_vram_addr формируется записями в PPUADDR/PPUSCROLL перед копированием.
- fine_x хранит тонкое горизонтальное смещение прокрутки, 0-7. (попиксельное горизонтальное смещение прокрутки внутри тайла)
- second_write_toggle отслеживает, первая это запись или вторая, для $2005/$2006.
Предлагаемый псевдокод реализации
@dataclass
class PPU:
...
vram_addr: int = 0
temp_vram_addr: int = 0
fine_x: int = 0
second_write_toggle: bool = FalseВне области действия
- поведение PPUSCROLL
- точный тайминг перезагрузки прокрутки при рендеринге
- рендеринг таблиц имён
Запустить этот урок
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_239_ppu_internal_scroll_address_registers.py -v