088. Instrucción asl

Añadir el comportamiento de ASL dirigido a memoria.

Lección 88 de 356 · tests/chapter_01_cpu/test_088_instruction_asl.py

En este paso, añade la instrucción reutilizable de memoria. El comportamiento con el acumulador es el Test 089, y los wrappers de opcode comienzan en el Test 090.

Ubicación y símbolo en producción

emulator/cpu/instructions.py: `asl(cpu: CPU, addr: int)`

Por qué existe este paso

ASL en memoria es una operación de lectura-modificación-escritura. La función de instrucción recibe una dirección ya resuelta para que los manejadores de opcode posteriores puedan compartir la misma lógica.

Implementación sugerida

def asl(cpu: CPU, addr: int):
    value = cpu.bus.read(addr)
    result = value << 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.bus.write(addr, result_8)

Invariantes importantes

  • Carry recibe el antiguo bit 7, antes de enmascarar el resultado
  • Zero y Negative reflejan el resultado final de 8 bits
  • se lee y escribe exactamente la dirección proporcionada; A no se modifica
  • todos los bits de estado salvo C, Z y N se preservan

Concepto erróneo habitual

Carry no proviene del bit 7 del resultado desplazado; captura el bit expulsado del valor original.

Fuera de alcance

  • asl_a, específico del acumulador (test 089)
  • el opcode 0x0A y los wrappers de direccionamiento en memoria (tests 090-094)
  • el temporizado de ciclos y las escrituras ficticias fieles al bus

Ejecutar esta lección

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