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*10-2+5+14*25-2+4+3 = 449 instruction
; cycles worst case (including call and return)
;***********************************************
fdiv24_8_8
mov W, BARGB0
snb Z
retw #1 ;divide by zero
clr AEXP
mov W, AARGB0
snb Z
retw #0 ;zero result
;loop to use all 8 bits of dividend (integer 8 by 8 divide)
mov AARGB1, W
clr BARGB1
mov W, #$08
mov AARGB0, W ;aargb0 is used as loop counter
fdiv24_8_8b
rl AARGB1
rl BARGB1
mov W, BARGB0
mov W, BARGB1-w
snb C
mov BARGB1, W
decsz AARGB0
jmp fdiv24_8_8b
rl AARGB1 ;aargb1 is the integer quotient so far
;loop to fill all the bits of 16bit mantissa
clr AARGB0
mov W, #$8E
mov AEXP, W
clrb C
fdiv24_8_8c
rl BARGB1
mov W, BARGB0
sb C ;check carry (9th bit)
jmp fdiv24_8_8d
sub BARGB1, W
setb C
jmp fdiv24_8_8e
fdiv24_8_8d
mov W, BARGB1-w
snb C
mov BARGB1, W
fdiv24_8_8e
rl AARGB1
rl AARGB0
dec AEXP
sb AARGB0.7
jmp fdiv24_8_8c
clrb AARGB0.7 ;replace explicit msb with sign
retw #0
;***********************************************
; Nikolai http://techref.massmind.org/member/NG--944