=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Date: Sat, 08 Apr 2000  10:44:00
    From: Nikolai Golovchenko <golovchenko-at-mail.ru>
      To: pic microcontroller discussion list <PICLIST-at-MITVMA.MIT.EDU>
 Subject: Re: Help:Floating point number division of 2 bytes
--------------------------------------------------------------------------------

Hi Ismael,

I haven't yet had a chance to take a look at PIC17C756, but this
routine should work (PIC17 compatible with PIC16?). May be someone
willing to optimize? :)

;***********************************************
;Floating point division of two unsigned integer
;8 bit variables
;
;Input: AARGB0 - dividend (nominator)
;       BARGB0 - divisor (denominator)
;Output:
;       AEXP, AARGB0, AARGB1 - quotient
;       (MICROCHIP format - AN575)
;       w = 0 on success
;       w = 1 error: divide by zero
;Temporaries:
;       BARGB1
;
;RAM - 5 bytes
;ROM - 41 words
;Speed - 7 + 4 + 8 * 9 + 4 + 14 * 23 + 4 = 413 instruction
;       cycles worst case (including call and return)
;***********************************************
fdiv24_8_8
        movfw BARGB0
        skpnz
         retlw 1                ;divide by zero
        clrf AEXP
        movfw AARGB0
        skpnz
         retlw 0                ;zero result
;loop to use all 8 bits of dividend (integer 8 by 8 divide)
        movwf AARGB1
        clrf BARGB1
        movlw 0x08
        movwf AARGB0    ;aargb0 is used as loop counter
fdiv24_8_8b
        rlf AARGB1, f
        rlf BARGB1, f
        movfw BARGB0
        subwf BARGB1, w
        skpnc
         movwf BARGB1
        decfsz AARGB0, f
         goto fdiv24_8_8b
        rlf AARGB1, f   ;aargb1 is the integer quotient so far
;loop to fill all the bits of 16bit mantissa
        clrf AARGB0
        movlw 0x8E
        movwf AEXP
        clrc
fdiv24_8_8c
        rlf BARGB1, f
        movfw BARGB0
        skpc                    ;check carry (9th bit)
         goto fdiv24_8_8d
        subwf BARGB1, f
        setc
        goto fdiv24_8_8e 
fdiv24_8_8d
        subwf BARGB1, w
        skpnc
         movwf BARGB1
fdiv24_8_8e
        rlf AARGB1, f
        rlf AARGB0, f
        decf AEXP, f
        btfss AARGB0, 7
         goto fdiv24_8_8c
        bcf AARGB0, 7   ;replace explicit msb with sign
        retlw 0
;***********************************************


 Nikolai
 http://techref.massmind.org/member/NG--944

On Friday, April 07, 2000 Ismael M. Khangane wrote:
> Hi picer's
> I will appreciate if some one have a floating point division routine for
> PIC17C756.

> --
> ------------------------------------------------------------------
> Ismael M. Khangane, Specialist in Robotics. Automatic Control & Systems
> ( Bsc in Eng.)
> Instituto de Automatica Industrial IAI-CSIC
> Madrid, Spain.
> Tel: (34) 91 871 1900
> Fax: (34) 91 871 7050
> E-mail: imkesp-at-excite.com ; ismaelm-at-iai.csic.es
> ------------------------------------------------------------------