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