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