📄 init.s
字号:
;;**************************************************************
;;BootLoader for simuCPU,you can only free use it for personal study purpose!
;;www.MShowTec.com for more information.
;;lmjx,Email:limiao@yeah.com,All Right Reserved.
;;**************************************************************
IMPORT undef
IMPORT swi
IMPORT prefetch
IMPORT data
IMPORT irq
IMPORT fiq
AREA Init, CODE, READONLY
CODE32
GET snds.s
ENTRY
start
B reset ; Reset
B undef ; Undef
B swi ; Software interrupt
B prefetch ; Prefetch Abort
B data ; Data Abort
NOP ; Reserved
B irq ; Irq
B fiq ; Fiq
;Part 1
;***************************************************************
;disable interrupts in CPU and switch to SVC32 mode
reset
MRS r0, cpsr
BIC r0, r0, #MASK_MODE
ORR r0, r0, #MODE_SVC32
ORR r0, r0, #I_BIT
ORR r0, r0, #F_BIT
MSR cpsr_c, r0
LDR r2, =ARM7_INTMASK ;R2->interrupt controller
MVN r1, #0 ;&FFFFFFFF
STR r1, [r2] ;disable all interrupt soucres
LDR r2, =ARM7_INTPEND ;R2->interrupt pend register.
MOV r1, #0 ;&FFFFFFFF
STR r1, [r2] ;clear all interrupt flags.
;Part 2
; Import some important variables for later use
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
;Part 3
;****************************************************************
;Initalize the memory as followa:
; FLASH @ 0 ~ 8 M
; SDRAM @ 8 ~ 16M
LDR r2, =ARM7_MEMMAP
LDR r1, =0x08080800 ;8M flash form address 0x00000000,8M sdram form 0x08000000
STR r1, [r2]
;Part 4
;***************************************************************
;Self copy from FLASH to SDRAM
; LDR r0, =|Image$$RO$$Base|
; LDR r1, =|Image$$RO$$Limit|
; LDR r2, =|Image$$RW$$Base|
; LDR r3, =|Image$$RW$$Limit|
; SUB r1, r1, r0
; SUB r3, r3, r2
; ADD r1, r1, r3
; LDR r2, =0x800000 ;@8M
;COPY
; LDR r3, [r0], #4
; STR r3, [r2], #4
; SUBS r1, r1, #4
; BNE COPY
;Part 5
****************************************************************
;Remap the memory
; FLASH @ 8 ~ 16M
; SDRAM @ 0 ~ 8M
; LDR r2, =ARM7_MEMMAP
; LDR r1, =0x08000808 ;8M flash form address 0x08000000,8M sdram form 0x00000000
; STR r1, [r2]
;Part 6
;*****************************************************************
; Copy RW & ZI to SDRAM
LDR r0, =|Image$$RO$$Limit|
LDR r1, =|Image$$RW$$Base|
LDR r3, =|Image$$ZI$$Base|
CMP r0, r1
BEQ %F1
0 CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC %B0
1 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2 CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %B2
;Part 7
;***********************************************************************
;Set stack pointer & jump to c function
; Put the stack base address into R0
LDR r0, =0xe00000
; Add the stack size to get the top of the stack in R0
ADD r0,r0,#0x600
SUB r0,r0,#4
; stack IRQ
MOV r3,#2_11010010
MSR CPSR_c,r3
MOV r13,r0
; stack ABORT
SUB r0,r0,#0x100
MOV r3,#2_11010111
MSR CPSR_c,r3
MOV r13,r0
; stack UNDEF
SUB r0,r0,#0x100
MOV r3,#2_11011011
MSR CPSR_c,r3
MOV r13,r0
; stack FIQ
SUB r0,r0,#0x100
MOV r3,#2_11010001
MSR CPSR_c,r3
MOV r13,r0
; stack SYSTEM(USER)
SUB r0,r0,#0x100
MOV r3,#2_11011111
MSR CPSR_c,r3
MOV r13,r0
; stack SVC
SUB r0,r0,#0x100
MOV r3,#2_11010011
MSR CPSR_c,r3
MOV r13,r0
;enable IRQ & FIQ
MRS r0, cpsr
BIC r0, r0, #I_BIT
BIC r0, r0, #F_BIT
MSR cpsr_c, r0
IMPORT loadkernel
LDR pc, =loadkernel
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -