096. Instruction lsr a

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

Урок 96 из 356 · tests/chapter_01_cpu/test_096_instruction_lsr_a.py

На этом шаге добавляется поведение LSR для аккумулятора после примитива для памяти из теста 095.

Файл и символ

emulator/cpu/instructions.py: lsr_a

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

LSR для аккумулятора использует тот же сдвиг и флаги, что и в тесте 095, но имеет другой пункт назначения данных, поэтому он должен обновлять cpu.a, не трактуя этот регистр как адрес.

Предлагаемая реализация для этого шага

# emulator/cpu/instructions.py
def lsr_a(cpu: CPU):
    value = cpu.a
    result = value >> 1
    result_8 = result & 0xFF

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

    cpu.a = result_8

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

  • старый бит 0 регистра A заменяет Carry
  • Zero следует из итогового значения A, а Negative всегда сбрасывается
  • обращения к шине для чтения или записи не происходит
  • память по адресу, численно равному старому значению A, остаётся неизменной

Распространённое заблуждение

cpu.a — это значение и пункт назначения, а не адрес, передаваемый в lsr для памяти.

Вне рамок

  • подключение опкода 0x4A в тесте 097
  • опкоды с адресацией к памяти в тестах 098-101
  • рефакторинг общей логики LSR или добавление точности тактов

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

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