
;#define ROLL_L
;#define ROLL_R

	USING	0
;
START:
; CRC empty
	MOV	R0,#0
	MOV	R1,#0

; data array: 2 bytes of data + 2 bytes of their CRC
	MOV	R2,#0x12
	CALL	CRC_CALC
	MOV	R2,#0x34
	CALL	CRC_CALC
	MOV	R2,#0x13
	CALL	CRC_CALC
	MOV	R2,#0xC6
	CALL	CRC_CALC
	JMP	$

#ifdef ROLL_L
; MSB rotation CRC-16 with 0x1021
; C <- R1 <- R0 <- R2
CRC_CALC:
	MOV	R7,#8
CRC_CYC:
	MOV	A,R2
	RLC	A
	MOV	R2,A
	MOV	A,R0
	RLC	A
	MOV	R0,A
	MOV	A,R1
	RLC	A
	MOV	R1,A
	JNC	CRC_NEXT
	MOV	A,#0x10
	XRL	AR1,A
	MOV	A,#0x21
	XRL	AR0,A
CRC_NEXT:
	DJNZ	R7,CRC_CYC
	RET
#endif

#ifdef ROLL_R
; LSB rotation CRC-16 with 0x8408
; R2 -> R1 -> R0 -> C
CRC_CALC:
	MOV	R7,#8
CRC_CYC:
	MOV	A,R2
	RRC	A
	MOV	R2,A
	MOV	A,R1
	RRC	A
	MOV	R1,A
	MOV	A,R0
	RRC	A
	MOV	R0,A
	JNC	CRC_NEXT
	MOV	A,#0x84
	XRL	AR1,A
	MOV	A,#0x08
	XRL	AR0,A
CRC_NEXT:
	DJNZ	R7,CRC_CYC
	RET
#endif

	END
