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