110. Instruction ror a

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

Урок 110 из 356 · tests/chapter_01_cpu/test_110_instruction_ror_a.py

На этом шаге используйте `ror для памяти из урока 109 как предпосылку и добавьте только ror_a. Опкод 0x6A` отложен до урока 111.

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

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

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

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

    # Set flags

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

    cpu.a = result_8

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

У режима аккумулятора нет эффективного адреса, поэтому ему нужен примитив для регистра с той же семантикой вращения через Carry, что и у ROR для памяти.

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

Заблуждение: A — это значение регистра, а не адрес для `ror`. Передача его в примитив памяти вращала бы RAM[A] вместо аккумулятора.

Вне рамок: диспетчеризация `0x6A` — урок 111, режимы опкодов для памяти — 112-115, а точность таймингов/тактов — более поздняя работа.

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

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