116. Инструкция AND для аккумулятора

реализовать поведение AND, не зависящее от режима адресации.

Урок 116 из 356 · tests/chapter_01_cpu/test_116_instruction_and_a.py

На этом шаге добавьте только `and_a в emulator/cpu/instructions.py`. Импорт кодов операций и режимы адресации AND будут рассмотрены в уроках 117-124.

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

Определение AND как примитива, работающего со значением, сохраняет семантику аккумулятора и флагов в одном месте, чтобы каждый обработчик режима адресации мог единообразно их переиспользовать.

Предлагаемая реализация

def and_a(cpu: CPU, value: int):
    result_8 = (cpu.a & value) & 0xFF

    # Flags:
    cpu.flags.set_zero_flag(result_8 == 0)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)

    cpu.a = result_8

Сигнатура, ориентированная на значение, отделяет семантику инструкции от декодирования адреса. Результат ограничен восемью битами и сохраняется в A, Zero отражает равенство результата нулю, а Negative — бит 7 результата. Carry, Overflow, память, X, Y и PC остаются инвариантными, поскольку эта функция никогда их не затрагивает.

Заблуждение: `value — это не адрес для чтения через cpu.bus; такие чтения выполняют обработчики кодов операций. Вне области задачи: импорт and_a в emulator/cpu/opcodes.py` и все коды операций AND (уроки 117-124), а также символы ORA, EOR и BIT в уроках 125-145.

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

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