217. Cartridge a partir de iNES

crea

Lección 217 de 356 · tests/chapter_02_rom_loading/test_217_cartridge_from_ines.py

crea emulator/cartridge/cartridge.py::Cartridge.

Por qué existe este paso

El analizador iNES se ocupa de las cuestiones de disposición del archivo; esta clase expone los bytes de PRG, los bytes de CHR, la identidad del mapper y el almacenamiento opcional de CHR-RAM que necesita el emulador. from_ines_bytes es la frontera entre esas representaciones y depende del analizador completado en la lección 216.

Implementación sugerida para esta lección

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

Invariantes: la clase de esta lección es inmutable (frozen); el orden de campos requerido es PRG, CHR, número de mapper y, después, CHR RAM; y la construcción copia los valores analizados sin traducir direcciones. El campo chr_ram es obligatorio en la forma de la dataclass, pero su valor es opcional y por defecto vale None.

Fuera de alcance para este paso

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.

Ejecutar esta lección

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