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