096. Lsr 累加器指令

添加 LSR 累加器指令行为。

96 / 356 · tests/chapter_01_cpu/test_096_instruction_lsr_a.py

在这一步中,在测试 095 的内存原语之后,添加以累加器为目标的 LSR 行为。

文件与符号

emulator/cpu/instructions.py: lsr_a

为什么需要这一步

累加器 LSR 与测试 095 共享移位和标志位逻辑,但数据目标不同,因此必须更新 cpu.a,而不能把该寄存器当作地址处理。

本步骤的建议实现

# emulator/cpu/instructions.py
def lsr_a(cpu: CPU):
    value = cpu.a
    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.a = result_8

重要不变量

  • 原 A 的第 0 位替换 Carry
  • Zero 依据最终的 A 值,Negative 始终被清零
  • 不会发生任何总线读取或写入
  • 地址数值上等于原 A 的那处内存保持不变

常见误解

cpu.a 本身既是值也是目标,而不是要传给内存 lsr 的地址。

本步骤不涉及

  • 测试 097 中操作码 0x4A 的接入
  • 测试 098-101 中的内存寻址操作码
  • 重构共享的 LSR 逻辑或添加周期时序

运行本课

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