crc16.asm

来自「dsp tmslf2407a 汇编,c的原代码,包括i2c,scitimer,f」· 汇编 代码 · 共 344 行

ASM
344
字号
*******************************************************
* TMS320C2x/C2xx/C5x ANSI C Codegen Version 7.00       
*******************************************************
;	C:\tic2xx\c2000\cgtools\bin\dspac.exe -v2xx crc16.c C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\crc16.if 
;	dspopt NOT RUN
;	C:\tic2xx\c2000\cgtools\bin\dspcg.exe -o -v2xx -o C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\crc16.if C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\crc16.asm C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\crc16.tmp 
	.port
	.file	"crc16.c"
	.file	"global.h"
	.globl	_port8001
	.file	"crc16.c"
	.globl	_deviceAddr
	.globl	_pcdata
	.globl	_crc16Calculate
	.globl	_verifyType
	.globl	_chkCRC_re
	.text

	.sym	_crc16Calculate,_crc16Calculate,44,2,0
	.globl	_crc16Calculate

	.func	20
;>>>> 	uchar crc16Calculate(uchar *pBuf, uchar byLen)
******************************************************
* FUNCTION DEF : _crc16Calculate
******************************************************
_crc16Calculate:

LF1	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,4
	LAR	AR0,*0+,AR2

	.sym	_pBuf,-3+LF1,28,9,16
	.sym	_byLen,-4+LF1,12,9,16
	.sym	_current_crc_value,1,14,1,16
	.sym	_i,2,12,1,16
	.sym	_j,3,12,1,16
	.line	2
;>>>> 		unsigned int current_crc_value;
;>>>> 		uchar i,j; 	 
	.line	6
;>>>> 	 	current_crc_value = PRESET_VALUE;
	LARK	AR2,1
	MAR	*0+
	SPLK	#65535,*+
	.line	7
;>>>> 	 	for(i=0;i<byLen;i++)
	LACK	0
	SACL	* 
	ZALS	* 
	SBRK	6-LF1
	SUBS	* 
	BGEZ	L2
	ADRK	6-LF1
L1:
	.line	9
;>>>> 	  		current_crc_value = current_crc_value^pBuf[i];
	LAC	* 
	SBRK	5-LF1
	ADD	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	ADRK	4-LF1
	XOR	* 
	SACL	* 
	.line	10
;>>>> 		   	for(j=0;j<8;j++)
	LACK	0
	ADRK	2
	SACL	* 
	ZALS	* 
	SUBK	8
	BGEZ	L4
	SBRK	2
L3:
	.line	12
;>>>> 	     			if(current_crc_value & 0x0001)     			
	BIT	* ,15
	BBZ	L5
	.line	13
;>>>> 	       				current_crc_value = (current_crc_value>>1)^POLYNOMIAL;      		
;>>>> 	     			else      		
	RSXM
	LAC	* ,14
	XORK	33800,15
	SACH	* ,1
	B	L6
L5:
	.line	15
;>>>> 	        			current_crc_value = (current_crc_value>>1);      		
	RSXM
	LAC	* ,14
	SACH	* ,1
L6:
	.line	10
	ADRK	2
	LAC	* 
	ADDK	1
	SACL	* 
	ZALS	* 
	SUBK	8
	SBRK	2
	BLZ	L3
L4:
	.line	7
	LARK	AR2,2
	MAR	*0+
	LAC	* 
	ADDK	1
	SACL	* 
	ZALS	* 
	SBRK	6-LF1
	SUBS	* 
	ADRK	6-LF1
	BLZ	L1
L2:
	.line	18
;>>>> 		current_crc_value = ~current_crc_value;		
	LARK	AR2,1
	MAR	*0+
	LAC	* 
	CMPL
	SACL	* 
	.line	19
;>>>> 	 	return(current_crc_value);
	ZALS	* 
EPI0_1:
	.line	20
	MAR	* ,AR1
	SBRK	5
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	39,000000000H,4

	.sym	_verifyType,_verifyType,44,2,0
	.globl	_verifyType

	.func	41
;>>>> 	uchar verifyType()  
;>>>> 	   	uchar type;
******************************************************
* FUNCTION DEF : _verifyType
******************************************************
_verifyType:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.sym	_type,1,12,1,16
	.line	5
;>>>> 	   	if( deviceAddr == pcdata[1] ){ type = 1;} 	/*地址合法*/
	LDPK	_deviceAddr
	LAC	_deviceAddr
	LDPK	_pcdata+1
	SUB	_pcdata+1
	BNZ	L7
	LACK	1
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	B	L8
L7:
	.line	6
;>>>> 	   	else if(pcdata[1] == 0xfe)  { type = 2;}     /*广播地址*/
	LAC	_pcdata+1
	SUBK	254
	BNZ	L9
	LACK	2
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	B	L8
L9:
	.line	7
;>>>> 	   	else if(pcdata[1] == 0xff)  { type = 3;}     /**/
	LAC	_pcdata+1
	SUBK	255
	BNZ	L10
	LACK	3
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	B	L8
L10:
	.line	8
;>>>> 	   	else                        { type = 0;}
	LACK	0
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
L8:
	.line	10
;>>>> 	   	if(type)   	
	LAC	* 
	BZ	L11
	.line	11
;>>>> 	      		if(!chkCRC_re(pcdata,pcdata[0]))type = 0;      /*CRC校验正确*/	
	MAR	* ,AR1
	BLKD	_pcdata+0,*+
	RSXM
	LALK	_pcdata+0
	SACL	*+
	CALL	_chkCRC_re
	SBRK	2
	BNZ	L11
	LACK	0
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
L11:
	.line	12
;>>>> 	   	return(type);
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	ZALS	* 
EPI0_2:
	.line	13
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	53,000000000H,2

	.sym	_chkCRC_re,_chkCRC_re,44,2,0
	.globl	_chkCRC_re

	.func	55
;>>>> 	uchar chkCRC_re(uchar * cBuf,uchar cLen)
******************************************************
* FUNCTION DEF : _chkCRC_re
******************************************************
_chkCRC_re:

LF3	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,3
	LAR	AR0,*0+,AR2

	.sym	_cBuf,-3+LF3,28,9,16
	.sym	_cLen,-4+LF3,12,9,16
	.sym	_flag,1,12,1,16
	.sym	_j,2,12,1,16
	.line	2
	.line	3
;>>>> 	   	uchar flag=1 ; 
;>>>> 	   	uchar j; 
	LACK	1
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	.line	5
;>>>> 	   	j = ~ crc16Calculate(cBuf,cLen-2);
	SBRK	5-LF3
	LAC	*+,AR1
	SUBK	2
	SACL	*+,AR2
	LAC	* ,AR1
	SACL	*+
	CALL	_crc16Calculate
	SBRK	2
	CMPL
	MAR	* ,AR2
	LARK	AR2,2
	MAR	*0+
	SACL	* 
	.line	6
;>>>> 	   	flag  = (cBuf[cLen-2] == (j&0x00ff) );	//crc MSByte
	LACK	255
	AND	* ,AR1
	SACL	*+,AR2
	SBRK	5-LF3
	LAC	*-
	SUBK	2
	ADD	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR1
	MAR	*-,AR3
	ZALS	* ,AR1
	SUBS	* 
	LARK	AR3,1
	BZ	LL5
	LARK	AR3,0
LL5:
	MAR	* ,AR2
	ADRK	5-LF3
	SAR	AR3,*+
	.line	7
;>>>> 	   	flag &= (cBuf[cLen-1] == (j>>8) );	//crc LSByte
	RSXM
	LAC	* ,7,AR1
	SACH	*+,1,AR2
	SBRK	5-LF3
	LAC	*-
	SUBK	1
	ADD	* ,AR0
	SACL	* 
	LAR	AR4,* ,AR1
	MAR	*-,AR4
	ZALS	* ,AR1
	SUBS	* 
	LARK	AR4,1
	BZ	LL6
	LARK	AR4,0
LL6:
	MAR	* ,AR2
	ADRK	5-LF3
	LAC	* ,AR0
	SAR	AR4,*
	AND	* ,AR2
	SACL	* 
	.line	8
;>>>> 	   	return(flag);
	ZALS	* 
EPI0_3:
	.line	9
	MAR	* ,AR1
	SBRK	4
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	63,000000000H,3
	.end

⌨️ 快捷键说明

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