| ??? 12/05/05 10:49 Read: times |
#104694 - optimizing further Responding to: ???'s previous message |
Peter,
your routine assumes 1 BCD digit per "occurence", this is the most common case when you e.g. receive digits via UART (in ASCII form, so first you need to convert from ASCII into BCD). However, my task was to convert packed BCD, i.e. 2 digits per "occurence"; hence the multiply by 100 (it is less than 256 so the routine itself is the same). My "less efficient" algorithm is written almost the same as yours, except it is for the "2 digits per occurence" and is explicitly unrolled - code space inefficient, but faster. Of course, optimisation is often a balancing act between the resources... But sometimes one does not need to make compromises and the optimisation can save all the resources. For example, let me optimize your routine a little bit, saving some 1 cycle, 1 code byte and 1 register :-) amula10:
mov r2, #4 ;4 byte value
_amu1:
;digit to add in acc
xch a, @r0
mov b, #10
mul ab ;* 10
add a, @r0 ;add digit or carry
mov @r0, a
clr a
addc a, b ;add carry
inc r0 ;next byte
djnz r2, _amu1
ret
Have fun! Jan Waclawek |



