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