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

📄 boot.asm

📁 dm270 source code
💻 ASM
字号:
;******************************************************************************
;* BOOT  v2.17                                                               *
;* Copyright (c) 1996-2001 Texas Instruments Incorporated                     *
;******************************************************************************

;****************************************************************************
;* BOOT.ASM
;*
;* THIS IS THE INITAL BOOT ROUTINE FOR TMS470 C++ PROGRAMS.
;* IT MUST BE LINKED AND LOADED WITH ALL C++ PROGRAMS.
;* 
;* 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) __stack     STACK MEMORY AREA
;*   2) _c_int00    BOOT ROUTINE
;*
;****************************************************************************

	.state32
	.global	__stack
;***************************************************************
;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512)               
;***************************************************************
__stack:.usect	".stack", 0, 4

	.global _CLKCInit
	.global _SDRAMInit
	.global	_c_int00
;***************************************************************
;* FUNCTION DEF: _c_int00                                      
;***************************************************************
_c_int00:
	;*------------------------------------------------------
	;* SYSTEM STACK INITIALIZE
	;*------------------------------------------------------
	BL		_StackInit
	BL		_CLKCInit	; defined in armuser270.lib
	BL		_SDRAMInit  ; defined in armuser270.lib

	;*------------------------------------------------------
	;* 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

	;*------------------------------------------------------
	;* download to IRAM                                     
	;*------------------------------------------------------
	BL		_download

	.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

	;*------------------------------------------------------
	;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1)
	;*------------------------------------------------------
;	MOV		r0, #1
;	BL		$exit

	;*------------------------------------------------------
	;* 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_:
	BL		_main

	;*------------------------------------------------------
	;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1)
	;*------------------------------------------------------
	MOV		R0, #1
	BL		_exit

	;*------------------------------------------------------
	;* 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
length:   .set    R2
data:     .set    R3

auto_init:
	B		rec_chk

	;*------------------------------------------------------
	;* PROCESS AN INITIALIZATION RECORD
	;*------------------------------------------------------
record:
	LDR		var_addr, [tbl_addr], #4   ;

	;*------------------------------------------------------
	;* COPY THE INITIALIZATION DATA
	;*------------------------------------------------------
	TST		var_addr, #3				; SEE IF DEST IS ALIGNED
	BNE		_bcopy						; IF NOT, COPY BYTES
	SUBS	length, length, #4			; IF length <= 3, ALSO
	BMI		_bcont						; COPY BYTES

_wcopy:
	LDR		data, [tbl_addr], #4		;
	STR		data, [var_addr], #4		; COPY A WORD OF DATA
	SUBS	length, length, #4			;
	BPL		_wcopy						;

_bcont:
	ADDS	length, length, #4			;
	BEQ		_cont						;

_bcopy:
	LDRB	data, [tbl_addr], #1		;
	STRB	data, [var_addr], #1		; COPY A BYTE OF DATA
	SUBS	length, length, #1			;
	BNE		_bcopy						;

_cont:
	ANDS	length, tbl_addr, #0x3		; MAKE SURE THE ADDRESS
	RSBNE	length, length, #0x4		; IS WORD ALIGNED
	ADDNE	tbl_addr, tbl_addr, length	;

rec_chk:
	LDR		length, [tbl_addr], #4		; 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
	.endif

;*------------------------------------------------------
;* SYSTEM STACK INITIALIZE (see .CMD file)       
;*------------------------------------------------------
	.global	__IRQ_STACK
	.global	__FIQ_STACK
	.global	__UNDEF_STACK
	.global	__SWI_STACK

	.state32

_StackInit:

	;*------------------------------------------------------
	;* INITIALIZE THE UNDEF MODE STACK
	;*------------------------------------------------------
	MRS		r0, cpsr
	BIC		r0, r0, #0x1F	; CLEAR MODES
	ORR		r0, r0, #0x1B	; SET UNDEF mode
	MSR		cpsr, r0
 
 	LDR		r0, c_UNDEF_STACK
	MOV		sp, r0
 			
	;*------------------------------------------------------
	;* INITIALIZE THE FIQ MODE STACK
	;*------------------------------------------------------
	MRS		r0, cpsr
	BIC		r0, r0, #0x1F	; CLEAR MODES
	ORR		r0, r0, #0x11	; SET FIQ mode
	MSR		cpsr, r0

	LDR		r0, c_FIQ_STACK
	MOV		sp, r0	

	;*------------------------------------------------------
	;* INITIALIZE THE IRQ MODE STACK
	;*------------------------------------------------------
	MRS		r0, cpsr
	BIC		r0, r0, #0x1F	; CLEAR MODES
	ORR		r0, r0, #0x12	; SET IRQ mode
	MSR		cpsr, r0

	LDR		r0, c_IRQ_STACK
	MOV		sp, r0	

	;*------------------------------------------------------
	;* INITIALIZE THE SWI MODE STACK
	;*------------------------------------------------------
	MRS		r0, cpsr
	BIC		r0, r0, #0x1F	; CLEAR MODES
	ORR		r0, r0, #0x13	; SET SWI (SUPERVISOR) mode
	MSR		cpsr, r0

	LDR		r0, c_SWI_STACK
	MOV		sp, r0	

	MOV		pc, lr

c_IRQ_STACK		.long	__IRQ_STACK
c_FIQ_STACK		.long	__FIQ_STACK
c_UNDEF_STACK	.long	__UNDEF_STACK
c_SWI_STACK		.long	__SWI_STACK

;******************************************************
;* DSC related reference                              *
;******************************************************
	.global	_SetPLL
	.global	_EnablePLL
	.global	_CLOCKCInit
	.global	_EMIFInit	
	.global	_dlstadd
	.global	_dlsize
	.global _CacheInit 

;*------------------------------------------------------
;* download to IRAM                                     
;*------------------------------------------------------
_download:

	LDR		r0, dlstadd		; source address
	LDR		r2, dlsize		; number of bytes
	CMP		r2, #0			; compare download size
	BEQ		loadcomp		; branch if no download
		
	MOV		r1, #4			; dest. add (skip reset vector)

loop:						; do {
	LDR		r3, [r0], #4	;	R3= *R0++
	STR		r3, [r1], #4	;	*R1++= R3
	SUBS	r2, r2, #4		;	R2 -= 4
	
	BNE		loop			; } while (R2 > 0);

loadcomp:

	MOV		pc, lr

;******************************************************
;* For IRAM download						   		  *
;******************************************************

dlstadd		.long	_dlstadd
dlsize		.long	_dlsize

	.end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -