089. Instrucción asl a
Añadir el comportamiento de ASL dirigido al acumulador.
Lección 89 de 356 · tests/chapter_01_cpu/test_089_instruction_asl_a.py
En este paso, añade únicamente asl_a, usando la forma de memoria del Test 088 como contexto y dejando el mapeo de opcode de ASL para los Tests 090-094.
Ubicación y símbolo en producción
emulator/cpu/instructions.py: `asl_a(cpu: CPU)`Por qué existe este paso
ASL A tiene las mismas reglas de bits y flags que ASL en memoria, pero su destino es el acumulador. Una función separada evita tratar A como si fuera una dirección de bus.
Implementación sugerida
def asl_a(cpu: CPU):
value = cpu.a
result = cpu.a << 1
result_8 = result & 0xFF
# Set flags
cpu.flags.set_carry_flag((value & 0b1000_0000) != 0)
cpu.flags.set_negative_flag((result_8 & 0b1000_0000) != 0)
cpu.flags.set_zero_flag(result_8 == 0)
cpu.a = result_8Invariantes importantes
- Carry recibe el bit 7 original de A
- A se enmascara a ocho bits; Z y N usan ese resultado enmascarado
- no se decodifica ninguna dirección de memoria ni se modifica ninguna posición del bus
- los bits de estado distintos de C, Z y N se preservan
Concepto erróneo habitual
No llames a la memoria con asl(cpu, cpu.a): el valor del acumulador son datos, no una dirección, y ASL A no debe tocar la memoria.
Fuera de alcance
- importar
asl_ay mapear el opcode 0x0A (test 090) - los wrappers y mapeos de opcode en memoria (tests 091-094)
- el temporizado de ciclos
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_089_instruction_asl_a.py -v