008. CPU 复位向量

根据复位向量初始化 CPU 状态。

8 / 356 · tests/chapter_01_cpu/test_008_cpu_reset_vector.py

需要更新的文件

emulator/cpu/cpu.py

位置

CPU.reset

参考

https://www.nesdev.org/wiki/CPU_power_up_state

此步骤存在的原因

CPU 并不会直接选择自己的程序起始地址。复位时,它会通过 CpuBus 从 CPU 地址 $FFFC-$FFFD 读取一个小端 16 位向量。

完整示例实现

class CPU:
    # Keep the constructor and fetch helpers from Test 004.

    def reset(self) -> None:
        low = self.bus.read(0xFFFC)
        high = self.bus.read(0xFFFD)

        self.pc = low | (high << 8)
        self.s = 0xFD
        self.p = 0x04

重要不变量

  • 向量的低字节来自 $FFFC
  • 向量的高字节来自 $FFFD
  • 复位过程通过总线读取,而不是直接索引 FakeROM

最小示例

FakeROM 偏移 $7FFC=$00 和 $7FFD=$80 会出现在 CPU 地址 $FFFC-$FFFD 处,并把 PC 设置为 $8000。因此下一次取值会读取 FakeROM 偏移 $0000。

常见误解

复位过程在读取向量时不得递增 PC。它是从固定的总线地址直接给 PC 赋值;指令取值在此之后才开始。

范围之外

  • 操作码分发
  • 中断进入
  • 周期计时

运行本课

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