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