098. Lsr 零页寻址

添加 LSR Zero Page。

98 / 356 · tests/chapter_01_cpu/test_098_LSR_zero_page.py

在这一步中,通过第一个带地址的操作码暴露测试 095 中的内存 lsr

文件与符号

emulator/cpu/opcodes.py: imported lsr, lsr_zero_page, OPCODE_TABLE[0x46]

为什么需要这一步

由于测试 095 已经定义了内存 lsr,这次改动引入了它的第一个带地址操作码,并使操作数解码与指令行为保持分离。

本步骤的建议实现

# emulator/cpu/opcodes.py
from emulator.cpu.instructions import lsr

def lsr_zero_page(cpu: CPU):
    addr = zero_page(cpu)
    lsr(cpu, addr)

OPCODE_TABLE = {
    # existing entries unchanged
    0x46: lsr_zero_page,
}

重要不变量

  • zero_page(cpu) 消耗一个操作数,并生成 $0000-$00FF 范围内的地址
  • lsr 执行读取/修改/写回,并替换 C/Z/N
  • 这条两字节指令使 PC 前进两字节
  • A 保持不变

常见误解

对于 46 10,操作数 0x10 指定的是 RAM[$0010];它不是被移位的值。

本步骤不涉及

  • 测试 099-101 中的变址与绝对寻址 LSR 形式
  • zero_pagelsr 的改动
  • 周期精确的总线行为

运行本课

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