[Coco] Mod10 Suggestions

William Mikrut wmikrut72 at gmail.com
Thu Feb 16 20:26:55 EST 2017

```For years I have been an IBM programmer and have done well in that area --
for 30 years now.
I started with a CoCo2 back in 84/85 - and ML has always fascinated me --
yet eluded me to a degree.

With the advent of hardware (FPGAs) -- seems like we could do some pretty
coll stuff.
So, I try to enter into the 8 Bit world that is CoCo and get down to some
programming.

Following is a MOD10 program I have used for years in IBM programs.
I have translated it the best I can...I am sure it is not the most
efficient... and I have much to learn.

Attached is the MOD10 code.
I am hoping for constructive comments so I can learn, and move on to other
projects!
-------------- next part --------------
ORG	\$1200
CCD	RMB	16	;Credit Card Number
RESULT	RMB	1	;Result for caluclations
STATUS	RMB	1	;#\$00=Bad CCD #, #\$FF=Good CCD#

START	LEAX	CCD,pcr	;Load the location of the number

CLRB
STB	#RESULT	;Clear the result field
LDA	#16	;16 Times through the loop

LOOP.00	DECA
LDB	A,X	;Load a With X

BITA	#1	;Test for Even/Odd Numbers
BNE	PROC.02

PROC.00	PSHS	A	;We need to multiply the number by 2
LDA	#2
MUL
PULS	A
CMPB	#10
BLO	PROC.02

PROC.01	SUBB	#10	;If over 10, Add the 2 numbers together.
INCB		;Since the biggest# can be 18, Sub 10 and Increment B once

PROC.02	ADDB	RESULT	;Accumulate the result
STB	#RESULT

CMPA	#0	;Are we done with all 16 numbers?
BNE	LOOP.00

CHK.00	CMPB	#10	;This is a division trick.  If the result is divisible by 10
BLO	CHK.01	;it's a good card number.  Keep sbtracting 10 until the result
SUBB	#10	;is under 10.  If so and B is zero, we have a good number.
BRA	CHK.00	;Else it's a bad number
CHK.01	CMPB	#0
BEQ	GOOD.00
LDA	#\$00
BRA	SHOW.00

GOOD.00	LDA	#\$FF

SHOW.00	STA	#STATUS

ENDPGM	RTS
END	START
```