;-------------------------------------------------------------------------------------------
;       VsZeNeR'04       12/julio/04     
;Programa: Contador
;Simulador MC68000: IDE68K(vs1.35)    
;
;Entrada:       D0:    Registro encargado almacenar constante de retardo
;               D1:    Registro encargado de ser contador de retardo
;               RET:   Constante interna del programa cuya funcion es suministrar el retardo
;               A0:    Almacena direccion de tabla e ilumina 1º 7 segmentos
;               A1:    Almacena direccion de tabla e ilumina 2º 7 segmentos
;               A2:    Almacena direccion de tabla e ilumina 3º 7 segmentos
;               A3:    Almacena direccion de tabla e ilumina 4º 7 segmentos 
;
;Notas:     Subrutina delay: Retardo de un segundo 
;                                    
;
;Resumen:   Programa que cuenta de forma ascendente numeros del 0000-9999                       
;-------------------------------------------------------------------------------------------
         org     $400                   ;inicio de programa
*****VARIABLES*************************
TABLA    dc.b    %00111111              ;0 on: A0=$400
         dc.b    %00000110              ;1 on: A0=$401
         dc.b    %01011011              ;2 on: A0=$402
         dc.b    %01001111              ;3 on: A0=$403
         dc.b    %01100110              ;4 on: A0=$404
         dc.b    %01101101              ;5 on: A0=$405
         dc.b    %01111101              ;6 on: A0=$406
         dc.b    %00000111              ;7 on: A0=$407
         dc.b    %01111111              ;8 on: A0=$408
         dc.b    %01100111              ;9 on: A0=$409
RET      equ     $FFFFF                 ;constante de retardo
*****PROGRAMA**************************        
main     move.b  #%00111111,$E015       ;0 on en 2º 7seg
         move.b  #%00111111,$E013       ;0 on en 3º 7seg
         move.b  #%00111111,$E011       ;0 on en 4º 7seg
         lea     TABLA+1,A3             ;carga segunda direccion tabla en A3.Segunda direccion porque el 0 ya esta encendido
ini2     lea     TABLA+1,A2             ;carga segunda direccion tabla en A2.Segunda direccion porque el 0 ya esta encendido
ini1     lea     TABLA+1,A1             ;carga segunda direccion tabla en A1.Segunda direccion porque el 0 ya esta encendido
ini0     lea     TABLA,A0               ;carga direccion de tabla en A0
*****PRIMER 7 SEGMENTOS****************
loop     move.b  (A0)+,$E017            ;ilumina numero correspondiente en 1º 7seg e incrementa direccion A0
         BSR     delay                  ;salta subrutina delay
         CMP     #$40A,A0               ;¿A0 esta en fin de tabla??
         BNE     loop                   ;no es fin tabla ->ve a loop
         BEQ     next                   ;si es fin tabla ->ve a next ->2º 7 segmentos
*****SEGUNDO 7 SEGMENTOS***************
next     CMP     #$40A,A1               ;¿A1 esta en fin de tabla?
         BNE     loop1                  ;no es fin tabla ->ve a loop1
         BEQ     next1                  ;si es fin tabla ->ve a next1 ->3º 7 segmentos
loop1    move.b  (A1)+,$E015            ;ilumina numero correspondiente e incrementa A1
         BRA     ini0                   ;ve a ini0
*****TERCER 7 SEGMENTOS****************
next1    move.b  #%00111111,$E015       ;0 on en 2º 7 segmentos 
         CMP     #$40A,A2               ;¿A2 esta en fin de tabla?
         BNE     loop2                  ;no es fin tabla ->ve a loop2
         BEQ     next2                  ;si es fin tabla ->ve a next2 ->4º 7 segmentos
loop2    move.b  (A2)+,$E013            ;ilumina numero correspondiente e incrementa A2
         BRA     ini1                   ;ve a ini1
*****CUARTO 7 SEGMENTOS****************
next2    move.b  #%00111111,$E013       ;0 on en 3º 7 segmentos
         CMP     #$40A,A3               ;¿A3 esta en fin de tabla?
         BNE     loop3                  ;no es fin tabla ->ve a loop3
         BEQ     main                   ;si es fin tabla ->ve a main ->no hay mas 7 segmentos
loop3    move.b  (A3)+,$E011            ;ilumina numero correspondiente e incrementa A3
         BRA     ini2                   ;ve a ini2
*****RETARDO DE 1SEG***********
delay   move.b  #0,D1                   ;D1=0: contador para conseguir un retardo de un segundo
loop4   move.l  #RET,D0                 ;D0=RET
        add.b   #1,D1                   ;D1=D1+1
loop5   sub.l   #1,D0                   ;D0=D0-1
        TST.l   D0                      ;¿D0==0?
        BNE     loop5                   ;no es igual a cero ->ve a loop5
        CMP     #4,D1                   ;¿es un segundo?Para que sea un segundo D1=4
        BNE     loop4                   ;no es un segundo ->ve a loop4
        rts                             ;si es un segundo ->fin de subrutina
*******************************        
        end     main                    ;fin programa