;BY BRUNO FASCENDINI

	cblock	0x??
		cont,
		poly1,poly2,poly3,poly4,
		value1,value2,value3,value4,
		enter_value1,enter_value2,enter_value3,enter_value4,
		exit_value1,exit_value2,exit_value3,exit_value4
	endc


;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CALC_CRC5
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Calcula CRC de polinomios de 6 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Recibe:
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;value1: byte del valor del cual calcular el CRC
;poly1: byte del valor del polinomio ASOCIADO* con el cual se calcula el CRC
;enter_value1: byte del valor de entrada con el cual realizar XOR
;exit_value1:byte del valor de salida con el cual realizar XOR
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Devuelve:
;value1: byte con el CRC calculado
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CALC_CRC5
	movf	enter_value1,W
	xorwf	value1,F

	movlw	.5
	movwf	cont

next_crc5
	bcf		STATUS,C
	rrf		value1,F
	
	movf	poly1,W
	btfsc	STATUS,C
	xorwf	value1,F

	decfsz	cont,f
	goto	next_crc5

	movf	exit_value1,W
	xorwf	value1,F
	
	return

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CALC_CRC7
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Calcula CRC de polinomios de 8 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Recibe:
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;value1: byte del valor del cual calcular el CRC
;poly1: byte del valor del polinomio ASOCIADO* con el cual se calcula el CRC
;enter_value1: byte del valor de entrada con el cual realizar XOR
;exit_value1:byte del valor de salida con el cual realizar XOR
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Devuelve:
;value1: byte con el CRC calculado
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CALC_CRC7
	movf	enter_value1,W
	xorwf	value1,F

	movlw	.7
	movwf	cont

next_crc7
	bcf		STATUS,C
	rrf		value1,F
	
	movf	poly1,W
	btfsc	STATUS,C
	xorwf	value1,F

	decfsz	cont,f
	goto	next_crc7

	movf	exit_value1,W
	xorwf	value1,F
	
	return

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CALC_CRC8
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Calcula CRC de polinomios de 9 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Recibe:
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;value1: byte del valor del cual calcular el CRC
;poly1: byte del valor del polinomio ASOCIADO* con el cual se calcula el CRC
;enter_value1: byte del valor de entrada con el cual realizar XOR
;exit_value1:byte del valor de salida con el cual realizar XOR
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Devuelve:
;value1: byte con el CRC calculado
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CALC_CRC8
	movf	enter_value1,W
	xorwf	value1,F

	movlw	.8
	movwf	cont

next_crc8
	bcf		STATUS,C
	rrf		value1,F
	
	movf	poly1,W
	btfsc	STATUS,C
	xorwf	value1,F

	decfsz	cont,f
	goto	next_crc8

	movf	exit_value1,W
	xorwf	value1,F
	
	return

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////





;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CALC_CRC16
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Calcula CRC de polinomios de 17 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Recibe:
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;value(2,1): 2 bytes del valor del cual calcular el CRC
;poly(2,1):2 bytes del valor del polinomio ASOCIADO* con el cual se calcula el CRC
;enter_value(2,1):2 bytes del valor de entrada con el cual realizar XOR
;exit_value(2,1):2 bytes del valor de salida con el cual realizar XOR
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Devuelve:
;value(2,1): 2 bytes con el CRC calculado
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CALC_CRC16
	movf	enter_value2,W
	xorwf	value2,F
	movf	enter_value1,W
	xorwf	value1,F

	movlw	.8
	movwf	cont

next_crc16
	bcf		STATUS,C
	rrf		value2,F
	rrf		value1,F
	
	movf	poly2,W
	btfsc	STATUS,C
	xorwf	value2,F

	movf	poly1,W
	btfsc	STATUS,C
	xorwf	value1,F

	decfsz	cont,f
	goto	next_crc16

	movf	exit_value2,W
	xorwf	value2,F
	movf	exit_value1,W
	xorwf	value1,F	

	return

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CALC_CRC24
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Calcula CRC de polinomios de 25 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Recibe:
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;value(3,2,1): 3 bytes del valor del cual calcular el CRC
;poly(3,2,1):3 bytes del valor del polinomio ASOCIADO* con el cual se calcula el CRC
;enter_value(3,2,1):3 bytes del valor de entrada con el cual realizar XOR
;exit_value(3,2,1):3 bytes del valor de salida con el cual realizar XOR
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Devuelve:
;value(3,2,1): 3 bytes con el CRC calculado
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CALC_CRC24
	movf	enter_value3,W
	xorwf	value3,F
	movf	enter_value2,W
	xorwf	value2,F
	movf	enter_value1,W
	xorwf	value1,F

	movlw	.8
	movwf	cont

next_crc24
	bcf		STATUS,C
	rrf		value3,F	
	rrf		value2,F
	rrf		value1,F
	
	movf	poly3,W
	btfsc	STATUS,C
	xorwf	value3,F

	movf	poly2,W
	btfsc	STATUS,C
	xorwf	value2,F

	movf	poly1,W
	btfsc	STATUS,C
	xorwf	value1,F

	decfsz	cont,f
	goto	next_crc24

	movf	exit_value3,W
	xorwf	value3,F
	movf	exit_value2,W
	xorwf	value2,F
	movf	exit_value1,W
	xorwf	value1,F
	
	return

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;CALC_CRC32
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Calcula CRC de polinomios de 33 bits               By BrunoF(Bruno Fascendini) para el foro todopic:http://www.todopic.com.ar/foros
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Recibe:
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;value(4,3,2,1): 4 bytes del valor del cual calcular el CRC
;poly(4,3,2,1):4 bytes del valor del polinomio ASOCIADO* con el cual se calcula el CRC
;enter_value(4,3,2,1):4 bytes del valor de entrada con el cual realizar XOR
;exit_value(4,3,2,1):4 bytes del valor de salida con el cual realizar XOR
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;Devuelve:
;value(4,3,2,1): 4 bytes con el CRC calculado
;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CALC_CRC32
	movf	enter_value4,W
	xorwf	value4,F
	movf	enter_value3,W
	xorwf	value3,F
	movf	enter_value2,W
	xorwf	value2,F
	movf	enter_value1,W
	xorwf	value1,F

	movlw	.8
	movwf	cont

next_crc32
	bcf		STATUS,C
	rrf		value4,F
	rrf		value3,F	
	rrf		value2,F
	rrf		value1,F

	movf	poly4,W
	btfsc	STATUS,C
	xorwf	value4,F
	
	movf	poly3,W
	btfsc	STATUS,C
	xorwf	value3,F

	movf	poly2,W
	btfsc	STATUS,C
	xorwf	value2,F

	movf	poly1,W
	btfsc	STATUS,C
	xorwf	value1,F

	decfsz	cont,f
	goto	next_crc32

	movf	exit_value4,W
	xorwf	value4,F
	movf	exit_value3,W
	xorwf	value3,F
	movf	exit_value2,W
	xorwf	value2,F
	movf	exit_value1,W
	xorwf	value1,F
	
	return

;//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////