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