–€ €@LƒÌ}ˬð5 _­¬¦$Ž¦%Ž l0¬±$)ªÈ$ð±$Hȱ$ Uh¨ŠL"©À ¨`©€e$…$æ%`­…$­…%` Œ ©R @©W €¦!àÐ( L¹(©Œ©1© ©€ ­ YäÎ ð¦I˜` ­ d  LÇd M ¼* €@ ÿ­ …$­ …%­ …C¢©C ‘$¥$)¥%1© U©dÊߥ$9¥%:¬ ¢ˆ˜!0 SèàÐñ¥$ç¥%詨™Èú¨¹ð ÉDðÈÈÈÀÐð©D™©Ë™©™` ­ }½J‚)ðLr 콂ÉþþcRd"X;*****************************n"X;* P O N G *x"X;* by GARY S. DOMROW *‚"X;* (c) 1986 ANA}LOG Computing *Œ"X;*****************************–X; X;ϮӮ ÒÁÍ Ú­ÐÁÇŪX;´…BOOT? ;;O.S. BOOT FLAG¾†DOSVEC ;;INI}T. VECTORȆRTCLOK;;REAL TIME CLOCKÒ†ATRACTM;;ATTRACT FLAGÜX;æ X;ϮӮ ÒÁÍðX;ú†COLDSTD;;COLD START FLAG†S}DLSTL0;;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ê…SKCT }LÒ;;SERIAL CONTROLô †CONSOLÐ;;CONSOLE SWITCHESþ'†HPOSP0Ð;;HORIZ POSITION PLAYER 0'†HPOSM0Ð;;HORIZ POSITION MI }SSLE 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†R}TCLOK¶…MWAITR†RTCLOKÀ F…MWAITÊ:ÔX;Þ …STARTQ>4‡WRMSTRT;;SET UP THEèP†DOSVEC;;RESET VECTORòQ>5‡WRMSTRTüP†DOSVEC}Q> 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†SDLST}LØQ>â P…SKCTLì †WAIT60ö „ZPMSQ>  P„LOCKQ>;;INITIALIZE VBI $>5ƒVBI( %>4ƒVBI2 †SETVBV< †PTITLE;;P}RINT TITLE SCREENFX;PX;ENTRY POINT FOR NEW GAMEZX;d‰STARTGAME$>n"…COLLPQ†COLORS9;;SET PLAYER ANDxP†PCOLR09;;PLAY}FIELD COLORS‚0Œ I…COLLP–X; Q>;;INITIALIZE STUFF:ª P…COUNT´P†SCORE1;; - SCORES¾ P†SCORE2È †PMINIT;; - P/M GRAPH}ICSÒ ‡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 F}OR EITHERþM†PTRIG0;;TRIGGER BEFOREHˆWAITTRIG;;RESTARTINGF‰STARTGAMEX;&(X;SUBROUTINES OF ALL SHAPES AND SIZES0}X;: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;;A!}ND NOW PLAYER TWO'SÚ Q†SCORE2ä ‡TOPHALFîP‰SCORELINE9ø2 Q†SCORE2  ‡BOTHALFP‰SCORELINE9 ‰NOMORESCR:*X;4)X;DR"}AW 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„MISL%}8L 3V I‡CLRBALL` # ŠWAITBUTTON;;WAIT FOR A TRIGGERj  …SERVE;;SERVE THE BALLt †POLOOPP†HITCLR~  †WAIT60;;PAUSEˆ  ˆCHECKC&}OL;;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 WH)}O SHOULD< F†OUTPL1;;HAVE HIT ITF R>P F†OUTPL2Z &‰CHCKSIDESQ…BALLX;;CHECK WHICH SIDEd G†OUTPL2n "†OUTPL1<;;OUT PLAYER ON*}E'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 & 10-}4^ ,h O>(r P…BALLY| Q>;;RESET NUMBER OF HITS† P„HITS $Q…SRVDR;;SERVE IN RIGHT DIRECTIONš IƒPOS¤ Q†STRSPD® †NEGAT.}E¸ P…CHNGX !ˆFIGCHNGYÌ X;Ö ƒPOSQ†STRSPDà P…CHNGXê "ˆFIGCHNGYQ†RANDOM;;GET Y CHANGEô M>;;BETWEEN 2 & -2þ R> FˆFI/}GCHNGY P…CHNGY Q†RANDOM;;UP OR DOWN??& G„POSY;;DOWN0 Q…CHNGY:  †NEGATE;;UPD P…CHNGYN !„POSYQ>;;STARTING X POSITIONX0} P…BALLXb HˆDRAWBALL;;DRAW FIRST BALLl X;v &X;WAIT FOR RECEIVER TO PRESS BUTTON€ X;Š 'ŠWAITBUTTONQ†NUMPD1;;IF NO PADDLE 11},” H‰PADTHERE1;;WAIT FOR 2ž $>¨ H‰WAITPRESS² X;¼ %‰PADTHERE1Q†NUMPD2;;IF NO PADDLE 2Æ H‰PADTHERE2;;WAIT FOR 1Ð >Ú F‰2}WAITPRESSä X;î %‰PADTHERE2Q…ALTFL;;IF ALTERNATING,ø F‡CHECKDR >;;WAIT FOR NEXT ONE 0 !‰WAITPRESS X;* -‡CHECKDR$…SRV3}DR;;ELSE, USE SERVE DIRECTION4 2> &‰WAITPRESSQ†PTRIG09;;WAIT FOR PRESSH H‰WAITPRESSR #‰WAITUPTRGQ†PTRIG09;;AND RELEASE\ F‰4}WAITUPTRGf :p X;z X;MAKE ACCUMULATOR NEGATIVE„ X;Ž †NEGATEN>ÿ˜ ,¢ O>¬ :¶ X;À %X;DRAW THE BALL, ACTUALLY A MISSLEÊ5} X;Ô ˆDRAWBALL,Þ Q…BALLYè O>ò >ü $†ERBALLQ„MISL9;;ERASE OLD BALLM>ü P„MISL90$ (…BALLY. H†ERBALL8Q„M6}ISL9;;AND DRAW THEBL>;;NEW ONEL P„MISL9V Q„MISL9`L>j P„MISL9t Q…BALLX~ P†HPOSM0ˆ:’X;œX;MAKE ACCUMULA7}TOR POSITIVE¦X;° ‡MAKEPOS5º7Ä G†NEGATEÎ:ØX;âX;MAKE ACCUMULATOR NEGATIVEìX;ö ‡MAKENEG57  I†NEGATE:X;(8}X;CHECK FOR COLLISIONS2X;<,ˆCHECKCOLQ…COUNT;;UNLESS COUNTER NOT ZEROF F†CONTCCP Q…CHNGXZ ‡MAKEPOSd P…TEMPXn;x Q…9}COUNT‚ S…TEMPXŒ P…COUNT– I†CONTCC Q>ª P…COUNT´†CONTCCQ„M0PF;;BALL & WALLS¾ P…MISPFÈQ„M0PL;;BALL & PADDLESÒ P…MI:}SPLÜQ…MISPF;;CHECK COLOR 1æM>ð F‡NOHORIZú! ˆHORIZCOL;;DO HORIZ COLLISIONQ>0;;AND PLAY NOTE P„NOTEQ>"PƒVO;}L,!‡NOHORIZQ…MISPF;;CHECK COLOR 26M>@ F†NOVERTJ" ‡VERTCOL;;DO VERTICAL COLLISONTQ>0;;AND PLAY NOTE^ P„NOTEhQ>r<}PƒVOL|'†NOVERTQ…MISPF;;CHECK PLAYER ONLY IF† HˆNOPLAYER;;NO WALL COLLISIONQ…COUNT;;ONLY IF COUNT OKš HˆNOPLAYER¤ Q…M=}ISPL® 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‰CONTPLC?}OL ‰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;ЈA}HORIZCOLQ…BALLY;;IF AT TOP,ÚR>;;MAKE Y CHANGEäEˆNOTSMALL;;POSITIVEî Q…CHNGYø ‡MAKEPOS P…CHNGY :X; ˆNOTSMALLB}R>n;;IF AT BOTTOM,*D†NOTBIG;;MAKE Y CHANGE4Q…CHNGY;;NEGATIVE> ‡MAKENEGH P…CHNGYR:\X;f"†NOTBIGQ…CHNGY;;OTHERWISE,C} JUSTp †NEGATE;;NEGATE ITz P…CHNGY„:ŽX;˜%‡VERTCOLQ…BALLX;;IF OFF LEFT SIDE,¢R>5;;MAKE X CHANGE¬E‰NOTSMALLV;;POSID}TIVE¶ Q…CHNGXÀ ‡MAKEPOSÊ P…CHNGXÔ:ÞX;è%‰NOTSMALLVR>È;;IF OFF RIGHT SIDE,òD‡NOTBIGV;;MAKE X CHANGEüQ…CHNGX;;NEGAE}TIVE ‡MAKENEG P…CHNGX:$X;.#‡NOTBIGVQ…CHNGX;;OTHERWISE, JUST8 †NEGATE;;NEGATE ITB P…CHNGXL:VX;`X;DO PLAYERF}-BALL COLLISIONSjX;t(‰PLAYERCOLQ…ALTFL;;IF NOT ALTERNATING~HˆNEGATEIT;;SKIPˆQ…MISPL;;OTHERWISE, NEGATE’M>;;ONLY IFG} IT HITœFƒPL2;;THE RIGHT PLAYER,¦Q…CHNGX;;GOING THE RIGHT°GˆNEGATEIT;;DIRECTIONº IˆNONEGATEÄX;΃PL2Q…CHNGXØ GˆNONH}EGATEâ$ˆNEGATEITQ…CHNGX;;NEGATE X CHANGEì †NEGATE;;IF WE GOT HEREö P…CHNGX*ˆNONEGATE ˆADJUSTCY;;FIND PADDLE CHANGE Q>I};;AND SET COUNTER P…COUNT H‡INCHITS(X;2/X;ADJUST Y CHANGE IF BALL HIT EDGE OF PADDLE<X;F&ˆADJUSTCYQ…MISPL;;FIND WJ}HICH PADDLEPM>;;TO COMPAREZ F†NOTPL1dQƒYP1n !‡ACYCONTxX;‚†NOTPL1QƒYP2Œ‡ACYCONT;;;SUBTRACT BALL Y–S…BALLY;;POSK}ITION  †NEGATE;;AND ADJUSTª?´3¾,;;LOOK AT TABLEÈQ…CHNGY;;TO FIND ADJUSTMENTÒO‡CHNGTAB8;;TO Y CHANGEÜ P…CHNGYæ GL}ˆCHNGYNEGð&R>„MAXY;;NOW, MAKE SURE Y CHANGEúD†OUTACY;;IS WITHIN BOUNDSQ>„MAXY;;TOO BIG??? P…CHNGY:"X;,!ˆCHNGM}YNEGR>„MINY;;TOO SMALL???6 E†OUTACY@ Q>„MINYJ P…CHNGYT †OUTACY:^X;h!X;ADD CHANGES TO BALL POSITIONrX;| „MOVE,† Q…BN}ALLX O…CHNGXš P…BALLX¤,® Q…BALLY¸ O…CHNGY P…BALLYÌ:ÖX;à0X;ADD TO HIT COUNTER AND SEE IF ABOVE MAXIMUMêX;ô‡IO}NCHITS#„HITSþQ„HITS;;NUMBER OF HITSR†MAXHIT;;ABOVE MAXIMUMH…OUTIH;;NOQ>;;RESET COUNTER& P„HITS0Q…CHNGX;;IS X P}SPEED AT: ‡MAKEPOS;;MAXIMUM???DR>NF…OUTIH;;YESXQ…CHNGX;;INC IF POSITIVEb G…XCNEGl #…CHNGXv …OUTIH:€X;Š!…XCNEGQ}"…CHNGX;;DEC IF NEGATIVE”:žX;¨"X;PAUSE IF KEY HAS BEEN PRESSED²X;¼…PAUSEQ‚CH;;PRESSED??ÆR>ÿÐF‡NOPAUSE;;NO, GET R}OUTÚQ>;;YES. LOCK PADDLESä P„LOCKîQ>ÿ;;RESET CH, ANDøP‚CH;;WAIT FOR ANOTHER!‡KEYWAITQ‚CH;;WAIT FOR ANOTHER R>ÿS};;KEY TO BE PRESSED F‡KEYWAIT Q>;;UNLOCK PADDLES* P„LOCK4Q>ÿ;;AND RESET AGAIN>P‚CHH ‡NOPAUSE:RX;\'X;DRAW WALLT} FOR PRACTICE & WALL BALLfX;p„WALLQ>4‡SCRNMEMzP…GPNTR;;POINT TO SCREEN„Q>5‡SCRNMEM;;MEMORYŽ P…GPNTR˜%>¢U}$>+¬!ƒWLPQ>ª;;COLOR 2 FOR VERTICAL¶ P@…GPNTR7À,;;ADD TO POINTERÊ Q…GPNTRÔO>Þ P…GPNTRè D„WLP2ò #…GPNTRü„WV}LP20;;DO IT 43 TIMESHƒWLP:X;$X;CLEAR ALL SCREEN MEMORY.X;8ˆCLEARALLQ>4‰SCORELINEBP…GPNTR;;SET POINTERLQ>5‰W}SCORELINEV P…GPNTR`$>;;AND DO 6 PAGESjQ>t?~…CLRLPP@…GPNTR7ˆ3’ H…CLRLPœ #…GPNTR¦0° H…CLRLPº:ÄX;ÎX}X;Ø#X;VERTICAL BLANK ROUTINE TO MOVEâX;PADDLES AND DO SOUNDSìX;öƒVBIQ>;;IS START PRESSED?? P†CONSOL  Q†CONSOLY}R>H‡CHKLOCK;;NO.(!!†WRMVEC;;YES. DO A WARM START2X;<'‡CHKLOCKQ„LOCK;;ARE PADDLES LOCKED??FF‡VBICONT;;NO.P!†XITVZ}BV;;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 PADD\}LE 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;;SAM^}E LOGIC^P†NPDTMP;;AS BEFOREh…PD2DR"†NPDTMPr Q†NPDTMP| G…NOPD2†,;;EXCEPT, WE MUSTO>;;LET IT KNOW WHO'Sš%ƒYP2;;P_}ADDLE TO ERASE¤ †ERAPAD® %†NPDTMP¸ $ƒXP28 %…TEMPYÌ,Ö Q†NPDTMPàO>;;AND TO DRAWê ‡DRAWPADô !…PD2DRþX;…NOPD`}2Q…TEMPYPƒYP2QƒVOL;;AND SOUNDS??&FˆNOVOLDEC;;NO0"ƒVOL;;YES, DEC IT:ˆNOVOLDECQƒVOL;;GET VOLUMEDL> ;;WITH NO DISa}TORTIONNP…AUDC1;;AND STOREXQ„NOTE;;GET NOTEbP…AUDF1;;AND STORElQ…ALTFL;;IF ALTERNATING,vF†OUTVBI;;MAKE ONE€Q…ALTFb}L;;PLAYER BRIGHTERŠM>;;THAN THE OTHER”>žQ>†PADCLR¨ P†PCOLR09²P†PCOLR09¼Q…ALTFL;;LOOKS TRICKIERÆN>;;THAc}N IT IS HEREÐM>;;I'M JUSTÚ>;;FINDING PLAYER TOäQ>†PADCLR;;MAKE DARKERî P†PCOLR09øP†PCOLR09†OUTVBI!†XITVBV;;Ed}ND OF VBI X;X;BUILD A DISPLAY LIST X;*$‡DLBUILDQ> ;;GRAPHICS 5 IN BASIC4$>*;;42 MODE LINES>„DLLPP†DLMAIN9H0Re} I„DLLP\Q>A;;JVB INSTfP†DLMAIN+p Q>4…DLISTzP†DLMAIN,„ Q>5…DLISTŽP†DLMAIN-˜:¢X;¬!X;SCALE PADDLE INPUT TOf} PM LOC¶X;ÀˆSCALEPADV?;;DIVIDE BY TWOÊ;;;AND TAKE AWAY 7ÔS>;;TO CENTER.ÞG‚LOèR>;;NOW CHECK LOWERò E‡CHECKHIüg} ‚LOQ>HƒAOKX;‡CHECKHIR>f;;TOO BIG?$ DƒAOK;;NO..Q>e;;YES. USE 1018ƒAOK:BX;LX;ERASE A PADDLEVX;` †ERAh}PAD5j'…TEMP2;;SAVE YtQ>4„PLR0;;GET LOW MEMORY~P…GPNTR;;FOR PLAYERSˆ Q>5„PLR0’ P…GPNTRœ7;;GET PLAYER NUMBER¦ †Pi}LPNTR;;AND ADD TO POINTER°%…TEMP2;GET Y BACKº$> ÄQ>Î"…ERALPP@…GPNTR7;;AND STICK SOMEØ3;;ZEROES INâ0;;SOMEWHEREìj} I…ERALPö:X; .X;ADJUST POINTER ACCORDING TO PLAYER NUMBERX; †PLPNTR?(…ADDLP1;;GET OUT WHEN WE2G†OUTPLP;;GET Tk}O ZERO<,;;ADD 128 FOR EACHFQ…GPNTR;;PLAYERPO>€Z P…GPNTRd D…ADDLPn #…GPNTRx !…ADDLP‚ †OUTPLP:ŒX;–X;DRAW PADl}DLE X;ª!‡DRAWPAD'…TEMP2;;DO SAME STUFF´5;;AS IN ERASE,¾?ÈAÒ P†HPOSP08Ü Q>4„PLR0æ P…GPNTRð Q>5„PLR0ú P…GPNTRm}7 †PLPNTR$> "Q>,%…TEMP2;;(INSTEAD OF 0)6„DRLPP@…GPNTR7@3J0T I„DRLP^:hX;rX;DRAW TOP AND BOTTOM|Xn};†‡SETSCRNQ>U;;USE COLOR 1$>;;20 BYTES (0-19)š#†SETLP1P‡SCRNMEM9;;PUT ON SCREEN¤P‡SCRNMEM\9®0¸ I†SETLP1Â:Ìo}X;Ö'X;INITIALIZE PLAYER-MISSILE GRAPHICSàX;ê†PMINITQ>ƒPMB;;TELL IT WHATôP†PMBASE;;MEMORY TO USEþQ>.;;AND DOUBLE-Lp}INE P†SDMCTL;;RESOLUTION „ZPMS Q>;;PLAYERS AND MISSILES& P†GRACTL0 Q>;;SET PRIORITY: P†GPRIORD :N X;X ,X;ZEROq} PLAYERS, MISSILES, AND X LOCATIONSb X;l „ZPMS$> ;;SET X LOCATIONSv Q>;;AND WIDTHS TO€ …ZPMLPP†HPOSP09;;ZERO.Š 0” I…r}ZPMLPž Q>ƒPMB¨ P…GPNTR² Q>;;POINT TO PM¼ P…GPNTR;;MEMORYÆ $>;;AND FOUR PAGESÐ ?Ú ‡ZPMEMLPP@…GPNTR7;;AND ZEROä s}3;;IT OUTî H‡ZPMEMLPø #…GPNTR!0 ! H‡ZPMEMLP!: !X;*!)X;DRAW PLAYING FIELD ACCORDING TO TYPE4!X;>!*†TYPEOK ˆCLEARALLt};;CLEAR WHAT WAS THEREH! †WAIT60R! ˆCLNSCRLN;;AND SCORELINE\!Q>f! P†VSCROLp!Q„TYPE;;GET TYPEz!T?„!T?Ž!T?˜! T?;;*16¢!u}>;;AS OFFSET TO TABLE¬!%>¶!&ˆPRTYPELPQ†STNDRD9;;PRINT GAME TYPEÀ!P‰SCORELINE8Ê!2Ô!3Þ!)>è! HˆPRTYPELPò! „ZPMS;;ZEROv} P/M AREAü! ‡SETSCRN;;DO TOP & BOTTOM" ‡MIDLINE;;AND MIDDLE LINE" Q„TYPE"R>$" F…TYPE4."Q>4‡SCRNMEM8" PˆMAINWORDB"Q>w}5‡SCRNMEML"PˆMAINWORDV"…TYPE4Q„TYPE;;TYPE * 2 FOR`"T?;;JUMP TABLEj">t"Q†JMPTAB9;;GET JUMP TABLE~"P†JMPVEC;;ENTRIESˆ"x}2’" Q†JMPTAB9œ"P†JMPVEC¦"!@†JMPVEC:;;AND OFF WE GO°"X;º"X;PRINT TITLE SCREENÄ"X;Î"†PTITLEQ…DLISTØ"L>;;SET HSCy}ROL BITâ" P…DLISTì" ‡SETSCRN;;SET TOP AND BOTTOMö"Q>4…TITLE;;POINT TO TITLE# P‡GR2WORD # Q>5…TITLE#P‡GR2WORD#$>z}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 ZE|}RO,‚# I‡OKCOUNTŒ#Q>;;SET BACK TO 7–# P…COUNT ##‡GR2WORD;;AND INCREMENTª#H‡OKCOUNT;;LMS IN D LIST´##‡GR2WORD¾#‡OKCOU}}NTQ…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…DLIS}TJ$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 PL}AYà$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;¼%#ŠPRACTICESU„}Q>;;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 PAŠ}DDLES°'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‡SCRNMEMŒ}F( 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 HŽ}ALFæ(,ð( 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>;;INI“}TIALIZE²* P„TYPE¼* P…SRVDRÆ* †TYPEOKÐ*Q>;;SET ENDING SCOREÚ* P†TOPSCRä*‰STARTOVERQ>;;WAIT FOR THEî*P†JIFCNT;;PADDLE T”}O 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ŠTYPE–}CHOSEN;;BUTTONS„+ Q…COUNTŽ+ R†RTCLOK˜+ H†WAIT03¢+ Q†PADDL0¬+ R‡LASTPAD¶+F‰CHECKMOREÀ+ E…CNTDNÊ+"Q†JIFCNT;;IF DIRECTION CHANG—}ED,Ô+G‰STARTOVER;;TRY AGAINÞ+#†JIFCNT;;ADD TO COUNTERè+ Q†JIFCNTò+R>;;IS IT 3?ü+H‰CHECKMORE;;NO. WAIT,F‡INCTYPE;;CHAN˜}GE GAME TYPE,X;, …CNTDN"†JIFCNT;;DECR. COUNTER$, Q†JIFCNT.,I‰STARTOVER8,R>ý;;IS IT -3?B,H‰CHECKMORE;;NO. WAIT.L,"„TYP™}E;;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â,&ŠTYPECON›}T02 ˆNEXTTYPE;;SET UP TYPESì, ˆSCROLLUP;;AND SCROLL UPö,ˆTYPECONT$>;;RESET PADDLE-Q>†PADCLR;;COLORS -ˆPDCOLRLPP†PCOLR0œ}9-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à. †WAIT6¡}0ê. "…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‰SCOR£}ELINE8¨/2²/3¼/)>Æ/HŠLASTTYPELPÐ/:Ú/X;ä/ X;ÓÔÏÒÁÇÅî/X;ø/!ƒXP1 =;;PADDLE X POSITIONS0 ƒXP2 = 0ƒYP1 ;;PADDL¤}E Y POSITIONS0 ƒYP2  0…BALLX ;;BALL X POS*0…BALLY ;;BALL Y POS40…CHNGX ;;BALL X CHANGE>0…CHNGY ;;BALL Y CHANGE¥}H0†TOPSCR ;;ENDING SCORER0„HITS ;;NUMBER OF HITS\0,†MAXHIT ;;# OF HITS BEFORE SPEED CHANGEf0†STRSPD ;;STARTING SPE¦}EDp04‡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 ;;ALTEª}RNATE 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=gV1‡GR2WORD ‰SCORELINE`1 _þþË &AŸDOS VERSION NUMBER MODIFICATIONAd|n#X; *** ORG = $1DOO FOR OS/A+ ***xX;‚X; *** DOS ENTRY POINTS ***Œ…XD®}EL0S ;;DELETE FILE–…SFDIR!;;SEARCH DIR †CSFDIR1;;SEARCH CONTINUEª…RDDIRn;;READ DIRECTORY´†WRTDIRq;;WRIT¯}E DIRECTORY¾†WRVTOC•;;WRITE VTOCÈX;Ò#X; *** DOS STORAGE LOCATIONS ***Ü…CDIRD;;CUR DIR SECTORæ…CDIRS;;CUR °}DIR DISPL.ð…SFNUM;;FILE NUMBERú…FNAMEY;;FILE NAME†FCBOTC‚;;FCB OPEN TYPE†FILDIR;;DIR BUFFERX;"X;±} *** MY STORAGE AREAS ***,"X; TABEL FOR CURRENT FILES.6X; LAYOUT:@"X;BYTE 1 - VERSION NUMBER (BCD)JX;BYTE 2 - ²}DIRECTORY SECTORT$X;BYTE 3 - DIRECTORY DISPLACEMENT^X;BYTE 4 - FILE NUMBERhi…TABLE ============³}===================r†MAXVER ;;MAXIMUM NUMBER|X; OF VERSIONS (2 - 8)†…CTABDr´};;CURRENT TABLEX; DISPLACEMENTš ‡NUMNAMEs;;NUMBER OF FILES¤…TEMPXt;;X HOLDING PLACE®†TMPCNTu;;TEMP COUNTEµ}R¸…CMDD8v;;OPEN TYPE/8ÂX;Ì"X;*** MISCELLANEOUS EQUATES ***Ö…OPOUT;;OPEN FOR OUTPUTà„OPIN;;OPEN FOR INPUTê¶}X;èX;ÓÔÁÒÔ ÏÆ ÃÏÄÅòX;üX;INITIALIZE, THEN CHECK FORX;THE PROPER FILE NAME. THE X;X REGISTER CONTAINS THE FCB"X;NU·}MBER, AND MUST BE PRESERVED$X;THROUGH THIS ROUTINE.X;8Q>;;INITIALIZE:BP…CTABD;;DISPLACEMENTLP‡NUMNAME;;NUMBER OF ¸}FILESV%>` ˆCLRTABLPjP…TABLE8;;AND TABLE (8t1;;4-BYTE ENTRIES)~ IˆCLRTABLPˆX;’Q…FNAME;;IF EXTENDER NOTœR> V¹};; = 'V '¦H†NOTAPP;;THEN LEAVE° Q…FNAME ºR> Ä H†NOTAPPÎ Q…FNAME ØR> â H†NOTAPPìX;ö Q†FCBOTC9R>„OPIN;;Iº}F OPEN FOR F‡IOCOMND;;INPUT OR OUTPUTR>…OPOUT;;THEN CONTINUE F‡IOCOMND( †NOTAPP2!†SREXIT;;ELSE LEAVE<X;F#X;PROPE»}R FILE TO DO THIS ROUTINEPX;Z ‡IOCOMNDd&…TEMPX;;SAVE X REGISTERnQ> ?;;PUT WILDCARDSxP…FNAME ;;OVER SPACES‚ P…FNAM¼}E Œ …SFDIR;;SEARCH FOR FILE–E†NOMORE;;NO SUCH FILE X;ª X;ENTER ALL FILES OF THE TYPE´X; 'NAME.V??' INTO THE TABLE¾½}X;È †SRCHLPÒ%…CDIRD;;GET THE TWOÜ$…CTABD;;DISPLACEMENTSæQ†FILDIR8;;FETCH NAMEðT?;;EXTENSION ANDúT?;;CHANGE LA¾}ST TWOT?;;DIGITS TO BCD T?;;FORMATP…TABLE9;;HIGH DIGIT"Q†FILDIR8,M>;;AND LOW DIGIT6 L…TABLE9@P…TABLE9;;PU¿}T IN TABLEJQ…CDIRS;;SAVE DIR SECTORTP…TABLE9;;AND^C;;AND DISPLACEMENThP…TABLE9rQ…SFNUM;; & FILE NUMBER|P…TAÀ}BLE9;;FOR TABLE†,;;Q…CTABD;;ADD FOUR TOšO>;;THE TABLE¤P…CTABD;;DISPLACEMENT.®#‡NUMNAME;;¸ ‰SKIPENTRY †CSFÁ}DIR;;IF MORE FILESÌD†SRCHLP;; THEN GO BACKÖX;à"X;WHEN NO MORE FILES, SEE IF WEêX;NEED TO DELETE ANYôX;þ †NOMORE$Â}…TEMPX;;IF OPEN TYPE =Q†FCBOTC9;; INPUT THENR>„OPIN;; SKIP OVER&F‰GETHINAME;;SEARCH0 ˆTOOMANY?:Q‡NUMNAME;;IF NUMNÃ}AME ;;CURRENT ENTRYŠ$>;;SMALLEST ENTRY” ‰SEARCHLOWž"†TMPCNT;;IF NO MORE¨FˆOUTSRCHL;;THEN OUTÅ}²Q…TABLE9;;ELSE IF CURRENT¼R…TABLE8;; > SMALLESTÆD†NOTLOW;; THEN SKIPÐC;;ELSE MOVEÚ>;;CURRENT TO MINä †NOTLOWî3;Æ};POINT TO NEXTø3;;TABLE ENTRY3 3;;GOTO SEARCHLOW!‰SEARCHLOW  ˆOUTSRCHL*X;4#X;POINTER TO EARLIEST VERSION IS> XÇ};IN X REGISTER, SO DELETE ITHX;R ‡PTABFNM;;RETRIEVE NAME\ ˆPULLDOWN;;PATCH TABLEf$…TEMPX;;GET FCB #p …RDDIR;;READ DÈ}IRECTORYz …XDEL0;;FREE SECTORS„ †WRTDIR;;WRITE DIRECTORYŽ †WRVTOC;;WRITE VTOC˜"‡NUMNAME;;ONE LESS NAME¢!ˆTOOMANY?;;É}CHECK MORE¬X;¶X;FIND LATEST CURRENT FILEÀX;Ê ‰GETHINAMEÔ%>;;MAXIMUM ENTRYÞ$>;;CURRENT ENTRYèQ‡NUMNAME;;GET NÊ}UMBER OFòP†TMPCNT;;ENTRIESü ‡SERCHHI Q…TABLE9;;IF CURRENT < R…TABLE8;; MAXIMUM D…NOTHI;; THEN BRANCH$ A;;ELSE MË}OVE X TO. ?;;Y BY WAY OF A8 …NOTHIB 2;;POINT TO NEXTL 2;;ENTRY ANDV 2;;DECREMENT THE` 2;;COUNTERj "†TMPCNTt Q†TMPCNT;Ì};IF COUNTER >= 0~ I‡SERCHHI;; THEN GO BACKˆ X;’ X;GET OPEN TYPE (4 OR 8) ANDœ !X;DIVIDE BY 8 TO GET ZERO OR 1¦ X;° $…TEÍ}MPX;;CURRENT FCBº Q†FCBOTC9Ä V?;;SHIFT RIGHTÎ V?;;THREE TIMESØ V?â ,;;ADD TO VERSIONì <;;NUMBER IN BCDö O…TABLE8;;MODEÎ}. IF OPEN P…TABLE8;;FOR INPUT, ZERO -;;IS ADDED, ONE C;;FOR OUTPUT >;;MOVE TO X REG(  ‡PTABFNM;;GET INFORMATION2 $…Ï}TEMPX;;RESTORE X REG< †SREXITF  …SFDIR;;SEARCH FOR FILEP :;;TO PLEASE DOSZ X;d X;SET VERSION NUMBER IN FNAMEn X;AND SETÐ} OTHER DOS VARIABLESx X;ACCORDING TO OUR TABLE. X‚ X;HAS OFFSET TO TABLE ENTRYŒ X;– ‡PTABFNM  Q…TABLE9;;GET BCD VERSIONªÑ} M>;;NUMBER AND´ L>0;;CHANGE BACK T0¾ P…FNAME ;;TWO DIGITSÈ Q…TABLE9Ò V?Ü V?æ V?ð V?ú L>0;;STORE IT IN P…FNAÒ}ME ;;FNAME BUFFER Q…TABLE9 P…CDIRS;;RESTORE SECTOR," Q…TABLE9, P…CDIRD;; DISPLACEMENT,6 Q…TABLE9@ P…SFNUM;Ó}; AND NUMBERJ :T X;^ X;CONDENSE TABLE TO ELIMINATEh !X;THE DELETED FILE. X REGISTERr X;CONTAINS OFFSET TO TABLE| X;† ˆPÔ}ULLDOWN Q>;;STORE ZERO IFš (>;;LAST ENTRY ELSE¤ EˆSKIPNEXT® Q…TABLE9;;GET NEXT¸ ˆSKIPNEXT P…TABLE9;;INTO CURREÕ}NTÌ 2;;ENTRYÖ (> ;;UNTIL END OFà HˆPULLDOWN;;THE TABLEê :ô X;þ TABLE9;;GET NEXT¸ ˆSKIPNEXT P…TABLE9;;INTO CURREGþþ® d X; DEBUG+nX;xX;This is an all machine‚X;language disassembler andŒ X;program tracer written with–X;OSS MAC/65×}. X;ªX;Written by: Bryan Schappel´X;¾X;COMMANDS:ÈX;ÒX;D = display toggleÜX;C = change memoryæX;* = display adØ}dress setðX;Q = go to DOSúX;G = run at addressX;R = display registersX;N = change registersX;S = save binary filÙ}e"X;L = load binary file,X;T = trace program6X;U = un-used break points@X;H = high speed displayJ!X;. = hex/dec, decÚ}/hex convertTX;B = set break point^X;O = restore break pointhX;- = scroll up in memoryrX;= = scroll down in memory|Û}X;P = disassemble to device†X;E = erase memoryX;F = find memoryšX;¤X;** EQUATES **®X;¸„CIOVVä;;Central I/OÂ…Ü}ICCOMB;;commamdÌ…ICBALD;;buf adr loÖ…ICBAHE;;buf adr hià…ICBLLH;;buf len loê…ICBLHI;;buf len hiô„AUXÝ}1J;;aux byte 1þ„AUX2K;;aux byte 2†COLPF2Æ;;bkgrnd†COLPF1Å;;text†RAMTOPj;;top of RAM&†CONSOLÐ;;cÞ}onsol keys0…LBUFF€;;I/O buffer:…PUTRC ;;put rec comDƒEOL›;;end of lineN†DOSVEC ;;DOS jmp vecXƒFR0Ô;;floaß}t pointbƒAFPØ;;asc to fpl„FASCæØ;;fp to ascvƒIFPªÙ;;int to fp€…AUDF1Ò;;so. chan 0Š…AUDC1Ò;;distortion”à}†RTCLOK;;jiffy clockž†INBUFFó;;fp result¨ƒCIXò;;fp offset²ƒFPIÒÙ;;fp to int¼†SETVBV\ä;;set vblankƆXITá}VBVbä;;xit vblankÐ…NMIENÔ;;interupt goÚ„VBRK;;BRK vectorä…ZPAGE;;zero pageî…STACK;;hardware stackø…â}PAGE2;;page 2†ROWCRST;;y-pos ‚CHü;;key press†SDLSTL0;;display list †SRTIMR+;;key debounce*†SDMCTLã}/;;DMA control4†DOSINI ;;dos init vec>†COLDSTD;;cold start flagH†VKEYBD;;keyboard vectorR†KBCODE Ò;;key ä}code\†KEYDEFy;;key code>asciif…CHBASô;;character basep„DDEV ;;D:zX;„X;** PROGRAM EQUATES **ŽX;˜€¢„SLå}FS;;slow or fast¬„INDR;;addr of mne¶‚OP;;opcodeÀ…NBYTE;;command bytesÊ„ADDR;;disa addressÔ„CEND;;æ}command endÞ…GDIGS;;# of digitsè…SAVEY;;temp saveò„SMEM;;temp addrü…CNTLO;;nbyte count„NCHK;;check ç}keys?„TEMP;;temp store„HXDC;;hex/dec flag$…SAVEX;;temp X save.‚SL;;buffer address8ƒSTL;;start addrè}essBƒENL;;end addressLƒBLL;;buffer lengthV„DINS;;2 byte arg`…DISKC;;disk commandj†DISKC2;;read/writeé}?t„BSET;;break point~„BRAN;;branch adrˆ†BRAFLG;;branck flag’ƒSCR;;scr memœ„IND2;;indr 2¦†TOPADRê};;top disa adr°ƒLN2;;2nd disa adrº…SAVX2;;temp XÄ„IND3;;temp addr saveΆERRNUM;;I/O error #Ø„SAVD;;të}race save adrâ…SAVY2;;temp Y 2ì…DTYPE;;display typeö„IPUT;;input flag…BLINK;;blink rate †CSHAPE;;cuì}rsor shape„FREN;;free brk pnts„BBCK;;bytes back(„OLDC;;old key press2…OLDAC;;old asc convert<„INVSí};;inverse flagF„CAPS;;caps flagP…PGWAY;;scroll dirZX;d¡;;Cartridgen >†D:DISAx >‡D:TRACE‚ >…D:IO3NVSwþþÂNdX;nX;------------xX;DISASSEMBLER‚X;------------Œ„DISA-;;no decimal.–Q†DOSINI;;save DOS INIT P†MYINITª ï}Q†DOSINI´P†MYINIT¾Q†VKEYBD;;copy keybrd adrÈP„TKEY;;to holdÒQ†VKEYBDÜ P„TKEYæQ„VBRK;;copy VBRK vecðP ð}„BRKS;;to hold areaú Q„VBRK P„BRKSQ†KEYDEF;;test 800 or XL?L†KEYDEF"F†REINIT;;have 800,Q†KEYDEF;;copy k ñ}eycode to6P‚K1;;ascii table adr@Q†KEYDEF;;to my programJ P‚K1TX;^ †REINIT-h$>;;get 0r&„EXEC;;no run.| ò} &†COLDST†&„NCHK;;check keys&…NMIEN;;no interupts.š&…DTYPE;;display type¤2® &„IPUT¸ &„BBCKÂ@;;get stk pntrÌ&„U ó}SRS;;save.ÖQ>à;;restore charàP…CHBAS;;setêQ> ;;set RAMTOP onôP†RAMTOP;;my programþ=Q>4…BRKER;;point BRK hand ô}P„VBRK;;to my routine. Q>5…BRKER& P„VBRK0Q>4…MKEYV;;replace keybrd:P†VKEYBD;;interrupt withDQ>5…MKEYV;;mineNP† õ}VKEYBDXQ>4†MYINIT;;point RESETbP†DOSINI;;vec to my prog.l Q>5†MYINITvP†DOSINI€.Š$>”„C123Q…ZPAGE9;;now co ö}py thežP…MYZPG9;;first 3 pages¨Q…STACK9;;of RAM to my²P…MYPG19;;buffers.¼Q…PAGE29;;(For TRACER)Æ P…MYPG29Ð2Ú H„C1 ÷}23ä …OPSCR;;open screenîQ…USRPC;;now disa fromøPƒFR0;;the users PC Q…USRPC  PƒFR0 †TOEDEV Q>@;;interupts ø} on.* P…NMIEN4 †FREBRK;;sho BRK points> †DOREGS;;and registers.HX;RX;Wait here for command\X;f†GETCOM †CLRWIN;;c ù}lear comp †CLRCMD;;and promptz †CLRKEY„ †SETKEY;;set keysŽ †GETKEY;;get a key˜M>;;no inverse¢$>;;scan 18 coms ú}¬ƒGC2R†CMDTXT9;;is it a com?¶F†HAVCOM;;yes.À 0;;no.ÊIƒGC2;;18 coms yet?Ô †GOTERR;;sorry error.Þ!†GETCOM;;go again. û}è †HAVCOMAòT?;;mult * 2ü>Q†CMDADR9;;get commandP†CMDJSR;;address fromQ†CMDADR9;;the table$P†CMDJSR;; ü}put in JSR. †CLRERR;;erase error.8 ‡ERASTAT;;and status.B †SETKEYL†CMDJSR ÿÿ;;go command!V!†GETCOM;;get next one.` ý}X;jX;This is the go DOS commandtX;~†DOSCMDQ>;;kill VBLANKˆ %>4†XITVBV’ $>5†XITVBVœ †SETVBV¦Q„BRKS;;restore th þ}e°P„VBRK;;BRK vector.º Q„BRKSÄ P„VBRKÎQ†MYINIT;;restore RESETØP†DOSINI;;vectorâQ†MYINITìP†DOSINIö ÿ}=Q„TKEY;;restore key- P†VKEYBD;;board interrupt Q„TKEYP†VKEYBD(.27;;pull off RTS<7F!@†DOSVEC:;;go DO }SPX;ZX;Re-init prog after RESETdX;n†MYINIT ÿÿ;;changedx !†REINIT‚X;ŒX;Open new screen–X; …OPSCRQ>;;blackª }P†COLPF2;;background´Q> ;;white text¾ P†COLPF1ÈQ>’;;blue bordersÒP†COLPF2Ü †CLRSCR;;clear screenæQ>4…DLIST; };install myðP†SDLSTL;;Display Listú Q>5…DLISTP†SDLSTLQ>!;;screen on P†SDMCTL"Q>;;def. mode,%>4ƒVBI;;poin }t to my VBI6 $>5ƒVBI@!†SETVBV;;set it!JX;T"X;This routine closes IOCB two.^X;(Device IOCB.)hX;r†DCLOSE$>„DDEV;;De }vice|Q> ;;close command†P…ICCOM9;;store it!„CIOV;;close it.šX;¤ X;Zero FR0®X;¸ƒZFRQ>;;zero floatingÂPƒFR0; };point regs.Ì PƒFR0Ö:àX;êX;General use print routineôX;þ †EPRINTP„IND2;;address of mem'„IND2;;to 'print'. } …CLCLN;;get line adr%>;;zero loop.&ƒPRLQ@„IND27;;get char0R>ƒEOL;;is EOL?:FƒPRD;;yes. finished.D †ASC2IC;;no. } make icodeNP@ƒSCR7;;on screenX3;;up loop.bHƒPRL;;go again.lƒPRD#†ROWCRS;;up y-pos.v :;;bye.€X;ŠX;Error routine” }X;ž†GOTERRQ>d;;nice tone.¨ P…AUDF1²Q>ª;;no distortion¼ P…AUDC1ÆQ>;;leave it onÐP†RTCLOK;;for 5 jiffies.Ú„TO }NEQ†RTCLOKäR>î H„TONEø$>;;turn it off. &…AUDC1  &…AUDF1 :;;bye. X;*X;Fetch address4X;>„GADR †CLRCMD;;cl }ear promptH †CLRWIN;;and windowRQ> ;;a '*'\ P…COMNDf …INPUT;;get INPUTpD„GDNM;;good inputz7;;pull off RTS„7Ž: };;next command˜ „GDNM%>¢ „GTDR$>¬&„HXDC;;signal hex #¶Q…MYBUF8;;first char.ÀR> .;;a '.'?ÊH„GET4;;no. in hexÔ# }„HXDC;;signal dec #Þ3èH„GNUM;;get decimalòX;ü"X;Pull out a 4 byte hex address X; „GET4 ƒZFR;;zero fp regs P…GDIG }S$ †G4LOOPQ…MYBUF8;;pull char. R>ƒEOL;;at end?8 H†TESTIT;;no.B :;;bye.L †TESTIT$>;;do 16 digits.V †G4SCANR†HEXDIG9;;i }s it in` F†GOTG4D;;the Hex table?j 0;;no. try next.t I†G4SCAN;;go again.~ …G4ERR7;;Not in table,ˆ 7;;we have an’ !†GOTE }RR;;error. Sorry.œ †GOTG4DTƒFR0;;multiply #¦ UƒFR0;;by a factor° TƒFR0;;of 16.º UƒFR0Ä TƒFR0Î UƒFR0Ø TƒFR0â }UƒFR0ì A;;add digitö LƒFR0;;to the PƒFR0;;current addr #…GDIGS;;up digs done Q…GDIGS;;get it. R>;;more than 4( } E…G4ERR;;yes. error.2 3;;do next one< !†G4LOOP;;do again.F X;P X;Get out a decimal numberZ X;d „GNUM ƒZFR;;zero fp re }gsn P…GDIGSx …DONUMQ…MYBUF8;;pull char‚ R>ƒEOL;;EOL?Œ H…GTEST;;no.– Q>;;index to str  PƒCIX;;is zeroª '…SAVEY´ Q>4… }LBUFF;;point INBUFF¾ P†INBUFF;;to LBUFFÈ Q>5…LBUFFÒ P†INBUFFÜ $…GDIGS;;install EOLæ Q>ƒEOL;;for safetyð P…LBUFF9ú  }ƒAFP;;to fp E…GNERR;;error?  ƒFPI;;to integer E…GNERR;;error?" %…SAVEY;;restore Y, :;;bye.6 …GTEST$> ;;scan 10 digs }.@ †GNSCANR†HEXDIG9;;in tableJ F…GOTGN;;have digitT 0;;try next^ I†GNSCANh …GNERR7;;errorr 7;;bad digit| !†GOTERR† …G }OTGN3;;up char index $…GDIGS;;save char inš P…LBUFF9;;LBUFF.¤ #…GDIGS;;next digit® !…DONUM;;go again¸ X; X;Show memor }y contentsÌ X;Ö †SHOMEM$>;;pos. 2,0à &„HXDCê 2ô &…NBYTEþ  „ZBUF;;blank buffer Q„ADDR;;in fp for PƒFR0;;hex conver }t Q„ADDR& PƒFR00 $>;;at pos 0:  ‡COPYNUM;;copy numberD Q>ƒEOL;;insert EOLN P…MYBUFX %>;;Y = 0b …COPY2'… }SAVEY;;save yl  ƒZFR;;Zero FR0v ?;;Y = 0€ Q@„ADDR7;;numberŠ P‚OP;;make digit”  †FNDBRK;;BRK point?ž Q‚OP;;put op in FR0 }¨ PƒFR0² %…SAVEY;;restore index¼ R>ƒEOL;;have EOL?Æ FƒGOL;;yes. leave it.Ð P…MYBUF8;;save charÚ ƒGOL ‡BIN2HEX;;make }it hexä Q„BSET;;is this BRK?î FƒNN1;;point? no.ø %>;;yes. make # ƒNN0Q…LBUFF8;;inverse L>€;;video. P…LBUFF8 } 1* IƒNN04 ƒNN1%…SAVEY;;insert in buf.> $†STRPOS8;;get positionH Q…LBUFF;;first digitR P…MYBUF9;;in buffer\ Q…LBUF }F;;second digitf P…MYBUF9;;in buff.p  „NSET;;add 1 to addrz 3;;up count„ )>;;done 6?Ž H…COPY2;;no.˜ :;;bye.¢ X };¬ X;Handle Change memory¶ X;À †CHGMEM „GADRÊ „CREGQƒFR0;;copy fp toÔ P„SMEM;;zpage forÞ QƒFR0;;lookupè P„SMEMò } „GADR;;get numberü QƒFR0;;take LSB%>P@„SMEM7;;poke it in:$X;.X;Go memory routine8X;B„GMEM „GADR;;run ad }dressL7V7`QƒFR0;;copy RUN addrjP…USRPC;;for latert QƒFR0~ P…USRPCˆ=;;kill interrupts’$>œ„C321Q…MYZPG9 !};;copy USER RAM¦P…ZPAGE9;;back for the°Q…MYPG19;;run.º P…STACK9Ä Q…MYPG29Î P…PAGE29Ø2â H„C321ì.ö$„USRS;;restore "} userB;;registers  Q„USRP5$„USRX;;restore X(%„USRY;;and Y2Q„USRA;;and Acc<#„EXEC;;set RUN flagF8;;restore s #}tatusP!@…USRPC:;;RUN!ZX;dX;Disassemble MemorynX;x†DISMEM „GADR;;get adr‚†TOEDEVQƒFR0;;move in addrŒ P„ADDR–P†T $}OPADR;;top line QƒFR0;;hi byteª P„ADDR´P†TOPADR¾Q>;;pos.0È P†ROWCRSÒ„DMEM †FINLIN;;disa itÜ …CLCLN;;sc %}reen lineæ%>ðƒDM3Q…MYBUF8úR>ƒEOL;;make EOL space H„CON2Q> „CON2 †ASC2IC;;make icode"P@ƒSCR7;;on screen,1 &}6IƒDM3;;do next@#†ROWCRS;;up ypos.JQ†ROWCRS;;get itTR>;;second line?^H…SECLN;;no.hQ„ADDR;;set LN2 pntrrPƒLN2| '} Q„ADDR† PƒLN2…SECLNQ†ROWCRS;;done 14 yet?šR>¤H„DMEM;;no.® :;;yes.¸X;ÂX;Memory disassemblerÌX;Ö‡DIS (}AMEM%>;;zero Yà'†BRAFLG;;no branchê'„HXDC;;in hexôQ@„ADDR7;;get opcodeþP‚OP;;and save †FNDBRK;;BRK point?Q‚OP )};;get op%>;;zero Y&…FNDOPR†OPCODE8;;is op in0F…HAVOP;;the opcode: 3;;table?D)>—;;151 yet?NH…FNDOP;;no.X…HAVO *}P'…SAVY2;;save Yb „ZBUF;;clear bufferlQ„ADDR;;copy addrvPƒFR0;;to FP€ Q„ADDRŠ PƒFR0”$>;;pos. 0ž ‡COPYNUM; +};copy it¨ ƒZFR;;clear FP²Q‚OP;;get op¼PƒFR0;;in FPÆ$>;;pos 8Ð ‡COPYNUM;;copy itÚ%…SAVY2;;get Yä$†OFFSET8;;MNE ,} offsetî%>;;copy out theø…ADMNEQƒMNE9;;Mnemonic andP…MYBUF8;;put in  2;;buffer.3 )>;;3 chars?*H…ADMNE;; -}no.4%>;;Y = 1>'…NBYTE;;1 byte instrHQ@„ADDR7;;copy next 2RP„INDR;;possible\3;;instructionfQ@„ADDR7;;bytes to te .}mppP„INDR;;hold address.z%…SAVY2;;restore Y„Q…ITYPE8;;get ItypeŽT?;;times 2˜ ?;;in Y¢Q…DCOMT8;;look up the¬P„ /}DJSR;;routine addr¶Q…DCOMT8;;an put inÀP„DJSR;;JSRÊ„DJSR ÿÿ;;go command!Ô%>';;now insert theÞ…AEOL3Q…MYB 0}UF8;;the EOLèR> ;;characterò H…AEOL2ü1 I…AEOL3…AEOL2Q>ƒEOLP…MYBUF8$Q„BSET;;brk point?.F„NSET;;no.8 „IN 1}V2;;inverse itB„NSETQ„ADDR;;now add theL,;;number ofVO…NBYTE;;byte to the`P„ADDR;;adr pointerjQ„ADDR;;to get nex 2}ttO>;;instr addr.~ P„ADDRˆ :;;bye.’X;œX;Inverse Mnemonics¦X;°„INV2%>;;start w/ 18thº„INVLQ…MYBUF8;;get c 3}harÄN>€;;flip bit 7ÎP…MYBUF8;;store in buffØ3;;up indexâ)>;;21st yet?ìH„INVL;;not doneö :;;done.X; X;Immed 4}iate ModeX;…IMMED †LOBYTE;;insert LSB(Q> #;;a '#'2P…MYBUF;;in buffer<…NUMBRQ>;;zero MSBF P„INDRP†NUMBR 5}2Q„INDR;;put in FR0ZPƒFR0d Q„INDRn PƒFR0x†NUMBR3$>;;put in arg‚ !‡COPYNUMŒX;–X;Zero page X;ª„ZPAG †LOB 6}YTE;;do LSB´!…NUMBR;;add arg¾X;ÈX;Zero page,XÒX;Ü…ZPAGX †LOBYTE;;LSBæ …NUMBR;;add argð…ADDX2%>;;just ,Xú„AD 7}DX2;;up X…ADDX3Q†COMMAX8;;copy theP…MYBUF9;;,X into0;;the buffer"1, I…ADDX36 :;;done.@X;J X;AbsoluteTX;^ 8}…ABSOL †LOBYTE;;LSBh †HIBYTE;;MSBr!†NUMBR2;;add arg|X;†X;Absolute ,XX;š†ABSOLX …ABSOL;;set up absol¤!…ADDX2; 9};copy in ,X®X;¸X;Absolute ,YÂX;̆ABSOLY …ABSOL;;do absolÖƒACYQ>,;;a commaàP…MYBUF9;;in bufê Q>Y;;a YôP…MY :}BUF9;;in bufþ :;;doneX;X;Indirect XX;&„INDXQ>;;no MSB0 P„INDR: †LOBYTE;;do LSBD …OPENP;;add open '(' ;}N 2;;up XX%>;;3 bytesbH„ADDX;;copy ',X)'lX;vX;Indirect Y€X;Š„INDYQ>;;no MSB” P„INDRž †LOBYTE;;do LSB¨ <} …OPENP;;left (²%>;;copy in the¼„ADDYQ†COMMAY8;;'),Y'ÆP…MYBUF9Ð2Ú1ä I„ADDYî :;;doneøX;X;Accumulator Mo =}de X;…ACCUMQ>A;;an 'A' P…MYBUF;;in buffer* :;;done4X;>X;Branch instructionsHX;R„RELA †LOBYTE;;put LSB\# >}…NBYTE;;make 3 bytef ƒZFR;;zero FR0p#†BRAFLG;;have branch.zQ>;;add arrow„P…MYBUF;;in buffer.ŽQ„INDR;;get opera ?}nd˜I†NOBACK;;not inverse¢"…MYBUF;;make up arrow¬M>;;mask inverse¶N>;;flip itÀ ,;;add a 1ÊO>ÔP„DINS;; @}save itÞ;;;and subtractè S>;;two.ò!„TOFP;;doneü†NOBACKP„DINS„TOFPQ„INDR;;operandI‡FORWARD;;bran forwardQ A}„ADDR;;now subtract$;;;from addr.S„DINS;;to find out8PƒFR0;;where thisBQ„ADDR;;branch goes.LS>V PƒFR0` B}!„BACK;;done.j‡FORWARD,;;add # totO„ADDR;;addr to calc~PƒFR0;;forward branchˆ Q„ADDR’O>œ PƒFR0¦„BACKQ> C};;now add a 2°,;;to skip theºOƒFR0;;instructionÄPƒFR0;;addressÎP„BRAN;;and saveØQƒFR0;;the branchâO>;;addr f D}or theìPƒFR0;;tracer.ö P„BRAN †NUMBR3;;add number "…NBYTE;;make 2 bytesX;X;Implied Mode(X;2ƒIMP:;;do E}nothing<X;FX;Indirect instructionsPX;Z„INDI †LOBYTE;;copy in LSBd †HIBYTE;;and MSBn …OPENP;;do open (xQ> );;and F} add‚P…MYBUF9;;closing oneŒ :;;leave.–X; X;Zero page ,YªX;´…ZPAGY †LOBYTE;;do LSB¾ …NUMBR;;add argÈ!ƒACY;;c G}opy ,YÒX;ÜX;Insert LSBæX;ð†LOBYTE#…NBYTE;;up bytesú ƒZFR;;zero FR0Q„INDR;;do lobytePƒFR0$> ;;at pos. 10" H}!‡COPYNUM;;do it!,X;6X;Insert MSB@X;J†HIBYTE#…NBYTE;;3 byterT ƒZFR;;no FR0^Q„INDR;;hibytehPƒFR0;;in FPr$> I};;at pos. 14|!‡COPYNUM;;copy it.†X;X;Add Open (šX;¤…OPENPQ> (;;open (®P…MYBUF;;in buffer¸!†NUMBR2;;add nu J}mberÂX;ÌX;Handle I/O errorÖX;à…IOERR ƒZFR;;save errnumê'ƒFR0ô '†ERRNUMþ †GOTERR;;beep! „ZBUF;;no buffer ƒI K}FP;;Int to FP „FASC;;con to asc&%>ÿ0$>ÿ;;copy to buf: „IOLP3D2N Q@†INBUFF7X P…MYBUF9b I„IOLPlM>vP…MYBUF9 L};;in err buf€ Q>ƒEOLŠP…MYBUF9” &„CENDž$>;;search the¨†ERRLP1Q„ERRS9;;errors²R†ERRNUM;;we have in¼F…GERR1;;en M}glishÆ0Ð I†ERRLP1Ú G„IOL5ä…GERR1A;;we have one.î T?;;* 2ø>;;get addressQ†ERRTAB9  P„INDR Q†ERRTAB9  P„I N}NDR*%>ÿ;;and copy it4$„CEND;;to mybuf.>Q> ,HP…MYBUF9R2\ „IOL43f2p Q@„INDR7zP…MYBUF9„ I„IOL4ŽM>˜ O}P…MYBUF9¢Q>ƒEOL;;add EOL.¬P…MYBUF9¶„IOL5Q>;;on error lineÀ P†ROWCRSÊ †CLRERR;;clear itÔ„IOL3Q>4…MYBUF;;and P} printÞ %>5…MYBUFè !†EPRINTòX;üX;Copy number to stringX; ‡COPYNUM0&…CNTLO;;save X$Q„HXDC;;hex/dec?.F…INHEX; Q};have Hex.8 ƒIFP;;to FPB „FASC;;to ASCL$…CNTLO;;get indexV%>ÿ;;and copy`†CNLOOP3;;the numberj2t Q@†INBUFF7~ P… R}MYBUF9ˆ I†CNLOOP’M>;;mask bit 7œ P…MYBUF9¦ :;;leave°…INHEX ‡BIN2HEX;;make hexº$…CNTLO;;get posÄ 2;;up it.ÎFƒALL S};;if 0 do allØ(>;;is X > 20?âEƒARG;;yes.ì!„SOMEQ…LBUFF;;no. just copyöP…MYBUF9;;the LSB part2;;of the Hex Q… T}LBUFF;;number. P…MYBUF9 :;;bye.(ƒARGQ> $;;install a '$'2 P…MYBUF9< 2;;up XFQ…NBYTE;;Get # of bytesPR>;;is it U} 2?ZF„SOME;;no.dƒALL%>;;no. copy itn…ALOOPQ…LBUFF8;;all to bufx P…MYBUF9‚2Œ3–)>;;done yet? H…ALOOP;;nope.ª V} 0;;dec X´:;;so long.¾X;ÈX;Binary to hexadecimalÒX;܇BIN2HEX%>;;buf indx=0æ$>;;do 2 numsð†NXTBYT&…SAVEX;;s W}ave itúQ>ð;;get HI bits MƒFR09V?;;divide by 16V?"V?,V?6>;;to index@Q†HEXDIG9;;get charJP…LBUFF8;;and sav X}eT3;;up buf index^$…SAVEX;;get X backhQ>;;now LO bitsr MƒFR09|>†Q†HEXDIG9;;get char andP…LBUFF8;;put in buffe Y}rš3;;up buf indx¤$…SAVEX;;get X®0;;down by one¸I†NXTBYT;;done?Â:;;yes. bye.ÌX;ÖX;Fill buffer with blanksàX;ê Z}„ZBUFQ> ;;spaceô$>';;do 128 spacesþ…ZLOOPP…MYBUF9;;in buf 0;;down count I…ZLOOP;;go again :;;bye.& X;0 "X;Handl [}e a 6502 BRK instruction: X;D …BRKERQ„EXEC;;running?N H†SAVREG;;yes.X 7;;no. just exit.b 9l †SAVREG-;;chill decv &„USR \}X;;save registers€ '„USRYŠ 7” P„USRAž 7¨ P„USRP;;calc BRK point² 7¼ ;Æ S>Ð P…USRPC;;put in programÚ 7;;counter.ä ]}S>î P…USRPCø @;;store stck pntr!&„USRS;;for user !.!!†SHOBRK;;bye. !X;*!X;Vertical Blank Interrupt4!X;>!X;Up ^}date my RTCLOK registersH!X;in my zero page buffer soR!X;we can use real-time delay\!X;loops in the tracer.f!X;p!ƒVBI#…M _}YZPG;;jiffiesz! H„VBDN„!#…MYZPG;;'seconds'Ž! H„VBDN˜!#…MYZPG;;'minutes'¢!X;¬!!X;Now we check to see if there¶! X; `}is an input being taken andÀ!X;if so blink the cursorÊ!X;Ô!„VBDNQ„IPUT;;inputting?Þ!H„VBOT;;no.è!Q†SRTIMR;;key pressed?ò a}!F†BLINK?;;no.ü!Q>?;;yes. leave"P†CSHAPE;;cursor on for"Q><;;1 second." P…BLINK$"†BLINK?Q†CSHAPE;;shape.""…BLINK;; b}down blink8"H…VEXIT;;not 0 leaveB"%>;;1/2 secondL"'…BLINK;;delayV"N>?;;flip shape`"P†CSHAPE;;and savej"…VEXIT%„CEND; c};get positt"P…COMLN8;;save cursor~"„VBOT!†XITVBV;;all doneˆ"X;’"X;Show BRK informationœ"X;¦"†SHOBRK6;;get status°">º" d}7Ä"M>ï;;alter itÎ"5Ø"8;;put it back.â"Q>;;stop EXECì" P„EXECö"!†REINIT;;reinit DEBUG+#X; #X;Keyboard Handler#X; e}#…MKEYVQ„EXEC;;running?(# F†MYKEYV2# Q†KBCODE<#R>œ;;control ESC?F#H†MYKEYV;;no so get keyP#'„USRY;;save YZ#&„USRX;;save f} Xd#Q>ÿ;;clear out keyn#P‚CHx#7;;pull Accum‚#P„USRA;;store itŒ#7;;get P stat–#P„USRP;;save it #7;;pull LSB of PCª#P… g}USRPC;;save it´#7;;pull MSB¾#P…USRPC;;save itÈ#@;;get S pntrÒ#&„USRS;;save itÜ#.;;clear interruptæ#!†SHOBRK;;show in q}òWÿÿÿÿÿÿÿÿÿÿB©PONG M65B)­DOSMOD M65BÖDEBUG1 M65B¢îDEBUG2 M65B=™DEBUG3 M65B–ÖDEBUG4 M65B lSTRSORT M65foð#†MYKEYV!@„TKEY:ú#X;$X;Show registers$X;$†DOREGS%>;;zero index"$…DOLOP'…SAVEY,$ ƒZFR;;clr FR06$Q„USRA8;;get r r}eg@$PƒFR0;;in FR0J$ ‡BIN2HEX;;to hex.T$%…SAVEY;;reload Y^$$…DRPOS8;;find posit.h$Q…LBUFF;;get byter$;|$S> †$P„PCN s}T9;;into buffer$Q…LBUFF;;next.š$;¤$S> ®$ P„PCNT9¸$3Â$)>;;done?Ì$H…DOLOP;;no way.Ö$Q…USRPC;;show theà$PƒFR0; t};program cntrê$ Q…USRPCô$ PƒFR0þ$ ‡BIN2HEX%%>;;put it on%ƒPCLQ…LBUFF8;;the screen%;;;make icode&%S> 0% P„PCN u}T8:%1D%IƒPCLN%$>;;index for PSX%%>;;do 8 bits.b%…BITITQ„USRP;;get itl%M„BITS8;;mask itv%FƒNON€%Q>;;a '1'Š% H„PR v}ON”%ƒNONQ>;;a '0'ž%„PRONP„PCNT9;;on screen¨%2;;up scr pntr²%1;;dec loop¼%I…BITIT;;do again.Æ%Q>;;put on a 1Ð%P„PCN w}T;;under unusedÚ%:;;status bit.ä%X;î%X;Change registersø%X;&…CREGS%>;;copy on prompt &„CRGLQ†REGTXT8& P…COMND8 & x}1*& I„CRGL4&„REGW †GETKEY;;get a key>&%>;;test 5H&ƒCRGR…REGIS8;;this one?R&F†HAVREG;;yes!\& 1;;nope.f&IƒCRG;;try next y}p&G„REGW;;sorry, againz&†HAVREGC;;get address„&T?;;of registerŽ&?;;in memory˜&Q†REGTAB8;;and put¢&PƒFR0;;in fp regs¬&Q z}†REGTAB8¶& PƒFR0À& „CREG;;change memory.Ê&!†DOREGS;;show regs.Ô&X;Þ& X;These are the routines usedè& X;to convert AS {}C to ICODE andò&X;ICODE to ASC. Each uses aü&X;4 byte table of bit masks'X;located at the end of the' X;program for the |} conversion.'X;$'X;Asc to internal.'X;8'†ASC2IC …BITER;;fix up bitsB'LƒA2I9;;add new maskL'$…SAVX2;;restore XV' :;;don }}e!`'X;j'X;Internal to Asct'X;~'†IC2ASC …BITER;;do bits.ˆ'LƒI2A9;;add mask.’'$…SAVX2;;get Xœ':;;and leave¦'X;°'X;Read ~}y the bitsº'X;Ä'…BITER5;;save old byteÎ'U?;;roll the bitsØ'U?;;around 4 timesâ'U?ì'U?ö'M>;;make it index(&…SAVX2;; }save X ( >;;X = A(7;;pull old byte(M>Ÿ;;mask it off((:;;and leave2(X;<(X;Clear screen (3 pages)F(X;P(†CLRSCRQ>;;g €}et a spaceZ( >;;zero Xd(„CLSCP†MYSCRN9;;page 1n(P†MYSCRN9;;page 2x(P†MYSCRN9;;page 3‚( 2;;up loopŒ(H„CLSC;;and lo }op again–(P†ROWCRS;;pos 0,0 (:;;all doneª(X;´(X;Input routine¾(X;È(…INPUTQ>;;length = 0Ò( P„CENDÜ(P„IPUT;;signal inp ‚}utæ( †CLRWIN;;clear windowð( „ZBUF;;and bufferú(„GETC †GETKEY;;get a key)R>;;ESCape?)H„LEG0;;nope.) #„IPUT");;;sig ƒ}nal error,):;;and leave6)„LEG0%„NCHK;;check legals?@)H†GOTCHR;;nope.J)„LEG1%>(;;is it a legalT)„LEGLR…LEGAL8;;char?^)F „}†GOTCHR;;yup.h)1;;not this oner)I„LEGL;;try next|) †GOTERR;;error.†)!„GETC;;go again.)†GOTCHRR>~;;Delete?š)H†NOTDEL;; …}no.¤)"„CEND;;lower length®)IƒTS2;;<0? no.¸)Q>;;make zero.Â) P„CENDÌ) †GOTERR;;give error.Ö)ƒTS2 „TST1;;test lengthà)Q †}„CEND;;get lengthê)F„GETC;;if not 0 go!ô)%„CEND;;put in a spcþ))> * H…DODEL*1* …DODELQ>&*P…COMLN8;;erase char0*P… ‡}COMLN8;;erase cursor:*!„GETC;;get next.D*†NOTDELR>œ;;Delete Line?N*F…INPUT;;yes.X* %„CENDb* P…MYBUF8l*R>ƒEOL;;EOL?v* ˆ}F…ATEND;;done!€* †ASC2IC;;make icodeŠ*)> ”* H„SHCHž*1¨*„SHCHP…COMLN8;;to screen²*3¼*)> Æ* D„TST9Ð*1Ú*„TST9'„CENDä* ‰} „TST1;;length?î*!„GETC;;do again.ø*…ATENDQ…MYBUF+ R>ƒEOL + F…INPUT+Q>;;check 'em +P„NCHK;;next time*+P…COMLN8;;and Š}erase cursr4+ #„IPUT>+,;;show good inputH+ :;;bye.R+X;\+X;Test input lengthf+X;p+„TST1Q„CEND;;get lengthz+ HƒTL2;;no.„+ ‹}P…COMLN;;erase 1st charŽ+P…COMLN;;and cursor˜+ƒTL2:;;bye.¢+X;¬+X;Erase error line¶+X;À+†CLRERR%>;;24 chars.Ê+Q> Œ};;to clearÔ+ƒCLEP…ERRLN8;;on lineÞ+1è+IƒCLE;;loop.ò+:;;so long.ü+X;,X;Print to device,X;,†DPRINTQ>…PUTRC;;put reco }rd$, $>„DDEV.,P…ICCOM9;;CIO command8,Q>4…MYBUF;;mybuf isB,P…ICBAL9;;the bufferL,Q>5…MYBUF;;hi byteV, P…ICBAH9`,Q>(;;40 Ž}bytes maxj, P…ICBLL9t,Q>~, P…ICBLH9ˆ,Q…MYBUF;;if chr is’,IƒPRT;;>128 invertœ, „INV2¦,ƒPRT „CIOV;;print it.°,G„STOP };;on error stopº,:Ä, „STOP7Î,7Ø, !†DCLOSEâ,X;ì,X;Calculate line addressö,X;-…CLCLNQ†ROWCRS;;y-pos - T?;;* 2->;;look }up the-Q„SCRN9;;screen memory(-PƒSCR;;address in2-Q„SCRN9;;table and<-PƒSCR;;store it.F- :;;bye.P-X;Z-X;Change d ‘}isplay betweend- X;Disassembly and display memn-X;x-…ALTERQ…DTYPE;;display type‚-N>Œ- P…DTYPE–-H†HAVMEM;;in display -Q ’}>ª- P„BBCK´-Q>!¾-H„ALT2;;finishÈ-†HAVMEMQ>Ò- P„BBCKÜ-Q>0æ-„ALT2P„PCNTð- Q†TOPADRú-PƒFR0.Q†TOPADR. PƒFR0 “}. !†TOEDEV".X;,.X;Find Break point6.X;@.†FNDBRKQ>;;say none foundJ. P„BSETT.%>;;try 6 B.P's^.„SET?Q„ADDR;;che ”}ck ifh.R…SETHI8;;MSB is same?r.H„UPLP;;not same.|.Q„ADDR;;match. try LSB†. R…SETLO8.H„UPLP;;no go.š.Q…OPSET8;;match.set •} yet?¤.F„UPLP;;no.®.Q…OLDOP8;;yes. restore¸.P‚OP;;old opcode.Â.#„BSET;;say set.Ì. :;;leave.Ö.„UPLP1;;decrease loopà.I„S –}ET?;;done? no.ê.:;;yes. leave.ô.X;þ.X;Go to correct DISA routine/X;/†FINLINQ…DTYPE;;type flag/H…FINL2;;1 = display&/ —}!‡DISAMEM;;disassemble0/…FINL2!†SHOMEM;;and display:/X;D/X;Set default GETKEY dataN/X;X/†SETKEYQ>;;set normal vidb/ P ˜}„INVSl/Q>@;;and upper casev/ P„CAPS€/:;and display:/X;D/X;Set default GETKEY dataN/X;X/†SETKEYQ>;;set normal vidb/ P )þþqdX;nX;--------------xX;PROGRAM TRACER‚X;--------------ŒX;–X;Get Key Routine X;ªX;This routine accepts a rš}aw´X;key press and converts it¾X;to ATASCII using the tableÈX;supplied in the OS.ÒX;܆GETKEYQ‚CH;;get key pressæ R›}>ÿ;;$FF?ðF†GETKEY;;yes. loopú$>ÿ;;now clear key&‚CH;;pressP„OLDC;;save press‚K0?" )>À;;192?, D‚K1;;no.6%>œ}š;;error 136@‚K1Qþþ8;;make asciiJP…OLDAC;;save itT R>€;;128?^F†GETKEY;;yes. try againh R>;;129?r H‚K2;;no.|Q„}INVS;;yes.†N>€;;flip inverseP„INVS;;statusš!†GETKEY;;go again¤‚K2R>‚;;130?®H‚K3¸Q„CAPS;;yes. flip capsÂN>@;ž};statusÌ P„CAPSÖ!†GETKEY;;go againà‚K3R>ƒ;;131?êH‚K4;;shift caps.ôQ>@;;make capsþ P„CAPS H†GETKEY‚K4R>„;;13Ÿ}2?H‚K5&Q>€;;control-caps0 P„CAPS: H†GETKEYD‚K5R>…;;skip this oneN F†GETKEYXQ„OLDC;;get pressb R>@;;64?lE‚K6 };;yes. +>vQ…OLDAC;;get ascii€ R>a;;97?ŠD‚K6”R>{žE‚K6¨Q„CAPS;;lower case²F‚K6¼L„OLDC;;mask bitsÆ!‚K0;;and d¡}o againЂK6$>;;scan for aÚ‚K7Q„KEYS9;;specialäR…OLDAC;;key pressîF‚K8ø0I‚K7  ‚K8F‚K9Q…OLDAC;;get ascii N¢}„INVS;;inverse bit*P…OLDAC;;save it4‚K9:;;and done>X;HX;Wait 15 jiffiesRX;\…WAIT5Q>;;get 0fP†RTCLOK;;zero clo£}kp‚W1Q†RTCLOKzR>;;at 15?„ H‚W1;;no.Ž:;;so long!˜X;¢X;Perform manual RTS¬X;¶…DORTS$„USRS;;get pointerÀ2ÊQ¤}…MYPG19;;RTS lo byteÔP„ADDR;;in trace adrÞ2èQ…MYPG19;;RTS hi byteòP„ADDR;;in trace adrü&„USRS;;update SP!„NSE¥}T;;add a 1 to adrX;X;Perform manual JSR$X;.…DOJSRQ„ADDR;;calc return8;;;address andBS>;;store it inL5;;the ¦}usersVQ„ADDR;;stack.`S>j$„USRS;;stk pntrtP…MYPG19;;install MSB~ 0;;down 1ˆ 7;;get LSB’P…MYPG19;;put it inœ§}0¦&„USRS;;new stk pntr°…DOJMP%>;;copy new traceºQ@„SAVD7;;address intoÄP„ADDR;;pointers.Î3;;HI byte.Ø Q@„SAVD7â¨} P„ADDRì :;;bye.öX;X;Thread an ML program X;…TRACE „GADR;;get trace adrQƒFR0;;save it.( P„ADDR2 QƒFR0<©} P„ADDRF †CLRWINP%>;;slo or fast?ZƒFSLQ„SLOF8d P…COMND8n1xIƒFSL‚ '„SLFSŒX;–X;SLFS = $FF for Slow mode ª}X; = $00 for Fast modeª$X; = $01 for Option step mode´X;¾ƒFSW †GETKEY;;get choiceÈR> F;;FAST?ÒH„SLO?;;no.Ü«}#„SLFS;;fast modeæF‚TNð„SLO?R> S;;SLOW?úF‚TN;;wrong!R> O;;O=option forHƒFSW;;step thruQ>" P„SLFS,‚TN †CLR¬}SCR;;clear screen6 †CLRWIN;;clear input@ †CLRCMD;;and promptJ…TLOOPQ„ADDR;;take addr andTP…USRPC;;put in Program^P„­}SAVD;;Counter, andhQ„ADDR;;instructionrP…USRPC;;save address.| P„SAVD† ‡DISAMEM;;disa this adr †SCROLL;;mo®}ve screenš%>;;install NOP's¤Q>ê;;(a NOP)®„DNOPP„NOPS8;;in area¸1ÂI„DNOP;;done?Ì …PAUSE;;wait?Ö †DOREGS;;up d¯}ate USRPCàQ…MYBUF;;get disa chrêI„GINS;;inverse?ô …POS15;;on status lineþQ>4†BRKPNT;;BRK REACHED %>5†BRKPNT!†°}EPRINT;;print it.„GINSR>?;;a '?' ?&H„NOBR;;no.0%>—;;yes. a No-inst:!…IOERR;;give error.D„NOBRQ‚OP;;get the Opcod±}eNR>`;;is it RTS?XH…NORTS;;no.b …DORTS;;do the RTSl!„TDNE;;all done.v…NORTSR>@;;RTI?€H„IJMP;;no.Š$„USRS;;get ²}USRP”#„USRS;;off stack.žQ…MYPG19;;proc status.¨P„USRP;;in REG²2¼ Q…MYPG19Æ P„ADDRÐ2Ú Q…MYPG19ä P„ADDRî &„US³}RSø!„TDNE;;all done.„IJMPR>L;;JMP? H„CPN2;;nope. …DOJMP;;do JMP !„TDNE;;done.*„CPN2R> ;;JSR?4H„CPN6;;nope.>´} …DOJSR;;make JSRH!„TDNE;;finished.R„CPN6R>l;;JMP ()?\H„CPN7;;no.f …DOJMP;;yes. get adrp%>;;look up JMPzQ@„Aµ}DDR7;;addr thru„5;;this adr.Ž 3;;up Y˜Q@„ADDR7;;get HI byte¢P„ADDR;;in addr¬7;;restore LSB¶P„ADDR;;in addrÀ!„¶}TDNE;;done.Ê„CPN7Q†BRAFLG;;branch?ÔF„CPN4;;not this one.ÞQ‚OP;;get Op.è%>;;loop 4 timesò„FBRAR„BRAL8;;bit not set·}?üF‡HAVBRA2;;YES. R„BRAH8;;bit set? F†HAVBRA;;YES. 1;;no.$ I„FBRA;;try next one.. X;8 X;Branch if bit setB X;L †¸}HAVBRAQ„USRP;;get processorV M„BBIT8;;mask bit.` F„NOTE;;off? yes.j †NEWADRQ„BRAN;;set up thet P„ADDR;;new branch~ Q„BRA¹}N;;address forˆ P„ADDR;;next time.’ „NOTE!„TDNE;;jam!œ X;¦ X;Branch if bit not set° X;º ‡HAVBRA2Q„USRP;;processorº}Ä M„BBIT8;;mask it.Î F†NEWADR;;off? yes.Ø !„TDNE;;no.â „CPN4%>;;ready to copyì ƒCINQ@„SAVD7;;the inströ P„NOPS8;;into»} NOP area 3;;for fall thru. )…NBYTE;;done? HƒCIN;;not yet. X;( X;Run the instruction2 X;< Q>;;kill intsF P…NMIE¼}NP =;;set interruptZ $>;;copy user memd „CPZ1Q…ZPAGE9;;into pagesn ?;;0 - 2.x Q…MYZPG9;;PAGE 0‚ P…ZPAGE9Œ C– P…MYZP½}G9  X;ª Q…STACK9;;PAGE 1´ ?;;(the stack)¾ Q…MYPG19È P…STACK9Ò CÜ P…MYPG19æ X;ð Q…PAGE29;;PAGE 2ú ?;;(interrupts) ¾}Q…MYPG29;;(and stuff) P…PAGE29 C" P…MYPG29, X;6 2@ H„CPZ1J @;;get stackT A;;in A^ $„USRS;;user stackh B;;pointer.¿}r P„USRS;;save my stack.| %„USRY;;get Y,† $„USRX;;get X, Q„USRP;;put on theš 5;;processor stat¤ Q„USRA;;get A® 8;;pulÀ}l status¸ „NOPS4;;* here is * 4;;* where the *Ì 4;;* instr goes *Ö 6;;push statusà P„USRA;;save Aê 7;;save statusôÁ} P„USRPþ &„USRX;;save X '„USRY;;save Y @;;put back stack A;;pointers& $„USRS0 B: P„USRSD =;;set for safetyN $>Â};;now copy backX X; ;pages 0 - 2b ƒCZPQ…ZPAGE9;;zero pagel ?v Q…MYZPG9€ P…ZPAGE9Š C” P…MYZPG9ž X;¨ Q…STAÃ}CK9;;the stack² ?¼ Q…MYPG19Æ P…STACK9Ð CÚ P…MYPG19ä X;î Q…PAGE29;;page 2ø ? Q…MYPG29 P…PAGE29 C P…MYPG29* X;Ä}4 2> HƒCZPH .;;clr interruptsR Q>@;;turn on the\ P…NMIEN;;interruptsf „TDNE †DOREGS;;show registersp Q„SLFS;;mode.z Å}G„TDN1;;Slow.„ F„TDN2;;Fast!Ž $>;;consol clear˜ &†CONSOL;;clear it.¢ ƒCNWQ†CONSOL;;get it¬ R>;;OPTION?¶ HƒCNW;;no.ÀÆ} &†CONSOL;;yes. zero it.Ê H„TDN2Ô „TDN1 …WAIT5;;wait 1/4 secÞ „TDN2!…TLOOP;;next instrè X;ò X;Move screen up 32 bytesü Ç}X;†MOVE32Q>4†MYSCRN;;screenP„IND2;;address inQ>5†MYSCRN;;Zpage addr$P„IND2;;so we can.Q„IND2;;the screen up8È},;;40 bytesBO> L P„INDRV Q„IND2`O>j P„INDRt$>;;line 0~„MOVE%>;;32 bytesˆ…MOVITQ@„INDR7’ P@„IND27É}œ1¦I…MOVIT;;loop.°Q„INDR;;copy toº P„IND2Ä Q„INDRÎP„IND2;;add a 32Ø ,;;to copyâO> ;;from.ì P„INDRö Q„INÊ}DRO>  P„INDR 2;;up line(>;;line 13?(H„MOVE;;no.2 :;;bye.<X;FX;Clear status linePX;Z‡ERASTAT%>Ë};;24 charactersdQ>;;a zeron…ERAS1P†STATLN8;;in linex 1;;next‚I…ERAS1;;go to it.Œ :;;bye.–X;  X;Decimal/HexadecimÌ}al ConvertªX;´„PRDHQ„HXDC;;# type¾P…SAVY2;;save itÈQ>;;full numberÒP…NBYTE;;lengthÜ „GADR;;get numberæQ> ;;mÍ}ake EOL a spcð P…MYBUF8úP…MYBUF8Q> =;;install =3 P…MYBUF8"3,'…SAVX2;;save Y6Q„HXDC;;# type@N>;;flip iÎ}tJP„HXDC;;and save againT$>;;copy in #^ ‡COPYNUMh &„CENDr$>;;now move #|%…SAVX2;;down in string†„CPN9Q…MYBUFÏ}9P…MYBUF8š(„CEND;;at end?¤F„AEND;;yes!®2¸3ÂH„CPN9;;go again.Ì„AENDQ>ƒEOL;;install EOLÖP…MYBUF8à …POSÐ}15;;on status lineêQ…SAVY2;;restore # typeô P„HXDCþ!„IOL3;;print it.X;X;Erase memoryX;&…ERASE „GADR;;start adÑ}dr0QƒFR0;;transfer to:P‚SL;;2 Zpage locsD QƒFR0N P‚SLX „GADR;;End addrb%>lQƒFR0;;is End :;;bye.H†Õ}NEWERR%>™;;ADR RANGER!…IOERR;;show it.BR‚SL H…NEWOK;;not yet.*„NEW2C;;and do last4P@‚SL7;;location.> :;;bye.H†)þþIdX;nX;-----------xX;I/O CONTROL‚X;-----------ŒX;–X;Print to command window X;ª…PCOMWP„INDR;;save address´×} '„INDR¾%>ȃPCAQ@„INDR7;;get a charÒP…COMND8;;on screenÜR>;;a '?'?æFƒPCN;;yes. done.ð3;;up countúHƒPCA;Ø};try againƒPCN:;;leaveX;X;Position cursor at line 15"X;, …POS15Q>6 P†ROWCRS@:JX;TX;Scroll Screen?^X;hÙ}†SCROLLQ†ROWCRS;;Y-posrR>;;14th line?|H„SCRL;;no.†…SCRL2 †MOVE32;;yes. scrollQ> ;;pos. 13š P†ROWCRS¤„SCRL!„IOÚ}L3;;print buffer®X;¸X;Pause screen scrollÂX;Ì…PAUSEQ‚CH;;key scanÖR>ÿ;;no touch?àF†CLRKEY;;yes.ê †CLRKEY;;cleaÛ}r it.ôR>;;was it ESC?þFƒPA2;;yup.R>!;;space bar?H†CLRKEY;;no. †CLRKEY;;clear.&ƒPA3Q‚CH;;wait again0R>!;;Ü}space?:F†CLRKEY;;yes.D R>;;ESC?NHƒPA3;;no. wait.XƒPA27;;have an ESC.b7;;pull RTSlX;vX;Clear key€X;Š†CLRKEYÝ}5;;save A”Q>ÿ;;clear CHžP‚CH;;to no touch¨7;;restore A² :;;leave.¼X;ÆX;Page thru DisaÐX;Ú †PGTHRUQ>4„PGTR;;priÞ}nt optionä%>5„PGTR;;Up or Down?î …PCOMWø„PGL2 †GETKEY;;get choice R> U;;Up? H„TDN?;;no.Q>;;put scroll up P…Pß}GWAY;;flag*H†PGLOOP;;do it!4„TDN?R> D;;Down?>H„PGL2;;no.HQ>;;insert scrollRP…PGWAY;;down flag\†PGLOOP †CLRCMD;;à}clear stufff †CLRWINp…PGJSR …PAUSE;;scroll!z Q…PGWAY„F„DWAY;;pause screen?Ž …SCRUP;;do again.˜ !…PGJSR¢„DWAY …SCRá}DN¬ !…PGJSR¶X;ÀX;Disassemble to a deviceÊX;Ô †DISDEV †COPFIL;;get filenameÞ „GADR;;and start adrèQ>;;open IOCB â}forò ‡OPENFIL;;write onlyüQƒFR0;;copy in adr P„ADDR QƒFR0 P„ADDR$ƒOLP ‡DISAMEM;;disa a line.Q> ;;remove ã}arrow8P…MYBUF;;in disaBQ…MYBUF;;LIƒDPRV „INV2`ƒDPR †DPRINT;;print itj ‡ERASTAT;;clear linet …POS15;;on stä}atus~Q>ƒEOL;;set so onlyˆP…MYBUF;;addr is shown’ „IOL3;;print disaœ Q‚CH;;key?¦R>ÿ;;no touch?°FƒOLP;;yes. go aå}gainº †CLRKEY;;clear itÄ ‡ERASTAT;;clear lineÎ!†DCLOSE;;close IOCBØX;âX;Get deviceìX;ö†GETDEV †CLRWIN;;no junkæ}Q>4‡DEVNAMS;;copy devices %>5‡DEVNAMS;;onto the …PCOMW;;screen„DEV2 †GETKEY;;get a key( R>;;ESC?2H…FNDEV;;no.<ç}7;;pull of the 2F7;;RTS's fromP7;;the stackZ7d:;;and leaven…FNDEV%>;;check if legalx„DEV3R„DEVS8;;device‚F†è}HAVDEV;;got one!Œ1;;not this–I„DEV3;;try next one  †GOTERR;;sorry wrongª!„DEV2;;go again´†HAVDEV:;;bye.¾X;ÈX;Scé}roll downÒX;Ü…SCRDN$>;;check if scræƒSCKA;;has info allðT?;;the way downú?;;to the lastQ„SCRN8;;screen line.ê}P„TEMP;;get the lineQ„SCRN8;;address from"P„TEMP;;table.,%>;;zero index6Q@„TEMP7;;get a char@F…DOWHL;;havë}e a spaceJ2;;try next lineT(>;;at 14 yet?^ HƒSCK;;no.h †FINLINr …SCRL2|$>;;copy the addr†ƒGX1Q†MYSCRN9;;fromì} the scr †IC2ASC;;into mybufšR> ;;a space?¤FƒGX2;;yes, done.®P…MYBUF9;;save it¸2;;next charÂHƒGX1̃GX2Q>ƒEí}OL;;insert EOLÖP…MYBUF9;;in mybufà%>ê „GET4;;make integerôQƒFR0;;now copy thisþP†TOPADR;;to TOPADRQƒFR0;î};for next time.P†TOPADR :;;done!&…DOWHLQƒLN2;;put second0PƒFR0;;address in FR0: QƒLN2DPƒFR0;;and disa alï}lN!†TOEDEV;;16 lines.XX;bX;Scroll uplX;v…SCRUPQ†TOPADR;;move down€;;;byte in memoryŠ S„BBCK”PƒFR0;;save in FR0ð}žQ†TOPADR¨S>;;take care of²PƒFR0;;Hi byte¼!†TOEDEV;;do it!ÆX;ÐX;Clear Command typeÚX;ä†CLRCMDQ>;;mañ}ke commandîP…COMND;;2 spacesø P…COMND :;;bye. X;X;Clear Command Window X;*†CLRWIN%>;;do 21 chars4Q>;;aò} blank>‚CWP…COMLN8;;in commandH1;;line bufferRI‚CW;;do next\:;;so long.fX;pX;Free break pointszX;„†FREBRK%>ó}Ž'„FREN;;none free˜„FRE1'…SAVEY;;save Y¢Q…SETLO8;;get addr¬PƒFR0;;and put in FR0¶ Q…SETHI8À PƒFR0Ê ‡BIN2HEX;;cô}onvert to hexÔ%…SAVEY;;get YÞ$…BRKLN8;;get pos on scrè%>ò„FRE2Q…LBUFF8;;hex digitü;;;make icode S>  P„FRLN9;õ};on screen 2$ 3. )>;;4 chars?8 H„FRE2;;no.B %…SAVEY;;restore YL Q…OPSET8;;BRK set?V H„FRE3;;yes.` #„FREN;;inc freeö} pointsj „FRE33;;up Yt )>;;6 BRK's yet?~ H„FRE1;;noˆ Q„FREN;;get free’ ,œ O>;;make icode¦ P„FRLN;;on screen° :÷};;all doneº X;Ä X;Break Point HandlerÎ X;Ø †BKPHAN †CLRCMD;;clear commsâ Q>";;a 'B'ì P…COMNDö  …INPUT;;get a line Dø}ƒBKG;;good? yes! :;;no. bye ƒBKGQ…MYBUF;;get number ;;;subtr 49 (0-5)( S>12 >;;save in X< R>F E…NUMER;;>5? yes.Pù} R>;;<0?Z D…NUMER;;yes.d Q…MYBUF;;next charn R>ƒEOL;;EOL?x F‡DORESET;;yes. reset it‚ %>Œ &…CNTLO;;save X–  „GTú}DR;;get addr  $…CNTLO;;restore Xª %>´ Q@ƒFR07;;get opcode¾ F…SETER;;BRK? yes.È Q…OPSET9;;set already?Ò F…SETIT;;no.Ü û} …SETER%>˜æ !…IOERRð …NUMER!†GOTERR;;BEEP!ú …SETITQƒFR0;;save address P…SETLO9 QƒFR0 P…SETHI9" Q@ƒFR07;;get opcü}ode, P…OLDOP9;;save it6 C;;zero Acc@ P@ƒFR07;;insert BRKJ #…OPSET9;;show setT !†FREBRK;;and leave^ X;h ‡DORESET †CLRCMý}D;;no junkr %>;;zero Y| Q…OPSET9;;Set yet?† F†RESER2;;no. error Q…SETLO9;;get addressš P„INDR;;of Bpoint¤ Q…SETHI9;;þ}and save in® P„INDR;;2 Zpage locs¸ Q…OLDOP9;;get old opcode P@„INDR7;;put it back.Ì C;;A = 0Ö P…OPSET9;;not set.à Pÿ}…SETLO9ê P…SETHI9ô !†FREBRK;;update freeþ †RESER2%>–;;give user !…IOERR;;Error # 150 X; X;Find memory& X;0 †FINDI}T †CLRCMD;;clear line: Q>;;a '?'D P…COMNDN P„NCHK;;don't checkX  …INPUT;;keys on inputb DƒFCS;;good inputl :;;byev ƒ}FCS%>;;check to see€ ƒFCPQ…MYBUF8;;if input endsŠ R>ƒEOL;;with an EOL” F„FCP2;;or a comma.ž R>,;;if comma the¨ F„FCP2};;get an address² P„MBF28;;also copy line¼ 3;;into a tempÆ )> ;;bufferÐ HƒFCPÚ „FCP2'„SLFS;;save Yä R>,;;a comma?î H}„FCP3;;no.ø  „GADR;;get address QƒFR0;;to start from ;;;subtract 1 S>;;from it. P‚SL;;and save it* QƒFR04 S>}> P‚SLH %>ÿ;;force aR H„FCP4;;branch\ „FCP3%>ÿ;;set up $FFFFf '‚SLp '‚SLz „FCP43„ '…DISKCŽ 'ƒSTL˜ 'ƒSTL};;end at $FFFF¢ †CLRSCR¬ ƒFC1Q‚SL;;add one to¶ ,;;current addrÀ O>Ê P‚SLÔ Q‚SLÞ O>è P‚SLò R>5…MYBUF;;at b}uffersü HƒFC9;;yet? no.Q‚SL R>4…MYBUF HƒFC9;;no.$Q>4†ENDBUF;;skip over.P‚SL;;the input8Q>5†ENDBUF;;and page 0-2}BP‚SL;;buffers.LƒFC9Q…DISKC;;first run?VFƒFC3;;yes.`Q‚SL;;at $0000?j L‚SLt HƒFC3;;no.~:;;yes. done.ˆƒFC3%}>;;second pass’ '…DISKCœ 1;;Y = 0¦ƒFC4Q@‚SL7;;a char°R„MBF28;;= to mbf2?º HƒFC1;;no.Ä3;;a match?Î)„SLFS;;done ye }t?Ø HƒFC4;;no.â „ZBUF;;set up bufferì$>;;to show whatöƒFC5Q„FTXT9;;find thisP…MYBUF9;;was and at 0;;what addres }sIƒFC5;;the stringQ‚SL;;was found at.(PƒFR02Q‚SL;;address< PƒFR0F ‡BIN2HEXP%>Z$>dƒFC6Q…LBUFF8;;H }ex addressn P…MYBUF9x0‚1ŒIƒFC6–Q> $;;add '$'  P…MYBUF9ªQ>ƒEOL;;add in the´P…MYBUF;;eol¾#ƒSTL;;up # of find }sÈHƒNH4Ò #ƒSTL܃NH4QƒSTL;;now add inæPƒFR0;;the find #.ð QƒSTLú PƒFR0$> &„HXDC ‡COPYNUM" …PAUSE };;pause?, †SCROLL;;scroll screen6!ƒFC1;;go again@X;JX;Load a binary fileTX;^†DOLOADQ> D;;filenameh …COPFLrQ>};;signal first|P„SLFS;;pass†Q>;;get bytesP†DISKC2;;savešQ>;;read only¤ ‡OPENFIL;;open file!® …READ2;;get 2 }bytes¸G„BLO2;;error? yes.ÂQƒBAL;;is header?Ì R>ÿ;;$FF?ÖH„BDLO;;no.àRƒBAL;;other one?êF…DLOAD;;yes. = $FFô„BD}LO%>•;;ERROR 149þ„BLO2'…SAVEY;;save it †DCLOSE;;close Device%…SAVEY;;get error!…IOERR;;and leave&…DLOAD …READ2;};2 more bytes0Q„SLFS;;pass = 1?: HƒCHD;;no.DQƒBAL;;copy loadNPƒFR0;;addr to safeXQƒBAL;;placeb PƒFR0l#„SLFS};;pass = 2vƒCHD †CHKHED;;$FF?€ …STRAD;;set startŠ …READ2;;2 more bytes” …ENDAD;;set end adrž †BUFLEN;;calc buf len¨} †GETDAT;;get stuff²G…LOADD;;if error done¼!…DLOAD;;keep going.Æ…LOADDC;;error in AÐ 5;;save itÚ †DCLOSE;;close de}vä7;;get errorî R>ˆ;;EOF?øH†LODERR;;no. Error! „ZBUF;;clear buffer %>;;'LOAD AT'ƒLLPQ…LODAD8  P…MYBUF8*14}IƒLLP> ‡BIN2HEX;;convert addrH%>;;to hex©R$> \„LLP1Q…LBUFF8;;insert #f P…MYBUF9p0z1„ I„LLP1ŽQ> $;;add} a '$'˜ P…MYBUF9¢Q>ƒEOL;;install EOL¬ P…MYBUF ¶ …POS15;;on STAT:À!„IOL3;;print it.ʆLODERR?;;in YÔ!…IOERR;;show} errorÞX;èX;Read in 2 file bytesòX;ü…READ2Q>4ƒBAL;;point toP‚SL;;2 byte buffer Q>5ƒBAL P‚SL$Q>;;only 2 }bytes.PƒBLL;;in length8Q>;;and fall thruBPƒBLL;;to getrecLX;VX;Get file segment`X;j†GETREC$>„DDEV;;Devicet}Q†DISKC2;;command~ P…ICCOM9ˆQ‚SL;;buffer adr’ P…ICBAL9œ Q‚SL¦ P…ICBAH9°QƒBLL;;buffer lengthº P…ICBLL9Ä QƒBLL}Î P…ICBLH9Ø!„CIOV;;get itâX;ìX;Calculate buffer lengthöX;†BUFLENQƒENL;;take end and ;;;subtract startSƒSTL;};to calc lengthPƒBLL( QƒENL2 SƒSTL< PƒBLLFQƒBLL;;then add 1P ,;;for CIOZO>dPƒBLLn QƒBLLxO>;;a}dd carry‚ PƒBLLŒ:;;and leave–X; X;Put in start addrªX;´…STRADQƒBAL;;move in start¾PƒSTL;;addressÈ QƒBALÒ} PƒSTLÜ:æX;ðX;Put in end addrúX;…ENDADQƒBAL;;move in endPƒENL;;addr. QƒBAL" PƒENL,:6X;@X;Chec}k if headerJX;T†CHKHED$ƒBAL;;first byte^ 2;;up by 1hF„TNXT;;zero? yes.r :;;nope.|„TNXT$ƒBAL;;second byte† 2;;up} itF…ITSFF;;zero? yes.š :;;no.¤…ITSFF!…READ2;;2 more bytes®X;¸ X;Get DATAÂX;̆GETDATQƒSTL;;set up startÖP‚SL;; }loadind addrà QƒSTLê P‚SLô!†GETREC;;and load itþX;X;Open DiskX;‡OPENFILP…DISKC;;save I/O& †DCLOSE;;clo!}se IOCB0Q…DISKC;;get I/O type:$>„DDEV;;device chanDP„AUX19;;in AUX1NQ>;;AUX2 = 0X P„AUX29bQ>;;open commandl P"}…ICCOM9vQ>4†FILNAM;;point to€P…ICBAL9;;filenameŠ Q>5†FILNAM” P…ICBAH9ž „CIOV;;open it!¨G…OPENR;;sorry error.²:;;g#}ood open.¼…OPENR7;;pull RTSÆ7;;and show errorÐ !…IOERRÚX;äX;Copy filenameîX;ø†COPFIL †GETDEV;;device.…COPFL5;$};save it P†FILNAM;;in filenameQ>ƒEOL;;3 char is EOL P†FILNAM* 7;;device4R> D;;to Disk?>FƒTOD;;yes.H:;;no fna%}me.RƒTOD †CLRCMD;;clr window\ Q>;;a ?f P…COMNDp …INPUT;;get namezD„CQP1;;if good branch„7;;pull RTSŽ7˜:;;next&} command¢„CQP1$>;;offset is 2¬%>;;zero Y¶„COPLQ…MYBUF8;;charÀR> ,;;a comma?ÊF…GNAME;;yes.ÔR>ƒEOL;;EOL?ÞF…GN'}AME;;yes.èP†FILNAM9;;save in nameò3;;up pointersü2(>;;18 chars yet?H„COPL;;no.%>¥;;Fname error$7.78!…(}IOERR;;show itB…GNAMEQ>ƒEOL;;add EOLLP†FILNAM9;;to FnameV :;;leave`X;jX;Save a FiletX;~†DOSAVEQ> D;;Fnameˆ …CO)}PFL’Q> ;;put bytesœ P†DISKC2¦ „GADR;;save start°QƒFR0;;copy itºPƒSTLÄ QƒFR0Î PƒSTLØ „GADR;;save endâQƒF*}R0;;copy itìPƒENLöQƒFR0;;is end;;write onlyZ ‡OPENFIL;;open it!dQ>ÿ;;Install headernPƒBAL,}x PƒBAL‚ …READ2;;put it outŒG„SIOR;;error–QƒSTL;;start bytes PƒBALª QƒSTL´ PƒBAL¾ …READ2;;put themÈ G„-}SIORÒQƒENL;;end bytesÜPƒBALæ QƒENLð PƒBALú …READ2;;put them G„SIOR †BUFLEN;;calc length †GETDAT;;and sa.}ve it" G„SIOR,!†DCLOSE;;close it6…SIOR2%>™;;ADR ERROR@ „SIORCJ5T †DCLOSE^7h?r!…IOERR;;show it|X;†!X;This /}is the command text andX;addresses of routinesšX;plus string positions for¤X;Show command.®X;¸†CMDTXT A‰QDRN*CGLSA0} A‰BT-=FPH.EĂCMDADR †DOSCMD;;QuitÖ …ALTER;;Displayà †DOREGS;;Registersê …CREGS;;New registerô †DISMEM;;*=addrþ1} †CHGMEM;;Change „GMEM;;Go †DOLOAD;;Load †DOSAVE;;Save& †BKPHAN;;Break pnt han0 …TRACE;;Trace: …SCRUP;;-D 2}…SCRDN;;=N †FINDIT;;FindX †DISDEV;;Printb †PGTHRU;;High speedl „PRDH;;.v …ERASE;;Erase€X;ŠX;Disassembler Vector3}s”X;ž…DCOMT …IMMED;;immediate¨ „ZPAG;;Zpage² …ZPAGX;;Zpage,X¼ …ABSOL;;AbsoluteÆ †ABSOLX;;Absolute,XÐ †ABSOLY;;A4}bsolute,YÚ „INDX;;(indirect,X)ä „INDY;;(indirect),Yî …ACCUM;;Accumulatorø „RELA;;Relative ƒIMP;;Implied  „INDI;;5}(indirect) …ZPAGY;;Zpage,Y †STRPOS == ===*X;4X;Screen line address table>X;H„SCRN †MYSCRN ;;ln 0R6} †MYSCRN! ;;ln 1\ †MYSCRNA ;;ln 2f †MYSCRNa ;;ln 3p †MYSCRN ;;ln 4z †MYSCRN¡ ;;ln 5„ †MYSCRNÁ 7};;ln 6Ž †MYSCRNá ;;ln 7˜ †MYSCRN ;;ln 8¢ †MYSCRN! ;;ln 9¬ †MYSCRNA ;;ln 10¶ †MYSCRNa ;;ln 11À8} †MYSCRN ;;ln 12Ê †MYSCRN¡ ;;ln 13Ô …ERRLN;;ln 14Þ †STATLN;;ln 15è ƒBAL =ò…DRPOS == ==ü„BRKS9} = „EXEC …BRKLN == ===„TKEY =$X;. X;Branch Instrs + branch bits8X;B„BRAL =P==ÐL„B:}RAH 0=p=°=ðV„BBIT €=@==`X;jX;Custom Display ListtX;~…DLIST p=p=p=Bˆ …LINE1’ == =Bœ †MYSCR;}N¦ ===° ===º ===Ä = =BÎ …LINE2Ø ==â ===ì ===Aö …DLISTX;<} X;Screen MemoryX;1…LINE1 €=A  DEBUG+ by: Bryan Schappel A(+ €=A  ADDR B1 B2 B3 MNEMONICS A21…LINE2 =}€=A  PC| A| X| Y|SP|NV_BDIZC|MODE A<,„PCNT A  | | | | | |DISA AF €=A‡ INPUT:AP Z…COMND A‚ Ad>}…COMLN A An A‡ Ax €=A‡ ERROR:A‚ Œ%…ERRLN A˜ A– €=A‡ STAT:A  ª?}&†STATLN A˜ A´+ €=A BRK1|BRK2|BRK3|BRK4|BRK5|BRK6|FRA¾,„FRLN A  | | | | | |00AÈ@}X;ÒX;Run and trace data tablesÜX;æ „USRA ð „USRX ú „USRY  „USRS  „USRP …USRPC ="X;,X;RegistA}er Table6X;@†REGTAB „USRAJ „USRXT „USRY^ „USRSh „USRPr „BITS ===== =@=€|X;†X;Icode/Asc convert B}tablesX;šƒA2I @== =`¤ƒI2A  =@==`®X;¸X;BRK point data tablesÂX;Ì …SETLO =====;;LSBÖ …SETHC}I =====;;MSBà#…OLDOP =====;;opcodeê!…OPSET =====;;flagôX;þX;Special Key presses XD}; „KEYS ÿ=þ=ý=Ÿ=ž  =œ=›==~&  }====0  : X;D X;Error codes numbersN X;X „ERRS €=‚=‰=Š=‹b E} =’=¢=¤=¥l  §=©=ª=•v  –=—=˜=™€ X;Š X;Error code addresses” X;ž †ERRTAB „I128=„I130=„I137¨  „I138=„I139=F}„I144²  „I146=„I162=„I164¼  „I165=„I167=„I169Æ  „I170=„I149=„I150Ð  „I151=„I152=„I153Ú X;ä X;Miscellaneous Text & DevsîG} X;ø ‡DEVNAMS A†(D,P)?A!„PGTR A†(U,D)?A !„SLOF Aˆ(S,F,O)?A!†REGTXT Aˆ(AXYSP)?A !„DEVS A‚DPA*!†FILNAM AŠ : A4!H} A„ A=ƒEOL>!…REGIS A…AXYSPAH!†BRKPNT ABRK POINT FOUNDAR!…LEGAL ›=œ=~=A‚,.A\!†HEXDIG A0123456789ABCDEFAf! A”GHIJI}KLMNOPQRSTUVWXYZAp!„FTXT A†FIND #Az!†COMMAX Aƒ,X)A„!†COMMAY AƒY,)AŽ!…LODAD A‡LOAD ATA˜!X;¢!X;English Error Codes¬!X;¶!J}„I128ABREAK KEY ABORTAÀ!„I130A‘NO DEVICE HANDLERAÊ!„I137ATRUNCATED RECORDAÔ!„I138AŽDEVICE TIMEOUTAÞ!„I139AŠDEVICEK} NAKAè!„I144AWRITE PROTECTEDAò!„I146A‘FUNCTION NOT DONEAü!„I162A‰DISK FULLA"„I164A‘FILE NUM MISMATCHA"„I165ABADL} FILE NAMEA"„I167A‹FILE LOCKEDA$"„I169AŽDIRECTORY FULLA."„I170AŽFILE NOT FOUNDA8"„I149AFILE NOT BINARYAB"„I150ANM}O SET BRK POINTAL"„I151AŽINVALID OPCODEAV"„I152ABRK POINT SETA`"„I153AADR RANGE ERRORAj"X;t" X;These are the mnemoniN}cs for~"X;the disassembler. They areˆ""X;arranged here in alphabetical’" X;order.œ"X;¦"ƒMNE AADCANDASLBCCBCSA°" ABEQBITO}BMIBNEBPLAº" AÂÒËBVCBVSCLCCLDAÄ" ACLICLVCMPCPXCPYAÎ" ADECDEXDEYEORINCAØ" AINXINYJMPJSRLDAAâ" ALDXLDYLSRNOPORAAì" AP}PHAPHPPLAPLPROLAö" ARORRTIRTSSBCSECA# ASEDSEISTASTXSTYA # ATAXTAYTSXTXATXSA# A†TYA???A#X;(# X;Opcodes2#X;<# †OPCQ}ODEF# i=e=u=m;;ADCP# }=y=a=qZ# )=%=5=-;;ANDd# ==9=!=1n#  ===;;ASLx# ‚# ;;BCCŒ# °;;BCS–# R}ð;;BEQ # $=,;;BITª# 0;;BMI´# Ð;;BNE¾# ;;BPLÈ# ;;BRKÒ# P;;BVCÜ# p;;BVSæ# ;;CLCð# Ø;;CLDú# X;;CLI$ S}¸;;CLV$ É=Å=Õ=Í;;CMP$ Ý=Ù=Á=Ñ"$ à=ä=ì;;CPX,$ À=Ä=Ì;;CPY6$ Æ=Ö=Î=Þ;;DEC@$ Ê;;DEXJ$ ˆ;;DEYT$ I=T}E=U=M;;EOR^$ ]=Y=A=Qh$ æ=ö=î=þ;;INCr$ è;;INX|$ È;;INY†$ L=l;;JMP$  ;;JSRš$ ©=¥=µ=­;;LDA¤$ ½=¹=U}¡=±®$ ¢=¦=¶=®;;LDX¸$ ¾Â$  =¤=´=¬;;LDYÌ$ ¼Ö$ J=F=V=N;;LSRà$ ^ê$ ê;;NOPô$  === ;;ORAþ$ ==V}=% H;;PHA% ;;PHP% h;;PLA&% (;;PLP0% *=&=6=.;;ROL:% >D% j=f=v=n;;RORN% ~X% @;;RTIb% `;;RTSl% W}é=å=õ=í;;SBCv% ý=ù=á=ñ€% 8;;SECŠ% ø;;SED”% x;;SEIž% …=•=;;STA¨% =™==‘²% †=–=Ž;;STX¼% „=”=ŒX};;STYÆ% ª;;TAXÐ% ¨;;TAYÚ% º;;TSXä% Š;;TXAî% š;;TXSø% ˜;;TYA&X; & X;Offsets into Mnemonic table&X; & †OFFSET*&Y} =======;;ADC4& =======;;AND>& ====;;ASLH&  ;;BCCR&  ;;BCS\& ;;BEQf& =Z};;BITp& ;;BMIz& ;;BNE„& ;;BPLŽ& ;;BRK˜& !;;BVC¢& $;;BVS¬& ';;CLC¶& *;;CLDÀ& -;;CLIÊ& 0;;CLVÔ& 3=[}3=3=3;;CMPÞ& 3=3=3=3è& 6=6=6;;CPXò& 9=9=9;;CPYü& <=<=<=<;;DEC' ?;;DEX' B;;DEY' E=E=E=E;;EOR$'\} E=E=E=E.' H=H=H=H;;INC8' K;;INXB' N;;INYL' Q=Q;;JMPV' T;;JSR`' W=W=W=W;;LDAj' W=W=W=Wt' Z=Z=]}Z=Z=Z;;LDX~' ]=]=]=]=];;LDYˆ' `=`=`=`=`;;LSR’' c;;NOPœ' f=f=f=f;;ORA¦' f=f=f=f°' i;;PHAº' l;;P^}HPÄ' o;;PLAÎ' r;;PLPØ' u=u=u=u;;ROLâ' uì' x=x=x=x;;RORö' x( {;;RTI ( ~;;RTS( ===;;SBC( =_}==(( „;;SEC2( ‡;;SED<( Š;;SEIF( ===;;STAP( ==Z( ==;;STXd( “=“=“;;STYn( –;;TAXx( ™;`};TAY‚( œ;;TSXŒ( Ÿ;;TXA–( ¢;;TXS ( ¥;;TYAª( ¨;;???´(X;¾(X;Instruction TypesÈ(X;Ò(X; 0 = ImmediateÜ(X; 1 = Zero a}pageæ(X; 2 = Zero page,Xð(X; 3 = Absoluteú(X; 4 = Absolute,X)X; 5 = Absolute,Y)X; 6 = Indirect,X)X; 7 = Indirect,Y")b}X; 8 = Accumulator,)X; 9 = Relative6)X;10 = Implied@)X;11 = IndirectJ)X;12 = Zero page,YT)X;^) …ITYPEh) ====c}===;;ADCr) =======;;AND|) ====;;ASL†)  ;;BCC)  ;;BCSš)  ;;BEQ¤) =;;BIT®)  ;;Bd}MI¸)  ;;BNEÂ)  ;;BPLÌ)  ;;BRKÖ)  ;;BVCà)  ;;BVSê)  ;;CLCô)  ;;CLDþ)  ;;CLI*  ;;CLV* ======e}=;;CMP* ==;;CPX&* ==;;CPY0* ===;;DEC:*  ;;DEXD*  ;;DEYN* =======;;EORX* =f}==;;INCb*  ;;INXl*  ;;INYv* = ;;JMP€* ;;JSRŠ* =======;;LDA”* == ==;;LDXž* ==g}==;;LDY¨* ====;;LSR²*  ;;NOP¼* =======;;ORAÆ*  ;;PHAÐ*  ;;PHPÚ*  ;;PLAä*  ;;PLPî* h}====;;ROLø* ====;;ROR+  ;;RTI +  ;;RTS+ =======;;SBC +  ;;SEC*+  ;;SED4+  ;i};SEI>+ ======;;STAH+ = =;;STXR+ ==;;STY\+  ;;TAXf+  ;;TAYp+  ;;TSXz+  ;;TXA„+  ;;TXSŽ+ j}  ;;TYA˜+  ;;???¢+X;¬+…MYBUF(;;I/O buffer¶+„MBF2;;temp save buffÀ+…MYZPG;;zero pageÊ+…MYPG1;;stackÔ+…MYk}PG2;;page twoÞ+†ENDBUF ;;end of buffersè+†MYSCRN½;;scr mem 3pgsò+X;ü+à, „DISA,eÊ+…MYPG1;;stackÔ+…MYbþþ) X; STRSORT.SRCX;%X; *******************************%X; * SORT ROUTINE *%X; * m} *%X; * A=USR(A,B,C,D,E) *%X; * *%X; * A=ADR OF ROUTINE * n}%X; * B=ADR OF STRING * %X; * C=RECORD LENGTH * %X; * D=DEPTH OF SORT * %X; * E=#o} OF RECORDS *%X; * *%X; *******************************X;PX; X; EQUATESp} X; -------#X;(„SADRË;; ADR OF RECORD2"…HSADR;; ADR OF DATA STRINGF„RLEN;; RECORD LENGTHP„DEEP;; DEPq}TH OF SEARCHZ„TEMP;; TEMP DATA BUFFERd„NREC;; # OF RECORDSn …SSADRÍ;; ADR OF 2ND RECORDxƒFLG;; SWITCHED r}FLAG‚X;ŒX; INITIALIZE‘X; ----------–X; 7;; # OF ARGUMENTSª7;; GET STRING ADR HI´ P…HSADR¾7;; GET STRING ADRs} LOÈ P…HSADRú7;; IGNORE HI BYTE7;; GET RECORD LENGTH P„RLEN7;; IGNORE HI BYTE"7;; GET DEPTH OF SORT, P„DEEP67t};; IGNORE HI BYTE@7;; GET # RECORDSJ P„NRECLX;MX; MAIN PROGRAMNX; ------------OX;T …STARTYQ…HSADR;; BEGINNINu}G^P„SADR;; OF DATA STRINGc P…SSADRh Q…HSADRr P„SADR|,†O„RLEN;; CALCULATE ADR OF P…SSADR;; NEXT HIGHEST RECORv}Dš D†START2¤ #…SSADR® †START2³Q>;; INITIALIZE FLAG¸PƒFLGÂ$>;; RECORD COUNTÌ …NCMPRÑ%>;; POINT TO 1ST CHAw}RÖ„CMPRÛ Q@„SADR7;; COMPARE CHARACTERSàR@…SSADR7;; IN EACH RECORDêD„NEXT;; IN RIGHT ORDERôH†SWITCH;; IN WRONG ORDERþx}3;; EQUAL, SO NEXT CHAR)„DEEP;; REACHED SORT „EQUA&OF S¡¡¡NG AALIG>>>NNNPPP+++LOLOLFLAH†SWITCH;; IN WRONG ORDERþaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ/