📄 crc.lis
字号:
.module Crc.c
.area text(rom, con, rel)
0000 .dbfile E:\程序\AVR程序\BOOTLoadICC\Crc.c
0000 .dbfunc e CRC16 _CRC16 fs
0000 ; ACC -> R20,R21
0000 ; byte -> R22,R23
0000 ; TOPBIT -> R10,R11
0000 ; k -> R14
0000 ; remainder -> R12,R13
0000 ; Len -> R18,R19
0000 ; Message -> R16,R17
.even
0000 _CRC16::
0000 0E940000 xcall push_gset5
0004 .dbline -1
0004 .dbline 15
0004 ; #include <iom128v.h>
0004 ; #include "Crc.h"
0004 ;
0004 ; //============================================================
0004 ; //函 数:unsigned short CRC16(unsigned char *Message, int Len)
0004 ; //功 能:CRC16计算
0004 ; //入口参数:Message 要进行CRC16计算字符串,Len字符串长度
0004 ; //返 回 值:CRC16计算结果
0004 ; //设 计 者:覃道堂
0004 ; //创作时间:2004-03-30
0004 ; //修改时间:
0004 ; //修改目的:
0004 ; //============================================================
0004 ; unsigned short CRC16(unsigned char *Message, int Len)
0004 ; {
0004 .dbline 19
0004 ; int byte;
0004 ; unsigned char k;
0004 ; unsigned short ACC,TOPBIT;
0004 ; unsigned short remainder = 0x0000;
0004 CC24 clr R12
0006 DD24 clr R13
0008 .dbline 21
0008 ;
0008 ; TOPBIT = 0x8000;
0008 80E0 ldi R24,32768
000A 90E8 ldi R25,128
000C 5C01 movw R10,R24
000E .dbline 22
000E ; for (byte = 0; byte < Len; ++byte)
000E 6627 clr R22
0010 7727 clr R23
0012 25C0 xjmp L5
0014 L2:
0014 .dbline 23
0014 ; {
0014 .dbline 24
0014 ; ACC = Message[byte];
0014 FB01 movw R30,R22
0016 E00F add R30,R16
0018 F11F adc R31,R17
001A 4081 ldd R20,z+0
001C 5527 clr R21
001E .dbline 25
001E ; remainder ^= (ACC <<8);
001E 1A01 movw R2,R20
0020 322C mov R3,R2
0022 2224 clr R2
0024 C224 eor R12,R2
0026 D324 eor R13,R3
0028 .dbline 26
0028 ; for (k = 8; k > 0; --k)
0028 88E0 ldi R24,8
002A E82E mov R14,R24
002C 13C0 xjmp L9
002E L6:
002E .dbline 27
002E ; {
002E .dbline 28
002E ; if (remainder & TOPBIT)
002E 1601 movw R2,R12
0030 2A20 and R2,R10
0032 3B20 and R3,R11
0034 2220 tst R2
0036 11F4 brne X0
0038 3320 tst R3
003A 49F0 breq L10
003C X0:
003C .dbline 29
003C ; {
003C .dbline 30
003C ; remainder = (remainder << 1) ^0x8005;
003C 85E0 ldi R24,32773
003E 90E8 ldi R25,128
0040 1601 movw R2,R12
0042 220C lsl R2
0044 331C rol R3
0046 2826 eor R2,R24
0048 3926 eor R3,R25
004A 6101 movw R12,R2
004C .dbline 31
004C ; }
004C 02C0 xjmp L11
004E L10:
004E .dbline 33
004E ; else
004E ; {
004E .dbline 34
004E ; remainder = (remainder << 1);
004E CC0C lsl R12
0050 DD1C rol R13
0052 .dbline 35
0052 ; }
0052 L11:
0052 .dbline 36
0052 L7:
0052 .dbline 26
0052 EA94 dec R14
0054 L9:
0054 .dbline 26
0054 2224 clr R2
0056 2E14 cp R2,R14
0058 50F3 brlo L6
005A .dbline 37
005A L3:
005A .dbline 22
005A 6F5F subi R22,255 ; offset = 1
005C 7F4F sbci R23,255
005E L5:
005E .dbline 22
005E 6217 cp R22,R18
0060 7307 cpc R23,R19
0062 C4F2 brlt L2
0064 .dbline 38
0064 ; }
0064 ; }
0064 ; return (remainder^0x0000);
0064 8601 movw R16,R12
0066 .dbline -2
0066 L1:
0066 0E940000 xcall pop_gset5
006A .dbline 0 ; func end
006A 0895 ret
006C .dbsym r ACC 20 s
006C .dbsym r byte 22 I
006C .dbsym r TOPBIT 10 s
006C .dbsym r k 14 c
006C .dbsym r remainder 12 s
006C .dbsym r Len 18 I
006C .dbsym r Message 16 pc
006C .dbend
006C .dbfunc e Verify_Command _Verify_Command fc
006C ; Crc_Tmp -> R20,R21
006C ; Len -> R10,R11
006C ; ReceiveBuf -> R22,R23
.even
006C _Verify_Command::
006C 0E940000 xcall push_gset3
0070 5901 movw R10,R18
0072 B801 movw R22,R16
0074 .dbline -1
0074 .dbline 52
0074 ; }
0074 ;
0074 ; //============================================================
0074 ; //函 数:unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
0074 ; //功 能:CRC校验处理
0074 ; //入口参数:校验数据,校验数据长度
0074 ; //返 回 值:0校验成功。否则不正确
0074 ; //设 计 者:覃道堂
0074 ; //创作时间:2006-03-16
0074 ; //修改时间:
0074 ; //修改目的:
0074 ; //============================================================
0074 ; unsigned char Verify_Command(unsigned char *ReceiveBuf,int Len)
0074 ; {
0074 .dbline 55
0074 ; unsigned short Crc_Tmp;
0074 ;
0074 ; if(ReceiveBuf[4] != (Len - 2))//整包数据长度减去校验和为命令长度
0074 C501 movw R24,R10
0076 0297 sbiw R24,2
0078 FB01 movw R30,R22
007A 2480 ldd R2,z+4
007C 3324 clr R3
007E 2816 cp R2,R24
0080 3906 cpc R3,R25
0082 11F0 breq L13
0084 .dbline 56
0084 ; return 1;
0084 01E0 ldi R16,1
0086 1EC0 xjmp L12
0088 L13:
0088 .dbline 58
0088 ;
0088 ; Crc_Tmp = ReceiveBuf[Len-2]*0x100 + ReceiveBuf[Len-1];
0088 F501 movw R30,R10
008A 3297 sbiw R30,2
008C E60F add R30,R22
008E F71F adc R31,R23
0090 2081 ldd R18,z+0
0092 3327 clr R19
0094 00E0 ldi R16,256
0096 11E0 ldi R17,1
0098 0E940000 xcall empy16s
009C A801 movw R20,R16
009E F501 movw R30,R10
00A0 3197 sbiw R30,1
00A2 E60F add R30,R22
00A4 F71F adc R31,R23
00A6 2080 ldd R2,z+0
00A8 3324 clr R3
00AA 420D add R20,R2
00AC 531D adc R21,R3
00AE .dbline 60
00AE ;
00AE ; if((CRC16(ReceiveBuf, Len-2)) !=Crc_Tmp)
00AE 9501 movw R18,R10
00B0 2250 subi R18,2
00B2 3040 sbci R19,0
00B4 8B01 movw R16,R22
00B6 A4DF xcall _CRC16
00B8 0417 cp R16,R20
00BA 1507 cpc R17,R21
00BC 11F0 breq L15
00BE .dbline 61
00BE ; return 3;
00BE 03E0 ldi R16,3
00C0 01C0 xjmp L12
00C2 L15:
00C2 .dbline 62
00C2 ; return 0;
00C2 0027 clr R16
00C4 .dbline -2
00C4 L12:
00C4 0E940000 xcall pop_gset3
00C8 .dbline 0 ; func end
00C8 0895 ret
00CA .dbsym r Crc_Tmp 20 s
00CA .dbsym r Len 10 I
00CA .dbsym r ReceiveBuf 22 pc
00CA .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -