;-------------------------------------------------------------------------------------------
;       VsZeNeR'04       16/julio/04     
;Programa: Switch y 7 segmentos
;Simulador MC68000: IDE68K(vs1.35)    
;
;Entrada:       D0:    Registro encargado almacenar direccion de switch
;               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                                      
;
;Resumen:   Programa que enciende 7 segmento adecuado segun switch y lo incrementa de 0-9
;           Solo estan activos los 4 switch de 0-3, del 4-7 no actuan                       
;-------------------------------------------------------------------------------------------
        org     $400                    ;inicio programa
*****VARIABLES*************************
TABLA   dc.b    %00111111               ;0 on: A0=$400 ->inicio tabla
        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 ->fin tabla
SWITCH  equ     $E001                   ;direccion efectiva de los switches
*****PROGRAMA**************************
main    move.b  #%00111111,$E017        ;ilumino 0 en 1º 7 segmentos
        lea     TABLA+1,A0              ;cargo direccion segunda TABLA en A0(carga 2º direccion ya que esta iluminado 0)
        move.b  #%00111111,$E015        ;ilumino 0 en 2º 7 segmentos
        lea     TABLA+1,A1              ;cargo direccion segunda TABLA en A1(carga 2º direccion ya que esta iluminado 0)
        move.b  #%00111111,$E013        ;ilumino 0 en 3º 7 segmentos
        lea     TABLA+1,A2              ;cargo direccion segunda TABLA en A2(carga 2º direccion ya que esta iluminado 0)
        move.b  #%00111111,$E011        ;ilumino 0 en 4º 7 segmentos
        lea     TABLA+1,A3              ;cargo direccion segunda TABLA en A3(carga 2º direccion ya que esta iluminado 0)
progr   move.b  SWITCH,D0               ;cargo direccion de SWITCH en registro D0
        CMP     #%00000001,D0           ;¿primer switch on?
        BNE     second                  ;no ->ve a second
        move.b  (A0)+,$E017             ;si ->ilumina numero correspondiente en 1º 7 seg e incrementa direccion A0
        clr.b   D0                      ;reset D0
        clr.b   SWITCH                  ;reset SWITCH
        CMP     #$40A,A0                ;¿A0 esta en fin TABLA?
        BEQ     uno                     ;si ->ve a uno
        BRA     progr                   ;no ->ve a progr
*****SEGUNDO 7 SEGMENTOS***************
second  CMP     #%00000010,D0           ;¿segundo switch on?
        BNE     third                   ;no ->ve a third
        move.b  (A1)+,$E015             ;si ->ilumina numero correspondiente en 2º 7 seg e incrementa direccion A1
        clr.b   D0                      ;reset D0
        clr.b   SWITCH                  ;reset SWITCH
        CMP     #$40A,A1                ;¿A1 esta en fin TABLA?
        BEQ     dos                     ;si ->ve a dos
        BRA     progr                   ;no ->ve a progr
*****TERCER 7 SEGMENTOS****************
third   CMP     #%00000100,D0           ;¿tercer switch on?
        BNE     four                    ;no ->ve a four
        move.b  (A2)+,$E013             ;si ->ilumina numero correspondiente en 3º 7 seg e incrementa direccion A2
        clr.b   D0                      ;reset D0
        clr.b   SWITCH                  ;reset SWITCH
        CMP     #$40A,A2                ;¿A2 esta en fin TABLA?
        BEQ     tres                    ;si ->ve a tres
        BRA     progr                   ;no ->ve a progr
*****CUARTO 7 SEGMENTOS****************
four    CMP     #%00001000,D0           ;¿cuarto switch on?
        BNE     five                    ;no ->ve a five
        move.b  (A3)+,$E011             ;si ->ilumina numero correspondiente en 4º 7 seg e incrementa direccion A3
        clr.b   D0                      ;reset D0
        clr.b   SWITCH                  ;reset SWITCH
        CMP     #$40A,A3                ;¿A3 esta en fin TABLA?
        BEQ     cuatro                  ;si ->ve a cuatro
five    BRA     progr                   ;no ->ve a prog
*****SUBRUTINAS************************
uno     BSR     loop                    ;ve a subrutina uno
        BRA     progr                   ;ve a progr
dos     BSR     loop1                   ;ve a subrutina dos 
        BRA     progr                   ;ve a progr                 
tres    BSR     loop2                   ;ve a subrutina tres
        BRA     progr                   ;ve a progr
cuatro  BSR     loop3                   ;ve a subrutina cuatro
        BRA     progr                   ;ve a progr
loop    lea     TABLA,A0                ;carga direccion TABLA en A0(actualiza A0)
        rts                             ;fin subrutina uno
loop1   lea     TABLA,A1                ;carga direccion TABLA en A1(actualiza A1)
        rts                             ;fin subrutina dos
loop2   lea     TABLA,A2                ;carga direccion TABLA en A2(actualiza A2)
        rts                             ;fin subrutina tres
loop3   lea     TABLA,A3                ;carga direccion TABLA en A3(actualiza A3)
        rts                             ;fin subrutina cuatro
***************************************
        end     main                    ;fin programa
