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