diff options
Diffstat (limited to 'samples')
-rw-r--r-- | samples/coin-opt.mixal | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/samples/coin-opt.mixal b/samples/coin-opt.mixal new file mode 100644 index 0000000..6d86d45 --- /dev/null +++ b/samples/coin-opt.mixal @@ -0,0 +1,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 |