NES TDD

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