103. Instruction rol a

реализовать ROL для аккумулятора.

Урок 103 из 356 · tests/chapter_01_cpu/test_103_instruction_rol_a.py

На этом шаге используйте `rol` для памяти из урока 102 как предпосылку и добавьте только вариант для регистра. Диспетчеризация отложена до урока 104.

Полный пример реализации в производственном месте

`emulator/cpu/instructions.py::rol_a`::

def rol_a(cpu: CPU):
    value = cpu.a
    old_carry = int(cpu.flags.get_carry_flag())

    result = (value << 1) | old_carry
    result_8 = result & 0xFF

    # Set flags

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

    cpu.a = result_8

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

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

Инварианты: старый Carry считывается первым и попадает в бит 0; исходный бит 7 регистра A становится Carry; A ограничивается восемью битами; Z/N описывают новое значение A; записи в шину не происходит.

Заблуждение: `cpu.a — это значение, а не адрес для передачи в rol`. Такая передача изменила бы память по адресу A, оставив регистр неизменным.

Вне рамок: сопоставление опкода `0x2A` — урок 104, режимы памяти — 105-108, ROR начинается с урока 109, а точность таймингов/тактов — более поздняя работа.

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

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