NES TDD

243. PPUCTRL управляет приращением PPUDATA

PPUCTRL управляет тем, насколько PPUDATA увеличивает vram_addr.

Урок 243 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_243_ppuctrl_controls_ppudata_increment.py

Ссылка

https://www.nesdev.org/wiki/PPU_registers#PPUCTRL

Файл для обновления

emulator/ppu/ppu.py

Константа для добавления

CTRL_VRAM_INCREMENT_BY_32 = 1 << 2

Почему этот шаг важен

PPUDATA ($2007) обращается к памяти PPU по текущему внутреннему VRAM-адресу. После каждого обращения PPU увеличивает этот адрес.

Величина приращения управляется битом 2 PPUCTRL ($2000):

bit 2 clear -> increment by 1
bit 2 set   -> increment by 32

Почему это важно

Приращение на 1 полезно для записи вдоль строки последовательных ячеек памяти PPU. Приращение на 32 полезно для записи вдоль столбца в памяти таблицы имён.

Предлагаемый псевдокод реализации

CTRL_VRAM_INCREMENT_BY_32 = 1 << 2

case 0x2007:
    self.data = value
    self.ppu_bus.write(self.vram_addr, value)

    increment = 32 if self.ctrl & CTRL_VRAM_INCREMENT_BY_32 else 1
    self.vram_addr = (self.vram_addr + increment) & 0x3FFF

Важно

Продолжайте маскировать vram_addr значением 0x3FFF, поскольку адресное пространство PPU 14-битное:

$0000-$3FFF

Вне рамок

  • другие биты PPUCTRL
  • включение NMI
  • выбор таблицы шаблонов
  • выбор базовой таблицы имён
  • рендеринг

Запустить этот урок

uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_243_ppuctrl_controls_ppudata_increment.py -v