Ejemplo aplicaciones de Tablas en assembler

De Wikitronica
Revisión del 18:01 26 mar 2013 de JRodríguez (Discusión | contribuciones) (Página creada con «El siguiente código muestra por la variable "Caracter" los caracteres ASCII guardados en tabla: <syntaxhighlight lang="asm"> ;********************************************...»)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

El siguiente código muestra por la variable "Caracter" los caracteres ASCII guardados en tabla:

;*******************************************************************
;*        Ejemplo implementación de tabla en assembler             *                 
;*******************************************************************

; Include derivative-specific definitions

INCLUDE 'derivative.inc'

;

; export symbols
;
XDEF _Startup
ABSENTRY _Startup
;
; variable/data section
;
ORG    Z_RAMStart         
Caracter: DS.B   1
;
; code section
;
ORG    ROMStart
_Startup:

LDHX   #RAMEnd+1        ; initialize the stack pointer
TXS
CLI                     ; enable interrupts

mainLoop:

Inicio_Lectura:

                        ;Se usa la dirección de Tabla como una constante
LDHX  #Tabla            ;y se guarda en el registro H:X

Lectura:

MOV   ,X+,Caracter      ;Se mueve el contenido de la memoria indicada por H:X a la
LDA   Caracter          ;variable "Caracter".
CMP   #0                ;Si Caracter vale 0, terminamos de recorrer la tabla y volvemos
BEQ   Inicio_Lectura    ;a empezar.
BRA   Lectura

;**************************************************************
;*                          TABLA                             *
;**************************************************************

ORG     $3000
Tabla:
DC.B  'H', 'E', 'L', 'L', 'O', ' ', 'W', 'O', 'R', 'L', 'D',0

;**************************************************************
;* 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   $FFFA

DC.W  spurious          ;

DC.W  spurious          ; SWI

DC.W  _Startup          ; Reset


Este código extrae valores "aleatorios" (1-6) de la tabla y los muestra por los LEDs utilizando IRQ y el timer RTC.

;*******************************************************************
;*        Ejemplo implementación de tabla en assembler             *                 
;*******************************************************************

; Include derivative-specific definitions
INCLUDE 'derivative.inc'
;
; export symbols
;
XDEF _Startup
ABSENTRY _Startup
ROMTabla:   EQU    $3000
;
; variable/data section
;
ORG    Z_RAMStart         ; Insert your data definition here
Contador:   DS.W   1
valor       DS.B   1                  ; Variable que indica el valor anterior del pulsador.
Flag        DS.B   1                  ; Indicador que el RTC ya interrumpió.
;
; code section
;
ORG    ROMStart
_Startup:
LDHX    #RAMEnd+1                ; initialize the stack pointer
TXS
CLI                              ; enable interrupts
BSR     Configurar_Puertos
BSR     Configurar_RTC
BSR     Configurar_IRQ
LDHX    #$3000
STHX    Contador
LDA     #$FF                    ;inicializar el Flag (True)
STA     Flag
LDA     #$42
STA     SOPT1
mainLoop:
LDA     Flag                    ;El prog. se queda intermitentemente aqui
CMP     #$FF                    ;hasta que cambie el Flag que inicialmente
BEQ     Leer                    ;esta en FF (o hasta que interrumpa el RTC)
BRA     mainLoop
Leer:
LDA     IRQSC
ORA     #%00000010              ; Habilitar interrupciones de IRQ
STA     IRQSC
MOV     #$00,Flag
BRA     mainLoop

;**************************************************************
;* spurious - Spurious Interrupt Service Routine.      *
;*             (unwanted interrupt)                    *
;**************************************************************

spurious:                           ; placed here so that security value
NOP                     ; does not change all the time.
RTI

;**************************************************************
;*              Subrutinas de configuración                   *
;**************************************************************

Configurar_Puertos:
MOV     #$3F,PTCDD      ; Config. Puerto C como salida.
MOV     #$3F,PTCD       ; Mantengo apagados LEDS de puerto C
MOV     #$C0,PTEDD      ; Config. Puerto E como salida.
MOV     #$C0,PTED       ; Mantengo apagados LEDS de puerto E
MOV     #$00,PTDDD      ; Config. Puerto D como Entrada.
MOV     #$FF,PTDD       ; Config. pulsadores sin presionar.
RTS

Configurar_RTC:
LDA #$00                ;Definimos el valor del registro modulo del RTC
STA RTCMOD
LDA #%10010111          ;Configuramos el RTCSC
STA RTCSC               ;Reloj configurado a 1s. Fuente reloj interna 1khz.
LDA SCGC2               ;Deshabilitar Clock Gate para el RTC
AND #%11111011
STA SCGC2
RTS

Configurar_IRQ:
LDA #%00010100          ;IRQPE=1, IRQACK=1, IRQIE=0
ORA IRQSC
STA IRQSC
RTS

;**************************************************************
;*               Rutina de interrupción                       *
;**************************************************************

Temporizador:
LDA     RTCSC
ORA     #%10000000          ; Bajar la bandera.
STA     RTCSC
MOV     #$FF, Flag
LDA     SCGC2                  ;Deshabilitar Clock Gate para el RTC
AND     #%11111011
STA     SCGC2
LDHX    Contador             ;Se muestra el valor del numero
MOV     X+,valor             ;para empezar nuevamente
STHX    Contador

Prender_Leds:
COM      valor
LDHX     valor
STHX     PTCD
STHX     PTED


Verificar:
LDHX     Contador            ;Verifica si se acabo la tabla
CPHX      #$3100             ; Numero que corresponde a la direccion del ultimo dato en la tabla mas 1 bit
BEQ       Fin_tabla
RTI

Fin_tabla:
LDHX     #$3000               ;Rutina para empezar la tabla nuevamente, al terminarse.
STHX     Contador
RTI



IRQSR:
LDA     IRQSC
ORA     #%00000100           ; Bajar bandera.
STA     IRQSC
LDA     SCGC2                ;Habilitar Clock Gate para el RTC

ORA     #%00000100
STA     SCGC2
LDA     IRQSC
AND     #%11111101           ;Deshabilitar interrupciones del IRQ
STA     IRQSC
RTI

;**************************************************************
;*                         TABLA                              *
;**************************************************************

ORG   ROMTabla

Tabla:
DC.B  2,4,6,1,6,3,5,2,4,3
DC.B  1,4,6,1,5,3,4,2,5,1
DC.B  1,5,6,4,2,3,1,5,2,3
DC.B  6,3,2,5,6,3,2,5,4,1
DC.B  4,5,1,2,3,6,5,2,3,6
DC.B  1,3,6,4,2,5,6,3,2,5
DC.B  1,2,3,4,1,2,5,2,4,3
DC.B  1,2,5,4,6,3,2,4,5,1
DC.B  4,5,2,1,3,6,5,4,1,2
DC.B  1,2,3,4,5,2,1,2,5,3
DC.B  6,3,6,3,4,1,2,4,5,4
DC.B  4,4,4,2,5,4,6,2,1,6
DC.B  1,2,3,4,5,6,4,5,2,1
DC.B  1,2,4,5,2,2,1,2,2,5
DC.B  4,1,5,2,6,3,5,2,6,3
DC.B  1,4,2,5,3,5,2,5,2,4
DC.B  4,1,2,5,2,4,1,3,6,4
DC.B  1,4,2,5,4,1,2,5,4,1
DC.B  4,5,2,3,6,5,4,1,2,5
DC.B  1,2,4,5,2,3,6,5,2,1
DC.B  1,2,4,5,3,6,2,5,4,1
DC.B  4,2,5,2,3,6,2,2,4,1
DC.B  1,4,2,3,6,4,1,2,5,2
DC.B  2,1,4,2,5,6,3,6,5,1
DC.B  1,2,3,4,5,2,1,4,5,2
DC.B  6,5,4,3,2,1

;**************************************************************
;*                 Interrupt Vectors                          *
;**************************************************************

ORG   $FFCE
DC.W  Temporizador      ;
ORG   $FFFA
DC.W  IRQSR             ;
DC.W  spurious          ; SWI
DC.W  _Startup          ; Reset

Contributors

JRodríguez