035. Ldx 绝对Y变址

添加 LDX 绝对Y变址($BE)。

35 / 356 · tests/chapter_01_cpu/test_035_LDX_absolute_y.py

要更新的文件

emulator/cpu/opcodes.py

位置

opcodes.ldx_absolute_y
opcodes.OPCODE_TABLE[$BE]

为什么需要这一步

本课通过复用既有的绝对Y变址辅助函数,补全了现阶段可用的 LDX 操作码家族。与其他基于内存的形式一样,处理函数先解析并读取操作数,再把它的值传给 ldx

完整示例实现

# emulator/cpu/opcodes.py
def ldx_absolute_y(cpu: CPU):
    addr = absolute_y(cpu)
    value = cpu.bus.read(addr)
    ldx(cpu, value)


OPCODE_TABLE = {
    # Preserve existing entries.
    0xBE: ldx_absolute_y,
}

重要不变式

  • $BE 映射到 ldx_absolute_y
  • 小端序的基地址用 Y 而不是 X 进行变址
  • 变址后地址处的字节被传给 ldx
  • 消耗两个操作数字节,因此整条指令使 PC 前进 3 字节

常见误区

不要让绝对Y变址在 $00 页内回绕;与零页Y变址不同,它变址后的地址是一个 16 位结果。

超出范围

  • 存储 X 和加载 Y 的指令
  • 对 absolute_y 或 ldx 的改动
  • 周期时序和跨页惩罚

运行本课

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