096. Instruction lsr a

Añadir el comportamiento de la instrucción LSR sobre el acumulador.

Lección 96 de 356 · tests/chapter_01_cpu/test_096_instruction_lsr_a.py

En este paso, añade el comportamiento de LSR dirigido al acumulador después de la primitiva de memoria del test 095.

Archivo y símbolo

emulator/cpu/instructions.py: lsr_a

Por qué existe este paso

LSR sobre el acumulador comparte el desplazamiento y los flags del test 095, pero tiene un destino de datos distinto, por lo que debe actualizar cpu.a sin tratar ese registro como una dirección.

Implementación sugerida para este paso

# emulator/cpu/instructions.py
def lsr_a(cpu: CPU):
    value = cpu.a
    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.a = result_8

Invariantes importantes

  • el antiguo bit 0 de A reemplaza a Carry
  • Zero sigue el valor final de A y Negative siempre se borra
  • no se produce ninguna lectura ni escritura en el bus
  • la memoria en una dirección numéricamente igual al antiguo valor de A permanece sin cambios

Error conceptual habitual

cpu.a es el valor y el destino, no una dirección que pasar al lsr de memoria.

Fuera de alcance

  • la conexión del opcode 0x4A en el test 097
  • los opcodes de direccionamiento a memoria en los tests 098-101
  • refactorizar la lógica compartida de LSR o añadir precisión de ciclos

Ejecutar esta lección

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