list p=16f84,t=ON,c=132,n=80 radix dec CBLOCK 0x20 crc_hi ; The CRC Register crc_lo temp ENDC org 0 goto start ;================================================================== ; ; ; unsigned int crc_8408_looped( unsigned char *pMsg, int length) ; { ; int i; ; unsigned int data; ; ; if( length == 0) ; { ; return 0; ; } ; ; //crc = 0xFFFF; ; //crc = 0; ; do { ; data = *pMsg++; ; crc = crc ^ data; ; for( i = 8; i > 0; --i) ; { ; /* test the lsb for '1' */ ; if( crc & 0x0001) ; { ; crc = (crc >> 1) ^ CRC_POLY; ; } ; else ; { ; crc = (crc >> 1); ; } ; crc &= 0xffff; ; } ; } ; while (--length > 0); ; ; return( crc); ; ; /* bitwise invert crc and return */ ; //return( ~crc); ; } ; ;dh_ch[16]= { 00, 10, 21, 31, 42, 52, 63, 73, 84, 94, a5, b5, c6, d6, e7, f7, }; ;dh_cl[16]= { 00, 81, 02, 83, 04, 85, 06, 87, 08, 89, 0a, 8b, 0c, 8d, 0e, 8f, }; ;dl_ch[16]= { 00, 11, 23, 32, 46, 57, 65, 74, 8c, 9d, af, be, ca, db, e9, f8, }; ;dl_cl[16]= { 00, 89, 12, 9b, 24, ad, 36, bf, 48, c1, 5a, d3, 6c, e5, 7e, f7, }; ; ; //===================================================== ; // unlooped version ; // ; unsigned int crc_8408( unsigned char *pMsg, int length) ; { ; ; int i,j; ; int k; ; unsigned int data; ; ; if( length == 0) ; { ; return 0; ; } ; ; //crc = 0xFFFF; ; //crc = 0; ; do { ; data = (crc & 0xff) ^ (*pMsg++); ; i = data & 0xf; ; j = (data >> 4) &0x0f; ; ; #ifdef USE_TABLE ; crc = (dl_cl[i] ^ dh_cl[j] ^ ((dl_ch[i] ^ dh_ch[j]) << 8)) ^ (crc >>8); ; #else ; k = i ^ j; ; crc = ( ( ((k<<7) ^ (i<<3) ^ k)&0xff) ^ ; ((((k<<4) ^ (k>>1) ^ i)&0xff) << 8)) ^ (crc >>8); ; #endif ; ; } while (--length > 0); ; ; return( crc); ; ; /* bitwise invert crc and return */ ; //return( ~crc); ; } ; ; PIC implementation: crc_8408: XORWF crc_lo,W ;W = CD ^ ab ==> xy MOVWF temp ;temp = xy SWAPF temp,F ;W = yx RRF temp,w ANDLW 0x78 ;y<<3 XORWF crc_hi,W ;W = AB ^ (y<<3) MOVWF crc_lo ;LO = AB ^ (y<<3) SWAPF temp,W ;W = xy XORWF temp,W ;W = (y^x) | (x^y) = kk MOVWF crc_hi ;HI = kk ANDLW 0x0f ;W = 0k XORWF crc_lo,W ;W = AB ^ (y<<3) ^ k BTFSC crc_hi,0 ; XORLW 0x80 ;W = AB ^ (y<<3) ^ k ^ (k<<7) MOVWF crc_lo ;LO = AB ^ (y<<3) ^ k ^ (k<<7) SWAPF temp,W ;W = xy ANDLW 0xf0 ;W = x0 XORWF crc_hi,F ;W = y<<4 | x^y RRF crc_hi,W ;W = (y<<4 | x^y) >> 1 ANDLW 7 ;W = x^y >> 1 SWAPF crc_hi,F ;W = x^y<<4 | y XORWF crc_hi,F ;HI = kx ^ k>>1 = (k<<4) ^ y ^ (k>>1) RETURN ;===================================================================== start: CLRF crc_lo CLRF crc_hi MOVLW 0xff call crc_8408 ; 0f78 MOVLW '2' call crc_8408 ; ed51 MOVLW '3' call crc_8408 ; 40f9 MOVLW '4' call crc_8408 ; 1da9 MOVLW '5' call crc_8408 ; 5ef8 MOVLW '6' call crc_8408 ; 2f2c MOVLW '7' call crc_8408 ; ae7d MOVLW '8' call crc_8408 ; 1507 goto start end