325. Cartridge сохраняет зеркалирование

Сохранить декодированные метаданные зеркалирования nametable в Cartridge.

Урок 325 из 356 · tests/chapter_12_mirroring/test_325_cartridge_preserves_mirroring.py

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

emulator/cartridge/cartridge.py

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

Шаг 324 декодирует бит 0 flags 6 iNES через

INesHeader.is_vertical_mirroring

Эта информация должна сохраняться после парсинга, чтобы более поздние шаги для маппера и PpuBus могли выбрать правильное отображение адресов nametable.

Путь метаданных для этого шага

iNES flags 6
    -> INesHeader.is_vertical_mirroring
    -> Cartridge.is_vertical_mirroring

Предлагаемые изменения реализации

@dataclass
class Cartridge:
    prg_rom: bytes
    chr_rom: bytes
    mapper_number: int
    chr_ram: bytearray | None = None

    # --- NEW LINE ---
    is_vertical_mirroring: bool = False
    # --- END NEW LINE ---


@classmethod
def from_ines_bytes(cls, data: bytes) -> "Cartridge":
    ines_rom = parse_ines_rom(data)

    return cls(
        prg_rom=ines_rom.prg_rom,
        chr_rom=ines_rom.chr_rom,
        mapper_number=ines_rom.header.mapper_number,

        # --- NEW LINE ---
        is_vertical_mirroring=ines_rom.header.is_vertical_mirroring,
        # --- END NEW LINE ---
    )

Зачем добавлять поле со значением по умолчанию? Исторический код туториала напрямую создаёт Cartridge с тремя или четырьмя позиционными аргументами. Добавление поля со значением по умолчанию сохраняет эти формы конструктора, позволяя при этом разобранным ROM предоставлять реальные метаданные.

Значение

False -> horizontal mirroring
True  -> vertical mirroring

Вне рамок

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

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

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