.dosseg
.model small
.stack 100h
.code
;procedimiento de retardo: mantener un led encendido
retardo proc
mov cx, di
bucle:
loop bucle
retardo endp
leds equ 300h ;Dirección E/S de los leds
pulsador equ 300h ;Dirección E/S de los pulsadores
; di -> speed
; bl -> Leds on/off
; ax y dx -> para in/out
ini:
;le damos a cx una velocidad inicial
mov di, 10h
mov bl, 01h
;inicializo leds
mov dx, leds
mov al, bl
;Inicializo leds
out dx, al
ln1@ini:
call retardo
mov dx, pulsador
in al, dx
;Los pulsadores se activan a nivel bajo, en reposo están a vcc
;si he pulsado d0 y si di (contador de retardo) no
;ha pasado el limite ffffh, entonces incremento velocidad
test al, 01h
jnz ln2@ini
cmp di, 0FFFFh
je ln3@ini
inc di
jmp ln3@ini
ln2@ini:
;Decremento velocidad si he pulsado d1 y no he llegado a 0
test al, 02h
jnz ln3@ini
cmp di, 0
je ln3@ini
dec di
;Sabiendo la velocidad, puedo rotar y encender led
ln3@ini:
;roto leds y actualizo su estado
rol bl, 1
mov dx, leds
mov al, bl
out dx, al
jmp ln1@ini ;siguiente iteración bucle infinito
end ini