004. CPU 初始化

创建基本的 CPU 状态和取值辅助方法。

4 / 356 · tests/chapter_01_cpu/test_004_cpu_init.py

需要更新的文件

emulator/cpu/cpu.py

位置

class CPU

参考

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

此步骤存在的原因

CPU 在能够取指或执行指令之前,需要显式的寄存器和一个总线依赖。取值操作会推进程序计数器,因为指令字节是按顺序消费的。

完整示例实现

from dataclasses import dataclass

from emulator.bus.cpu_bus import CpuBus


@dataclass
class CPU:
    bus: CpuBus
    a: int = 0
    x: int = 0
    y: int = 0
    pc: int = 0
    s: int = 0
    p: int = 0

    def fetch_byte(self) -> int:
        value = self.bus.read(self.pc)
        self.pc += 1
        return value

    def fetch_word(self) -> int:
        low = self.fetch_byte()
        high = self.fetch_byte()
        return low | (high << 8)

重要不变量

  • CPU 保留调用方提供的确切总线对象
  • fetch_byte 会将 PC 前移一个字节
  • fetch_word 先消费低字节,并将 PC 前移两个字节

常见误解

小端存储改变的是内存中的字节顺序,而不是最终的数值结果。字节 $34 之后是 $12,得到的整数是 $1234。

范围之外

  • 复位向量行为
  • 操作码解码
  • 与硬件完全一致的上电寄存器值

运行本课

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