109. Instruction ror

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

Урок 109 из 356 · tests/chapter_01_cpu/test_109_instruction_ror.py

На этом шаге, после того как уроки 102-108 завершили ROL, добавьте только примитив ROR для памяти. Подключение опкодов ROR относится к урокам 111-115.

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

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

def ror(cpu: CPU, addr: int):
    value = cpu.bus.read(addr)
    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.bus.write(addr, result_8)

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

Единственный независимый от режима адресации примитив памяти обеспечивает все последующие режимы адресации ROR идентичной семантикой чтения/модификации/записи.

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

Заблуждение: ROR — это не LSR. LSR вставляет ноль в бит 7, тогда как ROR вставляет старый Carry; Carry нельзя вывести из сдвинутого результата.

Вне рамок: ROR для аккумулятора — урок 110, подключение опкодов/адресации — 111-115, а последовательность работы шины на уровне тактов — более поздняя работа.

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

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