154. CMP (indirect),Y

添加 CMP (indirect),Y 操作码 ``0xD1``。

154 / 356 · tests/chapter_01_cpu/test_154_CMP_indirect_y.py

此步骤存在的原因

(indirect),Y 形式通过对已解析的零页指针本身(而非指针所在位置)进行索引,完成了 CMP 的寻址方式。

在此步骤中,通过向 `emulator/cpu/opcodes.py` 添加以下内容,完成 CMP 操作码序列:

def cmp_indirect_y(cpu: CPU):
    addr = indirect_y(cpu)
    value = cpu.bus.read(addr)
    cmp(cpu, value)

OPCODE_TABLE = {
    ...
    0xD1: cmp_indirect_y,
}

`emulator/cpu/addressing_modes.py::indirect_y` 从零页读取一个小端序指针(指针高字节查找会回绕),然后将 Y 加到该 16 位地址上。只有 C/Z/N 会改变;A、Y、指针字节、目标内存和溢出标志保持不变;操作码加操作数使 PC 前进两个字节。

常见误解:与 (indirect,X) 不同,Y 是在指针解引用之后才被加上的,而不是加到零页操作数上。超出范围:课程 155-162 中的 CPX 和 CPY。

运行本课

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