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