📄 vector.s
字号:
ModeMask EQU 0x1F
SVC32Mode EQU 0x13
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
User32Mode EQU 0x10
Abort32Mode EQU 0x17
Undef32Mode EQU 0x1B
IRQ_BIT EQU 0x80
FIQ_BIT EQU 0x40
RomBaseAddr EQU 0
RamBaseAddr EQU &100
RamEndAddr EQU &200
GBLS MainEntry
MainEntry SETS "main"
IMPORT $MainEntry
;**********************************************************
;检查是否使用tasm.exe进行编译
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
;******************************************************
AREA SelfBoot, CODE, READONLY
IMPORT UDF_INS_VECTOR
IMPORT SWI_SVC_VECTOR
IMPORT INS_ABT_VECTOR
IMPORT DAT_ABT_VECTOR
IMPORT IRQ_SVC_VECTOR
IMPORT FIQ_SVC_VECTOR
ENTRY
IF :DEF: |ads$version|
ELSE
EXPORT __main
__main
ENDIF
ResetEntry
b SYS_RST_HANDLER
b UDF_INS_HANDLER
b SWI_SVC_HANDLER
b INS_ABT_HANDLER
b DAT_ABT_HANDLER
b .
b IRQ_SVC_HANDLER
b FIQ_SVC_HANDLER
;******************************************************
MACRO
$Label HANDLER $Vector
$Label
sub lr, lr, #4
stmfd sp!, {r0-r3, lr}
ldr r0, =$Vector
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
MEND
UDF_INS_HANDLER
stmfd sp!, {r0-r3, lr}
ldr r0, =UDF_INS_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
SWI_SVC_HANDLER
stmfd sp!, {r0-r3, lr}
ldr r0, =SWI_SVC_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
INS_ABT_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r3, lr}
ldr r0, =INS_ABT_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
DAT_ABT_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r3, lr}
ldr r0, =DAT_ABT_VECTOR
mov lr, pc
ldr pc, [r0]
ldmfd sp!, {r0-r3, pc}^
IRQ_SVC_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
mrs r0, spsr
stmfd sp!, {r0}
ldr r0, =IRQ_SVC_VECTOR
ldr pc, [r0]
FIQ_SVC_HANDLER
sub lr, lr, #4
stmfd sp!, {r0-r12, lr}
mrs r0, spsr
stmfd sp!, {r0}
ldr r0, =IRQ_SVC_VECTOR
ldr pc, [r0]
;*******************************************************
SYS_RST_HANDLER
mrs r0, cpsr ;enter svc mode and disable irq,fiq
bic r0, r0, #ModeMask
orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)
msr cpsr_c, r0
IMPORT InitSystem
bl InitSystem
IF :DEF: RAM_VERSION
mov r0, #0
ldr r1, BaseOfZero
ldr r2, EndOfBSS
1
cmp r1, r2
strcc r0, [r1], #4
bcc %B1
ELSE
mov r0, #(RomBaseAddr<<16)
mov r1, #(RamBaseAddr<<16)
ldr r2, TopOfROM
0
ldmia r0!, {r4-r11}
stmia r1!, {r4-r11}
cmp r0, r2
bcc %B0
ldr r0, TopOfROM
ldr r1, BaseOfBSS
add r1, r1, #(RamBaseAddr<<16)
ldr r2, BaseOfZero
add r2, r2, #(RamBaseAddr<<16)
1
cmp r1, r2
ldrcc r4, [r0], #4
strcc r4, [r1], #4
bcc %B1
mov r0, #0
ldr r2, EndOfBSS
add r2, r2, #(RamBaseAddr<<16)
3
cmp r1, r2
strcc r0, [r1], #4
bcc %B3
ENDIF
IMPORT RemapMemory
bl RemapMemory
mov lr, pc
ldr pc, GotoMain
b .
GotoMain DCD $MainEntry
;***********************************************
IMPORT |Image$$RO$$Base| ; ROM code start
IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program
IMPORT |Image$$RW$$Base| ; Pre-initialised variables
IMPORT |Image$$ZI$$Base| ; uninitialised variables
IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
;***********************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -