095. Instruction lsr
Añadir el comportamiento de la instrucción LSR en memoria.
Lección 95 de 356 · tests/chapter_01_cpu/test_095_instruction_lsr.py
En este paso, añade únicamente el comportamiento de LSR sobre memoria. El comportamiento con el acumulador y la conexión de opcodes llegan en los tests 096-101.
Archivo y símbolo
emulator/cpu/instructions.py: lsrPor qué existe este paso
La capa de instrucciones debe definir una única vez la semántica de lectura/modificación/escritura y de flags de LSR antes de conectar los manejadores de modo de direccionamiento. Esta transición es solo de memoria.
Implementación sugerida para este paso
# emulator/cpu/instructions.py
def lsr(cpu: CPU, addr: int):
value = cpu.bus.read(addr)
result = value >> 1
result_8 = result & 0xFF
# Set flags
cpu.flags.set_carry_flag((value & 0x01) != 0)
cpu.flags.set_negative_flag(False)
cpu.flags.set_zero_flag(result_8 == 0)
cpu.bus.write(addr, result_8)Invariantes importantes
- Carry se reemplaza a partir del bit 0 original, incluyendo el caso en que se borre si no estaba presente
- Zero se basa en el resultado final de 8 bits y Negative siempre se borra
- se lee y se escribe exactamente la dirección de memoria suministrada; A no cambia
- el desplazamiento lógico a la derecha introduce un cero en el bit 7
Error conceptual habitual
Carry no proviene del resultado y Negative no se copia del antiguo bit 7.
Fuera de alcance
- el comportamiento con el acumulador en el test 096 y la conexión de opcodes en los tests 097-101
- la secuenciación precisa por ciclos de lectura/modificación/escritura
- limpiezas no relacionadas en
asl_a
Ejecutar esta lección
uv run pytest tests/chapter_01_cpu/test_095_instruction_lsr.py -v