⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arm_boot.asm

📁 TMS320DM6446平台下
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;****************************************************************************
;* 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 + -