📄 crc16.ls1
字号:
232 ?PR?_cksum?CRC16 SEGMENT CODE
233 ?XD?_cksum?CRC16 SEGMENT XDATA OVERLAYABLE
234 EXTRN CODE (?C?CLDPTR)
235 EXTRN CODE (?C?LSTKXDATA)
236 EXTRN CODE (?C?ILDIX)
237 EXTRN CODE (?C?LSTXDATA)
238 EXTRN CODE (?C?ULSHR)
239 PUBLIC _cksum
240 PUBLIC _cal_crc
241
---- 242 RSEG ?XD?_cksum?CRC16
0000 243 ?_cksum?BYTE:
0000 244 length?145: DS 2
0002 245 ORG 2
0002 246 sum?146: DS 4
0006 247 ORG 6
0006 248 i?147: DS 2
0008 249 ORG 8
0008 250 ptr?148: DS 2
251
---- 252 RSEG ?XD?_cal_crc?CRC16
0000 253 ?_cal_crc?BYTE:
0000 254 len?041: DS 1
0001 255 ORG 1
0001 256 i?042: DS 1
A51 MACRO ASSEMBLER CRC16 08/03/2009 16:57:29 PAGE 5
257 ; /******************************************************************************
258 ; ** 函数: cal_crc
259 ; ** 入参: unsigned char *ptr, unsigned char len
260 ; ** 返回: unsigned int crc
261 ; ** 作者: jerkoh
262 ; ** 说明:CRC16-CCITT x16+x12+x5+1 1021 初始crc=0; crc=0xffff
263 ; CRC寄存器组初始化为全"0"(0x0000)。
264 ; 注意:CRC寄存器组初始化全为1时,最后CRC应取反
265 ; ******************************************************************************/
266 ; #include "global.h"
267 ;
268 ;
269 ; unsigned int cal_crc(unsigned char *ptr, unsigned char len)
270
---- 271 RSEG ?PR?_cal_crc?CRC16
0000 272 _cal_crc:
273 USING 0
274 ; SOURCE LINE # 13
0000 900000 F 275 MOV DPTR,#len?041
0003 ED 276 MOV A,R5
0004 F0 277 MOVX @DPTR,A
278 ;---- Variable 'ptr?040' assigned to Register 'R1/R2/R3' ----
279 ; {
280 ; SOURCE LINE # 14
281 ; unsigned char i;
282 ; unsigned int crc=0xffff;
283 ; SOURCE LINE # 16
284 ;---- Variable 'crc?043' assigned to Register 'R6/R7' ----
0005 74FF 285 MOV A,#0FFH
0007 FF 286 MOV R7,A
0008 FE 287 MOV R6,A
0009 288 ?C0001:
289 ;
290 ; while(len--!=0)
291 ; SOURCE LINE # 18
0009 900000 F 292 MOV DPTR,#len?041
000C E0 293 MOVX A,@DPTR
000D FD 294 MOV R5,A
000E 14 295 DEC A
000F F0 296 MOVX @DPTR,A
0010 ED 297 MOV A,R5
0011 6049 298 JZ ?C0002
299 ; {
300 ; SOURCE LINE # 19
301 ; for(i=0x80;i!=0;i/=2) /*8字节*/
302 ; SOURCE LINE # 20
0013 A3 303 INC DPTR
0014 7480 304 MOV A,#080H
0016 F0 305 MOVX @DPTR,A
0017 306 ?C0003:
0017 900000 F 307 MOV DPTR,#i?042
001A E0 308 MOVX A,@DPTR
001B 6036 309 JZ ?C0004
310 ; {
311 ; SOURCE LINE # 21
312 ; if((crc&0x8000)!=0)
313 ; SOURCE LINE # 22
001D EE 314 MOV A,R6
001E 30E70F 315 JNB ACC.7,?C0006
316 ; {
317 ; SOURCE LINE # 23
318 ; crc*=2;
319 ; SOURCE LINE # 24
0021 EF 320 MOV A,R7
0022 25E0 321 ADD A,ACC
0024 FF 322 MOV R7,A
A51 MACRO ASSEMBLER CRC16 08/03/2009 16:57:29 PAGE 6
0025 EE 323 MOV A,R6
0026 33 324 RLC A
325 ; crc^=0x1021; /*左移异或CRC*/
326 ; SOURCE LINE # 25
0027 6410 327 XRL A,#010H
0029 FE 328 MOV R6,A
002A EF 329 MOV A,R7
002B 6421 330 XRL A,#021H
002D FF 331 MOV R7,A
332 ; }
333 ; SOURCE LINE # 26
002E 8007 334 SJMP ?C0007
0030 335 ?C0006:
336 ; else
337 ; {
338 ; SOURCE LINE # 28
339 ; crc*=2;
340 ; SOURCE LINE # 29
0030 EF 341 MOV A,R7
0031 25E0 342 ADD A,ACC
0033 FF 343 MOV R7,A
0034 EE 344 MOV A,R6
0035 33 345 RLC A
0036 FE 346 MOV R6,A
347 ; }
348 ; SOURCE LINE # 30
0037 349 ?C0007:
350 ; if((*ptr&i)!=0) crc^=0x1021;
351 ; SOURCE LINE # 31
0037 120000 F 352 LCALL ?C?CLDPTR
003A FD 353 MOV R5,A
003B 900000 F 354 MOV DPTR,#i?042
003E E0 355 MOVX A,@DPTR
003F 5D 356 ANL A,R5
0040 6008 357 JZ ?C0005
0042 EE 358 MOV A,R6
0043 6410 359 XRL A,#010H
0045 FE 360 MOV R6,A
0046 EF 361 MOV A,R7
0047 6421 362 XRL A,#021H
0049 FF 363 MOV R7,A
364 ; }
365 ; SOURCE LINE # 32
004A 366 ?C0005:
004A 900000 F 367 MOV DPTR,#i?042
004D E0 368 MOVX A,@DPTR
004E C3 369 CLR C
004F 13 370 RRC A
0050 F0 371 MOVX @DPTR,A
0051 80C4 372 SJMP ?C0003
0053 373 ?C0004:
374 ; ptr++;
375 ; SOURCE LINE # 33
0053 7401 376 MOV A,#01H
0055 29 377 ADD A,R1
0056 F9 378 MOV R1,A
0057 E4 379 CLR A
0058 3A 380 ADDC A,R2
0059 FA 381 MOV R2,A
382 ;
383 ; }
384 ; SOURCE LINE # 35
005A 80AD 385 SJMP ?C0001
005C 386 ?C0002:
387 ; return(crc);
388 ; SOURCE LINE # 36
A51 MACRO ASSEMBLER CRC16 08/03/2009 16:57:29 PAGE 7
389 ; }
390 ; SOURCE LINE # 37
005C 391 ?C0009:
005C 22 392 RET
393 ; END OF _cal_crc
394
395 ;
396 ;
397 ; /******************************************************************************
398 ; ** 函数: cksum()
399 ; ** 入参: rxdata
400 ; ** 返回: sum
401 ; ** 说明:
402 ; ******************************************************************************/
403 ; UINT cksum(UCHAR xdata *check,UINT length) //计算校验和
404
---- 405 RSEG ?PR?_cksum?CRC16
0000 406 _cksum:
407 USING 0
408 ; SOURCE LINE # 46
0000 900000 F 409 MOV DPTR,#length?145
0003 EC 410 MOV A,R4
0004 F0 411 MOVX @DPTR,A
0005 A3 412 INC DPTR
0006 ED 413 MOV A,R5
0007 F0 414 MOVX @DPTR,A
415 ;---- Variable 'check?144' assigned to Register 'R2/R3' ----
0008 AB07 416 MOV R3,AR7
000A AA06 417 MOV R2,AR6
418 ; {
419 ; SOURCE LINE # 47
420 ; LONG sum=0;
421 ; SOURCE LINE # 48
000C A3 422 INC DPTR
000D 120000 F 423 LCALL ?C?LSTKXDATA
0010 00 424 DB 00H
0011 00 425 DB 00H
0012 00 426 DB 00H
0013 00 427 DB 00H
428 ; UINT i;
429 ; UINT xdata *ptr;
430 ; ptr=(UINT xdata *)check;
431 ; SOURCE LINE # 51
0014 AF03 432 MOV R7,AR3
0016 900000 F 433 MOV DPTR,#ptr?148
0019 EA 434 MOV A,R2
001A F0 435 MOVX @DPTR,A
001B A3 436 INC DPTR
001C EF 437 MOV A,R7
001D F0 438 MOVX @DPTR,A
439 ; for (i=0;i<(length)/2;i++)
440 ; SOURCE LINE # 52
001E E4 441 CLR A
001F 900000 F 442 MOV DPTR,#i?147
0022 F0 443 MOVX @DPTR,A
0023 A3 444 INC DPTR
0024 F0 445 MOVX @DPTR,A
0025 446 ?C0010:
0025 900000 F 447 MOV DPTR,#length?145
0028 E0 448 MOVX A,@DPTR
0029 C3 449 CLR C
002A 13 450 RRC A
002B FE 451 MOV R6,A
002C A3 452 INC DPTR
002D E0 453 MOVX A,@DPTR
002E 13 454 RRC A
A51 MACRO ASSEMBLER CRC16 08/03/2009 16:57:29 PAGE 8
002F FF 455 MOV R7,A
0030 C3 456 CLR C
0031 900000 F 457 MOV DPTR,#i?147+01H
0034 E0 458 MOVX A,@DPTR
0035 9F 459 SUBB A,R7
0036 900000 F 460 MOV DPTR,#i?147
0039 E0 461 MOVX A,@DPTR
003A 9E 462 SUBB A,R6
003B 504B 463 JNC ?C0011
464 ; {
465 ; SOURCE LINE # 53
466 ; sum+=*ptr++;
467 ; SOURCE LINE # 54
003D 900000 F 468 MOV DPTR,#sum?146
0040 E0 469 MOVX A,@DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -