095. Lsr 指令

添加 LSR 内存指令行为。

95 / 356 · tests/chapter_01_cpu/test_095_instruction_lsr.py

在这一步中,只添加以内存为目标的 LSR 行为。累加器行为与操作码接入将在测试 096-101 中完成。

文件与符号

emulator/cpu/instructions.py: lsr

为什么需要这一步

在接入寻址模式处理函数之前,指令层必须先定义一次 LSR 的读取/修改/写回与标志位语义。这次改动仅涉及内存。

本步骤的建议实现

# emulator/cpu/instructions.py
def lsr(cpu: CPU, addr: int):
    value = cpu.bus.read(addr)
    result = value >> 1
    result_8 = result & 0xFF

    # Set flags
    cpu.flags.set_carry_flag((value & 0x01) != 0)
    cpu.flags.set_negative_flag(False)
    cpu.flags.set_zero_flag(result_8 == 0)

    cpu.bus.write(addr, result_8)

重要不变量

  • Carry 由原第 0 位替换得到,即使该位为 0 也会被清除
  • Zero 基于最终的 8 位结果,Negative 始终被清零
  • 只精确读取并写回所提供的内存地址;A 保持不变
  • 逻辑右移在第 7 位引入 0

常见误解

Carry 并非来自结果,Negative 也不是从原第 7 位复制而来。

本步骤不涉及

  • 测试 096 中的累加器行为以及测试 097-101 中的操作码接入
  • 周期精确的读取/修改/写回时序
  • asl_a 无关的清理工作

运行本课

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