217. Cartridge из iNES

создайте

Урок 217 из 356 · tests/chapter_02_rom_loading/test_217_cartridge_from_ines.py

создайте emulator/cartridge/cartridge.py::Cartridge.

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

Парсер iNES отвечает за вопросы структуры файла; этот класс предоставляет байты PRG, байты CHR, идентичность mapper и опциональное хранилище CHR-RAM, нужные эмулятору. from_ines_bytes — это граница между этими представлениями, и он зависит от парсера, завершённого в уроке 216.

Предлагаемая реализация для этого урока

from dataclasses import dataclass
from typing import Optional
from emulator.cartridge.ines import parse_ines_rom


@dataclass(frozen=True)
class Cartridge:
    prg_rom: bytes
    chr_rom: bytes
    mapper_number: int
    chr_ram: Optional[bytearray] = None

    @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,
        )

Инварианты: класс этого урока заморожен; требуемый порядок полей — PRG, CHR, номер mapper, затем CHR RAM; конструирование копирует разобранные значения без трансляции адресов. Поле chr_ram обязательно по форме датакласса, но его значение опционально и по умолчанию равно None.

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

1. Lessons 218-219 put PRG and CHR address translation on `Mapper000`.
2. Lesson 220 selects a mapper from the cartridge metadata.
3. Lessons 221-222 route CPU-bus reads through that mapper.
4. Mirroring metadata and writable graphics behavior come later.

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

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