;************************************************************************************************
;				   SUBRUTINAS DE DIVISION A 16 BITS
;************************************************************************************************
; definir: TEMP, sign, ACCaHI, ACCaLO, ACCbHI, ACCbLO, ACCcHI, ACCcLO, ACCdHI, ACCdLO	|
; ENTRADA -> ACCbHI, ACCbLO, ACCaHI, ACCaLO						|
; SALIDA  -> ACCbHI, ACCbLO, ACCcHI, ACCcLO						|
;(ACCbHI)(ACCbLO) / (ACCaHI)(ACCaLO) = (Q)->(ACCbHI)(ACCbLO) + (R)->(ACCcHI)(ACCcLO)	|
; call	D_divF										|
;----------------------------------------------------------------------------------------
TRUE    equ     1
FALSE   equ     0
;+++++++++++++++++++++++++
SIGNED  equ     FALSE

divMac  MACRO
	LOCAL   NOCHK
	LOCAL   NOGO

	bcf     STATUS,C
	rlf     ACCdLO, F
	rlf     ACCdHI, F
	rlf     ACCcLO, F
	rlf     ACCcHI, F
	movf    ACCaHI,W
	subwf   ACCcHI,W          ;check if a>c
	btfss   STATUS,Z
	goto    NOCHK
	movf    ACCaLO,W
	subwf   ACCcLO,W        ;if msb equal then check lsb
NOCHK   btfss   STATUS,C        ;carry set if c>a
	goto    NOGO
	movf    ACCaLO,W        ;c-a into c
	subwf   ACCcLO, F
	btfss   STATUS,C
	decf    ACCcHI, F
	movf    ACCaHI,W
	subwf   ACCcHI, F
	bsf     STATUS,C        ;shift a 1 into b (result)
NOGO    rlf     ACCbLO, F
	rlf     ACCbHI, F
	ENDM
;*******************************************************************
setup   movlw   .16             ; for 16 shifts
	movwf   TEMP
	movf    ACCbHI,W          ;move ACCb to ACCd
	movwf   ACCdHI
	movf    ACCbLO,W
	movwf   ACCdLO
	clrf    ACCbHI
	clrf    ACCbLO
	retlw   0
;*******************************************************************
D_divF
     IF   SIGNED
     CALL    S_SIGN
     ENDIF

	call    setup
	clrf    ACCcHI
	clrf    ACCcLO
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
	divMac
    IF    SIGNED
	btfss   sign,MSB        ; check sign if negative
	retlw   0
	goto    neg_B          ; negate ACCa ( -ACCa -> ACCa )
    ELSE
	retlw   0
    ENDIF
;*******************************************************************
; Assemble this section only if Signed Arithmetic Needed
     IF    SIGNED
S_SIGN  movf    ACCaHI,W
	xorwf   ACCbHI,W
	movwf   sign
	btfss   ACCbHI,MSB        ; if MSB set go & negate ACCb
	goto    chek_A
	comf    ACCbLO          ; negate ACCb
	incf    ACCbLO
	btfsc   STATUS,Z
	decf    ACCbHI
	comf    ACCbHI
chek_A  btfss   ACCaHI,MSB        ; if MSB set go & negate ACCa
	retlw   0
	goto    neg_A
     ENDIF