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