On Mon, 7 Dec 1998, Kelly J Kohls wrote: > > I am trying to come up with a routine to convert a byte value to a > percentage. That is, for an input value of zero, the output would be > zero. For an input of 255, the output would be 100. The obvious > solution is: Percentage = Trunc(Decimal / 2.55). Since I don't know of > an easy way to divide by a fractional number, I came up with this > alternative: > Percentage = (Decimal * 100) / 255. Now I am faced with having to use > sixteen bit operations for a problem that has eight bit values for both > input and output. If there is an easier way to do this, would someone > please enlighten me? I have been thinking this over for quite some time, > so maybe I "can't see the forest for the trees." Try this. It's close, but not exactly what you ask (I divide by 256 instead of 255 - but there is an approximation available to fix this [I don't have time to type it in now]): ;******************************************************************* ;scale_hex2dec ; The purpose of this routine is to scale a hexadecimal byte to a ;decimal byte. In other words, if 'h' is a hexadecimal byte then ;the scaled decimal equivalent 'd' is: ; d = h * 100/256. ;Note that this can be simplified: ; d = h * 25 / 64 = h * 0x19 / 0x40 ;Multiplication and division can be expressed in terms of shift lefts ;and shift rights: ; d = [ (h<<4) + (h<<3) + h ] >> 6 ;The program divides the shifting as follows so that carries are automatically ;taken care of: ; d = (h + (h + (h>>3)) >> 1) >> 2 ; ;Inputs: W - should contain 'h', the hexadecimal value to be scaled ;Outputs: W - The scaled hexadecimal value is returned in W ;Memory: temp ;Calls: none scale_hex2dec MOVWF temp ;Hex value is in W. CLRC ;Clear the Carry bit so it doesn't affect ;the RRF RRF temp,F CLRC RRF temp,F 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