0 #X;save#d:MDUP3.M65 MYDOS moduleX;X; K. SAVE FILE COMMAND(X;28SAVFIL ASAVE:filename,start,end(,init(,run))A==< GETFNF 'IBUFPPIBUFZQOPTd5n GETNO2x(>DUPEND%>p EDSLMFG4%>`;;FORCE MEM.SAV TO MEMORY BEFORE SAVING IMAGEDSLMFG D2B8A GETNO2 PHDBUF &HDBUF; SHDBUF PHDBUFA SHDBUF IADDOK ERRXIT% AInvalid START-END range!A==ADDOKPHDBUF" #HDBUF, HINCOK6 #HDBUF@ INCOKQ>J)>CRT FNINTAD^ GETNO2h PINITADr&INITAD|LINITAD FNINTADQ>;;SET 'GOT INIT' FLAGNINTADPTEMP)>CR FNRUNAD GETNO2 PRUNAD &RUNAD LRUNAD FNRUNAD #TEMP#TEMP;;SET 'GOT RUN' FLAG NRUNAD7 WRDUP%>'OPT1& 'VECTOR0'VECTOR:X;DX; OPEN THE PROGRAM FILENX;X%>bR> Al HOPTOK1v"OPT3OPTOK1'IAUX$>+ ANYDEN;;OPEN FILE 'OUTPUT/ANY DENSITY' GKIOERRQOPTFFULHDR;;IF NO 'APPEND' DOIO;;WRITE SHORT HEADER   PUTCHR VECTOR GKIOERRKEXITQHDBUF  PILEN QHDBUF PILEN* QHDBUF4 PIBUF> QHDBUFHPIBUFR *STATE\ GKMSAVf !WDR1pKMSAV!WDRzX;FULHDR WR6BYT IKEXITKIOERR!CIOER1X;D2B8APHDBUF &HDBUF 'STATE:X;#X; N. LOAD PROGRAM INTO MEM.SAVX;0MEMSAV ALoad MEM.SAV from what file?A== QSTATEL>;;TURN ON MEM.SAV FLAG GLOADITTOMEN!MENUSL$X;.!X; L. LOAD USER FILE FUNCTION8X;BBDLDFL%>LBLOWUP!CIOER1VX;`'LDFIL ALoad from what file?A==j QSTATEtM>;;TURN OFF MEM.SAV FLAG~LOADITPSTATE GETFN 'IBUFPIBUF$DATA;;JUST A CR? FTOMENQ> PIAUX$> ANYDEN DOIO   GETCHR  DATA GBLOWUP QDATA( MDATA2R>< HBDLDFLF QDATAP FTOMENZQOPTdN> Nn FGOTNxQ> PWARMSTQ> GOTNN> PIAUXQ>' PICMD Q>CIOV$>CIOV HBRUN1X;X; B. RUN CARTRIDGEX; STCAR QN>P"R,'HNORAM;;IF ADDRESS SPACE IS NOT RAM6N>@P;;IF RAM, NO CARTRIDGEJNOCART ERRXITT ANO CARTRIDGE!A==^X;h NORAM$r#HNOCART;;IF NOT ATARI CARTRIDGE| QCARTST$CARTSTBRUN1PVECTOR&VECTOR QINISAV PDOSINIQINISAVPDOSINI QSTATEM> PSTATE !LDFILEX;X; M. RUN AT ADDRESSX;%BRUN ARun from what address?A= GETLIN& Q@FNPTR70R>;;NO ADDRESS?:FBRUN2;;IF SO, ABORTD GETNO2N)>X HBRUN2b%>l 'WARMSTv FBRUN1BRUN2 ERRXIT, AAddress must be 1-4 hex digits!A==X;*X; PUT A SINGLE CHARACTER ON THE SCREENX;CHRPUT$>PUTCHR &ICMD$> &ILEN &ILEN !CIOVX;X; PUT MESSAGE TO THE SCREENX; PRTMSGPRAMLO &RAMLO PRTNXT$>* Q@RAMLO64 FPRTXIT> CHRPUTHPRTENT#RAMLOR HPRTNXT\ #RAMLOf HPRTNXTp PRTXIT:zX;X; PRINT AN IN-LINE STRINGX; PRINT7 PRAMLO7 PRAMLOPRTMEN PRTENT QRAMLO5 QRAMLO5:X; #X; READ A BYTE FROM THE KEYBOARD X; !CHRGET XE424;;FETCH THE BYTE$ )>. +GKILLRD;;IF BREAK OR EOF, ABORT COMMAND8 R> z;;> LOWER CASE Z?B ENCHGCSL R> a;;< LOWER CASE A?V DNCHGCS` S> ;;CONVERT TO UPPER CASEj NCHGCS5;;SAVE ITt R>~ FCHRXIT;;IF EOL, ECHO IT  CHRPUT;;ELSE, ECHO IT Q>;;FOLLOWED BY EOL CHRXIT CHRPUT 7;;RESTORE FOR PROGRAM :;;THEN EXIT )KILLRD CHRPUT;;MOVE TO NEXT LINE AND +!MENUSL;;EXIT WITHOUT RETURN TO COMMAND X; *XE424 CLOSE7;;get a chr from keyboard & SOPEN;;Open #7 for keyboard input =OPEN KDEV  DOIO;;get a character  p===== 5;;save it for a sec C;;save error stat( 52 CLOSE7< 7;;get error stats againF ?P 7;;get character backZ :;;that's all, folks!d KDEV AK:A=;;handler addr.n X;x CLOSE7 DOIO;;close IOCB #7  p=== == : X; %X; RAW SECTOR READ/WRITE FUNCTIONS X; RSEC1QCSRC RSEC2, X; SECTIOPDUNIT Q> PRCNT 6 CLD1$SECSIZ 2 8 6" BSIOR, IDRTS6 R>@ FTOERR2J "RCNTT ICLD1^ TOERR28h !CIOER1r X;| DRTS8 : X; 'X; CHECK FOR 2-COLUMN DIRECTORY LIST X; CLEARIT$CSRC QICMD9 R>GETCHR FCLERXIT QDATA& R> 0 EEOFEXIT %ILEN9 )> DSHFNL "ILEN9 %>& SFTSIZQDATA80 PDATA8: 3D HSFTSIZN SHFNLQTOGGLX N>b PTOGGLl PDATAv CLERXIT: X; EOFEXITQ> RTOGGL FCLERXIT "IBUF9 #ILEN9 PDATA' : X; TOGGL  X; 4X; COPY ONE FILE (AS MANY MEMORY LOADS AS NEEDED) X; COPYFL$CSRC QILEN9 LILEN9 FNOOUTP* QSWPFLG4 IWRFILE> Q>IDDH $>IDDR PRTMSG\ CHRGETf $CDESp RESETz WRFILE$CDES HDOWRFI CLEARIT $> DOWRFIQIOCB9;;OPEN? "IPUTOUT;;YES, WRITE NEXT BLOCK X; $OPT Q> (> A;;APPEND? HDOPO1 Q> DOPO1$CDES PIAUX9! ANYDEN;;OPEN THE OUTPUT FILE GTOCIORX;$PUTOUT$CDES. %CSRC8 QILEN8B PILEN9L QILEN8V PILEN9` QIBUF8j PIBUF9t QIBUF8~ PIBUF9 Q>PUTCHR PICMD9$ CIOCL;;WRITE NEXT BLOCK OF DATANOOUTP$CSRCQISTAT9;;EOF?R> FCPYXIT QSWPFLG IRECOPY Q>ISD $>ISD PRTMSG CHRGET  $CSRC RESET !RECOPY(X;2COPYF$CSRC< PICMD9FQ>P PTOGGLZRECOPY$CSRCdQ>nPDATAx QBUFAD %BUFAD DEFBUF QBUFLEN PILEN9QBUFLEN PILEN9 CIOV;;READ DIRECTORY DATA ITOCPFL)>;;END OF FILE?HTOCIOR;;IF ERROR, ABORTTOCPFL!COPYFLTOCIOR!CIOER1X;CPYXIT$CDES FNOTCL CLOS2"'QDOSRNM;;NEED TO RENAME DOS.SYS?, FNOTCL67 SOPEN;;IF COPYING DOS.SYS (REALLY 'DIAMOND'OS.SYS)@ J DELETET$ DOSRNM;;DELETE EXISTING DOS.SYS^ SOPENh r OPEN| DOSSYS;;MAKE NEW ONE SOPEN;;and close DOS.SYS = ==;;writingQ>;;CLEAR RENAME FLAGPDOSRNMNOTCL$CSRC !CLOS2X;X;1X; SCAN DIRECTORY AND BUILD THE NEXT FILE NAME#X; EXIT WITH NOT-EQUAL IF AT ENDX;SCNDIRQ>DATA%>DATA DBUF10 Q>GETREC PICMD&Q> 0 PILEN:Q>DPILENN"PCBYTE;;ASSUME NOT A DIRECTORYX CIOCL;;READ A FILE NAMEb QDATAlR> :v ENOTDIRR> 0 ESCNDXNOTDIRFGOTSPC QDATA  RCBSAV HNOTSYSGOTSPC"CBYTENOTSYS$FNPT%>X;MDN1QDATA8R> ;;space FMDN2 PPAR9 23 )> * DMDN14X;> MDN2Q> .H PPAR9R2\%> fMDN3QDATA8pR> ;;spacez FMDN4 PPAR932)>  DMDN3 MDN4Q> . RPAR9 HMDN50!MDN5Q>;;TERMINATE FILE NAME PPAR9, SCNDX:X;GETLINQ>DATA  PFNPTR$ PIBUF.Q>DATA 8 PFNPTRB PIBUFL Q>GETRECV PICMD`$>j &ILENt0~ &ILEN%>'PTRX;CIOCL CIOVC GCIOER1:CIOER1'FR0Q> PFR0 IFP FASCII%>  Q@INBUFF7 PCIERC3( Q@INBUFF72 PCIERC<3F Q@INBUFF7PM>Z PCIERCd ERRXITn AError -- AxCIERC A000A==X;HEXDEF%DATA)> HGETNO2:X; GETNUM, $;;SKIP SINGLE BYTEX; GETNO2; WTEMP2 NXTFLD 'VECTOR'VECTORGETNDQ@FNPTR73"R> F;;IS IT A DIGIT, EGETNDE6S> 0;;NOTE THAT CY=0@ DGETND1J R> ;;0-9?T *TEMP2^ IGOT10h!DGOT1;;YES, SHIFT INTO NUMBERr R>;;A-F?|EGOT16;;YES, HANDLE IT GETND1; O> 0GETNDE'PTR? QVECTOR$VECTOR:X;GOT10EGETND15 TVECTORUVECTOR QVECTOR$VECTOR TVECTORUVECTOR& TVECTOR0UVECTOR:,D OVECTORN PVECTORX7b6l,v OVECTOR PVECTORAOVECTOR8O>PVECTOR !GETNDX; GOT16S>GOT1TVECTORUVECTOR TVECTORUVECTOR TVECTOR UVECTOR TVECTOR UVECTOR* LVECTOR4 PVECTOR> !GETNDHX;R0X; GETFN -- READ A LINE, GET FILENAME FROM IT\X;f GETFNQ>pPDOSRNMz GETLIN FWCTSTLX;>X; GETFN2 -- EXTRACT A FILENAME FROM A LINE ALREADY READ IN-X; X IS THE OFFSET IN THE BUFFERX;GETFN2 NXTFLDWCTSTLQ@FNPTR73R> ?FSETWC;;IF ? OR * FOUND,R> *'HCKEOFN;;SET FLAG, FIND FIRST MATCH SETWCQ> PCPYTYP FWCTSTLX;$0CKEOFNR>;;IF EOL, CONTINUE WIT SINGLE FILE. FFNSET8R> .B FWCTSTLLR> /V DFNSET` HWCTSTLjSLSHLPQ@FNPTR7tR> S~ HNCPSYS PCBSAV FSAVEDNCPSYSR> X HNOTSWPQ> PSWPFLG GSAVED!NOTSWPPOPT;;SAVE OPTION CODE SAVED1Q> P@FNPTR733  Q@FNPTR73R> /( FSLSHLP2R> .< DFNSETFR>P FFNSETZ1dX;n+FNSET'PTR;;SAVE POINTER TO SECOND ARG.x1 Q@FNPTR7 PDELIMQ> P@FNPTR7? Q@FNPTR7R> 0 DDEFDRVR> : FDEFDRV3 ELKFCOL>Q> : R@FNPTR7 FDBEFOR"1, P@FNPTR76A@ HDGTCODJX;T&LKFCOLQ@FNPTR7;;SCAN FOR DRIVE ID^ FDEFDRVhR> :rFDEVINC;;DEVICE INCLUDED|3 Q@FNPTR7R> : FDEVINCX;DEFDRVQ> :DGTCOD DECFNPDBEFORQ> D DECFNPDEVINC%FNPTR QFNPTR:X; NXTFLD,QPTR;;MOVE INDEX TO A OFNPTR PFNPTR&Q>0?: OFNPTRD PFNPTRN:XX;bDECFNP%FNPTRl HDECFP1v "FNPTRDECFP1"FNPTR#PTR%> P@FNPTR7 GETDN1:X;2X; REQUIRE A DISK DRIVE (NO FILE SPECIFICATION)X;&GETDN2 GETFN2;;GET NEXT FILE NAME&!GETDNE;;THEN CHECK FOR DRIVE ONLYGETDN GETFNGETDNE'IBUFPIBUF%>  GETDNL3>  Q@FNPTR7* HGETDNL4 (> :;;ANY FILE NAME INCLUDED?>FGETDN1;;NO, THEN RETURNH ERRXITR# AFile name not allowed!A==\X;f%X; UPDATE DENSITY OF DISK IN DRIVEpX;zGETDENR> : HGTDEN2 QDFUNIT GTDEN2M>;;MAKE UNIT BINARY$> &DAUX2 &DAUX$>DATA  &DBUF$>DATA  &DBUF RSEC2 GGETDN3 !RDCONFX;L Q@FNPTR7VR> D` FGETDN3j ERRXITt ANot a disk file!A==~X;X; WAIT FOR SOURCE DISKX;CWFSDQSWPFLG GWFSD GETDN3:;;IF NO WAIT REQUIREDWFSD PRINT.ISD AInsert SOURCE disk, press A= CHRGET *SWPFLGKGETDN3;;IF IN DUP-DISK $CSRCX;RESET%IOCB9  'UNNO QIAUX9 FNOCHG(R>2 ENOCHG<SETDENPDKTYPE8F$>PSAVMAPQMAPBUF9Z PSAXMAP9d0n ISAVMAPx DOFSIN$>RSTMAPQSAXMAP9 PMAPBUF90 IRSTMAPX; NOCHG:X;"SAXMAP ======= =======X;+X; RECONFIGURE DENSITY OR CONFIGURATIONX;DOFSIN$> DOFLOPQWOTDCB9PDUNIT9"0, IDOFLOP6$>1@ &DUNITJ $UNNOT'&DUNIT;;TELL SIO DRIVE TO CONFIGURE^(%DKTYPE9;;GET DENSITY/SECTOR SIZEh(QDRVDEF9;;GET DRIVE SPECIFICATIONr !CONFIGR;;GO CONFIGURE DRIVE|X;FX; SET UP PAR AND IOCB10 FOR A DIRECTORY SCAN (MULTI-FILE ACTIVITY)X;SETSCNPICMD  Q>PAR $>PAR PIBUF &IBUF  SETPTR!$>;;OPEN IOCB10 AS DIRECTORYX;%OPDIRQ>;;OPEN IOCB AS DIRECTORY PIAUX9X; .X; OPEN A FILE INDEPENDENT OF DRIVE DENSITY X; ANYDENQ>& PIAUX90 PIAUX9: Q>OPEND SCMDN ISAVDENX !CIOER1b X;l SAVDEN%DUNITv QDKTYPE8 PIAUX9 : X; 'X; SET UP 'PAR' FOR A WILD CARD COPY X; DEFPAR SETPTR Q@FNPTR7 HDEFPX PCPYTYP PPAR8 Q> * PPAR8 PPAR8!Q>;;termination!!! ! PPAR8! DEFPX: !X;*!SETPTR%>4! SETLP13>! Q@FNPTR7H! PPAR8R! HSETLP1\! SETLP21f! QPAR8p!R> :z! FSETLP3! R> >;;account for sparta type! HSETLP2! SETLP33! 'FNPT!:!X;!%DOSRNM ADA==A:A=`=AOS.SYS,A!CKDTST ADOS.SYSA=!X;!'X; REPORT ERROR, THEN RETURN TO MENU!X;! ERRXIT7! PRAMLO"7" PRAMLO"7 PRTENT;;WRITE ERROR MESSAGE FOLLOWING 'JSR ERRXIT'$" !MENUSL;;THEN RETURN TO MENU."X;8"+X; Subroutines moved from resident code:B"X;L".X; SAVE MEMORY SUBROUTINE: WRITE FILE BODY,V"X; INIT AND RUN VECTORS`"X;j"&WDR LDMEM;;LOAD MEM.SAV IF NEEDEDt"%WDR1$>;;WRITE TEXT TO DISK FILE~" CIOV"IWRERNO;;don't use BMI!"WRERRO2!SAVERR"WRERNO$>INITAD" WRVEC"$>RUNAD" WRVEC" *STATE" KGODOS1" !NOWMS"GODOS1!GODOS"X;"*WRVECVTEMP;;WRITE THIS 6-BYTE VECTOR?#DRTS2;;IF NOT, JUST RETURN # &VECTOR#QINITAD9#PVECTOR(#22#QINITAD9<#PVECTORF#Q>INITADP#PVECTORZ#PVECTORd#!&VECTOR;;(X,A)=MIDDLE WORDn#WR6BYT DOIOx# ==# PUTCHR# VECTOR# IRTS2# !WRERRO2# RTS2:#X;