123. AND, косвенная адресация с X

добавить опкод AND (indirect,X) ``0x21``.

Урок 123 из 356 · tests/chapter_01_cpu/test_123_AND_indirect_x.py

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

AND требует предындексированной косвенной адресации для таблиц указателей в нулевой странице, при этом разрешение указателя остаётся вопросом адресации, а не логического поведения.

На этом шаге, после ранее рассмотренных режимов AND, добавьте в `emulator/cpu/opcodes.py` ровно следующее:

def and_indirect_x(cpu: CPU):
    addr = indirect_x(cpu)
    value = cpu.bus.read(addr)
    and_a(cpu, value)

OPCODE_TABLE = {
    ...
    0x21: and_indirect_x,
}

`emulator/cpu/addressing_modes.py::indirect_x считывает операнд, вычисляет ptr = (base + cpu.x) & 0xFF и читает указатель в порядке little-endian из ptr и (ptr + 1) & 0xFF. Обработчик читает значение по этому итоговому адресу и вызывает instructions.and_a`. A и Z/N изменяются; X, флаг переноса/переполнения, байты указателя и целевая память не меняются; PC продвигается на два байта.

Заблуждение: в (indirect,X) X применяется до разыменования, а не к итоговому 16-битному адресу. Вне рамок: AND (indirect),Y (урок 124) и вся последующая работа над ORA/EOR/BIT.

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

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