065. SBC 零页,X

添加 SBC 零页,X。

65 / 356 · tests/chapter_01_cpu/test_065_SBC_zero_page_x.py

要更新的文件

emulator/cpu/opcodes.py

要添加/更新的符号

opcodes.sbc_zero_page_x and OPCODE_TABLE[0xF5]

为什么需要这一步

SBC 现在通过将现有的 zero_page_x 解析器与一次内存读取以及现有的 sbc 指令组合,获得了零页变址访问能力。

完整示例实现

# emulator/cpu/opcodes.py
def sbc_zero_page_x(cpu: CPU):
    addr = zero_page_x(cpu)
    value = cpu.bus.read(addr)
    sbc(cpu, value)

OPCODE_TABLE = {
    # ... existing entries ...
    0xF5: sbc_zero_page_x,
}

重要不变量

  • zero_page_x 取出一个操作数,加上 X,并在第 $00 页内回绕
  • 处理函数对解析出的地址恰好读取一次
  • 传给 sbc 的是读取到的数值,而不是它的地址
  • 执行这条两字节指令会使 PC 前进两个字节

常见误解

不要在操作码包装器中重复实现变址,也不要让 $FF + X 进入第 $01 页;回绕已经是 zero_page_x 的职责。

范围之外

  • 绝对和间接的 SBC 包装器
  • 对寻址辅助函数或 SBC 算术的更改
  • 周期时序

运行本课

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