[Coco] Mod10 Suggestions
Dave Philipsen
dave at davebiz.com
Sat Feb 18 23:15:15 EST 2017
How much speed would you gain by completely eliminating 8 DECBs and 7 BNEs?:
ORG $1200
CCD RMB 16
RESULT RMB 1
START LEAX CCD+16,PCR
CLRA
LOOP ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP2
SUBA #9
LOOP2 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP3
SUBA #9
LOOP3 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP4
SUBA #9
LOOP4 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP5
SUBA #9
LOOP5 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP6
SUBA #9
LOOP6 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP7
SUBA #9
LOOP7 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP8
SUBA #9
LOOP8 ADDA ,S+
DAA
ADDA ,-X
DAA
PSHS A
LDA ,-X
LSLA
CMPA #10
BLO LOOP9
SUBA #9
LOOP9 ADDA ,S+
DAA
ANDA #$0F
STA RESULT,PCR
ENDPGM RTS
END START
On 2/18/2017 8:22 PM, William Mikrut wrote:
> Which is the beauty of this project.
>
> Clearly there are at least 3 ways to do this...each with a slightly
> different outcome.
>
> Some optimization for size,speed... or both.
>
> There is a wealth of information and experience here from everone and I
> truly appreciate all the input!
>
> I can't wait to start the next project and see where it leads!!
>
>
>
> On Feb 18, 2017 8:10 PM, "L. Curtis Boyle" <curtisboyle at sasktel.net> wrote:
>
>> I was just going to mention that if speed is more important, doing an leas
>> -1,s before the loop, and then just a sta ,a /adda ,s (instead of pshs
>> a/add ,s+), and then a final leas 1,s after the loop is done would be a bit
>> longer, but a bit faster.
>>
>> L. Curtis Boyle
>> curtisboyle at sasktel.net
>>
>> TRS-80 Color Computer Games website
>> http://www.lcurtisboyle.com/nitros9/coco_game_list.html
>>
>>
>>
>>> On Feb 18, 2017, at 7:41 PM, Dave Philipsen <dave at davebiz.com> wrote:
>>>
>>> That's pretty well optimized! Have you ever considered the difference
>> between optimizing for size and optimizing for speed? So, for instance, if
>> you weren't necessarily constrained for size but you knew you were going to
>> process a list of jillions of cc numbers would you write it differently?
>>> Dave Philipsen
>>>
>>>> On Feb 18, 2017, at 5:06 PM, William Mikrut <wmikrut72 at gmail.com>
>> wrote:
>>>> Some slight re ordering of the code and it works perfectly!
>>>> 48 Bytes total, Less 17 for storage -- 31 program bytes to get the job
>> done.
>>>> My original code was 61 program bytes... down to half the size and does
>> the
>>>> exact same thing.
>>>> Absolutely amazing!
>>>>
>>>>
>>>> ORG $1200
>>>> CCD RMB 16
>>>> RESULT RMB 1
>>>>
>>>> START LEAX CCD+16,PCR
>>>> CLRA
>>>> LDB #8
>>>>
>>>>
>>>> LOOP ADDA ,-X
>>>> DAA
>>>> PSHS A
>>>> LDA ,-X
>>>> LSLA
>>>> CMPA #10
>>>> BLO LOOP2
>>>> SUBA #9
>>>> LOOP2 ADDA ,S+
>>>> DAA
>>>>
>>>> DECB
>>>> BNE LOOP
>>>>
>>>>
>>>>
>>>> ANDA #$0F
>>>> STA RESULT,PCR
>>>> ENDPGM RTS
>>>> END START
>>>>
>>>>> On Sat, Feb 18, 2017 at 1:03 PM, William Mikrut <wmikrut72 at gmail.com>
>> wrote:
>>>>> You are right -- I looked at is closer.
>>>>> One thing I need to do is reverse the order of operations.
>>>>>
>>>>> The LSLA is performed first.
>>>>> First I need to store the byte and LSLA the next byte.
>>>>>
>>>>> Otherwise if I flip it from left to right:
>>>>> (LEAX CCD,PCR
>>>>> ...
>>>>> LDA ,X+
>>>>> ...
>>>>> ADDA ,X+)
>>>>>
>>>>> it works perfectly.
>>>>>
>>>>>
>>>>>> On Sat, Feb 18, 2017 at 11:35 AM, William Astle <lost at l-w.ca> wrote:
>>>>>>
>>>>>> Take a closer look. It only does the LSLA on every other digit. It
>> does
>>>>>> *two* digits per loop, just like Brett's version.
>>>>>>
>>>>>> You can easily pretend all numbers are 16 digits by right justifying
>> the
>>>>>> numbers in your buffer and padding with zeros.
>>>>>>
>>>>>>
>>>>>>> On 2017-02-18 10:06 AM, William Mikrut wrote:
>>>>>>>
>>>>>>> I like how this works from right to left.
>>>>>>> The only issue is the LSLA on every number.
>>>>>>>
>>>>>>> The algo is to double every other number, starting with the right
>> most
>>>>>>> digit, and sub 9 if the result is 10 or more.
>>>>>>>
>>>>>>> Now if the number is always 16 digits, Brett's 16 bit word seems the
>>>>>>> easiest way to go.
>>>>>>> If the number is 13 digits long the 16 bit word method won't work,
>> but I
>>>>>>> am
>>>>>>> happy to pretend all numbers are 16 digits!
>>>>>>>
>>>>>>> I am going to try to include a couple things you showed me into
>> Brett's
>>>>>>> 16
>>>>>>> bit chunk method and try a slightly different routine!
>>>>>>>
>>>>>>>
>>>>>>> On Sat, Feb 18, 2017 at 10:22 AM, William Astle <lost at l-w.ca> wrote:
>>>>>>>
>>>>>>> On 2017-02-18 12:43 AM, msmcdoug wrote:
>>>>>>>> Actually I'm surprised noone has suggested bcd arithmetic on the
>> result
>>>>>>>>> to eliminate divide by 10 loop
>>>>>>>>>
>>>>>>>>>
>>>>>>>> BCD would certainly give a predictable overall cycle count. It would
>>>>>>>> require a significantly different approach, though. The only
>> register
>>>>>>>> you
>>>>>>>> can use for BCD arithmetic is A and DAA is only useful after ADDA or
>>>>>>>> ADCA.
>>>>>>>>
>>>>>>>> I had thought about using BCD but had initially dismissed it due to
>>>>>>>> possible complexity. However, upon reflection, the extra cycles to
>> use
>>>>>>>> BCD
>>>>>>>> would probably be less than the average cycle time of the modulus
>> loop
>>>>>>>> combined or checking for digit overflow during the loop.
>>>>>>>>
>>>>>>>> I think you could use code that looks something like the following
>> which
>>>>>>>> is based off Mr. Mikrut's most recent posted code. (warning: mailer
>>>>>>>> codeā¢
>>>>>>>> follows so it may have errors)
>>>>>>>>
>>>>>>>> ORG $1200
>>>>>>>> CCD RMB 16
>>>>>>>> RESULT RMB 1
>>>>>>>> START LEAX CCD+16,PCR
>>>>>>>> CLRA
>>>>>>>> LDB #8
>>>>>>>> LOOP PSHS A
>>>>>>>> LDA ,-X
>>>>>>>> LSLA
>>>>>>>> CMPA #10
>>>>>>>> BLO LOOP2
>>>>>>>> SUBA #9
>>>>>>>> LOOP2 ADDA ,S+
>>>>>>>> DAA
>>>>>>>> ADDA ,-X
>>>>>>>> DAA
>>>>>>>> DECB
>>>>>>>> BNE LOOP
>>>>>>>> ANDA #$0F
>>>>>>>> STA RESULT,PCR
>>>>>>>> ENDPGM RTS
>>>>>>>>
>>>>>>>> I'm using the stack for a temporary storage location instead of
>>>>>>>> something
>>>>>>>> PCR relative for code size reasons. You could use the "RESULT
>> variable
>>>>>>>> for
>>>>>>>> the temporary to eliminate stack usage. That would probably be
>> slightly
>>>>>>>> faster at the expense of two more code bytes. This is one of those
>>>>>>>> size/speed trade-offs.
>>>>>>>>
>>>>>>>> DAA has to be used after every addition and only applies to A.
>> Using BCD
>>>>>>>> means we can eliminate the mod 10 loop and just mask off the upper
>> digit
>>>>>>>> (BCD stores two decimal digits in a byte). That gives a constant
>> time
>>>>>>>> for
>>>>>>>> the "mod 10" result and also only takes 2 bytes (and 2 cycles).
>>>>>>>>
>>>>>>>> I have also eliminated the STATUS variable and just store the
>> result.
>>>>>>>> You
>>>>>>>> can test RESULT for non-zero trivially so there's no need for a
>> separate
>>>>>>>> STATUS value.
>>>>>>>>
>>>>>>>> By my calculation, this version is 32 bytes, requires 1 byte of
>> stack
>>>>>>>> space, 17 bytes of data space, and runs in a maximum of 351 cycles
>> (and
>>>>>>>> a
>>>>>>>> minimum of 336 cycles if none of the doubled digits goes above 9).
>> For
>>>>>>>> this
>>>>>>>> analysis, I've assumed 8 bit offsets for the PCR references. 16 bit
>>>>>>>> offsets
>>>>>>>> in PCR mode are quite a bit more expensive (4 extra cycles and 1
>> extra
>>>>>>>> byte).
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Coco mailing list
>>>>>>>> Coco at maltedmedia.com
>>>>>>>> https://pairlist5.pair.net/mailman/listinfo/coco
>>>>>>>>
>>>>>>>>
>>>>>> --
>>>>>> Coco mailing list
>>>>>> Coco at maltedmedia.com
>>>>>> https://pairlist5.pair.net/mailman/listinfo/coco
>>>>>>
>>>>>
>>>> --
>>>> Coco mailing list
>>>> Coco at maltedmedia.com
>>>> https://pairlist5.pair.net/mailman/listinfo/coco
>>>
>>> --
>>> Coco mailing list
>>> Coco at maltedmedia.com
>>> https://pairlist5.pair.net/mailman/listinfo/coco
>>>
>>
>> --
>> Coco mailing list
>> Coco at maltedmedia.com
>> https://pairlist5.pair.net/mailman/listinfo/coco
>>
More information about the Coco
mailing list