006. Fakerom

为 CPU 测试创建可写的 FakeROM 存储。

6 / 356 · tests/chapter_01_cpu/test_006_FakeROM.py

需要创建的文件

emulator/memory/fake_rom.py

位置

class FakeROM(MemoryDevice)

此步骤存在的原因

在真正的卡带解析功能就绪之前,指令测试需要确定的程序字节。FakeROM 将最大 $8000-$FFFF 的 PRG 窗口建模为 0x8000 个本地字节,并允许测试直接填充其内容。

完整示例实现

from dataclasses import dataclass, field

from emulator.memory.memory_device import MemoryDevice


@dataclass
class FakeROM(MemoryDevice):
    _data: bytearray = field(
        default_factory=lambda: bytearray(0x8000),
        init=False,
    )

    def read(self, addr: int) -> int:
        return self._data[addr]

    def write(self, addr: int, value: int) -> None:
        self._data[addr] = value

重要不变量

  • FakeROM 恰好存储 0x8000 字节
  • 其地址是本地偏移 $0000-$7FFF
  • 写入操作仅用于安排测试程序和数据

常见误解

FakeROM 不是真正的卡带映射器,它的写入方法并不意味着 NES 的 PRG ROM 是可写的。它只是受控的测试基础设施。

范围之外

  • 将 FakeROM 映射到 CPU 地址
  • iNES 解析
  • 存储体切换(bank switching)

运行本课

uv run pytest tests/chapter_01_cpu/test_006_FakeROM.py -v