þþcRd"X;*****************************n"X;* P O N G *x"X;* by GARY S. DOMROW *‚"X;* (c) 1986 ANALOG Computing *Œ"X;*****************************–X; X;ϮӮ ÒÁÍ Ú­ÐÁÇŪX;´…BOOT? ;;O.S. BOOT FLAG¾†DOSVEC ;;INIT. VECTORȆRTCLOK;;REAL TIME CLOCKÒ†ATRACTM;;ATTRACT FLAGÜX;æ X;ϮӮ ÒÁÍðX;ú†COLDSTD;;COLD START FLAG†SDLSTL0;;DISP LIST PTR†PADDL0p;;PADDLES,†SDMCTL/;;DIRECT MEMORY ACCESS CONTROL"!†GPRIORo;;PRIORITY REGISTER,†PCOLR0À;;PLAYER 0 COLOR6 †PTRIG0|;;PADDLE TRIGGER 0@‚CHü;;CHARACTER PRESSEDJX;TX;ϮӮ ÅÎÔÒÙ ÐÏÉÎÔÓ^X;h)†SETVBV\ä;;SET VERTICAL BLANK VECTORr#†XITVBVbä;;EXIT VERTICAL BLANK|!†WRMVECtä;;WARM START VECTOR†X;X;ϮӮ ÒÅÇÉÓÔÅÒšX;¤#†GRACTLÐ;;PM GRAPHICS CONTROL® †PMBASEÔ;;PM BASE REGISTER¸'†RANDOM Ò;;RANDOM NUMBER GENERATORÂ(†HITCLRÐ;;COLLISION CLEAR REGISTERÌ…AUDF1Ò;;AUDIO FREQ. 1Ö…AUDC1Ò;;AUDIO CONTROL 1à†AUDCTLÒ;;AUDIO CONTROLê…SKCTLÒ;;SERIAL CONTROLô †CONSOLÐ;;CONSOLE SWITCHESþ'†HPOSP0Ð;;HORIZ POSITION PLAYER 0'†HPOSM0Ð;;HORIZ POSITION MISSLE 0'„M0PLÐ;;MISSILE-PLAYER COLLISIONS*„M0PFÐ;;MISSILE-PLAYFIELD COLLISIONA&%†HSCROLÔ;;HORIZ SCROLL REGISTER0†VSCROLÔ;;VERT SCROLL REG:X;DX;ÍÙ Ú­ÐÁÇÅNX;X€bX;l…GPNTR;;GENERAL POINTERvƒVOL;;VOLUME€„NOTE;;NOTEŠ„LOCK;;PADDLE MOVE FLG”†SCORE1;;PLAYER 1 SCOREž†SCORE2;;PLAYER 2 SCORE¨„COLR;;COLOR²„TYPE;;GAME TYPE¼…SRVDR;;SERVE DIRECTIONÆ …TEMP2Ð …TEMPXÚ …TEMPYä†JMPVEC;;JUMP VECTORî…COUNT;;COUNTERøX; X;ÅÑÕÁÔÅÓ X;ƒPMB ;;PM BASE (HI BYTE) "„P1SC;;PLYR 1 SCORE POSITION*"„P2SC;;PLYR 2 SCORE POSITION4%„MISLƒPMB€;;MISSILE MEMORY>"„PLR0„MISL€;;PLAYER 0 MEMORYH„PLR1„PLR0€;;PLAYER 1R„PLR2„PLR1€;;PLAYER 2\†PADCLRÖ;;PADDLE COLORf„MINYþ;;MINIMUM Y CHANGEp„MAXY;;MAXIMUM Y CHANGEzX;„X;ÓÔÁÒÔ ÏÆ ÃÏÄÅ ŽX;˜(¢X;¬†WAIT60Q†RTCLOK¶…MWAITR†RTCLOKÀ F…MWAITÊ:ÔX;Þ …STARTQ>4‡WRMSTRT;;SET UP THEèP†DOSVEC;;RESET VECTORòQ>5‡WRMSTRTüP†DOSVECQ> P†COLDSTQ>$ P…BOOT?. ‡DLBUILD;;BUILD D LIST8X;BX;ENTRY FOR RESETLX;V‡WRMSTRT$>ÿ;;RESET STACK`Bj ˆCLEARALLtQ>~ P†VSCROLˆPƒVOL’ P„NOTEœ P…COUNT¦ P†AUDCTL°Q>4…DLIST;;SET D LISTº P†SDLSTLÄ Q>5…DLISTÎP†SDLSTLØQ>â P…SKCTLì †WAIT60ö „ZPMSQ>  P„LOCKQ>;;INITIALIZE VBI $>5ƒVBI( %>4ƒVBI2 †SETVBV< †PTITLE;;PRINT TITLE SCREENFX;PX;ENTRY POINT FOR NEW GAMEZX;d‰STARTGAME$>n"…COLLPQ†COLORS9;;SET PLAYER ANDxP†PCOLR09;;PLAYFIELD COLORS‚0Œ I…COLLP–X; Q>;;INITIALIZE STUFF:ª P…COUNT´P†SCORE1;; - SCORES¾ P†SCORE2È †PMINIT;; - P/M GRAPHICSÒ ‡MIDLINE;; - MIDDLE LINEÜ …SETUP;; - GAME TYPEæ ˆNEWSCOREðX;úX;ENTRY FOR PLAYING ONE GAMEX; ˆGAMELOOPQ>;;UNLOCK PADDLES P„LOCK" ‡PLAYONE;;PLAY ONE BALL,Q†SCORE1;;AND CHECK6R†TOPSCR;;FOR A WINNER@ F‡TWOLOSTJ Q†SCORE2T R†TOPSCR^ F‡ONELOSTh ˆNEWSCORE;;PRINT NEW SCOREr!ˆGAMELOOP;;AND JUMP|X;†‡ONELOST$>  HˆPRINTWINšX;¤‡TWOLOST$>® ˆPRINTWIN%>;;PRINT 'WINNER'¸ˆWINNERLPQ†WINNER8ÂP‰SCORELINE9Ì2Ö3à)>ê HˆWINNERLPô%ˆWAITTRIGQ†PTRIG0;;WAIT FOR EITHERþM†PTRIG0;;TRIGGER BEFOREHˆWAITTRIG;;RESTARTINGF‰STARTGAMEX;&(X;SUBROUTINES OF ALL SHAPES AND SIZES0X;:X;REPRINT THE SCORE LINEDX;N ˆNEWSCORE ˆCLNSCRLN;;CLEAN UPX Q†NUMPD2b F†PRSCR2l $>„P1SCv%Q†SCORE1;;PRINT PLAYER ONE'S SCORE€ ‡TOPHALFŠP‰SCORELINE9”2ž Q†SCORE1¨ ‡BOTHALF²P‰SCORELINE9¼†PRSCR2Q†NUMPD1ÆF‰NOMORESCRÐ $>„P2SC;;AND NOW PLAYER TWO'SÚ Q†SCORE2ä ‡TOPHALFîP‰SCORELINE9ø2 Q†SCORE2  ‡BOTHALFP‰SCORELINE9 ‰NOMORESCR:*X;4)X;DRAW MIDDLE LINE, ACTUALLY A MISSILE>X;H‡MIDLINEQ>€;;X-POSITIONRP†HPOSM0\$>fQ>p P„COLRz‡MLLPOUT%>;;5 ON, 5 OFF„…MLLP1Q„COLRŽ L„MISL9˜ P„MISL9¢2¬1¶ H…MLLP1À&Q„COLR;;SWITCH ON TO OFF, OFF TO ONÊN>Ô P„COLRÞ(>p;;END OF SCREEN?è D‡MLLPOUTò:üX; X;PLAY ONE BALL X; ‡PLAYONEQ>;;ERASE LAST BALL$ ?. ‡CLRBALLQ„MISL88 M>üB P„MISL8L 3V I‡CLRBALL` # ŠWAITBUTTON;;WAIT FOR A TRIGGERj  …SERVE;;SERVE THE BALLt †POLOOPP†HITCLR~  †WAIT60;;PAUSEˆ  ˆCHECKCOL;;CHECK COLLISIONS’  „MOVE;;MOVE BALLœ  ˆDRAWBALL;;RE-DRAW BALL¦ P†HITCLR;;CLR COLLISIONS° Q>;;RESET ATTRACT MODEº P†ATRACTÄ Q…BALLX;;CHECK IF BALL ISÎ R>&;;OFF THE SCREENØ D‰OFFSCREENâ R>Üì E‰OFFSCREENö  …PAUSE;;CHECK FOR KEYPRESS !†POLOOP;;END LOOP X; (‰OFFSCREENQ…ALTFL;;ALTERNATING HITS?? F‰CHCKSIDES;;NO( Q…ALTFL;;YES, PENALIZE2 R>;;PLAYER WHO SHOULD< F†OUTPL1;;HAVE HIT ITF R>P F†OUTPL2Z &‰CHCKSIDESQ…BALLX;;CHECK WHICH SIDEd G†OUTPL2n "†OUTPL1<;;OUT PLAYER ONE'S SIDEx ,;;SO ADD TO SCORE 2‚ Q†SCORE2Œ O>– P†SCORE2  -ª !…POOUT´ X;¾ "†OUTPL2<;;OUT PLAYER TWO'S SIDEÈ ,;;SO ADD TO SCORE 1Ò Q†SCORE1Ü O>æ P†SCORE1ð -ú (…POOUTQ…SRVDR;;CHANGE SERVE DIRECTION N…SRVFL;;ACCORDING TO SRVFL P…SRVDR :" X;, X;PUT ONE BALL IN PLAY6 X;@ $…SERVE ˆNEWSCORE;;PRINT NEW SCOREJ Q†RANDOM;;GET Y POSITIONT M>?;;BETWEEN 40 & 104^ ,h O>(r P…BALLY| Q>;;RESET NUMBER OF HITS† P„HITS $Q…SRVDR;;SERVE IN RIGHT DIRECTIONš IƒPOS¤ Q†STRSPD® †NEGATE¸ P…CHNGX !ˆFIGCHNGYÌ X;Ö ƒPOSQ†STRSPDà P…CHNGXê "ˆFIGCHNGYQ†RANDOM;;GET Y CHANGEô M>;;BETWEEN 2 & -2þ R> FˆFIGCHNGY P…CHNGY Q†RANDOM;;UP OR DOWN??& G„POSY;;DOWN0 Q…CHNGY:  †NEGATE;;UPD P…CHNGYN !„POSYQ>;;STARTING X POSITIONX P…BALLXb HˆDRAWBALL;;DRAW FIRST BALLl X;v &X;WAIT FOR RECEIVER TO PRESS BUTTON€ X;Š 'ŠWAITBUTTONQ†NUMPD1;;IF NO PADDLE 1,” H‰PADTHERE1;;WAIT FOR 2ž $>¨ H‰WAITPRESS² X;¼ %‰PADTHERE1Q†NUMPD2;;IF NO PADDLE 2Æ H‰PADTHERE2;;WAIT FOR 1Ð >Ú F‰WAITPRESSä X;î %‰PADTHERE2Q…ALTFL;;IF ALTERNATING,ø F‡CHECKDR >;;WAIT FOR NEXT ONE 0 !‰WAITPRESS X;* -‡CHECKDR$…SRVDR;;ELSE, USE SERVE DIRECTION4 2> &‰WAITPRESSQ†PTRIG09;;WAIT FOR PRESSH H‰WAITPRESSR #‰WAITUPTRGQ†PTRIG09;;AND RELEASE\ F‰WAITUPTRGf :p X;z X;MAKE ACCUMULATOR NEGATIVE„ X;Ž †NEGATEN>ÿ˜ ,¢ O>¬ :¶ X;À %X;DRAW THE BALL, ACTUALLY A MISSLEÊ X;Ô ˆDRAWBALL,Þ Q…BALLYè O>ò >ü $†ERBALLQ„MISL9;;ERASE OLD BALLM>ü P„MISL90$ (…BALLY. H†ERBALL8Q„MISL9;;AND DRAW THEBL>;;NEW ONEL P„MISL9V Q„MISL9`L>j P„MISL9t Q…BALLX~ P†HPOSM0ˆ:’X;œX;MAKE ACCUMULATOR POSITIVE¦X;° ‡MAKEPOS5º7Ä G†NEGATEÎ:ØX;âX;MAKE ACCUMULATOR NEGATIVEìX;ö ‡MAKENEG57  I†NEGATE:X;(X;CHECK FOR COLLISIONS2X;<,ˆCHECKCOLQ…COUNT;;UNLESS COUNTER NOT ZEROF F†CONTCCP Q…CHNGXZ ‡MAKEPOSd P…TEMPXn;x Q…COUNT‚ S…TEMPXŒ P…COUNT– I†CONTCC Q>ª P…COUNT´†CONTCCQ„M0PF;;BALL & WALLS¾ P…MISPFÈQ„M0PL;;BALL & PADDLESÒ P…MISPLÜQ…MISPF;;CHECK COLOR 1æM>ð F‡NOHORIZú! ˆHORIZCOL;;DO HORIZ COLLISIONQ>0;;AND PLAY NOTE P„NOTEQ>"PƒVOL,!‡NOHORIZQ…MISPF;;CHECK COLOR 26M>@ F†NOVERTJ" ‡VERTCOL;;DO VERTICAL COLLISONTQ>0;;AND PLAY NOTE^ P„NOTEhQ>rPƒVOL|'†NOVERTQ…MISPF;;CHECK PLAYER ONLY IF† HˆNOPLAYER;;NO WALL COLLISIONQ…COUNT;;ONLY IF COUNT OKš HˆNOPLAYER¤ Q…MISPL® FˆNOPLAYER¸Q…ALTFL;;IF ALTERNATING,ÂF‰CONTPLCOLÌQ…MISPL;;MAKE SURE IT ISÖM>;;THE RIGHT PLAYERà F†PL2COLêQ…ALTFL;;PLAYER 1ôR>þF‰CONTPLCOL†PL2COLQ…MISPL;;PLAYER 2M>  FˆNOPLAYER& Q…ALTFL0R>: HˆNOPLAYERD3‰CONTPLCOL ‰PLAYERCOL;;OK TO DO PLAYER COLLISIONNQ>P;;PLAY A NOTEX P„NOTEbQ>lPƒVOLv Q…ALTFL€ FˆNOPLAYERŠ#Q…ALTFL;;CHANGE ALTERNATION FLAG”N>;;IF IT IS NOT ZEROž P…ALTFL¨ ˆNOPLAYER:²X;¼-X;HANDLE HORIZONTAL WALL & BALL COLLISIONSÆX;ЈHORIZCOLQ…BALLY;;IF AT TOP,ÚR>;;MAKE Y CHANGEäEˆNOTSMALL;;POSITIVEî Q…CHNGYø ‡MAKEPOS P…CHNGY :X; ˆNOTSMALLR>n;;IF AT BOTTOM,*D†NOTBIG;;MAKE Y CHANGE4Q…CHNGY;;NEGATIVE> ‡MAKENEGH P…CHNGYR:\X;f"†NOTBIGQ…CHNGY;;OTHERWISE, JUSTp †NEGATE;;NEGATE ITz P…CHNGY„:ŽX;˜%‡VERTCOLQ…BALLX;;IF OFF LEFT SIDE,¢R>5;;MAKE X CHANGE¬E‰NOTSMALLV;;POSITIVE¶ Q…CHNGXÀ ‡MAKEPOSÊ P…CHNGXÔ:ÞX;è%‰NOTSMALLVR>È;;IF OFF RIGHT SIDE,òD‡NOTBIGV;;MAKE X CHANGEüQ…CHNGX;;NEGATIVE ‡MAKENEG P…CHNGX:$X;.#‡NOTBIGVQ…CHNGX;;OTHERWISE, JUST8 †NEGATE;;NEGATE ITB P…CHNGXL:VX;`X;DO PLAYER-BALL COLLISIONSjX;t(‰PLAYERCOLQ…ALTFL;;IF NOT ALTERNATING~HˆNEGATEIT;;SKIPˆQ…MISPL;;OTHERWISE, NEGATE’M>;;ONLY IF IT HITœFƒPL2;;THE RIGHT PLAYER,¦Q…CHNGX;;GOING THE RIGHT°GˆNEGATEIT;;DIRECTIONº IˆNONEGATEÄX;΃PL2Q…CHNGXØ GˆNONEGATEâ$ˆNEGATEITQ…CHNGX;;NEGATE X CHANGEì †NEGATE;;IF WE GOT HEREö P…CHNGX*ˆNONEGATE ˆADJUSTCY;;FIND PADDLE CHANGE Q>;;AND SET COUNTER P…COUNT H‡INCHITS(X;2/X;ADJUST Y CHANGE IF BALL HIT EDGE OF PADDLE<X;F&ˆADJUSTCYQ…MISPL;;FIND WHICH PADDLEPM>;;TO COMPAREZ F†NOTPL1dQƒYP1n !‡ACYCONTxX;‚†NOTPL1QƒYP2Œ‡ACYCONT;;;SUBTRACT BALL Y–S…BALLY;;POSITION  †NEGATE;;AND ADJUSTª?´3¾,;;LOOK AT TABLEÈQ…CHNGY;;TO FIND ADJUSTMENTÒO‡CHNGTAB8;;TO Y CHANGEÜ P…CHNGYæ GˆCHNGYNEGð&R>„MAXY;;NOW, MAKE SURE Y CHANGEúD†OUTACY;;IS WITHIN BOUNDSQ>„MAXY;;TOO BIG??? P…CHNGY:"X;,!ˆCHNGYNEGR>„MINY;;TOO SMALL???6 E†OUTACY@ Q>„MINYJ P…CHNGYT †OUTACY:^X;h!X;ADD CHANGES TO BALL POSITIONrX;| „MOVE,† Q…BALLX O…CHNGXš P…BALLX¤,® Q…BALLY¸ O…CHNGY P…BALLYÌ:ÖX;à0X;ADD TO HIT COUNTER AND SEE IF ABOVE MAXIMUMêX;ô‡INCHITS#„HITSþQ„HITS;;NUMBER OF HITSR†MAXHIT;;ABOVE MAXIMUMH…OUTIH;;NOQ>;;RESET COUNTER& P„HITS0Q…CHNGX;;IS X SPEED AT: ‡MAKEPOS;;MAXIMUM???DR>NF…OUTIH;;YESXQ…CHNGX;;INC IF POSITIVEb G…XCNEGl #…CHNGXv …OUTIH:€X;Š!…XCNEG"…CHNGX;;DEC IF NEGATIVE”:žX;¨"X;PAUSE IF KEY HAS BEEN PRESSED²X;¼…PAUSEQ‚CH;;PRESSED??ÆR>ÿÐF‡NOPAUSE;;NO, GET OUTÚQ>;;YES. LOCK PADDLESä P„LOCKîQ>ÿ;;RESET CH, ANDøP‚CH;;WAIT FOR ANOTHER!‡KEYWAITQ‚CH;;WAIT FOR ANOTHER R>ÿ;;KEY TO BE PRESSED F‡KEYWAIT Q>;;UNLOCK PADDLES* P„LOCK4Q>ÿ;;AND RESET AGAIN>P‚CHH ‡NOPAUSE:RX;\'X;DRAW WALL FOR PRACTICE & WALL BALLfX;p„WALLQ>4‡SCRNMEMzP…GPNTR;;POINT TO SCREEN„Q>5‡SCRNMEM;;MEMORYŽ P…GPNTR˜%>¢$>+¬!ƒWLPQ>ª;;COLOR 2 FOR VERTICAL¶ P@…GPNTR7À,;;ADD TO POINTERÊ Q…GPNTRÔO>Þ P…GPNTRè D„WLP2ò #…GPNTRü„WLP20;;DO IT 43 TIMESHƒWLP:X;$X;CLEAR ALL SCREEN MEMORY.X;8ˆCLEARALLQ>4‰SCORELINEBP…GPNTR;;SET POINTERLQ>5‰SCORELINEV P…GPNTR`$>;;AND DO 6 PAGESjQ>t?~…CLRLPP@…GPNTR7ˆ3’ H…CLRLPœ #…GPNTR¦0° H…CLRLPº:ÄX;ÎX;Ø#X;VERTICAL BLANK ROUTINE TO MOVEâX;PADDLES AND DO SOUNDSìX;öƒVBIQ>;;IS START PRESSED?? P†CONSOL  Q†CONSOLR>H‡CHKLOCK;;NO.(!!†WRMVEC;;YES. DO A WARM START2X;<'‡CHKLOCKQ„LOCK;;ARE PADDLES LOCKED??FF‡VBICONT;;NO.P!†XITVBV;;YES, GET OUTZX;d‡VBICONTQ†PADDL0;;Gn%>x ˆSCALEPAD;;SCALE IT PROPERLY‚P…TEMPY;;AND SAVEŒ+Q†NUMPD1;;NUMBER OF PADDLES FOR PLAYER 1– P†NPDTMP …PD1DR"†NPDTMPªQ†NPDTMP;;MORE PADDLES??´G…NOPD1;;NO¾ %ƒYP1;;YESÈ †ERAPAD;;ERASE PADDLE 1Ò%†NPDTMP;;FIND X POSITIONÜ $ƒXP18æ%…TEMPY;;Y POSITIONð Q†NPDTMPú ‡DRAWPAD;;AND DRAW IT!…PD1DR;;DO MOREX; …NOPD1Q…TEMPY;;PUT Y IN PLACE"PƒYP1,Q†PADDL0;;AND DO PLAYER 26%>@ ˆSCALEPAD;;SCALE ITJ P…TEMPYTQ†NUMPD2;;SAME LOGIC^P†NPDTMP;;AS BEFOREh…PD2DR"†NPDTMPr Q†NPDTMP| G…NOPD2†,;;EXCEPT, WE MUSTO>;;LET IT KNOW WHO'Sš%ƒYP2;;PADDLE TO ERASE¤ †ERAPAD® %†NPDTMP¸ $ƒXP28 %…TEMPYÌ,Ö Q†NPDTMPàO>;;AND TO DRAWê ‡DRAWPADô !…PD2DRþX;…NOPD2Q…TEMPYPƒYP2QƒVOL;;AND SOUNDS??&FˆNOVOLDEC;;NO0"ƒVOL;;YES, DEC IT:ˆNOVOLDECQƒVOL;;GET VOLUMEDL> ;;WITH NO DISTORTIONNP…AUDC1;;AND STOREXQ„NOTE;;GET NOTEbP…AUDF1;;AND STORElQ…ALTFL;;IF ALTERNATING,vF†OUTVBI;;MAKE ONE€Q…ALTFL;;PLAYER BRIGHTERŠM>;;THAN THE OTHER”>žQ>†PADCLR¨ P†PCOLR09²P†PCOLR09¼Q…ALTFL;;LOOKS TRICKIERÆN>;;THAN IT IS HEREÐM>;;I'M JUSTÚ>;;FINDING PLAYER TOäQ>†PADCLR;;MAKE DARKERî P†PCOLR09øP†PCOLR09†OUTVBI!†XITVBV;;END OF VBI X;X;BUILD A DISPLAY LIST X;*$‡DLBUILDQ> ;;GRAPHICS 5 IN BASIC4$>*;;42 MODE LINES>„DLLPP†DLMAIN9H0R I„DLLP\Q>A;;JVB INSTfP†DLMAIN+p Q>4…DLISTzP†DLMAIN,„ Q>5…DLISTŽP†DLMAIN-˜:¢X;¬!X;SCALE PADDLE INPUT TO PM LOC¶X;ÀˆSCALEPADV?;;DIVIDE BY TWOÊ;;;AND TAKE AWAY 7ÔS>;;TO CENTER.ÞG‚LOèR>;;NOW CHECK LOWERò E‡CHECKHIü ‚LOQ>HƒAOKX;‡CHECKHIR>f;;TOO BIG?$ DƒAOK;;NO..Q>e;;YES. USE 1018ƒAOK:BX;LX;ERASE A PADDLEVX;` †ERAPAD5j'…TEMP2;;SAVE YtQ>4„PLR0;;GET LOW MEMORY~P…GPNTR;;FOR PLAYERSˆ Q>5„PLR0’ P…GPNTRœ7;;GET PLAYER NUMBER¦ †PLPNTR;;AND ADD TO POINTER°%…TEMP2;GET Y BACKº$> ÄQ>Î"…ERALPP@…GPNTR7;;AND STICK SOMEØ3;;ZEROES INâ0;;SOMEWHEREì I…ERALPö:X; .X;ADJUST POINTER ACCORDING TO PLAYER NUMBERX; †PLPNTR?(…ADDLP1;;GET OUT WHEN WE2G†OUTPLP;;GET TO ZERO<,;;ADD 128 FOR EACHFQ…GPNTR;;PLAYERPO>€Z P…GPNTRd D…ADDLPn #…GPNTRx !…ADDLP‚ †OUTPLP:ŒX;–X;DRAW PADDLE X;ª!‡DRAWPAD'…TEMP2;;DO SAME STUFF´5;;AS IN ERASE,¾?ÈAÒ P†HPOSP08Ü Q>4„PLR0æ P…GPNTRð Q>5„PLR0ú P…GPNTR7 †PLPNTR$> "Q>,%…TEMP2;;(INSTEAD OF 0)6„DRLPP@…GPNTR7@3J0T I„DRLP^:hX;rX;DRAW TOP AND BOTTOM|X;†‡SETSCRNQ>U;;USE COLOR 1$>;;20 BYTES (0-19)š#†SETLP1P‡SCRNMEM9;;PUT ON SCREEN¤P‡SCRNMEM\9®0¸ I†SETLP1Â:ÌX;Ö'X;INITIALIZE PLAYER-MISSILE GRAPHICSàX;ê†PMINITQ>ƒPMB;;TELL IT WHATôP†PMBASE;;MEMORY TO USEþQ>.;;AND DOUBLE-LINE P†SDMCTL;;RESOLUTION „ZPMS Q>;;PLAYERS AND MISSILES& P†GRACTL0 Q>;;SET PRIORITY: P†GPRIORD :N X;X ,X;ZERO PLAYERS, MISSILES, AND X LOCATIONSb X;l „ZPMS$> ;;SET X LOCATIONSv Q>;;AND WIDTHS TO€ …ZPMLPP†HPOSP09;;ZERO.Š 0” I…ZPMLPž Q>ƒPMB¨ P…GPNTR² Q>;;POINT TO PM¼ P…GPNTR;;MEMORYÆ $>;;AND FOUR PAGESÐ ?Ú ‡ZPMEMLPP@…GPNTR7;;AND ZEROä 3;;IT OUTî H‡ZPMEMLPø #…GPNTR!0 ! H‡ZPMEMLP!: !X;*!)X;DRAW PLAYING FIELD ACCORDING TO TYPE4!X;>!*†TYPEOK ˆCLEARALL;;CLEAR WHAT WAS THEREH! †WAIT60R! ˆCLNSCRLN;;AND SCORELINE\!Q>f! P†VSCROLp!Q„TYPE;;GET TYPEz!T?„!T?Ž!T?˜! T?;;*16¢!>;;AS OFFSET TO TABLE¬!%>¶!&ˆPRTYPELPQ†STNDRD9;;PRINT GAME TYPEÀ!P‰SCORELINE8Ê!2Ô!3Þ!)>è! HˆPRTYPELPò! „ZPMS;;ZERO P/M AREAü! ‡SETSCRN;;DO TOP & BOTTOM" ‡MIDLINE;;AND MIDDLE LINE" Q„TYPE"R>$" F…TYPE4."Q>4‡SCRNMEM8" PˆMAINWORDB"Q>5‡SCRNMEML"PˆMAINWORDV"…TYPE4Q„TYPE;;TYPE * 2 FOR`"T?;;JUMP TABLEj">t"Q†JMPTAB9;;GET JUMP TABLE~"P†JMPVEC;;ENTRIESˆ"2’" Q†JMPTAB9œ"P†JMPVEC¦"!@†JMPVEC:;;AND OFF WE GO°"X;º"X;PRINT TITLE SCREENÄ"X;Î"†PTITLEQ…DLISTØ"L>;;SET HSCROL BITâ" P…DLISTì" ‡SETSCRN;;SET TOP AND BOTTOMö"Q>4…TITLE;;POINT TO TITLE# P‡GR2WORD # Q>5…TITLE#P‡GR2WORD#$>n;;FOR 110 CHARACTERS(#Q>2#P†HSCROL;;INITIALIZE SCROLL<#P…COUNT;;AND COUNTERF#)…TBGLP †WAIT60;;SIT AROUND FOR A WHILEP#Q†PTRIG0;;CHECK FOR TRIGGERZ#M†PTRIG0;;PRESSED EITHERd#F‰OUTPTITLE;;PADDLEn#"…COUNT;;COUNTDOWNx#Q…COUNT;;WHEN BELOW ZERO,‚# I‡OKCOUNTŒ#Q>;;SET BACK TO 7–# P…COUNT ##‡GR2WORD;;AND INCREMENTª#H‡OKCOUNT;;LMS IN D LIST´##‡GR2WORD¾#‡OKCOUNTQ…COUNT;;SET SCROLLÈ#P†HSCROL;;REGISTERÒ#H…TBGLP;;IF ZERO,Ü#0;;DEC CHARACTER COUNTæ# H…TBGLPð#F†PTITLE;;AND REPEATú#X;$‰OUTPTITLEQ>;;RESET SCROLL$P†HSCROL;;RESET POINTER$Q>4‰SCORELINE"$ P‡GR2WORD,$Q>5‰SCORELINE6$P‡GR2WORD@$ Q…DLISTJ$M>ï;;RESET HSCROL BITT$ P…DLIST^$:;;AND LEAVEh$X;r$$X;CLEAN SCORE LINE OF ALL GARBAGE|$X;†$ˆCLNSCRLNQ>$$>';;20 BYTES WIDE *2š$†CLNSCRP‰SCORELINE9¤$0®$ I†CLNSCR¸$:Â$X;Ì$!X;NEXT ROUTINES SET UP INITIALÖ$X;CONDITIONS FOR GAME PLAYà$X;ê$X;STANDARD GAMEô$X;þ$ ŠSTANDARDSUQ>;;EACH GET ONE%P†NUMPD1;;PADDLE TO MOVE% P†NUMPD2%Q>.;;PUT THEM ON&%PƒXP1;;OPPOSITE SIDES0%Q>È;;OF THE SCREEN:%PƒXP2D%Q>;;NO ALTERNATIONN% P…ALTFLX%Q>;;START AT SPEED 1b% P†STRSPDl%&Q>;;8 HITS BEFORE SPEED INCREASESv% P†MAXHIT€%Q>ÿ;;ALTERNATE SERVESŠ% P…SRVFL”%:ž%X;¨%X;PRACTICE SET UP²%X;¼%#ŠPRACTICESUQ>;;ONLY ONE PADDLEÆ% P†NUMPD1Ð%Q>Ú% P†NUMPD2ä%Q>Z;;NEAR MIDDLEî%PƒXP1ø%Q>;;START AT ONE& P†STRSPD &Q>;;8 HITS& P†MAXHIT &Q>;;NO ALTERNATION*& P…ALTFL4& „WALL;;DRAW A WALL>&Q>;;NO SERVE ALTERNATIONH& P…SRVFLR&:\&X;f&X;HOCKEY PONG SET UPp&X;z&"ˆHOCKEYSUQ>;;TWO PADDLES EACH„& P†NUMPD1Ž& P†NUMPD2˜&Q>,;;ON END¢&PƒXP1¬&Q>œ;;AND NEAR MIDDLE¶& PƒXP1À&Q>Æ;;ON ENDÊ&PƒXP2Ô&Q>X;;AND NEAR MIDDLEÞ& PƒXP2è&Q>;;START AT ONEò& P†STRSPDü&Q>;;8 HITS' P†MAXHIT'Q>;;NO ALTERNATION' P…ALTFL$' ‰HOCKSIDES;;DRAW SIDES.'Q>ÿ;;ALTERNATE SERVES8' P…SRVFLB':L'X;V'X;WALL PONG SET UP`'X;j'#ŠWALLBALLSUQ>;;ONE PADDLE EACHt' P†NUMPD1~' P†NUMPD2ˆ'P†STRSPD;;START AT ONE’'Q>;;8 HITSœ' P†MAXHIT¦'Q>Z;;BOTH PADDLES°'PƒXP1;;NEAR MIDDLEº'Q>^Ä'PƒXP2Î'Q>;;ALTERNATE HITSØ' P…ALTFLâ' „WALL;;DRAW WALLì'Q>;;NO ALTERNATING SERVEö' P…SRVFL(: (X;("X;DRAW PARTIAL SIDES FOR HOCKEY(X;((‰HOCKSIDESQ>4‡SCRNMEM2(P…GPNTR;;POINT TO SCREEN<(Q>5‡SCRNMEMF( P…GPNTRP($> ;;NINE MODE LINESZ( …TOPLP%>d(Q>€;;IN COLOR 1n( P@…GPNTR7x(%>;;ON BOTH ENDS‚(Q>;;OF SCREENŒ( P@…GPNTR7–(, (Q…GPNTR;;ADD SIZE OFª(O>;;ONE LINE´( P…GPNTR¾( D†TOPLP1È( #…GPNTRÒ( †TOPLP10Ü(I…TOPLP;;DONE WITH TOP HALFæ(,ð( Q…GPNTRú(O>¸;;SKIP A BUNCH OF)P…GPNTR;;MODE LINES) Q…GPNTR)O>") P…GPNTR,)$> 6)…BOTLP%>;;AND DO SIDES@)Q>€;;ON BOTTOM HALFJ) P@…GPNTR7T)%>^)Q>h) P@…GPNTR7r),|) Q…GPNTR†)O>) P…GPNTRš) D†BOTLP1¤) #…GPNTR®) †BOTLP10¸) I…BOTLPÂ):Ì)X;Ö)X;GET TOP HALF OF BCD NUMBERà)X;ê)‡TOPHALFV?;;DIVIDE BY 16ô)V?þ)V?*V?*"F‡TOPZERO;;IF ZERO, LEAVE BLANK* L>Ð;;IF NOT, MAKE IT NUMERIC&* ‡TOPZERO:0*X;:*"X;GET BOTTOM HALF OF BCD NUMBERD*X;N*‡BOTHALFM>X*L>Ðb*:l*X;v*X;LET PLAYER CHOSE GAME€*X;Š*!…SETUPQ†PTRIG0;;IF EITHER TRIG”* M†PTRIG0;;IS PRESSED, WAITž* F…SETUP¨*Q>;;INITIALIZE²* P„TYPE¼* P…SRVDRÆ* †TYPEOKÐ*Q>;;SET ENDING SCOREÚ* P†TOPSCRä*‰STARTOVERQ>;;WAIT FOR THEî*P†JIFCNT;;PADDLE TO GOø*P„LOCK;;IN 1 DIRECTION+ †WAIT60 +Q>;;FOR A WHILE+ P„LOCK +‰CHECKMOREQ†PADDL0*+ P‡LASTPAD4+,>+Q†RTCLOK;;CHECK PADDLEH+O>;;EVERY THIRDR+P…COUNT;;JIFFY\+†WAIT03 †WAIT60f+Q†PTRIG0;;BUT CONSTANTLYp+M†PTRIG0;;CHECK PADDLEz+FŠTYPECHOSEN;;BUTTONS„+ Q…COUNTŽ+ R†RTCLOK˜+ H†WAIT03¢+ Q†PADDL0¬+ R‡LASTPAD¶+F‰CHECKMOREÀ+ E…CNTDNÊ+"Q†JIFCNT;;IF DIRECTION CHANGED,Ô+G‰STARTOVER;;TRY AGAINÞ+#†JIFCNT;;ADD TO COUNTERè+ Q†JIFCNTò+R>;;IS IT 3?ü+H‰CHECKMORE;;NO. WAIT,F‡INCTYPE;;CHANGE GAME TYPE,X;, …CNTDN"†JIFCNT;;DECR. COUNTER$, Q†JIFCNT.,I‰STARTOVER8,R>ý;;IS IT -3?B,H‰CHECKMORE;;NO. WAIT.L,"„TYPE;;CHANGE GAME TYPEV, Q„TYPE`,IŠTYPECONT01j,Q>t, P„TYPE~,&ŠTYPECONT01 ˆLASTTYPE;;SET UP TYPESˆ, ˆSCROLLDN;;SCROLL DOWN’,!ˆTYPECONT;;GO BACK FOR MOREœ,X;¦,!‡INCTYPE#„TYPE;;INCR GAME TYPE°, Q„TYPEº,R>Ä,HŠTYPECONT02Î,Q>Ø, P„TYPEâ,&ŠTYPECONT02 ˆNEXTTYPE;;SET UP TYPESì, ˆSCROLLUP;;AND SCROLL UPö,ˆTYPECONT$>;;RESET PADDLE-Q>†PADCLR;;COLORS -ˆPDCOLRLPP†PCOLR09-0- IˆPDCOLRLP(- †TYPEOK;;SET UP GAME SCREEN2-!‰STARTOVER;;AND GO BACKE<-X;F- ŠTYPECHOSENQ†PTRIG0;;WAIT FORP-M†PTRIG0;;TRIG RELEASEZ-FŠTYPECHOSENd-Q>n- P…COUNTx-:‚-X;Œ-!ˆNEXTTYPEQ„TYPE;;PUT NEXT TYPE–-T?;;TITLE IN -T?;;SECOND LINE OFª- T?;;MEMORY´-T?¾->È-%>Ò-‰PRTYPELP2Q†STNDRD9Ü-P‰SCORELINE8æ-2ð-3ú-)>.H‰PRTYPELP2.:.X;".X;SCROLL TWO MEMORY LINES UP,.X;6.ˆSCROLLUPQ>@. P…COUNTJ.ˆSCRLUPLPQ…COUNTT. P†VSCROL^. †WAIT60h. #…COUNTr. Q…COUNT|.R>;;16 TIMES†. HˆSCRLUPLP.:š.X;¤.!X;SCROLL TWO MEMORY LINES DOWN®.X;¸.ˆSCROLLDNQ>Â. P…COUNTÌ.ˆSCRLDNLPQ…COUNTÖ. P†VSCROLà. †WAIT60ê. "…COUNTô. Q…COUNTþ. IˆSCRLDNLP/:/X;/ X;MOVE CURRENT TYPE TO SECOND&/ X;LINE, AND NEW TYPE TO FIRST0/X;:/ˆLASTTYPEQ„TYPED/T?N/T?X/T?b/T?l/>v/%>€/&ŠLASTTYPELPQ‰SCORELINE8;;1ST TO 2NDŠ/P‰SCORELINE8”/Q†STNDRD9;;NEW TO 1STž/P‰SCORELINE8¨/2²/3¼/)>Æ/HŠLASTTYPELPÐ/:Ú/X;ä/ X;ÓÔÏÒÁÇÅî/X;ø/!ƒXP1 =;;PADDLE X POSITIONS0 ƒXP2 = 0ƒYP1 ;;PADDLE Y POSITIONS0 ƒYP2  0…BALLX ;;BALL X POS*0…BALLY ;;BALL Y POS40…CHNGX ;;BALL X CHANGE>0…CHNGY ;;BALL Y CHANGEH0†TOPSCR ;;ENDING SCORER0„HITS ;;NUMBER OF HITS\0,†MAXHIT ;;# OF HITS BEFORE SPEED CHANGEf0†STRSPD ;;STARTING SPEEDp04‡CHNGTAB ===========z0 †NUMPD1 ;;NUMBER OF PADDLES„0†NUMPD2 ;;ON EACH SIDEŽ0 †NPDTMP ;;TEMP # OF PADDLES˜0…MISPL ;;COLLISION REG¢0…MISPF ;;HOLDERS¬0g…TITLE AÚ P O N G ÂÙ ÇÁÒÙ ÄÏÍÒÏ× ÏÆ ÔÈÅ ÓÕÍÍÉÔ ÓÏÆÔ×ÁÒÅ ÇÒÏÕÐA¶01 Aª for analog computing AÀ0†WINNER A†WINNERAÊ0%†COLORS Ô=Ô=Ô=Ô=”=”=”= =Ô08†JMPTAB ŠSTANDARDSU=ˆHOCKEYSU=ŠWALLBALLSU=ŠPRACTICESUÞ0…SRVFL ;;SERVE FLAGè0…ALTFL ;;ALTERNATE HITSò0‡LASTPAD ;;PADDLE VALUEü0†JIFCNT ;;JIFFY COUNTER1†STNDRD A STANDARD PONGA1 A HOCKEY PONG A1 A WALL PONG A$1 A PRACTICE A.1X;81X;ÄÉÓÐÌÁÙ ÌÉÓÔ ¦ ÓÔÏÒÁÇÅB1X;L1…DLIST p=p=p=gV1‡GR2WORD ‰SCORELINE`1 =Jj1ˆMAINWORD ‡SCRNMEMt1 †DLMAIN.~1‰SCORELINE(ˆ1‡SCRNMEMp’1X;œ1à¦1 …START°1