[Coco] Mod10 Suggestions

msmcdoug msmcdoug at iinet.net.au
Sat Feb 18 02:43:32 EST 2017


    
Actually I'm surprised noone has suggested bcd arithmetic on the result to eliminate divide by 10 loop


Sent from my Samsung GALAXY S5

-------- Original message --------
From: William Astle <lost at l-w.ca> 
Date: 18/02/2017  4:52 PM  (GMT+10:00) 
To: coco at maltedmedia.com 
Subject: Re: [Coco] Mod10 Suggestions 

On 2017-02-17 07:48 PM, Brett Gordon wrote:
>    tfr a,b            no aax ;(
>   abx            accum even byte

A couple of points:

Since you know that A is going to be in the range of 0...9, you don't 
need to use abx. You can simply use "leax a,x". Which also has the 
benefit of being 1 byte shorter and 4 cycles faster.

Also, since the maximum possible sum from the algorithm is 216, you 
should be able to do the mod calculation on B only. The only difference 
would be that you'd be looking for a carry instead of negative after the 
subtractions. That will be a real saving considering that that mod 
calculation loop could run 21 times. (saves 1 cycle for each subtraction).

Here's how I arrived at 216: 8 of the digits are added as is and 8 of 
them are doubled and added. Since no digit can be higher than 9, the 
maximum value is 24*9 which is 216.

If doing position independent code (PIC), you can't use the "CMPY 
#num+16" method of ending the loop. There is no reasonable way simulate 
that. You would need to use a counter of some kind in that case. The 
most efficient way to do that is a single byte counter somewhere, 
possibly on the stack.

If you do decide to use absolute addresses for the data area, then I 
would recommend using U for the pointer instead of Y just to save a byte 
in the setup.

In case you're wondering, the typical priority order for using the index 
registers is:

X
U
Y

Don't let the "user stack pointer" name for "U" make you think you 
shouldn't use U as an index register. There is nothing magical about U 
that will cause it to suddenly be used as a stack without your direct 
intervention as the programmer.

The reason for the listed ordering is as follows. All operations on X 
have a single byte opcode. LEAU, LDU and STU have single byte opcodes. 
All operations on Y except LEAY have double byte opcodes. There is no 
difference in size or speed when using any of the four pointer registers 
(S is also a pointer register) in an indexed operand.

X or Y can both be used as 16 bit counters because LEAX and LEAY will 
set Z. (LEAU and LEAS do not.) X would be preferred there in most cases 
but if you have tension between index registers and counters, it comes 
down to judgement.

X also has the ABX operation which can be useful so that can affect how 
you allocate registers, too.

-- 
Coco mailing list
Coco at maltedmedia.com
https://pairlist5.pair.net/mailman/listinfo/coco


More information about the Coco mailing list