213. Датакласс заголовка iNES

добавьте

Урок 213 из 356 · tests/chapter_02_rom_loading/test_213_ines_header_dataclass.py

добавьте emulator/cartridge/ines.py::INesHeader.

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

Этот объект даёт имена неизменяемым метаданным из первых 16 байт и сохраняет исходные флаги для последующих возможностей формата, вместо того чтобы заставлять нижележащий код заново разбирать исходные байты. Константы формата из урока 212 — необходимый словарь для представленного здесь заголовка.

Предлагаемая реализация после констант из урока 212

from dataclasses import dataclass


@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

Инварианты: порядок полей точный, а датакласс заморожен, поскольку разобранные метаданные — это факт о файле. prg_rom_banks и chr_rom_banks остаются количествами, а не длиной в байтах. Не отбрасывайте flags_6/flags_7 после вычисления значений trainer и mapper.

Вне рамок этого шага

1. Lesson 214 parses and validates the header bytes.
2. Lessons 215-216 represent and extract the ROM sections.
3. Mapper behavior and interpretation of mirroring bits come later.

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

uv run pytest tests/chapter_02_rom_loading/test_213_ines_header_dataclass.py -v