110. Instruction ror a 指令
实现针对累加器的 ROR。
第 110 / 356 · tests/chapter_01_cpu/test_110_instruction_ror_a.py
在本步骤中,以第 109 课中针对内存的 `ror 为前置条件,只添加 ror_a。操作码 0x6A` 推迟到第 111 课。
生产代码位置中的完整示例实现
`emulator/cpu/instructions.py::ror_a`::
def ror_a(cpu: CPU):
value = cpu.a
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.a = result_8本步骤存在的原因
累加器模式没有有效地址,因此需要一个具有与内存 ROR 相同的“经 Carry 旋转”语义的寄存器原语。
不变量:先采集旧的 Carry 并将其送入第 7 位;原始 A 的第 0 位成为新的 Carry;A 保持 8 位;Z/N 描述新的 A;内存不受影响。
常见误解:A 是寄存器值,而不是传给 `ror` 的地址。将其传入内存原语会旋转 RAM[A],而不是累加器本身。
不在本步骤范围内:`0x6A` 的分派是第 111 课,内存操作码寻址模式是第 112-115 课,时序/周期精度是之后的工作。
运行本课
uv run pytest tests/chapter_01_cpu/test_110_instruction_ror_a.py -v