;;DIVISION ENTERA DE NÚMEROS NATURALES 16bits:16bits
;;
;;Emplea la instrucción "subwfb", que se encuentra en 
;;los Mid-Range 8 bits PICs (49 instrucciones o más)
;;
;;Realiza la división de dos números de 16bits
;;en aprox. 340 ciclos de instrucción
;;usando desplazamientos en lugar de restas sucesivas
;;
;;Necesita 2 variables de 8 bits:TEMPORAL y W_L
;;Para que funcione, las variables de 16bits han de estar
;;en el orden HIGH:LOW (como se puede ver en las equ)
;;es decir, en la posición más baja de la RAM el byte bajo
;;y en la siguiente posición más alta el byte alto
;;
;;Entrada: DIVIDENDO (16b) y DIVISOR(16b)
;;Salida: COCIENTE(16b) y RESTO(16b)
;;Borra DIVIDENDO, no altera DIVISOR
;;
;;Está implementada como una subrutina: DIVIDE
;;  PICdevJerez - Jerez de la Frontera - España


#ifndef 	Carry
	#define	Carry	STATUS,C
#endif

#ifndef	lsl16
	lsl16	MACRO	File
		lslf	File,F
		rlf	(File+.1),F
	endM
#endif

;;****************Estas líneas son un ejemplo ********************
;;**suprimir los punto y coma para su funcionamiento stand-alone**
;Temporal	equ	.127
;CocienteH	equ	.126
;Cociente	equ	.125
;RestoH		equ	.124
;Resto		equ	.123
;DividendoH	equ	.122
;Dividendo	equ	.121
;DivisorH	equ	.120
;Divisor	equ	.119
;W_L		equ	.118
;
;DIVIDENDO	equ	.6000	;Constantes usadas como ejemplo
;DIVISOR	equ	.14	;
;
;	movlw	HIGH DIVIDENDO
;	movwf	DividendoH
;	movlw	LOW DIVIDENDO
;	movwf	Dividendo
;	movlw	HIGH DIVISOR
;	movwf	DivisorH
;	movlw	LOW DIVISOR
;	movwf	Divisor
;;*****************************************************************

DIVIDE:
	clrf	Temporal
	clrf	CocienteH
	clrf	Cociente
	clrf	RestoH
	clrf	Resto
st:
	btfsc	Temporal,4
	return
	incf	Temporal
	lsl16	Cociente
	lsl16	Resto
	lsl16	Dividendo
	btfsc	Carry
	bsf	Resto,0
	movf	Divisor,W
	subwf	Resto,W
	movwf	W_L
	movf	DivisorH,W
	subwfb	RestoH,W
	btfss	Carry
	goto	st
	bsf	Cociente,0
	movwf	RestoH
	movf	W_L,W
	movwf	Resto
	goto	st

;end