325. Cartridge 保留镜像信息
在 Cartridge 中保留已解码的名称表镜像元数据。
第 325 / 356 · tests/chapter_12_mirroring/test_325_cartridge_preserves_mirroring.py
需要更新的文件
emulator/cartridge/cartridge.py该步骤存在的原因
第 324 步通过以下方式解码了 iNES flags 6 第 0 位
INesHeader.is_vertical_mirroring该信息必须在解析后继续保留,以便之后的 mapper 和 PpuBus 步骤能够选择正确的名称表地址映射。
本步骤的元数据传递路径
iNES flags 6
-> INesHeader.is_vertical_mirroring
-> Cartridge.is_vertical_mirroring建议的实现改动
@dataclass
class Cartridge:
prg_rom: bytes
chr_rom: bytes
mapper_number: int
chr_ram: bytearray | None = None
# --- NEW LINE ---
is_vertical_mirroring: bool = False
# --- END NEW LINE ---
@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,
# --- NEW LINE ---
is_vertical_mirroring=ines_rom.header.is_vertical_mirroring,
# --- END NEW LINE ---
)为什么要追加一个带默认值的字段?历史上的教程代码直接使用三个或四个位置参数来构造 Cartridge。追加一个带默认值的字段可以保留这些构造方式,同时允许已解析的 ROM 提供真实的元数据。
含义
False -> horizontal mirroring
True -> vertical mirroring不在本步骤范围内
- 修改 Mapper000
- 修改 MapperInterface
- 修改 mapper_factory
- 修改 PpuBus 的名称表映射
- 四屏镜像
- 卷动
- 商业 ROM 测试夹具
运行本课
uv run pytest tests/chapter_12_mirroring/test_325_cartridge_preserves_mirroring.py -v