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