📄 arm_boot.asm
字号:
;****************************************************************************
;* BOOT.ASM
;*
;* THIS MODULE PERFORMS THE FOLLOWING ACTIONS:
;* 1) ALLOCATES THE STACK AND INITIALIZES THE STACK POINTER
;* 2) PERFORMS AUTO-INITIALIZATION
;* 3) CALLS INITALIZATION ROUTINES FOR FILE SCOPE CONSTRUCTION
;* 4) CALLS THE FUNCTION MAIN TO START THE C++ PROGRAM
;* 5) CALLS THE STANDARD EXIT ROUTINE
;*
;* THIS MODULE DEFINES THE FOLLOWING GLOBAL SYMBOLS:
;* 1) _c_intDaVinci BOOT ROUTINE
;*
;****************************************************************************
.state32
.global __stack
.global __STACK_SIZE
.sect ".entryPoint"
.global _tc_pattern
.global _tc_passed
.global _tc_failed
;***************************************************************
;* DEFINE THE DIFFERENT STACK SECTIONS (C STACK should be
;* defined in RTSx.lib)
;***************************************************************
__sstack: .usect ".sstack", 0x400, 4
__istack: .usect ".istack", 0x400, 4
__fstack: .usect ".fstack", 0x400, 4
__ustack: .usect ".ustack", 0x400, 4
__ystack: .usect ".ystack", 0x400, 4
__astack: .usect ".astack", 0x400, 4
.global _c_intDaVinci
;***************************************************************
;* FUNCTION DEF: _c_intDaVinci
;***************************************************************
_c_intDaVinci:
;*------------------------------------------------------
;* ALL STACK INITIALIZE
;*------------------------------------------------------
BL _initStack
;*------------------------------------------------------
;* Enable IRQ and FIQ
;*------------------------------------------------------
;MRS r0, cpsr
;BIC r0, r0, #0xC0 ; Enable IRQ and FIQ
;NOP
;NOP
;MSR cpsr, r0
;*------------------------------------------------------
;* SET TO USER MODE
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x10 ; SET USER MODE
MSR cpsr, r0
;*------------------------------------------------------
;* INITIALIZE THE USER MODE STACK
;*------------------------------------------------------
LDR sp, c_stack
LDR r0, c_STACK_SIZE
ADD sp, sp, r0
.if .TMS470_16BIS
;****************************************************************************
;* 16 BIT STATE BOOT ROUTINE *
;****************************************************************************
;*------------------------------------------------------
;* CHANGE TO 16 BIT STATE
;*------------------------------------------------------
ADD r0, pc, #1
BX r0
.state16
;*------------------------------------------------------
;* PERFORM AUTO-INITIALIZATION. IF CINIT IS -1, THEN
;* THERE IS NONE.
;*------------------------------------------------------
LDR r0, c_cinit
MOV r7, #1
CMN r0, r7
BEQ _c1_
BL auto_init
;*------------------------------------------------------
;* CALL INITIALIZATION ROUTINES FOR CONSTRUCTORS. IF
;* PINIT IS -1, THEN THERE ARE NONE.
;* NOTE THAT r7 IS PRESERVED ACROSS AUTO-INITIALIZATION.
;*------------------------------------------------------
_c1_:
LDR r5, c_pinit
CMN r5, r7
BEQ _c3_
B _c2_
_loop_:
BL IND$CALL
_c2_:
LDMIA r5!, {r4}
CMP r4, #0
BNE _loop_
;*------------------------------------------------------
;* CALL APPLICATION
;*------------------------------------------------------
_c3_:
BL $main
;*------------------------------------------------------
;* DONE, LOOP FOREVER
;*------------------------------------------------------
L1:
B L1
;***************************************************************************
;* PROCESS INITIALIZATION TABLE.
;*
;* THE TABLE CONSISTS OF A SEQUENCE OF RECORDS OF THE FOLLOWING FORMAT:
;*
;* .word <length of data (bytes)>
;* .word <address of variable to initialize>
;* .word <data>
;*
;* THE INITIALIZATION TABLE IS TERMINATED WITH A ZERO LENGTH RECORD.
;*
;***************************************************************************
tbl_addr .set r0
var_addr .set r1
tmp .set r2
length: .set r3
data: .set r4
three: .set r5
auto_init:
MOV three, #3 ;
B rec_chk ;
;*------------------------------------------------------
;* PROCESS AN INITIALIZATION RECORD
;*------------------------------------------------------
record:
LDR var_addr, [tbl_addr, #4] ;
ADD tbl_addr, #8 ;
;*------------------------------------------------------
;* COPY THE INITIALIZATION DATA
;*------------------------------------------------------
MOV tmp, var_addr ; DETERMINE ALIGNMENT
AND tmp, three ; AND COPY BYTE BY BYTE
BNE _bcopy ; IF NOT WORD ALIGNED
MOV tmp, length ; FOR WORD COPY, STRIP
AND tmp, three ; OUT THE NONWORD PART
BIC length, three ; OF THE LENGTH
BEQ _wcont ;
_wcopy:
LDR data, [tbl_addr] ;
ADD tbl_addr, #4 ;
STR data, [var_addr] ; COPY A WORD OF DATA
ADD var_addr, #4 ;
SUB length, #4 ;
BNE _wcopy ;
_wcont:
MOV length, tmp ;
BEQ _cont ;
_bcopy:
LDRB data, [tbl_addr] ;
ADD tbl_addr, #1 ;
STRB data, [var_addr] ; COPY A BYTE OF DATA
ADD var_addr, #1 ;
SUB length, #1 ;
BNE _bcopy ;
_cont:
MOV tmp, tbl_addr ;
AND tmp, three ; MAKE SURE THE ADDRESS
BEQ rec_chk ; IS WORD ALIGNED
BIC tbl_addr, three ;
ADD tbl_addr, #0x4 ;
rec_chk:
LDR length, [tbl_addr] ; PROCESS NEXT
CMP length, #0 ; RECORD IF LENGTH IS
BNE record ; NONZERO
MOV pc, lr
;***************************************************************
;* CONSTANTS USED BY THIS MODULE
;***************************************************************
c_stack .long __stack
c_STACK_SIZE .long __STACK_SIZE
c_cinit .long cinit
c_pinit .long pinit
;******************************************************
;* UNDEFINED REFERENCES *
;******************************************************
.global IND$CALL
.global $exit
.global $main
.global cinit
.global pinit
.global __STACK_SIZE
.else
;****************************************************************************
;* 32 BIT STATE BOOT ROUTINE *
;****************************************************************************
;*------------------------------------------------------
;* PERFORM AUTO-INITIALIZATION. IF CINIT IS -1, THEN
;* THERE IS NONE.
;*------------------------------------------------------
LDR r0, c_cinit
CMN r0, #1
BLNE auto_init
;*------------------------------------------------------
;* CALL INITIALIZATION ROUTINES FOR CONSTRUCTORS. IF
;* PINIT IS -1, THEN THERE ARE NONE.
;*------------------------------------------------------
LDR r5, c_pinit
CMN r5, #1
BEQ _c2_
B _c1_
_loop_:
BL IND_CALL
_c1_:
LDR r4, [r5], #4
CMP r4, #0
BNE _loop_
;*------------------------------------------------------
;* CALL APPLICATION
;*------------------------------------------------------
_c2_:
; Sets up
; Initialize ARM926 internal registers.
MOV r0, #0
MOV r1, #0
MOV r2, #0
MOV r3, #0
MOV r4, #0
MOV r5, #0
MOV r6, #0
MOV r7, #0
MOV r8, #0
MOV r9, #0
MOV r10, #0
MOV r11, #0
MOV r12, #0
BL _main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -