324. Флаг вертикального зеркалирования iNES

Декодировать горизонтальное/вертикальное зеркалирование nametable из бита 0 flags 6 iNES.

Урок 324 из 356 · tests/chapter_12_mirroring/test_324_ines_vertical_mirroring_flag.py

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

emulator/cartridge/ines.py

Справочный материал

https://www.nesdev.org/wiki/Mirroring#Nametable_Mirroring

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

Прежде чем реализовывать область просмотра прокрутки, эмулятор должен знать, как картридж подключает логические nametable PPU к физической RAM nametable.

Зеркалирование визуально не переворачивает изображение. Оно управляет отображением памяти между четырьмя логическими областями nametable:

$2000
$2400
$2800
$2C00

Бит 0 flags 6 iNES выбирает базовый режим зеркалирования:

bit 0 clear -> horizontal mirroring
bit 0 set   -> vertical mirroring

Для текущего инкрементального объёма работы предоставим это как одно булево свойство

is_vertical_mirroring is False -> horizontal
is_vertical_mirroring is True  -> vertical

Пример предлагаемой реализации

FLAGS6_VERTICAL_MIRRORING = 1 << 0


@dataclass(frozen=True)
class INesHeader:
    prg_rom_banks: int
    chr_rom_banks: int
    mapper_number: int
    has_trainer: bool
    flags_6: int
    flags_7: int

    @property
    def is_vertical_mirroring(self) -> bool:
        return (self.flags_6 & FLAGS6_VERTICAL_MIRRORING) != 0

Почему вычисляемое свойство? flags_6 остаётся единственным источником истины, а существующий конструктор INesHeader менять не нужно. Это сохраняет совместимость со старыми вызывающими кодами и тестами из туториала.

Будущее расширение

Четырёхэкранное зеркалирование позже сможет добавить свойство is_four_screen, проверяемое перед is_vertical_mirroring. Хранение и маршрутизация для четырёхэкранного режима здесь не реализуются.

Вне рамок

  • изменение Cartridge
  • изменение Mapper000
  • изменение отображения nametable в PpuBus
  • четырёхэкранная RAM nametable
  • прокрутка
  • фикстуры коммерческих ROM

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

uv run pytest tests/chapter_12_mirroring/test_324_ines_vertical_mirroring_flag.py -v