þþ,EEIdX;***********************nX;* *xX;* 'BOULDER BOMBERS' *‚X;* by *ŒX;* Mark Price *–X;* * X;***********************ªX;´X; ZERO-PAGE VARIABLES¾X;ÈÒX;Ü …CLOCKæ‡DELYVALð ƒDIRú‡EXPLODE †HOLDIT „MASK …ONSCR" „PLAY,‡PLAYERS6 …RKILL@ „TDIRJ †XCOUNTT †YCOUNT^ †BMBDRPh „BRUNr‡DRPFREQ|‡DRPRATE† †FREMEN …BOMBSš …PLYRX¤ …PLYRY® †RCKHIT¸ …ROCKS †SCRPTRÌX;ÖX; KEYBOARD VARIABLESàX;ê ‚CHüô ƒCH1òþX;†PMAREA0ƒPL0†PMAREAƒPL1ƒPL0&ƒPL2ƒPL10ƒPL3ƒPL2:X;D…ROMCHà;;ROM CHR SETI…CHARS,;;MY CHR SETNX;XX; SYSTEM EQUATESbX;l†AUDCTLÒv …AUDC1Ò€ …AUDC2ÒŠ …AUDC3Ò” …AUDC4Òž …AUDF1Ò¨ …AUDF3Ò² …AUDF4Ò¼†CHBASE ÔƆCOLBAKÐІCOLPF0ÐÚ†COLPF1Ðä†COLPF2Ðî†COLPF3Ðø†COLPM0ІCOLPM1Ð †COLPM2ІCOLPM3Ð †CONSOLÐ* …DLISTÔ4†DMACTLÔ>†SDMCTL/H†GRACTLÐR†HITCLRÐ\†HPOSP0Ðf†HPOSP1Ðp†HPOSP2Ðz†HPOSP3Є …NMIENÔŽ …PL2PFИ†PMBASEÔ¢ …PORTAÓ¬†RANDOM Ò¶†SIZEP0ÐÀ …SKCTLÒÊ …TRIG0ÐÔX;Þ èX;é„INIT$>o;;COPY MY CHARSê†MYCHRSQ‡MYCHARS9ë P…CHARS9ì0í I†MYCHRSòQ>;;DISABLE VBIü P…NMIENQ>4;;SET COLORS P†COLPF0Q>($ P†COLPF1.Q>„8 P†COLPF2BQ>ÄL P†COLPF3VQ>` P†COLBAKj$>;;INIT PLAYERSt‡STWIDTHP†SIZEP09~0ˆ I‡STWIDTH’Q>(œ P†COLPM0¦Q>„° P†COLPM1ºQ>ÈÄ P†COLPM2ÎQ>ÈØ P†COLPM3â Q>5†PMAREAì P†PMBASEöQ>> P†DMACTL Q> P†GRACTL%>p;;INIT CHR SET(†SETCH1Q…ROMCH82 P…CHARS8<3F H†SETCH1P†SETCH2Q…ROMCH8ZP…CHARS8d3n H†SETCH2x Q>5…CHARS‚ P†CHBASEŒQ>;;INIT VARS–%>†SCRPTR…CLOCK ‡ZEROVARP…CLOCK8ª1´ I‡ZEROVAR¾%>';;SET SCREEN DISPȆCLRTOPP†CANYON8Ò1Ü I†CLRTOPæ ‡SETSCRNðQ>;;INIT SOUNDú P†AUDCTLQ> P…SKCTLQ>8;;SET PLAYER"P…PLYRY;; LANES,Q>H6 P…PLYRY@X;J‡RESTARTQ>,;;SET PLAYERTP…PLYRX;; START^Q>Ì;; POSITIONSh P…PLYRXrQ>;;TURN OFF SCREEN† P†DMACTLP…AUDC3;; EXPLOSIONS,š P‡EXPLODE¤P…AUDC4;; AND BKG SOUND® …PMCLR;;CLEAR PLAYERS¸Q>4†DLIST1;;SET TITLEÂP…DLIST;; SCREENÌ Q>5†DLIST1Ö P…DLISTàQ>ÿ;;SET GAME SPEEDêP‡DELYVAL;; FOR TITLESôQ>;;SET START DIRþPƒDIRP„PLAY;;SET PLAY FALSEQ>;;PLAYERS NOTP…ONSCR;; ON SCREEN&Q>>;;TURN SCREEN0P†DMACTL;; BACK ON:Q>;; INIT CLOCKD P…CLOCKN †GTCNSLQ†CONSOL;;CHECK CONSOLXM>;; SWITCHESbR>;;SELECT PRESSED?lH‡CHKSTRT;; NO, TRY STARTv"†SELECTQ†CONSOL;; YES, WAIT FOR€M>;; KEY RELEASEŠ F†SELECT”Q‡PLAYERS;;CHANGE # OFžN>;; PLAYERS¨ P‡PLAYERS²,¼O>;; & SET ON SCREENÆ P‡SCNOPLRÐH…MOVET;;(MOVE PLAYERS)Ú‡CHKSTRTR>;;IF START THENäF…START;; START GAMEî…MOVETQ…ONSCR;;IF ON SCREEN,øH…MOVIT;; THEN MOVEQ†RANDOM;;ELSE, PICK OUT M>;; NEW SHIP TYPE>  Q…MASKS9*P„MASK;; & SET IT4 …MOVIT ‡MOVEPLR;;MOVE PLAYERS>!†GTCNSL;;DO CHECK AGAINHX;R…STARTQ†CONSOL;;WAIT FOR KEY\M>;; RELEASEf F…STARTpQ>;;SET GAME SPEEDzP‡DELYVAL;; TO $FF+$04„Q>;;SET PLAY TRUEŽ P„PLAY˜P†DMACTL;;TURN OFF SCREEN¬$>;;SET SCORES TO¶‡ZEROSCRP†SCORE19;; ZEROÀ P†SCORE29Ê0Ô I‡ZEROSCRÞQ>èP†SCORE1òP†SCORE2ü$>;;SET BOMBS LEFT Q>Í;; TO THREE †STBMBCP…BOMB19 P…BOMB29$ 0. I†STBMBC8 Q>B P…BOMBSL P…BOMBSV Q>;;SET NEXT FREE` P†FREMEN;; BOMB AT 1000j P†FREMENt Q‡PLAYERS;;SET SECOND~ T?;; PLAYER MESSAGEˆ T?;; TO 'PLAYER 2'’ T?;; OR 'COMPUTER'œ $>¦ ?° †STP2MSQ‡P2COMPT8º P…P2MSG9Ä 3Î 0Ø I†STP2MSâ Q>4†DLIST2;;SET DLISTì P…DLIST;; TO GAMEö Q>5†DLIST2;; SCREEN P…DLIST Q>>;;TURN ON SCREEN P†DMACTL X;( ‡NEWSCRN ‡SETSCRN;;SET CANYON2 Q>;;SET TYPE TO< P„MASK;; BALLOONF P…CLOCK;;AND BEGIN CLOCKP Q>Z PƒDIR;;DIR = RIGHTd P…ROCKS;;ROCKS INn Q>*;; CANYON=298x P…ROCKS‚  …PMCLR;;CLEAR PLAYERSŒ Q>;;SET PLAYERS ON– P…ONSCR;; SCREEN=FALSE  P…AUDF4ª Q>,;;SET START´ P…PLYRX;; POSITIONS¾ Q>Ì;; OF PLAYERSÈ P…PLYRXÒ P†HITCLR;;CLEAR HITSÜ Q>;;#ROCKS PER BOMBæ P…RKILL;; (MAX) =8ð Q‡DELYVAL;;SPEED UP THEú R>¯;; GAME JUST A BIT F‡BMBLOOP;; (UNLESS ALREADY ;;; AT MAX SPEED) S>" P‡DELYVAL, X;6 X; BOMB MOVEMONT, HIT CHECKS,@ X; SCORE AND HIGHSCORE SETJ X;T !‡BMBLOOP$>;;GET PLAYER INDEX^ !‡BMBNLOPQ†BMBDRP9;;IF BOMB NOTh H‡CHKHITS;; DROPPEDr !†CHKDRP;; CHECK TRIG| ‡CHKHITSQ…PL2PF9;;BOMB HIT† H†CKHROK;; ANYTHING? !†LWRBMB;; NO,MOVE BOMBš †CKHROKM>;;IF HIT ONLY¤ H†BHITRK;; COLOR 3, IT® !‡KILLBMB;; GETS ERASED¸ †BHITRKQ>;;SET POINTER P†SCRPTR;; INTO SCREENÌ Q†BMBDRP9;; RAM WHERE THEÖ ;;; ROCK HIT IS.à S>g;;1ST, GET BOMB'Sê M>ø;; Y-POS TRANS-ô P†SCRPTR;; LATED INTOþ T†SCRPTR;; ROW NUMBER T†SCRPTR;;AND MULTIPLY IT U†SCRPTR;; BY 40 ,& O†SCRPTR0 P†SCRPTR: D„GTP0D #†SCRPTRN „GTP0Q…PLYRX9;;THEN, CHANGEX ;;; X-POS INTO THEb S>/;; COLUMN NUMBERl V?v V?€ ,;;AND ADD IT ONŠ O†SCRPTR” P†SCRPTRž D„GTPA¨ #†SCRPTR² „GTPA,;; ADD SCREEN¼ O>4†CANYON;; STARTÆ P†SCRPTR;; ADDRESSÐ Q†SCRPTRÚ O>5†CANYONä P†SCRPTRî %>;;CLEAR INDEXø Q@†SCRPTR7;; & GET CHAR F„GTP1;;IF IT'S BLANK R>;; OR ABOVE 4 D†GOTCHR;; THIS ISN'T IT. „GTP13;; TRY AGAIN,ONE* Q@†SCRPTR7;; RIGHT4 F„GTP2> R>H D†GOTCHRR „GTP2%>(;;IF WE STILL\ Q@†SCRPTR7;; DON'T GET ITf F„GTP3;; TRY 1 DOWNp R>z D†GOTCHR„ „GTP33;;THEN, BOTH ATŽ Q@†SCRPTR7;; ONCE˜ H†GCKRCK¢ !†LWRBMB;;IF BY THIS¬ †GCKRCKR>;; TIME, WE DONT¶ D†GOTCHR;; HAVE IT, THENÀ !†LWRBMB;; GIVE UPÊ †GOTCHRT?;;HOLD SCORE=Ô P†HOLDIT;; CHAR * 2Þ Q>;;ERASE ROCK ONè P@†SCRPTR7;; SCREENò Q…ROCKS;;LOWER # OFü ;;; ROCKS LEFTS> P…ROCKS E„GOT1$ "…ROCKS.„GOT1Q>þ;;START EXPLOSION8P‡EXPLODE;; SOUNDBX;LX; ADD ON TO SCOREVX;`%†SCRNDX9;;GET BASE INDEXjQ†HOLDIT;; TO SCORES,ANDt,;; ADD TO SCORE~ O†SCORE18ˆ P†SCORE18’Q>;;SET DIGIT # FORœP†HOLDIT;; ROLLOVER PROT.¦†ADDSCRQ†SCORE18;;DONE?°F…CHKHI;; YES, CHECK HIGHºR>;;DIGIT >10?ÄD†SCUNDX;; NO, GO RIGHTÎ;;;SUB 10 FROMØS> ;; THIS DIGITâ P†SCORE18ì1;;POINT TO NEXTö "†HOLDITG…CHKHI;;ROLLOVER! LEAVE Q†SCORE18;;GET DIGITH…SCBRK;;IF BLANK, SETQ>;; TO ZERO(…SCBRK,;;ADD 12O><P†SCORE18;; AND SAVE ITFH†ADDSCR;;CHECK THIS DIGITP†SCUNDX3;;GO RIGHT ONEZ#†HOLDIT;; DIGITd H†ADDSCRnX;xX; CHECK FOR HIGH SCORE‚X;Œ…CHKHIQ>4†SCORE1–P†SCRPTR;;SET POINTER Q>5†SCORE1;; TO SCORE FORªP†SCRPTR;; PLAYER 1´A;;IF IT ISN'T¾F†CHKSCR;; PLAYER 1, THENÈQ> ;; ADD TO GETÒ,;; POINTER FORÜO†SCRPTR;; PLAYER 2æ P†SCRPTRð D†CHKSCRú#†SCRPTR†CHKSCR%>;;BEGIN AT HI END‡CHECKSCQ@†SCRPTR7R†HISCOR8;;COMPARE 'EM"F†CKNXDG;;IF SAME,DO NEXT,E†STHISC;;IF PLAYER > SET6D†CHKFRM;;IF HIGH > SKIP@†CKNXDG3;;DO NEXT DIGITJ)>;;IF ALL DONE,TH‡CHECKSC;; THEN IT'S THE^F†CHKFRM;; SAME, SKIPhX;rX; SET HIGH SCORE|X;††STHISC%>;;COPY THE ‡SETDIGTQ@†SCRPTR7;; NEW HIGHšP†HISCOR8;; SCORE INTO¤ 1;; HISCOR® I‡SETDIGT¸X;Â#X; CHECK FOR GETTING EXTRA BOMBSÌX;Ö†CHKFRM%†SCRNDX9;;GET SCOREàQ†SCORE18;; IN THOUSANDSêR†FREMEN9;;IF NOT FREEôH†STRKHT;; BOMB YET,SKIP.þ#…BOMBS9;;ELSE, UP BOMBSQ…BOMBS9;; BY 1R>;;IF BOMBS>=4,E†UPDTFM;; KEEP IN RESERVE&,;;IF BOMBS LESS0O†SCRNDX9;; THAN 4, THEN:?;; SET EXTRADQ>Í;; ON SCREENNP…BOMB18X!†UPDTFM#†FREMEN9;;SET FOR NEXTbX;l †STRKHT#†RCKHIT9;;IF NEW # OFvQ†RCKHIT9;; ROCKS HIT =€R…RKILL;; MAX,KILL BOMBŠH†LWRBMB;; ELSE, LOWER IT”‡KILLBMBA;;SET POINTERž,;; TO BOMB¨ O>5ƒPL2²P†SCRPTR¼ Q†BMBDRP9Æ P†SCRPTRÐ%>;;AND ERASE ITÚQ>ä‡ERABOMBP@†SCRPTR7î1ø I‡ERABOMB‡KILBOMBA;;TURN OFF SOUND T?;; FOR THIS BOMB? Q>* P…AUDF184 P…AUDC18>P†BMBDRP9;;SET FLAG OFFHQ†RCKHIT9;;IF IT DIDN'TRH‡DONXBMB;; HIT ANYTHING,\ ‡LWRMISS;; LOWER # BOMBSf!‡DONXBMB;; & DO NEXTpX;zX; LOWER THE BOMBS„X;Ž †LWRBMBA˜,¢O>5ƒPL2;;SET POINTER TO¬P†SCRPTR;; BOMB¶ Q†BMBDRP9À P†SCRPTRÊQ>;;ERASE THE BOMBÔ%>Þ…ERBMBP@†SCRPTR7è1ò I…ERBMBü#‡DRPRATE9;;UP DROP SPEED Q‡DRPRATE9V?;;UPDATE POSITIONV?$V?.V?8 P†HOLDITB,L O†BMBDRP9VR>Ä;;OUT OF RANGE?`E‡KILBOMB;; YES, KILL ITjP†BMBDRP9;;ELSE, SETtP†SCRPTR;; THE BOMB~%>ˆ‡SETBOMBQ…CHARS`8’ P@†SCRPTR7œ1¦ I‡SETBOMB°A;;SET Y TO INDEXºT?;; THE SOUND REGSÄ?ÎQ†HOLDIT;;UPDATE SOUNDØ,;; OF DROPPINGâO‡DRPFREQ9;; BOMBì P‡DRPFREQ9ö P…AUDF18Q>¨ ; S†HOLDIT P…AUDC18(‡DONXBMB0;;RESET INDEX2G†DOPLMV;;IF BOTH NOT<!‡BMBNLOP;; DONE, DO NEXTFX;PX; CHECK & DROP BOMBSZX;d$†CHKDRPQ…BOMBS9;;IF NO BOMBS LEFTnF‡DONXBMB;; THEN DO NEXTxA;;IF NOT THE‚,;; COMPUTER,CHECKŒS‡PLAYERS;; TRIGGER–H†CHKTRG;;IT'S PLAYER!¡QƒDIR;;GOING LEFT?¢G†GOINGR;;NO!£Q…PLYRX9;;GET COMPUTER XªR>D;;TOO FAR LEFT?´D‡DONXBMB;;YES!¶E†TRYDRP;;NO, TRY DROP!·†GOINGRQ…PLYRX9;;GET COMP. X¾R>¸;;TOO FAR RIGHT?ÈE‡DONXBMB;;YES!Ò"†TRYDRPQ†RANDOM;;COMPUTER DROPSÜM>;; A BOMB IFæF†DROPIT;; RANDOM SAYS TOðH‡DONXBMB;;ELSE DO NEXTú †CHKTRGQ…TRIG09;;TRIG PUSHED?H‡DONXBMB;; NO, DO NEXT†DROPITQ…PLYRY9;;DROP: SET,;; BOMB Y TO"O>;; PLAYER Y+8, P†BMBDRP96Q>;;CLEAR DROP RATE@ P‡DRPRATE9JP†RCKHIT9;; AND ROCKS HITT#„BRUN9;;UP BOMBS DROPPED^Q>2;;SET THE SOUNDhP‡DRPFREQ9;; FLAGrH‡DONXBMB;;AND DO NEXT|X;††DOPLMVP†HITCLR;;CLEAR HITS ‡MOVEPLR;;MOVE PLAYERSšQ‡EXPLODE;;EXPLOSION GOING?¤F‡CKRSTRT;; NO,SKIP®"‡EXPLODE;;UPDATE EXPLOSION¸"‡EXPLODE;; SOUNDÂN>ðÌ P…AUDF3ÖV?àV?êV?ôV?þN> P…AUDC3 ‡CKRSTRTQ†CONSOL;;ANY CONSOLER>;; BUTTONS PUSHED?&F†CKNSCR;;IF YES, THEN0!‡RESTART;; RE-START:"†CKNSCRQ…ROCKS;;# OF ROCKS LEFTDH‡CHKPAUS;; = ZERO?NQ…ROCKS;;IF YES, THENXH‡CHKPAUS;; SET UP Ab!‡NEWSCRN;; NEW SCREENl"‡CHKPAUSQ‚CH;;SPACEBAR PRESSED?vR>!€H‡CKDRRCK;;NO, CONTINUEŠQ>;;YES, PAUSE GAME”P…AUDC1;;TURN OFF MAINžP…AUDC2;; SOUNDS¨ P…AUDC3²"‡HLDPTRNQ…PORTA;;WAIT FOR STICK¼R>ÿ;; MOVEMENTÆ F‡HLDPTRNÐQ>ÿ;;RESET CH FORÚP‚CH;; ANOTHER PAUSEäPƒCH1î ‡CKDRRCKQ…CLOCK;;TIME TO DROPøM>;; SUSPENDEDF‡DRPROCK;; ROCKS? !‡BMBLOOP;;NO, DO BOMBS!‡DRPROCKQ>';;SET COLUMN TO 39  P†XCOUNT*‡DSTYCNTQ>;;ROW TO 84P†YCOUNT;;AND SET POINTER>Q>4†CANYONh ;; TO XCOUNTH,;; PLUS CANYONRO†XCOUNT;; START\ P†SCRPTRfQ>5†CANYONh pO>zP†SCRPTR„†RK2DRP%>;;ROCK FALL LOOP:ŽQ@†SCRPTR7;;NOTHING THERE˜F‡DONXRCK;; THEN TRY NEXT UP¢>;;ELSE HOLD IT¬%>(;; & LOOK UNDERNEATH¶ Q@†SCRPTR7ÀH‡DONXRCK;;NOT BLANK-DO NEXTÊA;;BLANK, MOVE ROCKÔP@†SCRPTR7;; ABOVE DOWNÞ%>èCò P@†SCRPTR7üQ†SCRPTR;; & GO UP ONE;;; SO WHOLE COLUMNS>(;; WON'T FALL ATP†SCRPTR;; ONCE$ E…NOVER."†SCRPTR8!…NOVER"†YCOUNT;;LAST ROW DONE?BG‡DONXCOL;; YES, DO NEXT COLL‡DONXRCKQ†SCRPTR;;GO UP ONEV ;;; ROW`S>(j P†SCRPTRt E†NOVER2~"†SCRPTRˆ"†NOVER2"†YCOUNT;;LAST ROW DONE?’I†RK2DRP;; YES, DO NEXT COLœ#‡DONXCOL"†XCOUNT;;LAST COL DONE?¦I‡DSTYCNT;; NO, DO NEXT°!‡BMBLOOP;;DO BOMBS AGAINºX;Ä#X; MOVE PLAYER,CHECK FOR LEAVINGÎ$X; SCREEN, END GAME CHECK, SWITCHØX; SHIP TYPESâX;ì‡MOVEPLRQ…ONSCR;;IF NOT ONö H‡ADDCLOK;; SCREEN, SET SOUNDQ„MASK;; AND PLAYERS R>;;BALLOON?F‡STBLSND;; YES, DO THATQ>–;;SET PLANE SOUND( P…AUDF42Q>$< P…AUDC4FH‡ADDCLOK;; & GOTO CLOCK ADDP‡STBLSNDQ>;;SET WIND SOUNDZ P…AUDF4dQ>n P…AUDC4x$>;;SET BALLOON‚†STBLNSQ…PLYRY9Œ P†SCRPTR–A ,ª O>5ƒPL0´P†SCRPTR¾%>ȇSETBALNQ…CHARSP8Ò P@†SCRPTR7Ü1æ I‡SETBALNð0ú I†STBLNS ‡ADDCLOK#…CLOCK;;ADD TO CLOCKQ…CLOCK;;IF CLOCK ANDM„MASK;; MASK<>0 THEN"H‡DODELAY;; DON'T MOVE,Q…PLYRX;;MOVE THE PLAYERS6,;;FIRST PLAYER 1@OƒDIRJ P…PLYRXT P†HPOSP0^ P†HPOSP2hQƒDIR;;THEN PLAYER 2rN>þ|,† O…PLYRX P…PLYRXš P†HPOSP1¤ P†HPOSP3®Q„MASK;;IF ON PLANES¸R>;; THEN CHECK IFÂH‡DODELAY;; TIME TO ANIMATEÌQ…CLOCK;; PROPSÖM>àF‡DODELAY;;NO, SKIP THISêQƒDIR;;SET TEMP DIRôP„TDIR;;(WILL BE KILLED)þ$> ‡ANILOOPQ…PLYRY9;;SET POINTERP†SCRPTR;; TO PLAYERA&,0 O>5ƒPL0:P†SCRPTRDQ…CLOCK;;GET IMAGE INDEXNM>;; FROM CLOCKXT?bP†HOLDIT;; AND HOLD ITlQ„TDIR;;GET DIRECTIONvM>;; INDEX FROM€ ,;; DIRŠO†HOLDIT;;& ADD 'EM TO GET”&†HOLDIT;; INDEX.ž>;;SAVE PLAYER #¨%>;;SET PLAYER²†ANISETQ…CHARS09¼ P@†SCRPTR7Æ2Ð3Ú)>ä H†ANISETîQ„TDIR;;REVERSE TDIRøN>þ P„TDIR $†HOLDIT;;GET PLAYER #0;; & ANIMATE NEXT  I‡ANILOOP*‡DODELAY$>;;WAIT FOR A4#†DELAY1%‡DELYVAL;; WHILE TO MAKE>†DELAY21;; GAME PLAYABLEH H†DELAY2R0\ H†DELAY1fQ>;;PLAYERS ARE NOWpP…ONSCR;; ON SCREENzQ…PLYRX;;BUT CHECK TO„R>,;; SEE IF THEYŽF†OFFSCR;; AREN'T˜R>Ì¢H‡MPGOBAK;;IF ON, RETURN¬†OFFSCRQ>;;ELSE, TURN OFF¶P…AUDC3;; EXPLOSIONS ANDÀP…AUDC4;; BKG SOUNDÊ P‡EXPLODEÔP…ONSCR;;SET ONSCR FALSEÞ$>è …CHKBRQ†BMBDRP9;;IF A BOMB ISòF…CKBRN;; IN THE AIR, ANDüQ†RCKHIT9;; IT HASN'T HITH…CKBRN;; ANYTHING YET, ‡LWRMISS;; IT'S A MISS…CKBRNQ„BRUN9;;IF NO BOMBS$H…CKNBR;; DROPPED THIS. ‡LWRMISS;; PASS,IT'S A MISS8 …CKNBR0B I…CHKBRL …PMCLR;;CLEAR OUT PLAYERSV$‡PLAYERS;;IF THE ACTUAL`Q…BOMBS;; PLAYERS HAVEj,;; NO MORE BOMBS,tO…BOMBS9;; AND WE'RE ON A~O„PLAY;; GAME, END ITˆ F‡ENDGAME’QƒDIR;;REVERSE DIRECTIONœN>þ¦PƒDIR°$…PLYRY;;CHANGE PLAYERº%…PLYRY;; LANESÄ &…PLYRYÎ '…PLYRYØQ>;;RESET CLOCKâ P…CLOCKìQ…ROCKS;;IF HALF OF THEöH‡MPGOBAK;; ROCKS ARE GONEQ…ROCKS;; THEN SWITCH R>•;; TO PLANESE‡MPGOBAK;;ELSE RETURNQ>;;SET MOVE RATE(P„MASK;; MASK2Q>;;PLANE BOMBS GET<P…RKILL;; MAX OF 4 ROCKSF‡MPGOBAK:;;RETURNPX;Z‡ENDGAME7;;GET RID OFd7;; RETURN ADDRESSnQ>;;DO DELAY SOxP†HOLDIT;; THE PLAYERS‚…WAIT0$>ÿ;; CAN SEE THEŒ…WAIT1%>ÿ;; FINAL SCORE–…WAIT2Q†CONSOL;; (END DELAY R>;; EARLY WITHªH‡ENDGOBK;; CONSOL KEY)´1¾ H…WAIT2È0Ò H…WAIT1Ü "†HOLDITæ I…WAIT0ð%‡ENDGOBK!‡RESTART;;GO TITLE SCREENúX;X; SET CANYON SCREEN IMAGEX;‡SETSCRN%>;;COPY ROCKS &" †SETSC1Q‡ROCKIMG8;; CANYON TO,P†CANYON(8;; SCREEN63@ H†SETSC1J%>‘T†SETSC2Q‡ROCKIMGÿ8^P†CANYON'8h1r H†SETSC2| :;;RETURN†X; X; LOWER NUMBER OF BOMBS LEFTšX;¤‡LWRMISSQ…BOMBS9;;IF ALREADY®F‡LWMGOBK;; ZERO, EXIT¸"…BOMBS9;;LOWER BOMBS LEFTÂQ…BOMBS9;;IF AT LEAST 3ÌR>;; LEFT, RETURNÖ E‡LWMGOBKà,;;GET INDEX FORêO†SCRNDX9;; SCREEN TOô?;; ERASE BOMBþQ> P…BOMB18 ‡LWMGOBK:;;RETURN X;& %X; CLEAR PLAYERS,BOMB Y POSITIONS,0 "X; BOMBS DROPPED THIS PASS, AND: X; TURN OFF BOMB SOUNDSD X;N …PMCLRQ>X ?b ‡PMCLOOPPƒPL08;;CLEAR ALLl PƒPL18;; PLAYERSv PƒPL28€ PƒPL38Š 1” H‡PMCLOOPž P†BMBDRP;;CLEAR BOMB Y¨ P†BMBDRP;; POSITION² P„BRUN;; & BOMBS DROPPED¼ P„BRUN;; THIS PASSÆ P…AUDC1;;TURN OFF BOMBÐ P…AUDC2;; FALL SOUNDSÚ :ä X;î X; PLAYER 2/COMPUTER MESSAGESø X;!#‡P2COMPT €=ARETUPMOC2 REYALPA !X;!X; MISC DATA !X;*!†SCRNDX = 4!…MASKS =>!X;H!X; TITLE SCREEN DISPLAY LISTR!X;\!†DLIST1 p=p=p=Ff! „GAMEp! p=p=p=p=pz! p=p=p=p=D„! †CANYON(Ž!! =========G˜! …TITLE¢! ==A¬! †DLIST1¶!X;À!X; GAME DISPLAY LISTÊ!X;Ô!†DLIST2 p=p=p=pÞ! p=p=p=p=pè! p=p=p=p=Dò! †CANYON(ü!! =========F" „GAME" p===A" †DLIST2$"X;." X; TITLES8"X;B"…TITLE €=AŠ boulder AL" €=AŠ bombers AV" A” by mark price A`" AŽ PLAYERS: Aj"‡SCNOPLR =====t"X;~"X; BOTTOM OF GAME SCREENˆ"X;’"„GAME A‹ HIGH: Aœ"#†HISCOR A• 0 PLAYER 1 A¦"'…P2MSG =========°"†SCORE1 ====º"…BOMB1 ====Ä"†SCORE2 ====Î"…BOMB2 ===Ø"X;â"X; DATA FOR CANYONì"X;ö")‡ROCKIMG =========#! ========= #! =========#! =========#! …=========(#! =========2#! =========<#! =========…F#! „=…========P#! =========Z#! =========d#! ========„=…n#! „=…========x#! =========‚#! =========Œ#! ========„=…–#! „=„=…======= #! =========ª#! =========´#! =======„=„=…¾#! „=„=…=======È#! =========Ò#! =========Ü#! =======„=„=…æ# „=„=„=…=ð# ======ú#' …===========$' ===…========$ „=„=„=…=„=„$ „=…===="$ ===„=„=…,$ =…====6$ ====…=@$ „=„=…===J$ ====„=„T$ „=…=„=„=„=„^$ …=====h$ „=„=„=„=„=„r$ …=====|$ =„=„=„=„=„†$ „=…====$ =„=„=„=„=…š$ „=„=„=„=„=…¤$ ===„=„=„®$ „=„=„=„=„=…¸$ ====„=„Â$ „=„=„=„=„=„Ì$ …====„=„Ö$ „=„=„=…&%X;0%X; CHARACTER SET DATA:%X;D%#‡MYCHARS =======N% T=T=T=T=T=T=T=X% ¨=¨=¨=¨=¨=¨=¨=b% ü=ü=ü=ü=ü=ü=ü=l% ÿ=ÿ=ÿ=ÿ=ÿ=ÿ=ÿ=ÿv% ü=ü=ü=ü=ü=ü=ü=ü€% ====?=Ó=þ=€Š% ===ƒ=¿=Ó=~=”% ==€=À=ü=Ë==ž% ==€=Á=ý=Ë=~=¨% <=~=ÿ==ÿ=ÿ=~=<²% =$=$=====¼%  =@=à=à=à=@==Æ% l=|=8=|=|=|=8=Ð%X;Ú%X; ON-SCREEN CANYONä%X;î%†CANYON ø%X;&à & „INIT;;RUN ADDRESS&X; &