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_8

Invariantes 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_a y 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