216. 解析 iNES ROM
添加
第 216 / 356 · tests/chapter_02_rom_loading/test_216_parse_ines_rom.py
添加 emulator/cartridge/ines.py::parse_ines_rom。
此步骤存在的原因
该函数把文件头中的声明转化为干净的 PRG/CHR 切片,使后续的 Cartridge 与映射器代码无需理解 iNES 文件头或训练器偏移量。它用到了第 212-215 课的全部格式常量和解析器模型。
建议实现
def parse_ines_rom(data: bytes) -> INesRom:
header = parse_ines_header(data)
prg_size = header.prg_rom_banks * PRG_ROM_BANK_SIZE
chr_size = header.chr_rom_banks * CHR_ROM_BANK_SIZE
prg_start = INES_HEADER_SIZE + (
TRAINER_SIZE if header.has_trainer else 0
)
prg_end = prg_start + prg_size
chr_start = prg_end
chr_end = chr_start + chr_size
if len(data) < chr_end:
raise ValueError(
"iNES data is too short for declared PRG/CHR ROM"
)
return INesRom(
header=header,
prg_rom=data[prg_start:prg_end],
chr_rom=data[chr_start:chr_end],
)不变量:尺寸来自存储体数量;PRG 紧跟在文件头和可选的 512 字节训练器之后开始;CHR 紧接在 PRG 之后;并且在切片之前,所有声明的字节都必须实际存在。不要依赖 Python 切片对过短数据的宽容处理,否则会悄无声息地接受一个被截断的镜像文件。
此步骤范围之外
1. Extra trailing-byte policy and CHR RAM allocation are not introduced here.
2. Lesson 217 constructs a `Cartridge` from this parser result.
3. Lessons 218-220 add mapper behavior and mapper selection.运行本课
uv run pytest tests/chapter_02_rom_loading/test_216_parse_ines_rom.py -v