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

📄 alu.asm

📁 DSP的例程
💻 ASM
字号:
	.title	"TMS320C2xx PROCESSOR SELFCHECK -- ALU TEST"
	.length	60
	.width	120
	.option	X
************************************************************
* ALU INSTRUCTIONS TEST                                    *
*                                                          *
* This routine checks ALU operations.                      *
*                                                          *
* Written by:                                              *
*                                                          *
* Release Version 1.0                                      *
*                                                          *
************************************************************
	.def    alu
	.nolist
	.copy   "options.h"
	.copy   "memmap.h"
	.list
	
	.text
alu	.set	$ + SS
	
*        
* TEST LOGICAL OPERATIONS
*
; preliminary setup
	LDP	#0h		; data page @ 0h        
	SPLK	#05454h,TEMP00	; data(TEMP00) = 5454h
	SPLK	#05151h,TEMP01	; data(TEMP01) = 5151h
	SPLK	#03333h,TEMP02	; data(TEMP02) = 3333h
	SPLK	#0aaaah,TEMP03	; data(TEMP03) = aaaah
	SPLK	#02222h,TEMP04	; data(TEMP04) = 2222h

; immediate addressing
	LACC	TEMP00		; ACC = 00005454h        
	OR	#05151h		; ACC = 00005555h
	XOR	#03333h		; ACC = 00006666h
	AND	#0aaaah		; ACC = 00002222h
	SUB	TEMP04		; ACC = 00002222h
	BCND	eralu1,NEQ	; if ACC != 0 then error

; immediate addressing with 16 bit shift
	LACC	TEMP00,16	; ACC = 54540000h
	OR	#05151h,16	; ACC = 55550000h
	XOR	#03333h,16	; ACC = 66660000h
	AND	#0aaaah,16	; ACC = 22220000h
	SACH	TEMP05		; data(TEMP05)=2222h
	LACC	TEMP05		; ACC = 00002222h
	SUB	TEMP04		; ACC = 0
	BCND	eralu1,NEQ	; if ACC != 0 then error

; direct addressing
	LACC	TEMP00		; ACC = 00005454h
	OR	TEMP01		; ACC = 00005555h
	XOR	TEMP02		; ACC = 00006666h
	AND	TEMP03		; ACC = 00002222h
	SUB	TEMP04		; ACC = 0
	BCND	eralu1,NEQ	; if ACC != 0 then error

; indirect addressing
	LAR	AR0,#TEMP01	; AR0 points to TEMP01
	MAR	*,AR0		; ARP --> AR0
	LACC	TEMP00		; ACC = 00005454h
	OR	*+		; ACC = 00005555h
	XOR	*+		; ACC = 00006666h
	AND	*		; ACC = 00002222h
	SUB	TEMP04		; ACC = 0     
	BCND	eralu1,NEQ	; if ACC != 0 then error

*
* TEST ARITHMETIC OPERATIONS
*       

; preliminary setup
	SETC	SXM		; sign extension mode on
	CLRC	OVM		; overflow mode off
	SPLK	#0ffffh,TEMP00	; data(TEMP00) = ffffh
	SPLK	#1h,TEMP01	; data(TEMP01) = 1h
	LAR	AR0,#TEMP00	; AR0 points to TEMP01
	LT	TEMP01		; TREG = 1h                

; primarily addition instructions
	ADD	#0ffffh		; ACC = ffffffffh
	ADD	TEMP00		; ACC = fffffffeh
	ADD	*		; ACC = fffffffdh
	ADDT	TEMP00		; ACC = fffffffbh
	ADDT	*+		; ACC = fffffff9h & AR0 points to TEMP01
	ABS			; ACC = 7h
	SUB	#7h		; ACC = 0        
	BCND	eralu2,NEQ	; if ACC != 0 then error

	ADD	#7h		; ACC = 7h & C=0
	ADD	TEMP00,16	; ACC = ffff0007h & C=0
	ADD	*,16		; ACC = 7h & C=1
	ADDC	TEMP01		; ACC = 9h & C=0
	ADDC	*		; ACC = ah & C=0
	SUB	#0ah		; ACC = 0  & C=1
	BCND	alu1,EQ,C	; branch if ACC=0 & C=1
	B	eralu2		; branch to error handler

alu1	.set	$+SS

	CMPL			; ACC = ffffffffh
	ADDS	TEMP00		; ACC = 0000fffeh
	ADDS	*-		; ACC = 0000ffffh & AR0 points to TEMP00
	XOR	TEMP00		; ACC = 0
	BCND	eralu2,NEQ	; if ACC != 0 then error

; primarily subtraction operations
	SUB	#0ffffh		; ACC = 00000001h
	SUB	TEMP00		; ACC = 00000002h
	SUB	*		; ACC = 00000003h
	SUBT	TEMP00		; ACC = 00000005h
	SUBT	*+		; ACC = 00000007h & AR0 points to TEMP01
	NEG			; ACC = fffffff9h
	ADD	#7h		; ACC = 0
	BCND	eralu3,NEQ	; if ACC != 0 then error

	SUB	#7h		; ACC = fffffff9h & C=0
	SUB	TEMP00,16	; ACC = 0000fff9h & C=0
	SUB	*,16		; ACC = fffffff9h & C=0
	SUBB	TEMP01		; ACC = fffffff7h & C=1
	SUBB	*		; ACC = fffffff6h & C=1
	ADD	#0ah		; ACC = 0 & C=1
	BCND	alu2,EQ,C	; branch if ACC=0 & C=1
	B	eralu3		; branch to error handler

alu2	.set	$+SS

	SUBS	TEMP00		; ACC = ffff0001h
	SUBS	*		; ACC = ffff0000h
	XOR	#0ffffh,16	; ACC = 0
	BCND	eralu3,NEQ	; if ACC != 0 then error

; test SUBC instruction
	LACL	TEMP00		; ACC = ffffh
	SFR			; ACC = 7fffh
	SUBC	TEMP01		; ACC = fffeh
	SUBC	*		; ACC = fffdh
	XOR	#0fffdh		; ACC = 0
	BCND	eralu4,NEQ	; if ACC != 0 then error
*
* TEST OVERFLOW MODE OPERATION
*
	SETC	OVM		; overflow mode on
	CLRC	C		; clear carry bit
	BCND	alu3,OV		; force OV bit to clear

alu3	.set	$+SS

	BCND	eralu5,OV	; if OV = 1 then error
	LACL	#5h             ; ACC = 5h
	ROR			; ACC = 2h & C=1
	ROR			; ACC = 80000001h & C=0
	SUB	#2h		; ACC = 80000000h & OV=1 & C=1
	BCND	eralu5,NOV	; if OV != 1 then error, & OV=0
	XOR	#8000h,16	; ACC = 0
	BCND	eralu5,NEQ	; if ACC != 0 then error

	CMPL			; ACC = ffffffffh
	XOR	#0a000h,16	; ACC = 5fffffffh
	ROL			; ACC = bfffffffh
	ROL			; ACC = 7ffffffeh
	ADD	#2h		; ACC = 7fffffffh
	BCND	eralu5,NOV	; if OV != 1 then error, & OV=0
	CMPL			; ACC = 80000000h
	XOR	#8000h,16	; ACC = 0
	BCND	eralu5,NEQ	; if ACC != 0 then error
	CLRC	OVM		; overflow mode off
*
* TEST NORM AND ZALR INSTRUCTIONS
*
	ZALR	TEMP00		; ACC = ffff8000h
	CMPL			; ACC = 00007fffh
	SUB	#7fffh		; ACC = 0
	BCND	eralu6,NEQ	; if ACC != 0 then error

	LAR	AR0,#TEMP00	; AR0 points to TEMP00
	SPLK	#0dfffh,TEMP00	; data(TEMP00) = dfffh
	CLRC	TC		; clear TC bit
	NORM	*		; TC = 1
	BCND	eralu6,NTC	; if TC != 1 then error
	SAR	AR0,TEMP01	; data(TEMP01) = stores original AR0
	ZALR	*-		; ACC = dfff8000h & AR0 = AR0-1
	NORM	*+		; ACC = bfff0000h & AR0 = AR0+1 & TC=0
	XOR	#0bfffh,16	; ACC = 0 & pipeline align
	BCND	eralu6,NEQ	; if ACC != 0 then error & pipeline align
	BCND	eralu6,TC	; if TC = 1 then error
	SAR	AR0,TEMP02	; data(TEMP02) = modified AR0
	LACC	TEMP02		; ACC = modified AR0
	SUB	TEMP01		; ACC = 0
	BCND	eralu6,NEQ	; if ACC != 0 then error

	RET			; test passes

*
* ERROR HANDLERS
*
eralu1	.set	$+SS

	LACL	#50h		; ALU logical operations error
	RET			; test fails
;
eralu2	.set	$+SS

	LACL	#51h		; ALU addition operations error
	RET			; test fails
;
eralu3	.set	$+SS

	LACL	#52h		; ALU subtraction operations error
	RET			; test fails
;
eralu4	.set	$+SS

	LACL	#53h		; SUBC instruction error
	RET			; test fails
;
eralu5	.set	$+SS

	LACL	#54h		; overflow mode error
	RET			; test fails
;
eralu6	.set	$+SS

	LACL	#55h		; NORM or ZALR error
	RET			; test fails

⌨️ 快捷键说明

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