A EIX; BUILD.M65 MYDOS utility0ADOUBLE DENSITY MYDOS3 SYSTEM DISK BUILDERA(X;29X; Copyright 1984, Charles Marslett, Wordmark Systems<X;FIX; Permission is granted by the author for any use whatsoever of thisPHX; code, so long as this notice remains in the source code, and soZLX; long as the source to this routine, however modified or unmodified,d.X; is made available for a nominal cost.nX;xX;(X; Some important absolute addressesX;CIOVV;;CIO ENTRY VECTORX;0MENUP;;THE RUN ENTRY POINT OF "MDUP.OBJ"X;CORIGINH;;GOTTA BE BIG ENOUGH TO NOT HIT EITHER COPY OF MYDOSX;&ZCTR;;A GENERAL PURPOSE COUNTER&BPTR;;A GENERAL PURPOSE POINTER0ZPTR;;AND ANOTHER GENERAL PURPOSE POINTERX;/X; Define the fields of IOCB $10 that I useX;Q" ICMD,6 IBUF@ ILENJ IAUX1T IAUX2^X;hOX; The BUILD program itself -- loads MDOS.OBJ and MDUP.OBJ into memory aboverOX; itself, then relocates the code down over the previous version of MYDOS|OX; that we are running with and starts it up. This is how we create a newX; version of MYDOS.X; ORIGINX;START$>SIGNON%%>SIGNON;;LOG ONTO THE SCREEN DMSGX;Q> PBPTR%>'BPTR;;POINT BPTR AT $C000Q>PSAVC;;SAVC IS NOW $FF$>4CLRCP@BPTR7;;FILL $C000 TO $CFFF WITH $FF BYTES&30 HCLRC: #BPTRD0N HCLRCXX;bQ>BUFFERl PBPTRv'Q>BUFFER;;POINT BPTR AT "BUFFER" PBPTR$> Q>0MVLP1P@BPTR7;;FILL 8K BUFFER WITH $00 BYTES3 HMVLP1 #BPTR0 HMVLP1X;,X; COPY NEW DOS CODE FROM FILE "MDOS.OBJ"X;$>MSG01%>MSG01 0 DMSG;;ANNOUNCE WE ARE READING "D2:MDOS.OBJ"%>DOSFIL Q>DOSFIL*& LOADBF;;LOAD CONTENTS OF MDOS.OBJ4X;>4X; COPY NEW DOS AND DUP CODE FROM FILE "MDUP.OBJ"HX;R$>MSG02\%>MSG02f0 DMSG;;ANNOUNCE WE ARE READING "D2:MDUP.OBJ"p%>DUPFILzQ>DUPFIL& LOADBF;;LOAD CONTENTS OF MDUP.OBJX;$X; MOVE BUFFER DOWN TO LOW MEMORYX;$>MSG03%>MSG036 DMSG;;ANNOUNCE WE ARE RELOCATING DOS AND DUP CODEX;Q> PZPTRQ>+PZPTR;;SET DESTINATION POINTER TO $0700Q>BUFFER PBPTRQ>BUFFER)PBPTR;;SET SOURCE POINTER TO "BUFFER"$X;.%>8MVLP2Q@BPTR7B.P@ZPTR7;;COPY 256 BYTES AT A TIME UNTIL WEL)3;;ARE ABOUT TO OVERWRITE BUILD ITSELFV4HMVLP2;;(THIS IS TOO MUCH, I HOPE, BUT IT WORKS)` #BPTRj #ZPTRt QZPTR~R>START HMVLP2X;X; REINITIALIZE SYSTEMX;$>MSG04%>MSG04/ WFSTR;;ANNOUNCE STARTUP AND WAIT FOR A KEYX;# DOSINI;;REINITIALIZE NEW MYDOSX;$>Q> PICMD Q>, PIAUX1 Q>EC( PIBUF2 Q>EC<PIBUFF1 CIOV;;REOPEN THE KEYBOARD/SCREEN "E:" DEVICEPX;Z$>MSG05d%>MSG05n6 WFSTR;;ANNOUNCE WE ARE READY TO RUN THE NEW MYDOSxX;;!@MENUP:;;THEN GO WHOLE HOG: USE "H" COMMAND TO SAVE ITX;X;.X; LOAD CONTENTS OF OBJECT FILE INTO BUFFERX;LOADBF'IBUF PIBUFQ> PMINAD'PMINAD;;SET LOW ADDRESS AT $FFFFQ> PICMDQ> PIAUX1Q>%PMAXAD;;SET HIGH ADDRESS AT $0000" PMAXAD, PIAUX26$>@* CIOV;;OPEN D2:MDOS.OBJ OR D2:MDUP.OBJJ IGOTFILT$>NOFIL^%>NOFILh/ DMSG;;REPORT IT IF WE CANNOT OPEN THE FILEr!@ :|X;GOTFILQ>;;ELSE,!PICMD;;CHANGE COMMAND TO READQ>BUFAD PIBUF$Q>BUFAD;;BUFFER TO LOCAL ONE PIBUFQ> PILENQ>PILEN;;LENGTH TO 2 BYTES$> CIOV;;AND READ THE HEADER GINVHDR;;IF ERROR, REPORT IT QBUFAD MBUFAD!R>;;ELSE, VALID HEADER WORD?& IRDNXTB00INVHDR$>NOHDR;;IF NOT, REPORT THAT ERROR:%>NOHDRD DMSGN!@ :XX;bARDNXTBQ>BUFAD;;ELSE, READ NEXT WORD PAIR (START-END ADDR)l PIBUFvQ>BUFAD  PIBUFQ> PILEN;;SET LENGTH TO 4 BYTESQ> PILEN$># CIOV;;READ START/END ADDRESSES#IRDDATA;;IF NO ERROR, LOAD DATA)>;;ELSE IS IT AN EOF?$HABORT;;IF NOT EOF, REPORT ERROR:!MOVER;;IF EOF, WE HAVE LOADED IT ALL, RETURN NORMALLYX;RDDATAQBUFAD %BUFAD  )MAXAD8DNOTMAX;;IF THIS BLOCK SETS A NEW MAX ADDRESS LOADED  HNEWMAX* RMAXAD4 DNOTMAX>4NEWMAX'MAXAD;;UPDATE THE MAX ADDRESS COUNTERH PMAXADR NOTMAX;\ SBUFADf PZCTRpCz SBUFAD PZCTR #ZCTR HLENOK #ZCTRLENOK DEBUG1 %BUFAD QBUFAD>)MINAD;;AND IF THIS BLOCK SETS A NEW MIN ADDRESS LOADED DNEWMIN HNOTMIN RMINAD+ENOTMIN;;UPDATE THE MIN ADDRESS COUNTERNEWMIN)> DNOTMIN 'MINAD PMINAD$ NOTMIN)>. DDONTMV8 ')>;;DO NOT USE THE INDIRECT BUFFERB 1EDONTMV;; IF THE DATA IS AT <$0700 OR >$BFFFL O>BUFFER V 5` Cj O>BUFFER t ?~ 7 DONTMVPBPTR 'BPTR DEBUG2 Q> PILEN %PILEN;;READ ONE BYTE AT A TIME GETNB$> CIOV &ISTBYTE;;AND IF NO ERROR, STORE IT ABORT$>ABORTED %>ABORTED  DMSG;;REAL I/O ERROR !@ :;;EXIT TO DOS X; STBYTE%BPTR HSTBY0( 7%BPTR;;TEST FOR BUFFER POINTER BEING STILL VALID2 )>< HSTBY0F PSAVCP FSTBY3Z STBY0%>d %P@BPTR7;;STORE THE BYTE JUST READn STBY3#BPTRx HSTBT1 #BPTR STBT1QZCTR !HSTBT2;;INCREMENT THE POINTER "ZCTR STBT2"ZCTR QZCTR &LZCTR;;DECREMENT THE BYTE COUNT 6HGETNB;;IF STILL IN THIS BLOCK, READ THE NEXT BYTE &!RDNXTB;;ELSE, READ THE NEXT BLOCK X; MOVERQ> ;;DONE WITH LOAD, PICMD $>  CIOV;;CLOSE THE LOAD FILE PSTR A(A=" QMINAD, 9 PHEX;;REPORT THE CURRENT MIN AND MAX BUFFER POINTERS6 QMINAD@ PHEXJ PSTRT A-A=^ QMAXADh PHEXr QMAXAD| PHEX $>LOADED %>LOADED DMSG ":;;AND RETURN TO MAIN LINE CODE X; X; PROGRAM FILE (NEW FMS) X; DOSFIL AD:MDOS.OBJA= X; (X; PROGRAM FILE (NEW UTILITY PROGRAM) X; DUPFIL AD:MDUP.OBJA= X; X; CONSOLE KEYBOARD/DISPLAY X; EC AE:A=& X;0 ,X; DISPLAY A MESSAGE AND WAIT FOR 'START': X;D WFSTR DMSGN Q>X Pb %WFSTRTQ;;READ CONSOLE SWITCHESl M>v HWFSTRT;;WAIT FOR START : X; %X; DISPLAY A MESSAGE ON THE SCREEN X; DMSG&ZPTR 'ZPTR Q> PZCTR MSGLP%ZCTR Q@ZPTR7 FDXIT BYTOUT #ZCTR HMSGLP X; DXIT: X;* CODE A0123456789ABCDEFA4 X;> 0X; DISPLAY A 4 DIGIT HEX NUMBER ON THE SCREENH X;R PHEX5\ V?f V?p V?z V? > QCODE9 BYTOUT 7 M> > QCODE9 X; BYTOUT$> &ICMD $> &ILEN &ILEN CIOV:X;$ PSTR7. PZPTR87B PZPTRLPLOOP#ZPTRV HPOUT` #ZPTRj POUT$>t Q@ZPTR6~ FPEXIT BYTOUT !PLOOPX;PEXITQZPTR5 QZPTR5:X;+X; REPORT THE HIGH AND LOW BUFFER LIMITSX;DEBUG1 PSTR A(A=  QBUFAD PHEX QBUFAD( PHEX2 PSTR< A-A=F QBUFADP PHEXZ QBUFADd PHEXn:xX;DEBUG2 PSTR A)A ==== ==== =:X;.X; ROUTINE TO REINITIALIZE THE LOADED MYDOSX;DOSINIQP  Q P '!@ :;;==REINITIALIZE ENTIRE DOS/DUPX;*X; IMPORTANT MESSAGES FROM OUR SPONSORS"X;,SIGNON =6* A ӠɠӠA=@0 A 򠠠A===JX;T"MSG01 ALOADING D:MDOS.OBJA=^"MSG02 ALOADING D:MDUP.OBJA=hLOADED ====r ====| ==== ==== ==AEDA===,MSG03 AMoving DOS/DUP into placeA==4MSG04 APRESS TO INITIALIZE NEW DOSA==0MSG05 APRESS TO ENTER NEW DOS.A==X;*NOFIL ACannot open Object FileA==0NOHDR AInvalid Header in Object FileA==,ABORTED AI/O Error, load abortedA==X;'X; BUFFER FOR PATCHING A RUNNING DOSX; MAXAD MINAD SAVCBUFAD;;FOR ADDRESSES&BUFFERSTART0X;:(X; EXECUTION FORCED, LOAD RUN ADDRESSDX;NX START;;run addressbX;