summaryrefslogtreecommitdiffhomepage
path: root/samples/coin-opt.mixal
blob: 6d86d459e5c948c8b9c84c3c816144af2a9f63f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
* Count the number of coin combinations

TERM	EQU	19		Terminal uses 14 words or 70 char
VAL	EQU	4:5		The value of a coin
AMT	EQU	1:3		The current amount of those coins

* Start of the program.
	ORIG	1000
PROG	OUT	PRMPT(TERM)
* Get the value we want combos for
        IN	INPT1(TERM)
	LDA	INPT1		THE NUMBER IS PROBABLY IN THIS WORD
	LDX	INPT2		WE LOAD 10 CHARS OF INPUT
	JAP	1F		MAKE SURE THEY ENTERED SOMETHING
	JXZ	PROG		MAYBE THEY HAD SPACES FIRST?
1H	CMPX	PRMPT(5:5)	IS THE LAST CHAR A SPACE
	JNE	3F		IF NOT THEN WE CAN MOVE ON
	SRAX	1		IF IT IS, SHIFT RIGHT 1 SPOT AND
	JMP	1B		LOOP BACK TO MAKE SURE
3H	NUM
	CMPA	MAX
	JG	PROG
	STZ	MAX
	STA	WANTED

* Get a current value of the coins we have
CURRVAL	LD6	TYPES		How many kinds of coins
	LDA	COINS,6(AMT)	Load current amount of first coin
2H	DEC6	1		Move to next coin
	ADD	COINS,6(AMT)	Add the amount of the next coin
	J6NZ	2B		Keep going for all combos

* If less than goal, add a coin
        CMPA    WANTED		Compare the current value to wanted value
	JGE	1F		If it's < wanted
	LDA	COINS(AMT)	{
	ADD	COINS(VAL)	  add another of the first coin
	STA	COINS(AMT)        and go back to CURRVAL
	JMP	CURRVAL		}
1H	JG	3F		If it's = wanted

* It was equal, print, and the fall through
	LDX	MAX
	INCX	1      	        We use this for counting the hits
	LD6	TYPES		We iterate through the types
	ENT5	0		This points to the word in PBUFF
	STX	MAX
	LDA	MAX
	CHAR
	STX	PBUF,5		Print the current number of hits
1H	INC5	2		Move to the next column
	ENTA	0
	LDX	COINS,6(AMT)	Get the number of coins by dividing the amount
	DIV	COINS,6(VAL)	by the value of 1 coin
6H	CHAR
	STX	PBUF,5(3:5)	Print the current amount
	DEC6	1		Go to the next coin type
	J6NN	1B		If we go negative, we're done with coins
	OUT	PBUF(TERM)	Output the line to the console

* Equal or Greater, find first non-zero spot, add one to the next
* spot up, and then zero it out.
3H	ENT5	0
5H	LDA	COINS,5(AMT)	Load current coin value
	INC5	1		Go to next type of coin
	CMP5	TYPES		Compare to number of coin types
	JG	DONE		If greater, we're out of coins
	JAZ	5B		If current coin value is 0, go to next coin
	LDA	COINS,5(AMT)	Load next coin up
	ADD	COINS,5(VAL)	Add it's value to the amount
	STA	COINS,5(AMT)	Save it
	DEC5	1		Go back to previous type
	STZ	COINS,5(AMT)	Zero it out
	JMP	CURRVAL		Go back to the main loop
DONE	HLT
* Tables to keep the values and counts
* The below can be used to test for 1000 (1:2), 100 (3:4), and 10 (5:5)
MAX	CON	499	   	MAX AMOUNT OF CENTS BEFORE COUNTER RESETS IS 221
WANTED	CON	62		THE COMBINATION WE WANT
TYPES	CON	5		NUMBER OF TYPES - 1
COINS	CON	1		PENNIES
	CON	5		NICKLES
	CON	10		DIMES
	CON	25		QUARTERS
	CON	50		HALF-DOLLARS
	CON	100		DOLLARS
PRMPT	ALF	"WHAT "
	ALF	"AMOUN"
	ALF	"T <IN"
	ALF	" CENT"
	ALF	"S> DO"
	ALF	" YOU "
	ALF	"WANT "
	ALF	"MAX 2"
	ALF	"20:  "
	ORIG	PRMPT+14
INPT1	CON	0
INPT2	CON	0
* This will be our printline
	ORIG	PRMPT+28
PBUF	CON	0		COUNT
	ALF	"  DLR"
	ALF	":    "
	ALF	"  HLF"
	ALF	":    "
	ALF	"  QTR"
	ALF	":    "
	ALF	"  DMS"
	ALF	":    "
	ALF	" NCKL"
	ALF	":    "
	ALF	"  PNY"
	ALF	":    "
	END	PROG