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