SX Specific Cyclic Redundancy Check

16 and 32 Bit

By Dr. Imre Bartfai

;By Dr. Imre Bartfai
; What you need is to define the polynomial. E. g. for the CCITT one:

poly0	equ	$21
poly1	equ	$10

; 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>
;
;
crch	DS 1
crcl	DS 1
saved	DS 1
oldcch	DS 1
i	DS 1

CrcUpd	mov	saved, W	; j = W
	mov	W, #8		; W = 8
	mov	i, W		; i = W
_loop	mov	W, crch
	mov	oldcch, W	; temporary save
	clrb	C		; clear carry for rlf
	rl	crcl		; crc << 1
	rl	crch
	mov	W, saved	; the char read
	xor	oldcch, W	; test with old high
	sb	oldcch.7	; if bit set, apply mask
        jmp     _notset         ; otherwise skip
	mov	W, #poly0
	xor	crcl, W
	mov	W, #poly1
	xor	crch, W
_notset	clrb	C		; for rl
	rl	saved		; next bit of saved
	decsz	i
        jmp     _loop
	ret
;
; End CrcUpd