SX Microcontroller Math Method

Scale 8 bits to a percent

Dmitry Kiryashov says: Possible realization of 1 + 1/256 + ... correction.

;1/256 * (1 + 1/256) =~ 0.999985 / 255 ;

scale255to100:                  ;25 = 16+8+1
	clr	temp	;int
	clr	temp1	;frac

	add	temp, W	;1
	rr	temp	;/2
	rr	temp1

	rr	temp	;/4
	rr	temp1
	rr	temp	;/8
	rr	temp1

	add	temp, W	;8
	rr	temp	;/16
	rr	temp1

	add	temp, W	;16
	rr	temp	;/32
	rr	temp1

	mov	W, >>temp	;/64
	rr	temp1
;
;	mov	temp2, W	;1/256/256     if longer tail
;	mov	temp3, W	;1/256/256/256 is required
;       etc...
;
	add	temp1, W	;1 + 1/256 correction
	sb	temp1.7	;either round if >= 0.5
	snb	C	;or take carry
	mov	Hack, W	;Hack is a temp variable to compinsate for lack of add literal inst
	mov	W, #1	;temp1 holds frac part
	add	W, Hack
;
;	mov	temp, W	;answer is either W or temp
	ret

If >=0.5 correction isn't required <btfss temp1,7> line
should be commented.