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_aPor 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_8Invariantes 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