089. Инструкция asl a

Добавить поведение ASL для аккумулятора.

Урок 89 из 356 · tests/chapter_01_cpu/test_089_instruction_asl_a.py

На этом шаге добавьте только asl_a, используя форму для памяти из теста 088 как контекст и оставляя отображение опкода ASL тестам 090-094.

Расположение в продакшн-коде и символ

emulator/cpu/instructions.py: `asl_a(cpu: CPU)`

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

ASL A имеет те же правила для битов и флагов, что и ASL для памяти, но её назначением является аккумулятор. Отдельная функция позволяет не притворяться, что A — это адрес на шине.

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

def asl_a(cpu: CPU):
    value = cpu.a
    result = cpu.a << 1
    result_8 = result & 0xFF

    # Set flags
    cpu.flags.set_carry_flag((value & 0b1000_0000) != 0)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)
    cpu.flags.set_zero_flag(result_8 == 0)

    cpu.a = result_8

Важные инварианты

  • Carry получает исходный бит 7 регистра A
  • A маскируется до восьми бит; Z и N используют этот замаскированный результат
  • адрес в памяти не декодируется, и ни одна ячейка на шине не изменяется
  • флаги, кроме C, Z и N, сохраняются

Частое заблуждение

Не вызывайте asl(cpu, cpu.a) для памяти: значение аккумулятора — это данные, а не адрес, и ASL A не должна затрагивать память.

Вне рамок

  • импорт asl_a и отображение опкода 0x0A (тест 090)
  • обёртки и отображения опкодов для памяти (тесты 091-094)
  • тайминги циклов

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

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