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