SX Microcontroller Basic Division Math Methods

by Nikolai Golovchenko

Don't know how to explain its operation, but what it does is approximate calculation of 32768/x using linear interpolation between points where x=1,2,4,8,16,32,64,128,256.

The routine can be extended for other number of bits in x.

;test
		ORG	
x               DS	1
yh              DS	1
yl              DS	1


	clr	x
;	mov	W, #129
;	mov	x, W
again
	call	reciprocal8
	nop
	inc	x
	jmp	again

;****************************************************
;
; Approximate calculation of 32768/x
; Input: x
; Output: y = 256 * yh + yl ~= 32768/x
;
; To calculate reciprocal, linear interpolation
; is used between points, where x=1,2,4,8,16,32,64,128
;
; Size: 19 instructions
; Execution speed(worst case including return):
;  6+4*8-1+4+4+2=47
;
; 4 Aug 2000 by Nikolai Golovchenko
;****************************************************
reciprocal8
	mov	W, x
	snz
	retw	1	;error - division by zero
	mov	yh, W
	clr	yl
	stc
reciprocal8a
	rr	yl
	rl	yh
	sc
	jmp	reciprocal8a

	clc
	mov	W, >>yh
	clr	yh
	sub	yh, W
reciprocal8b
	rr	yh
	rr	yl
	sc
	jmp	reciprocal8b
	retw	0	;ok
;****************************************************