033. Ldx 零页Y变址

添加 LDX 零页Y变址($B6)。

33 / 356 · tests/chapter_01_cpu/test_033_LDX_zero_page_y.py

要更新的文件

emulator/cpu/opcodes.py

位置

opcodes.ldx_zero_page_y
opcodes.OPCODE_TABLE[$B6]

为什么需要这一步

测试 029 引入了带回绕的零页Y变址地址辅助函数。本课将它与一次内存读取和既有的 ldx 指令相结合,让该辅助函数第一次得到操作码层面的使用。

完整示例实现

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


OPCODE_TABLE = {
    # Preserve existing entries.
    0xB6: ldx_zero_page_y,
}

重要不变式

  • $B6 映射到 ldx_zero_page_y
  • 变址使用的是 Y,而不是 X
  • 基地址加 Y 的结果在总线读取之前回绕到 8 位
  • 消耗一个操作数字节,且 X 和标志的更新由 ldx 负责

常见误区

LDX 的目标寄存器并不会决定变址寄存器:这个编码使用 Y,且 $FF,Y 在 Y=$01 时读取的是 $0000 而不是 $0100。

超出范围

  • 修改 zero_page_y 或 ldx
  • 绝对寻址的 LDX 编码
  • 周期时序

运行本课

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