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