159. CPY 指令

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

159 / 356 · tests/chapter_01_cpu/test_159_instruction_cpy.py

此步骤存在的原因

CPY 需要一个面向数值的比较原语,使每种寻址方式都使用相同的无借位、相等以及回绕减法标志规则。

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

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

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

该减法回绕仅仅是为了推导出负数标志;进位标志表示没有发生无符号借位,零标志表示相等。Y、操作数、内存、A、X、PC 和溢出标志都不受影响,因为 CPY 不会存储任何减法结果。

常见误解:CPY 既不会消耗已有的进位标志,也不会把结果写回 Y。超出范围:将 `cpy 导入 emulator/cpu/opcodes.py` 及其立即数、零页和绝对寻址处理函数(课程 160-162)。

运行本课

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