159. Instrucción cpy

implementa el comportamiento de CPY independiente del direccionamiento.

Lección 159 de 356 · tests/chapter_01_cpu/test_159_instruction_cpy.py

Por qué existe este paso

CPY necesita una primitiva de comparación orientada a valores para que todas las formas de direccionamiento usen las mismas reglas de flags de ausencia de préstamo, igualdad y resta con wraparound.

En este paso, tras CPX, añade exactamente este símbolo a `emulator/cpu/instructions.py`:

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

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

La resta hace wraparound únicamente para derivar Negative; Carry representa la ausencia de préstamo sin signo y Zero representa la igualdad. Y, el operando, la memoria, A, X, PC y Overflow son invariantes porque CPY no almacena ningún resultado de la resta.

Concepto erróneo: CPY ni consume el flag Carry existente ni escribe de vuelta en Y. Fuera de alcance: importar `cpy en emulator/cpu/opcodes.py` y sus handlers inmediato, de página cero y absoluto (lecciones 160-162).

Ejecutar esta lección

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