210. Cpu 验证

验证已完成的 CPU 指令切片。

210 / 356 · tests/chapter_01_cpu/test_210_CPU_VERIFICATION.py

在本步骤中,整合现有的 `emulator/cpu/cpu.py::CPU.reset/CPU.stepemulator/cpu/opcodes.py::OPCODE_TABLEemulator/cpu/instructions.py 中的指令符号 ldaldxldystastxstyadcsbcincdecand_aor_aor_ebitcmpbeqbnephaplaphpplpasl_alsr_arol_aror_ataxtxataytyatxstsxinxdexinydeyjsrrtsclcseccldsedclvcliseinop,以及 emulator/bus/cpu_bus.py::CpuBus.read/writeemulator/memory/fake_rom.py::FakeROM.read/write`。

完整的变更是测试支持,添加到 `tests/helpers.py`:

from emulator.memory.fake_rom import FakeROM

def make_cpu_with_rom():
    rom = FakeROM()
    bus = CpuBus(program_rom=rom)
    return CPU(bus), bus, rom

def write_reset_vector(rom, addr: int):
    rom.write(0x7FFC, addr & 0xFF)
    rom.write(0x7FFD, (addr >> 8) & 0xFF)

def load_program(rom, start_addr: int, program: list[int]):
    for offset, byte in enumerate(program):
        rom.write((start_addr - 0x8000) + offset, byte)

本步骤存在的原因

尽管本次验证没有添加任何生产实现代码,但简短的字节程序能够暴露出被单独操作测试所掩盖的集成缺陷。不变式包括:由 CPU.step 顺序拥有 PC、栈的收支平衡、以操作数之后的 PC 为基准的分支目标、对无关标志的保留,以及在寻址位置写入 RAM。误解在于:认为通过了独立的指令测试就证明了分派、PC、栈和标志之间的交互也能正确组合。

范围之外:跟踪格式化器属于步骤 211。iNES 读取器、卡带/NROM 映射、PPU、VBlank 和 NMI 属于后续步骤,此处不得提前涉及。

运行本课

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