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