þþóCdX; *********************nX; * ROCKS! *xX; * *‚X; * BY DOUGLAS ENGEL *–X; * * X; *********************ªX;´X; OS EQUATES¾X;È †ATRACTMÒ …AUDC1ÒÜ …AUDC2Òæ …AUDC3Òð …AUDC4Òú†AUDCTLÒ …AUDF1Ò …AUDF2Ò …AUDF3Ò" …AUDF4Ò, ‚CHü6 …CHBASô@†COLOR0ÄJ†COLOR4ÈT†COLPF0Ð^†COLPM0Ðh †COLRSHOr†CONSOLÐ| †DRKMSKN††GRACTLІHITCLRК†HPOSP0Ф†HPOSP1Ю†HPOSP2и†HPOSP3ІHPOSM0Ð̆HSCROLÔÖ†KBCODE Òà „M2PFÐê „M2PL Ðô …NMIENÔþ „P0PFÐ „P0PL Ð „P1PFÐ „P1PL Ð& „P3PLÐ0†PCOLR0À:†PMBASEÔD …PRIORÐN†RANDOM ÒX …RUNADàb†SDLSTL0l†SDMCTL/v†SETVBV\䀆SIZEP0Њ …SKCTLÒ”†STICK0xž†STRIG0„¨†VDSLST²†VKEYBD¼ …WSYNC ÔƆXITVBVbäÐX;ÚX; PROGRAM EQUATESäX;î#‡MISSLES†PMTABL;;PM misslesø)‡PLAYER0†PMTABL;;PM players 0 & 1‡PLAYER1†PMTABL #†PMSATS†PMTABL~;;PM for sats†PMTABLP;;Loc. of table  …PMZAP†PMSATS´;;PM for zap*+ŠSCOREBOARD†SCREEN;;Print score here4†SCREEN0;;Screen mem.>X;HX; PROGRAM VARIABLESRX;\ †PMTABLf"‡ACCOUNT ;;Velocity counterpƒALT ;;1/30 sec counterz#‡ANIMATE ;;Animation counter„'†ANIPTR ;;Offset to frame valuesŽ ˆBEAMDLAY ;;Delay counter˜‡BEAMFLG ;;Flags beam on¢‡BEAMPOS ;;Beam length¬…BLEEP ;;Decay¶…BLINK ;;Light counterÀ†BLINK1 ;;DittoÊ#‰COMPLETED ;;Level done flagÔ#‡COWNTER ;;Explosion counterÞ"…DIGIT ;;Current score dig.è„DOOM ;;Doom flagò…EMPTY ;;No fuel flagü‡ENDCNTR ;;Doom counter„ETC. ;;Misc. sound flag‰EXPLOSION ;;Flag‚FD ;;Flame dir.$‡FLASHME ;;Light counter.„FLIP ;;Direction mask8„FUEL ;;Amount of fuelB"‡FUELMTR ;;Offset to needleL‡FUELUSE ;;Rate of useV+‡GRAVITY ;;Counter for veloc. change`ƒG.O ;;Game over flagj …HOLDA ;;Temp accumulatort…HOLDX ;;Temp index reg.~†HPOSME ;;My horiz.ˆ‡HPOSSAT ;;Sat horiz.’#†KONSOL ;;Former consol val.œˆLANDFLAG ;;Flag landing¦†LOADED ;;Flag loaded°$„MISS ;;M2PF shadow (sort of)ºˆMULTIPLY ;;MultiplierÄ †NEWLEV ;;Next level flagÎ…NEWSC ;;Flag show score؆PAUSED ;;Pause flagâ#‡POWNTER ;;Explosion counterì'ˆRADCOUNT ;;Rate of rad increaseö„RADS ;;Amount of rads"‡RADSMTR ;;Offset to needle …RAND1 ;;Saved random #…RESET ;;Set up me flag„ROAR ;;Rocket decay(„SAT? ;;Active sat flag2*†SATCNT ;;Time between sats counter<"‡SATCNT1 ;;Sat move counterF‡SATCOLR ;;Color of satP†SATDIR ;;Move directionZ#†SATEXP ;;Sat explosion flagd(ˆSATFRAME ;;Sat explosion countern†SATSPD ;;Speed of satx ƒSKY ;;Where fall happens‚#‡STARCNT ;;Star move counterŒ†STROBE ;;Light counter–…SUPER ;;Super sat flag …TEMPA ;;Temporaryª…TEMPB ;;Temporary´ˆVELOCITY ;;Fall veloc.¾ƒVOL ;;DecayÈ„VOL4 ;;DecayÒ†VPOSME ;;My vert.Ü ˆWAITCNTR ;;Message delayæ‡WAITING ;;Message flagð†ZAPCNT ;;Zap counterú‡ZAPFLAG ;;Flags zapX;X; ZERO PAGE EQUATESX;"#†LINENOÊ;;Current DL mode line,#†SHAPEAà;;Player 0 bit pattern6 †SHAPEBâ;;same for Player 1@†ZEROPAÌ;;General usageJ†ZEROPBÎ;;same hereTX;^ X; PROGRAMhX;r |…STARTQ>;;Init serial port† P…SKCTLQ>4…INKEY;;Steal KB vectorš P†VKEYBD¤ Q>5…INKEY®P†VKEYBD¸Q>;;Star colorÂP†PCOLR0ÌQ>;;Init soundÖ P†AUDCTLàX;êX; Move portion of charsôX;þP†ZEROPA;;Clear these P†ZEROPBQ…CHBAS;;Point to charsP†ZEROPA&Q>5…CHARS;;Point to mine0P†ZEROPB:%>@;;16 already definedD$>N†CHLOOPQ@†ZEROPA7;;Move 'emX P@†ZEROPB7b3l H†CHLOOPv#†ZEROPA€#†ZEROPBŠ0” I†CHLOOPž%Q>5…CHARS;;Tell OS where they went¨ P…CHBAS²X;¼X; Draw titleÆX;Ð%>Ú$>ä"†BITBLTQ„BITS9;;Grab title byteîP…HOLDA;;Save itø&…HOLDX;;Save x$>;;Rotate byte 8 times „SHFTQ…HOLDAT?  P…HOLDA*D‚CC;;See if 0 falls out4Q>I;;No, load Rock char>H„PLOT;;AlwaysH‚CCQ>;;Space charR&„PLOTP…TITLE8;;Store in screen mem.\3f0p I„SHFTz$…HOLDX;;Get next byte„2Ž(>˜H†BITBLT;;Go back until done¢…SETUPQ>@;;DLI off¬ P…NMIEN¶Q>;;DMA offÀ P†SDMCTLÊ%>4†XITVBV;;VBI offÔ $>5†XITVBVÞQ>è †SETVBVòQ>4†DLIST1;;New DL vectorsü P†SDLSTL Q>5†DLIST1 P†SDLSTL !…CDLI1Q>4„DLI1;;New DLI vector$ P†VDSLST. Q>5„DLI18 P†VDSLSTB Q>À;;DLI onL P…NMIENV  †INITPM;;Clear PM regs.`  †SILENT;;No soundj P†ATRACT;;No attractt P†COLOR0;;Black~ Q>ˆ P†COLOR0;;Dk grey’ Q>œ P†COLOR0;;Grey¦ Q>° P†COLOR0;;Lt greyº Q>†Ä P†COLOR0;;BlueÎ Q†SLEVEL;;Use start levelØ P…LEVELâ Q>";;Screen DMA onì P†SDMCTLö X; …INPUTQ†CONSOL;;Consol input R>;;No key, try again F…INPUT P†ATRACT;;Off( ƒSELR>;;Select?2 HƒSTA< #…LEVEL;;Update levelF Q…LEVELP R>;;Insure wrap at 10Z HˆDEBOUNCEd Q>n P…LEVELx HˆDEBOUNCE;;Always‚ ƒSTAR>;;Start?Œ H…INPUT– ‚LGQ†CONSOL;;Wait for release  R>ª H‚LG´ F‡UNPRESS;;Always¾ %ˆDEBOUNCEP†SLEVEL;;New start levelÈ $>@;;Debounce delayÒ %>Ü „ASIA3æ H„ASIAð 0ú H„ASIA …BOINK$>p;;Wait for release %> ‡PRESSEDQ…TEMPA;;Waste time" 3, H‡PRESSED6 Q†CONSOL;;Let go, go back@ R>J F…INPUTT 0^ H‡PRESSEDh !…INPUT;;go back nowr X;| ‡UNPRESSQ>† P†SDMCTL P…TOTAL;;Levels done=0š P†ATRACT;;Off¤ (†CLRSCR$>;;Put ATASCII 0's in score® Q>¸ ƒGEMP…SCORE9 0Ì IƒGEMÖ Q>;;ATASCII 3 shipsà P…SHIPSê !Q†SLEVEL;;Start at start levelô P…LEVELþ P…PAINT;;Planet color mask X; („INITQ>5†PMTABL;;Clear all those vars %>4†PMTABL& $>0  …CLEER;;Use this routine:  †SILENT;;Sound offD  †INITPM;;Reset PM regs.N Q>;;Make sure that weX #P…CHARS;;Start with originalb P…CHARS†;;Char shapesl Q>¨v P…CHARS¥€ Q>Š P‰CANISTERS” P†PAUSED;;Start pausedž †ACROSSQ>;;PM on¨ P†GRACTL² "Q>5†PMTABL;;Tell OS where pm is¼ P†PMBASEÆ Q>;;Clear scroll tablesÐ $>§Ú ƒCLRP†SCRLST9ä 0î IƒCLRø Q>5‡MISSLES;;Clear PM area %>4‡MISSLES $> …CLEER &Q>5‡MISSLES;;Put stars in missile 3* P†ZEROPA4 Q>4‡MISSLES> P†ZEROPAH Q>);;Starting lineR „SPOT?\ Q>€;;Put $80f P@†ZEROPA7;; on 2 consecutivep #†ZEROPA;; bytesz P@†ZEROPA7„ "†ZEROPAŽ C˜ ,¢ O>;;Then skip 8 bytes¬ D„SPOT;; and put in more¶ X;À $>×;;Draw guage needlesÊ †NEEDLEQ‡MISSLES9Ô L>;;Missiles 0 & 1Þ P‡MISSLES9è 2ò (>àü H†NEEDLEX; $> ;;Create random distances&…STARSQ†RANDOM;; between the horiz.$)F…STARS;; positions of the consecutive.P„MPOS9;; star bits.8ƒOFSQ†RANDOMBFƒOFSL P†OFFSET9V0` I…STARSjX;t,ˆFIELDCLRQ>5†SCREEN;;Clear asteroid field~ %>4†SCREENˆ$> ’ …CLEERœX;¦X; Put rock chars on screen°X;º$>Ä!Q>5†SCREEN;;Start locationÎP†ZEROPAØ …ROCKSQ>âP†ZEROPA;;Start at 0ì…ASTRO ƒR16;;Random #ö R>;;<6?D†DOUBLE;;Yes, make big rock ,O>@;;Offset to char code%>(P@†ZEROPA7;;Put in char2$ ƒR16;;Find spacing for next rock< P…TEMPAF †GETLEV;;Based on levelP P…TEMPBZ%Q> ;;By subtracting level from 14d;n S…TEMPBx,‚ O…TEMPA;; and adding random #Œ,–O†ZEROPA;;Point to new spot E†COMPLE;;Done at page endª P†ZEROPA´D…ASTRO;;Always¾†DOUBLEP…HOLDA;;SaveÈ!Q†ZEROPA;;See if near page endÒR>þÜE…ASTRO;;Too close try againæQ…HOLDA;;Get char codeðM>þ;;Make evenúO>@;;Char offset%>P@†ZEROPA7;;Put in mem,"O>;;Next char,36!P@†ZEROPA7;; goes in next byte@( ƒR16;;Random spacing by level again.J P…TEMPAT †GETLEV^ P…TEMPBhQ>r;| S…TEMPB†, O…TEMPAš,¤ O†ZEROPA® E†COMPLE¸ P†ZEROPA D…ASTROÌ)†COMPLE#†ZEROPA;;Point to next pageÖ#†ZEROPAà0êI…ROCKS;;Do moreôX;þX; Put fleet on screenQ>5†SCREEN;;Set addr.P†ZEROPAQ>4†SCREEN& P†ZEROPA0†PUTSHP%>;;Set index:Q>Ð;;Rear char codeDP@†ZEROPA7;;PlaceN3;;Next byteXQ>Q;;Engines charbP@†ZEROPA7;;Placel 3;;Nextv ƒR07;;Random # <=7 but >3€,ŠO>” P…HOLDAžQ>R;;Pod back char¨„SHIPP@†ZEROPA7² 3;;Next¼)…HOLDA;;Done enough?Æ H„SHIPÐQ>S;;Bridge charÚ P@†ZEROPA7ä 3;;NextîQ>Ô;;Nose charø P@†ZEROPA73 C, !O†ZEROPA;;Start addr is now at*P†ZEROPA;;Front of ship4 ƒR16;;Spacing = 2*level+Rnd> O…LEVELH O…LEVELRO> ;;+ $20\,fO†ZEROPA;;Add to startpE„OVER;;Page done?z P†ZEROPA;;See if too close to„R>ð;;Page boundaryŽ D†PUTSHP˜X;¢X; Copy for scroll wrap¬X;¶„OVER$>;;# of pagesÀQ>4†SCREEN;Set upÊ P†ZEROPAÔQ>5†SCREENÞP†ZEROPAè„WRAP%>;;# of bytes movedò„COPYQ@†ZEROPA7;;Get oneü #†ZEROPA;;Put on next page P@†ZEROPA7#"†ZEROPA;;Point to ogir. page3$)>0.H„COPY;;Done?8#†ZEROPA;;Skip a pageB#†ZEROPAL 0;;Done?V I„WRAP`X;j(X;Random scroll directions and speedstX;~Q>ˆP†SCRLST;;Fleet dir’Q>œP…LIMIT;;Fleet speed¦$>°#†SETDIRQ†RANDOM;;Random rock dirºM>ÄF†SETDIR;;no 0'sÎR>;;no 3'sØ F†SETDIRâ P†SCRLST9ìR>;;Set counteröH‚RD;; to right valueQ>;; for left  P„CURR9H‚ZC;;Always‚RDQ>;;Also for right( P„CURR92‚ZCQ>;;Set 0 color clocks< P†COLCKS9F2P(> ;;Done?Z H†SETDIRd%…SPEED$>;;Set 5 (speed) countersn†SETSPD ƒR16;;Random # 1-16xO>‚P…LIMIT9;;Store itŒQ†RANDOM;;Bias the speeds–R>0;; if <$30  D†CONTINªM>;;High speed´ P…LIMIT9¾ †CONTIN2È(> ;;Done?Ò H†SETSPDÜX;æQ>4…DLIST;;New DL vectorð P†SDLSTLú Q>5…DLISTP†SDLSTL „OLDC;;Set color table„CDLIQ>4ƒDLI;;New DLI vector" P†VDSLST, Q>5ƒDLI6P†VDSLST@%>4†VBLANK;;New VBI vectorJ $>5†VBLANKTQ>^ †SETVBVhƒFATQ>?;;Wide screen DMAr P†SDMCTL|H‡RESETME;;Always†X;X; PROGRAM LOOPšX;¤„LOOPQ…RESET;;Reset flag?®FˆSPCLKEYS;;No, check consol¸H‡RESETME;;Yes, reset ˆSPCLKEYSQ†CONSOL;;Get consolÌR>;;Any pressedÖH†AAAAAC;;Yes, go aheadàQ†KONSOL;;No, get formerê$>ô&†KONSOL;;Clear itþ„SEL1R>;;Select? H„STA1!…SETUP;;Go to title screen„STA1R>;;Start?& H†AAAAAB0!‡UNPRESS;;Restart game:*†AAAAACP†KONSOL;;Save Console in formerD'†AAAAABQ†NEWLEV;;Check for new levelN F„LOOPX!„INIT;;Start new levelbX;l‡RESETME ‡BEAMOFF;;No beamv †SILENT;;No sound€Q>0;;Init my positionsŠ P†VPOSME”Q>~ž P†HPOSME¨ …CLRME;;Erase me²!Q‰EXPLOSION;;See if I exploded¼F…RS232;;No? skip thisÆ.ˆSUBTRACT"…SHIPS;;Another on bites the dustÐQ…SHIPS;;Any left?ÚR>äH…RS232;;Yes skip thisî#$>;;Game over message and flagø ‡DLPRINTQ>ÿ PƒG.O"…RS232Q>W;;Reset all variables  P‡RADSMTR*Q>˜4 P‡FUELMTR>Q>}HPƒSKYRQ>l\P†PCOLR0fQ>•p P†PCOLR0z …FLAGS;;Reset landed flags„ P‡POWNTERŽP‰EXPLOSION˜ P‡GRAVITY¢ P…EMPTY¬ P„ROAR¶ P„ETC.À P…RESETÊP‰COMPLETEDÔQ>ÿ;;Fill 'er upÞ P„FUELèQ>ò P„FLIPüP…NEWSC;;Flag new score#Q…LEVEL;;Get right ATASCII value,;; for displaying levelO>À$ P†PLEVEL.Q…LEVEL;;Find multiplier8R>;;If level<9 thenBHˆONEDIGIT;;Mult. <10LQ>Ñ;;Mult must be 10VP…PMULT;;Show "1"`Q>ÐjP…PMULT;;Show "0"tH‡THX1138;;Always~ˆONEDIGIT,;;Mult. = level+1ˆ!O>Á;;+$C0 for correct ATASCII’ P…PMULTœQ>ЦP…PMULT;;" " in second digit°"‡THX1138QƒG.O;;See if game overºHƒNEOÄ$>;;Yes, show messageÎ ‡DLPRINTØQ>â P‡WAITINGìQ>ÿ;;Permanent pauseö P†PAUSEDQ>´  PˆWAITCNTRƒNEO „SHOW;;Show me!„LOOP;;Back to main(X;2X; SUBROUTINE LIBRARY<X;FX; routine to find scorePX;Z#„MATH%ˆMULTIPLY;;# of iterationsd-n$„STEP$…DIGIT;;Digit to operate onx†ADDNUMQ…SCORE9;;Current val‚,ŒO>;;+1 for each iteration–R>;;Over 10? E‰NEXTPLACE;;Yes, next digitªƒFINP…SCORE9;;New val´ 1;;Next¾H„STEP;;Another iterationÈQ>ÿÒP…NEWSC;;Flag scoreÜ :;;Done!æ‰NEXTPLACE,;;Sub 9 from valðS> úP…SCORE9;;Save0;;Next higher digitI†ADDNUM;;Always'ƒEGG!„LOOP;;Easter egg could go here"X;,&X;Routine to clear me form PM table6X;@…CLRMEQ>5‡PLAYER0J%>4‡PLAYER0T$>^ …CLEERh:rX;|X; PM register clear routine†X;†INITPM$>;;17 registersš+…INITPQ>;;Entry point if other than 17¤ƒIPMP†HPOSP09®0¸IƒIPMÂ:ÌX;Ö"X; Routine for color attractingàX;ê…MIXUPN†COLRSHô M†DRKMSKþ:X;(X; Routint to initialize color tablesX;& „OLDC$>w0 ‡SETCOLRQ†COLTAB9;;Orig color:P‡ACOLTAB9;;Attract tableDP‡DCOLTAB9;;Display tableN(>FX-F†CHANGE;;Test to see if color in questionb(>.lF†CHANGE;; is a planet colorv(>€F†CHANGE;; and alter itŠ0”I‡SETCOLR;;Done?ž :;;Return¨†CHANGE%> ;;Change next 11²…SILLYQ…PAINT;;Get mask¼M>;;Make lower bits highÆT?ÐT?ÚT?äT?îN…PAINT;;Scramble itøT?;;Scramble moreM>÷;;Mask high intensity 'N†COLTAB9;;Use it to scramble colors P‡ACOLTAB9  P‡DCOLTAB9*041>I…SILLY;;All done?HG‡SETCOLR;;NO, go backRX;\)X; Routine to set my PM shape pointersfX;p!ˆSETSHAPEQ>4‡SHAPE1A;;Player 0z P†SHAPEA„Q>5‡SHAPE1AŽP†SHAPEA˜Q>4‡SHAPE1B;;Player 1¢ P†SHAPEB¬Q>5‡SHAPE1B¶P†SHAPEBÀ:ÊX;Ô#X; Routine to put flames on shipÞX;è)„BURNQ†RANDOM;;Bits for top and bottomòM>;;Flames hereü'ƒPUT5;;Entry point from side routine!L‡PLAYER09;;"OR" into player 0 P‡PLAYER097$L‡PLAYER19;;Ditto. P‡PLAYER198#‡FUELUSE;;Rockets use fuelB #‡FUELUSEL:VX;`'…BURN1Q†RANDOM;;Bits for side flamesj%‚FD;;Movng left or rightt)>~H‚RF;;Right. skip thisˆM>;;Mask bits’!ƒPUT;;Show themœ‚RFM>À;;Mask bits¦!ƒPUT;;Show them°X;ºX; Routine to show meÄX;Î"„SHOWQ†HPOSME;;Set horiz. regs.Ø P†HPOSP0â P†HPOSP1ì,öO>;;+3 for beam horiz.P†HPOSM0 $†VPOSME;;My vert0Q>(!P‡PLAYER09;;Erase flames above2 P‡PLAYER19<2F%>P%†LPRINTQ@†SHAPEA7;;Move shape dataZ P‡PLAYER09dQ@†SHAPEB7;;For both playersn P‡PLAYER19x2‚3Œ)> ;;12 bytes?– H†LPRINT  Q…NEWSC;;See if score updatedªF†AAAAAD;;No, skip this´%$>;;Yes, Put score in screen mem¾ƒRMKQ…SCORE9ÈPŠSCOREBOARD9Ò0ÜIƒRMKæQ>;;Clear flagð P…NEWSCú†AAAAAD:;;ReturnX;!X; Routine to display messagesX; by altering Display list"X;,‡DLPRINT%>;;Counter6†LLLLLLQ†DLTABL9;;New DL val@P…DLIST(8;;StoreJ2T3^)>;;6 vals alteredhH†LLLLLL;;No, do,it againr:|X;†/X; Routine to clear satellites form PM tableX;š „CSATQ>¤$>;;Zero 64 bytes®ƒRUBP†PMSATS 9¸0ÂIƒRUBÌ:ÖX;à&X; General purpose clearing routineêX;ô$…CLEERP†ZEROPA;;Save high byteþ'†ZEROPA;;Save low byte Q>;;X reg. is # of pages ? …CLEANP@†ZEROPA7;;Clear& 30 H…CLEAN: #†ZEROPAD 0N H…CLEAN;;Do until doneX :b X;l &X; Routine to mirror bits in a bytev X;€ /…MYRNAP…HOLDA;;Entry point for random mirrorŠ  ƒR01” HƒRET;;Don't mirrorž Q…HOLDA¨ 0†MIRRORP…HOLDA;;Entry point for mirror always² &…HOLDX;;Save x¼ $>;;8 bitsÆ ‚MMU?;;Rotate bit in carryÐ W…HOLDA;;Rotate out reverseÚ 0ä I‚MM;;Do all 8î $…HOLDX;;Restore X & Aø ƒRETQ…HOLDA! :;;Done! !X;!X; Routine to turn off sound !X;*!%†SILENTQ>;;No explanation needed4!$>>!ƒHUHP…AUDC19H!0R!IƒHUH\!:f!X;p!!X; Routine to get actual levelz!X;„!†GETLEVQ…LEVELŽ!M>˜!:¢!X;¬!X; Routine to erase beam¶!X;À!(‡BEAMOFF$†VPOSME;;Beam starts at me+2Ê!2Ô!2Þ!%>#;;Erase this muchè!‡OFFLOOPQ>Ïò! M‡MISSLES9ü! P‡MISSLES9"0"1"H‡OFFLOOP;;Do it all$"Q>;;Clear all beam flags." P‡BEAMFLG8" PˆBEAMDLAYB" P‡BEAMPOSL" P†LOADEDV" P…AUDC4`"! ˆSETSHAPE;;Set original shapej":t"X;~"X; Random number routinesˆ"X;’"ƒR01Q†RANDOMœ"M>¦":°"ƒR07Q†RANDOMº"M>Ä":Î"ƒR16Q†RANDOMØ"M>â":ì"X;ö"#X; Landing flag clearing routine#X; # …FLAGSQ># PˆLANDFLAG# P‡ACCOUNT(# P†ANIPTR2# P‡ANIMATE<#:F#X;P#$X; DISPLAY LIST INTERRUPT ROUTINEZ#X; FOR GAME SCREENd#X;n#ƒDLI5;;Save 6502 regs.x#A‚#5Œ#$†LINENO;;Current mode line–# P…WSYNC #"Q‡DCOLTAB`9;;Background colorª#P†COLPF0´#Q„CURR9;;Current HSCROL val¾# P†HSCROLÈ# P…WSYNCÒ#Q‡DCOLTAB9;;Color1Ü#P†COLPF0æ#Q‡DCOLTAB09;;Color2ð#P†COLPF0ú#Q‡DCOLTABH9;;Color3$P†COLPF0$Q‡DCOLTAB9;;Color0$ P†COLPF0"$Q„MPOS9;;Stars on this line?,$F†NOSTAR;;No? skip this6$ P…WSYNC@$#P†HPOSM0;;Horiz. pos. of starJ$'Q„MPOS9;;Find pos. of star next lineT$,^$ O†OFFSET9h$P…WSYNC;;Wait for next liner$&†NOSTARP†HPOSM0;;Save pos for it|$ #†LINENO†$$Q†PRITAB9;;Set priority this line$ P…WSYNCš$ P…PRIOR¤$(>;;Is it line #2?®$H„NADA;;No, skip¸$#Q„M2PF;;Hold collisions for lineÂ$ P„MISSÌ$„NADA(> ;;Line 11 yet?Ö$HƒNAY;;No, skipà$#Q‡SATCOLR;;Change color for satsê$ …MIXUP;;Attract them firstô$P†COLPM0þ$ƒNAY7;;Restore 6502%>%7%9&%X;0%$X; DISPLAY LIST INTERRUPT ROUTINE:%X; FOR TITLE SCREEND%X;N%„DLI15;;SaveX% Q>6;;Redb% …MIXUP;;Attractl%P†COLPF0;;Color0v% 7;;Restore€%9Š%X;”% X; KEYBOARD INTERRUPT ROUTINEž%X;¨%+…INKEYQ†KBCODE;;Key code (A saved by OS)²% P‚CH;;Save¼% 7;;RestoreÆ%9Ð%X;Ú%X; COMMON LABELSä%X;î%‡ACOLTABÈ>ø% „BITSØF&‰CANISTERS·; & …CHARS@&†COLCKS> &†COLTABP>*& „CURRð=4&‡DCOLTAB@?>& …DLIST0=H&†DLIST1ˆ=R&†DLTABLp=\& …LEVELÉz&†OFFSET8>„& …PAINTaGŽ&†PLEVELß<˜& …PMULTù<¢&†PRITAB G¬& …SCOREWG¶&†SCRLST¨=À&‡SHAPE1ADÊ&‡SHAPE1B DÔ& …SHIPSÚ;Þ&†SLEVEL_Gè& …TITLEà;ò& …TOTAL`Gü&†VBLANK&'