226. Ppu read register
Добавление PPU.read_register(addr).
Урок 226 из 356 · tests/chapter_03_ppu_memory_and_graphics_data/test_226_ppu_read_register.py
Файл для обновления
emulator/ppu/ppu.pyМетод для реализации
PPU.read_register(addr: int) -> intПочему этот шаг нужен
Некоторые регистры PPU могут быть прочитаны CPU. Чтения также являются вводом-выводом с отображением в память, а не обычным доступом к RAM. Значение, которое получает CPU, определяет PPU.
Регистры, доступные для чтения на этом упрощённом этапе
$2002 -> status
$2007 -> dataЗамечание о $2004/OAMDATA: OAMDATA доступен для чтения, но позже он станет портом во внутреннюю память спрайтов OAM. Это поведение проверяется на шаге, посвящённом OAM. Этот ранний тест чтения регистра не привязывается к старому поведению поля-заглушки oam_data.
Замечание о $2007/PPUDATA: PPUDATA доступен для чтения, но позже он станет буферизованным портом чтения памяти PPU. Это поведение проверяется на шаге, посвящённом PPUDATA. Этот ранний тест чтения регистра не привязывается к старому поведению поля-заглушки data.
Почему только эти
Несколько регистров PPU в основном доступны только для записи со стороны CPU. Неподдерживаемые чтения должны явно завершаться ошибкой, а не притворяться, что все регистры PPU — это обычная RAM.
Важное замечание о будущей точности
У реальных чтений PPUSTATUS есть побочные эффекты. Чтение $2002 сбрасывает флаг VBlank и внутреннюю защёлку адреса/скроллинга. Мы намеренно пока не моделируем эти побочные эффекты. Этот шаг только создаёт базовую границу регистров.
Предлагаемый псевдокод реализации
def read_register(self, addr: int) -> int:
match addr:
case 0x2002:
return self.status
case 0x2007:
return self.data
case _:
raise ValueError(...)Запустить этот урок
uv run pytest tests/chapter_03_ppu_memory_and_graphics_data/test_226_ppu_read_register.py -v