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