103. Instruction rol a 指令

实现针对累加器的 ROL。

103 / 356 · tests/chapter_01_cpu/test_103_instruction_rol_a.py

在本步骤中,以第 102 课中针对内存的 `rol` 为前置条件,只添加寄存器变体。分派工作推迟到第 104 课。

生产代码位置中的完整示例实现

`emulator/cpu/instructions.py::rol_a`::

def rol_a(cpu: CPU):
    value = cpu.a
    old_carry = int(cpu.flags.get_carry_flag())

    result = (value << 1) | old_carry
    result_8 = result & 0xFF

    # Set flags

    cpu.flags.set_carry_flag((value & 0b1000_0000) != 0)
    cpu.flags.set_zero_flag(result_8 == 0)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)

    cpu.a = result_8

本步骤存在的原因

累加器模式没有有效内存地址,因此需要一个专门的原语,在写入 `cpu.a` 的同时保持相同的旋转语义。

不变量:先采样旧的 Carry 并将其送入第 0 位;原始 A 的第 7 位成为新的 Carry;A 被限制为 8 位;Z/N 描述新的 A;不会发生总线写入。

常见误解:`cpu.a 是一个值,而不是可以传给 rol` 的地址。这样做会修改地址 A 处的内存,而寄存器本身保持不变。

不在本步骤范围内:映射操作码 `0x2A` 是第 104 课,内存寻址模式是第 105-108 课,ROR 从第 109 课开始,时序/周期精度是之后的工作。

运行本课

uv run pytest tests/chapter_01_cpu/test_103_instruction_rol_a.py -v