from 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 cblock x, yh, yl endc clrf x ; movlw 129 ; movwf x again call Reciprocal8 nop incf x, f goto 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 movf x, w skpnz retlw 1 ;error - division by zero movwf yh clrf yl setc Reciprocal8a rrf yl, f rlf yh, f skpc goto Reciprocal8a clrc rrf yh, w clrf yh subwf yh, f Reciprocal8b rrf yh, f rrf yl, f skpc goto Reciprocal8b retlw 0 ;ok ;****************************************************