103. Instrucción rol a

implementar ROL dirigido al acumulador.

Lección 103 de 356 · tests/chapter_01_cpu/test_103_instruction_rol_a.py

En este paso, usa el `rol` de memoria de la lección 102 como prerrequisito y añade únicamente la variante de registro. El despacho se pospone a la lección 104.

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

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

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

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

    # Set flags

    cpu.flags.set_carry_flag((value & 0b1000_0000) != 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 de memoria efectiva, así que una primitiva dedicada conserva la misma semántica de rotación mientras escribe en `cpu.a`.

Invariantes: el antiguo Carry se muestrea primero y entra en el bit 0; el bit 7 original de A pasa a ser Carry; A queda restringido a ocho bits; Z/N describen la nueva A; no ocurre ninguna escritura en el bus.

Concepto erróneo: `cpu.a es un valor, no una dirección para pasar a rol`. Hacerlo mutaría la memoria en la dirección A y dejaría el registro sin cambios.

Fuera de alcance: mapear el opcode `0x2A` es la lección 104, los modos de memoria son 105-108, ROR empieza en 109, y la fidelidad de temporización/ciclos es trabajo posterior.

Ejecutar esta lección

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