228. Cpu bus ppu register read routing
Маршрутизация чтений CpuBus из диапазона $2000-$3FFF в регистры PPU.
Урок 228 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_228_cpu_bus_ppu_register_read_routing.py
Файл для обновления
emulator/bus/cpu_bus.pyПочему этот шаг нужен
CPU видит регистры PPU через карту адресов CPU
$2000-$3FFF -> PPU registers, mirrored every 8 bytesТолько $2000-$2007 являются базовыми адресами регистров PPU. Остальная часть диапазона — это зеркала этих же 8 регистров.
Формула зеркалирования
unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)Как это работает
1. addr - 0x2000 converts the CPU address into an offset from the start of
the PPU register window.
2. % 8 folds that offset into the repeating 8-register range.
3. + 0x2000 converts the folded offset back into a base PPU register address.Примеры
$2002:
0x2000 + ((0x2002 - 0x2000) % 8)
= 0x2000 + (2 % 8)
= $2002
$200A:
0x2000 + ((0x200A - 0x2000) % 8)
= 0x2000 + (10 % 8)
= $2002
$3FFF:
0x2000 + ((0x3FFF - 0x2000) % 8)
= 0x2000 + (8191 % 8)
= $2007Почему формулой владеет CpuBus
Зеркалирование — это декодирование карты адресов CPU. PPU.read_register должен получать нормализованный адрес регистра в диапазоне $2000-$2007.
Предлагаемый псевдокод реализации
if 0x2000 <= addr <= 0x3FFF:
unmirrored_addr = 0x2000 + ((addr - 0x2000) % 8)
return self.ppu.read_register(unmirrored_addr)Запустить этот урок
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_228_cpu_bus_ppu_register_read_routing.py -v