Paul Slocum wrote:
Is there an easy way to do it without a loop or table?
-paul
A question would be how accurate do you need the result to be?
Without a loop or table will have to be some type of unwound hardcoded
multiplication by the reciprocal.
1/3 in 8.8 form is 00.55 (in hex)
0.55 is 00000000.01010101
To multiply N * 85 unwound you need to add together
(N << 6 ) + (N << 4) + (N<<2) + (N)
Example:
477 / 3
477 * 64 = 30528
477 * 16 = 7632
477 * 4 = 1908
477 * 1 = 477
-----------------------
40545 / 256 = 158.3
477 / 3 = 159
If you need more accuracy you could also add on 477 * 256 and then
divide the full result by 512 instead of 256.
But obviously the /256 is easier because you just select the appropriate
byte.
;A quick and dirty unsigned divide by three off the top of my
head.(untested)
;This is essentially an 8 bit routine but it can handle input up to 255 * 3
; I'll maybe try to optimize it and increase the precision after the
christmas party...
lda num2divLow
sta shiftr
lda num2divHigh (or could be lda #0 if this will only be 0-255 input)
sta result ; * 1
asl shiftr
rol
asl shiftr
rol ; * 4
adc result ; this would be better if you added one more if bit 7 in
shifter were set
sta result
asl shiftr
rol
asl shiftr
rol ; * 16
adc result ; this would be better if you added one more if bit 7 in
shifter were set
sta result
asl shiftr
rol
asl shiftr
rol ; * 64
adc result ; this would be better if you added one more if bit 7 in
shifter were set
sta result
rts