154. Cmp indirect y

добавить опкод CMP (indirect),Y ``0xD1``.

Урок 154 из 356 · tests/chapter_01_cpu/test_154_CMP_indirect_y.py

Зачем нужен этот шаг

Форма (indirect),Y завершает адресацию CMP, индексируя уже разрешённый указатель в нулевой странице, а не само место расположения указателя.

На этом шаге завершите последовательность опкодов CMP, добавив в `emulator/cpu/opcodes.py`:

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` считывает указатель в порядке little-endian из нулевой страницы (с переносом при поиске старшего байта указателя), затем прибавляет Y к этому 16-битному адресу. Меняются только C/Z/N; A, Y, байты указателя, целевая память и Overflow не изменяются; опкод вместе с операндом сдвигают PC на два байта.

Заблуждение: в отличие от (indirect,X), Y прибавляется после разыменования указателя, а не к операнду в нулевой странице. Вне рамок: CPX и CPY в уроках 155-162.

Запустить этот урок

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