155. CPX 指令

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

155 / 356 · tests/chapter_01_cpu/test_155_instruction_cpx.py

此步骤存在的原因

在添加特定寻址方式的操作码之前,CPX 需要一个面向数值的定义,统一处理无借位、相等以及回绕减法这几个标志。

在此步骤中,在所有 CMP 课程之后,将以下符号准确地添加到 `emulator/cpu/instructions.py`:

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

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

该回绕减法的存在只是为了推导出负数标志。进位标志表示没有发生无符号借位(X >= value),零标志表示相等。X、操作数、内存、A、Y、PC 和溢出标志都不受影响,因为没有结果被存储,这些位置都未被触及。

常见误解:CPX 不是 SBC,既不会消耗进位标志,也不会把减法结果写回 X。超出范围:将 `cpx 导入 emulator/cpu/opcodes.py` 及其立即数、零页和绝对寻址处理函数(课程 156-158),以及 CPY(159-162)。

运行本课

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