Ejemplo aplicaciones de Tablas en assembler
De Wikitronica
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