CRC16 - Polynom 0x8005

Relevant links:
http://www.summitinstruments.com/knowledge_center/pdf/TN410.pdf
http://www.lammertbies.nl/comm/info/crc-calculation.html?crc=12345678987...

This is sample code. Add error handling and adjust to your requirements as necessary.

* The code below seems to produce correct result but it hasn't been tested thoroughly. 
* Polynom = 0x8005
#DEFINE CRC16 0xA001
 
* Build CRC table
DIMENSION laCrc[256]
 
FOR i=0 TO 255
 
	lnData = i
	lnCrc = 0
	FOR j=0 TO 7
		IF BITAND(BITXOR(lnData, lnCrc),1) > 0
			lnCrc = BITXOR(BITRSHIFT(lnCrc,1), CRC16)
		ELSE
			lnCrc = BITRSHIFT(lnCrc,1)
		ENDIF
 
		lnData = BITRSHIFT(lnData,1)
 
	ENDFOR
 
	*? i, TRANSFORM(lnCrc, "@0")
	laCrc[i+1] = lnCrc
ENDFOR
 
* Calculate CRC16
lcStr = "1234567898765421"
 
lnCrc = 0
FOR i=1 TO LEN(lcStr)
	lnByte = ASC(SUBSTR(lcStr,i,1))
	lnCrc = BITXOR( BITRSHIFT(lnCrc,8), ;
				laCrc[BITXOR(BITAND(lnCrc, 0xFF), lnByte)+1])
ENDFOR
? TRANSFORM(lnCrc, "@0")