;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