PIC Microcontroller Math Method

Divide 8 bit int by 8 bit to 24 bit float (AN575)

by Nikolai Golovchenko

;***********************************************
;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