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