–-MàL éý ¬­ X­¬®ð c0¬±C)HÈCð±CH Mh¨hÝ©À h ¨`­eC¨¥Di„C…DŒ` Œ  ©R­y„H©PŒ©€Êð ® Ð® à *  1ŒÆH0®芢@)Т€Ž Yäˆ0æ¦.Ș`ÿ[`ù#(PMRÒÒÒÒÒÒÒ\ \b Æ Pg©i»©¼¢Ž ¶ ½Ë0 š ð  ¹% ™ˆ÷½ËÉ@°¼Ã / ÊÐÕ ®Š™`ˆÐúîd­ ç¬ ¢ì Þè0˜øÈÊîŒèèèè½ðÉDÐô©D©Ô©LŒÿ<œþþ‚èX;SAVE #D2:DUP.M65òAAºDISK UTILITY PROGRAMS (DUP) VER 3.0 for DOS 2.5 01/10/85AüX;X;'X;CHANGED FOR SYSTEM RES‚T -- DUPFLG,X;ADDED INTERRUPT ROUTINES FROM SIO -- KB$.X;ADDED SAVE/RESTORE OF DOSINI VECTOR -- KB./X;Modified this mess‚ýfor DOS 2.5 -- 1/85 MER8X;BTX;*******************************************************************************L7X; ‚HIS IS FINAL VERSION OF DUP ---- 2.5 ----VSX;*****************************************************************************‚`ýX;jX;tX; CODE ALIGNMENT MACROS:~&X; (to test for 2.0s compatibility)ˆX;’"…@ORG ;; BUMP ORG IF NECESSARYœ   ‚†@SPACE  ° ºÄ   Ά@SPACE  Ø ACODE ALIGNMENT!AâìöX; /‡@ALIGN ;; ASSURE CODE IS AT P‚OPER AýDDRESS   †@SPACE  ( ACODE ALIGNMENT!A2<FX;P>D2:DUPEQU.M65Z>ŽD2:DUPINIT.M65d>ŽD2:DUPL‚AD.M65n>D2:DUPMEMSV.M65x>D2:DUPSUB.M65‚X; .INCLUDE #D2:DUPSIO.M65Œ>D2:DUPBUF.M65–>ŽD2:DUPCMD1.M65 >D2‚DUPDIR.M6ý5ª>D2:DUPDEL.M65´>ŽD2:DUPCOPY.M65¾>ŽD2:DUPCMDS.M65È>D2:DUPDOS.M65Ò>ŽD2:DUPCMD2.M65Ü>D2:DUPDUP.‚65æ>D2:DUPFIL.M65ð>D2:DUPTST.M65ú>ŽD2:DUPSAVE.M65>ŽD2:DUPMISC.M65X; †ENDDUP 65–>ŽD2:DUPCMD1.M65 >D2‚DUPDIR.M6Õþþ‚èX;SAVE #D2:DUPEQU.M65òA‡EQUATESAüX; **** EQUATES ****X;X;X;$ ƒCIOVä. …DKHNDSä3,†SECSIZ€;; Assu‚e 128 byte sectors only8†SETVBV\äB†SYSVBV_äL†XITVBVbäV†CIOINVnä`7†POKMSK;; Pokey interrupt mask (shadow ‚ ýor IRQEN)j-…IRQENÒ;; IRQ interrupt enable on pokeyt†MEMTOPå~ †BRKKEYˆ †DOSVEC ’†DOSINI ;;DOS INIT VECTOR‚ †WARMST¦ †LMARGNR° †RMARGNSº†CARTSTú¿Ä3‡INTRVEC ;;INTERRUPT VECTOR LOC FOR SIO PATCHÎ …MEMLOç؆SHFL‚K ý¾â†INITADâì …RUNADàö †ICHIDZ  †ICDNOZ!  †ICBALZ$ †ICBAHZ% †ICIDNO.( †MAXDEV!2†HATABS‚†USRDOSF ƒFMSP†FMINITƒFMSàZ7†DRVBYT ;; Drive byte - tells which drives exist.dƒDOSƒFMS@n!†WRMSTR‚tä;;WA ýRM START VECTORx?…BSIORr;;ENTRY POINT TO FMS DISK HANDLER USED BY DUP DISK‚X;Œ ‚CR›– …SPACE   ƒCUPª ƒ‚DN´ ƒCLF¾ ƒCRTÈ ƒDLLœÒ …CLSCR}Ü(ƒEOFˆ;;ENDFILE RETURN CODE FROM CIOæX;ðX;ú „OPEN …CLOSE  †‚UTCHR  ý †GETCHR" †GETREC, †PUTREC 6 †RENAME @ †DELETE!J †FORMATþO9ˆFORCEFMTý;; Forces sgl or dbl fo‚mat (aux1 is flag)T „LOCK#^ †UNLOCK$h0†STAREQS;;STATUS COMMAND TO DISK CONTROLLERrX;| …IOCB1†X;3†DVSTAT‚;;ADDRESS OýF STATUS INFO STORED BY OSšX;¤X;® ƒDCB¸…DUNITƒDCB†DCOMNDƒDCB̆DSTATSƒDCBÖ†DBUFLOƒ‚CBà†DBUFHIƒDCBê„DSLOƒDCB ô„DSHIƒDCB þX; „IOCB@…ICHID„IOCB…ICDNO„IOCB&…ICCOM„IOCB‚0…ICSTA„IOCýB:…ICBAL„IOCBD…ICBAH„IOCBN…ICBLL„IOCBX…ICBLH„IOCB b…ICAX1„IOCB l…ICAX2„IOCB‚ vX;€ …SYSEDŠ …OWRIT” †ORDWRT žX;¨X;²(X; **** ZERO PAGE VARIABLES ****¼X;ÆX;ÐÚ †JMPTBLä‚ …RAMLOî>†BUFAýDR…RAMLO;;SAVE AREA FOR BUFFER ADDRESS USED BY USEPGMøX;X; X; Equates within FMS:X; '‡VTOCPTR‚E;; Address of VTOC buffer*/‡MAXVTOC;; Maximum byte index w/ in VTOC4.†ENTSTK ;; Stack pointer on entry to FMS>/†R‚VTOCT;; Routine toý read vtoc from diskH-†WRVTOC”;; " " write " to "RX;Equates within FMS:X; '‡VTOCPTR‚E;; Address of VTOC buffer*/‡MAXVTOC;; Maximum byte index w/ in VTOC4.†ENTSTK ;; Stack pointer on entry to FMS>/†R‚VTOCT;; Routine toFþþ‚ èX;SAVE #D2:DUPINIT.M65òA’DUP INITIALIZATIONAü$X; **** INIT CODE FOR DUP ****X;X;>X; INITIALIZATION ‚ODE FOR DUP - CALLS FMS INIT CODE.$0X; CALLED ON WARM START AND COLD START..X;8$X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;B‚ýX;L$í;; Message for wrong DUP diskV1‰:WRONGDUP }=A™Need DOS2.5,type Y ÒÅÔÕÒÎA=‚CR`-…@ORG ;; Make sure there's en‚ugh roomjX;t$X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~X;ˆ,Ø;; ??? SPACE FOR ADDITIONAL INIT CODE’%‡NEWINITT†DRVBYT;; Disa‚le ýRAMDISKœ V†DRVBYT¦Q> 1° P…DFDRVºX;ÄX; Try to load "RAMDISK.COM"ÎX;Ø Q>4†:RAMFNâ $>5†:RAMFNì ‡TRYLOAD;; and ‚ry to loadöX;#Q>4‚AF;; Try to load AUTORUN.SYS  $>5‚AF !‡TRYLOADX;(†:RAMFN AD:RAMDISK.COMA=‚CR2X;<$X;;;;;;;;‚;;;;;;ý;;;;;;;;;;;;;;;;;FX;P0X; Code for PRINTMSG which checks for dup 2.5ZX;d†CHK2.5Q>LnR…DOSOS;; Check for DUP2.5‚ H‡:NOT2.5‚ !„CIO1ŒX;–'‡:NOT2.5Q>;; Set DUP not in memory  P†DUPFLGªQ>4‰:WRONGDUP´$>5‰:WRONGDUP¾3 …WAITY;; Prin‚ message ýand wait to load 2.0 DUPÈ !‡:NOT2.5ÒX;Ü$X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;æX;ð*X; Rev A SIO patch (a la Paul ‚aughton)úX; †ISRBUGQ; H…:BUG1!ê" …:BUG1C,56!³ê@X;J$X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;TX;^…@ORG ƒDOS‚  h‰ýCALLRVTOC@r &†ENTSTK| †RDVTOC†%>:š‰CALLWVTOC@¤ &†ENTSTK® †WRVTOC¸%>Â:ÌX;Ö …DFDRV 1àX;‚$X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ôX;þ X; Start of main DUP.SYS codeX;*‡@ALIGN ƒDOS;; Check for dos org=$1540Q>‚&PƒOPT0 Q>4ý…MNDUP: P†DOSVECD Q>5…MNDUPNP†DOSVECXX;b1Qœê;; Check for Rev A and patch, if necessarylR>v H‡‚NEWROM€ Q>4†ISRBUGŠP‡INTRVEC” Q>5†ISRBUGžP‡INTRVEC¨X;²X; Initialize file manager¼X;Ƈ:NEWROM †FMINITÐ4‚4ä4îX;ø‡@ýALIGN d+Q†WARMST;;ON COLDSTART, LOAD AUTORUN.SYS /H†CKMDOS;;WARMSTART CHECK IF DUP WAS RUNNING ‡NE‚INIT :*X;4&X; Subroutine to load files at boot>X;H‡TRYLOADP…ICBALR &…ICBAH\0 …INITX;;CLEAR DUPFLG SHOW DUP ‚OT IN MEMORY.fQ>Àpý0 †STLOAD;;LOAD, INIT AND RUN THE AUTORUN FILEz0!…CLOSX;;MAKE SURE IOCB #1 IS CLOSED & RETURN„X;Ž‚‡@ALIGN }˜,†CKMDOSQ†DUPFLG;;SEE IF DUP WAS IN MEMORY¢F…INITX;;=ZERO THEN WASN'T¬X;¶0Q†MEMFLG;;SEE IF USER AREA WRITT‚N TO MEM.SAVÀF†CLDSET;ý;=ZERO THEN WASN'TÊ) †LDMEM1;;ELSE GET USER MEMORY BACK INÔX;Þ' †RELDIN;;RELOAD SAVED DOSINI VEC‚ORè$ …INITX;;CLEAR DUP IN MEMORY FLAGò †WRMSTR;;REDO WARMSTARTüX; $…INITXQ>;;SAY DUP NOT IN MEMORY P†DUPFLG;;CLEAR‚FLAG :$ X;. (†CLDSETP†WAýRMST;;NO VALID USER MEMORY8 F…INITX;;SET TO COLD STARTK INÔX;Þ' †RELDIN;;RELOAD SAVED DOSINI VEC‚ORè$ …INITX;;CLEAR DUP IN MEMORY FLAGò †WRMSTR;;REDO WARMSTARTüX; $…INITXQ>;;SAY DUP NOT IN MEMORY P†DUPFLG;;CLEAR‚FLAG :$ X;. (†CLDSETP†WA7þþ‚èX;SAVE #D2:DUPLOAD.M65òAŽLOADER ROUTINEAü!X; **** LOADER ROUTINE ****X;X;5X; LOADS FROM THE FILE (M‚ST BE LOAD FORMAT)$!X; INTO MEMORY. RETURNS:.X; X=0 LOAD OK8(X; X=1 OPEN ERRORS Y=CIO CODEB(X; ‚ ý X=2 READ ERRORS Y=CIO CODELX; X=3 BAD LOAD FILEV0X; ON ENTRY, IOCB 1 POINTS TO FILENAME.`X;j‡@ALI‚N t.†DUPFLG ;;FLAG -IF DUP IN MEMORY NOT ZERO~/ƒOPT ;;HOLDS VALUE OF OPTION GIVEN BY USERˆ>†LOADFG ;;FLAG = $80 ‚F M ýEMORY FILE DOESN'T HAVE TO BE LO’ …HDBUFœ†SFLOADQ>€¦†STLOADP†LOADFG°„LOADQ>4ƒRTSº P…RUNADÄ Q>5ƒRTSÎ-P…RUNAD‚;;MAKE RUN AT EOF DEFAULT TO RTSØ$>â Q>„OPENì P…ICCOM9öQ>;;OPEN TYPE=INPUT P…ICAX19  †CIOOPN;;TRY TO OPEN FI‚EI„ ýRDLF;;CONT IF OKQ>;;OPEN ERRORS(H„CLFX;;CLOSE AND EXIT2 „RDLF$>< Q>4„DBUFF P…ICBAL9P Q>5„DBUFZ P…ICBAH9d‚Q>n P…ICBLL9xQ>‚ P…ICBLH9Œ&P†MEMLDD;;CLEAR MEM.SAV LOADED FLAG– Q>†GETCHR  P…ICCOM9ª ƒCIO´G„ERST;;IF ERRS¾‚>ÿÈ$R„D !ýBUF;;CHECK FOR VALID LOAD FILEÒ H„LNLFÜ R„DBUFæ$H„LNLF;;BRANCH IF NOT A LOAD FILEð …RDDRC$>ú Q>4…HDBUF ‚…ICBAL9 Q>5…HDBUF P…ICBAH9"Q>,†RDDRC1P…ICBLL96Q>@ P…ICBLH9J) ƒCIO;;NO ERROR CHECK SO CAN CATCH EOFTI„STOK;‚IF NO ERROR^ "ý)>ˆ;;SEE IF EOFhH„ERST;;IF SOME ERROR STATUSrX;|X;EOF SO DONE, EXIT†X; …CLOSX;;CLOSE IOCB'S 1 AND ‚š*ƒOPT¤"G„DRUN;;BRANCH IF NO RUN OPTION®$ †JMPRUN;;JUMP THROUGH RUN VECTOR¸„DRUNQ>;;OK STATUS *†LOADFG;;WAS MEMORY‚SWAPPED?Ì P†LO #ýADFGÖ*G„CLFX;;BRANCH IF MEMORY WASN'T SWAPPEDà) †MEMSVQ;;DOES MEMORY SAVE FILE EXIST?êG…DRUN1;;BRANCH IF ‚OTô7þ7&!„GOOD;;WRITE MEMORY AND RELOAD DUPX;MX; SEE IF DUP WRITTEN OVER. IF IS RELOAD & TELL USER NEED MEM.‚AV TO&X; L $ýOAD THIS FILE.0X;:'…DRUN1Q†DUPFLG;;SEE IF DUP CLOBBEREDDH…DRUN2;;NO, THEN RETURNN(Q>4„NMSF;;ELSE TEL‚ USER NEED MEM.SAVX $>5„NMSFb ‡PRNTMSG;;PRINT MSGl!…RRDUP;;RELOAD & RUN DUPvX;€%X; RETURN TO CALLING ROUTINEŠ‚X;”$…DRUN2Q>;;NO D %ýUP ERR MSG ON EOFž „CLFX>¨ƒRTS:²X;¼X; ERROR RETURNSÆX;ЄLNLF …CLOSXÚQ>;;BAD LOAD F‚LEä H„CLFXî „ERSTCø5 …CLOSX 7?  H„CLFX*X;4>X; CONTINUE WITH LOAD - CHECK LOAD ADDRESS FOR HEADER>2X; ‚ HEADER IF HAVE CONC &ýATENATED LOAD FILESHX;R „STOK$>\Q…HDBUF;;MOVE PARAMS TO IOCBf P…ICBAL9p5z Q…HDBUF„ P…‚CBAH9Ž?˜7¢3;;WAS ADDRESS FF?¬H„ADOK;;BRANCH IF NOT¶?À3;;OTHER BYTE FF?ÊH„ADOK;;BRANCH IF NOTÔX;ÞOX; H‚VE A HEADER & START ADDRESS 'ý - GET END ADDRESS FOR TEXT & DO AGAINèX;ò Q…HDBUFü P…HDBUF Q…HDBUF P…HDBUF;;MOV‚ LOAD ADDRESS Q>4…HDBUF$ P…ICBAL9. Q>5…HDBUF 8 L‚ !†RDDRC1V X;` 8X; GET (ýLENGTH OF TEXT. THEN DETERMINE IF IN DUPj X;t /X; *** The NOP's in the next section of code~ ‚X; are there only to make changed codeˆ 0X; occupy the same space as the old DUP 2.0s’ 0X; code. Since the new version w‚s shorter,œ 0X; filler was requi )ýred (The new version also¦ X; works!).° X;º „ADOKQ…HDBUFÄ ;Î S…HDBUFØ P…ICBLL9â ‚…HDBUFì S…HDBUFö P…ICBLH9 Q…HDBUF *R>5…NMDUP ;; IS BEGINNING PAST DUP? 4 E„ANWD;; BRANCH IF SO( Q…HDB‚F2 R>5„NDOS;; IS END BELOW DUP?< *ý 4F EƒAWD;;BRANCH IF NOTP X;Z 8X; SINCE TEXT IN DUP, LOAD MEM.SAV IF NECCESARYd‚X;n „ANWDQ†MEMLDDx *GƒAWD;;BRANCH IF MEM.SAV ALREADY LOADED‚ Q>€Œ L†LOADFG– 7P†LOADFG;;SET MEM.SAV DOESN'T HAVE TO BE L‚ADED FLAG  ƒAWD#…ICBLL9ª H…:AWD1´ #… +ýICBLH9¾ 0…:AWD1*†LOADFG;;DOES MEMORY HAVE TO BE LOADEDÈ GƒDLM;;BRANCH IF NOTÒ (Q†MEM‚DD;;WAS MEM.SAV ALREADY LOADED?Ü GƒDLM;;BRANCH IF SOæ "†MEMLDDð - …LDMEM;;LOAD MEM.SAVE FILE (IF IT EXISTS)ú )Q>;;SHOW U‚ER AREA NOT DUP IN MEMORY P†DUPFLG 1 †R ,ýELDIN;;RESTORE DOS IN VECTOR FROM SAVED LOC X;" EX; SET NO INIT ADDR DEFAU‚T THEN READ IN TEXT & ATTEMPT INIT, X;6 ƒDLM$>@ Q>4ƒRTSJ P†INITADT Q>5ƒRTS^ 'P†INITAD;;INIT DEFAULTS TO AN RTSh & ‚CIO;;READ DATA DIRECTLY TO MEMORYr I„DLM1|  -ý!„ERST;;IF ERRORS† „DLM1*ƒOPT "G…DINIT;;BRANCH IF NO GO OPTIONš  †JMPINT;;DO‚INIT¤ /…DINIT!…RDDRC;;GET NEXT SECTION OF LOAD FILE® X;¸ 2X; *** A subroutine existed here in DOS 2.0s to 3X; supposedly ‚heck for a load file overwritingÌ 0X; DUP.SYS. .ý It didn't work properly, so theÖ 1X; code was rewritten without the subrou‚ine.à /X; The final result used less code than theê X; original!ô X;þ BX; But we must fill up the old space... so here's‚the old code: „AWDQR>5„NDOS *D…AWDQR;;BRANCH IF /ýHI BYTE LT DUP START R>5…NMDUP & U?0 N>: V?;;COMPLEMENT CARRYD‚ …AWDQR:N X; *** End of unused code!X ‡@ALIGN b X;l X;v †JMPINT!@†INITAD:€ †JMPRUN!@…RUNAD:Š X;” X;ž †MEMLDD ‚ ‚AF AŽD1:AUTORUN.SYSA=‚CR² /„NMSF AŸNEED MEM.SAV TO 0ýLOAD THIS FILE.A=‚CR R>5…NMDUP & U?0 N>: V?;;COMPLEMENT CARRYD‚ …AWDQR:N X; *** End of unused code!X ‡@ALIGN b X;l X;v †JMPINT!@†INITAD:€ †JMPRUN!@…RUNAD:Š X;” X;ž †MEMLDD ‚ ‚AF AŽD1:AUTORUN.SYSA=‚CR² /„NMSF AŸNEED MEM.SAV TO þþ‚ èX;SAVE #D2:DUPMEMSV.M65òA“CREATE MEM.SAV FILEAü(X; **** CREATE MEM.SAV FILE ****X;X;+X;ROUTINE WRITTEN ‚Y M.E., APRIL 21,1980$…OWRIT;;º P…ICAX19;;Ä …OREST;;OPEN FOR WRITEÎ%G…ERRWR;;IF ERROR THEN JMP AND RETØX;âX‚ìX;WRITE MEMORY BLOCKöX; Q>†PUTCHR  P…ICCOM9)Q>4„NDOS;;STORE START OF BLOCK FOR CIO P…ICBAL9(Q>5„NDOS;;START AD‚R (HIG4ýH)2 P…ICBAH9<!Q>4„MLEN ;;LENGTH OF BLOCKF P…ICBLL9PQ>5„MLEN;;LENGTH(HIGH)Z P…ICBLH9d ƒCIO;;WRITE DATA BLOC‚n#G…ERRWR;;IF WRITE ERROR THEN JMPx …CLOSX‚ G…ERRWRŒ%>–ƒRET: X;ª…ORESTQ>4„OPEN´ P…ICCOM9¾7Q>4„NAME;;ROUTINE ‚O COMPLET5ýE OPEN OF 'D1:MEMORY.SAVÈ3P…ICBAL9;;CALLING SUB SUPPLIES 'READ' OR 'WRITE'ÒQ>5„NAME;;IN ICAX1Ü P…ICBAH9æ !†CIO‚PNðX;ú%…ERRWR:;; Return with error statusûX;ü=†CIOOPNQ…DFDRV;; Set default drive for MEM.SAV and DUP.SYSý PˆMEMSVDRVþ‚ P†DUPDRVÿ6ý!ƒCIOX;@J0X; **** ENTRY POINT ON 'DOS' CALL ****TX;^X;c …@ORG œh%†INISAV ;;DOSINI VECTO‚ SAVE LOCr †MEMFLG | …MNDUP$>† &†MEMFLG &†LOADFGš0¤ &†WARMST® †INITIO¸X;Â/ †MEMSVQ;;FIND OUT IF FILE D1:MEM‚SAV EXISTSÌ'I„7ýGOOD;;BRANCH IF MEM.SAV FILE EXITSÖQ>à"P†WARMST;;CLEAR WARM START FLAGê F…FINALôX;þX;,„GOOD †MWRI‚E;;WRITE USER AREA TO MEM.SAV G…ERROR "†MEMFLG;;SHOW MEMORY WRITTEN& G…FINAL0X;:,…ERRORQ>4†ERRMES;;PRINT ERROR OCCUR‚D MSGD $>5†ERRMES8ýN ‡PRNTMSG;;GOTO MSG PRINTERXX;b"Q>4ƒERR;;PRINT QUERY TO RUN DOSl $>5ƒERRq,…WAITY ;; Print message‚and wait for 'Y'v ‡PRNTMSG;;GOTO MSG PRINTER€X;Š!X; WAIT FOR Y TO RUN DOS”X;ž Q>†GETREC¨ P…ICCOM² Q>4„STAK¼‚P…ICBALÆ Q>5„STAKÐ 9ýP…ICBAHÚQ>ä P…ICBLLîQ>ø P…ICBLH ƒCIO Q„STAK;;SEE IF Y TYPEDR> Y H†RTCART;;BRANCH IF‚NOT*Q>4 P†WARMST>X;H …FINAL$> R Q>…CLOSE\!P…ICCOM9;;SET UP CLOSE COMMANDf ƒCIO;;PERFORM CLOSE COMMANDpX;z'…R‚DUPQ†DOSINI;;SAVE DOS IN:ýIT VECTOR„ P†INISAVŽQ†DOSINI˜P†INISAV¢X;¬#Q>4ƒDOS;;SET UP DUP INIT ADDR AS¶P†DOSINI;‚DOS INIT VECTORÀ Q>5ƒDOSÊP†DOSINIÔX;Þ†RRDUP1Q>4†DUPSYSè$>ò P…ICBAL9ü Q>5†DUPSYS P…ICBAH9 %> ''ƒOPT;;A‚SURE NO /N OPTION IN EFFECT;ý$ 1;;SHOW THAT DUP IS IN MEMORY. '†DUPFLG8 $ †SFLOAD;;LOAD DUP.SYS AND RUN ITB †RTCART:L ‚EC ‚‚E:A=‚CR’ †DUPSYS AŠD1:DUP.SYSA=‚CR— †DUPDRV†DUPSYSœ X;¦ 2†ERRMES A ERROR-SAVING USER MEMORY ON DISKA=‚CR° &ƒERR A—TY‚E Y TO STILL RUN DOSA=‚CRFFECTøþþ‚èX;SAVE #D2:DUPSUB.M65òA”RESIDENT SUBROUTINESAü2X; **** SUBROUTINES FOR RESIDENT DUP ****X;X;6X; ‚OUTINE TESTS IF MEM.SAV IS PRESENT ON THE$(X; RETURNS - MINUS IF NOT THERE./X; PLUS IF MEM.SAV IS T‚=ýERE8X;= …@ORG sB"†MEMSVQ †CLOS20;;CLOSE IOCB # 2L Q>„OPENV P…ICCOM9` Q>4„NAMEj P…ICBAL9t Q>5„NAME~ P…ICBAH9ˆ Q‚†ORDWRT’2P…ICAX19;;TRY TO OPEN D1:MEM.SAV FOR READ/WRITEœ †CIOOPN¦6;;SAVE STATUS° †CLOS20;;CLOSE MEM.SAVº8;;RESTORE‚STA>ýTUSÄ:ÎX;ØX;âGX; SAVE FILE SUBROUTINE - WRITE FILE BODY, INIT, & RUN VECTORSìX;ö+„WDR1Q>;;THIS IMMEDIATE‚VALUE MODIFIED2F„WDR2;;BR IF MEM FILE DOESNT HAVE TO BE LOADED  …LDMEM „WDR2$>& ƒCIO;;DO SAVE - WRITE BODY TO DISK‚3…INI?ýTQQ>;;THIS IMMED VALUE CHANGED DURING SAVE22F„RUNQ;;SET TO FF WHEN AN INIT VECTOR IS PRESNT< #…INITQF Q†INITAD‚+P…VECTR;;IF INIT VECTOR FOR FILE SAVE ITZQ†INITADd P…VECTRn Q>4†INITADx>‚ P„LDSTŒ Q>5†INITAD– …WRVEC +„RU‚QQ>;;TH@ýIS IMMEDIATE VALUE MODIFIEDª3F†NORNAD;;SET TO FF WHEN A RUN VECTOR IS PRESENT´ #„RUNQ¾ Q…RUNADÈ*P…VECTR;;IF ‚UN VECTOR FOR FILE SAVE ITÒ Q…RUNADÜ P…VECTRæ Q>4…RUNADð>ú P„LDST Q>5…RUNAD …WRVEC#†NORNAD …CLOSX;;CLOSE ‚OCBS 1 &2" AýQ†MEMFLG, M„WDR16 F†DRRDUP@/#„WDR1;;RESET MEM.NEEDS TO BE LOADED FLAGJ!†RRDUP1;;RELOAD & RUN DUPT)†D‚RDUP!…DOSOS;;RUN THE SWAPPED IN DUP^X;hX;rX;|…WRVECP„LDST†2 &„LDNDš P„LDND¤$>® Q>4„LDST¸ P…ICBAL9‚Q>5„LDSTÌ P…ICBýBAH9ÖQ>à P…ICBLL9êQ>ô P…ICBLH9þ#!ƒCIO;;WRITE INIT OR RUN ADDRESSX;X;X; JUMP TO CART‚IDGE&X;0†CLMJMP …LDMEM:%Q>;;SHOW DUP NO LONGER IN MEMORYD P†DUPFLGN* †RELDIN;;RESTORE DOS INIT VECTOR SAVEDX !@†CA‚TST:;;JUMP TO CARTCýRIDGEbX;lX;v=X; LOAD MEM.SAV (IF IT EXISTS) BEFORE RUN AT ADDRESS€X;Š+„LMTR …LDMEM;;LOAD MEM‚SAVE IF IT EXISTS”*Q>;;SHOW THAT DUP NO LONGER IN MEMORYž P†DUPFLG¨* †RELDIN;;RESTORE DOS INIT VECTOR SAVED²!@…RAMLO:‚;RUN AT ADDRESS¼X;ÆDý5X; RESTORE DOSINI VECTOR FROM SAVED LOCATIONÐX;Ú†RELDINQ†INISAVä P†DOSINIîQ†INISAVø‚†DOSINI: X;X; X; SUBROUTINE - LDMEM*%X; LOAD MEM.SAV IF IT EXISTS4X;>…LDMEMQ†MEMFLGH'H†LDMEM1‚;BRANCH IF MEMORY WAS SAEýVEDR:\†LDMEM1 †MEMSVQf.I†LDMEM2;;BRANCH IF MEM.SAV FILE DOES EXISTp%Q>;;TELL CART PGM AREA C‚OBBEREDz P†WARMST„"F…CLOS2;;GO CLOSE AND GOTO CARTŽX;˜†LDMEM2Q>„OPEN¢ P…ICCOM9¬ †CIOOPN;;REOPEN MEM.SAV¶ Q>†GETCHR‚ P…ICCOM9ÊQ>4„MLEN ÔFý P…ICBLL9Þ Q>5„MLENè P…ICBLH9ò Q>4„NDOSü P…ICBAL9 Q>5„NDOS P…ICBAH9  ƒCIO$ …CLOS2Q>…C‚OSE. P…ICCOM98 !ƒCIO;;CLOSE MEM.SAVB X;L ;X; CLOSE ALL IOCBS & RE-OPEN ZERO AS SCREEN EDITORV X;` 2†INITIO †CIOINV‚;THIS ROUTINE CLOSES ALL IOCB'GýSj #;THEN REOPENS THE SCREEN EDITORt $>~ Q>„OPENˆ P…ICCOM9’ Q>4‚ECœ P…ICBAL9¦ Q>5‚EC°‚ P…ICBAH9º Q>†ORDWRTÄ P…ICAX19Î !ƒCIOØ X;â X; CLOSX - CLOSE IOCBS 10,20ì X;ö …CLOSXQ>…CLOSE $> P…ICCOM9  ƒCI‚ X;( (X; ENTRY TO CLOSE IHýOCB # 2 ONLY2 X;< †CLOS20$> F Q>…CLOSEP P…ICCOM9Z †:GOCIO!ƒCIOd X;n X; SUBROU‚INE - PRNTMSGx KX; PUTS A CHARACTER STRING TERMINATED BY A CARRIAGE RETURN CHAR TO‚ X; SCREEN EDITOR.Œ X;– 0X;‚ ENTRY - REG A : LOW BYTE MSG AIýDDRESS  /X; REG X : HI BYTE MSG ADDRESSª X;´ =X; PUT PARAMS IN IOCB‚- USE IOCB 0 FOR SCREEN EDITOR¾ X;È 2‡PRNTMSGP…ICBAL;;SET MSG ADDR IN IOCB BUFF ADDRÒ &…ICBAHÜ X;æ X; SET UP REST ‚F IOCBð X;ú $>;;SET IN BUFFER LENGTJýH !&…ICBLH;;ASSUME 256+ BYTES MAX 0" Q>†PUTREC;;PUT MSG, P…ICCOM1 42 46 X;@ I‚; TEST IF DUP IS RESIDENT - IF IS THEN USE INDIRECT CIO ROUTINEJ 'X; TO TEST FOR BREAK KEY ABORTT X;^ 1Q†DUPFLG‚;=ZERO IF NON-RESIDENT DUP NOT IN MEMh 1F†Ký:GOCIO;;IN MEMORY THEN USE INDIRECT CIO CALLm ‡@ALIGN ¾r ?ˆOLDPRMSG!†CHK2.5;; ‚o to insure that dup.sys is version 2.5| X;† X; „SAVH ÿ=ÿš „LDST¤ „LDND® …VECTR¸ X; ,X; Allow for 3 VTOC‚buffers of 144 bytes.Ì )X; (128 bytes plus 3 LýVTOCs w/ 16 bytesÖ (X; extra data in comparison to 2.0s)à …@ORG |€‚ …MDEND ô  þ / …MDEND;;SET END ADDR IN FMS PAST RES DUP SO >X; ;BUFFERS DON'T CLOBBER I‚. „STAK 144 bytes.Ì )X; (128 bytes plus 3 Úþþ‚èX;SAVE #D2:DUPSIO.M65òAREV A SIO PATCHAü4X; **** SIO INTERRUPT SERVICE ROUTINES ****X;X;9X; EQU‚TES FOR INTERRUPT ROUTINES MOVED FROM SIO$X;.X; ZERO PAGE8X;B1†BUFRLO2;;POINTER TO BYTE TO SEND OR RECEIVEL ‚NýBUFRHI3V2†BFENLO4;;POINTER TO BYTE AFTER END OF BUFFER` †BFENHI5j/†CHKSUM1;;LOC TO STORE DATA FRAME CHECKSUMt+†C‚KSNT;;;CHECKSUM SENT FLAG- =FF SENT~8†NOCKSM<;;FLAG NO CHECK SUM TO BE RECEIVED-NOT ZEROˆ/†STATUS0;;HOLD FOR STATUS ‚O BOýE PUT IN DCB’0†BUFRFL8;;FLAG-IF FF RECEIVE BUFFER IS FULLœ7†RECVDN9;;FLAG RECEIVE NOT DONE. USED BY WAIT LOOP¦4†PO‚MSK;;POKEY INTERRUPT MASK SHADOW FOR IRQEN°X;º=X; HARDWARE REGISTERS USED IN SIO INTERRUPT ROUTINESÄX;Î0…SKRE‚ Ò;;PýSERIAL PORT STATUS RESET ON POKEYØ&†SEROUT Ò;;SERIAL OUTPUT REGISTERâ1…SERIN†SEROUT;;SERIAL PORT INPUT REG ON POK‚Yì,…IRQENÒ;;IRQ INTERRUPT ENABLE ON POKEYö/†SKSTATÒ;;SERIAL PORT STATUS REG ON POKEYX; 'X; ERROR CODES RET‚RNED BY SQýIOX;%†FRMERRŒ;;FRAMING ERROR ON INPUT(3†OVRRUNŽ;;DATA FRAME OVER RUN-BIT D5 IN SKSTAT2(†CHKERR;;DATA ‚RAME CHECKSUM ERROR<FHX; **** INTERRUPT SERVICE ROUTINE TO OUTPUT DATA NEEDED ****PX;ZX;dX;n@X; IT‚UPDATES THE RýBYTE TO PUT ON SERIAL I/O BUS POINTERxGX; UNTIL END OF BUFFER. AFTER EACH UPDATE OF THE PTR ADDS THE‚IX‚ VALUE OF THE BYTE TO THE CHECKSUM. OUTPUTS THE CHECKSUM WHENŒKX; PTR EQUALS THE END OF BUFFER PTR (POINTS TO ‚YTE AFTER BUFFESýR).–JX; RETURNS TO THIS ROUTINE AFTER CHECKSUM PASSED AND RESETS POKEY IX; INTERRUPT REG TO HAV‚ THE TRANSMIT DONE ROUTINE CALLED TO ENDª(X; WAIT LOOP (SEE SIO LISTING).´X;¾X; K.B. 6/10/80ÈX;Ò †ISRODN‚;;SAVE Y REG ON STTýACKÜ5æX;ð #†BUFRLOú'H†NOWRP0;;INCREMENT PTR TO NEXT BYTE#†BUFRHI;;TO SENDX;,X; PATCH T‚ ROUTINE - CHANGED CHECK"X;,1†NOWRP0Q†BUFRLO;;CHECK IF PTR IS WITHIN BUFFER6+R†BFENLO;;DO A DOUBLE PRECISION SUBTRACT@ ‚†BUFRHIJ S†BFENHIT3UýD†NOTEND;;BRANCH IF (BUFR) < (BFEN)-MORE TO SEND^X;h*Q†CHKSNT;;TEST IF CHECKSUM ALREADY SENTr#H†REL‚NE;;BRANCH IF ALREADY SENT|X;†&X; SEND CHECKSUM AND SET FLAGX;š Q†CHKSUM¤+P†SEROUT;;PUT CHECKSUM IN SERIAL OUT‚REG®"†CHKSNT;;SET FLAGVý TO FF HEX¸H†CHKDON;;RETURNÂX;ÌJX; AFTER CHECKSUM SENT AND CAUSE NEXT INTERRUPT THEN CHAN‚E POKEYÖKX; MASK TO ENABLE TRANSMIT DONE INTERRUPT AND TERMINATE WAIT LOOP.àX;ê"†RELONEQ†POKMSK;;GET POKEY MASKô‚>;;OR IN ENABLEþ P†POKMSWýK!P…IRQEN;;ENABLE THE INTERRUPTSX;#X; RESTORE REGS AND RETURN&X;0 †CHKDON7:?;;R‚STORE Y REGD57;;RESTORE A REG SAVED IN OS IRQ INTERRUPT HANDLERN9XX;b=X; MORE TO SEND. SEND NEXT BYTE POINTED A‚ BY BUFR.lX;v†NOTEND%>€XýQ@†BUFRLO7;;GET NEXT BYTEŠ"P†SEROUT;;PUT IN SERIAL OUT REG”X;ž,¨!O†CHKSUM;;ADD BYTE TO ‚HECKSUM²O>¼ P†CHKSUMÆX;Ð-!†CHKDON;;GO RETURN AND WAIT FOR NEXT BYTEÚX;ä9X; ******** END OF OUT SERVICE ROU‚INE ********îøDX; **** SERIYýAL INPUT READY INTERRUPT SERVICE ROUTINE ****X; X;X; FX; AFTER SERIAL ‚ECEIVE IS ENABLED ROUTINE IS USED TO COLLECT*CX; BYTES FROM THE SERIAL INPUT REG AND PUT THEM IN BUFFER.4EX; W‚LL STOP WHEN BUFFER IS FULL. IF A CZýHECKSUM IS EXPECTED>EX; ROUTINE WILL MARK BUFFER FULL AND CONTINUE. WHEN CHECKSUM‚BX; RECEIVED IT WILL CHECK IF = TO CHECKSUM IT WAS MAKING.R7X; WILL STORE ERRORS FOUND IN STATUS LOCATION.\X‚fLX; THE IRQ INTERRUPT HANDLER I[ýN THE OS PUSHES THE USER'S A REGISTERp7X; ONTO THE STACK BEFORE CALLING THIS R‚UTINE.zX;„X; K.B. 6/11/80ŽX;˜ †ISRSIRC;;SAVE Y REG ON STACK¢5¬X;¶0X; GET STATUS FROM POKEY THEN RE‚ET IT.ÀX;Ê Q†SKSTATÔ'P…SKRES;;IGNORES \ýVALUE- JUST STROBEDÞX;èX; CHECK FOR ERRORSòX;ü*G†NTFRAM;;BIT 8 SET IF‚NO FRAMING ERROR %>†FRMERR #'†STATUS;;SET FRAME ERROR STATUS X;$ 2†NTFRAMM> ;;IF BIT 5 CLEAR THEN FRAME OVER RUN. "H†N‚OVRN;;BRANCH IF NO OVER RUN8 %>†OVRRUNB *'†S]ýTATUS;;ELSE SET OVERRUN ERROR STATUSL X;V HX; CHECK IF BUFFER FULL AND T‚IS IS A CHECKSUM. IF IT IS, THEN` )X; CHECK IF DATA SENT WAS VALID.j X;t 3†NTOVRNQ†BUFRFL;;TEST FOR BUFFER FULL (NOT‚ZERO)~ 0F†NOTYET;;IF ZERO THEN NOT YET, THIS IS ^ýDATA.ˆ !Q…SERIN;;ELSE THIS IS CHECKSUM’ R†CHKSUM;;ARE THEY EQUAL?œ F†SRETR‚;;YES,THEN RETURN¦ -%>†CHKERR;;ELSE SET CHECK SUM ERROR STATUS° '†STATUSº X;Ä -X; SET RECEIVE DONE TO END WAIT LOOP΂X;Ø †SRETRNQ>ÿ;;DONE VALUEâ P†RECVDNì X;ö #X; _ý RESTORE REGS AND RETURN X; †SUSUAL7 ?;;RESTORE Y REG 7;;RES‚ORE A REG( 92 X;< LX; IF BYTE IS DATA, THEN GET HERE. PUT BYTE IN BUFFER AND CHECK IFF X; AT END OF BUFFER.P‚X;Z †NOTYETQ…SERIN;;GET DATA BYTEd %>n %P@†BUFRLO`ý7;;STORE IT IN THE BUFFERx X;‚ ,Œ &O†CHKSUM;;ADD DATA BYTE TO CHECKS‚M– O>  P†CHKSUMª X;´ *#†BUFRLO;;INCREMENT POINTER TO LOCATION¾ H†NTWRP1;;FOR NEXT BYTE INPUTÈ #†BUFRHIÒ X;Ü 9X; ‚ THE PATCH CHANGED THE TEST FOR END OF BUFFERæ X;ð 0†NTaýWRP1Q†BUFRLO;;DO DOUBLE PRECISION SUBTRACTú R†BFENLO Q†BUFRHI "‚†BFENHI;;CARRY CLEAR IF BORROW :D†SUSUAL;;BRANCH IF (BUFR) < (BFEN)-WITHIN BUFFER LIMIT" X;, 7X; DONE WITH DATA. SE‚ IF CHECKSUM TO BE SENT6 X;@ &Q†NOCKSM;;IF = ZERO THEN A CHbýECKSUMJ F„GOON;;WILL FOLLOW THE DATAT X;^ #Q>;;ELSE NO CHECK‚UM TO FOLLOWh #P†NOCKSM;;CLEAR NO CHECKSUM FLAGr /F†SRETRN;;RETURN AFTER SET RECEIVE DONE FLAG| X;† 4X; SET BUFFER FU‚L AND THEN GO GET CHECKSUM X;š ,„GOON"†BUFRFL;;SET BUFFER FULcýL FLAG TO FF¤ H†SUSUAL;;GO RETURN® X;¸ KX; ******** E‚D OF RECEIVE SERIAL INPUT INTERRUPT ROUTINE ******** …MDEND ê  ô / …MDEND;;SET END ADDR IN FMS PAST RES DUP SOþ >X; ‚ ;BUFFERS DON'T CLOBBER IT. „STAKýþþ‚èX;SAVE #D2:DUPBUF.M65ò.A§BUFFERS - BEGINNING OF NON-RESIDENT DUPAüHX; ******** BEGINNING OF NON-RESIDENT PORTION‚ OF DUP ********X;X;3„NDOS|;;END OF THE SYSTEM BUFFERS AND MINIDUPB „NDOSLƒPAR(;;PARAMETER AREAj „LINE‚eý;;TYPE IN LINE BUFFERt„LBUF„LINEˆ"„DBUF;;DATA BUFFER FOR COPY’ƒDB1„DBUF€œƒDB3„DBUF ƒDBL;; DATA BUFF‚R LENGTH.„EDBLú;;DATA BUFFER LENGTH USED IN USEPGM( †MENUSZ2 ƒPER< „UNNOF „RCNTP …SSTATZ „SWDPd‚„CSfýRCn „CDESx „SAVX‚ ƒPTRŒ „IPTR– ƒCTR  ‚T1ª6†BUFLEN‚T1;;SAVE AREA FOR BUFR LEN, USED IN USEPGM‚!…STVEC;;A TEMP OF SOME KIND¾9†MLT125…STVEC;;TEMP STORE FOR MULTIPLE OF 125, USEPGMÈ2;; Junk!!! Just takes up spac‚ for agýlignmentÒ0†EOFFLG;;ENDFILE FLAG FOR SOURCE IN DUPFILÜ0„FTRF;;FIRST TIME READ FLAG USED IN DUPFILæ@†TWODRV„FT‚F;;FLAG TO SHOW IF 1 OR 2 DRIVES. USED IN DUPDISKð ƒDTH ƒEDN A‚E:A=‚CRLE OF 125, USEPGMÈ2;; Junk!!! Just takes up spac‚ for aÂþþ‚ èX;SAVE #D2:DUPCMD1.M65òA’MAIN MENU ROUTINESAüX; **** DOS MENU ****X;X;…DMENU …CLSCR$( A¡DISK OPERATIN‚ SYSTEM II VERSION A. €=A… 2.5 A8) AšCOPYRIGHT 1984 ATARI CORP.A=‚CR=‚CRB, A¡A. DISK DIRECTORY I. FORMAT DISKA=‚CRL/‚ iýA¤B. RUN CARTRIDGE J. DUPLICATE DISKA=‚CRV, A¡C. COPY FILE K. BINARY SAVEA=‚CR`, A¡D. DELETE FILE(S) L. BINARY LO‚DA=‚CRj/ A¤E. RENAME FILE M. RUN AT ADDRESSA=‚CRt/ A¤F. LOCK FILE N. CREATE MEM.SAVA=‚CR~/ A¤G. UNLOCK FILE ‚O. jýDUPLICATE FILEA=‚CRˆ. A£H. WRITE DOS FILES P. FORMAT SINGLEA=‚CR’ ƒCDN=ƒCDN=ƒCDN=ƒCDN=ƒCDNœ …DMEND ¦…DULEN…DMEND‚DMENU°X;º‡@ALIGN u Ä…DOSOS!†:DOSOSÎX;Ø>…DUJPT †DIRLST=…STCAR=†CPYFIL=†DELFIL=†RENFIL=…LKFIL=…ULFILâ7 …WBOOT=†FMT‚SK=†DU kýPDSK=†SAVFIL=…LDFIL=„BRUN=†MEMSAVì †DUPFIL=†SGLFMTö!…DUNUM;;NUMBER OF FUNCTIONS 0X; **** DISK OPERATING ‚SYS MONITOR ****X;X;(†:DOSOS$>ÿ2 -;;MAKE SURE DECIMAL MODE OFF< &†BRKKEYF2P &†LOADFGZQ>d P†LMARGNnQ>‚xP†RMAR lýGN;;SET MARGINS‚%Q†POKMSK;;ENABLE BREAK INTERRRUPTSŒL>€– P†POKMSK  P…IRQENª †INITIO;;CLOSE FILES´X;¾#X; ‚heck for mini-dup of DOS 2.5ÈX;Ò QˆOLDPRMSGÜ!R>L;; If not a JMP, then 2.0sæ F†DSKUTLðX;ú(ˆ:NEED2.0Q>;; Set DUP no‚ in memory mý P†DUPFLGQ>4Š:WRONGMINI$>5Š:WRONGMINI" …WAITY' !ˆ:NEED2.0,X;67Š:WRONGMINI }=AžInsert DOS 2.0s, type‚Y ÒÅÔÕÒÎA=‚CR@X;J X; DISK UTILITY MONITORTX;^ †DSKUTLhƒDU1Q>…DUNUMrP†MENUSZ;;SET MENU SIZE| Q>4…DUJPT† P†J‚PTBL Q>5…DUJP nýTš)P†JMPTBL;;SET UP JUMP TABLE ADDRESS¤X; FALL THRU TO MENU SELECT®X;¸X;ÂX;ÌCX; MENU SELECT MONI‚OR -- VECTORS TO ROUTINE SELECTED FROM MENU.ÖX;à$…SHMENQ>4…DMENU;;GET MENU ADDRESSê P…ICBALô Q>5…DMENUþ P…ICBAHQ>4…‚ULEN;;GET MENU LEN oýGTH P…ICBLL Q>5…DULEN& P…ICBLH0 †DSPMSG;;SHOW MENU:X;D!X; SELECT ITEM FROM MENUNX9X; ‚*** FUNCTIONS COME HERE WHEN THEY ARE DONE ****bX;l)†MENUSL$>ÿ;;RESET STACK AT THIS POINTvB€2Š!&†WCFLAG;;CLEAR WI‚D-CARD FLAG”Q>4ƒSIT pý;;SELECT ITEM MESSAGEž $>5ƒSIT¨ ‡PRNTMSG²Q>@;;MAKE SURE UPPER CASE¼ P†SHFLOKÆ" †CHRGET;;GO GET ‚EYBOARD CHAR.ÐX;ÚR>‚CR;;IF CR RE-DISPLAY MENUä F…SHMENîX;ø;0S> A;;CONVRT ASCII CHAR. TO BINARY # & SUB. 1 0G…RAN‚E;;IF ASCII CHAR NOT A # qý, GO READ AGAIN*R†MENUSZ;;IS THE # ENTERED > MENU SIZE? "I…RANGE;;IF YES, GO READ AGAIN.*T?4#?‚;SET INDEX TO (MENU # - 1) * 2> Q@†JMPTBL7H3RP…RAMLO;;GET STRING POINTER\ Q@†JMPTBL7f P…RAMLOp+%>;;LOAD STRING ‚OINTER INTO REGISTERSzQ@… rýRAMLO7;;FOR DSPLIN„>Ž1˜ Q@…RAMLO7¢) †DSPLIN;;PRINT MODULES INITIAL STRING¬ …SCROL;;SCROLL‚INPUT WINDOW¶1Q…RAMLO;;INC BY 2 TO POINT PAST STRING POINTERÀ,ÊO>Ô P…RAMLOÞDŒ:DOSELECTIONè #…RAMLOü<Œ:DOSELEC‚ION!@…RAMLO:;;JUMP TO ROUTINE sýSELECTED BY MENU. …RANGEQ>4ƒNSI $>5ƒNSI ! †DSPLIN;;NO SUCH ITEM MESSAGE$ !†MENUSL. 8 ‚NSI AŒNO SUCH ITEMA=‚CRB X;L GX;PROMPT FOR MENU SELECTION OR REDISPLAY MENU - RETURN IS IN INVERSEV X;` ƒSIT ASELECT ITE‚ OR Aj  €=A†RETURNAt  A‰ FOR týMENUA=‚CR~ „MNSL†MENUSLEQ>4ƒNSI $>5ƒNSI ! †DSPLIN;;NO SUCH ITEM MESSAGE$ !†MENUSL. 8 ‚NSI AŒNO SUCH ITEMA=‚CRB X;L GX;PROMPT FOR MENU SELECTION OR REDISPLAY MENU - RETURN IS IN INVERSEV X;` ƒSIT ASELECT ITE‚ OR Aj  €=A†RETURNAt  A‰ FOR þþ‚èX;SAVE #D2:DUPDIR.M65òAŽLIST DIRECTORYAü.X; **** DIRECTORY LISTING ROUTINE ****X;X;†DIRLST „DLMG$ †G‚TIC1.! †USEBUF;;INIT BUFADR & BUFLEN8$ƒPTRB&QƒPAR9;;LAST CHAR OF SEARCH SPECLR> :;;IF COLON, ADD *.*VHƒGLF`Q> *‚$vý PƒPAR9t PƒPAR9~Q> .ˆ PƒPAR9’2œ2¦2°&ƒPTRº'ƒGLFQ>‚CR;; Put RETURN at end of bufÄ PƒPAR9Î &„SAVXØ$>‚ â …PIOCBì †GETFILö „PERX)Q>;;READ DIR INFO - use new mode!!!! $> P…ICAX19Q>„OPEN;;OPEN( P…ICCOM92%&„CS‚C;;$wýCOPY SOURCE=DIRECTORY INFO< …CIOCLFQƒPTRP;Z S„SAVXd0R>;;IF ONLY 3 CHARS, IS 'D:'CR, USE DEFAULTn F…DLST1x…DL‚T0!„PDES;;GO INTO COPY‚…DLST1$„SAVXŒ QƒPAR9–R> D  H…DLST0ª&!…PDES1;;GO INTO COPY WITH DES='E:'´X;¾1„DLMG A¡DIRECTO‚Y--SEA$xýRCH SPEC,LIST FILE?A=‚CRFO< …CIOCLFQƒPTRP;Z S„SAVXd0R>;;IF ONLY 3 CHARS, IS 'D:'CR, USE DEFAULTn F…DLST1x…DL‚T0!„PDES;;GO INTO COPY‚…DLST1$„SAVXŒ QƒPAR9–R> D  H…DLST0ª&!…PDES1;;GO INTO COPY WITH DES='E:'´X;¾1„DLMG A¡DIRECTO‚Y--SEA$þþ‚ èX;SAVE #D2:DUPDEL.M65òAŒDELETE FILESAü(X; **** DELETE FILE ROUTINE ****X;X;†DELFIL „DEMG$ †GETIC1.‚„PERX;;EXIT IF PARAM ERRORS8X;B/ †CHKVER;;BE SURE THAT IT IS VER. 2 DISKETTELX;V@X; CONTINUE WITH DELETE - ALLOW‚(zýONLY FOR DISK DEVICE ID`X;jQƒPAR;;GET DEVICEt!R> D;;ONLY ALLOW DELETE FOR D:~FƒDF1ˆ Q>4ƒNDF’ $>5ƒNDFœ †DSPLIN¦ !‚MENUSL°ƒNDF ANOT A DISK FILEA=‚CRØX;â ƒDF1$>ìQƒOPTöR> N;;IF OPTION=N, NO QUERYHƒDWQ;;NO, DELETE WITH QUERY  ‚>†D({ýELETE P…ICCOM9 …CIOCL( !†MENUSL2ƒDWQQ>4ƒTYQ< $>5ƒTYQF$ †DSPLIN;;SAY TYPE Y TO DELETE...PQ>Z0P„IPTR;;HOW MA‚Y FILES TO SKIP, NONE AT FIRSTd$> ;;SET UP DELETE IOCBn Q>†DELETEx P…ICCOM9‚ Q>4ƒDB3Œ P…ICBAL9– Q>5ƒDB3  P…ICBAH9ª‚Q> D´(|ý P„DBUF¾Q> :È P„DBUFÒ-QƒPAR;;DEVICE NUMBER OR : FROM OP INPUTÜR> :æ H†:HASDNð#Q> 1;; NO DRIVE NUMBER ‚ USE D1:ú)†:HASDNP„DBUF;;KLUDGE KLUDGE KLUDGE „IDRD$> Q>„OPEN P…ICCOM9"Q>,P…ICAX19;;DIR READ OPEN6 Q>4ƒPA‚@ P…ICBA(}ýL9J Q>5ƒPART P…ICBAH9^ …CIOCLh Q>4„DBUFr P…ICBAL9| Q>5„DBUF† P…ICBAH9 Q>†GETRECš P…ICCOM9¤Q>®(PƒPTR‚;HOW MANY FILES WE HAVE SKIPPED¸X;Â.X; READ FILENAME FROM DIR, QUERY AND DELETEÌX;Ö „RDFN$>àQ>ê P…ICBLL9ôQ>‚ P…ICBLH9(~ý& …CIOCL;;READ A LINE FROM DIRECTORY)Q„DBUF;;IF FILE LINE, THIS IS BLANKR> ;; Is it a space?&#H„DELX;;‚HIS IS FREE BLOCKS LINE0#ƒPTR;;COUNT THIS FILE:"QƒPTR;;HAVE WE SKIPPED ENUF YETD R„IPTRNG„RDFN;;BR IF NOX$>;;PUT P‚Rb%>;;GET P(ýTRlX;vX; MESSAGE DELETE FILE NAMES€X;Š„MDN1Q„DBUF8”R> ;;END OF FILENAMEž F„MDN2¨ P„DBUF9²2¼3‚(>Ð G„MDN1ÚX;ä!X; FILENAME IS MOVED, PUT .EXTîX;ø „MDN2Q> . P„DBUF9 2%> ;;WHERE EXT IS „MDN3Q„DBUF8* P‚DBUF943>2H)>(€ý R G„MDN3\&„SAVX;;PUT CR HERE LATERfQ> ?;;FOR QUERYp P„DBUF9z2„Q>‚CRŽ P„DBUF9˜ Q>4ƒDB3¢ $>5ƒ‚B3¬# †DSPLIN;;GO ASK ABOUT THIS FILE¶ †CHRGETÀR> YÊH„RDFN;;GO DO NEXT FILENAMEÔ/QƒPTR;;NUMBER FILES WE HAVE GONE THR‚ SO FARÞ!P„IPTR;;IS (ýNEW NUMBER TO SKIP.è $„SAVXòQ>‚CRü P„DBUF9 $> ;;DELETE IOCB …CIOCL …CLOS1$ )!„IDRD;;CLOSE ‚ND REOPEN DIR READ FILE. $„DELX …CLOS1;;CLOSE DIR READ FILE8 !†MENUSLB …CLOS1$>L Q>…CLOSEV P…ICCOM9` !…CIOCL;;DO CLOS‚ AND RETURNj 0ƒTYQ A…TYP(‚ýE A="=AYA="=A TO DELETE...A=‚CR’ X;œ „DEMG ADELETE FILE SPECA=‚CR¦ X;LISTCLOS1$ )!„IDRD;;CLOSE ‚ND REOPEN DIR READ FILE. $„DELX …CLOS1;;CLOSE DIR READ FILE8 !†MENUSLB …CLOS1$>L Q>…CLOSEV P…ICCOM9` !…CIOCL;;DO CLOS‚ AND RETURNj 0ƒTYQ A…TYP(Qþþ‚èX;SAVE #D2:DUPCOPY.M65òAŠCOPY FILESAü$X; **** COPY FILE ROUTINE ****X;X;„CPMG ACOPY--FROM, TO?A=‚CR$ ‚‚E A’OPTION NOT ALLOWEDA=‚CRLX;VX;`X;jX;tX;~ †WCFLAGˆ †WCSKP1’ †WCSKP2œ †WCBUFL¦…WCBUF†WCBUFL°‚,„ýWCOPYM AŒ COPYING---Aº†WCBUF2 AƒDN:AĆWCBUFLÎ"†CPYFIL „CPMG;;COPY FILE PROMPTØ$ †GETIC1;;GET SOURCE DEVICE, ETC.â‚QƒPTRì P„SAVXö!QƒPAR;;GET 1ST CHAR. OF DEVICER> D;;TEST IF IT IS THE DISK 3H†JMPNWC;;BR IF NOT THE DISK (THEN USE OLD‚COD,…ýE)"$>;;LOOK AT SOURCE FILE SPEC.- †LOOKWC;;LOOK FOR WILDCARDS IN FILE SPEC.(3F†CPYFL1;;BRANCH IF WILDCARDS USED IN‚DISK SPEC.2†JMPNWC!…NOTWC;;USE OLD CODE<†CPYFL1Q>€FX;PX;Z9†WCINITP†WCFLAG;;'WLDCARD' MODE (COPY-FILE OR DUP-FILd‚Q>n,†ý P†WCSKP1xX;‚†WCOPYLQ>Œ P†WCSKP2–$>;;OPEN DIRECTORY Q>ª P…ICAX19´ Q>„OPEN¾ P…ICCOM9È Q>4ƒPARÒ P…IC‚AL9Ü Q>5ƒPARæ P…ICBAH9ð …CIOCLúX;X;#†WCOPYRQ>†GETREC;;READ DIRECTORY P…ICCOM9" Q>†WCBUFL, P…ICBLL96Q>@ P‚ICBLH9J ,‡ýQ>4…WCBUFT P…ICBAL9^ Q>5…WCBUFh P…ICBAH9r …CIOCL|X;†3Q…WCBUF;;IF 1ST CHAR. OF DIR READ IS A #-IT IS TR> ‚š D…WCGOT¤R> :® E…WCGOT¸X;Â3Q>…CLOSE;;ALL DONE -- NORM EXIT OF WILDCARD COPYÌ P…ICCOM9Ö …CIOCLà !†MENUSLêX;ôX‚þ9…WCGOTQ†W,ˆýCSKP1;;IF ALREADY COPIED OR SKIPPED THIS FILE R†WCSKP2 F…SKIP1X;& #†WCSKP20 H†WCOPYR:X;D…SKIP1#†WCS‚P1NX;X&Q>…CLOSE;;CLOSE DIRECTORY READ FILEb P…ICCOM9l …CIOCLvX;€X;Š %>;;DON'T COPY .SYS FILES”†SYSLOPQ…WCBU‚ 8ž R†DOTSYS,‰ý8¨ H…NOSYS²1¼ I†SYSLOPÆ G†WCOPYLÐX;Ú†DOTSYS AƒSYSAäX;î'…NOSYS%> 1;;CALC SOURCE DRIVE NUMBERø QƒP‚RR> :  F†WCGOT1? †WCGOT1'†WCBUF2*X;4X;>+$>;;COMPRESS SPACES, ADD ':', ADD 'CR'H%>RX;\†COMPR1Q…‚CBUF9f R>…SPACEp,Šý F†COMPR2z P†WCBUF28„3ŽX;˜ †COMPR22¢(> ¬ H†COMPR1¶X;À Q…WCBUF9Ê R>…SPACEÔ F†COMPR5ÞQ> .è‚P†WCBUF28ò3ü†COMPR3Q…WCBUF9 R>…SPACE F†COMPR4 P†WCBUF28$ 3. †COMPR428 (> B H†COMPR3L X;V †COMPR5Q>‚CR` P†W‚BUF28j X;t X;~ 5Q>4,‹ý†WCOPYM;;PRINT 'COPYING---DEV:FILENAME.EXT' MSGˆ $>5†WCOPYM’ †DSPLINœ X;¦ *†WCFLAG° 2J…WCOPY;;BR T‚ MIDDLE OF DUP FILE ROUTINE IF DUº X;Ä /$>;;SET UP BUFR ADDR TO PNT TO WLDCARD FILÎ Q>4†WCBUF2Ø P…ICBAL9â Q>5†WCBUF2ì ‚P…ICBAH9ö !†WCDUPS X;,Œý #…WCOPY †USEPGM;;SET BUFFER SIZES $>;;OPEN COPY SOURCE FILE Q>„OPEN( P…ICCOM92 Q>< P…IC‚X19F Q>4†WCBUF2P P…ICBAL9Z Q>5†WCBUF2d P…ICBAH9n &„CSRCx …CIOCL‚ X;Œ $> – % …PIOCB;;GET COPY DESTINATION FILE  0Qƒ‚TR;;SAVE PTR,IPTR- MIGHT RE,ýPET GETTING 2NDª ƒMES´ 5¾ Q„IPTRÈ 5Ò % †GETFIL;;GET 2ND FILE NAME TO PARÜ 7;;RECOVER IPTR,P‚Ræ P„IPTRð 7ú PƒPTR $„SAVX QƒPAR9 R> D" F†WCOPY0, 3!„PDES;;JMP TO OLD CPY-FILE CODE IF NOT DSK DEST6 X;@ -†WCOPY0‚> 1;;CALCULATE DESTINATION DRI,ŽýVE #J QƒPAR9T R> :^ F†WCOPY1h X;r ?| †WCOPY1)†WCBUF2† H†WCOPY2 3 …CLOSX;;CANT CO‚Y TO SAME DRVE NMBR - ERR & EXIš X;¤ !„ODMS® X;¸ X; †WCOPY2$> Ì .'†WCBUF2;;CHANGE FILESPEC TO DESTINATIONÖ Q>4†WC‚UF2à P…ICBAL9ê Q>5†WCBUF2ô P…I,ýCBAH9þ -!†OPDES1;;CONTINUE INTO OLD COPY-FILE CODE X; X; …NOTWC & $> ;;IOCB 30 …‚IOCB: †GETFIL;;GET SECOND FILENAMED X;N 0X; MAKE SURE DESTINATION IS NOT DOS.SYSX X;b ($„SAVX;;ENTRY-INDEX TO DEST‚FILE SPECl ' †TSTDOS;;WON'T RETURN I,ýF IS DOS.SYSv X;€ $„SAVXŠ †LOOKWC” 2H†NWCIND;;BRANCH IF NO WILDCARDS IN DESTINATIONž‚ Q>4ƒNWA¨ $>5ƒNWA² †DSPLIN¼ !†MENUSLÆ 4ƒNWA A¥WILD CARDS NOT ALLOWED IN DESTINATIONA=‚CRî X;ø †NWCIND   „PERX;;IF P‚RAM ERRS, EXIT 4 †USEPGM;;ASK USR IF C,‘ýAN USE PGM AREA OR DATA BFR „PSRC QƒPAR;;GET 1ST LETR OF PARAM* R> K4 4F„ODMS;‚K:GETS 'OPTION DOESNT MAKE SENSE' FOR NOW> R> CH 6F„ODMS;;C: GETS 'OPTION DOESNOT MAKE SENSE' FOR NOWR R> E;;E: AS SOURCE ‚S SPECIAL\ 'H…OPSRC;;IF NO THEN OPEN SOURC,’ýE FILEf $>p &„CSRCz !„PDES„ …OPSRCR> SŽ -F„ODMS;;S: AS SOURCE GETS O.D.M.S. ‚OR NOW˜ X;¢ X; OPEN SOURCE FILE¬ X;¶ $>À Q>„OPENÊ P…ICCOM9Ô Q>;;OPEN INÞ P…ICAX19è &„CSRC! …CIOCL;;OPEN‚SOURCE FILE HEREX;)X; READY FOR OP,“ýEN OF DESTINATION$X;.„PDES$„SAVX8 QƒPAR9BX;LR> K;;IS DEST KEYBOARD?V ‚„ODMS;;YES, THEN CAN'T DO IT`X;jR> E;;CHECK FOR SPECIAL CASEtH…OPDES;;IF NOT~:…PDES1Q>;;SPECIAL CASE - DONT OPEN, U‚E EXISTING IOCBˆ P„CDES’ !…DOCPYœ„ODMSQ>4‚OE,”ý¦!$>5‚OE;;SAY OPTION NOT ALLOWED° †DSPLINº …CLOSX;;CLOSE IOCB 1 & 2Ä !‚MENUSLÎX;Ø …OPDESR> Câ6F„ODMS;;C: GETS 'OPTION DOESNOT MAKE SENSE' FOR NOWì$ƒOPT;;GET 2ND FILE OPTIONöX;(> A;;APP‚ND TO DISK FILE  H†OPDES1R> D H„ODMS(Q> 2,•ý H†OPDES3<†OPDES1Q>F†OPDES3$> PP…ICAX19;;OPEN TYPE OUTZ Q>„OPEN‚P…ICCOM9;OPENn &„CDESx …CIOCL‚Q>Œ P…ICAX29–X; X;COPY FROM CSRC TO CDESªX;´…DOCPYQ>†GETCHR¾ ƒGC1$„CSRCÈ %‚CDESÒ P…ICCOM9Ü Q>†PUTCHRæ P…ICCOM8ð'Q†BUFADR;;ADD,–ýRESS OF BUFFER - EITHERú3P…ICBAL9;;PGM AREA (MEMLO) OR DATA BUFFER (D‚UF) P…ICBAL8'Q†BUFADR;;BUFADR IN LSB,MSB ORDER P…ICBAH9" P…ICBAH8,…CLOOP$„CSRC6'Q†BUFLEN;;LENGTH OF BUFFER ADDR‚SSED@P…ICBLL9;;BY BUFADRJ1Q†BUFLEN;;BOTH BUFADR & B,—ýUFLEN ARE ASSIGNEDT!P…ICBLH9;;IN SUBROUTINE USEPGM^ ƒCIO;;READ F‚OM INPUTh '…SSTATr $„CDES| %„CSRC† Q…ICBLL8 P…ICBLL9š Q…ICBLH8¤ P…ICBLH9®&L…ICBLL8;;IF SOURCE FILE LENGTH = 0¸F„C‚RS;;DON'T DO WRITEÂ! …CIOCL;;WRITE, ABORT IF ERRORÌ/„CKRSQ,˜ý…SSTAT;;GET READ OPERATION STATUS BACKÖ$I…CLOOP;;IF OK, GO READ‚SOME MOREàR>ˆ;;EOF STATUSê F„CLOCô!…CIOER;;IF NOT, ABORTþ„CLOC$„CSRCFƒDU4;;IF E:, DONT CLOSEX;X;CLOSE SOURC‚ FILE&X;0 Q>…CLOSE: P…ICCOM9D ƒCION ƒDU4$„CDESXFƒDU3;;,™ýIF DES=E:b Q>…CLOSEl P…ICCOM9v ƒCIO€ ƒDU3$„CDESŠHƒDU6”‚Q>4„DDSKž$>5„DDSK ¨5 ‡PRNTMSG;;PRNT A CR BEFOR SELECT OR WLDCARD PRMPT² ƒDU6 ¼X;Æ *†WCFLAGÐIƒDU5Ú*!†WCOPY‚;;BRANCH BACK TO WILD CARD LOOPäƒDU5!†MENUSLƒDU4$„CDESXFƒDU3;;,éþþ‚èX;SAVE #D2:DUPCMDS.M65òAŒRENAME, ETC.Aü(X; **** RENAME FILE ROUTINE ****X;X;IX;RENAME SETS UP IOCB #1 W‚TH THE OLD FILE NAME AND THE BUFFER ADDRESS$IX;POINTS TO THE NEW FILE NAME. THE NEW FILE SPECIFICATION CANNOT HAVE.JX;A D‚0›ýVICE ID. THE DEVICE ID IS THE SAME AS SPECIFIED FOR THE OLD FILE8CX;D2:ABC.S2,QQQ.R3 THIS RENAMES ABC.S2 ON DRIVE #2 T‚ QQQ.R3BX;L†RENFIL „RNMGV1 †GETIC1;;GET OLD FILE SPEC & PUT ADDR IN IOCB` ‡GETNAME;;GET NEW FILE NAMEj# „PERX;;EXIT ‚F P0œýARAMETER ERRORStX;~% †CHKVER;;MAKE SURE VER 2 DISKETTEˆX;’ X; CONTINUE WITH RENAMEœX;¦ Q>†RENAME°$>º ‚…ICCOM9Ä …CIOCLÎ !†MENUSLØ+„RNMG A›RENAME - GIVE OLD NAME, NEWA=‚CRâX;ì;X;******************* SUBROUTINE ********‚******0ý****öX;5X; MAKE SURE THIS IS A VERSION 2 FORMAT DISK X;+†CHKVER%>;;ASSUME DRIVE 1- GET DRIVE #3QƒPAR‚;;TEST CHAR 2 OF FILE SPEC FOR SEMICOLON('R> :;;IF IS, USING DEFAULT DRIVE (1)2!F„DRV1;;IT IS, SO SAVE DRIVE #<,M>;;E‚SE CHAR 20žý IS ASCII REP OF DRIVE #F!?;;CONVERT TO BINARY & SAVE ITP„DRV1'„UNNO;;SAVE DRIVE #ZX;d5!‡TSTVER2;;TST FOR VER‚. 2 DISK- WONT RTURN IF NOTnX;x‚(X; **** FORMAT DISK ROUTINE ****ŒX;–X; (†SGLFMT ƒWHD;; Single density forma‚!ªQ>ˆFORCE0ŸýFMT´H‹:FMTOPTIONS¾X;ȆFMTDSK ƒWHDÒ Q>†FORMATÜ‹:FMTOPTIONSP‡FMTTYPEæ †GETLINð …GETDNú,O> 0 P„‚DSK P„CDSK" „PERX,(Q>4ƒVFM;;QUERY TO VERIFY DRIVE NUMBER6 $>5ƒVFM@ †DSPLINJ †CHRGETTR> Y;;SEE IF OK^HƒFMXh Q‡‚MTTYPEr%> !|0 ý …DOFMT†ƒFMX!†MENUSL;;EXIT.X;š‡FMTTYPE¤X;® …DOFMT$>¸ P…ICCOM9 Q>4ƒFDPÌ P…ICBAL9Ö Q>5ƒFDP‚ P…ICBAH9êCô P…ICAX19þ!!…CIOCL;;CALL CIO TO DO FORMAT%ƒWHD A–WHICH DRIVE TO FORMAT?A=‚CR/ƒVFM A…TYPE A="=AYA="=A‚ TO FORMAT DISK A0¡ý „DDSK& ‚CR0 ƒFDP ADA: „CDSKD A:A=‚CRNX,X; **** START CARTRIDGE ROUTINE ****bX;l‚X;v…SYVBL†SYSVBV€…XTVBL†XITVBVŠ%…STCAR „SCMG;;NO MSG, PRINT A ”†ROMTSTý¿ž!%†ROMTST;;TEST IF RAM OR OTHER¨‚>ª;;PATTERN #1² P†R0¢ýOMTST¼ R†ROMTSTÆH†NOTRAM;;BRANCH IF NOT RAMÐQ>U;;PATTERN #2Ú P†ROMTSTä R†ROMTSTîH†NOTRAM;;BRA‚CH IF NOT RAMøX;-'†ROMTST;;THERE IS VALID RAM - SAY NO CART †NOCARTQ>4ƒNCA$>5ƒNCA;;SAY NO CART  †DSPLIN* !†MENUS‚4X;>/X; CHECK I0£ýF ROM OR EMPTY ADDRESS SPACEHX;R#†NOTRAMQü¿;;KNOWN ROM ZERO BYTE\*H†NOCART;;BRANCH IF EMPTY ADD‚ESS SPACEfX;p+>;;SINCE EMPTY ADDR SPACE GIVES A RANDOMz8†CKCARTQ†ROMTST;;VALUE, TEST THE SAME LOC MANY TIMES.„#F†NOCART‚;BRANCH IF NO CARTRIDGEŽ R0¤ý†ROMTST˜#H†NOCART;;BRANCH IF NO CARTRIDGE¢2¬H†CKCART;;LOOP BACK¶X;ÀX;Ê=X; RESET V‚RTICAL BLANK VECTORS BEFORE ENTERING CARTÔX;Þ †INITIOèQ>;;SET VVBLKIò$>5…SYVBL;;HI BYTEü %>4…SYVBL †SETVBV Q‚;;SET VVBLKD $>5…XTVBL$ %0¥ý>4…XTVBL. †SETVBV8 !†CLMJMPB L ƒNCA AŒNO CARTRIDGEAV „SCMG ‚CR` X;j X;t +X; ***‚*** RUN AT ADDRESS *******~ X;ˆ X;’ X;œ „BRUN „BRMG¦ †GETLIN° …GETNOº „PERXÄ P…RAMLOÎ &…RAMLOØ QƒCTRâ R>‚ 2F…MOUT1;;RETURN TO MENU IF NO R0¦ýUN ADDRESS GIVENö . †INITIO;;CLOSE ALL IOCB'S, THEN REOPEN S/E )!„LMTR;;LOAD MEM.SAV & JUM‚ TO ADDRESS X; X; &„BRMG A–RUN FROM WHAT ADDRESS?A=‚CR( 2 2X; **** CREATE MEM.SAV FILE ON DISK ****< X;F X;P‚6„MEMS A…TYPE A="=AYA="=A’ TO CRE0§ýATE MEM.SAVA=‚CRZ †MEMSAV „MEMSd  †CHRGET;;GET CHAR (CR)n R> Yx *H„MOUT;;BRANCH IF US‚R'S ANSWER NOT A Y‚ †MEMSVQ;;TRY TO OPEN MEM.SAVŒ +G…MCONT;;IF FILE DOESN'T EXIST THEN JUMP– -Q>4…MEMSG;;ELSE 'MEMORY.SAVE‚ AREADY EXIST  $>5…MEMSG;;ª  †DSPLIN;0¨ý;DISPLAY THIS FACT´ )„MOUT …CLOSX;;EXIT AFTER CLOSING IOCB1¾ …MOUT1!†MENUSL;;È X;Ò ‚X; WRITE MEMORY.SAVE TO DISKÜ X;æ …MCONT †MWRITE;;WRITE FILEð I„MOUTú „MERR!†CIOER1;;DISPLAY ERROR X; ,…MEMSG A›MEM.S‚V FILE ALREADY EXISTSA=‚CRSG;;ª  †DSPLIN;0íþþ‚ èX;SAVE #D2:DUPDOS.M65òAWRITE DOS FILESAü%X; **** WRITE DOS & DUP ****X;X;,…WBOOT †DOSDRV;;ADDRESS OF ‚RIVE # PROMPT$X;.,X; RETRIEVE DRIVE NUMBER FROM USER.8X;B †GETLIN;;GET INPUTL* …GETDN;;GET DRIVE AS NUMBER, VE‚4ªýIFY ITV „PERX;;EXIT IF ERROR`P„UNNO;;SAVE IT FOR TSTVER2jL> 0;;TURN BACK TO ASCII REPt&P‚DS;;STORE IN DOS.SYS FILE‚SPEC~P„QWMG;;& IN PROMPTˆX;’5 ‡TSTVER2;;TST IF VERS. 2 DISK - IF ISNT WONT RTRNœX;¦>X; ASK USER IF CAN WRIT‚ DO4«ýS & DUP TO SPECIFIED DRIVE°X;ºQ>4„QWMG;;PRINT PROMPTÄ $>5„QWMGÎ †DSPLINØ †CHRGETâR> YìHƒWBX;;EXIT UNLESS Yö‚X;GX;TELL USER WRITING DOS FILES AND WRITE DOS.SYS FIRST- JUST OPEN IT. X; Q>4„WBMG $>5„WBMG( †DSPLIN2X;< Q>„OP‚NF $>4¬ý;;OPEN DOS.SYS ON IOCB #1P2P…ICCOM9;;WILL CAUSE FMS TO REWRITE BOOT SECTORZQ>4‚DS;;& A COPY OF DOS.SYSd P…ICBAL9‚ Q>5‚DSx P…ICBAH9‚Q>Œ P…ICAX19–' …CIOCL;;DO OPEN, IF ERROR GOTO MENU X;ª$>´ Q>…CLOSE¾ P…ICCOM9È …CIOCL;;DO‚E CLOSE I4­ýT.ÒX;Ü*X; WRITE DUP.SYS - SWAP AREA FILEæX;ð$> ;;MOVE 11 CHARSú†MDUPBLQ†DUPSYS9.PƒPAR9;;MOV‚ FILE NAME TO PARAMETER LIST0 H†MDUPBL"Q‚DS;;GET DRIVE NUMBER,(PƒPAR;;PUT IT IN DUP.SYS FILE SPEC6X;@&ƒPTR‚$>T) …P4®ýIOCB;;PUT FILE NAME POINTER IN IOCB^ Q>4ƒDTHh P„LDSTr Q>5ƒDTH| P„LDST† Q>4…NMDUP P„LDNDš Q>4ƒLEN¤ P„‚DRL® Q>5ƒLEN¸ P„WDRH Q>5…NMDUPÌ P„LDNDÖ 5;;NO /Aà Q>4…DOSOSê P…RUNADô Q>5…DOSOSþ&P…RUNAD;;SET DUP.SYS ‚UN ADDRESS"„4¯ýRUNQ;;SET RUN FLAG!†NRUNAD;;WRITE DUP.SYSƒWBX!†MENUSL&.†DOSDRV AœDRIVE TO WRITE DOS FILES TO?A=‚CR0‚%„WBMG A•WRITING NEW DOS FILESA=‚CRXX;bl=„QWMG A…TYPE A="=AYA="=A™ TO WRITE DOS TO DRIVE .A=‚CR”X;ž‚DS AŠD1:DO‚.SYSA=‚CRÆX;Ð,ƒ4°ýWVD AERROR - NOT VERSION 2 FORMAT.A=‚CRøX; 7X; **** TEST FOR VERSION 2 FORMAT - SUBROUTINE ****‚X; X;*X;4 X; SUBROUTINE - TSTVER2>X;HIX; READS THE DISK'S VTOC AND CHECKS IF VERSION BYTE IS SET AS 2.R‚X;\2X; 4±ý ENTRY - DRIVE # STORED IN UNNOf?X; EXIT - RETURNS ONLY IF IS A VERSION 2 DISKp@X; ‚ ELSE DOES AN ERROR EXIT BACK TO MENUz-X; CALLS - DRVSTAT AND RVTOC„6X; CALLE‚ BY - DELFIL, RENFIL, WB4²ýOOT.ŽX;˜X;¢IX; GET DRIVE TYPE SO KNOW CORRECT SECTOR SIZE - NEEDED FOR RVTOC¬X;¶ ‡TSTV‚R2  X; .X; READ THE VTOC & CHECK IF VERSION 2 X;$ &…OKTYP …RVTOC;;READ IN VTOC TO DBUF. Q„DBUF;;1ST BYTE IS VER‚ION #8 R>;;IS IT VERSION4³ý 2?B &F…SMVRS;;YES, SAME VERSION - RETURNL X;V 8X; NOT A VERSION 2 DISK - PRINT MSG & GOTO‚MENU` X;j "Q>4ƒWVD;;ELSE, NOT SAME VERSIONt "$>5ƒWVD;;PRINT INCOMPATIBLE MSG~ †DSPLINˆ !†MENUSL;;GOTO MENU’ X;œ )X; ‚ DISK IS VERSION TWO SO RETUR4´ýN¦ X;° …SMVRS:;;RETURN VERSION - RETURNL X;V 8X; NOT A VERSION 2 DISK - PRINT MSG & GOTO‚MENU` X;j "Q>4ƒWVD;;ELSE, NOT SAME VERSIONt "$>5ƒWVD;;PRINT INCOMPATIBLE MSG~ †DSPLINˆ !†MENUSL;;GOTO MENU’ X;œ )X; ‚ DISK IS VERSION TWO SO RETUR4þþ‚èX;SAVE #D2:DUPCMD2.M65òAVARIOUS COMMANDSAü-X; **** LOAD USER FILE FUNCTION ****X;X;…LDFIL „LFMG$ †‚ETIC1.Q>8$ƒOPTBPƒOPTL+(> N;;IS OPTION N FOR DON'T LOAD AND GO?VH„NOTN;;BRANCH IF NOT`"ƒOPTj„NOTN „PERXt „LO‚8¶ýD~#(>;;PROCESS LOAD SUBR RESPONSEˆ F„LDFX;;BRANCH IF LOAD WAS OK’(>œFƒNLF;;IF BAD LOAD FILE¦"C;;OTHERWISE WE GOT ‚ CIO ERROR°!…CIOER;;GO SAY WHAT IT ISºƒNLFQ>4ƒBLFÄ $>5ƒBLFÎ †DSPLIN;;BAD LOAD FILE MSGØ …CLOSX;;CLOSE THE FILEâ„L‚FX!8·ý†MENUSL;;EXITìƒBLF ABAD LOAD FILEA=‚CRX;$„LFMG A”LOAD FROM WHAT FILE?A=‚CR(22X; **** LOCK & UNLOCK FILE ‚COMMANDS ****<X;FX;P…LKFIL „LKMG;;DO LOCKZ †GETIC1d „PERXn Q>„LOCKx$>‚ P…ICCOM9Œ …CIOCL– !†MENUSL "„LKM‚ A’WHA8¸ýT FILE TO LOCK?A=‚CRªX;´…ULFIL „ULMG;;DO UNLOCK¾ †GETIC1È „PERXÒ Q>†UNLOCKÜ$>æ P…ICCOM9ð …CIOCLú !†ME‚USL$„ULMG A”WHAT FILE TO UNLOCK?A=‚CRKMG;;DO LOCKZ †GETIC1d „PERXn Q>„LOCKx$>‚ P…ICCOM9Œ …CIOCL– !†MENUSL "„LKM‚ A’WHA8žþþ‚èX;SAVE #D2:DUPDUP.M65òAŽDUPLICATE DISKAü+X; **** DUPLICATE DISK ROUTINE ****X;X;)X; FMS equates needed ‚or VTOC access:$X;.*†DVDWRQ;; Write required flag offset8)†DVDSMP ;; Offset of start of bitmapVX;`X;j,„DDMG Aœ‚<ºýUP DISK-SOURCE,DEST DRIVES?A=‚CRt<‚OK A…TYPE A="=AYA="=Aš IF OK TO USE PROGRAM AREAA=‚CR~X;ˆ?„CMSI A‹CAUTION: A A="=‚YA="=A• INVALIDATES MEM.SAV.A=‚CR’X;œ7X; RVTOC READS VOLUME TABLE OF CONTENTS SECTOR¦X;°2…RVTOCQ>5„DBUF;; Use ‚ata<»ý buffer as VTOC bufferºP‡VTOCPTRÄ Q>4„DBUFÎ P‡VTOCPTRØ1Q„UNNO;; Use source drive number for VTOC readâ P†ICDNOZì‚&Q>;; Turn off write required flagö)P„DBUF†DVDWRQ;; so VTOC will be read. ‰CALLRVTOC 6I‡:READOK;; If error occurred,‚tell u<¼ýser and abort. !†CIOER1X;(‡:READOKQ>†DVDSMP2PƒPTR<Q„DBUF†DVDSMPFP„CSRC;;BYTE OF ALLOC MAPPQ>ZP„IPT‚;;COUNT BITS IN BYTEdQ>nP„DSHI;;POINT TO SECTOR ONExQ>‚ P„DSLOŒ:–X; X;ª†DUPDSK „DDMG´Q>;;ASSUME SINGL‚ DRIVE¾<½ýP†TWODRV;;CLEAR FLAGÈ †GETLINÒ …GETDNÜP„UNNO;;UNIT NO FOR READæ …GETDNð#P„CDES;;CDES IS THE DEST DRIVE #ú‚ „PERXX;2X; CHECK IF TWO DRIVE OR SINGLE DRIVE DUPX;"„SAMEQ„UNNO,!R„CDES;;IF BOTH UNITS THE SAME6FƒSDD;;S‚NGLE DRIVE D<¾ýUP@ $>5ƒIBDJ Q>4ƒIBDT( †DSPLIN;;PROMPT TO INSERT BOTH DISKS^ †CHRGETh"†TWODRV;;SET TWO DRIVE FLAGrG†DOD‚DP;;GO DUP DISK|-ƒIBD AžINSERT BOTH DISKS, TYPE RETURNA=‚CR†X;X;šX;¤LX;USED BY BOTH SINGLE & DOUBLE DRIVE DUP. WILL‚NOT ASK TO SWAP<¿ý IF 2 DRIVE®X;FLAG (TWODRV) IS SET.¸(X;IF THE TWO DRIVE FLAG IS CLEAR WILLÂ6X;FILL FROM SOURCE DISK, SWAP‚ EMPTY, SWAP, REPEAT.ÌX;Ö*ƒSDDQ>4ƒISD;;TELL USER TO INSERT SOURCEà3$>5ƒISD;;FOR INITIAL READ - USED ONLY FOR SINGLEê †‚SPLIN;;DRIVE DUPLI<ÀýCATEô †CHRGETþ-†DODKDPQ>4…NMDUP;;SET BUFFER AT END OF DUP P…STVEC Q>5…NMDUP P…STVEC&X;04X; ‚ BUFFER BOTTOM MOVES FROM NMDUP TO MEMTOP:@X; SET END OF BUFFER TO MEMTOP MINUS 1 SECTOR IN BYTES.DFX; WHE‚ BUFFER BOTTOM IS LES<ÁýS THAN OR EQUAL TO BUFFER END, ATN5X; LEAST ONE MORE SECTOR WILL FIT IN MEMORY.XX;b Q†MEMTOPl‚;v"S>4†SECSIZ;;T1 IS END OF BUFFER€P‚T1ŠQ†MEMTOP” S>5†SECSIZž+P‚T1;;T1 IS MEMTOP MINUS SECTOR SIZE.¨X;²)X;S‚E IF ROOM FOR AT LEAST O<ÂýNE SECTOR!¼X;Æ!Q‚T1;;DO DOUBLE PRECISION TESTÐR…STVEC;;TO SEE IF ROOMÚ+Q‚T1;;IF T1 IS = STV‚C THEN ENUF ROOMäS…STVEC;;FOR ONE SECTORî"E„ENUF;;BRANCH IF (T1)>=(STVEC)ø„NORMQ>4ƒNRM $>5ƒNRM  †DSPLIN !†MENU‚L X;*+„ENUF …CKMEM;;SEE <ÃýIF OK TO USE USER AREA4Q>>)PƒOPT;;SET UP FOR READ HERE FIRST PASSH0P‰FIRSTTIME;; and set th‚ pass number to zeroR …RVTOC;;READ VTOC\&Q„DSLO;;COPY INITIAL WRITE POINTERSf#P„SWDP;;TO INITIAL READ POINTERSp Q„DSHIz‚ P„SWDP„QƒPTRŽ P„SWDP<Äý˜ Q„IPTR¢ P„SWDP¬ Q„CSRC¶ P„SWDPÀ!!„LRS1;;SKIP FIRST READ PROMPTÊX;Ô7X;READ FROM‚SOURCE DISK TIL BUF FULL OR END OF DATA.ÞX;è!„DORDQ>;;FLAG WE ARE READINGòPƒOPTü*†TWODRV;;TEST FOR 2 DRIVES G„LRS‚;;YES, SKIP THE SWAP Q>4ƒISD;;I<ÅýNSERT SRC DISK $>5ƒISD$ †DSPLIN. †CHRGET8 X;B "X;SWAP POINTERS TO WHERE WE AREL X;V‚1„LRS1 †DOSWDP;;SWAP SECTOR AND BITMAP POINTERS` X;j 0X;LOOP READING/WRITING SECTORS TO BUFFER AREAt X;~ $ƒLRS ƒAAM;;ADVAN‚E ALLOCATION MAPˆ 0G„ASPT;;IF FREE, <ÆýADV SECTR POINTER & TRY AGIN’ *ƒOPT;;SEE WHAT MODEœ GƒDOW;;BR IF WRITE¦  …RSEC1;;DO R‚AD° !ƒIODº ƒDOW …DKWRT;;DO WRITEÄ 'ƒIODQ†DBUFLO;;ADVANCE BUFFER POINTERÎ #N>€;; Add 128 to buffer pointerØ P†DBUFLOâ G„‚SPTì #†DBUFHI („ASPT ƒASP;;GO ADVANCE<Çý SECTOR POINTER 0QƒPTR;; Check to see if we're past end of map R‡MAXVTOC( /F…STDD1‚;ALL SECTORS DONE, SWAP TO DEST DISK2 Q‚T1;;SEE IF ROOM FOR ANOTHER< R†DBUFLO;;SECTOR BELOW MEMTOPF Q‚T1P S†DBUFHIZ 2‚ƒLRS;;BRANCH IF (DBUF)<=(T1) - ROOM FOR M<ÈýORE.d X;n X;SWAP DISKS AND CONTINUEx X;‚ „STDDQƒOPTŒ G„DORD;;IF WAS WRITE, GO‚READ– …STDD2"ƒOPT;;CHANGE TO WRITE  %*†TWODRV;;ARE 2 DRIVES BEING USED?ª G‡:CHKFMT;;YES, SKIP THE SWAP´ Q>4ƒIDD;;INSERT D‚ST DISK¾ $>5ƒIDD¿ †DSPLINÀ †CHRGETÈ X;Ò<Éý 6‡:CHKFMTQ‰FIRSTTIME;; Is this the first write pass?Ü H„LRS1æ #‰FIRSTTIMEç 1‚„CDES;; Set destination drive as format driveè L> 0é P„CDSKð X;ú X; Format destination disk X; +%> !;; Use single den‚ity format command !Q‡MAXVTOC;; unless in MFM m<Êýode" I‡:NOTMFM, %> "6 9‡:NOTMFMQ„DSLO;; Save ending sector of first read p‚ss7 58 Q„DSHI9 5? Q>ˆFORCEFMT@  …DOFMT;; Try to format diskB 7C P„DSHID 7E P„DSLOT !„LRS1^ X;h …STDD1QƒOPT;;END ‚F DATAr I…STDD2;;IF READ GO WRITE| +Q„CDES;; Write<Ëý VTOC to destination drive† P†ICDNOZ‡ 3Q>4„DBUF;; Set VTOC buffer addres‚ to our bufferˆ P‡VTOCPTR‰ Q>5„DBUFŠ P‡VTOCPTR  ‰CALLWVTOCš ,Iˆ:WRITEOK;; Report error if write failed¤ !†CIOER1® *‚:WRITEOK!†MENUSL;;IF WRITE WE ARE DONE¸ X; AX;DOSWDP<Ìý - EXCHANGE CURRENT AND SAVED BITMAP & SECTOR POINTERSÌ X;ALSO INIT B‚FFER POINTERÖ X;à †DOSWDP%>ê …SWLOPQ…SWATL8ô P…RAMLOþ Q…SWATH8 .P…RAMLO;;GET ADDRESS FROM TABLE TO RAMLO $> ‚Q@…RAMLO6;;GET WHAT'S THERE& 50 Q„SWDP8: P@…RAMLO6D 7<ÍýN P„SWDP8X 1b I…SWLOPl Q…STVECv P†DBUFLO€ Q…STVECŠ P†DBUF‚I” :ž X;¨ ‰FIRSTTIME² X;¼ Æ +…SWATL 4„DSLO=4„DSHI=4ƒPTR=4„IPTR=4„CSRCÐ +…SWATH 5„DSLO=5„DSHI=5ƒPTR=5„IPTR=5„CSRCÚ ‚;ä X;î ƒNRM ANOT ENOUGH ROOMA=‚CRø -ƒISD AžINSERT SOURCE <ÎýDISK,TYPE RETURNA=‚CR 2ƒIDD A£INSERT DESTINATION DISK,TYPE RETU‚NA=‚CR X; X; +X; AAM - ADVANCE ALLOCATION MAP ONE BIT.* X; RETURN MINUS IF FREE.4 X;> $ƒAAMT„CSRC;;NEXT BIT OF ALLOC ‚APH "„IPTRR !H„CBIT;;IF DONE WITH THIS BYTE\ #ƒPTR;;GET NEXT <ÏýONEf $ƒPTRp 3Q„DBUF9;;VTOC IS DBUF & BITMAP STRTS IN 10TH BY‚z P„CSRC„ Q>Ž P„IPTR˜ „CBITQ„CSRC;;CHECK THE BIT¢ :¬ X;¶ X;À *X; ASP - ADVANCE SECTOR POINTER IN DCB.Ê X;Ô ƒASP#„‚SLOÞ H„ASPXè #„DSHIò „ASPX:ü X;2X; RSEC1 - READ A SECTOR WHO<ÐýSE NUMBER IS IN DCBX;…RSEC1Q„UNNO$*,;;TELL DISK HAN‚LER DOING A GET SECTOR. D†:SECIO8X;BX; DKWRT - WRITE A SECTORLX;V …DKWRTQ„CDES;;PUT DEST UNIT #`*;;;TELL DISK HANDL‚R DOING WRITE SECTORj †:SECIOt P…DUNIT~! …BSIOR;;GOTO FMS DISK HAN<ÑýDLERˆ I„DRTS;;RETURN IF GOOD STATUS’$!†CIOER1;;CIO ER‚OR, GO SAY WHICHœ„DRTS:;; just return¦X;°.X; CKMEM - ASK IF OK TO USE USER AREAºX;Ä'…CKMEMQ†WARMST;;IF MEMORY ‚AS INTACTÎF…CPTR1;;QUERY TO BOMB ITØ Q>4‚OKâ$>5‚OK;;PRINT PROMPTì <Òý †DSPLINöQ>4„CMSI;;PRINT CAUTION MSG/$>5„CMSI;;Y‚RESPONSE WILL INVALIDATE MEM.SAV  †DSPLIN †CHRGET&R> Y;;TEST FOR OK TO BOMB USER AREA(&H„DDXT;;IF SAY NO THEN DON'T ‚O DUP2Q><*P†WARMST;;TELL CART NO GOOD USER MEMORYF(P†MEMFLG;;TELL LOA<ÓýDER NO GOOD MEM.SAVP …CPTR1:ZX;d„DDXT7;;POP ‚ETURN ADDRESSn7x$!†MENUSL;;GOTO MENU, DON'T DO DUP‚X;&R> Y;;TEST FOR OK TO BOMB USER AREA(&H„DDXT;;IF SAY NO THEN DON'T ‚O DUP2Q><*P†WARMST;;TELL CART NO GOOD USER MEMORYF(P†MEMFLG;;TELL LOA<lþþ‚%èX;SAVE #D2:DUPFIL.M65òA—DUPLICATE A SINGLE FILEAü+X; **** DUPLICATE FILE COMMAND ****X;X;3X; DUPL‚CATE FILE FROM ONE DISK TO ANOTHER$ D;;DUPLICATE FILE ONLY FOR DISK DEVICEö F†ISDISK)!„ODMS;;IF NOT -- SAY CANNOT DO & EXIT X;:†ISDISK †USEPGM;;ASK U‚ER IF TO USE@Ùý PROG AREA OR BUFFERX;(@X; HAVE USER INSERT SOURCE FILE AND HIT WHEN DONE2X;<*$>5ƒISD;;ARG: L‚NE TO BE DISPLAYED ADDRFQ>4ƒISD;;IN REG. A & XP$ †DSPLIN;;PRINT INSERT SOURCE MSGZ( †GETLIN;;GOTO SCREEN & WAIT FOR ‚% „PERX;;GOTO @ÚýMENU IF BREAK KEY HITnX;x- †LOOKWC;;SEE IF FILE SPEC. USES WILDCARDS‚9H„NOWC;;BRANCH IF NO WILD CARDS USE‚ - USE OLD ROUTINEŒ&Q>@;;SET 'DUPLICATE WILDCARD' MODE–/!†WCINIT;;OPEN WILDCARD DIRECTORY FILE, ETC. X;ª „NOWC ´X;¾‚&X; MAKE SUR@ÛýE DEST NOT DOS.SYSÈX;Ò/$>;;ENTRY-INDEX TO FIRST CHAR OF FILE NAMEÜ' †TSTDOS;;WON'T RETURN IF IS DOS.‚YSæX;ðHX; OPEN SOURCE FILE - ADDR OF FILENAME STRING IN PARAM LIST ISú)X; ALREADY ASSIGNED TO IOCB # 2X‚†WCDUPS$>;;USE I@ÜýOCB #2Q>„OPEN;;OPEN COMMAND" P…ICCOM9,Q>;;READ ONLY6 P…ICAX19@7 …CIOCL;;CALL CIO - IF ERR PRN‚ MSG,CLOSE, GOTO MENUJX;TLX; EOFFLG - SOURCE FILE EOF FLAG FTRF - FLAG TO SHOW IF 1ST TIME SOURCE^X; FILE WAS READh‚;rQ>|P†EOFFLG;;CLE@ÝýAR EOF FLAG†!P„FTRF;;CLEAR MEANS FIRST TIMEX;š2X; DO UNTIL (SOURCE EOF FLAG (EOFFLG) IS SET)¤‚GX; SET UP IOCB#2 TO DO GET CHAR. ZP LOC BUFADR HAS BUFFER ADDRESS® X; BUFLEN HAS BUFFER LENGTH¸X;Â…DODUP$>;;USE‚IOCB #2ÌQ†BUFADR;;IN LSB,@ÞýMSB ORDERÖ'P…ICBAL9;;SET BUFFER ADDR IN IOCB #2àQ†BUFADRê P…ICBAH9ôQ†BUFLEN;;IN LSB,MSB ‚RDERþ P…ICBLL9;;STORE BUFFER LENGTHQ†BUFLEN;;IN IOCB #2 P…ICBLH95Q>†GETCHR;;COMMAND TO GET CHAR - IGNORE EOL'S (9‚)& P…ICCOM90 ƒCIO;;CALL CIO@ßý:X;DJX; CHECK FOR ENDFILE. IF YES, THEN SET FLG. CHECK FOR ERR. IF ERRN;X; THE‚ PRINT MSG, CLOSE FILE, AND RETURN TO MENU.XX;b&I†INSDES;;IF GOOD READ WRITE BUFFERl)>ƒEOF;;WAS IT EOF?vF†SETFLG;;YES‚ THEN SET FLAG€0!†CIOER1;;WAS ER@àýR - PRINT MSG,CLOSE,GOTO MENUŠ$†SETFLG"†EOFFLG;;SET ENDFILE FLAG”X;žLX; WHEN GOO‚ READ OR EOF GET HERE. ASK USER TO INSERT DESTINATION¨;X; DISK AND ATTEMPT TO WRITE TO DESTINATION FILE.²X;¼6†IN‚DES$>5ƒIDD;;ARG: ADDRESS OF LINE TO@áý BE PRINTEDÆQ>4ƒIDD;;IN REGS A AND XÐ †DSPLIN;;SAY TO SWAP DISKSÚ$ †GETLIN;;WAIT TI‚ USER HITS ä*ƒPER;;WAS BREAK KEY HIT?îI†DODEST;;NO, TRY WRITEø#!†CLSSRC;;YES, CLOSE & GOTO MENUX; JX; CHE‚K IF FIRST TIME SRC WAS READ. IF YES, T@âýHEN OPEN FOR OUTPUT5X; ONLY. OTHERWISE, OPEN FOR OUTPUT APPEND. X;*+†DODE‚T$> ;;USE IOCB #3 FOR DESTINATION4%> ;;ASSUME APPEND>Q„FTRF;;IS FLAG CLEAR?H,H†OPNDES;;NO,NOT FIRST TIME - OPEN APPEN‚R %>;;YES, THEN OPEN OUT ONLY\/#„FTRF;@ãý;SET TO SHOW NOT FIRST TIME NEXT TIMEfX;p†OPNDESC;;GET OPEN TYPE CODEzP…ICAX‚9;;SET AUX1 BYTE„Q>„OPEN;;OPEN COMMANDŽ P…ICCOM9˜X;¢FX; THE FILENAME IS THE FIRST FILE IN THE PARAMETER LIST-PA‚.¬X;¶3Q>4ƒPAR;;SET BUFR ADDR TO FILE SPEC @äýTO BE OPENEDÀ %>5ƒPARÊ3*†WCFLAG;;IF WLDCARD-WLDCARD BUFR INSTEAD OF PARÔ J†S‚IPWCÞX;è Q>4†WCBUF2ò %>5†WCBUF2üX; †SKIPWCP…ICBAL9 C P…ICBAH9$ ( …CIOCL;;CALL CIO, IF ERROR GOTO MENU. X;8 IX; ‚ CHECK IF SOURCE BUFR LEN IS NOT EQUAL TO ZE@åýRO. IF NOT = ZEROB 6X; THEN WRITE BUFFER TO THE DESTINATION FILE.L X‚V %>;;SOURCE IS AT IOCB #2` $> ;;DEST IS AT IOCB #3j "Q>;;CHECK LENGTH LOW FOR ZEROt R…ICBLL8;;LOW=0~ !H†DOWRIT;;NO ‚HEN WRITE BUFFERˆ R…ICBLH8;;IS HI=0?’ *F†CLSDES;;Y@æýES, DON'T WRITE EMPTY BUFFERœ X;¦ *†DOWRITQ>†PUTCHR;;PUT CHAR COMMAND CO‚E° P…ICCOM9;;IGNORE EOLS (9B)º Q†BUFADR;;GET BUFFER ADDRESSÄ P…ICBAL9Î Q†BUFADRØ P…ICBAH9â 'Q…ICBLL8;;GET BUFFER LEN‚TH TO WRITEì %P…ICBLL9;;FROM IOCB OF SOURCE FILEö &Q…I@çýCBLH8;;SET BY GET TO ACTUAL BYTE #P…ICBLH9;;COUNT READ INTO BUFFER '‚…CIOCL;;DO WRITE - IF ERR GOTO MENU X; #X; CLOSE DESTINATION FILE( X;2 &†CLSDESQ>…CLOSE;;CLOSE COMMAND CODE< &P…I‚COM9;;CALL CIO - IF ERROR GOTOF …CIOCL;;MENU AFTER PRI@èýNT MSGP X;Z HX; TEST ENDFILE FLAG. IF IT IS SET THEN COMPLE‚ED DUPLICATION.d =X; OTHERWISE, DO LOOP BODY AGAIN (READ THEN WRITE).n X;x "Q†EOFFLG;;IS SOURCE AT ENDFILE?‚ H†CLSS‚C;;YES, THEN DONEŒ X;– GX; ASK USER TO INSERT SOURCE@éý FOR NEXT READ & THEN REPEAT LOOP  X;ª .$>5ƒISD;;ARGS: ADDRESS‚OF LINE TO PRINT IN´ Q>4ƒISD;;REGS A AND X¾ ! †DSPLIN;;SAY TO INSERT SOURCEÈ $ †GETLIN;;WAIT TIL USER HITS Ò *ƒPER;;WA‚ BREAK KEY HIT?Ü #G†CLSSRC;;YES, CLOSE & GOTO MENUæ !…DODUP;;R@êýEPEAT LOOPð X;ú ;;SOURCE AT IOCB #2, Q>…CLOSE;;CLOSE COMMA‚D CODE6 P…ICCOM9@  ƒCIO;;CALL CIOJ X;T .*†WCFLAG;;TEST IF 'DUPL@ëýICATE WILDCARD' MODE^ 0J†DUPFEX;;BR IF NOT 'DUPLICATE WILD‚ARD' MODEh !$>5ƒISD;;INSERT SOURCE MESSAGEr Q>4ƒISD| 2 †DSPLIN;;NEEDED TO GET NEXT WILDCARD DIR ENTRY†  †GETLIN;;WAIT FOR ‚R , „PERX;;IF BREAK-KEY ABORT - EXIT TO MENUš "!†WCOPYL;;JUMP TO WIL@ìýDCARD LOOP¤ †DUPFEX ® X;¸ !†MENUSL;;GO TO THE MENU‚Ì ?X; **** ASK IF OK TO USE PROGRAM AREA ROUTINE ****Ö X;à X;ê 4‚OK;;A@îýRGS: IN A AND X ADDRX $>5‚OK;;OF LINE TO DISPLAY‚ †DSPLIN;;ASK TO USE PGM AREAl "Q>4„CMSI;;SAY A Y RESPONSE WILLv $>5„CMSI;;INVALIDATE MEM.SAV€  †DSPLIN;;PRINT CAUTIONŠ ‚ †CHRGET;;GET 1ST CHAR OF” R> Y;;USERS RESPONSEž H†USEBUF;;NO, THEN USE DBUF@ïýF¨ X;² *X;USE ALL MEMORY AVAILABLE-PROGRAM AR‚A¼ 3X;MEMLO,MEMTOP,BUFADR,BUFLEN ARE IN LSB,MSB FORMÆ X;Ð $†USEDB4Q>;;CLEAR WARMSTART FLAGÚ "P†WARMST;;TO SHOW PGM AREA U‚EDä 0P†MEMFLG;;SHOW NO USER AREA GOOD-MEM.SAV ALSOî Q>4…NMDUP;;USE ALL AVAILABLE@ðýø -P†BUFADR;;MEMORY-FROM END OF DUP TO MEMT‚P Q>5…NMDUP;;BUFADR HAS BUFFER P†BUFADR;;ADDRESS Q†MEMTOP;;GET LENGTH OF ;;;PGM AREA* S>4…NMDUP4 P†BUFLEN;;LSB,‚SB ORDER> Q†MEMTOPH S>5…NMDUPR P†BUFLEN\ X;f IX; FIND THE GREATEST @ñýMULTIPLE OF 125 LESS THAN THE PROGRAM AR‚Ap JX; THEN SET BUFR LEN TO IT. THIS PREVENTS FRAGMENTATION TO FILEz +X; WHEN APPEND IS USED IN DUPFIL.„ X;Ž‚.Q>;;INIT MULTIPLE OF 125 (MLT125) TO ZERO˜ P†MLT125¢ P†MLT125¬ X;¶ &X; D@òýO UNTIL (MLT125 > BUFLEN)À X;Ê .†FIN‚GMQ>};;INC THE MULTIPLE OF 125 BY 125Ô %,;;TO GET THE NEXT HIGHER MULTIPLEÞ O†MLT125è P†MLT125ò Q>ü *O†MLT125;;MLT1‚5 IS IN LSB,MSB ORDERP†MLT125X;1X; TEST FOR MLT125 > BUFLEN - LOOP TEST$@óýX;.1Q†BUFLEN;;IS MSB OF MLT1‚5 > MSB OF BUFLEN?8R†MLT125BD†GETMLT;;YES, THEN END LOOPL'H†FINDGM;;IF MLT LSB BUFLEN?jE†FINDGM;;NO, REPEAT LOOPt@ôý3X; ‚ ;ELSE END LOOP.~>X;********************** END OF LOOP***********************ˆX;’LX; CHECK IF MULTIPLE = TO 125‚ IF IS, THEN LEAVE BUFLEN AS IS. IFœEX; ISN'T THEN SET BUFLEN TO THAT NULTIPLE OF 125 M@õýINUS 125.¦X;°)†GETMLTQ†ML‚125;;IS MSB NOT = ZERO?º H†REPLAC;;YES, VALUE IS > 125ÄQ>};;IS LSB > 125?Î R†MLT125Ø,D†REPLAC;;YES, REPLACE BUFLEN ‚ITH MLT125â:;;ELSE LEAVE BUFLEN AS ISìX;ö3†REPLACQ†MLT125;;SUBTRACT 125 FROM MLT125 TO GET*;@öý;;GREATEST MULTIPLE LESS ‚HAN OR EQUAL S>};;TO THE PROGRAM AREA.)P†BUFLEN;;USE IT AS THE BUFFER LENGTH.Q†MLT125(S>2P†BUFLEN< :;;R‚TURNFX;P8X;USE BUFFER DBUF (250 BYTES) INSTEAD OF PROGRAM AREAZX;d†USEBUFQ>4„DBUF;;USE DBUF ASn@÷ýP†BUFADR;;BUFFER ADD‚ESSxQ>5„DBUF;;IN LSB,MSB ORDER‚P†BUFADRŒQ>4„EDBL;;STORE DATA–P†BUFLEN;;BUFFER LENGTH Q>5„EDBL;;=TO 256(100HEX)ª‚ P†BUFLEN;;IN LSB,MSB ORDER´ :;;RETURN¾È=X; **** CHECK FILENAME FOR WILDCARD CHARACTERS **@øý**ÒX;ÜX;æJX; ‚ CHECKS THE STRING AT PAR,X FOR WLDCARD CHARACTERS (* OR ?). IFðJX; THEY ARE FOUND THE ROUTINE SETS THE = FLAG. IF‚A IS FOUNDúEX; RETURNS TO THE CALLING ROUTINE WITH THE EQUAL FLAG RESET.X;†LOOKWCQƒPAR9@ùý2"R> *, F†LOO‚W26R> ?@ F†LOOKW2JR>‚CRT F†LOOKW1^#R> ,;;TERMINATE WITH CR OR COMMAh H†LOOKWCrX;| †LOOKW12† †LOOKW2: THE = FLAG. IF‚A IS FOUNDúEX; RETURNS TO THE CALLING ROUTINE WITH THE EQUAL FLAG RESET.X;†LOOKWCQƒPAR9@þþ‚èX;SAVE #D2:DUPTST.M65ò!AšTEST FILE SPEC FOR DOS.SYSAü+X; **** TEST FILE SPEC FOR DOS.SYS ****X;X;X; S‚BROUTINE - TSTDOS$X;.GX; CHECKS A FILE SPEC IN THE STORAGE LOC FOR DOS.SYS. USED TO8JX; PREVENT COPYING TO ‚Dûý FILE NAMED DOS.SYS. IF DOS.SYS IS OPENEDB@X; OUTPUT FMS WILL WRITE A COPY OF DOS OUT TO THE FILE.LX;VGX; E‚TRY - REG X HAS INDEX INTO PAR TO FIRST CHAR OF FILE SPEC`/X; ASSUMES COMPLETE FILE SPEC.jMX; EXIT - ‚ILLDüý NOT RETURN IF FILE NAME = DOS.SYS, BUT GOES TO MENU.tX;~)X; FIND END OF DEVICE ID - COLONˆX;’ †TSTDOS2;;NEVE‚ IS FIRST CHARœQƒPAR9;;GET 2ND CHAR¦R> :;;IS IT A COLON?°,F†GOTCOL;;YES, THEN NAME STARTS AT CHAR 3º 2;;ELSE NAME STAR‚S AT CDýýHAR 4Ä(†GOTCOL2;;POINT AT FIRST CHAR OF NAMEÎX;Ø1X; COMPARE FILE NAME IN PAR WITH DOS.SYSâX;ì%%>;;INDEX‚INTO DOS.SYS FILE SPECöX;*‡NXTCHARQ‚DS8;;GET NEXT DOS.SYS CHAR $RƒPAR9;;TEST IF FILE NAME IS SAMEH†NOTSAM;;NO, TH‚N RETURNDþý3(2;;ELSE TRY NEXT CHAR2%)>;;ARE THERE MORE CHARS TO TRY?<H‡NXTCHAR;;YES, DO AGAINFX;P1X; FILE NA‚E EQUALS DOS.SYS - ERROR EXITZX;d.Q>4„DCDS;;PRINT MSG - DEST CAN'T BE DOS.SYSn $>5„DCDSx †DSPLIN‚!†MENUSL;;GOTO MENU‚X;–3X; Dÿý NOT EQUAL TO DOS.SYS - RETURN TO CALLER X;ª †NOTSAM:´X;¾+„DCDS A›DESTINATION CANT BE DOS.SYSA=‚CR FILE NA‚E EQUALS DOS.SYS - ERROR EXITZX;d.Q>4„DCDS;;PRINT MSG - DEST CAN'T BE DOS.SYSn $>5„DCDSx †DSPLIN‚!†MENUSL;;GOTO MENU‚X;–3X; Dkþþ‚èX;SAVE #D2:DUPSAVE.M65òA’SAVE A BINARY FILEAü&X; **** SAVE FILE ROUTINE ****X;X;†SAVFIL „SFMG$Q>.‚P…INITQ8 P„RUNQB †GETIC1LQƒOPTV5`$ƒPTR;;PUT EOL ON FILENAMEjQ>‚CRt PƒPAR9~ …GETNO;;GET HEX PARAMETERˆ‚Iý P„LDST’ &„LDSTœ(>5…NMDUP ¦*E†DSLMFG;;BRANCH IF NOT SAVING DUP AREA° "„WDR1º†DSLMFG …GETNO;;END ADDRESSÄ P‚LDNDÎ &„LDNDØ;â S„LDSTì P„WDRLöA S„LDST -E…ADDOK;;BR IF ENDING ADDR > THAN STARTING!†MENUSL;;ELSE BACK‚TO IýMENU…ADDOKP„WDRH()>‚CR2%F†NRUNAD;;BRANCH IF NO MORE PARAMS<$ …GETNO;;GET A RUN ADDRESS IF ANYF P†INITADP&†IN‚TADZL†INITADd,F†NINTAD;;BRANCH IF NO INIT ADDRESS GIVENn"…INITQ;;SET FLAGx†NINTAD)>‚CR‚+F†NRUNAD;;BRANCH IF‚NO RUNIý ADDRESS GIVENŒ …GETNO;;GET RUN ADDRESS– „PERX;;CHECK FOR ERRORS  P…RUNADª &…RUNAD´ L…RUNAD¾%F†NRUNAD;;B‚ANCH IF NO RUN ADDRESSÈ"„RUNQ;;SET FLAGÒ†NRUNADQ>ÜPƒOPTæ7;;OPTION CHAR FROM FILENAMEðR> A;;IF APPENDú H‡:SVO‚EN"ƒOPIýT;;SET OT=$FFX;X; OPEN THE FILE"X;,‡:SVOPEN$>6 Q>„OPEN@ P…ICCOM9J*ƒOPT;;IF APPENDTG‰:ISAPPEND^Q‚h H…:SVO1r‰:ISAPPENDQ> |…:SVO1P…ICAX19† …CIOCLX;šX; WRITE SAVE FILE HEADER¤X;® Q>†PUTCHR¸ P…ICCOM9 Q>4„‚AVHÌ P…ICBAIýL9Ö Q>5„SAVHà P…ICBAH9êQ>ô P…ICBLL9þQ> P…ICBLH9*ƒOPT I…WHEAD;;BRANCH IF NOT APPEND&Q>0 P…‚CBLL9: Q>4„LDSTD P…ICBAL9N Q>5„LDSTX P…ICBAH9b…WHEAD …CIOCLlX;vX; WRITE DATA RECORD€X;Š ƒWDR$>”+„WDRLQ>;;T‚IS IMMEDIATE VAIýLUE MODIFIEDž P…ICBLL9¨+„WDRHQ>;;THIS IMMEDIATE VALUE MODIFIED² P…ICBLH9¼ #…ICBLL9Æ H†:WDRH1Ð #…ICBLH‚Ú†:WDRH1Q„LDSTä P…ICBAL9î Q„LDSTø P…ICBAH9 ƒWEX!„WDR1 3„SFMG A£SAVE-GIVE FILE,START,END(,INIT,RUN)A=‚CR+„WDRLQ>;;T‚IS IMMEDIATE VAHàþþ‚èX;SAVE #D2:DUPMISC.M65ò A™MISCELLANEOUS SUBROUTINESAü%X; **** MISC. SUBROUTINES ****X;X;†GETLINQ>‚CR$$‚O.‡:CLRLINP„LINE980B I‡:CLRLINLQ>VPƒPTR` P„IPTRjPƒPERt †CIOGET~ …SCROLˆ:’X;œX;¦X;°3X; CIOGET - G‚MýT LINE OF INPUT FROM SCREEN EDITORºX;ĆCIOGETQ>†GETRECÎP…ICCOM;;SCREEN EDIT IOCBØ Q>4„LBUFâ P…ICBALì Q>5„LBUFö P…I‚BAHQ>P  P…ICBLLQ> P…ICBLH($>2( ƒCIO;;READ RECORD FROM SCREEN EDITOR<%)>€;;CHECK FOR BREAK ABORT STATUSF ‚‡:GM ýETRTNP'"ƒPER;;PARAM ERROR FLAG IS SET IF SOZ ‡:GETRTN:dX;nX;x+X; CHRGET - GET 1 CHAR FROM EDITOR IN A.‚X;Œ†CHR‚ETQ>–PƒPER %…CHRG1 †CIOGET;;GET A LINE FROM E:ªQ…ICBLL;;SAVE CHAR COUNT´ P„RCNT¾ …SCROLÈQƒPERÒ$I…CHRG2;;IF BREA‚, CLOSM ýE AND EXITÜ …CLOSXæ !†MENUSLð)…CHRG2Q„RCNT;;EXPECT 1 OR 2 CHARACTERSúR>G…CHRG3;;IF OK Q>4‚OL $>5‚OL" ‚DSPLIN,!…CHRG1;;TRY AGAIN6…CHRG3Q„LINE;;GET 1ST CHAR@:JT"‚OL A”PLEASE TYPE 1 LETTERA=‚CR|X;†%X; PERX - EXIT IF ‚ARAMETER M ýERRORSX;š „PERX*ƒPER¤ G…PERX1®:¸ …PERX17Â7Ì !†MENUSLÖX;à …PIOCB !†GETFILX;&X;0/‡GETNAMEQ>;;ENTRY TO GETFIL USED BY REN‚ME:)PƒCTR;;M ýWHICH DOES NOT HAVE A DEVICE IDD"%ƒPTR;;FOR THE SECOND FILE SPECN $„IPTRX !„CFTEbX;lX; SUBROUTINE -‚GETFILvLX; REMOVES ONE FILE SPECIFICATION FROM THE INPUT LINE. WILL SET UP€JX; THE SPEC FOR DEFAULTS FOR INCO‚PLETE DRIVE ID.M ý DEFAULT DRIVE #ŠX; IS 1.”X;žX;¨!X;GET FILESPEC FROM INPUT LINE²†GETFIL%ƒPTR¼ $„IPTRÆQ> ЂPƒCTRÚX;ä,X;AVOID GETTING JUNK ON VERY SHORT PARAMSîX;ø Q„LINE9R> ,  F„ADDCR>‚CR  F„ADDC* Q„LINE94R> ,>‚FƒGT1HR>‚CRRFƒMýGT1\Q> :;;LOOK FOR : IN FILESPECf4R„LINE9;;SEE IF HAVE COMPLETE FILESPEC ALREADYp F„CFTEz R„LINE‚9„HƒGT1Ž"ƒCTR˜ Q„LINE9¢R> A¬)I„CFTE;;HAVE X:FILE, COMPLETE FILESPEC¶X;À'X;IF FALLS THRU, IS UNIT:FILE, ADD DÊX;‚ ƒGT2Q> DÞ PƒPAR8èMý3ò I„CFTEü ƒGT1"ƒCTR "ƒCTR $R„LINE9;;AN UNLIKELY CASE (:FILE) FƒGT2;;TREAT FILE AS U:FILE$ "ƒC‚R. „ADDCQ> D8 PƒPAR8B 3L Q> :V PƒPAR8` 3j „CFTEQ>t PƒOPT~ …CFTE1Q„LINE9ˆ PƒPAR8’ 2œ 3¦ R>‚CR;;LOOK FOR TERMIN‚TOR° FƒEOCº R> ,Ä FƒEMýOCÎ R> /Ø F„POPTâ R> .;;LOOK FOR START OF .EXTì H…CFTE2ö Q>;;FOUND, 4 MORE CHARS MAX PƒCTR ‚…CFTE2"ƒCTR I…CFTE1 X;( ,X;GETS HERE IF TOO MANY CHARS IN FILENAME2 X;< Q>4ƒNTLF $>5ƒNTLP  †DSPLIN;;NAME TOO LONGZ ‚"ƒPER;;SET PARAMETER ERROR MýFLAGd ƒSTEQ„LINE9;;SKIP TO ENDn 2x R> ,‚ FƒEOCŒ R>‚CR– HƒSTE  ƒEOC&„IPTRª 'ƒPTR´ :¾ „PO‚TQ„LINE9È PƒOPTÒ 2Ü Q„LINE9æ 8PƒPAR8;;CHANGE STORED TERMINATOR TO , OR CR I HOPEð 2ú IƒEOC ƒNTL ANAME TOO LONGA=‚‚R, X;6 X; DSPMSG - DISPLAY NMý BYTES@ 4X; BUFFER POINTER AND LENGTH ARE ALREADY IN IOCB0J X;T †DSPMSGQ>†PUTCHR^ P…ICCOMh ‚$>r X;| („CIO1 ƒCIO;;CALL CIO AND GO TO MENUSL† )>€;;IF BREAK KEY ABORT H…:CIO2š !†MENUSL¤ …:CIO2:® X;¸ 'X; DSPLIN‚- DISPLAY ONE LINE OF TEXT X; Mý A=LO,X=HI ADDRESSÌ 0†DSPLIN ‡PRNTMSG;;USE RESIDENT DUP SUBROUTINEÖ -!…SCROL;;SCROLL SC‚EEN BELOW MENU & RETURNà X;ê X;ô -X; SCROL - DO SCROLLING OF AREA BELOW MENUþ X; …SCROLQ> > P…ICBLH9& Q> 0 P…I‚BLL9: Q>5ƒZAPD P…ICBAH9N Q>4ƒZAPXMý P…ICBAL9b !†DSPMSGl v ƒZAP ƒCUP=ƒCUP=ƒCUP=ƒCUP=ƒCUP€  ƒDLL=ƒCDN=ƒCDN=ƒCDN=ƒCDN¨ ‚;² $X; PIOCB - POINT IOCB AT PAR(PTR)¼ X;Æ …PIOCBQ>4ƒPARÐ ,Ú OƒPTRä P…ICBAL9î Q>5ƒPARø O> P…ICBAH9 : X; -X; ‚IOCL - CALL CIO AND PROCESS ANY ERRORS*Mý X;4 …CIOCL ƒCIO;;CALL CIO> CH G†CIOER1R :;;OK, RETURN\ †CIOER1C;;ERROR STATUSf‚ …CIOER;p &S>d;;ERROR NUMS ALWAYS ARE 1XX DECz $> 0;;CONVERT TENS„ „CTNS2Ž ;˜ S> ¢ I„CTNS;;THE EASY (SLOW) WAY¬ ,‚ O>  0;;CONVERTÀ PƒEUNÊ &ƒETNÔ $>5ƒCMýIEÞ Q>4ƒCIEè „CIEX †DSPLINò  …CLOSX;;CLOSE IOCBS 10,20ü !†MENUSLƒCIE AŠERRO‚- 1A ƒETN  ƒEUN $ ‚CRLX;VX;`8X; GETNO - GET HEX NUMERIC PARAMETER FROM LINE(IPTR).j8X; RETURN A=LO‚ X=HI. PER SET MINUS IF ERROR.t"X; IMýNC IPTR PAST PARAM.~X;ˆ…GETNOQ>;;MAX NO DIGITS’PƒCTRœQ>¦P‚T1°(P‚‚1;;INIT TEMP TO BUILD NUMBER INº ƒGHB$„IPTRÄQ„LINE9;;GET CHARÎ #„IPTRØR>‚CR;;SEE IF TERMINATORâFƒGNDìR> ,öFƒG‚D$ †HEXCON;;CONVERT ASCII TO NIBBLE G„ERRX;;MýIF ERROR%>;;SHIFT T1,T1+1 BY 4 „SHT1,( U‚T12U‚T1<1F I„SHT1P‚L‚T1;;OR IN NEW NIBBLEZ P‚T1d"ƒCTR;;COUNT DIGITn%IƒGHB;;LOOP UNLESS TOO MANY DIGITSx Q>4ƒTMD‚ $>5ƒTMDŒ…ERRX1 †‚SPLIN–"ƒPER :ªƒGND?´ Q‚T1¾$‚T1È:Ò"„EMýRRXQ>4ƒIHP;;INVALID HEX PARAMÜ $>5ƒIHPæ H…ERRX1ðƒTMD ATOO MANY DIGIT‚A=‚CR,ƒIHP AINVALID HEXADECIMAL PARAMETERA=‚CR@X;JX;TAX; HEXCON - CONVERT ASCII CHAR IN A TO HEX NIBBLE IN A. RETURN‚.X; MINUS CONDITION, A=FF IF ERROR.hX;r †MýHEXCON;|S> 0†G…ERRX2;;ASCII BELOW '0'R> šGƒOKX;;0-9 CONVERTE‚ SO EXIT¤;® S> A 0 ¸+R> ;;CONVERTED VALUE MUST BE 10 OR MOREÂG…ERRX2;;BETWEEN '9' AND 'A'ÌR>ÖGƒOKX;;A-F CONV‚RTEDà …ERRX2Q>ÿê%ƒOKXR>;;SET STATUS BY VALUE IN AôMý:þX;7X; GETDN - GET A DEVICE NUMBER FROM LINE(IPTR)X; ‚ RETURN IT IN AX;&*…GETDN*ƒPER;;SEE IF PARAM ERROR ALREADY0GƒGDR;;IF SO DON'T BOTHER: $„IPTRD„GETDQ„LINE9N2X‚R> D;;IF DNbF„GETD;;GO GET DIGITl;vS> 0;;CONVERT DIGITMý€FƒBDS;;CAN'T BE ZEROŠGƒBDS;;IF NOT DIGIT”R> žIƒBDS;;TO‚ LARGE¨5²ƒGD1Q„LINE9¼2ÆR> ,ÐFƒGDX;;IF TERMINATORÚR>‚CRäHƒGD1;;KEEP LOOKINGîƒGDX&„IPTR;;ADVANCE POINTERø7‚ƒGDR:  ƒBDS"ƒPER Q>4ƒNDS;;NEED DEVICE SPEC MSG  $>5ƒNDS* !Mý†DSPLIN4ƒNDS ANEED D1 THRU D8A=‚CR9 …@ORG 3> …NMDUP ‚HƒLEN…NMDUPƒEDNp„MLEN…NMDUP„NDOSFƒGDX;;IF TERMINATORÚR>‚CRäHƒGD1;;KEEP LOOKINGîƒGDX&„IPTR;;ADVANCE POINTERø7‚ƒGDR:  ƒBDS"ƒPER Q>4ƒNDS;;NEED DEVICE SPEC MSG  $>5ƒNDS* !Lf…‡‚’‡ …„‡$)„ö2„û=„ûI„öU„öa„öm„öy„ö…„ö„öœ„ö¨„ö´„öÀ„öÌ„öØ„öä„öð„öý„ö„ö„ö „ö+„‡7„öC„öO„ö[„ö‚„ös„ö„ö‹„ö”‹„ö „ö¬‹„öµ„öÁ„ìÌ„öÔ„öß„öè„öñ„öú„ö„ö „ö„â „‡*„ö5„öA„öM„…öY„öe„öq„ö}„û‰„û—„ö¡„‚Qý­„칄ìÄ„âЄöÙЄöäЄöðЄöüЄöЄöЄöЄ‡(„ö2(„ö=(„öH(„öS(„ö^(„öi(„öt(„ö(„öŠ(„ö•(„ì‚ „ö«„ö¶„º„ö΄öÙ΄‡ å„öò„öÿ„ö „ö……‡VÌö„‡’2 ö ì?ÄV‡cöcöVìÌ„Äköw…ìâ™â¥„‡°¦¬„‡¦Çú„‡‚hÓQ ýöÿö „ââöÿö„Ø?‡¬‡&ñ…öúö¨öúö¨Î°öðö°öðؔ·Àöö2„ÎV^öiöì)ö5섇˜™öì@öLöXìdö‚µ„‡ …ö™„âLÀö…‡j„‡t™„öñ„öp„ö|„ö‡„ö)p„ö“ö öö ì öH‡Šö¦ö²ì¼„ö²öÆö^öÆöiìtìöÐöAöHö)‚ÜìÆöQ!ýæöÆöæ„öðö|…‡^ö|öi„ìûtìö)öìÜØ5öñöö„ööpöpö¼ö'ö3‡>„Î3™öHöSöSö]öj„ØH„ö¼„ö„Øæ‚5켄ö܇5â¼…„Îö|ö^ì|öiØuâuØ|ö|‡ |ö|ö|ö^ö|öiìû„’u|ì|ötö|ö|ö‡ |öìŠö|ö”ìž„…ØŠÐöžìpö‚„öžtìQ"ýöpö²öÐö²öÐö»‡ ™öd„زööööö)öÆöÜ„öÆñöÐöÛ„öÐð„‡ ç”öñö„Øñì…„‡ vÛ„ö „âЄöcÌ‚öSÌ…‡o„‡tüÌ„öü„Ø5ö«öŠö ö+‡5öHö”ö^ö”öiö6ötö6öö)ö+ö5ö+„ì@„ì  öH…öüö^öüöiö¦„ì+„þ¦‚?ÿÿIÿ)…‡Q#ýc„‡¦Çú„‡hU„ö@„öúö@öpìÀöaì'ö>ìÀöm„‡>öxö@öm„ìxƒöƒö]ìö„û¥û]ØMöHö˜ö^ö˜öiì‚ì‡)ö˜…ì¢ìÀ„ìmö*öHö)„ìj´öUö´öUì¬ö´ö¬ö´„쮺ì^öº‡ iìñì™ö‡„ö¢„öÆÌ„ººÌ„ûIº„ñƒÌ„öÌ…‡=‚‡B'Îö öHöQ$ýüö^öüöiö¶öŠö¦ì΄ºÚ‡äö»„öäö)„öîöùöîöööööìöö„öùö#öùö …öö öö ì‡ ‚„ö#5ö@öÚö/öÚö®„ö/w„Øì;ö;ìö^ööiìtìö)„‡0E»ì™ödöä„ÎQ»ì™ödö΄ØdUö´öUö´…„‡>»@öX„ì‚'ö[ìÀög„ì[ öQ%ýHö¦öAöHö6ötö6öö”ö^‡ ”öiö)„ög*öHö)„Øamâ öHöÆö^öÆöiö¶öŠö)„Ø5*‡ Hö)„ØÎö*‚öHö)„’]^öi‡ âYöHΙñ„‡ r~k„⌄ö„ö;„ö΄‡¦Çú…„‡ ê–ì–„‡ ˜…„‡”Ø”„ö¡„⪄ö´ª„ìÆ„ö¾Æ„öÇÆ„‚ЄìÙ„ìã„öï„öø„Q&ýö „ö „ö „ö !„ö +„ö 5„ö ?„ö H„ö R„ö [„ö c [„ö o„ö z o„ì †„ö ’„ö œ ’„ö ¨„‡ ±Ì…„‡ º âÌöÌöÌöÌ…‚ÌöÌöÌöÌöÌöè„ö Å„ö Ð Å ºì„‡Äw„…ì ç ò þ  ! - 8ö C N Z f r } ‡ö “ Ÿ„ö «…‡<œìpìÌìØöyìyö…öaØ~ì ¶‡™â¥ì‚„Ø ¶„ö à «öãö çöÂö çöQ'ý„º é ºö^…ö ºöi‡ Ðötö Ðöö ô…„Ä â ö ö ö]ìö !ìÌö é‡ -öãö -âÂìÎöÂöÎìÎâÎö 8ö Dö‚âÎìÎì΄‡  - aö aö 8ö …„ì aÌ„Ø ìÌ„ö j …„‡ ò tö ~ö Šö ?ö¡ì –ì¡ö¡ì¡Ø ?„ö –Ìö¡ö 5ì Ÿö ªö ¶‡Šö öHö !ö Àö ?ì‚5ì Ë„ö Ö á„ö Ë 5ö¡ì Öö ë„ìQ(ý tÌ…„‡  öö ~ö ¶ì Ø¡ì ö ö ö 8ö „ö Ì„Î öñ‡ öqöHö Àö „ö  'ö 'ö 8ì HìqöHöÇö^‚ÇöiìÆìÆö¡ØÆ„‡ <ö öH슅ö¡ö^ö¡öiö ÀöÆö^öÆöiöMöHì ?„Ø Fìtì‡ ÀöÆì Pö ?ö ?ö Hö F„Ä ZÆì döÆØ Z„Ø d‡‚Æ„â nÆöÆØ nö 5ìÆ…ìÌöÆöÇöQ)ýÇö 8ö !ì Fö ?ö Hö 5öÌöƇ  Àö xö <„ö P xö „ö xö*öHö À„ö 'Ì„Î öÌ…„‡ ƒÌ„ö Ì„¦ „ö •‚ö ¡„ö ­„ö ¹ ­„ö Ä„ö Ðö ­„ö ƒö ~ö ?ö 5ö¡‡ Üì èö ô„ö Ü „ö ô„â ì •„ì ö ¡âŠö öHö¡ö^ö¡öiö À…„‡ #MöHö ­ötì‚ ¹ö^ö ¹öiö Àì ¹ì /ì /ì*öHö ÀöQ*ý „â / •‡ ¡ö :ì ¡ö #„ì : •ì*öHö À„Ø E ¹ö Qö ]ì Eö „ì Q„ì ]ö¡‡ h„ì h Ð…„Ä t ¹öÔö €ö‚Є⠀ì tì ¹öÔö Œì Ð„ì ˜ ¹‡ Ôö ¤ö Ð„ì ¤ì ˜„ì ŒÌö Ðâ Äö Äö 8ì ö °â Ðö^ö Ðöiö »„‡ ° Çì öHìŠö Ðö^ö Ðöiö !ö À…â Ÿö ‚„ö Óì Hì ªì Hì ?‡  5ö¡ì Üö á„ì ÜöQ+ý¡ì è„â è Ðö ôö5ì„â ôö Ðö Ðö^ö Ðöiö „‡  ì Ÿö ªØ 5öì 5ö èö"ö.ö.ö 8ö „…ö.Ì„‚"‡  ¶ö Ç„ö7ö¡ìììAì !ö á„öAöÎ öHìŠö !‡ À„Ø á 5ö¡ââL„ö ëö +öW„ö ö ö 8ö5ö „…ìLööñ‡  ììb„ö‚„öböŠö öHö +ö Àì•„ØWA„ön !ö +öQ,ýHö5öHöÙö^‡^öÙöiöi„öw !ö cötö cöö)ö ö +ö !ötötööötö‚ö À„ö‚ ö‚wìŒö–„öŒ !‡¡…Ø*öHö)„ö¡ +öªö*öHö)„öª +ö³ö¼ö¼ö]„ö³ì öÆö „öÆ …„‡L !Ïö ~öÙö ¶ì ØeìHö Àö „öÏÌ„‡‚ ö¡ìæ„âæøìð…„Ä Ÿýö‰„â Nýö}ööQ-ý$ö0‡¼ö;ö ¶öEöEö 8ö !ìNöìW„öN „ì„ìWöHöbö^öböiìŠö À„‡ýÌ„ö‚„ö¼öÌ„öb„ö;öÌ…„ÎkU„öva„ö þ„ö‹ö‹ì‹ö‹ö—ì‹ö‹ö—‡‹„ö£¯ö¯ö 8ö „Ø—ö£„⸋ö£ö‹ö£ì¸Îaìkök‡ Iìv‚vöIöE…„쯄öÌ„º }Äö$öÎö ¶öÎöÎö RìQ.ýÙöa‡ Q„âÄÌ…„ÎäÌ„ö ‡äö !ìîö'öøööö 8„öî5„öÙ „Øøöî„ö„‡ ‚Ì…„‡ C$Ø$ö0ö ¶öøì0ö8ìðØ8ö8ö 8ö !ìB‡KöKö 8ì ìHö0ö^ö0öiìŠö Àâ*öHö À„ÎUº‡¡ìUö0ö¡…ì ?ì Ÿö ¨ö‚ö ¨ööö;öaöjöaötöö;ìwö öwö ‡ùQ/ýö~„öB „ö$Ì„öKÌ…„Ä8Ì„Î0̄Ί̅„‡¶ð„‡ $“žöÆì©ØŠöŠö 8ö „Ø‚…„‡ r´ö ~ìñöñì¾öñ„ö¾ ¶ö“ìÈìÒì–„öÒÛöÛö 8ö5„öÈ „öÛÌ„‡´Ì…„Î -äö ~ö ¶ö—ìHö Àö „öäÌ„ì 8îö ~ö ¶ö¡ì‚Hö Àö „‡îÌ…„‡.ø„ö„ÎÌ„öÌ„ì"Ì„ØžÆöQ0ýåöÆöåöøö7ìÆø‡Óììö ?öÆö !…ì Hìì„Ø Zì œö$ö0öøö0ö‚+ö ¶„‡"9øö +öCöLöLö 8ö !ö œöU„öLÌ„¦Caöaö 8ö !„öU‡ oöö o…ºì=ö [öö=ö [Ø [ö oö [ö oöj„öt~‡~ö 8ö ‚„ìj‡ìñö’öžöö öö ö ?ö ö Hö ö !ö ö¡„Ø«öQ1ýñö œ‡ ¡öaöaö 8ö !„Ø¡µ„…ØÁÊöÓöñöÝöæöñ„öÝú„öñüìüöÓö‚‡ Óö ?öòöö [öüö [ööÁ„Øñö«„ö#ñö œì;ö;ÿ 8ÿ !î’ö¡ö’ÿ +þ;‡ òâþù‰ÿWýþñ¡…„ìñö#ö +ö7ÿÆÿå‚Æÿåúâìö „ε„ö_jöÎöu‡ ÎìÎì öÎì ì_ö oöüöQ2ý oö„â’…„âj ? H !„öu ? H !„â~Ì„öaÌ„‡ ;Ì„ÄÊ !ö H‚€ö ?ö ?öÆö !ì H„ö€ !„ÄöŠö„öŠ„‡æø…„Äú +âÙöÁö ö„ö „؇Àöªööö 8ö"‡"ö 8ö !ìµìÀö@„öª„ìµì …„‚°¿Ì„ì “¿ö ~ö ¶ö¡ìɇ„ìÉ ÇØaöaö 8ö$ö ¶ì èöÕì „Q3ý…ìÕ΄‡ »ö öHìŠö ÀÄ †ö ’„ÄßöÙö^öÙöiö cöt‡ cööA‚Hö)Îêöööö„öö †…„Îê;ö;ö 8ö$öïöö„‡*ì ’öì ’„ìöŠö öHØ¡ö¡ö ö&ì Ðö Є‡ &^ìiö À°tö2öö>„ì2‚5öHöÙö^öÙ…öiötötö‡ ö À„Ø>*öHö ÀÎ †öØaöaö 8öQ4ý$öïööß„‡ "ö*öHö)ì öJöaöaö 8ö$ö ¶ö „öJì …„‡ :‚ÇÀöVööö 8ö"ö"ö 8ö !ì Š„ÎVöÀö@ööÙ‡ öÙöìö cööö cº zö z„Øbì z…ö zì z‡ zØ cö zönöbö cö zöb„ºn z‚zì zöz„âz z‡ cö zì c„Î ŠÆöÙöÆöÙöÙö cöÙö c…„‡ è¡â†ìQ5ý†öÌö’ì è„ì’„ö†…„‡’ö¡ìž„ìž„‡ª0ö¡ö·ØªØÃö 8ö „Ø·„ìÃÌ……„‡ fÍìîöùö ~öñì ?öÌö¡öÎöööö×öÚ„ö×Îö;ö;ìöj‡öãö „öãtöÌö~öÎööööîöî„‚îÌö~öÎö ¶ö ö ö ö~öù„ö~öñ‡ñÎ …öHöñΊö ÀØ5öHöŒö^öQ6ýŒöiìt‡öñö!ìtöö^ööi„ö! À„Ø,„öjöt„öt‚ötìöö^ööi„‡AÚ„öÍÌ…„‡$ÌìªØ ?ö HöïöWö D„ºWMöHö´ö^ö´öi‡ tìì)âï„Ä !öï„öpWötö ö Döïö{‚5ö „ö{ ‡†ö‘ö‘ö 8öp„ö†ª……„â‘Ì„º ¶ïö™„ì™ì „Ø ~$„ö¤‡ Q7ýŸö ª„âÙö Rö ?ö Hö°„¦ ª ?ö Hì Rت‡ ºöÌöºöªìÄ‚ÌöÄ쪅ö°öªöÄö Röªì°„ØÍö¡ì°„öÄ R‡  RöªöÍö R„öºö¡â¡„ì°öñ„öÖªö¡âÌöáìáìêìô‡ R„öô RöÖØÿöÿö 8öï‚öªâáöÌö„öá Hö ?…„ìêªöñìªö¡ìᄇ ÿÌ„° ô5öH„â)â „Î 8]öQ8ý D„‡  Dììtööiöö^ö ô…„ìßö脺 Ÿ¡ì ‚ö^ö¡‡ i„Î À)ì„ì„ö–„â%â%â/ö8öAöA„öJ 8ö5ö „‡A„ö8„ö/öÌ„œÎö Rì [ö [„öT Höª…ö HöÌö]ì]‡för„ì|ö‚[ö [ì|ö [ö [ö RöTö†ö†„ö 8öï„ì]ö [ö [„ìršöšö„ö†Ì„‡šÌ„¦fì£ìQ9ý®Ø£ì®„…ö£„ö®„‡&0ïö·ö H„öÀªâÀâÊöÊ‚Ê„ìÓªâÜöÌöÓ„öÜ H„‡·„öÊïöåöåö 8„öåÌû„‡¦Çú„‡>„öa ±„Ø6”„‡îƒ [„öT Höª…ö HöÌö]ì]‡för„ì|ö‚[ö [ì|ö [ö [ö RöTö†ö†„ö 8öï„ì]ö [ö [„ìršöšö„ö†Ì„‡šÌ„¦fì£ìP‰ÿÿ‚}Need DOS2.5,type Y ÒÅÔÕÒΛØ# N ©1?©ñ¢ l© ¢LlD:RAMDISK.COM›©LÍu ÐL¥1©©í¢ ÍL ¥;ÐLê˜HL³ê+œºŽ  T `‚Ž  ” `1©ž©Ÿ… ©… ­œêÉÐ © ©  àêêê¥Ð Ø`TŽU “©À ¦L’­ð­žð ? . “ tä©`…ðöŸ¤Ÿ©€Ÿ©Gà‚U;ýᢩB©J Œ©Ð~¢©ôD©E©H©I ©B Vä0d©ÿÍôÐVÍõÐQ¢© D©E©H©I VäFÀˆÐ9 ’,ž0 ©,ŸŸ0‚s0hhL¸­Ð ©¢ ¦L©ª` ’©Ð÷˜H ’h¨Ð DH­¡E¨hÈШÈЭ¢ ­£¡©¢D©E©L­¢8í H­£í¡I­¡ :É3ê‚­£U<ýÉê° ­ 0©€ ŸŸþHÐþI,Ÿ0­ 0Î  9© .¢©Gâ©ã VäLO,ž0 L÷ÉÉ4*IJ`lâlàD1:AUTORUN.SYS›NEED M‚M.SAV TO LOAD THIS FILE.›;—D1:MEM.SAV› ’©J y08© B©|D©E©ŠH©I Vä0 ’0 `©B©;D©ELŒ`­?<0LV䜂¢U=ýŽžŽŸʆ v s©…ð? F0Ξ05©:¢ ¦©[¢ ¦©B©D©E©H©I Vä­ÉYÐ8©…¢ © B Vä¥ œ¥ ©@… ©… ©/¢‚D©E ŒžˆŒ ¤`E:›D1:DUP.SYS›ERROR-SAVING USER MEMORY ON DISK›TYPE Y TO STILL RUN DOS›sn œ©B©;D©E© J Œ œ‚(`©ð 9U>ý¢ Vä©ðî ­âÇ­ãÈ©âªÃ© ï©ðî¾­àÇ­áÈ©àªÃ© ï ’­ž-”ðî”LLu ÄèŽÅÆ¢©ÃD©E©H©‚LVä 9© .lú¿ 9© .l­œ… ­… `­žÐ` s©…ð$©B Œ©B©ŠH©I©|D©E Vä©o BLVä n䢩B©,D©‚E© JLVä©U?ý ¢B Vä¢ © BLVäDŽE¢ŽIÊ© Bêê­ðåLÿÿÿ  Ì E:› }DISK OPERATING SYSTEM II VERSION  ²®µ COPYRIGH‚ 1984 ATARI CORP.››A. DISK DIRECTORY I. FORMAT DISK›B. RUN CARTRIDGE J. DUPLICATE DISK›C. COPY FILE K. BINARY SAVE›‚. DELETE FILE(SU@ý) L. BINARY LOAD›E. RENAME FILE M. RUN AT ADDRESS›F. LOCK F !ILE N. CREATE MEM.SAV›G. UNLOCK FIL‚ O. DUPLICATE FILE›H. WRITE DOS FILES P. FORMAT SINGLE›L˜ !N'Æ#"&¾)æ)9(Ð&©*)/h)¬'ú'-Ê&¢ÿ؆莟©…R©'…S¥ €…‚ v­¾ÉLð/©©Ë¢UAý ÍL¼ }Insert DOS 2.0s, type Y ÒÅÔÕÒΛ©ô©x…© …©D©E©fH!!©I ž1¢ÿšèŽ#©q¢! ¦©@¾ y0É›ðÏ8‚A0,Íô' ¨±È…±… ±ªˆ± °1 ¶1¥i…æl©d¢! °1L!NO SUCH ITEM›SELECT ITEM OR ÒÅÔÕÒÎ FOR MENU›!"õ! Ê0 ¿.®½zÉ:Щ‚{}©.|èè莩›{UBýŽ¢ Ø1 ã0 ¿0©¢J©BŽþ é1­8íÉðL¨%®½|ÉDÐóL¶%DIRECTORY--SEARCH SPEC,LIST FILE?›"#[# Ê0‚¿0 ¸&­|ÉDð©3¢" °1L!NOT A DISK FILE›¢­žÉNÐ ©!B é1L!©E¢# °1©¢ ©!B©ñD©E©Dñ©:ó­}É:Щ1ò¢©B©J©|‚©E é1©ôD©E©BUCý©¢©H©I é1­õÉ Ðhî­Í0ߢ ¹ôÉ ð ôèÈà0ð©.ôè  ¹ôôÈèÀ 0ôŽ©?ôè©›ô©ñ¢ #k‚°1 y0ÉYЛ­®©›ô¢ é1 ;#LŠ" ;#L!¢© BLé1TYPE "Y" TO DELETE...›DELETE FILE SPEC›l#Ž#COPY--FROM, TO?›OPTION NOT ALLO‚ED›¦#´# COPYING---DN:Æ#Á$lUDý# Ê0­­|ÉDТ Ò.ðL/%©€#©#©‘#¢©J©B©|D©E é1©B©H©I©’D©#E é1­’‚É0É:° © B é1L!­#Í‘#ðî‘#ÐÁî#© B é1 ¹œ#Ùc$Јõ0‰SYS 1­}É:𨌳#¢ ½’#É ð™²#Èèà Ðð½’#É ð©.™²#Ƚ’#É ð™²#Èèà Ðð©‚™²#©¦¢# °1,#P¢©²D©#ELÂ$UEý½%J- <.¢©B©J©²D©#EŽþ é1¢ Ø1­H­H ã0hh®½|ÉDðL¨% 1½}É:ð¨Ì³#Ð ’L¾%¢‚Œ³#©²D©#ELÞ%¢ Ø1 ã0® è.® Ò.Ð0©O¢% °1L!WILD CARDS NOT ALLOWED IN DESTINATION› ¿0 <.­|ÉKð<ÉCð8ÉEТŽþL¨%ÉSð(¢©‚©JŽþ é1®½|ÉKð ÉEЩÿLõUFý%¾%€&©|¢# °1 ’L!ÉCðﮞàAÐÉDÐä© Ð©¢ J©BŽÿ é1©K©®þ¬ÿB© ™B¥D™D¥E™E‚®þ­H­I VäŒø®ÿ¬þ¹HH¹IIHð é1­øÌɈðLñ1®þð© B Vä®ÿð© B Vä®ÿЩI¢' ¦,#Lì#L!&'œ& Ê0 Õ0 ¿0 ‚&© ¢B é1L!RENAME - GIVE OLD NAMEUGý, NEW› ­}É:ð)¨ŒöLS)'©ýÐ'©þ' 70 ¹2i0H'K' ¿0©0¢' °1 y0ÉYЭ' ! 'L!'G'¢B‚©JD©'E˜JLé1WHICH DRIVE TO FORMAT?›TYPE "Y" TO FORMAT DISK I'J'›DL'8(:›«'¬ý¿©ªý¿Íý¿Ð©Uý¿Íý¿Ð Œý¿©Ÿ¢' °1L!­ü¿Ðñª­ý¿ð‚Íý¿ÐæèÐó v©¢ä _ \ä©¢ä b \äLNO CARTUHýRIDGE›È' 70 2 ¿0…†­ÉðP vL RUN FROM WHAT ADDRESS?›TYPE "Y" TO CREATE MEM.SAV›ß‚ y0ÉYÐ s0 ©¢( °1 ’L! FõLð1MEM.SAV FILE ALREADY EXISTS›9(4)Õ( 70 ¹2 ¿0ö 0+)') S)©¢) °1 y0ÉYÐr©ò¢( °1©¢B©*D©‚E©J é1¢© B é1¢ ½.{ÊÐ÷­+)}Ž¢UIý Ø1© éĩũùó/©ø/©3ÆH©uà© áξL›/L!DRIVE TO WRITE DOS FILES TO?‚WRITING NEW DOS FILES›TYPE "Y" TO WRITE DOS TO DRIVE .›D1:DOS.SYS›5)g)ERROR - NOT VERSION 2 FORMAT.› t*­ôÉð ©5¢) °1L!`h)‚*©) Ê0©®žžàNÐΞ ¿0 ©àðàð˜Lñ1©›¢) °UJý1 ’L!BAD LOAD FILE›LOAD FROM WHAT FILE?›Ó) Ê0 ¿0©#¢B é1L!WHAT FILE TO LOC‚?›û) Ê0 ¿0©$¢B é1L!WHAT FILE TO UNLOCK?›* +DUP DISK-SOURCE,DEST DRIVES?›TYPE "Y" IF OK TO USE PROGRAM AREA›CAUTION: A "‚" INVALIDATES MEM.SAV.›©…F©ô…E­ö…!©ù +LðUKý1© ­þþ©© © `*©  70 ¹2ö ¹2ÿ ¿0­öÍÿð.¢*©Ù °1 y0Î 0)‚NSERT BOTH DISKS, TYPE RETURN›©^¢, °1 y0©©3 +,­å8逭æé­Í­í° ©N¢, °1L! Ý,©žC, t*­ ù­ ú­‚û­ü­þýLx+©ž, 0 ©^¢, °1 y0 , ¡,0,ž0 ULýÇ,LŽ+ Í,­I€0î ¾,­ÍðV­Í­í°Ç­ž0«Îž, 0 ©}¢, °1 y0­C,ЂîC,­ÿ 0K' !­ "­ H­ H©ý 'h h Lx+­ž¸­ÿ…!©ô,B,…E©…F 5Lð1L! ¹D,…¹I,…¢¡H¹ùh™ùˆå­­`D,- ‚þNOT ENOUGH ROOM›INSERT SOURCE DISK,TYPE RETURNUMý›INSERT DESTINATION DISK,TYPE RETURN›þÎÐôþ©­þ`î Ђî `­ö­ÿ8 rLð1`¥ð©-¢* °1©P¢* °1 y0ÉYЩ…ž`hhL!-þ-NAME OF FILE TO MOVE?›- Ê0 ¿0­|ÉDðL¾% <.¢,©^ °1 70 ¿0‚Ò.Щ@Lä#¢ è.¢©B©J é1©  ¢¥D¥E­H­UNýI©B Vä ÀˆðLð1Î ¢,©} °1 70,õL.¢   ­ Ð î ˜J©B©|‚,#P©² #D˜E é1 ¢ ©ÙHÐÙIð© B¥D¥E¹HH¹II é1© Bÿ-ç. é1­ Т,©^ °1 70,õ0La-¢© B Vä,#P¢,©^ °1 ‚0 ¿0Lì#L!¥ð©-¢* °1©P¢* °1 y0ÉYÐj©…ž©…©3…­å8é­UOýæé3©©}m©m­Í Ðå­Í°Ý­Ð©}Í`­‚8é}­é`©ô…©…©ú©`½|èÉ*ð É?ð É›ðÉ,Ðìè`è.(/è½|É:ðèè ¹-)Ý|ÐÈèÀÐò© ¢/ °1L!`DESTINATION CANT BE DOS.SY‚›)/$00© ¾ Ê0­žH®©›{ 2ÃŽÄà4°Δ 2ÅŽÆ8íÃó/ŠUPýíÄ°L!ø/À›ð) 2âŽã ãðΠÀ›ð 2 ¿0àŽá áðξ©ž‚ÉAÐΞ¢©B,ž0©Ð© J é1© B©ÁD©E©H©I,ž©H©ÃD©E é1¢©H©IþHÐþI­ÃD­ÄEL“SAVE-GIVE ‚ILE,STA%060RT,END(,INIT,RUN)›7021©›¢O¤Êú©õ S0 ¶1`©BUQý©¤D©E©PH©I¢ VäÀ€ÐÎõ`©õ S0­H÷ ¶1­õ ’‚!­÷É0 ©ª¢0 °1L~0­¤`PLEASE TYPE 1 LETTER›,õ0`hhL! 70¢ Ø1Lã0©¬®L<1¬®© ½¤É,ð;É›ð7½¥É,ð"É›ð©:ݦð1Ý¥ЂÎ½¤ÉA"©D™|ÈÎÎݤðíΩD™31.2|È©:™|È©ž½¤™|èÈÉ›ð,É,ð(URýÉ/ð+É.ЩÎÞ©¢1 °1Îõ½¤èÉ,ðÉ›ÐôŽŒ`½¤ž轂™{èéNAME TOO LONG›© B¢ VäÀ€ÐL!` ¦L¶1©ªI© H©1E©ÎDLž1œ©|mD©iE` Vä˜0`˜8éd¢/è8é úi:2Ž2‚2© °1 ’L!ERROR- 1›©©®/2ÿ2½¤îÉ›ð+É,ð'  20* ..USýˆö ÎÓ©r¢2 °1Îõ`¨­®`©‚¢2ÐëTOO MANY DIG‚TS›INVALID HEXADECIMAL PARAMETER›8é00É 0 8éÉ 0É0©ÿÉ`,õ0'®½¤èÉDðø8é0ð0É H½¤èÉ,ðÉ›ÐôŽh`Îõ©ð¢2L°1NEED D1 THR‚ D8›33ÿ ’L!ERROR- 1›©©®/2ÿ2½¤îÉ›ð+É,ð'  20* ..T»Ätÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€BDUP M65B DUPEQU M65B DUPINIT M65BDUPLOAD M65B 1DUPMEMSVM65B<DUPSUB M65BMDUPSIO M65BdDUPBUF M65B hDUPCMD1 M65BuDUPDIR M65B yDUPDEL M65BƒDUPCOPY M65BšDUPCMDS M65B ©DUPDOS M65BµDUPCMD2 M65B¹DUPDUP M65B&ÔDUPFIL M65BúDUPTST M65BDUPSAVE M65BDUPMISC M65BDUP REFB:DUP OBJ