;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