þþP X;X; ******************X; ** MAIN PROGRAM **(X; ******************2X;<"X; This is the body of the mainF X; program - as run each gamePX;Z!‡MAINLOPQ†CONSOL;;Kill game ifdR>;; a consolenF‡DOSCORE;; key isx ‡DBCNSOL;; pressed‚ !‡RESTARTŒX;–X; UPDATE SCORES X; -------------ªX;´‡DOSCORE$>;;For each team:¾%‡SCRLOOPQ‡SCORADL9;;Set pointer toÈP‡POINTER;; score dataÒQ‡SCORADH9;; (onscreenÜP‡POINTER;; digits)æ%>;;Digit#=lowðQ†SCRPND9;;Check scoreúF‡NXTSCOR;;None to addG‡SCRDOWN;;It's going downX;X; SCORE INCREASE"X;,"†SCRPND9;;Update pending6Q@‡POINTER7;;Add 1 to score@,;; low digitJO>TP@‡POINTER7^R>;;Overflow?hD‡NXTSCOR;;No, do nextrQ>;;Yes, set low|P@‡POINTER7;; to '0'†1Q@‡POINTER7;;If high digitšH‡SCRPLUS;; set add¤Q>;;Else get starter®‡SCRPLUS,;;Add 1 to high¸O>ÂP@‡POINTER7;;And set itÌH‡NXTSCOR;;Go do next teamÖX;àX; SCORE DECREASEêX;ô$‡SCRDOWN#†SCRPND9;;Update pendingþQ@‡POINTER7;;If low digitR>;; is a zero,H‡SCRMINS;; set it to aQ>;; '9' and point&P@‡POINTER7;; to high digit01:"‡SCRMINSQ@‡POINTER7;;Subtract 1D;;; from digitNS>XP@‡POINTER7bR>;;If the resultlH‡NXTSCOR;; is a '0' andv)>;; we're on the€F‡NXTSCOR;; high digitŠQ>;; blank it out”P@‡POINTER7žX;¨‡NXTSCOR0;;Do next team² I‡SCRLOOP¼X;ÆX; COMPUTER MOVEÐX; -------------ÚX;äQ‡LASTSPC;;Skip if noîG‡CHKTRGS;; places to moveøQ>;;Set 'puterP†CMPCHK;; checking flag $†ACTIVE;;For each player:%‡CMVPLANQ†PORTNO9;;If not a 'puter I‡NCMPMOV;; then do next*X;4Q†STATUS9;;If locked, go>M>†LOCKED;; see if we canHH‡CCNGMOV;; changeR ‡CKCMTRG;;Is target good?\F‡CJNYCHK;;If no good, dofQ†STATUS9;; journey checkpL>†LOCKED;;Else, lock onz P†STATUS9„!‡CJNYCHK;;Do journey chkŽX;˜)‡CCNGMOV%‡CMPLEVL9;;If it can't change¢!Q‡LVLCHNG8;; change targets¬ F‡CADSTCK;; see if it's there¶ ‡CKCMTRG;;If current targetÀF‡CJNYCHK;; no good skipÊX;Ô&‡CADSTCK ‡GETINDX;;See if 'puter isÞ'…HOLDY;; at it's targetè %†TARGNO9ò Q†MOVMAT8ü R…HOLDYH‡CJNYCHK;;No - do journey ‡CKCMTRG;;Yes- still good? F‡NCMPMOV;;No, do next 'puter$'‡CMPPLACQ†STATUS9;;Yes, push trigger. L>‡TRIGGER8 P†STATUS9B!‡NCMPMOV;;do next 'puterLX;V(‡CJNYCHK%‡CMPLEVL9;;Can it do journey`Q‡LVLJCHK8;; checks?j F‡NCMPMOV;;No, do next 'putert ‡GETINDX;;Can it move where~ ‡CHKPLAC;; it is?ˆ Q‡VALFLAG’!H‡CMPPLAC;;Yes - go do triggerœX;¦‡NCMPMOV0;;Move next 'puter° I‡CMVPLANºX;ÄX; CHECK FOR DISK PLACINGSÎX; -----------------------ØX;â!‡CHKTRGSQ>;;Not doing checksì P†CMPCHKö$†ACTIVE;;For each player$‡CHKPLCLQ†STATUS9;;If trigger not I‡CHKNPLC;; pressed do next ‡GETINDX;;Get map index ‡CHKPLAC;;Try to place disk(Q†STATUS9;;Turn off trigger2M>ÿ‡TRIGGER< P†STATUS9F‡CHKNPLC0;;Do next playerP I‡CHKPLCLZX;dX; GAME OVER CHECKnX; ---------------xX;‚Q‡LASTDSK;;If flippingŒI‡NOTDONE;; not finished–Q‡LASTSPC;;If nowhere to G†GAMDON;; move - doneªQ>;;Just checking´ P†CMPCHK¾$>;;Use specialÈ%‡GOVRNDX;; indexÒQ†MOVMAT8;;Can white moveÜ?;; at this pos?æ Q>…WHITEðP†TEAMNOú ‡CHKPLAC Q‡VALFLAGH‡NOTDONE;;Yes - not done %‡GOVRNDX"Q†MOVMAT8;;Can black move,?;; at this pos?6 Q>…BLACK@P†TEAMNOJ ‡CHKPLACT Q‡VALFLAG^H‡NOTDONE;;Yes - not donehQ‡GOVRNDX;;If index = lastrR‡LASTSPC;; & none found|E†GAMDON;; game is over†#‡GOVRNDX;;Point at next!‡MAINLOP;; & continuešX;¤ ‡NOTDONEQ>;;Reset game over®P‡GOVRNDX;; index¸!‡MAINLOP;; & continueÂX;ÌX; GAME OVERÖX; ---------àX;ê†GAMDONQ>;;Delay so thatôP†HOLDIT;; the screenþ…WAIT0$>ÿ;; can be seen …WAIT1%>ÿ!…WAIT2Q…KEYIN;;Quit right awayR>ÿ;; if any key is&H‡DOOVERS;; pressed0 Q†CONSOL:R>D H‡DOOVERSN1X H…WAIT2b0l H…WAIT1v "†HOLDIT€ I…WAIT0Š#‡DOOVERS ‡DBCNSOL;;Debounce keys”Q>ÿ;;Clear key hitž P…KEYIN¨!‡RESTART;;Go to titles²X;¼X; SUBROUTINES TO MAINÆX; -------------------ÐX;Ú X; CHECK COMPUTER MOVE TARGETäX; 'puter player # in XîX;ø#‡CKCMTRG%†TARGNO9;;Get map indexQ†MOVMAT8;; from target # ? ‡CHKPLAC;;Check target Q‡VALFLAG;;If it's good,*H‡CKTRGDN;; exit w/flag4#†TARGNO9;;Else, update>Q‡LASTSPC;; target # toHR†TARGNO9;; next targetR E‡CKNOLOK\Q>f P†TARGNO9p‡CKNOLOK ‡STARGXY;;Set x/yzQ†STATUS9;;Turn lock off„M>ÿ†LOCKEDŽ P†STATUS9˜Q‡VALFLAG;;Exit w/flag¢‡CKTRGDN:;; = bad¬X;¶X;À)X; COMPUTE MAP INDEX FROM X/Y POSITIONÊX; player # in XÔX;Þ‡GETINDXQ…PLYRY9;;Normalizeè;;; y to topòS>„MINY ;; edge ofüM>ð;; board and V?;; divide by P†HOLDIT;; 16. Then V?;; multiply$ V?;; the result. V?;; by 9 to get8 ,;; start of mapB O†HOLDIT;; lineL P†HOLDITV Q…PLYRX9;;Normalize` ;;; x to leftj S>„MINX ;; edge oft V?;; board and~ V?;; divide byˆ V?;; 8 to get’ ,;; line offsetœ O†HOLDIT;;Add line start¦ O> ;; & start index° ?;;Put it in Yº :;; and returnÄ X;Î X;Ø X; SET TARGET X/Y POSITIONâ X; 'puter player # in Xì X;ö ‡STARGXYC;;Save Y reg 5 Q†TARGNO9;;Get index by ?;; target # Q†MOVMAT8(  ‡CXYPPOS;;Calc X/Y pos2 Q‡POINTER;;Copy out< P…TARGX9;; X positionF Q‡POINTER;;Copy outP P…TARGY9;; Y positionZ 7;;Restore Yd ?;; registern :x X;‚ X;Œ #X; CALCULATE TARGET X/Y POSITION– X; IN PLAYER/MISSILE TERMS  X; Map position in Aª X;´ !‡CXYPPOS ‡SPLXYFI;;Get X/Y pos¾ Q‡POINTER;;Multiply XÈ T?;; by 8 andÒ T?;; add leftÜ T?;; edge ofæ #X; CLC ; boardð O>„MINXú P‡POINTER Q‡POINTER;;Multiply Y T?;; by 16 and T?;; add top" T?;; edge of, T?;; board6 X; CLC@ O>„MINYJ P‡POINTERT :^ X;h X;r )X; COMPUTE X/Y POSITION FROM MAP INDEX| X; Map index in A† X; ‡SPLXYFI;;;Subtract theš S> ;; border indices¤ P‡POINTER;;This is just® Q>;; the standard¸ P‡POINTER;; 6502 byte %>;; size div &Ì "…DIVLPT‡POINTER;; mod (by 9)Ö U‡POINTER;; routine.à ;;; POINTER isê Q‡POINTER;; the remainderô S> ;; and +1 is theþ D…DIVNX;; quotient. P‡POINTER;; When finished, #‡POINTER;; POINTER is the …DIVNX1;; X-pos and& H…DIVLP;; POINTER+1 is0 :;; the Y-pos