217. 由 iNES 构建 Cartridge

创建

217 / 356 · tests/chapter_02_rom_loading/test_217_cartridge_from_ines.py

创建 emulator/cartridge/cartridge.py::Cartridge

此步骤存在的原因

iNES 解析器负责文件布局方面的事务;这个类则暴露模拟器所需的 PRG 字节、CHR 字节、映射器标识以及可选的 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、映射器编号,然后是 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