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