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