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 + -
显示快捷键?