153. CMP (indirect,X)

添加 CMP (indirect,X) 操作码 ``0xC1``。

153 / 356 · tests/chapter_01_cpu/test_153_CMP_indirect_x.py

此步骤存在的原因

(indirect,X) 形式让 CMP 能够使用预索引的零页指针表,而将指针解析交给寻址辅助函数处理。

在此步骤中,在课程 146-152 之后,将以下内容准确地添加到 `emulator/cpu/opcodes.py`:

def cmp_indirect_x(cpu: CPU):
    addr = indirect_x(cpu)
    value = cpu.bus.read(addr)
    cmp(cpu, value)

OPCODE_TABLE = {
    ...
    0xC1: cmp_indirect_x,
}

`emulator/cpu/addressing_modes.py::indirect_x 读取操作数,计算 (base + X) & 0xFF`,并读取一个小端序指针,其高字节查找同样在零页内回绕。随后处理函数读取该指针指向的值。只有 C/Z/N 会改变;A、X、指针字节、目标内存和溢出标志保持不变;操作码加操作数使 PC 前进两个字节。

常见误解:X 是在解引用之前应用的,而不是应用到最终的 16 位地址上。超出范围:CMP (indirect),Y(154)以及 CPX/CPY(155-162)。

运行本课

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