📄 boot.asm
字号:
****************************************************************************
* BOOT v3.70 *
* Copyright (c) 1993-2001 Texas Instruments Incorporated *
****************************************************************************
.file "boot.asm"
.c_mode
.mmregs
CONST_COPY .set 1
SWCR .set 002BH ; 软件等待控制寄存器
psdramc .set 8000H ; Read/Write
OVLY_0 .set 001bH ; OVLY = '0'
CLKOUT .set 09000H ; clkout is the dsp clock
****************************************************************************
* I/O空间: 插5×2个等待 ? *
* 数据空间低32K: 插2×2个等待 ? *
* 数据空间高32K: 插5×2个等待 ? *
* 程序空间低512K:?插2×2个等待 ? *
* 程序空间高512K: 插5×2个等待 ? *
****************************************************************************
SWWSR_VAL .set 0FAAAH
SWCR_VAL .set 0001H ; 等待X2
****************************************************************************
* *
* 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
.ref _datastart
.ref _dataend
.ref _time_end
.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
ANDM #0,*(BSCR) ; 设置CLKOUT
ORM #CLKOUT,*(BSCR)
STM #10H,TCR
ANDM #0,*(IMR)
****************************************************************************
* 搬移.data到数据区 *
****************************************************************************
;得到sine表的首地址
LD #0,A
STM #2,AH
STM #_time_end,AL
ADD #1,A
;得到sine表的长度
LD #0,B
STM #0,BH
STM #_dataend,BL
SUB #_datastart,B
ADD #1,B
;得到sine表的数据空间的地址
STM #_datastart,AR0
movdata: READA *AR0+
ADD #1,A
SUB #1,B
BC movdata,BNEQ
****************************************************************************
* 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 + -