📄 crc.s
字号:
.module Crc.c
.area text(rom, con, rel)
.dbfile E:\程序\AVR程序\BOOTLoadICC\Crc.c
.dbfunc e CRC16 _CRC16 fs
; ACC -> R20,R21
; byte -> R22,R23
; TOPBIT -> R10,R11
; k -> R14
; remainder -> R12,R13
; Len -> R18,R19
; Message -> R16,R17
.even
_CRC16::
xcall push_gset5
.dbline -1
.dbline 15
; #include <iom128v.h>
; #include "Crc.h"
;
; //============================================================
; //函 数:unsigned short CRC16(unsigned char *Message, int Len)
; //功 能:CRC16计算
; //入口参数:Message 要进行CRC16计算字符串,Len字符串长度
; //返 回 值:CRC16计算结果
; //设 计 者:覃道堂
; //创作时间:2004-03-30
; //修改时间:
; //修改目的:
; //============================================================
; unsigned short CRC16(unsigned char *Message, int Len)
; {
.dbline 19
; int byte;
; unsigned char k;
; unsigned short ACC,TOPBIT;
; unsigned short remainder = 0x0000;
clr R12
clr R13
.dbline 21
;
; TOPBIT = 0x8000;
ldi R24,32768
ldi R25,128
movw R10,R24
.dbline 22
; for (byte = 0; byte < Len; ++byte)
clr R22
clr R23
xjmp L5
L2:
.dbline 23
; {
.dbline 24
; ACC = Message[byte];
movw R30,R22
add R30,R16
adc R31,R17
ldd R20,z+0
clr R21
.dbline 25
; remainder ^= (ACC <<8);
movw R2,R20
mov R3,R2
clr R2
eor R12,R2
eor R13,R3
.dbline 26
; for (k = 8; k > 0; --k)
ldi R24,8
mov R14,R24
xjmp L9
L6:
.dbline 27
; {
.dbline 28
; if (remainder & TOPBIT)
movw R2,R12
and R2,R10
and R3,R11
tst R2
brne X0
tst R3
breq L10
X0:
.dbline 29
; {
.dbline 30
; remainder = (remainder << 1) ^0x8005;
ldi R24,32773
ldi R25,128
movw R2,R12
lsl R2
rol R3
eor R2,R24
eor R3,R25
movw R12,R2
.dbline 31
; }
xjmp L11
L10:
.dbline 33
; else
; {
.dbline 34
; remainder = (remainder << 1);
lsl R12
rol R13
.dbline 35
; }
L11:
.dbline 36
L7:
.dbline 26
dec R14
L9:
.dbline 26
clr R2
cp R2,R14
brlo L6
.dbline 37
L3:
.dbline 22
subi R22,255 ; offset = 1
sbci R23,255
L5:
.dbline 22
cp R22,R18
cpc R23,R19
brlt L2
.dbline 38
; }
; }
; return (remainder^0x0000);
movw R16,R12
.dbline -2
L1:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r ACC 20 s
.dbsym r byte 22 I
.dbsym r TOPBIT 10 s
.dbsym r k 14 c
.dbsym r remainder 12 s
.dbsym r Len 18 I
.dbsym r Message 16 pc
.dbend
.dbfunc e Verify_Command _Verify_Command fc
; Crc_Tmp -> R20,R21
; Len -> R10,R11
; ReceiveBuf -> R22,R23
.even
_Verify_Command::
xcall push_gset3
movw R10,R18
movw R22,R16
.dbline -1
.dbline 52
; }
;
; //============================================================
; //函 数:unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
; //功 能:CRC校验处理
; //入口参数:校验数据,校验数据长度
; //返 回 值:0校验成功。否则不正确
; //设 计 者:覃道堂
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
; {
.dbline 55
; unsigned short Crc_Tmp;
;
; if(ReceiveBuf[4] != (Len - 2))//整包数据长度减去校验和为命令长度
movw R24,R10
sbiw R24,2
movw R30,R22
ldd R2,z+4
clr R3
cp R2,R24
cpc R3,R25
breq L13
.dbline 56
; return 1;
ldi R16,1
xjmp L12
L13:
.dbline 58
;
; Crc_Tmp = ReceiveBuf[Len-2]*0x100 + ReceiveBuf[Len-1];
movw R30,R10
sbiw R30,2
add R30,R22
adc R31,R23
ldd R18,z+0
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
movw R20,R16
movw R30,R10
sbiw R30,1
add R30,R22
adc R31,R23
ldd R2,z+0
clr R3
add R20,R2
adc R21,R3
.dbline 60
;
; if((CRC16(ReceiveBuf, Len-2)) !=Crc_Tmp)
movw R18,R10
subi R18,2
sbci R19,0
movw R16,R22
xcall _CRC16
cp R16,R20
cpc R17,R21
breq L15
.dbline 61
; return 3;
ldi R16,3
xjmp L12
L15:
.dbline 62
; return 0;
clr R16
.dbline -2
L12:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Crc_Tmp 20 s
.dbsym r Len 10 I
.dbsym r ReceiveBuf 22 pc
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -