146. Instruction cmp

implementar el comportamiento de CMP independiente del direccionamiento.

Lección 146 de 356 · tests/chapter_01_cpu/test_146_instruction_cmp.py

Por qué existe este paso

CMP necesita una única definición orientada al valor de la semántica de Carry sin préstamo, Zero por igualdad y Negative por resta envuelta, antes de añadir ningún modo de direccionamiento.

En este paso, antes de las lecciones de comparación específicas de direccionamiento, añade exactamente este símbolo a `emulator/cpu/instructions.py`:

def cmp(cpu: CPU, value: int):
    result_8 = (cpu.a - value) & 0xFF

    # Flags:
    cpu.flags.set_carry_flag(cpu.a >= value)
    cpu.flags.set_zero_flag(cpu.a == value)
    cpu.flags.set_negative_flag((result_8 & 0b1000_0000) !=0)

CMP realiza una comparación sin signo, usando la resta envuelta solo para N. C significa que no hay préstamo (A >= value), Z significa igualdad, y N es el bit 7 del resultado. A, Overflow, memoria, X, Y y PC son invariantes.

Concepto erróneo: Carry se activa, no se borra, cuando A es al menos igual al operando, y el resultado de la resta nunca se almacena. Fuera de alcance: importar `cmp` y los opcodes de CMP son la lección 147 en adelante; CPX/CPY son las lecciones 155-162.

Ejecutar esta lección

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