046. Ldy 绝对,X

添加 LDY 绝对,X 寻址($BC)。

46 / 356 · tests/chapter_01_cpu/test_046_LDY_absolute_x.py

要更新的文件

emulator/cpu/opcodes.py

位置

opcodes imports of absolute_x and ldy
opcodes.ldy_absolute_x
opcodes.OPCODE_TABLE[$BC]

为什么需要这一步

本课通过复用绝对,X 地址解析来完成 LDY 操作码家族,然后读取有效地址并套用已有的 ldy 行为。

完整示例实现

# emulator/cpu/opcodes.py
from emulator.cpu.addressing_modes import absolute_x
from emulator.cpu.instructions import ldy


def ldy_absolute_x(cpu: CPU):
    addr = absolute_x(cpu)
    value = cpu.bus.read(addr)
    ldy(cpu, value)


OPCODE_TABLE = {
    # Preserve existing entries.
    0xBC: ldy_absolute_x,
}

重要不变量

  • $BC 映射到 ldy_absolute_x 并消耗两个操作数字节
  • 加到解码出的 16 位基址上的是 X,而不是 Y
  • 有效地址会先被读取,其值再传递给 ldy
  • ldy 根据加载到的字节更新 Zero 和 Negative

常见误区

LDY 绝对,X 不会用目的寄存器 Y 进行变址;该编码明确使用的是 X。

范围之外

  • STY 操作码处理函数
  • 跨页周期惩罚
  • 对 absolute_x 的修改

运行本课

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