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