110. Instrucción ror a

implementar ROR dirigido al acumulador.

Lección 110 de 356 · tests/chapter_01_cpu/test_110_instruction_ror_a.py

En este paso, usa el `ror de memoria de la lección 109 como prerrequisito y añade únicamente ror_a. El opcode 0x6A` se pospone a la lección 111.

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

`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

Por qué existe este paso

El modo de acumulador no tiene dirección efectiva, así que necesita una primitiva de registro con la misma semántica de rotación a través de Carry que el ROR de memoria.

Invariantes: el antiguo Carry se captura primero y entra en el bit 7; el bit 0 original de A pasa a ser Carry; A permanece de ocho bits; Z/N describen la nueva A; la memoria no se toca.

Concepto erróneo: A es un valor de registro, no una dirección para `ror`. Pasarlo a la primitiva de memoria rotaría RAM[A] en lugar del acumulador.

Fuera de alcance: el despacho de `0x6A` es la lección 111, los modos de opcode de memoria son 112-115, y la fidelidad de temporización/ciclos es trabajo posterior.

Ejecutar esta lección

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