By Dr. Imre Bartfai
; What you need is to define the polynomial. E. g. for the CCITT one: poly0 equ 0x21 poly1 equ 0x10 ; Do not forget to initialize <crcval> = <crch:crcl> before the 1st call ; e. g. with 0xFF or with zeroes, as the particular CRC algorithm ; requires. ;This subroutine calculates a 16-bit CRC ;-------- ; CrcUpd: update <crcval> using <W> ; ; CBLOCK crcblk crch crcl saved oldcch i ENDC CrcUpd movwf saved ; j = W movlw d'8' ; W = 8 movwf i ; i = W _loop movfw crch movwf oldcch ; temporary save clrc ; clear carry for rlf rlf crcl ; crc << 1 rlf crch movfw saved ; the char read xorwf oldcch,F ; test with old high btfss oldcch,7 ; if bit set, apply mask b _notset ; otherwise skip movlw poly0 xorwf crcl,F movlw poly1 xorwf crch,F _notset clrc ; for rlf rlf saved,F ; next bit of saved decfsz i,F b _loop return ; ; End CrcUpd
; Simple CRC routine ; from John Payson 1998-10-23 xorwf crcH ; Compute the LSB first [based upon MSB] movlw 0 btfsc crcH,0 xorlw 33 btfsc crcH,1 xorlw 66 btfsc crcH,2 xorlw 132 btfsc crcH,3 xorlw 8 btfsc crcH,4 xorlw 49 btfsc crcH,5 xorlw 98 btfsc crcH,6 xorlw 196 btfsc crcH,7 xorlw 136 ; Swap crcL with W xorwf crcL,f xorwf crcL,w xorwf crcL,f ; Next compute the MSB [note W holds old LSB] btfsc crcH,0 xorlw 16 btfsc crcH,1 xorlw 32 btfsc crcH,2 xorlw 64 btfsc crcH,3 xorlw 129 btfsc crcH,4 xorlw 18 btfsc crcH,5 xorlw 36 btfsc crcH,6 xorlw 72 btfsc crcH,7 xorlw 145 movwf crcH
Interested: