095. Instruction lsr

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

Урок 95 из 356 · tests/chapter_01_cpu/test_095_instruction_lsr.py

На этом шаге добавляется только поведение LSR, ориентированное на память. Поведение с аккумулятором и подключение опкодов следуют в тестах 096-101.

Файл и символ

emulator/cpu/instructions.py: lsr

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

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

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

# emulator/cpu/instructions.py
def lsr(cpu: CPU, addr: int):
    value = cpu.bus.read(addr)
    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.bus.write(addr, result_8)

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

  • Carry заменяется значением исходного бита 0, в том числе сбрасывается, если он отсутствует
  • Zero определяется по итоговому 8-битному результату, а Negative всегда сбрасывается
  • считывается и записывается ровно тот адрес памяти, который был передан; A не изменяется
  • логический сдвиг вправо вносит ноль в бит 7

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

Carry берётся не из результата, а Negative не копируется из старого бита 7.

Вне рамок

  • поведение с аккумулятором в тесте 096 и подключение опкодов в тестах 097-101
  • точная по тактам последовательность чтения/изменения/записи
  • не относящаяся к делу чистка asl_a

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

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