Hi Scott. Nice code ;-) > scale_hex2dec > > MOVWF temp ;Hex value is in W. > CLRC ;Clear the Carry bit so it doesn't affect RRF > RRF temp,F > CLRC > RRF temp,F > CLRC > RRF temp,F ;temp = h>>3 > ADDWF temp,F ;temp = h + (h>>3) > RRF temp,F ;temp = (h + (h>>3)) >> 1 > ADDWF temp,F ;temp = h + ((h + (h>>3)) >> 1) > RRF temp,F > CLRC > RRF temp,W ;d = W = (h + (h + (h>>3)) >> 1) >> 2 > > RETURN > > ? Possible realization of 1 + 1/256 + ... correction. ;1/256 * (1 + 1/256) =~ 0.999985 / 255 ; scale255to100: ;25 = 16+8+1 clrf temp ;int clrf temp1 ;frac addwf temp,F ;1 rrf temp,F ;/2 rrf temp1,F rrf temp,F ;/4 rrf temp1,F rrf temp,F ;/8 rrf temp1,F addwf temp,F ;8 rrf temp,F ;/16 rrf temp1,F addwf temp,F ;16 rrf temp,F ;/32 rrf temp1,F rrf temp,W ;/64 rrf temp1,F ; ; movwf temp2 ;1/256/256 if longer tail ; movwf temp3 ;1/256/256/256 is required ; etc... ; addwf temp1,F ;1 + 1/256 correction btfss temp1,7 ;either round if >= 0.5 skpnc ;or take carry addlw 1 ;temp1 holds frac part ; ; movwf temp ;answer is either W or temp return If >=0.5 correction isn't required line should be commented. WBR Dmitry.