242. Запись в PPUDATA через шину PPU
Реализовать запись в PPUDATA ($2007) через PpuBus.
Урок 242 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_242_ppudata_writes_through_ppu_bus.py
Ссылка
https://www.nesdev.org/wiki/PPU_registers#PPUDATAФайл для обновления
emulator/ppu/ppu.pyМетод для обновления
PPU.write_register(addr, value)Почему этот шаг важен
PPUDATA — это видимый для CPU регистр по адресу $2007. CPU пишет в $2007, но фактический адрес PPU-памяти, в который производится запись, не совпадает с адресом CPU $2007. Реальной целью является внутренний VRAM-адрес PPU:
vram_addrЭтот адрес устанавливается через PPUADDR ($2006), после чего запись в PPUDATA ($2007) проходит через
шину со стороны PPU
PPU.write_register($2007, value)
-> ppu_bus.write(vram_addr, value)
-> increment vram_addrВажные решения ради будущей совместимости в этом тесте
- Use non-CHR addresses such as $2000, not $0000-$1FFF.
CHR writes will later involve mapper.write_chr / CHR RAM behavior.
- Test increment-by-1 only when PPUCTRL increment mode is clear.
Later, PPUCTRL bit 2 may select increment-by-32. These tests should not
block that future behavior.Предлагаемый псевдокод реализации для текущего этапа
case 0x2007:
self.data = value
self.ppu_bus.write(self.vram_addr, value)
self.vram_addr = (self.vram_addr + 1) & 0x3FFFЗамечание о будущей реализации
Позже приращение может стать
increment = 32 if self.ctrl & VRAM_INCREMENT_BY_32 else 1
self.vram_addr = (self.vram_addr + increment) & 0x3FFFВне рамок
- чтение PPUDATA
- буферизация чтения PPUDATA
- исключения при чтении палитры
- запись в CHR RAM
- поведение приращения на 32 в PPUCTRL
Запустить этот урок
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_242_ppudata_writes_through_ppu_bus.py -v