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: lsr

Por 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