146. 指令 cmp

实现与寻址方式无关的 CMP 行为。

146 / 356 · tests/chapter_01_cpu/test_146_instruction_cmp.py

此步骤存在的原因

在添加任何寻址模式之前,CMP 需要一个面向数值的定义,来统一描述无借位的 Carry、表示相等的 Zero,以及基于回绕减法的 Negative 语义。

在此步骤中,在各寻址特定的比较课程之前,请在 `emulator/cpu/instructions.py` 中准确添加以下符号:

def cmp(cpu: CPU, value: int):
    result_8 = (cpu.a - value) & 0xFF

    # Flags:
    cpu.flags.set_carry_flag(cpu.a >= value)
    cpu.flags.set_zero_flag(cpu.a == value)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) !=0)

CMP 执行一次无符号比较,同时只将回绕减法用于推导 N。 C 表示无借位(A >= value),Z 表示相等,N 为结果的第 7 位。 A、Overflow、内存、X、Y 和 PC 保持不变。

常见误解:当 A 不小于操作数时,Carry 是被置位而不是被清零,并且减法结果永远不会被存储。 超出范围:导入 `cmp` 以及各 CMP 操作码属于第 147 课及之后的课程;CPX/CPY 属于第 155-162 课。

运行本课

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