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