;------------------------------------------
;RUTINA PARA DIVIDIR UN VALOR DE 32 BIT POR UN VALOR DE 32 BITS.
;------------------------------------------
;
;------------------------------------------
;AUTOR: Leo D. Persi.
;
;FECHA: 18/04/09 ARGENTINA
;
;www.meteorologiafacil.com.ar
;------------------------------------------
;
;Para la división hay que tener en cuenta como funciona. La división básica, es la resta sucesiva del dividendo menos el divisor.
;Una vez que entendemos esto, podemos tratar la división como una resta más. Para hacer la división, vamos a restar el dividendo
;con el divisor. Esta resta la repetiremos hasta que el valor sea negativo. Por lo que luego de hacer cada resta, chequeamos el
;bit C para saber si es negativo o es positivo. Recordemos que en la resta, cuando el bit C se pone a 1, la operación matemática
;es negativo (hubo acarreo). Si es positivo, sumamos de a uno los bit del resultado.
;------------------------------------------
;QUE SE NECESITA
;------------------------------------------
;* 21 pociciones en la RAM.
;
;DATO1			;MÁS SIGNIFICATIVO.
;DATO2
;DATO3
;DATO4			;MENOS SIGNIFICATIVO.
;
;FUNC1			;MÁS SIGNIFICATIVO.
;FUNC2
;FUNC3
;FUNC4			;MENOS SIGNIFICATIVO.
;
;RES1			;MAS SIGNIFICATIVO.
;RES2
;RES3
;RES4			;MENOS SIGNIFICATIVO.
;
;RESDIV1		;MÁS SIGNIFICATIVO.
;RESDIV2
;RESDIV3
;RESDIV4		;MENOS SIGNIFICATIVO.
;
;CARRY
;
;TEMP1			;MÁS SIGNIFICATIVO.
;TEMP2
;TEMP3
;TEMP4			;MENOS SIGNIFICATIVO.
;------------------------------------------
;MODO DE USO.
;------------------------------------------
;1- CARGAR EL DIVISOR EN TEMP
;2- CARGAR EL DIVIDENDO EN DATO
;3- LLAMAR A DIVISION
;4- EL RESULTADO ESTÁ EN RESDIV
;
;NOTA: LA DIVISIÓN ES DATO / FUNC = RESDIV
;
;COMO SE PUEDE APRECIAR, ESTA RUTINA NO ES NADA EFICIENTE, CONSUME MUCHO CICLOS DE MÁQUINAS.
;LA VENTAJA ES QUE TIENE UN REDUCIDO CONSUMO DE MEMORIA DE PROGRAMA.
;TAMBIÉN, ESTÁ INCLUIDA LA RUTINA DE RESTA, POR LO QUE SI TAMBIÉN SE NECESITA PARA OTRAS FUNCIONES
;TOMAR LA PRECAUCIÓN DE NO REPETIR LAS RUTINAS.
;
DIVISION		CLRF		RESDIV1
			CLRF		RESDIV2
			CLRF		RESDIV3
			CLRF		RESDIV4
			CLRF		RES1
			CLRF		RES2
			CLRF		RES3
			CLRF		RES4
DATO_PARC		MOVFW		TEMP4					;DIVISOR
			MOVWF		FUNC4
			MOVFW		TEMP3
			MOVWF		FUNC3
			MOVFW		TEMP2
			MOVWF		FUNC2
			MOVFW		TEMP1
			MOVWF		FUNC1
			CALL		RESTA2					;DATO - FUNC = RES
			BTFSS		STATUS,C				;¿ES NEGATIVO?
			RETURN							;ES NEGATIVO.
			MOVFW		RES4					;ES POSITIVO.
			MOVWF		DATO4
			MOVFW		RES3
			MOVWF		DATO3
			MOVFW		RES2
			MOVWF		DATO2
			MOVFW		RES1
			MOVWF		DATO1
			MOVLW		.1						;ES POSITIVO
			ADDWF		RESDIV4,F				;SUMO 1
			BTFSS		STATUS,C				;¿HUBO ACARREO?
			GOTO		DATO_PARC				;NO
			ADDWF		RESDIV3,F				;SUMO 1
			BTFSS		STATUS,C				;¿HUBO ACARREO?
			GOTO		DATO_PARC				;VUELVO A RESTAR.
			ADDWF		RESDIV2,F				;SUMO 1
			BTFSS		STATUS,C				;¿HUBO ACARREO?
			GOTO		DATO_PARC				;VUELVO A RESTAR.
			ADDWF		RESDIV1,F				;SUMO 1
			GOTO		DATO_PARC				;VUELVO A RESTAR.
;
;*************************
;RUTINA DE RESTA DE 32 BIT - 32 BIT
;*************************
;
;.............................................................................
;Para saber si el valor es negativo chequear el bit C del registro STATUS
;Si es 0, el valor es negativo, si es 1 el valor es positivo.
;
;NOTA, cuando el valor es negativo, no da el resultado correcto.
;
;la fórmula es DATO - FUNC = RES
;

RESTA2				;32 - 32
			clrf	CARRY

			comf	DATO4,W
			addwf	FUNC4,W
			movwf	RES4
			btfsc	STATUS,C
			incfsz	FUNC3,F
			goto	IOP1
			incfsz	FUNC2,F
			goto	IOP1
			incfsz	FUNC1,F
			goto	IOP1
			bsf	CARRY,0
IOP1	
			comf	DATO3,W
			addwf	FUNC3,W
			movwf	RES3
			btfsc	STATUS,C
			incfsz	FUNC2,F
			goto	IOP2
			incfsz	FUNC1,F
			goto	IOP2
			bsf	CARRY,0
IOP2
			comf	DATO2,W
			addwf	FUNC2,W
			movwf	RES2
			btfsc	STATUS,C
			incfsz	FUNC1,F
			goto	IOP3
			bsf	CARRY,0
IOP3
			comf	DATO1,W
			addwf	FUNC1,W
			movwf	RES1
			btfsc	STATUS,C
			bsf	CARRY,0
;
			bcf	STATUS,C
			btfss	CARRY,0
			bsf	STATUS,C	
			comf	RES4,F
			comf	RES3,F
			comf	RES2,F
			comf	RES1,F
			return