326. Mapper сохраняет зеркалирование
Передать метаданные зеркалирования nametable из Cartridge в Mapper000.
Урок 326 из 356 · tests/chapter_12_mirroring/test_326_mapper_preserves_mirroring.py
Файлы для обновления
emulator/cartridge/mapper000.py
emulator/cartridge/mapper_factory.py
emulator/cartridge/mapper_interface.pyЗачем нужен этот шаг
PpuBus уже получает маппер картриджа. Предоставление зеркалирования через маппер сохраняет единый путь владения аппаратной частью картриджа:
INesHeader
-> Cartridge
-> Mapper000
-> PpuBus (next step)Это предпочтительнее, чем отдельно соединять Cartridge напрямую с PpuBus. Будущие мапперы могут управлять зеркалированием через регистры маппера, поэтому маппер — это полезная долгосрочная граница.
Предлагаемые изменения реализации
# emulator/cartridge/mapper000.py
@dataclass
class Mapper000:
prg_rom: bytes
chr_rom: bytes
# --- NEW LINE ---
is_vertical_mirroring: bool = False
# --- END NEW LINE ---
...
# emulator/cartridge/mapper_factory.py
def create_mapper(cartridge: Cartridge):
if cartridge.mapper_number == 0:
return Mapper000(
prg_rom=cartridge.prg_rom,
chr_rom=cartridge.chr_rom,
# --- NEW LINE ---
is_vertical_mirroring=cartridge.is_vertical_mirroring,
# --- END NEW LINE ---
)
...
# emulator/cartridge/mapper_interface.py
class MapperInterface(Protocol):
# --- NEW LINE ---
is_vertical_mirroring: bool
# --- END NEW LINE ---
def read_prg(self, addr: int) -> int:
...Совместимость аннотаций
Протокол может использовать непосредственные аннотации или from __future__ import annotations. Исполняемый тест разрешает аннотации типов перед проверкой того, что зеркалирование является булевым значением, поэтому контракт не зависит от того, хранит ли Python аннотацию как bool или как строку "bool".
Зачем добавлять поле со значением по умолчанию в Mapper000? Исторические тесты и код туториала создают Mapper000 только с PRG и CHR ROM. Добавление значения по умолчанию False сохраняет этот конструктор и означает горизонтальное зеркалирование, если метаданные не переданы.
Значение
False -> horizontal mirroring
True -> vertical mirroringВне рамок
- изменение отображения адресов в PpuBus
- изменение владения CpuBus
- четырёхэкранное зеркалирование
- прокрутка
- фикстуры коммерческих ROM
Запустить этот урок
uv run pytest tests/chapter_12_mirroring/test_326_mapper_preserves_mirroring.py -v