116. Instrucción and a
implementar el comportamiento de AND independiente del direccionamiento.
Lección 116 de 356 · tests/chapter_01_cpu/test_116_instruction_and_a.py
En este paso, añade solo `and_a a emulator/cpu/instructions.py`. Las importaciones de opcodes y los modos de direccionamiento de AND llegan en las lecciones 117-124.
Por qué existe este paso
Definir AND como una primitiva orientada a valores mantiene la semántica del acumulador y de los flags en un solo lugar para que cada handler de modo de direccionamiento pueda reutilizarlos de forma consistente.
Implementación sugerida
def and_a(cpu: CPU, value: int):
result_8 = (cpu.a & value) & 0xFF
# Flags:
cpu.flags.set_zero_flag(result_8 == 0)
cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)
cpu.a = result_8La firma orientada a valores mantiene la semántica de la instrucción separada de la decodificación de direcciones. El resultado queda restringido a ocho bits, se almacena en A, Zero refleja la igualdad con cero y Negative refleja el bit 7 del resultado. Carry, Overflow, la memoria, X, Y y PC son invariantes porque esta función nunca los toca.
Concepto erróneo: `value no es una dirección para leer a través de cpu.bus; los handlers de opcode realizan esas lecturas. Fuera del alcance: importar and_a en emulator/cpu/opcodes.py` y cada opcode de AND (lecciones 117-124), además de los símbolos ORA, EOR y BIT de las lecciones 125-145.
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_116_instruction_and_a.py -v