155. Instrucción cpx

implementa el comportamiento de CPX independiente del direccionamiento.

Lección 155 de 356 · tests/chapter_01_cpu/test_155_instruction_cpx.py

Por qué existe este paso

CPX necesita una única definición orientada a valores de sus flags de ausencia de préstamo, igualdad y resta con wraparound antes de que se añadan sus opcodes específicos de cada modo de direccionamiento.

En este paso, tras todas las lecciones de CMP, añade exactamente este símbolo a `emulator/cpu/instructions.py`:

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

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

La resta con wraparound existe únicamente para derivar Negative. Carry significa ausencia de préstamo sin signo (X >= valor), y Zero comprueba la igualdad. X, el operando, la memoria, A, Y, PC y Overflow son invariantes porque no se almacena ningún resultado y esas ubicaciones quedan intactas.

Concepto erróneo: CPX no es SBC y ni consume Carry ni escribe la resta de vuelta en X. Fuera de alcance: importar `cpx en emulator/cpu/opcodes.py` y sus handlers inmediato, de página cero y absoluto (lecciones 156-158), además de CPY (159-162).

Ejecutar esta lección

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