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

📄 boot.asm

📁 5416完整例程
💻 ASM
字号:
****************************************************************************
*  BOOT   v3.70                                                           *
*  Copyright (c) 1993-2001 Texas Instruments Incorporated                  *
****************************************************************************
	.file "boot.asm"
	.c_mode
	.mmregs
CONST_COPY	.set 0
SWCR		.set	002BH			; 软件等待控制寄存器
psdramc		.set	8000H			; Read/Write
OVLY_0		.set	001FH			; OVLY = '0'
****************************************************************************
*  I/O空间:		插5×2个等待		?		  						    *
*  数据空间低32K:	插2×2个等待		?		                            *
*  数据空间高32K:	插5×2个等待		?		                            *
*  程序空间低512K:?插2×2个等待		?		                            *
*  程序空间高512K:	插5×2个等待		?		                            *
****************************************************************************
SWWSR_VAL	.set	0FAAAH
SWCR_VAL	.set	0001H			; 等待×2
****************************************************************************
*                                                                          *
*   This module contains the following definitions :                       *
*                                                                          *
*         __stack    - Stack memory area                                   *
*         _c_int00   - Boot function                                       *
*         _var_init  - Function which processes initialization tables      *
*                                                                          *
****************************************************************************
        .ref	 cinit, pinit
        .ref	IV_RESET
		.global  _c_int00
		.global  _main, _exit, __STACK_SIZE

****************************************************************************
* Declare the stack.  Size is determined by the linker option -stack.  The *
* default value is 1K words.                                               *
****************************************************************************
__stack:	.usect	".stack",0

****************************************************************************
* FUNCTION DEF : _c_int00                                                  *
*                                                                          *
*   1) Set up stack                                                        *
*   2) Set up proper status                                                *
*   3) If "cinit" is not -1, init global variables                         *
*   4) call users' program                                                 *
*                                                                          *
****************************************************************************
	.text
_c_int00:
****************************************************************************
*  INIT STACK POINTER.  REMEMBER STACK GROWS FROM HIGH TO LOW ADDRESSES.   *
****************************************************************************
	STM	#__stack,SP		; set to beginning of stack memory
	ADDM	#(__STACK_SIZE-1),*(SP) ; add size to get to top
	ANDM	#0fffeh,*(SP)		; make sure it is an even address
	
	SSBX	SXM			; turn on SXM for LD #cinit,A
****************************************************************************
*  中断向量表重定位,配置软件等到寄存器					                   *
****************************************************************************
		ANDM	#OVLY_0,*(PMST)		; OVLY = 0
		ORM	#IV_RESET,*(PMST)	; 中断向量表重定位
		STM	#SWWSR_VAL,SWWSR	; 配置软件等待寄存器
		STM	#SWCR_VAL,SWCR	

****************************************************************************
* SET UP REQUIRED VALUES IN STATUS REGISTER                                *
****************************************************************************
	SSBX	CPL			; turn on compiler mode bit
	RSBX	OVM			; clear overflow mode bit
	SSBX    INTM        ; enable the interuption

****************************************************************************
* SETTING THESE STATUS BITS TO RESET VALUES.  IF YOU RUN _c_int00 FROM     *
* RESET, YOU CAN REMOVE THIS CODE                                          *
****************************************************************************
	LD	#0,ARP
	RSBX	C16
	RSBX	CMPT
	RSBX	FRCT

****************************************************************************
*  IF cinit IS NOT -1, PROCESS INITIALIZATION TABLES			   *
*  TABLES ARE IN PROGRAM MEMORY IN THE FOLLOWING FORMAT:                   *
*                                                                          *
*       .word  <length of init data in words>                              *
*       .word  <address of variable to initialize>                         *
*       .word  <init data>                                                 *
*       .word  ...                                                         *
*                                                                          *
*  The cinit table is terminated with a zero length                        *
*                                                                          *
****************************************************************************
	.if	__far_mode
	LDX	#cinit,16,A		
	OR	#cinit,A,A
	.else
	LD	#cinit,A                ; Get pointer to init tables
	.endif

	ADD	#1,A,B
	BC	DONE_CINIT,BEQ		; if (cinit == -1) no init tables

****************************************************************************
*  PROCESS INITIALIZATION TABLES.  TABLES ARE IN PROGRAM MEMORY IN THE     *
*  FOLLOWING FORMAT:                                                       *
*                                                                          *
*       .word  <length of init data in words>                              *
*       .word  <address of variable to initialize>                         *
*       .word  <init data>                                                 *
*       .word  ...                                                         *
*                                                                          *
*  The init table is terminated with a zero length                         *
*                                                                          *
****************************************************************************
	RSBX	SXM			; do address arithmetic unsignedly 
        .if	__far_mode
	.else
	NOP
	LD	#cinit,A		; don't want this sign extended anymore1
	LD #8000H,B
	SFTL B,2
	ADD B,A
	.endif
	B 	START_CINIT		; start processing 

LOOP_CINIT:
	READA	*(AR2)			; AR2 = address
	ADD	#1,A			; A += 1

	RPT	*(AR1)			; repeat length+1 times
	READA	*AR2+			; copy from table to memory

	ADD	*(AR1),A		; A += length (READA doesn't change A)
	ADD	#1,A			; A += 1

START_CINIT:
	READA	*(AR1)			; AR1 = length
	ADD	#1,A			; A += 1
	BANZ	LOOP_CINIT,*AR1-	; if (length-- != 0) continue 
DONE_CINIT:

****************************************************************************
*  IF pinit IS NOT -1, PROCESS INITIALIZATION TABLES                       *
*  TABLES ARE IN PROGRAM MEMORY IN THE FOLLOWING FORMAT:                   *
*                                                                          *
*       .word  <address of initialization routine to call>                 *
*       .word  ...                                                         *
*                                                                          *
*  The pinit table is terminated with a NULL pointer                       *
*                                                                          *
****************************************************************************
	SSBX	SXM
	FRAME	-4
;	nop

	.if	__far_mode
	LDX	#pinit,16,A
	OR	#pinit,A,A
	.else
        LD      #pinit,A                ; A = &pinit table
	.endif

        ADD     #1,A,B                  ; B = A + 1
        BC      DONE_PINIT,BEQ          ; if (pinit == -1) no pinit tables

       .if     __far_mode
       .else
       RSBX    SXM                     ; do address arithmetic unsignedly
       NOP
       LD      #pinit,A                ; don't want this sign extended anymore
       .endif

        BD      START_PINIT 
	DST	A, @2
	nop

LOOP_PINIT:
	.if	__far_mode
	FCALA	B			; call function
	.else
	CALA	B			; call function
	.endif

        DLD     @2, A                   ; put PINIT pointer in A

START_PINIT:
        READA   @0                      ; "push" address of function

	.if	__far_mode
	ADD	#1,A
	READA	@1
	.endif

        .if	__far_mode
	ADD	#1, A
	DST	A, @2
        DLD     @0, B
        BC	LOOP_PINIT,BNEQ

        .else
        LD      @0, B                   ; "pop" address of function
        BCD     LOOP_PINIT,BNEQ         ; if not NULL, loop.
        ADDM    #1,@3                   ; move PINIT pointer (in stack)
        .endif

     
DONE_PINIT:
	RSBX	SXM
	FRAME	4

****************************************************************************
*  CALL USER'S PROGRAM                                                     *
****************************************************************************
	.if CONST_COPY
	.if __far_mode                  ; Use far calls for C548 in far mode
	FCALL	_const_init             ; move .const section to DATA mem
        .else
        CALL	_const_init
	.endif
	.endif

	.if __far_mode                  ; Use far calls for C548 in far mode
	FCALL    _main			
	FCALL    _exit			; call exit instead of abort so that
	.else
	CALL    _main			
	CALL    _exit			; call exit instead of abort so that
	.endif

	.if CONST_COPY

****************************************************************************
* FUNCTION DEF : __const_init                                              *
*                                                                          *
*  COPY .CONST SECTION FROM PROGRAM TO DATA MEMORY                         *
*                                                                          *
*   The function depends on the following variables                        *
*   defined in the linker command file                                     *
*                                                                          *
*   __c_load         ; global var containing start                         *
*                      of .const in program memory                         *
*   __const_run      ; global var containing run                           *
*                      address in data memory                              *
*   __const_length   ; global var length of .const                         *
*                      section                                             *
*                                                                          *
****************************************************************************
        .global __const_length,__c_load
        .global __const_run
_const_init:
 
        .sect ".c_mark"              ; establish LOAD adress of
        .label __c_load             ; .const section
 
        .text
******************************************************
* C54x VERSION                                        *
******************************************************
 
        LD      #__const_length, A
        BC      __end_const,AEQ
        STM     #__const_run,AR2 ; Load RUN address of .const
 
        RPT     #__const_length-1
        MVPD    #__c_load,*AR2+  ; Copy .const from program to data
 
******************************************************
*  AT END OF .CONST SECTION RETURN TO CALLER         *
******************************************************
__end_const:
	.if    __far_mode

	.if __no_fret
	FB	_freti549
	.else
	FRET
	.endif

	.else
        RET

	.endif
        .endif
	.end

⌨️ 快捷键说明

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