Ejemplo Básico Assembler: Prender y Apagar Led

De Wikitronica
Saltar a: navegación, buscar
;********************************************************************
;* Código ejemplo para escribir programas en assembler:             *
;* Programa sencillo que inicializa puertos de entrada y salida,    *
;* crea una variable que aumenta cada vez que se presiona un botón, *
;* el resultado se muestra por los leds                             *
;********************************************************************

; -------------------------------------------------------------------
; Include files
            INCLUDE 'derivative.inc'
;
; export symbols
;
            XDEF Inicio
            ABSENTRY Inicio

; -------------------------------------------------------------------
; Definición de variables
            ORG    Z_RAMStart         
contador:   DS.B   1                ; variable que guarda la cuenta

;
; El codigo comienza aqui
;
            ORG    ROMStart

Inicio:
            LDHX   #RAMEnd+1        ; inicializa el stack pointer
            TXS
            ;--------------------------------------------------------
            ; Configuracion de los pines del Demoqe128
            BSR    Configurar_GPIO
            ;--------------------------------------------------------
            ; Inicializo contador
            CLR    contador

mainLoop:
            BRCLR  5,PTAD,Incremento  ; encuesto pin para
                                        ;..saber si fue presionado
            feed_watchdog
            BRA    mainLoop           ; Halt

Incremento:
            ; Incremento contador
            INC    contador    
            ; Paso contador a los puertos/leds PTC y PTE
            LDA    #%00111111         ; mascara para contador
            AND    contador           ;..el resultado queda en Acc
            COMA                      ; compl-1, los leds trabajan
                                      ;..con logica negada
            STA    PTCD
            lda    #%11000000
            AND    contador           ;...
            COMA                      ;...
            STA    PTED
            BRA    mainLoop

;********************************************************************
;             Subrutinas de Configuracion
;********************************************************************

Configurar_GPIO:           ; General Port Input/Output
            LDA #%00111111
            STA PTCDD      ; 6Bits(LSB) PTC - habilitado  como Salida
            LDA #%11000000
            STA PTEDD      ; 2Bits(MSB) PTE - habilitado  como salida
                        
            LDA #%00111111
            STA PTCD       ; Inicializo como cero (log. negada)
            LDA #%11000000
            STA PTED       ; Inicializo como cero (log. negada)
            
            LDA #%00000000                
            STA PTADD      ; Puerto A - habilitado como entrada
            LDA #%11111111 ; Pull Up enable para que el boton
            STA PTAPE      ;..reconozca la entrada         
            
            RTS

;**************************************************************
;* spurious - Spurious Interrupt Service Routine.             *
;*             (unwanted interrupt)                           *
;**************************************************************
spurious:                           ; placed here so that security value
            NOP                     ; does not change all the time.
            RTI

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************
            ORG   Virq

            DC.W  spurious          ;
            DC.W  spurious          ; SWI
            DC.W  Inicio            ; Reset

Contributors

Mrojas, Racuna