Anda di halaman 1dari 2

; Programar @IRQ1 -> RSI_boton

LDR r0,=VICVectAddr0 ;r0=@VI


LDR r1,=tecl_so
; r1=@tecl_so
mov r2,#1
; r2=1
ldr r3,[r0,r2,LSL #2]
; r3=VI[r2]=@RSI_tecl_SO
str r3,[r1]
; tecl_so=@RSI_tecl_SO
LDR r1,=RSI_teclado
str r1,[r0,r2,LSL #2]

; r1=@RSI_teclado mia
; VI[r2]=@RSI_teclado mia

;Programar @IRQ4 -> RSI_reloj


LDR r0, =VICVectAddr0 ; r0=@VI
LDR r1, =reloj_so
; r1=@reloj_so
mov r2, #4
; r2=4
ldr r3, [r0,r2,LSL#2]
; r3=@VI[r2]=@RSI_reloj_SO
str r3,[r1]
; reloj_so=@RSI_reloj_SO
LDR r1, =RSI_timer
;r1=@RSI_reloj mia
str r1,[r0,r2,LSL#2]
;VI[r2]=@RSI_reloj_SO
;Activar IRQ1,IRQ4
LDR r0,=VICIntEnable
mov r1,#0x2
str r1,[r0]
IRQ1)
LDR r0, =VICIntEnable
mov r1, #0x10
str r1,[r0]
IRQ4)

; r0=@VICIntEnable
; r1=#2_10
; VICIntEnable[1]=1 (habilit.
; r0=@VICIntEnable
; r1=#2_10000
; VICIntEnable[4]=1 (habilit.

************PROGRAMA PRINCIPAL***************
; deshabilitar IRQ1
LDR r0,=VICIntEnClr
mov r1,#0x2
str r1,[r0]
VICIntEnable[1]=0
; deshabilitar IRQ4
LDR r0,=VICIntEnClr
mov r1,#0x10
str r1,[r0]
VICIntEnable[4]=0
; Recuperar VI[1]
LDR r0,=VICVectAddr0
LDR r1,=tecl_so
ldr r1,[r1]
mov r2,#1
str r1,[r0,r2,LSL #2]
; RecuperarVI[4]
LDR r0,=VICVectAddr0
LDR r1,=reloj_so
ldr r1,[r1]
mov r2,#4
str r1,[r0,r2,LSL #2]
fin b fin

; r0=VICIntEnClr
;r1=#2_10
; VICIntEnClr=1->
; r0=@VICIntEnClr
; r1=#2_10000
; VICIntEnClr[4]=1 ->
; r0=VI
; r1=@tecl_so
; r1=@tecl_so=@RSI_tecl_so
; r2=1
; VI[1]=@RSI_tecl_so
;
;
;
;
;

r0=@VI
r1=@reloj_so
r1=reloj_so=@RSI_reloj_so
r2=4
VI[4]=@RSI_reloj_so

; fin programa

RSI_teclado
; mi RSI teclado virtual
; I=0 activar IRQs
sub lr,lr,#4
; correccin @ret (segmentado)
PUSH {lr}
; apilar @rectorno (pila modo
IRQ)
mrs r14,spsr
; r14_irq=cpsr prog. interrumpido
PUSH {r14}
; apilar estado prog. interr.
msr cpsr_c,#2_01010010
; I=0 -> activar IRQs
(modo IRQ)
PUSH {r0-r2} ; apilar registros a utilizar
; Transferencia
LDR r1,=TEC_DAT
; r1=@R_DATOS tec.virtual
ldrb r0,[r1]
; r0=codigo rastreo boton
; Control (liberar Ktec y bajar peticion IRQ1)

LDR r1,=TEC_CTR
; liberar controlador de
teclado
mov r2,#2_100 ;
strb r2,[r1]
; escribiendo 1 en el bit 2 de TEC_CTR
LDR r1,=VICSoftIntClear ; VICSoftIntClear[1]=1
-VICSoftInt[1]=0
mov r2,#10
str r2,[r1]
; bajar peticion SW IRQ[1]
; Comparo TEC_DAT con 1
cmp r0,#1
beq btn1
; salto a btn1 si r0=1
b fintec
; y si no salto a fintec
; Tratamiento botn B1: ***
btn1
****
b fintec
; preparar ret. + EOI + retorno
fintec POP {r0-r2}
; desapilar registros
utilizados
msr cpsr_c,#2_11010010
; I=1 -> desactivar
interr. IRQ
POP {r14}
; r14_irq = cpsr prog.
interrumpido
msr spsr_fsxc,r14
; spsr_irq = cpsr prog.
interr.
LDR r14,=VICVectAddr ; EOI r14=@VICVectAddr
str r14, [r14]
; EOI escritura en VICVectAddr
POP {pc}^
; retorno a programa
interrumpido y
recuperacin
de estado
RSI_timer
; mi RSI timer0 (100 inter. /seg)
; Activar IRQs
sub lr,lr,#4
; correcin @retorno (segmentado)
PUSH {lr}
; apilar @retorno (pila modo
IRQ)
mrs r14,spsr
; r14_irq=cpsr prog. interrumpido
PUSH {r14}
; apilar estado prog. interr.
msr cpsr_c,#2_01010010
; I=0 -> activar IRQs
(modo IRQ)
PUSH {r0-r1}

; apilar registros utilizados

; Control (bajar peticin IRQ4)


LDR r0,=T0_IR ; r0=@T0_IR, r1=1
mov r1,#1
; r1=1
str r1,[r0]
; escribir 1 en T0_IR para
bajar peticin HW IRQ[4]
; Tratamiento al cambiar de dcima de segundo
eor r1,r1,r1
; r1=0
LDR r0,=reloj ; r0=@reloj
ldr r1,[r0]
; r1=reloj
add r1,r1,#1 ; r1 = reloj+1
str r1,[r0]
; reloj = reloj+1
fintimer
utilizados

POP {r0-r1} ; desapilar registros

; Preparar retorno + EOI + retorno


msr cpsr_c,#2_11010010
; I=1 -> desactivar
interrupciones IRQ
POP {r14}
; r14= cpsr programa
interrumpido
msr spsr_fsxc,r14
; spsr = cpsr
programa interrumpido
LDR r14,=VICVectAddr ; EOI r14=@VICVectAddr
str r14,[r14]
; EOI escritura en VICVectAddr
POP {pc}^
; retorno a programa
interrumpido + recuperacin de estado

AREA datos,DATA
VICIntEnable EQU
; Activar IRQs (solo bits 1)
VICIntEnClr EQU
; desactivar IRQs (solo bits 1)
VICSoftInt
EQU
; generar IRQS SW (solo bits 1)
VICSoftIntClear EQU ; bajar IRQs SW (solo bits 1)
VICVectAddr0 EQU
; vector interrupciones (VI)
VICVectAddr EQU
; registro para EOI
TEC_DAT
EQU
; reg. datos teclado virtual
TEC_CTR
EQU
; reg. control teclado virtual
IOSET EQU
; reg. datos GPIO (activar bits)
IOCLR EQU
; reg. datos GPIO (desact. bits)
N
EQU 10
T0_IR
EQU
; registro para bajar peticiones IRQ4
reloj
DCD 0 ; contador de dcimas de segundo
tecl_so DCD 0 ; var. para @RSI_teclado_SO
terminar
DCD 0 ; indicador terminacion fin=1
reloj_so DCD 0 ; var. para @RSI_timer_SO
; Limpio IOSET
LDR r3,=IOSET ;
mvn r7,#0x0 ;
LDR r4,=IOCLR ;
str r7,[r4]
; dibujar
LDR r8,=IOSET ;
ldr r7,[r8]
orr r7,r7,r6
;

r3=@IOSET
r7=0xFFFFFFFF
r4=0xFFFFFFFF
; IOCLR=0xFFFFFF => IOSET=0x0
r6=@IOSET
; r7 = IOSET
r7 = r7 OR r6 <=> IOSET = IOSET OR r6

Anda mungkin juga menyukai