79 lines
1.4 KiB
ArmAsm
79 lines
1.4 KiB
ArmAsm
|
|
.globl _start
|
|
_start:
|
|
ldr pc,reset_handler
|
|
ldr pc,undefined_handler
|
|
ldr pc,swi_handler
|
|
ldr pc,prefetch_handler
|
|
ldr pc,data_handler
|
|
ldr pc,unused_handler
|
|
ldr pc,irq_handler
|
|
ldr pc,fiq_handler
|
|
reset_handler: .word reset
|
|
undefined_handler: .word hang
|
|
swi_handler: .word hang
|
|
prefetch_handler: .word hang
|
|
data_handler: .word hang
|
|
unused_handler: .word hang
|
|
irq_handler: .word irq
|
|
fiq_handler: .word hang
|
|
|
|
reset:
|
|
mov r0,#0x8000
|
|
mov r1,#0x0000
|
|
ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
|
|
stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
|
|
ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
|
|
stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
|
|
|
|
|
|
;@ (PSR_IRQ_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
|
|
mov r0,#0xD2
|
|
msr cpsr_c,r0
|
|
mov sp,#0x8000
|
|
|
|
;@ (PSR_FIQ_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
|
|
mov r0,#0xD1
|
|
msr cpsr_c,r0
|
|
mov sp,#0x4000
|
|
|
|
;@ (PSR_SVC_MODE|PSR_FIQ_DIS|PSR_IRQ_DIS)
|
|
mov r0,#0xD3
|
|
msr cpsr_c,r0
|
|
mov sp,#0x8000000
|
|
|
|
;@ SVC MODE, IRQ ENABLED, FIQ DIS
|
|
;@mov r0,#0x53
|
|
;@msr cpsr_c, r0
|
|
|
|
bl notmain
|
|
hang: b hang
|
|
|
|
.globl PUT32
|
|
PUT32:
|
|
str r1,[r0]
|
|
bx lr
|
|
|
|
.globl GET32
|
|
GET32:
|
|
ldr r0,[r0]
|
|
bx lr
|
|
|
|
.globl dummy
|
|
dummy:
|
|
bx lr
|
|
|
|
.globl enable_irq
|
|
enable_irq:
|
|
mrs r0,cpsr
|
|
bic r0,r0,#0x80
|
|
msr cpsr_c,r0
|
|
bx lr
|
|
|
|
irq:
|
|
push {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
|
|
bl c_irq_handler
|
|
pop {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
|
|
subs pc,lr,#4
|
|
|