📄 chk2xx.asm
字号:
.title "TMS320C2xx PROCESSOR SELFCHECK -- MAIN SHELL"
.length 60
.width 120
.option X
************************************************************
* *
* TMS320C2xx PROCESSOR SELFCHECK -- MAIN SHELL *
* *
* Written by David M. Alter *
* member technical staff *
* Texas Instruments Inc. *
* *
* Release Version 1.0 *
* *
************************************************************
.ref alu, basic, brnch, ctrl, data, ram, mult, shft
.ref end2xx
.def _chk2xx
.nolist
.copy "options.h"
.copy "memmap.h"
.mmregs
.list
.text
_chk2xx: .set $+SS
;Save the C environment,ST0, ST1, and IMR
LAR AR2,#CONTEXT ;AR2 points to address for context save
MAR *,AR2 ;ARP --> AR2
POPD *+ ;pop return address off hardware stack
SAR AR0,*+ ;save frame pointer
SAR AR1,*+ ;save stack pointer
SAR AR6,*+ ;save AR6
SAR AR7,*+ ;save AR7
SST #1,*+ ;save ST1
SST #0,*+ ;save ST0
LDP #0h ;data page @ 0h
LAR AR3,IMR ;AR3 contains IMR
SAR AR3,* ;save IMR
;disable all maskable interrupts
SPLK #0h,IMR ;disable all maskable interrupts
;optionally perform a program code check-sum test
.if CHKSUM == 1
SPM 0 ;product mode shifter off
LACC #end2xx-1 ;must compute repeat count in 2 steps
SUB #_chk2xx ; because assembler can't mix external
SACL TEMP00 ; and relocatable symbols.
SPLK #1h,TEMP01 ;data(TEMP01) = 1h
MPY #0h ;flush PREG
PAC ;flush ACC
RPT TEMP00 ;execute next instr. "code length" times
MAC #_chk2xx,TEMP01 ;perform checksum
APAC ;add last checksum value to ACC
SACH TEMP02 ;save upper word of actual checksum
SACL TEMP03 ;save lower word of actual checksum
BLPD #end2xx,TEMP04 ;data(TEMP04)=upper word of correct answer
BLPD #end2xx+1,TEMP05;data(TEMP05)=lower word of correct answer
SUB TEMP04,16 ;subtract upper word of correct answer
SUBS TEMP05 ;subtract lower word of correct answer
BCND chk2xx1,EQ ;checksum passes if ACC = 0
LACL #1h ;load checksum error code
B fail2xx ;checksum fails
.endif
;call the check modules
chk2xx1: .set $+SS
CALL basic ;call basic operations test
BCND fail2xx,NEQ ;abort if previous test failed
CALL data ;call data memory operations test
BCND fail2xx,NEQ ;abort if previous test failed
CALL ctrl ;call control instructions test
BCND fail2xx,NEQ ;abort if previous test failed
CALL brnch ;call branch instructions test
BCND fail2xx,NEQ ;abort if previous test failed
CALL alu ;call alu instructions test
BCND fail2xx,NEQ ;abort if previous test failed
CALL mult ;call multiplier operations test
BCND fail2xx,NEQ ;abort if previous test failed
CALL ram ;call ram test
BCND fail2xx,NEQ ;abort if previous test failed
CALL shft ;call shifter test
BCND fail2xx,NEQ ;abort if previous test failed
CALL pass2xx ;call "pass2xx" subroutine
;restore the C environment, ST0, ST1, IMR, and ARP --> AR1
exit2xx: .set $+SS
LAR AR2,#CONTEXT ;AR2 points to address for context save
MAR *,AR2 ;ARP --> AR2
PSHD *+ ;push return address onto hardware stack
LAR AR0,*+ ;restore frame pointer
LAR AR1,*+ ;restore stack pointer
LAR AR6,*+ ;restore AR6
LAR AR7,*+ ;restore AR7
LST #1,* ;restore ST1, ARP corrupted
SETC INTM ;be sure interrupt mask is set
LDP #0h ;data page @ 0h
LAR AR3,CONTEXT+7 ;AR3 contains saved IMR
SAR AR3,4h ;restore IMR
LST #0,CONTEXT+6 ;restore ST0 after IMR so DP is restored
MAR *,AR1 ;ARP --> AR1
RET ;return to calling program
fail2xx: .set $+SS
.if LOCKOUT == 1
B fail2xx ;endless loop (lockout calling program)
.else
B exit2xx ;proceed with return to calling program
.endif
.page
************************************************************
* *
* SUBROUTINE pass2xx *
* *
* This subroutine loads the "All tests passed" code into *
* the accumulator. *
* *
************************************************************
pass2xx .set $+SS
LACL #0ffh ;load "All tests passed" code
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -