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