Here's a CRC-16 implementation from my web page (http://home.netcom.com/~fastfwd/answers.html#PIC00076):
This isn't the fastest possible implementation, but it should be quick enough for most purposes. It uses the standard X.25 (and XMODEM) polynomial: x^16+x^12+x^5+1.
CRCHI EQU some register
CRCLO EQU another register
CLRF CRCHI
CLRF CRCLO
;Append 16 "0" bits to your message here.
LOOP: ;If there are no more bits in your message, go to
;"DONE". Otherwise, left-shift the next bit of your
;message into the carry here.
RLF CRCLO
RLF CRCHI
SKPC ;X^16
GOTO LOOP
MOVLW 00010000B ;X^12
XORWF CRCHI ;
MOVLW 00100001B ;X^5 + 1
XORWF CRCLO ;
GOTO LOOP
DONE: ;The CRC is in "CRCHI" and "CRCLO".