;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;when the cpu start,frist run this NoInt equ 0x80 NoFiq equ 0x40 UsrMode equ 0x10 SvcMode equ 0x13 SysMode equ 0x1f IrqMode equ 0x12 FiqMode equ 0x11 AbtMode equ 0x17 UndMode equ 0x1b StackEndAddr equ 0x40002000 import Fiq_exp import TargetInit import Main import |Image$$RO$$Limit| import |Image$$RW$$Base| import |Image$$ZI$$Base| import |Image$$ZI$$Limit| code32 area init,code,readonly entry reset ldr pc,resetAddr ldr pc,undefAddr ldr pc,swiAddr ldr pc,preferAddr ldr pc,DataAbortAddr ;dcd 0xb9205f80 dcd 0x0 ldr pc,[pc,#-0xff0] ldr pc,fiqAddr resetAddr dcd resetInit undefAddr dcd undefined swiAddr dcd swi preferAddr dcd prefer DataAbortAddr dcd DataAbort Nouse dcd 0 irqAddr dcd 0 fiqAddr dcd fiq undefined b undefined ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swi b swi ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; prefer b prefer DataAbort b DataAbort fiq stmfd sp!,{r0-r3,lr} bl Fiq_exp ldmfd sp!,{r0-r3,lr} subs pc,lr,#4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; export IrqEnable export IrqDisable IrqEnable ; stmfd sp!,{r0} mrs r0,cpsr bic r0,r0,#NoInt msr cpsr_c,r0 ;ldmfd sp!,{r0} mov pc,lr IrqDisable ; stmfd sp!,{r0} mrs r0,cpsr orr r0,r0,#NoInt msr cpsr_c,r0 ; ldmfd sp!,{r0} mov pc,lr ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InitStack mov r0,lr msr cpsr_c,#SvcMode|NoInt|NoFiq ldr sp,=StackSvc msr cpsr_c,#IrqMode|NoInt|NoFiq ldr sp,=StackIrq msr cpsr_c,#FiqMode|NoInt|NoFiq ldr sp,=StackFiq msr cpsr_c,#AbtMode|NoInt|NoFiq ldr sp,=StackAbt msr cpsr_c,#UndMode|NoInt|NoFiq ldr sp,=StackUnd msr cpsr_c,#SysMode|NoInt|NoFiq ldr sp,=StackUsr mov pc,r0 resetInit bl InitStack bl TargetInit ldr r0,=|Image$$RO$$Limit| ldr r1,=|Image$$RW$$Base| ldr r2,=|Image$$ZI$$Base| cmp r0,r1 beq loop loop_rw cmp r1,r2 ldrcc r3,[r0],#4 strcc r3,[r1],#4 bcc loop_rw loop ldr r1,=|Image$$ZI$$Limit| mov r3,#0 loop_zi cmp r2,r1 strcc r3,[r2],#4 bcc loop_zi b Main ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; StackSvc equ StackEndAddr-0x800+3*256 StackIrq equ StackEndAddr-0x800+4*256 StackFiq equ StackEndAddr-0x800+0 StackAbt equ StackEndAddr-0x800+0 StackUnd equ StackEndAddr-0x800+0 StackUsr equ StackEndAddr-0x800+256*8-32 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; end