NES TDD

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