109. Instruction ror 指令
实现针对内存的 ROR。
第 109 / 356 · tests/chapter_01_cpu/test_109_instruction_ror.py
在本步骤中,在第 102-108 课完成 ROL 之后,只添加 ROR 内存原语。ROR 操作码的接入属于第 111-115 课。
生产代码位置中的完整示例实现
`emulator/cpu/instructions.py::ror`::
def ror(cpu: CPU, addr: int):
value = cpu.bus.read(addr)
old_carry = int(cpu.flags.get_carry_flag())
result = (value >> 1) | (old_carry << 7)
result_8 = result & 0xFF
# Set flags
cpu.flags.set_carry_flag((value & 0x1) != 0)
cpu.flags.set_zero_flag(result_8 == 0)
cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)
cpu.bus.write(addr, result_8)本步骤存在的原因
一个与寻址方式无关的内存原语,可以为后续所有 ROR 寻址模式提供完全相同的读/改/写语义。
不变量:在修改标志位之前先采样 Carry;旧的 Carry 进入第 7 位,原始的第 0 位成为新的 Carry,结果为 8 位,Z/N 根据存储结果得出。仅有寻址到的内存字节发生变化;A 不变。
常见误解:ROR 不是 LSR。LSR 在第 7 位插入零,而 ROR 插入的是旧的 Carry;Carry 不能从移位后的结果推导得出。
不在本步骤范围内:累加器 ROR 是第 110 课,操作码/寻址接入是第 111-115 课,总线层面的周期时序是之后的工作。
运行本课
uv run pytest tests/chapter_01_cpu/test_109_instruction_ror.py -v