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