C>d$X; BY WALT LORD (C)nX;x'X;--- OPERATING SYSTEM CONSTANTS ---'X;--- AND ADDRESSES ---X;ICCOMB;;I/O COMMANDICBADRD;;BUFFER ADDRICBLENH;;BUFFER LENGTHICAUX1J;;AUX 1X;X;VECTOR TABLEX;DSKINVS;;DISK HANDLERCIOVV;;CIO HANDLERSIOVY;;SIO HANDLERSETVBV\;;SET VBI ADDRESSXITVBVb;;EXIT VBIWARMSVt;;WARM STARTCOLDSVw;;COLD START"DOSVEC ;;RUN DOS,INITADR;;DOS LOAD/INIT6GOADR;;DOS LOAD/GO@ VDSLST;;DISPLAY LIST NMIJX;TX;SIO COMMAND BLOCK (DCB)^X;hDDEVICr DUNIT|DCOMNDDSTATSDBUFLODBUFHIDTIMLODBYTLODBYTHI  DAUX1  DAUX2 X;"RTCLKL;;LOWER BYTE OF CLOCKSOUNDRA;;QUIET I/O FLAG*SDMCTL/;;SHADOW SCREEN CONTROL REG.+SDLSTL0;;CONTAINS DISPLAY LIST ADDR.STICK0x;;STICK 0 SHADOWSTRIG0;;TRIG 0 SHADOWCOLORS;;COLOR 0 SHADOW&$CHBAS;;CHAR SET ADDR HI BYTE0 CHRORG;;OS CHAR SET ADDR:"CONSOL;;CONSOLE BUTTON REGDHSCROL;;HORZ SCROLL REGNVSCROL;;VERT SCROLL REGX(WSYNC ;;CAUSES WAIT FOR VERT SYNCb!VCOUNT ;;VERT LINE COUNTERlNMIEN;;NMI ENABLE REGvX;X;FLOATING POINT LOCATIONSX;FASC;;FLOAT->ASCIIIFP;;INT->FLOATFR0;;FLOAT VARIBLE!INBUFF;;OUTPUT BUFFER PNTRX;)X;--- PROGRAM VARIBLES, CONSTANTS, ---)X;--- AND ADDRESSES ---X;%X;"BASE" IS THE DIFFERENCE BETWEEN&X;THE ASSEMBLED ADDRESS AND THE RUN&X;ADDRESS. USED BECAUSE MICRODOS XL$X;WILL OCCUPY THE LOCATION OF DOS X;DURING OPERATION.X;  BASEP*X;4LOADADR;;LOAD ADDR>DIRTAB ;;DIRECTORY TBLHDSPDATp;;DISPLAY DATAR*MAGLNDSPDATJ;;MAGNIFIED LINE ADDR\0STRTLNMAGLN;;START OF DIPLAY FILE NAMESf!BUFFER;;INPUT BUFFER ADDRp CHSET1;;CHARSET LOAD ADDRz%TOPDOS2@;;LOMEM OF ATARI DOS 2 TOPOSS ;;LOMEM OF OSS DOS$CHSTADR0;;ADDR OF NEW CHARSET"SECBUFc;;TEMP SECTOR BUFFER!DNSYFLc;;DISK DENSITY FLAG!DOSLNKc;;LINKS TO DOS FILEX;'X;ZERO PAGE VARIBLES USED BY CREATORX;C"FILNUM ;;# FILES DISPLAYEDMOVFL ;;SCROLLING FLAGMOVCNT ;;DATA ADDR INC#INPFL ;;INPUT ACCEPTED FLAG'PROPTR ;;PROGRAM SELECTION PNTRVSCRL ;;VSCROL PNTRX;$+X;ZERO PAGE VARIBLES USED BY MICRODOS XL.X;8CB#ENDBUF ;;END OF BUFFER PNTRL!BFPNTR ;;POINTS TO BUFFERV%MOVLOC ;;TEMP START MOVE ADDR`#ENDPTR ;;TEMP END MOVE ADDRjX;tX;*** PROGRAM START ***~X;X;TURN OFF SCREENX; SDMCTL X;?X;X;CLEAR MEMORYX;CLRMEM%>@ CLR1Q>>CLR2PTOPDOS29 2 HCLR2 #CLR2(12 HCLR1<:FX;P INITADRZ CLRMEMdX;n"X;SECTORS #1-3 (BOOT) AND #$2D0xX;LOADADRBASE!SECLG BASE;;# BYTES/SECTOR  ;;LOAD 3 SECTORS LOADADR;;LOAD ADDR SETVEC;;INIT ADDRSETVEC BASEQ>4GETFILE;;SET DOSVECPDOSVEC;;TO GETFILEQ>5GETFILEPDOSVECQRSTFLG;;DOS RUNNING?FRESET;;YES, BRANCH,:X;")RESET!COLDSV;;RESET PRESSED, RE-BOOT,X;6RSTFLG BASE@ ;;DOS RUN FLAGJSECLNK BASET ;;SECTOR LINK TO FILE^X;hX;*** GET FILE ROUTINE ***rX;|GETFILE BASEQSECLG;;SET TO CORRECTPDBYTLO;;DENSITY FOR READ HCONT0 #DBYTHI CONT0Q>PRSTFLG;;SET TO DOS RUNNINGPSOUNDR;;QUIET LOADX;X;SETUP DCBX; PDBUFLO PBFPNTR Q>5BUFFER PDBUFHIPBFPNTR QSECLNK& PDAUX10QSECLNK: PDAUX2DQ>1N PDDEVICXQ>b PDUNITlQ> Rv PDCOMND PREFILL;;PRE-FILL BUFFERQBUFFER;;STORE LOAD ADDRPGOADR;;FOR GO ADDRQBUFFER PGOADR! RTRNST;;SET INITADR TO "RTS"X;X;GET LOAD ADDRESS ROUTINEX;GETADR BASE$> Q@BFPNTR7R> HMOVADR  INCPTR Q@BFPNTR7 R>* HCONT14 INCPTR>!MOVADRBASEHX;R CONT1Q>\ PMOVLOCf2pX;z#X;MOVE LOAD ADDRESS INTO PROGRAMX;MOVADRQ@BFPNTR7 PMOVLOC9 INCPTR2(> HMOVADR QMOVLOC PMOVPTRQMOVLOCPMOVPTRX;X;MOVE DATA X; MOVERQBUFFER8 MOVPTR BASE$ P. INCPTR8 QMOVPTRB RENDPTRL ETSTADRV CONT4#MOVPTR` HMOVERj #MOVPTRt HMOVER~ TSTADRQMOVPTR RENDPTR DCONT4 ' JPINIT;;END OF SUBFILE, INITIALIZE !GETADR;;GET NEXT SUBFILE X; $X;ROUTINE TO INCREMENT THE Y REG. "X;IF END OF BUFFER, FILL BUFFER X; INCPTR BASE 3 )ENDBUF EFLLBUF : X; #BUFFLEN ;;#BYTES/SECTOR - 3 FLLBUF%>};;GET SECTOR LINKS( Q@BFPNTR72 M>< PDAUX2F 3P Q@BFPNTR7Z PDAUX1d LDAUX2n FRUNIT;;EOF? JUMP THRU GOADRx PREFILL BASE A 5 CONT5 GETSEC;;GET SECTOR GCONT5;;ERROR, TRY AGAIN !%SECLG;;GET # BYTES IN SECTOR 1 Q@BFPNTR7 (PENDBUF;;STORE IN END OF BUFFER PNTR 7 > %> : X; X;GET SECTOR ROUTINE X; GETSEC BASE" Q>@, PDSTATS6 Q>@ PDTIMLOJ !SIOVT X;^ X;JUMP THRU INIT ADDRESSh X;r JPINIT BASE| C 5 JINI 7 ? X; X;RESET INIT ADDRESS TO "RTS" X; RTRNST BASE Q>4RTRN PINITADR Q>5RTRNBASE PINITADR RTRN: X; JINI BASE !@INITADR:& X;0 X;INITIALIZE THEN RUN: X;D RUNIT JININ !@GOADR:X X;b X;*** MAINLINE ***l X;v MAINLN BASE Q>;;INIT # OF FILES PFILNUM Q>i;;SET UP DCB PDAUX1 Q> PDAUX2 Q>5BUFFER PDBUFHI Q> PDBUFLO PENDPTR;;SET DIRECTORY Q>5DIRTAB;;TABLE PNTR PENDPTR Q>4STRTLN;;SET SCREEN PNTR PMOVLOC Q>5STRTLN PMOVLOC* CONT10 GETSEC;;GET SECTOR4 GENDDIR;;ERROR, GOTO END> #DAUX1;;INCREMENT SECTOR #H $>;;RESET BUFFER PNTRR &BFPNTR\ CONT11%>f Q@BFPNTR7p FENDDIR;;ZERO? END.z GNEXDIR;;IF - THEN LOCKED M> ;;IF NOT LOCKED NEXT FNEXDIR;;DIRECTORY #FILNUM;;FOUND, INC COUNT %> )CONT101Q@BFPNTR7;;STORE SECTOR PNTRS P@ENDPTR6 #ENDPTR 3 )> HCONT101 "CONT12Q@BFPNTR7;;DISPLAY NAME ; S> ;;CONVERT TO SCREEN DATA P@MOVLOC6 #MOVLOC HCONT13$#MOVLOC. CONT1338)>B HCONT12LQMOVLOC;;INC TO NEXT LINEV,`O>j PMOVLOCt DNEXDIR~#MOVLOC-NEXDIRQBFPNTR;;SET UP FOR NEXT DIRECTORY,O> PBFPNTR RSECLGFCONT10;;END OF SECTORHCONT11;;NOT END, CONTINUEX;%ENDDIRQNEWCOL8;;STORE NEW COLORS PCOLORS81 HENDDIRQ>4DSPLST;;STORE NEW DL  PSDLSTL Q>5DSPLSTPSDLSTL(Q>4DSPLI;;POINT TO DLI2 PVDSLST< Q>5DSPLIFPVDSLSTPQ>0;;SET TO NEWZPCHBAS;;CHARACTER SETdQ>;;TURN ON DLIn PNMIENxQ>;;CLEAR FLAGS PMOVFL PINPFL PPROPTRQ> ;;SET VSCROL PVSCROLQFILNUM;;ANY LOCKED FILES?FCONT14;;NO, BRANCH %>4VBI;;INSTALL DEFERRED VBI $>5VBIQ> SETVBV$CONT14Q>!;;SET SCREEN TO NARROW PSDMCTL"GETINPTQINPFL;;WAIT FOR INPUTFGETINPT;;THRU DEF. VBIQPROPTR;;GET FILE PNTR"T?;;MULTIPLY * 2,>6"QDIRTAB9;;POINT INTO DIRECTORY@PSECLNK;;TABLE AND STOREJQDIRTAB9;;SECTOR LINKSTPSECLNK^Q>h>r%>|LOOP5PTOPOSS92 HLOOP5 #LOOP51 HLOOP5#RSTFLG;;SET TO DOS DONE!WARMSV;;WARM STARTX;X;"DOS.SYS" FILEX;` =;;BINARY LOAD HEADER SDMCTL=SDMCTL ;;TURN OFF SCREEN MOVCHS=ENDDOSX;&$X;*** MOVE O.S. CHARACTER SET ***0X;:MOVCHS$>DMV0QCHRORG9N PCHSTADR9X2bHMV0l #MV0v #MV0 QMV0R>;;TOP OF UPPER CASE?HMV0;;NO, CONTINUE :;;RETURNX;X;*** DEFERED VBI ***X;VBIQMOVFL;;SCROLLING?HCONTMV;;YES, CONTINUEQCONSOL;;READ CONSOLW?W?DDOWN;;SELECT PRESSED?W? DUP;;OPTION PRESSEDQSTICK0;;READ STICK0 W?* DUP;;UP?4W?>DDOWN;;DOWN?H%STRIG0;;STICK TRIGGERRFFOUND;;PRESSED?\QCONSOL;;START PRESSED?fW?pEEXIT;;NOTHING EXITzX;X;SELECTION IS MADEX;FOUND#INPFL;;SET FLAGHEXIT;;EXITX;X;SCROLL UPX; UPQPROPTR;;END OF PROGRAMS? RFILNUM EEXIT#PROPTR;;NO, INC POINTER$>(;;INC DSPDAT BY 40%>C;;SCROLL UP VALUES FSETMOVX;$X;SCROLL DOWN.X;8!DOWNQPROPTR;;TOP OF PROGRAMSBFEXIT;;YES, EXITL"PROPTR;;DEC POINTERV$>(;;INC DSPDAT BY -40`%>jQ> ;;SCROLL DOWN VALUEStX;~X;STORE VALUES START SCROLLX;SETMOVPVSCRL &MOVCNT'MOVCNTQ>;;CLICK SPEAKER PCONSOL#MOVFL;;SET MOVE FLAG"CONTMV$VSCRL;;GET NEXT VSCROLQSCRVAL9;;VALUEGINCDSP;;NEG? INC DSPDAT%STORE#VSCRL;;POINT TO NEXT VALUEPVSCROL;;STORE INTO VSCROLR> ;;EQUALS 9? DEXIT;;NO, EXITQ>;;SET DONE SCROLL PMOVFL(X;2#X;ROTATE COLOR AND EXIT DEF. VBI<X;FEXITQRTCLKLPM>Z HGONEd QCOLORSn,xO>L> PCOLORSGONE!XITVBVX;$X;INCREMENT DISPLAY DATA POINTERSX;%INCDSPM>;;MASK OFF VSCROL VALUE5;;STORE ITQDSPTR1;;TOP OF WINDOW PNTR, OMOVCNT PDSPTR1QDSPTR1OMOVCNTPDSPTR1 QDSPTR2;;MAGNIFIED LINE PNTR",, OMOVCNT6 PDSPTR2@QDSPTR2JOMOVCNTTPDSPTR2^&QDSPTR3;;BELOW MAGNIFIED LINE PNTRh,r OMOVCNT| PDSPTR3QDSPTR3OMOVCNTPDSPTR37;;RESTORE VSCROL VALUE!STORE;;GO STORE ITX;X;VSCROL VALUE TABLEX;(SCRVAL ========= ! =========X;X;*** DISPLAY LIST ***X;DSPLST p=p=p=G HEADLN P=s&DSPTR1 DSPDAT0 3=3=3=3=3=3=: =DDSPTR2 MAGLNN sXDSPTR3 DSPDAT@b 3=3=3=3=3=3=l p=Fv FOOTLN A DSPLSTX;X;HEADING LINEX;HEADLN A A =AmicrodosA A A =AxlAX;X;FOOTER LINEX;FOOTLN A A =AupA  A A =AdownA  A A* =AfireA4 A A>X;HX;DISPLAY LIST INTERRUPTRX;\ DSPLI5f QVCOUNTpR>@;;VCOUNT>=64z ED1;;YES.Q>;;SET HSCROL TO 4HD2X;"D1QNEWCOL;;STORE FOOTER COLORP;;IN REGISTERQ>;;SET HSCROL TO 2D2PWSYNC;;- WSYNC - PHSCROL79X;X;NEW COLORSX;NEWCOL h= ==( ENDDOS X;$ INITADR=INITADR. MOVCHS8X;BX;LX;CUSTOM CHARACTER SETVX;` CHSET=CHSETjX;t"CHRSET ?=3=3==s=s=s=~ ~=f=f==g=g== =g=g=`=c=c== ~=f=f=w=w=w== =`=`==p=p== =`=`==p=p=p= =c=`=o=g=g== s=s=s==s=s=s= =======  = = ===n=~==f f=l==g=g=g= 0=0=0=p=p=p=~= g===w=g=g=g= g=w==o=g=g=g= =c=c=g=g=g==  =c=c==p=p=p= =c=c=g=g=g== ~=f=f==w=w=w=( =`===s=s==2 ========g< g=g=g=g=g==F g=g=g=g=o=>==P g=g=g=o===g=Z s=s=s=>=g=g=g=d g=g=g=====n =f=l==7=g=xX; p=p A(C) WALT LORD 1984AX;"X;LOAD SIO DCB FOR SECTOR #$2D0X; DBUFLO=DBUFHI  DAUX1=DAUX2 X; INITADR=INITADR GETSECX; GOADR=GOADR MAINLNX;"DOSLEN `,X;6 X;CREATOR PROGRAM THAT WRITES@X;MICRODOS XL ONTO A DISKJX;Td^CREATE%>h"CR0QNEWCOL8;;STORE NEW COLORSr PCOLORS8|1HCR0Q>4MNUDSPL;;STORE NEW DL PSDLSTLQ>5MNUDSPLPSDLSTL%> CR05$>!CR1QCHRORG9;;MOVE OS CHARSET PTOPDOS292HCR1 #CR1 #CR11 HCR05$>&!CR2QCHRSET9;;MOVE CHARSET0PA9:0DHCR2NQ>@;;SET TO NEW CHARSETX PCHBASbQ>!;;NARROW SCREENl PSDMCTLvCRLOOPQCONSOL;;GET CONSOLW?;;START PRESSED?DWRITE;;YES,WRITE LOADERW?;;SELECT PRESSED? ECRLOOP"QSYSNAME;;GET CURRENT DISK# R> 4;;#=4?HCR42;;NO, SKIPQ> 1;;RESET TO 1 HCR43X;CR42,;;INCREMENT #O>%CR43PSYSNAME;;# IN REQ. NAMESPTMPNAME PRENAMEM>;;MAKE SCREEN BYTE L>;;INVERSE VIDEO*PDRVMSG;;DISPLAY IT4 Q>;;WAIT FOR BUTTON RELEASE> PRTCLKLHQ>2RCR45RRTCLKL\ HCR45f FCRLOOPpX;zWRITE$>;;CLEAR ERRMSGQ>CR5PERRLN90HCR5 WRITLDR !CRLOOPX;X;WRITE LOADER ON DISKX;"WRITLDR$>0;;SET TO CHANNEL #3%>4SYSNAME;;POINT TOQ>5SYSNAME;;"D:D*.SYS" STORADR;;STORE POINTERQ>$;;LOAD UNLOCK COMMAND EXCCIO;;EXECUTE CIO COMMANDQ>!;;LOAD DELETE COMMAND$ EXCCIO;;EXECUTE CIO COMMAND.%>4TMPNAME;;POINT TO8Q>5TMPNAME;;"D:TEMP.TMP"B STORADR;;STORE PNTRSLQ>;;LOAD OPEN COMMANDV%>;;SET TO OUTPUT` EXCCIO;;EXECUTE COMMANDj GERRJMP;;BRANCH IF CIO ERRORtQ>;;SET BUFFER ADDR~ PICBADR9Q>`PICBADR9Q>4DOSLEN;;BUFFER LENGTH PICBLEN9 Q>5DOSLENPICBLEN9Q> ;;LOAD PUT CHAR COMMAND EXCCIO;;EXECUTE COMMAND GERRJMP;;BRANCH IF CIO ERRORQ> ;;LOAD CLOSE COMMAND EXCCIO;;EXECUTE COMMAND GERRJMP;;BRANCH IF CIO ERROR%>4RENAME;;POINT TO #Q>5RENAME;;"D:TEMP.TMP,DOS.SYS" STORADR;;STORE PNTRSQ> ;;LOAD RENAME COMMAND( EXCCIO;;EXECUTE COMMAND2IGOODCIO;;BRANCH IF CIO OK<)ERRJMP!ERRPRS;;JUMP TO ERROR ROUTINEFX;P GOODCIOQ>;;READ 1ST SECTORZ PDAUX1dQ>n PDAUX2x PDBUFLO Q>5SECBUF PDBUFHIQ> R PDCOMND DSKINVIC0 !ERRPRSX; C0QDOSLNK;;DOS SECTOR LINKSPSECLNKBASEQDOSLNKPSECLNKBASEQDNSYFL;;GET DENSITY FLAGR>;;DOUBLE DENSITY?FDBLDENS;;YES, BRANCH$>""CR4QSNGMSG9;;SET "SINGLE" MSG, PDENSMSG960@ICR4JQ>;;SET SINGLE VALUEST$>}^ HSTRDNShX;r!DBLDENS$>;;SET "DOUBLE" MSG|CR3QDBLMSG9 PDENSMSG90ICR3Q>;;SET DOUBLE VALUES$>,STRDNSPSECLGBASE;;STORE SECTOR LENGTH!&BUFFLEN;;BYTES/SECTOR OFFSETQ> W;;WRITE 1ST SECTOR PDCOMNDQ>W PDBUFHIWRSEC DSKINV GERRPRS #QDBUFLO;;ADVANCE TO NEXT SECTOR , O>& PDBUFLO0 DINSCT: #DBUFHID INSCT#DAUX1N QDAUX1X R>b HWRSECl Q>;;WRITE SECTOR $2D0v PDAUX1 Q> PDAUX2 $QSECLGBASE;;IN DESIRED DENSITY PDBYTLO HC1 #DBYTHI C1Q> PDSTATS Q> PDTIMLO SIOV GERRPRS $>!#C05QDONEMSG9;;PRINT "- DONE -" !PERRMSG9!0 !IC05*!:4!X;>!X;PROCESS ERROR ROUTINEH!X;R!ERRPRSC;;STORE ERROR NUMBER\!5f!Q> ;;LOAD CLOSE COMMANDp!$>0;;SET TO CHANNEL #3z! EXCCIO;;EXECUTE COMMAND!7;;RESTORE ERROR NUMBER!PFR0;;PROCESS ERROR!Q>! PFR0! IFP;;CONVERT TO! FASC;;FLOAT.PNT->ASCII!%>!C153!Q@INBUFF7;;CONVERT ASCII!;;;TO SCREEN VALUES!S> ! PERRNUM8! Q@INBUFF7"IC15"M>";$"S> ." PERRNUM88"$>B" C2QERRLTR9;;PRINT "ERROR -"L" PERRMSG9V"0`"IC2j":t"X;~"!EXCCIOPICCOM9;;STORE COMMAND"C"PICAUX19;;STORE AUX BYTE" CIOV;;DO CIO":"X;"&STORADRPICBADR9;;STORE ADDRESS"C" PICBADR9":" "X;"X;FILE NAMES#X; #SYSNAME AD1:D*.SYSA=#TMPNAME AD1:TEMP.TMPA=#$RENAME AD1:TEMP.TMP,DOS.SYSA=(#X;2#X;MENU DISPLAY LIST<#X;F#MNUDSPL p=p=p=FP# ANLHDGZ# P=Gd# MCRHDGn# P=Gx# CRTLN# P=B# DSPDAT#' ===========# p=F# ERRLN# A# MNUDSPL#X;#X;HEADING LINES#X;#ANLHDG A A# =AANALOGA# A A$MCRHDG A A$ =AmicrodosA$ A A"$ =AxlA,$CRTLN A A6$ =AcreatorA@$ A AJ$X;T$X;DISPLAY DATA^$X;h$ DSPDATr$ =A INSERT FA|$ =AORMATTED A$ =A DISK A$ =AINTO A$ =A DRIVE #A$DRVMSG =A1 A$X;$ ,$ =A SELECT A$X;$ 1$ ATO CHANGE DISK DRIVE #A$X;$ 1$ =A START A%X;% 0% ATO WRITE LOADER ONTO DISKA&%X;0% $:% =A AD%DENSMSG =ASINGLE AN% =ADENSITY AX%X;b%ERRLN l%ERRMSG v%ERRNUM %X;% X;MESSAGES%X;%SNGMSG =ASINGLEA%DBLMSG =ADOUBLEA%ERRLTR =Aerror -A%DONEMSG =A-A% A A% =AdoneA% A A% =A-A%X;% GOADR& CREATE &