NES TDD

229. Cpu bus ppu register write routing

Маршрутизация записей CpuBus из диапазона $2000-$3FFF в регистры PPU.

Урок 229 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_229_cpu_bus_ppu_register_write_routing.py

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

emulator/bus/cpu_bus.py

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

Инструкции CPU, такие как STA absolute, записывают на шину CPU. Когда целевой адрес находится внутри диапазона $2000-$3FFF, запись должна попадать в окно регистров PPU.

То же самое правило зеркалирования по 8 байт, что и для чтений, применяется и к записям

unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)

Почему эта формула необходима

У PPU всего 8 базовых регистров, видимых для CPU, по адресам $2000-$2007, но карта адресов CPU повторяет эти регистры вплоть до $3FFF.

Примеры

$2000 -> $2000 -> ctrl
$2008 -> $2000 -> ctrl
$2009 -> $2001 -> mask
$3FFF -> $2007 -> data

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

if 0x2000 <= addr <= 0x3FFF:
    unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)
    self.ppu.write_register(unmirrored_addr, value)
    return

Правило границы

CpuBus не должен напрямую устанавливать ppu.ctrl, ppu.mask и т.д. Он должен маршрутизировать вызов в PPU.write_register, чтобы семантика регистров оставалась внутри PPU.

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

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