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