Rutina en ensamblador para multiplexar un display

Rutina en Ensamblador para 8086 para multiplexar por software 8 displays bcd-7 segmentos.

pila segment stack 'stack'
   db 128 dup(?)
pila ends

DATOS SEGMENT
   
   encendido db 80h,40h,20h,10h,08h,04h,02h,01h
   tdatos dw 1,2,3,4,5,6,7,8
   diccionario db 3fh,........,00
   
turno dw 0

   guarda_ip dw (?)
   guarda_cs dw (?)

DATOS ENDS

INTER SEGMENT AT 0
   org 4*8 ;interrupción del temporizador (8)
   vector_ip dw (?)
   vector_cs dw (?)
INTER ENDS
   
CODIGO SEGMENT
   assume cs:codigo,ds:datos,ss:pila,es:inter

ppal proc far
      push ds
      xor ax,ax
      push ax

      mov ax,datos
      mov ds,ax
      mov ax,inter
      mov es,ax
   
      call cambia_vectores ;activa nuestra rutina
   
bucle:jmp bucle ;bucle infinito
      call restituye         ;restituye los vectores a la situacion original
   
      retf
ppal endp

cambia_vectores proc
   cli
   mov ax,vector_cs
   mov guarda_cs,ax
   mov ax,vector_ip
   mov guarda_ip,ax

   mov vector_ip,offset rutina
   mov vector_cs,seg rutina
   sti
   ret
cambia_vectores endp

restituye proc
   cli
   mov ax,guarda_cs
   mov vector_cs,ax
   mov ax,guarda_ip
   mov vector_ip,ax
   sti
   ret
restituye endp

rutina proc far
   cli
   push ax
   push bx
   push dx   

   mov bx,turno
   ;apago todos los displays
   mov dx,300h
   xor ax,ax
   out dx,al

   ;ahora recupero el numero a mostrar
   shl bx,1 ;multiplicamos x dos porque el tamaño de la tabla datos es de 16 bits
   mov ax,tdatos[bx]
   
   ;tengo que traducir el dato
   mov bx,ax
   mov al,diccionario[bx]
   
   mov dx,301h
   out dx,al   ;ya tenemos el dato fuera
   
   ;ahora encendemos el que corresponda
   mov bx,turno
   
   mov al,encendido[bx]
   mov dx,300h
   out dx,al   ;ya tenemos encendido
   
   ;ahora tenemos que incrementar el contador
   inc bx
   cmp bx,8
   jne fin
   xor bx,bx
fin:mov turno,bx

   pop dx
   pop bx
   pop ax
   ;eoi
   mov al,20h
   out 20h,al
   sti
   iret
rutina endp

;rutina_de_usuario proc
   ;cli
   ;push's
   ;instrucciones
   ;pop's
   ;sti
   ;ret n
;rutina_de_usuario endp
;la rutina de usuario es un procedimiento y será llamado desde
;el procedimiento ppal. Tambien podremos pasarle parámetros por la pila
;;cosa que a la rutina no le podemos pasar. MUY IMPORTANTE.

CODIGO ENDS
   END ppal

Quizá te interese...