109. Instrucción ror

implementar ROR dirigido a memoria.

Lección 109 de 356 · tests/chapter_01_cpu/test_109_instruction_ror.py

En este paso, tras completar ROL en las lecciones 102-108, añade únicamente la primitiva de memoria de ROR. El cableado del opcode de ROR corresponde a las lecciones 111-115.

Implementación de ejemplo completa en la ubicación de producción

`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)

Por qué existe este paso

Una única primitiva de memoria independiente del direccionamiento proporciona a todo modo de direccionamiento de ROR posterior la misma semántica de lectura/modificación/escritura.

Invariantes: muestrea Carry antes de que cambien las banderas; el antiguo Carry entra en el bit 7, el bit 0 original pasa a ser Carry, el resultado es de ocho bits, y Z/N se derivan del resultado almacenado. Cambia exactamente el byte de memoria direccionado; A no cambia.

Concepto erróneo: ROR no es LSR. LSR inserta cero en el bit 7, mientras que ROR inserta el antiguo Carry; Carry no se puede derivar del resultado desplazado.

Fuera de alcance: el ROR de acumulador es la lección 110, el cableado de opcode/direccionamiento es 111-115, y la secuenciación del bus a nivel de ciclo es trabajo posterior.

Ejecutar esta lección

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