NES TDD

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