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