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