ML }  X c0C)HCCH Mhhݩh `eCDiCD`  RPH   * 1H0芢@) Y0.Ș`i#(PMRR\ \b Pgi 0 @ $ ࠮UY   0DDԝLyȀ}iN@ )?HI   Y0`HIJH)* J j *  hJJJ)HJ   h i   }  YS S0 i`  !"#$%&'()*+,-./0123456789:;<=>?@H J3x}j2h)1 |9 ӭ45(420 * (0241өX.`  ? *^)Lkl  }k*PE 5 LN(G 2 gh ` ghgL ( 2 L<(0d( L ^E0O +)$IC} H @8 f e h q  |_ 8cd CDL> CFa M  L< ?^)La`2' }")*F$F$F$F$F$ 5 )ШF/Șa]`efС,L>/A! A^)Za`@ ܬ/^)( }")")`$F$F$F 5$/L /aF@__(LN`ae$$%8(`()` ? % 2L< ?^)^>_f i ;g }Ch) qkl5\   Zc[d 4akl L>@^LZ>_ 3L kJjjj^^ e } fE]_agh`L>:$ȱ$@+[_#{ %  Խji! ai % 2 I   } J C H h  ˰ %  ;  q LZ 2  ,  H `L> ,/ % k/ q Ơ?} ѩ/ | H /L_0?MdLc 3_MfLe N`aL<L>cLdMaNL< }?"(+ըHH`Q R !   $ . FȑF! /GF \H"+0+* }! F sL>cm: J~cTF1F  *c+)5! c (, c)1JJJc(c*d} I ,0  Xi N dF4 5 ,8,0 ʩ0H 2h     i} D JDbbFL>vij`*&!ߍ*@h ] 0 ^0`ߍ c 0l$$%}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h}`hhh&JJ ](ll  L>0 q/qcdHH 99 H H  I9 9 } NY 2H  >8 d c  qFcdL HII/ Ih8`h`Lcdc`cd`u F }E KE]L</auF a0BF/aɜɛ׽]E ;  qW  KFL FREE SECTORS C}H) *Fh ):FȽ F FCIH' 0 d  i:Fȩ/F.a`CD/08HDIC}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A I Hȱ$*?ȝ 2. ? [_{ ,0}-:) 0$:>WI  IТ,L>H  0hLY k i j`C ?(  0(C.` E *}! .ii  c0N EE 1 EC)0')AY)ע ? 0E088FG \dc}  (HhLcL3 ^J ^ Lrfe 0=ghecfdefa``_Z_0  _ 3LMHFhȑFȽa}F^0 ] FFL3ekfl\cZd[L3 ef7 | 40^ 0 FJJ]1FfȱFeȱF``B!08`]}EE 1 8. *D}iji( AʩLMW!)   XȌVȌY W`VVWH8 h}YaHXY8 XH hHH \h hX` *Hh I8ih( a ( a(!`L\CJfCJ}fCJfCDfC` qV  HII  INYh `h`c)8jHciPdijIjFIjFIjh` qV I }38 8H0 I  ' H L>8jY8j NYY &I &I &IHeH.eIif!}  `!.莼 2Jjj }.b Ȉ!b FG` ɩL> z  "}e H^04 \ Ȍ  8 i h !`I0 `C Y%.`DOS SYS I #} ` kݩ.C/`WV.b۩bѤC9`CLJ G  ,F0(BԝDEI$} V0 : , BLVDE`D1:*AR08hhJ ȱHȱIȱBȱDȱEeeHHLV)%}  1*  ,,p-  0  &  '0   Lv)l, 0  &LD&}1:MEM.SAVE:D1:DUP.SYSFXMUF1:MEM.SAVE:D1:DUP.SYSFXMUF}I)vCD2:DOS.SYS n  * \*`آ R'S )ɀ@  T))% CError lo(}ading MEM.SAV or memory!  0* a*b*c*d* R Hc*JSDc*J-=d* 0b*ʈд =}MyDOS 4)}.53/4- Copyright 1988,˛Disks 1S- 2S- D: = D1: = =1-8.Dir of D1:-D8: *. Dir of D:A. *}Disk Directory K. Save MemoryB. Run Cartridge L. Load MemoryC. Copy File(s) M. Run at AddressD. Delete File(s) N. L+}oad MEM.SAVE. Rename File(s) O. Change Config.F. Lock File(s) P. Set DensityG. Unlock File(s) Q. Make DirectoryH. Wr,}ite DOS Files R. Pick DirectoryI. Initialize Disk S. Set RAMdisk #J. Duplicate Disk V. Set Verify Flag  @莻-}( 0  =Select Item ( for menu):@  =ɛL)1L,*L,:W@ ,,L=No such item!.}L), -0{ ПFull directory name?Z"L.Directo3}ry to be used as 'D:'? @ A(5)L.(I: 輿ȱޝL), CInvalid directory!L@( 4}(0Le-File source, destination? '( @C۩wڭ8wܭC B8'0 @(ߍeލd(DЍ( ? 8' 5}B Bȱޙ':>Ȍ(C0J* .B 9'ȱ/.* #,ɛȝ9' ߰ B |?,(0L), 'u6}t(9'3?&' .'Ƚ9'?&'  .و'Q?''(#( = =-->' =Q7} =YR_o (J(  0?B݋''BJ)`''utz0( ?(L|0L),L@nDisk to FORMAT: 8}A B(UTލ1 =(Press for Enhanced Dns)Type to Format Drive 2: =AIYZNj[R VL@L)9},D2:DUP.SYSDrive to write DOS files to? AH1:*J)2I) Z B hpI) ?<2UT:}C٩vة۩.کL;Source, Destination (Sectors)? A)((8'( A)((((( @(0% =Insert b;}oth disks, type = B( A((/( DB(( CDrives not compatible!J(j(8'Hh''<}h(ɛy CInvalid options! N@-&& N@)׍&&(&&&۩ک&&&&8* 84&&&& 848=}*8(ܭ(ݥwC, CNot enough memory! ک&&`(Mh  & >L@&i &&>}&&mm   >  &((&թԥԍ(Ս(((( ( ((Cw((?}ԍ((,(0"( (( >m(m( & &("L),  ( BL4,(, =Insert DESTIN@}ATION disk, press =Nͻ I) b( 0J) @((ԭ(խ( ( (((L4Drive, new density: A}A8'ɛ CDrive unchanged.(ު90٨Ȍ(SD  qBL)xԌҭHӭ@@ ʎӆ@B}ӭ@@ :  $ӹ@hөԥX` Aˠ =RAM disk present? =NL08 =xlon C}or E type RAMdisk? =Aό  L   M   A1| =6: ' =No extra memory available!L08L7D} & & & =Use default config for 0)ȩ = =K? =NL 8 =Size(K)? ? N@FjFjFjFjE}: =Page sequence? ? P@o* =RAM disk drive no? = 09) `9 - 9**H***) 9 Ȋ)h9 F}@@ H'h(#''/'(ɛ ? P@(@: 3 ʽ' L 8 =Duplicated sequence number!LG}7 =Wrong number of entries!L7K큅쀄 =Verify WRITEsH}? ; =Number of File Buffers? ? N@  6 Lv),R( 4;L),Drive number or : =ɛLP99L50Ȍ(I} =Remove drive? =Y =Is drive configurable? =YЂ =High capacity drive? =Yy =Is drive double sided? =YJ} *; =Tracks/side? ? N@#0M P( *; =Step rate? =4/ *; 4;L), =Drive size (in sectors)? ? N@K}H(h 7;L),RAM disk drive no? 8L),Verify WRITEs? ;L), =WNPp`(`(  LqBSAVE:filename,stL}art,end(,init(,run)) @TUH P@Cp` ?< P@؆8օڊ CInvalid START-END range!۩ P@ M} P@ hԄՠAλȌZ B04*  0$ڍXۍY֍T׍U,0LCL C HCL@ֆ׌`Load MEN}M.SAV from what file? 0#L),L@Load from what file?) @TU&̩Z B &0&-&а&𨭻INO}IZ'RV0II CNO CARTRIDGE!Ԇխ  )L>Run from what address? ?ɛP} P@ CAddress must be 1-4 hex digits! BHILV {=`hh =HH` =0{a HɛQ} {= {=h` {=L), = = pHH =hh`K: p `(((( i ɀ((L@(`(BD(0>HHR}''>I>U>I>ɛ(ɛ (>(`͈>DH(`(HI`(k5 = =( 5B( (>@S}A (J B0}((HHIIDDEE B @(CɈP(# B = =( 5BL'?(B>>((ڤ ܝHT}ݝI VL>L@(" B !B I)  B(L& R XY( @&:0H&Ϳ((&U} ( .( & ( .(ʩ(`ލD&ߍEBIʎH( V0`ԩ ؠA@ȱB@ȱ)C@ V}CError -- 128&`$8f cAԄձG/ $<68i/(Ԧ`H&եԦ&&eԅheԅԊe(iLZ@&&W}&&ԅLZ@B ? cA?*(ɛ:./2SX(0ȱ/.ɛ(ލ8'ި0X}#:Ȱ :ފ :ȱ: : sAD sAޥ`(eޅީe߅`(` @LA @TUȪ: CFile name noY}t allowed!: )  h( >0+L TUD CNot a disk file!(0` =Insert SOURCE disk, press Z} =,(pӮ(A(O aB qBaB`1(L$ b(de BJKO [}L@O` B((*(((`ȱޙ((:>Ȍ(`D:`OS.SYS,DOS.SYShh =L),  VLI /C /C\},pLhL~F#Խ٩Յ׆  LC`David R. Eichel rel.ver.1/1/90S MyDOS V.4.53/3 Origional program by Charles Marslett and Bob Puff v.4.53/3 Mods. by David R. Eich^}el Released 1/1/90The ARC file MYDOS453.ARC contains:MD453_3 .DSK Diskcommed MyDOS 4.53/3*READ .ME Docs _}in 80 column formatMDOS .M65 DOS source part 1MDOS1 .M65 " " part 2MDOS2 .M65 " " part 3MDOS3 .M65`} " " part 4MDUP .M65 DUP source part 1MDUP1 .M65 " " part 2MDUP2 .M65 " " part 3MDUP3 .M65 a}" " part 4CONTENTS. What you're reading.* This file is a Diskcomm file ofthe new DOS, DUP and RAMBOOT progrb}am(RB6C.AR0). Use Bob Puff's DiskCommunicator v.3.2 to uncompact thefile into a bootable single densitydisk. It hasc} been set up for use witha standard 64K XE RAMdisk as drive 4.To configue it to another size ortype of RAMdisk, just folld}ow theinstructions in the documentationcontained in the origional v.4.50release package.\ML}  X c0C)HCCH Mhhݩh `eCDiCD`  RWH f} E   * 1H0芢@) Y0.Ș`i#(PMLNRRTҀ\ \b Pgi 0 g} Z@ $ ࠮UY   0DDԝLntH}y{iN@ h} )?HI   Y0`HIJH)* J j *  hJJJ)HJ   h i   }Ǎ  i} YS S0 i`ϣ߳ϣ߳H J3x}Ǎj2h) j}1 |9 ӭ45(420 *(0241өX.`  J *^)Lkl  }v* k}PE 5 LN(G = gh ` ghgL ( = LG(0d( L ^E0O +)$IC} H l}K8 f e h |  _ 8cd CDLI CFa M  LG J^)La`2' } m}")*F$F$F$F$F$ 5 )ШF/Șa]`efС,LI/A! L^)Za`@ ܬ/^)( n} }")")`$F$F$F 5$/L /aF@__(LN`ae$$%8(`()` J 0 =LG J^)^>_f t F o}g }ǤCh) |kl5\   Zc[d ?akl LI@^Le>_ >L vJjjj^ p}^ e }ǹ fE]_agh`LI:$ȱ$@+[_#{ 0  Խji! ai 0 = q} I   } U C H h  ˰ 0  F  | Le =  ,  S `LI ,/ 0 v r}/ | Ơ?} ѩ/  S /L_0?MdLc >_MfLe N`aLGLIc s}LdMaNLG }J"(+ըHH`Q R !   $ . FȑF! / t}GF \H"+0+* }! F sLIcm: J~cTF1F  *c+)5! c (, c) u}1JJJc(c*d} I ,0  Xi Y dF4 5 ,8,0 ʩ0H = v}h     i}G D UDbbFLIvij`*&!ߍ*@h ] 0 w}^0`ߍ c 0l$$%}()()%*&J%H,@hH hH@,h $% 8i8$ x}(%)0hhH ]h`() c 0H c 0 h}`hhh&JJ ](ll  LI0 |/qcdHH y}99 H H  I9 9 } NY =H  I8 d c  |FcdL HII z}/ Ih8`h`Lcdc`cd`u F }E KE]LG/auF a0BF/aɜɛ׽]E F  {} |W  KFL FREE SECTORS C}H) *Fh ):FȽ F FCIH' H0 |} 1h0d  i:Fȩ/F.a`CD/}08HDICIHȰ/F`ȱ$>.+.i ȱ$:刄H ! }}A T Hȱ$*?ȝ 2. ? [_}{ ,0-:) 0$:>WI  IТ,LIH ~}  0hLd v i j`C ?(  0(C.` }E 5! .ii  c0N EE < P }C)0')AY)ע ? 0E088FG \}dc  (HhLcL3 ^J ^ L}f }e 0=ghecfdefa``_Z_0  _ >LXH}FhȑFȽaF^0 ] FFL>ekfl }\cZd[L> ef7  ?0^ 0 FJJ]1FfȱFeȱF``B}!08`]EE < 8. 5D}iji }( LʩLXW!)   XȌVȌY W`VVW}H8 hYaHXY8 XH  }hHH \h hX` 5Hh I8ih( l ( l(!`}L\CJfCJfCJfCDfC` |V } HII  INYh `h`c)8jHciPdijIjFIjFIjh` | }ǍV I38 8H0 } I  ' H LI8jY8j NYY &I &I &IHeH.!}ǝeIif  `!. }莼 2Jjj }.b Ȉ!b FG` ɩLI z "}x e H }^04 \ Ȍ  8 i h !`I0 `C Y0.`DOS} #}SYS I  ` v }ݩ.C/`WV.b۩bѤC9`CLU R  ,F0(Bߝ$}GDEI V0 } : , BLVDE`D1:*AR28hhJ ȱHȱIȱBȱDȱEeeHHL%}%V) }  1*  ,,p-  0  &  '0   L)l, 0 &}&  }&LD1:MEM.SAVE:D1:DUP.SYSOSYS,DOS.SYShh =L4,  VLT :C :}T)CD1:DOS.SYS n   }* \*`آ R'S )ɀ@  _))% CError lo(}kading MEM.SAV or memory!  0* } l*m*n*o* R Hn*JSDn*J-=o* 0m*oʀд =}MYDOS 4)}(.53/3- Copyright 1988, }Disks 1S-1 34RD D: = D1:ˢ = =1-8.Dir of D1:-D8: *. Dir of D:A. *}PDisk Directory K. Save MemoryB. Run Cartrid }ge L. Load MemoryC. Copy File(s)T M. Run at AddressD. Delete File(s) N. L+}@oad MEM.SAVE. Rename File(s) O. Change }Config.F. Lock File(s)D P. Set DensityG. Unlock File(s) Q. Make DirectoryH. Wr,}ite DOS Files R. Pick DirectoryI. Ini }tialize Disk S. Set RAMdisk #J. Duplicate Disk V. Set Verify Flag  @-}( 0  =Select Item ( } for menu):@  =ɛL)1L,*L,:W@ ,,L=No such item!.}L4,-0{ ПFull directory name?Z"L.Directo3}ry to be u }sed as 'D:'? @ A(5)L.(I: ȱޝL4, CInvalid directory!L@( 4})0L }p-File source, destination? '( @C۩ڭ8邅ܭC BC'0 @(ߍeލd)DЍ) ? C' 5}B } Bȱޙ':>Ȍ)C0J* .B D'ȱ/.* #,ɛȝD' ߰ B ?,(0L4, 'u6 }}Gt)D'3?&' .'ȽD'?&'  .ٓ'Q?''(#) = =-->' =Q }7}7 =YR_o (J)  0?Cݖ''BU)`''utz0( "?(L0L4,L@nDisk to FO }RMAT: 8}A B)UTލ1 =(Press for Enhanced Dns)Type to Format Drive 1: =AIYZNj[R } VL@L49},D1:DUP.SYSDrive to write DOS files to? AH1:*U)2T) Z B hp }T) J<2UT:}C٩ة۩.کL;Source, Destination (Sectors)? A)((C'( A)(((( }( @(0% =Insert b;}oth disks, type = B( A((/( OB(( CDrives not compatible!J })j)C'Hs''<}h(ɛy CInvalid options! Y@-&& Y@)׍&&(&&&۩ک&&&&8* C }4&&&& C48=}*8)ܭ)ݥɂC, CNot enough memory! ک&&`(Mh   }& >L@&i &&>}&&mm   >  &((&թԥԍ(Ս((((  }( ((C((?}Ǡԍ((,(0"( (( >m)m) & &("L4,   }( BL4,(, =Insert DESTIN@}ATION disk, press =N T) b( 0U) @((ԭ(խ( }( (((L4Drive, new density: A}AC'ɛ CDrive unchanged.(ު90٨Ȍ(SD  |BL)x }ԌҭHӭ@@ ʎӆ@B}ӭ@@ :  $ӹ@hөԥX` }Aˠ =RAM disk present? =NL;8 =xlon C}or E type RAMdisk? =Aό  L   M   A1 }| H6: ' =No extra memory available!L;8L7D} & & & =Use default config for 0)ȩ } = =K? =NL8 =Size(K)? ? Y@FjFjFjFjE}Ǎ: =Page sequence? ? [@o* =RAM disk drive no? = }09) `9 -9**H***) 9 Ȋ)h9 F}@@ H'h(#''/'(ɛ }? [@(@: 3 ʽ' L8 =Duplicated sequence number!LG}7 =Wrong number of entries!L7K }큅쀄 =Verify WRITEsH}G? &; =Number of File Buffers? ? Y@  }6 L),R( ?;L4,Drive number or : =ɛL[99L60Ȍ(I}I =Remove drive? =Y =Is drive con }figurable? =YЂ =High capacity drive? =Yy =Is drive double sided? =YJ}ǩ 5; =Tracks/side? ? Y@#0M } P( 5; =Step rate? =4/ 5; ?;L4, =Drive size (in sectors)? ? Y@K}H(h B;L4,RAM disk driv }e no? +8L4,Verify WRITEs? &;L4, =WNPp`(`(  L|BSAVE:filename,stL}art,end(,init(,run)) @TU }H [@Cp` J< [@؆8օڊ CInvalid START-END range!۩ [@ M}Dž [@ h }ԄՠAȌZ B04*  0$ڍXۍY֍T׍U,0LCLC SCL@ֆ׌`Load MEN}M.SAV from what file? } 0#L4,L@Load from what file?) @TU&̩Z B &0&-&а&INO}ǩIZ'RV }0II CNO CARTRIDGE!Ԇխ  )LIRun from what address? ?ɛP} [@ } CAddress must be 1-4 hex digits! BHILV =`hh =HH` =0{a HɛQ} = =h }` =L4, > = pHH >hh`K: p `(()( i ɀ((L@(`(BD(0>HHR}' }'>I>U>I>ɛ(ɛ (>(`͓>DH(`(HI`(v5 = =( @B( 3>@S}A } (J B0}((HHIIDDEE B @(CɈP(#B = =( @BL2?(B>>((ڤ ܝHT} }ݝI VL>L@(" B !B T)  B(L& R XY( @&:0H&()& }U} ) .) & ) .)ʩ)`ލD&ߍEBIʎH( V0`ԩ ؠL@ȱM@ȱ) }N@ V} CError -- 000&`$8f nAԄձG/ $<68i/(Ԧ`H&եԦ&&eԅheԅԊe(iLe@ }&&W}&&ԅLe@B ? nA?*(ɛ:./2SX(0ȱ/.ɛ( }C'ި0X}#:Ȱ :ފ :ȱ: : ~AD ~Aޥ`(eޅީe߅`(` @LA @TUȪ: } CFile name noY}t allowed!: )  s( >0+L TUD CNot a disk file!(0` =Insert SOURC }E disk, press Z}C7 =,(pӮ(A(O lB |BlB`G1(L$ b)de B }JKO [}[L@O` B()*)))`ȱޙ)):>Ȍ)`D:`OS.SYS,DOS.SYShh =L4,  } VLT :C :C\},pLsLF#Խ٩Յ׆  L"C`David R. Eichel rel.ver.1/1/90OS.SYShh =L4, }  VLT :C :CS05ڢ 5 ~2 `kةE  42B 4  04 }44 2kF$^}Ǣk0 42 G4 224L10 B V 38<4546CT4UՍd4eL0 }ʍT4Ud4e Q3+_}Ǎt4u{zr0 V0 2 Q3L1 30L3D  8n Lu180݂݀. }`݄݄݆݇`}8~٩֩׭6CשD.ץ8 42 F45 `l ȩ1 }ȩ:ȱM@DиUвȩPЫ6a}CНȩ.ЖȩSЏم٠8$PpE Ȣ@ML1 BLV8hhՠԐ }J ȱԝHȱԝIȱԝBȱԝDȱԝEeԨb}eHH Vhh`@I@ȍI@ӈ@@-44I@ }@ȍό@Iψ@@`t5urxyc}0 V80a50Z50 4 5 .4 50 4 4 }44T4Ud4e`JB V0s d}JKB V0]d4e4BD4:MDOS1.M6}5d>D4:MDOS2.M65n>D4:MDOS3.M65xX; BOOTNDI+;;START DUP HERELISTFLGEIf. ;X;v.4.53/3 mods. by David R. Eichel 11/29/89 9:26 pm%X;SAVE #D4:MDOS1.M65 MYDOS module9X; Copyright 1984, Ch}arles Marslett, Wordmark Systems(X;2IX; Permission is granted by the author for any use whatsoever of this<HX; code, }so long as this notice remains in the source code, and soFLX; long as the source to this routine, however modified or unm}odified,P.X; is made available for a nominal cost.ZX;dX; DISK I/O EQUATESnX;x4DKADDR1;;SIO ADDRESS OF FIRST DIS}K DRIVE (D1:)8TODK;;STATUS BYTE FOR A DATA TRANSFER TO THE DISKRDSTAT S;;}SIO COMMAND EQUATE FOR READING THE DRIVE STATUSFWRITEV W;;SIO COMMAND EQUATE FOR WRITING A DISK WITH VERIFICATION/FMTC}MD !;;SIO COMMAND TO FORMAT A DISKETTEX;.LK128};;LOCATION OF 128 BYTE SECTOR LINK.LK256;;LOCATION OF 256 BYTE }SECTOR LINKX;X; ZERO PAGE EQUATESX; WARMST DOSVEC " DOSINI ,X;6 @ ICHIDZJ ICDNOZT }ICCOMZ^ ICSTAZh ICBALZr ICBAHZ| ICPTLZ ICBLLZ ICBLHZ ICAX1Z ICAX2Z CU}RFCB DATBYTX; CHKSUM1 BUFR2X;C FMSZPGDIRDSPFMSZPGDIRSECFMSZPG CURFNO}& FMSBPT0 TMP1: TMP2DX;N.X; DEFINITIONS FOR THE ATARI ROM EXECUTIVEXX;bDSKTIMFlRUNADRvIN}IADRMEMTOPDVSTATX;$X; SIO COMMAND BUFFER DEFINITIONX; DDEVIC DUNIT DCOMND} DSTATS DBUFLO DBUFHI DTIMLO DBYTLO  DBYTHI DAUX1  DAUX2*X;4X; I/O SYSTE}M DEFINITIONS>X;H1HATABS;;BASE OF THE DYNAMIC HANDLER TABLERX;\8X; CIO COMMAND TABLE BASE DEFINITIONS (FOR IOCB $}00)fX;p@z ICHID ICDNO ICCOM ICSTA ICBAL ICBAH ICPTL ICPTH ICBLL} ICBLH ICAX1 ICAX2 ICSPRX;&X; CARTRIDGE SUBSYSTEM DEFINITIONSX;(CARINIT;;LOCATION OF IN}IT VECTOR$"CARTEST;;LOCATION OF FLAGS.&CARRUN;;LOCATION OF RUN VECTOR8X;BX; 800XL MAP CONTROLLX;VMAPREG}`X;j!X; OTHER I/O PORT DEFINITIONStX;~ NMIENԈX;X; ROM VECTORSX;(DSKINVS;;OLD DISK I/O ENTRY PO}INT$SIOVY;;SERIAL I/O ENTRY POINTX;X; DOS BOOTING CODEX;X;X; DISK BOOT SECTORS (3)X;;;DOS.BOOT} LOADS AT 0700#BOOTFL AMA;;indicate new MYDOS +BOOTL ;;NUMBER OF SECTORS IN THE BOOT/BOOTAD BOOTFL;;ADDRESS OF BO}OT CODE IN RAMBOOTIN INIT(*!INBOOT;;JUMP TO THE BOOT CONTINUATION26FILES ;;NUMBER OF FILES THAT MAY BE OPEN AT ONC}E<3X;DRIVES = * ;USED TO BE BIT PATTERN FOR DRIVESFRAMDKU  ;;RAM DISK UNIT #P-X;BUFALC = * ;USED TO BE BUF. ALLOC. DI}R.Z#DEFAULT ;;DEFAULT UNIT NUMBERd:DOSEND BOOTND;;ADDRESS OF THE FIRST BYTE OF FREE MEM.n2SECDAT ;;1=128 BYTE SECT}OR/2=256 BYTE SECTORx(DOSLOC ;;SECTOR ADDRESS OF DOS.SYS1DLINK LK128;;OFFSET TO THE SECTOR LINK FIELD-DOSAD BASE;};ADDRESS TO LOAD DOS.SYS INTOX;8INBOOT%DOSAD;;SET UP START OF DOS AS BUFFER ADDRESS QDOSAD$ BTSET;;LOW ADDR I}N Y, HIGH IN AX;QDOSLOC,%DOSLOC;;PUT DOS DISK ADDRESS INTO (A,Y)X;X; DOS.SYS INPUT LOOPX;"INITLP,;;C}LEAR CY, 'DO A READ'%$SECDAT;;GET CODE FOR SECTOR SIZE$FNODOS;;IF ZERO, NO DOS ON DISK!" DKIO;;INVOKE DISK I/O ROUTI}NE",GNODOS;;IF AN ERROR, RETURN NO-DOS ERROR,%DLINK;;POINT TO LINK6,Q@FMSZPG7;;CHECK FOR NEXT LINK (10-BITS)@ANDCDM}>;;BEING ZERO,J 5;;SAVE UPPER BYTE OF ADDRESST3^)L@FMSZPG7;;IF SO, LOADING IS COMPLETEh FBOOTXTr4Q@FMSZPG7;;ELSE, }IT'S THE ADDRESS OF NEXT SECTOR|5;;SAVE LOWER BYTE ON STACK2 MVBUFR;;THEN ADJUST THE BUFFER POINTER IN DCB7!?;;REST}ORE LOWER BYTE TO Y-REG(7;;RECOVER UPPER BYTE OF DISK ADDRESS!DINITLP;;AND CONTINUE LOADINGX;)NODOSQ>;;NO BOOT P}ROGRAM ERROR CODE ;;SKIP SINGLE BYTE (LDY #)X; BOOTXT73DOSXITT?;;SET CARRY, CONVER CODE TO FINAL VALUE?;;PUT} CODE INTO Y-REG:;;AND EXITX;4X; MOVE BUFFER POINTERS TO NEXT AREA TO BE LOADEDX;&MVBUFRQDLINK0,:4OFMSZPG;};ADD DLINK TO THE CURRENT BUFFER ADDRESSD?;;LOW BYTE TO Y-REGNQFMSZPGXO>bBTSET'FMSZPGlPFMSZPGv+BUFSET}'DBUFLO;;STORE LOW BYTE INTO DCBPDBUFHI;;THEN UPPER BYTE:X;-X; PERFORM DISK READ(CY=0) OR WRITE (CY=1)X;3D}KIOPDAUX2;;STORE UPPER BYTE OF SECTOR ADDRESS'DAUX1;;THEN LOWER BYTE DKIO2%> Q>READ#DSETRTY;;IF CY=0, READ IN}TO RAMQ>WRITE;;Was LDA WRCMDB WRCMDB ;;Moved to here.X;%SETRTY'TMP1;;SET NUMBER OF TRIES DKFMEPDCOMND},;;CLC for later ROL A +X; LDA #WRITEV ;Changed to save space.*(X;WRCMDB = *-1 ;Origional location.4 'DTIMLO>&Q>};;ASSUME A 128-BYTE SECTOR SIZEH0R FSTBUFL\$DAUX2;;SECTOR > 256?f HSET256p $DAUX1z(>;;SECTOR > 3DSTBUFL;;}IF NOT)SET256T?;;MAKE A 256 BYTE SECTOR SIZESTBUFLPDBYTLOU? PDBYTHI+%>DKADDR;;PUT DISK DEVICE CODE INTO DCB} 'DDEVICIORTRY"TMP1 GDIOXIT $DCOMND2A"$>FROMDK;;ASSUME DATA ==> DISK M> &HISREAD;;IF NOT X0,X7,X8} OR XF, OK $>TODK;;ELSE, DATA ==> DISK$ )ISREAD&DSTATS;;RESTORE STATUS TO DCB. SIOV;;DO THE I/O OPERATIONS8 1B GIO}RTRY;;IF NOT OK, RETRYL X;V 4DIOXIT$CURFCB;;ELSE, LOAD FCB OFFSET AND STATUS` 3j Ct :~ X; ,X; FIXED RAM DEFINITIONS I}N BOOT SECTORS: X; ,DIUNIT;;UNIT NO. OF CURRECT DIRECTORY .CDIREC;;SECTOR NO. OF CURRECT DIRECTORY HOLFN 5}STATE p;;DUP loaded, MEM.SAV inactive, Warmstart X; bit 7 -- MEM.SAV in use X; bit 6 -- DUP.SYS loaded &X; bit 5 -- AU}TORUN.SYS already run #X; bit 4 -- Initial BUILD active X; "STKPSV;;SAVED STACK POINTER X; ;;MUST MATCH DUP L}OCATION X; 2TRACKS #=(=P=M;;TRACKS IN EACH DISK FORMAT( X;2 5SECSIZ =======;;BUFFER SIZE TABLE< X;}F %DRVDEF R=R;;DRIVE CONFIG TABLE:P  =;;BIT 7=1 => NO DRIVEZ % =;;BIT 6=1 => ATARI 810 DRIVEd / =;;BITS 5-4 I}S TRACKS (SEE ABOVE TABLE)n X; BIT 3=1 => DOUBLE DENSITYx "X; BITS 2-1 ARE DRIVE STRP RATE X; BIT 0=1 => DOUBLE SIDED X;} X; DOS.SYS PROGRAM FOLLOWS X; DKEPT DKOPEN  DKCLOS  DKREAD  DKWRIT  DKSTAT DKXIO }X;  X; X; DOS INITIALIZATION CODE X; X;" 2INITQ>i;;INITIALIZE THE CURRENT DIRECTORY, 6PCDIREC;; TO THE} ROOT DIRECTORY OF THE BOOT DRIVE6 Q>i@ PCDIRECJ X;T X; IDENTIFY DRIVE TYPES^ X;h $>r IDRVLP&DUNIT| , }ZERDVS;;ASSUME THE DRIVE IS NOT PRESENT QDRVDEF9 6GNXTDRV;;IF IT IS NOT DECLARED, WAIT FOR AN ACCESS ! JSTRD;;ELSE }READ IT'S STATUS *FNXTDRV;;IF ABSENT, GO TO THE NEXT ONE X; LDY #9 X;WOTCPY LDA WOTDCB,Y X; STA DDEVIC+2,Y X;} DEY X; BPL WOTCPY #X;The above was moved to SETDRV QDRVDEF9 R>@ *ENXTDRV;;IF NOT CONFIGURABLE, CONTINUE  }%SECSIZ9 1 SETDRV;;ELSE, TELL IT ABOUT MY CONFIGURATION X;& &NXTDRV0;;STEP TO NEXT DRIVE NUMBER0 "HIDRVLP;;IF MORE, } LOOK AT THEM: X;D X; ZERO INITIALIZED MEMORYN X;X INITPT2%>MAPBUFCHGMAPb A;;NOTE X=0 HEREl ZERLP1PCHGMAP8 }v 1 HZERLP1 #MAP2MOD X; )X; DEFINE TOP OF FMS FOR USER PROGRAM X; QDOSEND PMEMTOP %DOSEND X; #X;  } ALLOCATE FILE SECTOR BUFFERS X; !$>;;MAX OF 16 SECTOR BUFFERS &DKBFLP(FILES;;EMPTY BUFFERS DONE? DALCBUF "BUFF }LG9 GDKBFSQ ALCBUFC* PSBTABU94 3> DKBFSQ0;;BUMP BUFFER COUNTERH $IDKBFLP;;IF NOT CONTINUE LOOPINGR )'MEMTOP;;}DEFINE TOP OF MEMORY USED\ X;f X; SET UP HANDLER VECTORp X;z FNDHND2 2 2 *QHATABS9;;END OF THE HANDLER TABLE?} !FNOHAND;;THEN INSTALL IT HERE R>D;;A 'D' ALREADY PRESENT? !HFNDHND;;NO, CONTINUE LOOKING X; 1NOHANDQ>D;;END OF T}ABLE OR CURRENT 'D' ENTRY PHATABS9 (Q>DKEPT;;STASH MYDOS ENTRY VECTOR PHATABS9 Q>DKEPT "PHATABS9;;B}UILD HANDLER VECTORB!;;DUPINV (dup code modifies this) ;DONE, INITIALIZE DUP CODEX;X;$'X; DOS NON-ZERO PAGE RAM AL}LOCATIONS.X;8 CHGMAPB CURMAPL MAP2VMAP2MOD` LSTSECjLSTIOCBtX;~=X; MYDOS FCB STRUCTURE (}ALMOST THE SAME AS ATARI DOS 2.0)X; FCBFNOFCBOTC;;OPEN TYPE CODE FCBFLG MAXLEN CURLEN BU}FNO CURSEC LNKSEC SECCNT*DIRBAS;;BASE ADDRESS OF CUR. SECTOR SAVSEC FCBLEN FCBL}ENX;&BUFFLG;;IF 0, BUFFER NOT IN USE(6SBTABU;;UPPER BYTE OF THE SECTOR BUFFER ADDRESS2(MAPBUF;;SPACE ALLO}CATED FOR VTOC<7DIRBUFMAPBUF;;SPACE ALLOCATED TO READ DIRECTORIESF FNAME P CURMPZX;dX;n BASE x/HDTAB }===;;8 LOGICAL HARD DRIVES OF) ===;;UP TO 65535 SECTORS EACHX;BX;this table is referenced by DUP.SYS, an}d should not be moved!X;X;X; DOS CONFIGURATION CODEX;X;=X; CONTROL BLOCK TO BE WRITTEN TO A DRIVE TO CONFIG}URE ITX;WOTDCB N=@ DIRBUF=  =X;PX; THE CONFIGURATION CODE, FORCES A DRIVE INTO THE APPROPRIATE CON}FIGURATIONX;""SETDRVM>?;;EXTRACT CONF. BITS, PTMP16 'TMP2@ %> ;;J WOTCPYTQWOTDCB8;;Set up SIO^PDDEVIC}8;;handler toh1;; read drive'srIWOTCPY;; DCB.|% SIOV;;READ CURRENT CONFIGURATION GJSTRD QTMP1 %TMP2V?}5;;SAVE REMAINING BITSM>;;EXTRACT STEP RATE CODEPDIRBUFQ>PDIRBUFU?'PDIRBUF;;STORE DOUBLE S}IDED FLAGC;;GET DENSITYV?/PDIRBUF;;STORE UPPER BYTE OF SECTOR SIZEW?PDIRBUF;;THEN LOWER BYTE&U?0T?:}T?DPDIRBUFN7XV?bV?l!V?;;POSITION TRACK COUNT FIELDv?"QTRACKS8;;GET NUMBER OF TRACKS PDIRBUFM>;;SE}E IF 77 TRACK 8 IN.5V?/LDIRBUF;;MERGE D/DENSITY WITH 8 IN. FLAGPDIRBUF7T?;;CONVERT TO 0 OR 8 O>; };SECTOR COUNT = 18 OR 26PDIRBUF %DUNITQHDTAB8 FTOSIOV !PDIRBUF;;SIZE = SECTORS/TKQHDTAB8 !} PDIRBUF;;LOW BYTE OF SIZE*Q>4PDIRBUF;;ONE TRACK/DRIVE>+TOSIOV#DCOMND;;CHANGE COMMAND TO WRITEHQ>R"PDSTAT"}S;;SET DIRECTION -> DISK\& SIOV;;WRITE OPTION TABLE TO DRIVEfX;pFX; AND THIS ROUTINE MAKES SURE IT REALLY DID HAPPEN AS#} WE THOUGHT!zX;JSTRDQ>RDSTAT PDCOMND DSKINV $DUNITC GZERDVS QDVSTATT?;;SECTOR SIZE=256?T?T$}?Q>O>SETSIZPSECSIZ9:X;ZERDVSQ>$FSETSIZ;;branch always.X;8X; DOS RAMDISK CODEBX;LX;V%}+X; RAM DISK I/O HANDLER (POS. IND. CODE)`X;j MAPAGEt ===~ === ===ϒ ===X; &}=== ===ߺ === ===X; === === === ===X'};  === === ===( ===2X;<VALSEC5;;Save RAMbank #FC;;Sector # (lo)PL>;;$80/(}2=$40ZV?;;Page # = sectordPBUFR;; (lo)/2.n=;;DISABLE INT-SxQ>PNMIEN;;DISABLE NMI-SW?;;Odd sector uses)}PBUFR;; top 1/2 page.7;;Res. RAMbank #? QMAPREGM>;;Calc. & savePCHKSUM;; main RAMbank.L>| MMAPA*}GE8%PMAPREG;;SELECT RAMDISK DATA PAGEX;*QDBUFLO;;USER BUFFER ADDRESS GOES HERE PBUFRQDBUFLO PBUFR+}"%>,86DRREADL;;CY=0 IF READ@RWRITLQ@BUFR7J P@BUFR7T3^ IRWRITLh GRIOXrX;|)RDKIO'DAUX1;;*** FOR FO,}RMAT CODE ***)>U?R>/RDKLMT ;;NUMBER OF 16K PAGES IN RAMDISK!DVALSEC;;CALCULATE MEM. ADDR.8Q>-} GRERRORX;RREADLQ@BUFR7P@BUFR73 IRREADLX;%RIOXQCHKSUM;;FORCE REAL RAM PAGEPMAPREG;;BEFORE EX.}ITING&Q>0PNMIEN;;RE-ENABLE NMI:.;;ENABLE INTERRUPTSDQ>;;RETURN '1' IN Y-REGN&RERRORPDSTATS;;AND IN STATUS BYT/}EX$CURFCB;;RESTORE FCB ADDRb?l:;;THEN EXIT1@ ;X;v.4.52/3 mods. by David R. Eichel 11/10/89 1:30 pm%X;SAVE#D4:MDOS2.M65 MYDOS module9X; Copyright 1984, Ch1}arles Marslett, Wordmark Systems(X;2IX; Permission is granted by the author for any use whatsoever of this<HX; code, 2}so long as this notice remains in the source code, and soFLX; long as the source to this routine, however modified or unm3}odified,P.X; is made available for a nominal cost.ZX;dX; DISK OPEN ROUTINEnX;x'DKOPEN WBITMP;;fix that nasty bu4}g!( SETUP;;SET UP BUFFER POINTERS, ETC.2 GETFNM;;GET DRIVE ID OR FILE NAME FROM BUFFER'QICAX1Z;;GET TYPE OF OPEN FRO5}M IOCB PFCBOTC9!M>;;TEST DIRECTORY READ FLAG FDKOPN13!LSTDIR;;IF SET, GO HANDLE DIRECTORY FORMATTINGX;DKO6}PN1PSAVSEC9PSAVSEC9;;ZERO SAVSEC SFDIR6;;SAVE STATUS RETURNED EOPNEW*Q>;;MAKE SURE THIS IS NOT A DIRECT7}ORY GETFLAG4HDIROPN;;IF A DIRECTORY, GO HANDLE IT SEPERATELY"OPNEW%ICAX1Z,)>6FOPNOP;;IF OPEN FOR OUTPUT@)8}>JFOPNIN;;IF OPEN FOR INPUTT)> ^+FOPNUP;;IF OPEN FOR READ/WRITE (UPDATE)h)> rFOPNAP;;IF OPEN AND APPEND|.DI9}ROPN!ERRCMD;;OTHERWISE, IT IS AN ERROR!X;OPNAP8;;OPEN APPEND EOPNCR0 TSTLOK- INITYP;;READ ALL THE SECTORS I:}N THE FILEQDIRBUF8 PSECCNT9QDIRBUF8PSECCNT9APPRD RDNXTS$DAPPRD;;IF NOT EOF, READ ANOTHER Q;}MAXLEN9# LENSET;;SET LENGTHS FOR OUTPUT QSECCNT9 HSGLDEC"SECCNT9&/SGLDEC"SECCNT9;;ALLOW FOR SECTOR REWRITT<}EN0 !OPOUTX:X;D OPNUP8;;OPEN UPDATE (OUTPUT)N EOPNER1X TSTLOKbOPNOWR INSTRTl !DONEvX;OPNIN8;;OPEN INPU=}T DOPNOWROPNER1Q>;;FILE NOT FOUND GEROXITX; OPNOP8;;OPEN (NORMAL) OUTPUT EOPNCR REMOVE !GET1ST>}X;OPNCR0"FCBOTC9OPNCRQHOLFN PCURFNO GOPDIRF GET1ST ALLOCX; $QICAX2Z;;IF OUTPUT, TYPE OF FILE*"M>$;?};SAVE LOCKED & FORMAT BITS41N>C;;MERGE IN DEFAULT CODE (DOS II, UNLOCKED)>%MAPBUF;;WHICH TYPE DISK?H)>;;IF >2 THEN M@}YDOSR DLLINKS\L>fX;p LLINKS5z. RDCFNO;;SELECT PROPER SECTOR IN DIRECTORY; ENTNAME;;ENTER NAME INTO ITQA}LNKSEC9PDIRBUF8 QLNKSEC9PDIRBUF87 SAVFLAG INITYP TONXTOPOUTXQ> PFCBFLG9! TSTDOB}S;;FILE NAME = DOS.SYS? HJDONE %CURSEC9QCURSEC9$' SETDOS;;IF SO, UPDATE BOOT SECTORS.X;8 QDOSADB PFMSZPGC}L QDOSADVPFMSZPG`0HOWTDOS;;NOTE: DOS CANNOT START ON ZERO-PAGEjX;tOPDIRFQ>~EROXIT!AEXITX;3LWTDOD}S WRNXTS;;AUTOMATICALLY WRITE DOS.SYS OUT/OWTDOS%>;; IF WE OPEN IT FOR WRITE (THIS5CDOSBFQ@FMSZPG7;; IS BECAUSE DE}OS 2.0 WOULD BLOW1P@FMSBPT7;; ITSELF AWAY IF A REAL WRITE FROM&3;; THE DOS CODE WAS ATTEMPTED AND1)DLINK;; WE ARE F}GOING TO REMAIN COMPATIBLE). DCDOSBFC PCURLEN9 MVBUFR )DOSENDSDOSEND  DLWTDOSJDONE!DONEX;(G}X; READ DATA FROM A FILE2X;</DKREAD SETUP;;SET UP BUFFER POINTERS, ETC.F QFCBOTC9P&M>;;TEST THE DIRECTORY INPUT FLAH}GZ!FRDFILE;;SO WE CAN HANDLE THEd.!DIRRD;; SPECIAL CASE OF A DIRECTORY READnX;xRDFILEQCURLEN9 RMAXLEN9;DRDSGI}BT;;IF NOT AT SECTOR BOUND., READ A BYTE AT A TIME6ERDASNT;;ELSE, CHECK FOR READ MODE AND BUFFER SIZEX;RDASLPQICCOJ}MZM>4FRDSGBT;;IF NOT BINARY I/O READ A BYTE AT A TIME %DLINK1?RDSCLPQ@FMSBPT7;;SIMULATED BURST I/O (USING UK}NROLLED LOOP) P@ICBALZ71 Q@FMSBPT7 P@ICBALZ71 Q@FMSBPT7" P@ICBALZ7,16 Q@FMSBPT7@ P@ICBALZ7J1T HL}RDSCLP^0Q@FMSBPT7;;DATA AREA IS MULTIPLE OF 4 PLUS 1h P@ICBALZ7r0 BUFADJ;;ADJUST BUFFER POINTER BY 125 OR 253|(RDASNTM} RDNXTS;;READ THE NEXT SECTOR*ERETEOF;;REPORT EOF/ERROR IF NECESSARYQICBLLZ;;AND REPORT LAST BYTE IF IT IS SO! ,&XP};0)RETEOFQ>;;RETURN END OF FILE STATUS: !AEXITDX;NX; WRITE DATA TO A FILEXX;b,DKWRITPDATBYT;;SAVE DATA BYTE (PQ}ERHAPS)l %ICDNO9v5'ICDNOZ;;INSURE ICDNOZ IS SET UP (BASIC DOES NOT). SETUPW;;SET UP REST OF FLAGS AND POINTERS QFCBR}OTC9M>8FCANTWR;;ERROR OUT IF WRITE IS ILLEGAL (BASIC AGAIN) QCURLEN9? RMAXLEN98DSKBURST;;SKIP AROUND IF NS}OT WRITING END OF A SECTORX;*WRASLP WRNXTS;;WRITE A SECTOR OF DATA,ERETEOF;;ERROR OUT IF NO MORE DISK SPACE %STKT}PSVQ8R>;;IF FROM BASIC DBASWRT;;PASS SINGLE BYTES!QFCBOTC9;;fix open for update M>;;bug in burst I/O* HU}BASWRT4 QICCOMZ>M>;;AND IF RECORD I/OHFBASWRT;;PASS SINGLE BYTESR0%ICBLLZ;;AND IF THE BUFFER IS < 256 BYTES\V}FBASWRT;;PASS SINGLE BYTESf %MAXLEN9p1z1WRSCLPQ@ICBALZ7;;ELSE DO SIMULATED BURST I/O$P@FMSBPT7;;BY UNROLLING THE LW}OOP1 Q@ICBALZ7 P@FMSBPT71 HWRSCLP-Q@ICBALZ7;;BUT ONLY 2 ENTRIES FOR WRITING P@FMSBPT7 BUFADJ Q@ICX}BALZ7 PDATBYT !WRASLPX; BASWRT%> SKBURSTQDATBYT #CURLEN9$ P@FMSBPT7. Q>@8 :LFCBFLG9;;FOR UPDATE, SAY}Y THE SECTOR HAS BEEN MODIFIEDB PFCBFLG9L HTODONE;;BRANCH ALWAYS!V X;` CANTWR!ERRCMDj X;t BUFADJ,~ QMAXLEN9 PZ}CURLEN9 OICBALZ PICBALZ DRBAOK #ICBALZ RBAOK; QICBLLZ SMAXLEN9 PICBLLZ ERBLOK "ICBLLZ [}RBLOK: X; X; RETURN FILE STATUS X; .DKSTAT SETUP;;SET UP RETURN ADDRESS, ETC.( ( LFFILE;;FIND IF FILE IS THERE, ETC\}.2  TSTLOK;;IS IT LOCKED?< "TODONE!DONE;;RETURN TO CALLERF X;P -X; CLOSE FILE (WRITING ANY PENDING SECTOR)Z X;d DKCLO]}S SETUPn QFCBOTC9x M>;;OUTPUT ALLOWED? FCLROTC;;IF NOT, JUST EXIT UFCBFLG9 DCKFLSC $ REWRIT;;REWRITE THE LAS^}T SECTOR RRDIR QSECCNT9 %DIRDSP PDIRBUF8 QSECCNT9 PDIRBUF8 QDIRBUF8 %M>;;NOT OPEN FOR OUTPU_}T ANY MORE SAVFLAG QSAVSEC9 LSAVSEC9 FCLROTC" (LSTIOCB, FFAPPD6 ' INITYP;;READ ALL THE SECTORS AGAIN@ `}APPLP RDNXTSJ DAPPLP;;NOT EOF YETT ETIELNK^ FAPPDQLSTSECh PCURSEC9r QLSTSEC| PCURSEC9 TIELNK, RWDIa}SK QDLINK PCURLEN9 QSAVSEC9 %SAVSEC9 SAVLNK CLROTEICLROTC "Q>;;FAILURE IS A SYSTEM ERROR !AEXITb} CLROTCQ> PICHID9 Q> PFCBOTC9 !FREDON X;& CKFLSCUFCBFLG90 DCLROTC: WRDISKD !CLROTEN X;X INITYc}PQ>b GETFLAGl V?v W? W? W? LFCBOTC9 PFCBOTC9 QDIRBUF8 PLNKSEC9 QDIRBUF8 PLNKSEC9 QCUd}RFNO PFCBFNO9 Q> PFCBFLG9 PCURLEN9 PSECCNT9 PSECCNT9 : X;* X; DOS XIO ROUTINES4 X;> X;H LX; Sore}ry about the lack of comments in this file and some of the others,R HX; I just never had to figure this code out after I wf}rote it (:-)!\ X;f $NODIRFQ>;;FILE NOT A DIRECTORYp !AEXITz X; PIKDIR%> Q> : FDVND3 R@ICBALZ7 HFDVND g}3 Q@ICBALZ7 R> @ DSETRDIR R> Z DGFNDIR R> _ DSETRDIR R> z ESETRDIR.GFNDIR LFFILE;;FIND NEW q}B#DOS SYSB6'DUP SYSB]CONTENTS BjeMD453_3 DSKBMDOS M65B_MDOS1 M65B0MDOS2 M65BMDOS3 M65BWMDUP M65B-\MDUP1 M65BMDUP2 M65Bj6MDUP3 M65B RB6C AR0BAREAD ME DEFAULT DIRECTORY$ INITYP. TONXDR8FNODIRF;;IF NOT A DIRECTORYBQDIRBAS9L?V QDIRBAS9`-SAVDEF'CDIREC;;Ur}PDATE ADDRESS OF DIR.j PCDIRECt QICDNOZ~ PDEFAULT;;UPDATE UNIT NUMBER ITOFDNX;SETRDIRQ>i %>i Is}SAVDEFX;1RENAME LFFILE;;GET OLD NAME, DRIVE, VALIDATE%> STEMPLQFNAME8PMAPBUF81 HSTEMPL+Rt}NLOOP TSTLOK;;CANNOT RENAME IF LOCKED  TDDOS;;TEST FOR DOS GONE! %TMP2 GETNAM;;GET NEW NAME(,2$ ENTNAME;;OVERWu}RITE NAME IN DIR.<& WDIRBK;;REWRITE DIRECTORY TO DISKFX;P TSTDOS;;NEW NAME DOS.SYS?ZHREPLDS;;NO, LOOK AT NEXTd %Dv}IRDSPnQDIRBUF8x5QDIRBUF8?7& SETDOS;;ELSE, UPDATE BOOT SECTORSREPLDS%> RTEMPLQMAPBUF8w}PFNAME81 HRTEMPL CSFDIR;;TO RENAME DRNLOOP ETOFDNX;DELETE LFFILE$DELLP REMOVE;;FLUSH THE SECTx}ORS" RRDIR;;REREAD DIRECTORY BLOCK" TDDOS;;DOS.SYS DELETED?,Q>6% SAVFLAG;;REWRITE DIRECTORY BLOCK@ CSFDIRJDy}DELLP;;IF ANOTHER FOUND,T)TOFDN!FREDON;;ELSE, WRAP UP AND EXIT^X;h0REMOVE TSTLOK;;ONCE HAD 'OPVTOC' CALL FIRSTr INz}ITYP| TONXDR HDELDIR CHASEX;D0C6C FREE RDNXTS DD0C6C:X;'INVDELQ>;;DIRECTORY NOT DELETABLE{} !AEXITX; LOCKQ>  ,;;BIT ABS (SKIP 2 BYTES)X;UNLOCKQ> PDATBYT&* LFFILE;;FIND FILE AND VERIFY WRIT|}ABLE0#LKULKLQ>;;STRIP OFF OLD BIT 5: GETFLAGD!LDATBYT;;AND REPLACE WITH NEWN SAVFLAGX CSFDIRb DLKULKLl ETO}}FDNvX;DELDIR%> Q> ?DELSETPFNAME 83 HDELSET SFDIR DINVDELX;Q> PDATBYT TONXT~}DELDRL FREE INCCSEC "DATBYT  HDELDRL !GETFNM X;*POINT%FCBFLG94 GERRCMD>X;HQICSPR9RRCURSEC}9\ HPNTREADf QICSPR9p RCURSEC9z FPNTSME PNTREADC!FPNTCLN;;IF SECTOR UNMODIFIED WRDISKQ> PFCBFLG9}PNTCLNQICSPR9PLNKSEC9 QICSPR9 PLNKSEC9" CHASE;;READ SECTOR POINTED TO EBADPNTX;PNTSMEQICSPR}9 RMAXLEN9 EPNTEQLPNTLSTPCURLEN9$ !DONE.X;8,PNTEQLFPNTLST;;IF POINTING AT LAST BYTEB&BADPNTQ>;;INVAL}ID POINT LOCATIONL VX;`&ERRCMDQ>;;INVALID IOCB PARAMETERj !AEXITtX;~NOTEQCURSEC9 PICSPR9QCURSEC9}PICSPR9 QCURLEN9PICSPR9 !DONEX;DKXIO SETUPQICCOMZ;;GET COMMAND BYTER> FFORMATR>+}EERRCMD;;IF INVALID COMMAND  S>  DERRCMD?( QVECTBH825< QVECTBL8F5P:;;VECTOR TO PROPER ROUTINEZX;d,}VECTBH RENAME =DELETE n" MKDIR =LOCK x$ UNLOCK =POINT # NOTE }=DKLOAD % DKLOAD =PIKDIR  MKDIR X;*VECTBL RENAME =DELETE } MKDIR =LOCK " UNLOCK =POINT ! NOTE =DKLOAD # DKLOAD =PIKDIR}  MKDIR X;X; DOS FORMAT ROUTINESX;X;6FORMAT WBITMP;;WRITE OUT ANY PENDING VTOC SECTORS:X;} LDY #9 ;Force format to match current density"GX;WOTCPY2 LDA WOTDCB,Y ;set up DCB for specified density [Bob Puff],}X; STA DDEVIC,Y6 X; DEY@X; BPL WOTCPY2J#X;The above was moved to SETDRVT $ICDNOZ^ (RAMDKUh%FWOTRAM;;don't d}o it for RAMdisksr%SECSIZ9|QDRVDEF9 SETDRV;;set density!WOTRAM$CURFCB;;restore X reg%>(C;;THEN INI}TIALIZE NEW BIT MAP (VTOC)CLRMAPPMAPBUF8PMAPBUF83)HCLRMAP;;ALLOCATING ALL POSSIBLE BITSX;Q>(PMA}PBUF;;DEFINE IT AS A DOS 2.0 DISKQ> P@FMSBPT73=P@FMSBPT7;;PRESUME NO BAD SECTORS IF BUFFER IS UNMODIFIED %IC}DNOZ& )RAMDKU0(FRAMFMT;;IF RAMDISK, SKIP EVERYTHING:QFMSBPTD(%FMSBPT;;call density junk for patchN/ BUFSET;;SET} UP BUFFER POINTER FOR SIO CALLX$>b&TMP1;;ALLOW ONE TRY ONLYl(Q>";;PRESUME 1050 D/D FORMAT REQUESTv%ICAX2Z;;THEN }GET AUX2 BYTE(GFMTOK;;MINUS --> NO FORMAT REQUIRED HNMLFMT%ICAX1Z;;(AUX2,AUX1) = 1?1.FFT1050;;YES, FORMAT WIT}H $22 COMMAND BYTENMLFMT$DUNITQSECSIZ9>+Q>FMTCMD;;AUX IS 0, must not be 1050 dd*FT1050PDAUX1;;MAKE SURE} WE SECTOR > 34%DSKTIM;;DISK TIMEOUT VALUE (RETURNED IN STATUS)& DKFME;;ENTER DKIO AT FORMAT ENTRY#IFMTOK;;delete ba}d sector check*FMEXIT!AEXIT;;ELSE, RETURN ERROR CODE X;?RAMFMTPCURSEC9;;STUFF PROPER NUMBER OF SECTORS INTO CURSEC }3,;;(256-BYTE PAGES * 2 SINCE SECTOR SIZE IS 128)* ORDKLMT4V?> WCURSEC9H,HNOTDEF;;FAIL IF NOT 256 SECTORS OR MORER}X;\8X; SUCCESSFUL FORMAT, CREATE VTOC AND EMPTY DIRECTORYfX;p%FMTOK%>;;check for a bad formatz Q@FMSBPT7#M@FMSBPT}7;;first two bytes $FF?R>FFMTOK2;;yep, continueQ>;;otherwise format error HFMEXIT.FMTOK2 INVUNIT;;MAKE S}URE WE CAN DO THIS!- DELDOS;;DELETE ANY CURRENT DOS BOOT FILE QICAX1Z PCURSEC9 QICAX2Z#M>;;DISK MUST HAVE 256} SECTORS&HNOTDEF;;IF SIZE SPECIFIED, USE IT %ICDNOZ.QHDTAB8;;IF NOT AND THIS IS A HARD DISK"PCURSEC9;;USE THE }DEFINED SIZEQHDTAB8$ HNOTDEF.&*DVSTAT;;ELSE, IS IT A 1050 DRIVE?8!IFIGSIZ;;NO, FIGURE SIZE THENB'Q>;;Y}ES, FORCE TO 1040 SECTORSL PCURSEC9V Q>` HNOTDEFjX;tFIGSIZQDRVDEF8~"M>1;;EXTRACT TRACK COUNT FLAGSV}?6V?V??0QNOSECS8;;AND USE DRIVE DEFAULT SECTOR COUNT PCURSEC9QNOSECS88,DNOTDEF;;IF NOT DOUBLE }SIDED, THIS IS IT TCURSEC9U?;;ELSE, DOUBLE ITX; NOTDEFPCURSEC9R>;;NEED 16 BIT LINKS? DSHORTS;;NO, SHO}RT FORMAT OK(*#MAPBUF;;YES, FORCE LONG FORMAT (DOS3)2,SHORTS FNDBIT;;FIND LAST BIT MAP SECTOR< QTMP2F"HGT246;;IF PAS}T 256TH MAP BYTEP*DLINK;;SINGLE DENSITY?Z GFDBDENd)>n IFDBDENxGT246PMAP2,O> PMAPBUFFDBDENQ> } PMAPBUF Q> 2PMAPBUF;;START WITH 9 FREE SECTORS UN-FREE!FLOOP FMTFRE DECCSECR>;;BOOT }SECTORS YET?)HFLOOP;;IF NOT, CONTINUE DEALLOCATINGQCURSEC9 HFLOOPX;Q>;;success)PFMSBPT;;bad sector co}de deleted here"X;,Q>6>PMAPBUF7;;ALLOCATE THE ROOT DIRECTORY AND BASE VTOC SEC.@*Q>;; NOTE: ALWAYS THE SAME 9 S}ECTORSJPMAPBUF8T"%>,;;START ALLOC. OF VTOC HERE^ QMAPBUFh;rS>;;GET NUMBER OF SECTORS|*DLINK;;(SINGLE DENSIT}Y?)GMPNSD;;IF NOT, M-3T?;;IF SO, M*2-5 MPNSD>0;;MOVE COUNT TO XX;ALCMPLQ> ALCMAP0 GSMBSIZ5 }DECCNT7T? HALCMAPPMAPBUF 81IALCMPL;;BRANCH ALWAYS!&X;0SMBSIZPMAPBUF 8:$QMAPBUF;;MARK EMPT}Y SIZE, TOODPMAPBUFNQMAPBUFXPMAPBUFb FMTMAP;;WRITE MAP TO DISKlX;v X; CREATE AN EMPTY DIRECTORYX;} Q>i %>i3CLRDIR SETDIR;;RESET THE DIRECTORY BASE SECTORC$CLRDLPPDIRBUF8;;ZERO THE BUFFER3 HCL}RDLPX;Q> PDIRSEC1CLRDL2 WDIRBK;;THEN WRITE 8 SECTORS OF ZEROS "DIRSEC ICLRDL2  %BUFNO9Q>  PBUFN}O9*2PBUFFLG8;;DONE, SO FREE UP INTERNAL BUFFERS4 QFMSBPT> !AEXITHX;R"NOSECS #=(=P=M\X;fSETD}IRPDIRBAS9pCzPDIRBAS9%>:X;X; DOS BINARY LOAD CODEX;X;.X; LOAD AND EXECUTE A BINARY FILE (PROGR}AM)X;DKLOADQICAX1Z-PICPTLZ;;SAVE PROGRAM NAME BUFFER POINTERR>#ETOERRC;;IF WRITE, REPORT ERRORX;Q>T}ORTS PRUNADR-Q>TORTS;;ASSUME RUN ADDRESS IS ABSENT$PRUNADR.Q>8 PICAX1ZBQICHID9;;IOCB OPEN?L ICC}FILEV DKOPEN;;IF NOT, OPEN IT` GDKLERVj WDREAD;;READ A HEADER WORDt FCCFILE~+%>;;NO $FFFF, REPORT HEADER ERROR C}ODE GDKLERVX;TOERRC%>;;INVALID IOCB:X;GETTXTQ>TORTS PINIADR:Q>TORTS;;FOR EACH SEGMENT, RE}-FORCE NULL INIT CODEPINIADRTXTLP DKREADDKLERVGDKLERR%> P@ICBALZ7  #ICBALZ HDECLEN #ICBAHZ(}DECLENQICBLLZ2 HDECLOW< "ICBLHZFDECLOW"ICBLLZP HTXTLPZ QICBLHZd HTXTLPn QICBAHZxR>INIADR HCCFILE}X;QICPTLZ;;IF NO INITS,V?ECCFILE;;SKIP TO NEXT PAGEA;;ELSE SAVE IOCB5 %> CPSICBQICHIDZ }8$PICHID9;;SAVE 12 BYTE IOCB ENTRY23 HCPSICB7>5"# DOINIT;;AND CALL INIT FUNCTION,76>@5J %>} T1CPRICBQICHID9;;THEN RESTORE THE 12 BYTE IOCB^PICHIDZ 8h2r3| HCPRICB7>X;&CCFILE WDREAD;;READ} START ADDRESS FCCFILE PICBALZ 'ICBAHZ WDREAD;;READ END ADDRESS;O> DCCSUBT3 CCSUBT; !SICBALZ;};CALCULATE THE LENGTH PICBLLZ C& SICBAHZ0 PICBLHZ: 0EGETTXT;;BRANCH IF A VALID LENGTH (GET DATA)D %%>;;ELSE, MEMO}RY WRAP ERROR CODEN GDKLERRX X;b WDXIT7l 7v DKLERRC 5  DKCLOS;;CLOSE PROGRAM FILE 7 (?;;AND RETURN HIS ERROR }CODE (IF ANY) : X; BX; READ A WORD FROM THE PROGRAM FILE AND COMPARE IT WITH $FFFF X; WDREADQ> PICBLLZ PIC}BLHZ;;SET LENGTH TO ZERO  DKREAD;;READ A BYTE GWDEOF!5 ! DKREAD;;READ THE SECOND! GWDEOF1 !?*!74!)>;;UPPER B}YTE $FF?>!,HTORTS;;IF NOT, TOTAL VALUE IS NOT $FFFFH!%R>;;UPPER OK, IS LOWER BYTE $FF?R!.TORTS:;;RETURN ZERO FLAG IF WORD} WAS $FFFF\!X;f! WDEOF17p!#WDEOF)>;;IS THIS END OF FILE?z!%HWDXIT;;IF NOT, RETURN ERROR CODE!7!"7;;ELSE, GET RID OF }RETURN ADDR! QICPTLZ!V?!V?!6!# DKCLOS;;CLOSE FILE AND SET Y=1!8!$ETORTS;;EXIT IF NO-RUN SPECIFIED!+!@RUNADR:;};OTHERWISE, GO TO RUN ADDRESS!X;!FX; INVOKE INIT FOR EVERY BLOCK OF INPUT CODE (USUALLY JUST AN RTS)!X;"#DOINIT!@INI}ADR:;;CALL INDIRECTJ ;X;v.4.53/3 mods. by David R. Eichel 11/29/89 9:32 pm$X;SAVE#D4:MDOS3.M65 MYDOS moduleX;(X; DOS MAKE DIRECT}ORY CODE2X;<9X; Copyright 1984, Charles Marslett, Wordmark SystemsFX;PIX; Permission is granted by the author for any} use whatsoever of thisZHX; code, so long as this notice remains in the source code, and sodLX; long as the source to} this routine, however modified or unmodified,n.X; is made available for a nominal cost.xX;-X; XIO FUNCTION TO CREAT}E A NEW DIRECTORYX;X; PARSE DIRECTORY NAMEX;MKDIR GETFNM" SFDIR;;FIND FILE IN DIRECTORY EMKDMRDQ>;;}FILE ALREADY EXISTS ;;SKIP 2 BYTESDISFULQ>;;DIRECTORY FULL !AEXITX;X; READ IN BIT MAPX;MKDMRDQHO}LFN GDISFUL" RBITMP, %MAPBUF61@1J 'DATBYTTX;^'X; FIND EIGHT SECTORS FOR DIRECTORYhX;r3Q>q;;FIRST AV}AILABLE SECTOR AFTER ROOT DIR.| PCURSEC9 Q>qPCURSEC9Q> PTMP1FDIRLP#TMP1" FNDLBIT;;IS THIS SE}CTOR FREE? EFDIR2 MMAPBUF8 DFDIR1FDIR2MMAPBUF8FDIR1HFDIR3 PTMP1FDIR3 INCCSEC QTMP1R>} HFDIRLP&X;0 X; ALLOCATE THE SECTORS USED:X;DALCDLP DECCSECN FNDLBITXN>b EALCPG2l MMAPBUF8v PMAPBUF8} DALCPG1ALCPG2MMAPBUF8PMAPBUF8 VMAP2MODALCPG1 DECCNT "TMP1 HALCDLPX;(X; WRITE ALLOCATI}ON MAP BACK TO DISKX; FMTMAPX;5X; ENTER NAME AND TYPE INFO INTO PARENT DIRECTORYX;  QHOLFN SDIRBK ;*} ENTNAME4QCURSEC9>PDIRBUF8H QCURSEC9RPDIRBUF8\Q>fPDIRBUF8pQ>zPDIRBUF8T? SAVF}LAGX;X; THEN CLEAR NEW DIRECTORYX;Q> PFMSBPT QCURSEC9%CURSEC9 !CLRDIRX;$X; SIMULATE OLD }STYLE BIT FINDERX;FNDLBIT FNDBIT5;;SAVE MASKQTMP2;;FIRST PAGE?$ FFNDPG0.'TMP2;;SAVE OFFSET IN PAGE8 RDA}TBYTB EDFEJMPL RDNXTM;;READ IN PROPER PAGEV$%TMP2;;THEN RESTORE A AND Y REGS`7j!;;;SET CY (PAGE 1 BUFFER USED)t:~}X;FNDPG07;;RESTORE SAVED MASK,;;AND CLR CY (SAY PAGE 0):X;DFEJMP!DFERRX;DECCSECQCURSEC9 HALCPG}0"CURSEC9ALCPG0"CURSEC9:X;INCCSEC#CURSEC9  HDELDIN#CURSEC9 DELDIN:(X;2X; DOS DIRECTORY} ROUTINES<X;FX;P/X; OPEN A DIRECTORY (FOR DIRECT USER ACCESS)ZX;dLSTDIR%> nSAVFNBQFNAME 8;;PutxP@FM}SBPT7;;all 11 chars3;;into FMSBPT. ISAVFNB) SFDIR;;FIND A MATCH IN THE DIRECTORY-EENDDIR;;IF NO MORE, GO REPORT F}REE SPACE1NXTDIR FMTDIR;;ELSE, FORMAT INTO TEXT STRING QCURFNO-PFCBFNO9;;SAVE FILE NUMBER OF ENTRY FOUNDGODONE!}DONE;;AND RETURNX;1GOTEOD"DATBYT;;CONVERT EOL TO $9B (REAL EOL)PCURLEN9;;AND FINISH UP HGODONEX;X;DI}RRD%>  FGOTEODR>;;IS THIS END OF LINE?'H}GODONE;;IF NOT, CONTINUE TEXT DUMP QFCBFNO9 RCURFNO HDMSTRD (DIUNIT FDRDNRQDMSTRD RRDIRDRDNRQ CSFDIR} DNXTDIRX;0X; NO MORE ENTRIES, REPORT FREE SECTORS LASTX;&ENDDIR RBITMP;;READ THE VTOC DATA%>&%'CURMAP};;FORCE A REREAD NEXT TIME0QMAPBUF::$MAPBUF;;AND STUFF BUFFER WITH NUMBER OF FREE SECS.D CVTDECN$>X9FSEC}LQFSECM9;;FOLLOWED BY "FREE SECTORS" TEXTb P@FMSBPT7l3v2 HFSECL#FGODONE;;THEN LAST LINE IS DONEX;:D}IREOF!RETEOF;;NO MORE LINES, RETURN E-O-F INDICATIONX;FSECM A FREE SECTORSA=X;/X; FORMAT A DIRECTORY ENTRY F}OR BASIC, ETC.X;FMTDIR%> ;;space $DIRDSP QDIRBUF95M>  FNOTLCK%> *;;IF SO, MARK AS LOCKED  NOTLCK}C*%>4 P@FMSBPT7>7H%> ;;spaceRM>\ FNOTDIRf%> :p NOTDIRCz%> P@FMSBPT7 CPYNAML3QDIRBUF9 }P@FMSBPT72)>  DCPYNAMLX;Q> ;;space P@FMSBPT7 %DIRDSPQDIRBUF8$DIRBUF8 !%>;;SECTOR COU}NT STARTS HERE X; 8X; CONVERT A 16-BIT INTEGER TO A 4 OR 5 DIGIT NUMBER$ X;. CVTDEC&TMP28 PTMP1B $>'L Q>'}V MKDGT2` 5;;Save this digit.j R> 0t HSKIP5~ 1 SKIP5$> Q> MKDGT2 R> 0;; 7;;Don't o}verwrite ESKIP4;; a non-0 5th R> 0;; char. if 4th HSKIP4;; = 0. 1;;Both zero. SKIP4 Q>d;;FOR SHORT STUFF} MAKDGT Q> MAKDGT A O> 0 ( P@FMSBPT72 3< SKIP4AF Q>;;TERMINATE LINEP PDATBYTZ P@FMSBPT7d Q>n } $CURFCBx PCURLEN9 : X; ;;IF SUBTRAHEND }< 256, ZERO UPPER BYTE MKDGT2&DIRDSP PDIRSEC 'DATBYT %> 0 ; DGTLP2QTMP1 SDIRSEC > QTMP2 SDIRDSP} DDGTXIT" PTMP2, &TMP16 3@ EDGTLP2J X;T DGTXITC^ %DATBYTh P@FMSBPT7r 3| : X; @X; PARSE A FILE NAME WITH} WILD CARD CHARACTERS ('*' AND '?') X; GETNAM23;;look for ">" in Q@ICBALZ7;;the start of R> >;;the filename FGET}NAM 1 HGETNAM;;branch always X; GETFNM$CURFCB %>i Q>i SETDIR 3 Q@ICBALZ7& 30 R> :;;DEFAU}LT DIRECTORY?: HGETNAM2D 1N 'TMP1X %DEFAULTb 'ICDNOZl Cv PICDNO9 SETUPD QCDIREC %CDIREC SETDIR } %TMP1 X; GETNAM$> 3 AFTSTRQ@ICBALZ7 R> * HTSTPER Q> ? 3 QLOOPPFNAME 9 2 ITOXITC;;END }OF EXTENSION? "PERFND(>;;END OF FILE NAME?* HQLOOP;;NO MORE -?-S4 FAFTSTR> X;H TSTPERR> .;;A PERIOD?R 4HTSTCHR;;}IF NOT, CHECK FOR INDIVIDUAL CHARACTERS\ Q> ;;IF SO, FILL WITH SPACESf 3p HPERFNDz X; TSTCHRR> ? &DENDCHR;;IF < '?}', CHECK FOR DIGIT 1R> Z;;ELSE, UPPER CASE LETTER, '?', OR '@'? DGOTCHR R> _ *DENDCHR;;IF CARET, BACKSL. OR BRACKE}TS -R> z;;LOWER CASE, ACCENT OR UNDERSCORE? DGOTCHR %ENDCHR(> ;;IF FIRST CHAR, ERROR "FERRCHR;;NO BYTES IN FILE }NAME R> 0;;ELSE, A DIGIT? (DFILLNM;;IF NOT, THIS IS END OF NAME R> : EFILLNMX;GOTCHRPFNAME 9$3.28} GAFTSTRBX;LTOXITCQ@ICBALZ7VTSTDIRR> :;;look for MYDOS`FMYDIR;;or SpartaDOSjR> >;;directory separatort HXITC}HR~MYDIR'TMP2 SFDIR;;ELSE, FIND FILEEFNER1;;NO SUCH FILE TONXDR FFNER1 %TMP2 HGETNAM'FNER1Q>;;I}F NOT, RETURN ERROR 174 ,;;BIT ABS (SKIP 2 BYTES)X;ERRCHRQ> !AEXITX; FILLNM5 Q> ;;spaceFILLLPPF}NAME 92( GFILLLP27< !TSTDIRFX;P7X; RETURN WITH NON-ZERO FLAG IF FILE IS A DIRECTORYZX;d(TONXDRQ>;;FI}LE FOUND, A DIRECTORY?n GETFLAGx"FTONXIT;;IF NOT, SET ZERO FLAG4QDIRBUF8;;YES, MOVE POINTERS TO THE NEW LEVEL P}DIRBAS9QDIRBUF8PDIRBAS9Q>;;AND CLEAR ZERO FLAG TONXIT:X;8X; ENTER A NAME INTO THE DIRECTORY AT DI}RBUF[DIRDSP]X; ENTNAME6$>  %DIRDSP2NAMELPQFNAME 9;;LOAD THE MASK CHARACTERR> ?'HSTORIT;;IF NOT }'?', SAVE IT AS IS!8"6,3DNOSTOR;;IF CY CLEAR, LEAVE CHARACTER UNCHANGED6,Q> ;;ELSE, IF CY SET, CONVERT '?' TO ' '@}STORITPDIRBUF8J NOSTOR3T2^ GNAMELPh8r %DIRDSP|XITCHR$CURFCB:X;)SFDIR WBITMP;;INSURE BIT MAP IS S}AFE$> &HOLFN &CURFNO X; INXX; STX DAUX2 X; INXX; STX DAUX1X; LDX #READX; STX DCOMNDB}X;The above removed for space (found an easier way, see below)8 SYSSET;;SET UP POINTERS, ETC. FOR A NEW DISK ACCESS QI}CDNOZ RRAMDKU&.FCSFDIR;;IF RAMDISK, FORGET DENSITY CHECK!0 $CURFCB;;don't read boot sec:"QDIRBAS9;;if in subdirector}iesD$R>i;;but allow if first readN HCSFDIRX%>;;Else, read thebQ>;; first bootl,;; sector (#1).v DKI}O;;X;This is the easier way. GERRX( INVUNIT;;UPDATE DRIVE CONFIGURATIONX;0CSFDIR#CURFNO;;READ NEXT 16-BYTE }DIR. BLOCK QCURFNO/ BSECDS;;CONVERT TO SECTOR AND DISPLACEMENTXITCHR1EXITCHR%HNOREAD;;IF DISP>0, PROCESS BLOCK}# RDIRBK;;IF DISP=0, READ SECTORX;NOREAD%DIRDSP QDIRBUF87FFNDOLD;;ZERO IS END OF DIRECTORY (NO MORE ENTRIES) };GFNDOLD;;NEGATIVE IS EMPTY SLOT (MAY HAVE MORE ENTRIES)M>;;preserve lock flag  R>;;is this DOS 2.5 + file?*HNOD}25;;nope4Q>A;;otherwise, kludge the>NDIRBUF8;;flag to make $42HPDIRBUF8;;and save lock.R NOD25M>\8HCSFDIR;;IF }OPEN/CREATE FILE, IT IS NOT REALLY HERE!f$> pCPNXCHQFNAME 9zR> ?#FWCMTCH;;EVERYTHING MATCHES '?'RDIRBU}F84HCSFDIR;;IT DOES NOT MATCH, LOOK AT THE NEXT ONE WCMTCH32 GCPNXCH,*DXITCHR;;ENTRY FOUND, RETURN WITH }CY=0X;FNDOLD$HOLFN9IKPOLD;;IF AN EMPTY SLOT IS ALREADY FOUND, DO NOTHING $CURFNO5&HOLFN;;ELSE, SAVE THE SLOT} NUMBER (FIRST EMPTY!) KPOLD>2GCSFDIR;;IF NOT END OF DIRECTORY, KEEP LOOKING ERRX;$5EXITCHR1;;ELSE, ENTRY NOT FOUN}D, RETURN WITH CY=1.X;8X; DOS I/O ROUTINESBX;LX;VX; DISK SECTOR I/O ROUTINES`X;j!WRDISK;;;FMS DISK WRITE ENTRY}t0RWDISK%FMSBPT;;DATA SECTOR READ/WRITE ENTRY~QFMSBPT BUFSETQCURSEC9 %CURSEC9 FMDKIO6 $DUNIT (}RAMDKU FRDKIO185QSECSIZ9>7 !DKIO RDKIO1!RDKIO;;was moved...X;EXTEND ALLOC( QFCBOTC92}V?< DREWRITF "FCBOTC9P WTRICKZ !WRTTSTdX;nREWRIT%LNKSEC9x QLNKSEC9 SAVLNKWRTTSTGRTBADF #SECC}NT9 HTONXT#SECCNT9X;$TONXTQLNKSEC9;;MAKE NEXT SECTORPCURSEC9;;NEW CURRENT SEC.QLNKSEC9PCURSEC}9Q>PLNKSEC9;;ZERO LINKPLNKSEC9(LENSETPCURLEN9;;ZERO CURRENT OFFSETQDLINK;;GET THE LINK LOC.PMA }XLEN9;;MAKE IT MAX. LEN.",;;CLEAR CY FOR LATER READ,:6X;@RDNXTSQFCBFLG9J FCHASETX;^WRNXTSQFCBFLG9h GEXTEN }DrT?| IRDNXTST? PFCBFLG9 WRDISK IRDNXTSX;8RTBADF!HWERR;;RETURN HARDWARE ERROR CODE IF PRESENTX;  }SAVLNK5C %DLINK P@FMSBPT773 P@FMSBPT73 QCURLEN9&NOBITP@FMSBPT70 %FCBOTC9:GLEN16;;16-BIT LEN }GTH?D QFCBFNO9NT?XT?b %DLINKl L@FMSBPT7v P@FMSBPT7LEN16!WRDISKX;WTRICKQLNKSEC9 PSAVSEC9QLNKSE }C9PSAVSEC9 &LSTIOCB QCURSEC9 PLSTSECQCURSEC9PLSTSEC !WRDISKX;INSTRT INITYP X;}CHASEQLNKSEC9 LLNKSEC9* FNOLINK4 TONXT;;SET CY=0, FUNC=READ> RWDISKH4GRTBADF;;CANNOT READ SO BAD FILE NUMB}ER(ERR=164)R %DLINK\QFCBOTC9;;16-BIT LINK?fL>p GLNGLNKz Q@FMSBPT7V?V? RFCBFNO9 HXLINKEDQ>LN}GLNKM@FMSBPT7PLNKSEC93 Q@FMSBPT7 PLNKSEC93 Q@FMSBPT7 PMAXLEN9 DRDXIT,:X;$XLINKEDQICCOM}9.R>FMTCMD;;IS THIS A FORMAT?8 HFNOERRB NOLINK;L:VX;`%X; READ OR WRITE A DIRECTORY BLOCKjX;tRRDIRQFCBFNO9~}X;SDIRBKPCURFNORDCFNOQCURFNO BSECDSX;1RDIRBK WBITMP;;TAKE CONTROL OF SYSTEM BUFFER, ;;LDA # (SK}IPS 1 BYTE) WDIRBK; RWDBK6$CURFCB;;PUT FCB NO. IN X&&DIUNIT;;SAVE THE DIR. BUFFER IOCB SYSSET,  QDIRSEC} ODIRBAS9?(QDIRBAS92!O>;;MULTIPLE DIRS. REQ. THIS<8FSYSRW FMDKIOP IDRDXITZ3Q>;;BIT MAP R/W ERROR, R}ETURN SYSTEM ERR. CODEd ;;SKIP 2 BYTESnX;xFNOERRQ> PDSTATS !HWERR;;FILE NUMBER MISMATCHX;+X; READ OR WR}ITE THE DISK VTOC (BIT MAP)X;RBITMPQCURMAP RICDNOZ.FMAPXIT;;IF WE READ WHAT IS ALREADY THERE!9 WBITMP;;ELSE,} REAL I/O, SAVE CURRENT BUFFER CONTENTSX;Q>?'ZMAPPMAPBUF8;;THEN ZERO ENTIRE 512#PMAPBUF8;;BYTES OF MAP }BUF.1 HZMAP",,4 RWBMAP;;THEN READ 128 OR 256 BYTES OF VTOC DATA6X;@%>J8'DIUNIT;;INDICATE MAP IS LOADED (NOT} DIRECTORY DATA)T1'MAP2;;INDICATE NO DATA IN SECOND PAGE OF MAP^3h&'CHGMAP;;INDICATE MAP IS UNCHANGEDr3| 'MAP2MOD} 'CURMPX;8MAPCLRPCURMAP;;AND SAVE DRIVE NUMBER MAP APPLIES TO MAPXIT:X;WBITMPQCHGMAP0FMAPCLR;;IF MAP NO}T CHANGED, SKIP WRITING IT PDUNITFMTMAPQ>!PCHGMAP;;ELSE, MARK IT UNUSED PCURMAPQDUNIT;;save drive #5 };;;SET CY TO INDICATE A WRITE3 RWBMAP;;AND CALL THE READ/WRITE SECTOR ROUTINE7;;restore drive #& PDUNIT0X;:WRNXT}MQMAP2MODD)HNOMAPI2;;IF THE PAGE BUFFER IS CLEANNQ>;;JUST EXIT, ELSEX5b QMAP2l #MAP2MODv;)EMUSTWM;;WRITE IT} TO DISK (CY IS SET)X;9RDNXTMRMAP2;;READ A PAGE INTO THE SECOND PAGE BUFFER.FNOMAPI;;IF IT IS ALREADY THERE, JUST E}XIT54 WRNXTM;;ELSE, WRITE CURRENT PAGE (IF NECESSARY)7;; AND READ IN THE NEW ONE5.,;; BY FALLING INTO MUSTWM  }WITH CY CLEAREDX; MUSTWM5Q>MAPBUF %>MAPBUF 3 BUFSET;;SET UP BUFFER POINTERS FOR SECOND PAGE!} 7;; OF VTOC BUFFER# MAPIOC;;ISSUE I/O OPERATION(S) 7*7PMAP2;;UPDATE ID FOR CONTENTS OF SECOND PAGE BUFFER4 NOMAP"}I:>X;H9RWBMAP SYSSET;;SET UP BUFFER POINTERS FOR SYSTEM I/ORQ>\ MAPIOC6f5p$zQSECSIZ9>7(>;;#}256 BYTE SECS? FMAPDDS-T?;;128, CHANGE PAGE NUMBER TO PAIR NUMBERMAPDDSN>; O>h?!(>;;128 OR 256 BY$}TE SECTORS?2FDDMAPX;;IF 128, READ 2 SECTORS TO FILL BUFFER Q>h86& SYSRW;;READ OR WRITE FIRST SECTOR QM%}APBUF$.R>;;IF DOS 2.0 DISK, ONLY ONE SECTOR EVEN.!DXITMBF;; IN SINGLE DENSITY!8 STEPBPB1LDDMAPXQ>hV8`&}6j/ SYSRW;;READ OR WRITE SECOND OR ONLY SECTORt XITMBF8~NOMAPI2QICDNOZ.PDUNIT;;RESTORE USER DRIVE NUMBER TO DUNIT'}0:;;SINCE THIS MAY HAVE BEEN ON ANOTHER DRIVE!X;/SYSSETQ>MAPBUF;;SET UP BUFFER POINTERS%>MAPBUF !BUFSET(}X;EX; ROUTINE TO STEP TO THE NEXT DIRECTORY ENTRY (UNTIL WE RUN OUT)X;BSECDS%> 'DIRDSPV? WDIRDSP V?)} WDIRDSPV?(9WDIRDSP;;(FILE NUMBER MOD 8) * 16 IS OFFSET IN SECTOR2+PDIRSEC;;FILE NUMBER/8 IS SECTOR OFFSET<X;FR*}>;;END OF DIRECTORY?P1Z6EBSECXT;;IF SO, RETURN CARRY SET (VALUES ARE BAD!)d3WDIRDSP;;FINAL SHIFT SO NUMBER IS *16 (NO+}T *32)n BSECXT:xX;X; DOS ALLOCATION ROUTINESX;X;!X; FREE A SECTOR FOR LATER USEX;1FREE RBITMP;;MAKE SUR,}E WE HAVE THE RIGHT MAP PCHGMAP9FMTFRE#MAPBUF;;BUMP LOW BYTE OF FREE SECTOR COUNTHFREE0;;IF NO CARRY#MAPBUF-}FREE0 FNDBIT5 QTMP2 FSBMP1 'TMP2RCURMP;;BEFORE FIRST HOLE?"ESBMP2;;NO, LEAVE UNCHANGED,PCURMP;;.}YES, NEW FIRST HOLE6SBMP2 RDNXTM@ %TMP2J"VMAP2MOD;;MARK MAP PAGE2 DIRTYT7^LMAPBUF8hPMAPBUF8r:|X;/} SBMP17 LMAPBUF8 PMAPBUF8:X;3X; FIND BIT ASSOCIATED WITH A SECTOR ON THE DISKX;FNDBITQCURSEC9M>;0};EXTRACT THE BIT NUMBER?;Q>.FREE1W?;;POSITION CARRY TO THE BIT TO FLIP 1 IFREE1 5;;SAVE THE BIT MASK& X1};0 QCURSEC9: ,D $O> ;;ALLOW FOR 10 BYTE HEADERN ?;;SAVE LOW BYTEX QCURSEC9b O>;;PROPOGATE CARRYl W?;;fix 6552}35 sector bugv PTMP2 C W? VTMP2 W? VTMP2 W? ? X; 7;;RESTORE THE BIT MASK : X; )X; ALLOCATE AN UNUS3}ED SECTOR TO A FILE X;!ALLOC RBITMP ! PCHGMAP!%> !Q>*! PTMP24!!ALL1RMAPBUF8;;ANY BITS LEFT?>!HSECFN1;;IF S4}OH!3R! HALL1\!X;f!;p! QMAPBUFz! SCURMP!;!S>! PTMP1!ALLCKGALGONE! QCURMP! PTMP2! RDNXTM!Q>!?!5}ALL2RMAPBUF8!1HSECFN2;;IF FREE SECTOR IN SECOND PART OF MAP!3! HALL2"%#CURMP;;TO NEXT SECTOR OF BIT MAP" "TMP6}1" IALLCK$"X;."ALGONE"CURMP8"#DFERRQ>;;DISK FULL ERROR CODEB"%!AEXIT;;IF THIS IS IT, ERROR-EXITL"X;V" SECFN1;`"$7}>;;I.E., -8*10 - 1j" ALL3W?t"2~" RMAPBUF8" DALL4"," HALL3"ALL4NMAPBUF8" PMAPBUF8" IALL7"X;" SECFN2;"8}$>;;I.E., -8*10 - 1" ALL5W?"2"RMAPBUF8# DALL6 #,# HALL5#ALL6VMAP2MOD(#NMAPBUF82#PMAPBUF8<#9}X;F# ALL7CP#T?Z# UTMP2d#T?n# UTMP2x#T?# UTMP2# PTMP1#A# OTMP1# $CURFCB# PLNKSEC9# QTMP2#O>#PLNKSEC:}9#DECCNTQMAPBUF# HNOBOR#"MAPBUF#NOBOR"MAPBUF$,$:$X;"$X; DOS MISC. SUBROUTINES,$X;6$X;@$%X; ;}SET UP STATE VARIABLES ON ENTRYJ$X;T$SETUP%ICDNOZ;;GET UNIT NO.^$SETUPW&CURFCBh$@r$2|$2$1&STKPSV;;SAVE POINTER TO<} RETURN ADDR ON STACK$'SETUPD'DUNIT;;COPY UNIT NO. TO DCB$Q>$ )RAMDKU$4FUFIXED;;RAMDISK SECTOR SIZE IS ALWAYS 128 =}BYTES$QSECSIZ8$9FINVUNIT;;IF NOT VALID UNIT, TEST FOR CURRENT DENSITY$@UFIXEDPSECDAT;;OTHERWISE, STORE CORRECT DEN>}SITY INFORMATION$V?$W?$W?$4L>};;AND UPDATE LINK POSITION IN THE DISK SECTOR$ PDLINK%X;% $CURFCB%"%BUFNO9;;GET?} THE BUFFER NUMBER&% HRSETUP0%#%FILES;;IF ONE IS NOT ALLOCATED:%3D% SFORB1N%6FNOSECB;;ALLOCATE ONE, OR ABORT THE OPERATI@}ON NOW!X%QBUFFLG8b% HSFORBl%Q>v%PBUFFLG8%C% PBUFNO9%RSETUPQDOSEND;;==SBTABL%3PFMSBPT;;STORE THE BUFFEA}R POINTER FOR THIS FILE%4QSBTABU8;; IN THE ZERO PAGE POINTER "FMSBPT"%PFMSBPT%:%X;%(INVUNIT JSTRD;;TEST FOB}R DRIVE STATE%5HUFIXED;;IF IT IS ACCESSABLE, RETURN REAL DENSITY%X;%0NOUNITQ>;;RETURN ST=160, DRIVE NOT PRESENT% C};;SKIP TO JMP INSTRUCTION&3NOSECBQ>;;RETURN ST=161, NO MORE FILE BUFFERS & !AEXIT&X; &+X; REMOVE DOS POINTER FROM BOOD}T SECTORS*&X;4&'TDDOS TSTDOS;;MUST WE UPDATE BOOT?>&HTDEXIT;;NO, RETURNH&1DELDOS%>;;YES, REMOVE DOS POINTER FROM BOOTE}R& FUPDBT\&X;f&&X; ADD DOS POINTER TO BOOT SECTORSp&X;z&SETDOS'DOSLOC&PDOSLOC& %SECDAT&UPDBTQDUNIT& RRAMF}DKU& FTDEXIT& 'SECDAT& QDEFAULT&5&%>& QFCBOTC9&GNOAND;;LONG LENGTH FIELD?&!%>;;IF NOT, USE ONLY 10 BITS&G}NOAND'ANDCD'Q>BOOTFL'%>BOOTFL' BUFSET$'%>.' 'DAUX28' D12303B' 'DAUX1L'$>V' &DEFAULT`';j' DH}KIO2t' STEPBP~' )BOOTL' HD1230'7' PDEFAULT' %ICDNOZ' 'DUNIT'QSECSIZ8' PSECDAT':'X;'STEPBPQDBUFLOI}'N>' PDBUFLO( GTSTEOD ( #DBUFHI(X;(TSTEOD%DAUX1((:2(X;<(%X; TEST FOR FILE NAME = 'DOS.SYS'F(X;P(TSTDOS%>J} Z( $DIRDSPd(TDLOOPQDIRBUF9n(NDOSSYS 8x( HTDEXIT(2(3( HTDLOOP(TDEXIT$CURFCB(?(:(X;(DOK}SSYS ADOS SYSA(X;(1X; FIND AT LEAST ONE FILE MATCHING GIVEN NAME(X;(1LFFILE GETFNM;;EXTRACT FILE NAME FROM BUFFL}ER('TMP2;;SAVE IT FOR -RENAME-)+ SFDIR;;FIND FIRST MATCHING FILE IN DIR)"Q>;;IF NONE, RETURN ERROR 170)EAEXIT;;ELSM}E, RETURN"):,)X;6)%X; RETURN ERROR IF FILE IS LOCKED@)X;J)TSTLOKQ> ;;CHECK BIT 5T) GETFLAG^) FTDEXITh) Q>;;FILE LN}OCKED ERROR = 167r) ;;SKIP 2 BYTES|)X;)X; RETURN WITH NO ERROR)X;)DONEQ>;;NORMAL COMPLETION)X;)-X; RETURN EO}RROR CODE IN ACC TO CIO (IN Y))X;)(AEXIT$STKPSV;;RESTORE STACK POINTER)B))$CURFCB;;RESTORE IOCB OFFSET TO X-REG)"PP}ICSTA9;;RETURN STATUS IN IOCB)?;;RETURN STATUS IN Y-REG)&QDATBYT;;POSSIBLY RETURN DATA HERE)")>;;SET CY FLAG APPROPRIAQ}TELY*:*X;*$X; RETURN HARDWARE ERRORS TO CIO&*X;0*$HWERRQ>;;fix VTOC updating bug:* PCURMAPD* PCHGMAPN**QDSTATS;;R}LOAD REAL DISK I/O ERROR CODEX*'HAEXIT;;AND RETURN IT TO THE CALLERb*X;l*-X; RELEASE FCB AND RETURN NO-ERROR STATUSv*X;*S}FREDON$CURFCB*7%BUFNO9;;FINISHED WITH THE SECTOR BUFFER, RETURN IT*&FDONE;;IF NONE ALLOCATED, SO WHAT!*Q>*4PBUFNT}O9;;OTHERWISE, IT'S NOT ALLOCATED ANY MORE!*PBUFFLG8* FDONE*X;*+X; TEST OR CLEAR A BIT IN THE FLAG BYTE*X;*GU}ETFLAG%DIRDSP* MDIRBUF8*:+X; +1X; SAVE FLAG BYTE AND WRITE BACK TO DIRECTORY+X; +SAVFLAG%DIRDSP*+ PDIRBUF84+ !V}WDIRBK>+X; 4D4:MDUP1.M65"X; resident portion of DUP code>D4:MDUP2.M65>D4:MDUP3.M65X; DUPEND DUP"[}LENDUPENDDUPBASEMSLENDUPENDMSBASEX;" MENUSL D ;X;v.4.53/3 mods. by David R. Eichel 11/30/89 2:19 pm%X;SAVE #D4:MDUP1.M65 MYDOS module9X; Copyright 1984, Ch&]}arles Marslett, Wordmark Systems(X;2IX; Permission is granted by the author for any use whatsoever of this<HX; code, &^}so long as this notice remains in the source code, and soFLX; long as the source to this routine, however modified or unm&_}odified,P.X; is made available for a nominal cost.ZX;dX; DEFINED VALUESnX;x CR EOFX; OPEN GE&`}TREC GETCHR PUTCHR CLOSE RENAME DELETE! LOCK# UNLOCK$ FORMATX;X; ROM AN&a}D RAM ADDRESSESX;CARTST"X;, AUDF16AUDCTL@ SKRES J SERIN TSEROUT ^ IRQENh SK&b}CTLr PBCTL|X;FASCIIؐ IFPٚEDITRV DSKIOS CIOVV SIOVYSETVBV\CIOINV&c}nX; WARMST DOSVEC  DOSINI  POKMSK BRKKEY RAMLOX;& DUNITZ!0 DCMDZ": DBUFZ&d}$D DLENZ(N DAUX1Z*X DAUX2Z+b DAUX3Z,lX;v LMARGNR RMARGNSX; FR0Ԟ VECTORԨ HDBUF&e} BUFADڼ BUFLEN FNPTR TEMP TEMP2X; INBUFFX;VSERIN  VIMIRQCDTMV3&f} CDTMF3**SHFLOK4 RUNAD>INITADHMEMTOPR MEMLO\$DVSTAT;;SYSTEM STATUS BUFFERfX;p&g}DDEVICz DUNIT DCMD DSTAT DBUFDTIMEO DLEN DAUX HATABSX; IO&h}CB@ ICDNOA ICMDB ISTATC IBUFD ILENH IAUXJX;$X; FMS ENTRY POINTS.X;8GX;Several&i} of the following equates were changed during optimizationBX; of the DOS code.LX;V FILES `(RAMDKU ;;LOC OF RA&j}M DISK DRIVE NOjDFUNIT t BSIORi~ WRCMDp STATEDKTYPEDRVDEFFMINITMDINIT&k}MAPBUF HDTAB @X;WOTDCB = $0B1A ;No longer used by DUP, moved to MDOS1.M651CONFIGR$ ;;CONFIGURE DRIVE SU&l}BROUTINE ENTRYX; X;OTHERS IN THE MDUP.M65 FILEX;X;  ! RESEND;;START OF FREE MEMORYX;(S;;patch into&m} dos here2!INIT;;DUP INIT ENTRY POINT<X;FX; PROGRAM AREAPX;Z ORIGINdX;n X; INITIALIZE MYDOS INTERFACExX;&n}INITQ>DUPENTPDOSVECQ>DUPENT PDOSVECX;Q> PFNAMEQ>  *STATE/HCKMDOS;;IF WARM START CH&o}ECK FOR DUP LOADEDX;X; COLD START CODEX;!PSTATE;;SET MODE TO WARMSTARTX; LDX #$10)X; JSR SOPEN ;RUN AU&p}TORUN.SYS FILE"X; .BYTE 6,X; .BYTE 396X; .WORD AFN@X; BMI CLOSXJX; JSR CLOSXTX; JMP (RUNAD)^IX;The &q}above was changed to the below to allow multiple AUTORUN files.hX; D1:*.ARx x = 0-9rX;|Q> 0;;Re-set AFN #PAFN&r};; to 0.MULTIRUN;;$>;;Allow multi-Q>(;; AUTORUNsPB9;; using MyDOS'sQ>4AFN;; XIO 40 cmmd.&s} PD9;; Q>5AFN;; PE9;;Q>;;Allow RUN &PI9;; INIT vectors. V;;!GCLOSX;;Br.=*.AR# not found.&t}#AFN;;QAFN;;R> 9;;Done all 10?&DMULTIRUN;;Br.=not all.0X;:X; CLOSE IOCBS 10 AND 20DX;NCLOSX&u} CLOS20XCLOS10$>;;CLOSE IOCB 10b ,;;SKIP 2 BYTESlCLOS20$> ;;CLOSE IOCB 20v!CLOS2Q>CLOSE;;CLOSE ANY IOCBSC&v}MDPICMD9 !CIOVX;DBUF10$>DEFBUFPIBUF9C PIBUF9 CKMDOS:X;8AFN AD1:*AR0A=;;"AUTORUN.SYS" &w}is now meaninglessCX; Moved AUTORUN FN so SUPERARC will not think this is >=4.3 DOSX;X; OPEN FILEX; X; CALLING S&x}EQUENCE:X; JSR SOPEN X; DB AUX*X; DB CMD4X; DW BUFFER ADDRESS>X;H SOPEN;R ;;LDA #IMM OPCODE\&y}X;f&X; DO A READ/WRITE TYPE I/O REQUESTpX;zX; CALLING SEQUENCE:X; JSR DOIOX; DB IOCBNOX; DW BUFFER &z}LENGTHX; DB CMDX; DW BUFFER ADDRESSX; DOIO,7 PRAMLO7 PRAMLO%> Q@RAMLO7 DDOIO1 &{} PIAUX9 EXTRCB$ DOIO1>. 38 Q@RAMLO7B PILEN9L 3V Q@RAMLO7` PILEN9j XTRCB3t Q@RAMLO7~ PICMD9 3 Q@&|}RAMLO7 PIBUF9 3 Q@RAMLO7 PIBUF9 C , ORAMLO ? Q> ORAMLO 5 C 5 !CIOV;;DO I/O REQUEST(&}} X;2 (X; IF NO DUP.SYS, INCREMENT DRIVE NO.< X;F RETRYOS#DUPSYSP QDUPSYSZ M>d R> n DRTYOSVx HGOTO1 R&~}RAMDKU FRTYOSV GOTO1Q> 1 PDUPSYS RTYOSV> QDKTYPE 19 FRETRYOS HNOWMS X; X; LOAD PROGRAM FUNCTION&} X; LDFILE LDMEM $> % TOVECT;;LOAD PROGRAM OR GO TO IT  ,;;skip the LDY #1 X;" *X;***************************&}**********, X;6 (X; STANDARD EXIT POINT FOR PROGRAMS@ X;J *X;*************************************T X;^ !X; RESTORE DOS/&}DUP INIT VECTORh X;r DUPENT%>| SAVERR'CBSAV *STATE KGODOS INOWMS CLOS10 SOPEN  ;;WRITE MEM.SAV F&}ILE OPEN NMSAV GNOWMS DOIO   MSLEN PUTCHR MSBASE NOWMS CLOS10 # SOPEN;;GET DUP.SYS INTO &}MEMORY&  0  ': DUPSYSD GRETRYOSN QDOSINIX PINISAVb QDOSINIl PINISAVv GODOS CLOSX !DOSOS;;THEN S&}TART IT UP X; X; X; RUN AT ADDRESS X; )TOVECT!@VECTOR:;;TO 'RUN AT' ADDRESS X; X; LOAD MEM.SAV IF NEED BE X;&} LDMEM*STATE;;LOAD MEM.SAV? INOLDMS X; $>  SOPEN   OPEN NMSAV* GNOLDMS4 X;> DOIOH   R &}MSLEN\ GETCHRf MSBASEp X;z NOLDMS!CLOS20 X; NMSAV AD1:MEM.SAVA= EC AE:A DUPSYS AD1:DUP.SYSA= O&}PT  "DUPFLAG ;;DUP RESIDENT = $80 INISAV FMINIT +CBSAV ;;ERROR CODE FROM PROG EXECUTED FNAME  !';;ALLOW&} FOR 40 CHAR DEF DIR X; (RESEND;;ALLOW FOR 3 FILE BUFFERS +DRIVERS;;ALLOW 2K FOR RESIDENT CODE MSBASE X;$}S ;X;v.4.53/3 mods. by David R. Eichel 12/23/89 6:39 pm$X;SAVE#D4:MDUP2.M65 MYDOS module9X; Copyright 1984, Cha*}rles Marslett, Wordmark Systems(X;2IX; Permission is granted by the author for any use whatsoever of this<HX; code, s*}o long as this notice remains in the source code, and soFLX; long as the source to this routine, however modified or unmo*}dified,P.X; is made available for a nominal cost.ZX;dKX;==============================================================*}========nX;x-X; START OF NONRESIDENT PORTION OF DUP.SYSX;.DATAP;;ALLOCATE BUFFER FOR BIT MAP, ETC. DELIM!*}PAR2P;;another bug fixed RP PAR3PX; DATA UNNO PTR PTRSAV IPTR IPSAV CBYTE*} SECTOR CSRC CDES" CPYTYP, SWPFLG6 RCNT@ SECSIZJ FNPTT FNPT2^!PARP;;REA*}L PARAMETER (LAST)h DUPBASE rDOSSYS AD1:DOS.SYSA=|X;2X; CLOSE (BRUTALLY) ALL IOCBS AND REOPEN SCREENX;INI*}TIO CIOINV$>" SOPEN;;OPEN SCREEN AS IOCB #0   OPEN EC&CDTMV3;;CLEAR TIMER #3&CDTMV3%>*}Q>$PCDTMF3;;SET TIMER NOT DONE FLAG SETVBVWAITIMQCDTMF3;;DONE?!HWAITIM;;NO, CONTINUE LOOPING&:0X;: X; D*}ISK UTILITY PROGRAM ENTRYDX;N DOSOS,X-b$>l&BRKKEY;;ENABLE BREAK KEYvX;Q>MDINITPDOSINIQ>MDIN*}IT PDOSINIX;Q>PLMARGN;;SET MARGINSQ>' PRMARGN QDUPFLAG LSTATEM>R> HNOSWF  PWARM*}ST NOSWFQ>@  LSTATE*!PSTATE;;ELSE, SAY IT WAS DONE4Q>> LPOKMSKH#PPOKMSK;;ALLOW BREAK INTERRUPTSR PIRQEN\ *}INITIO;;CLOSE ALL FILESfX;p QSTATEzM> FSHMEN+ ERRXIT;;MEM.SAV ERROR CAN NOW BE SHOWN- AError loading MEM.SA*}V or memory!A==X;SHMENQDFUNITL> 0 PDEFAULT$>%>DKSLPQ> ;;spacePD1STAT9 PD1STAT9P*}D1STAT9PD1STAT9 )RAMDKUHCKHCD;;IF NOT RAM DISK$Q> R. HSETUNI8X;BCKHCDQHDTAB8LFGENDCD;;IF*} NOT HARD DISKVQ> H`SETUNIPD1STAT9j HDKUNINtX;~GENDCDQDKTYPE8 FNXTDKSV?;;DOUBLE DENSITY?Q> SE*}DKSNGD;;NO, SINGLEQ> D;;YES, DOUBLEDKSNGDPD1STAT9QDRVDEF8V?Q> - DDKSSDQ> =DKSSDPD1STAT*}9 DKUNINC L> 0 PD1STAT9 NXTDKS0(020<0F1P HDKSLPZ PRINTd };;CLEAR SCREENnb AMYDOS 4.53/3- Copyrig*}ht 1988,A;;Just the name's been changed, to protect the guiltyx =ADisks A0D1STAT A1S 2S 3S 4S 5S 6S 7*}S 8S A= AD: = DADEFAULT A1:A=Q>FNAME$>FNAME PRTMSGX; PRINT =) A1-8.Dir of D*}1:-D8: *. Dir of D:A=+ AA. Disk Directory K. Save MemoryA=+ AB. Run Cartridge L. Load MemoryA=. AC. Copy Fi*}le(s) M. Run at AddressA=, AD. Delete File(s) N. Load MEM.SAVA=. AE. Rename File(s) O. Change Config.A=+ A*}F. Lock File(s) P. Set DensityA=". AG. Unlock File(s) Q. Make DirectoryA=,. AH. Write DOS Files R. Pick Director*}yA=6- AI. Initialize Disk S. Set RAMdisk #A=@/ AJ. Duplicate Disk V. Set Verify FlagA=J A A==T %CBSAV^ I*}MENUSLh% CIOER1;;IF LOAD ERROR, REPORT ITrX;|X; SELECT MENU FUNCTIONX;MENUSL$>B2&OPT;;OPT=00 IF NO *}OPTIONS &SWPFLG)&CBSAV;;FOR DIR SCANS, SKIP NO EXTNS.! CLOSX;;CLOSE IOCBs 10 AND 20$>0 CLOS2;;AND IOCB 30 *} PRINT( ASelect Item ( for menu):A=Q>@;;FORCE UPPER CASE PSHFLOK LSTATE!PSTATE;;SAY DUP.SYS IN MEMOR*}Y& CHRGET0R>: HCKITEMD !SHMENNX;XCKFDIRR> 1b DCKFDDl !FASTDIRv CKFDDR> * HBADITM !FASTDDX;*}CKITEMR> 9 DCKFDIRR> ANFUNC EBADITM S> A EITEMVBADITMQ>NFUNC ITEMVT?? QDUPJT8 PRAMLO *}QDUPJT8 PRAMLO +!PRTMEN;;GO TO MENU EXIT (WITH MESSAGE)*X;4 TCOMND > UCOMND HNSI ANo such item!A==*}R !MENUSL\X;fDUPJT DIRLST=STCARp CPYFIL=DELFILz RENFIL=LKFIL ULKFIL=WBOOT *}FMTDSK=DUPDSK SAVFIL=LDFIL BRUN=MEMSAV CONFGR=CHDISK MKDIR=SETDIR RAM*}DRV=TCOMND UCOMND=VERIFYNFUNC DUPJT  NSIX;%X; * AND 1-8. FAST DIRECTORY LISTX; *}FASTDDPPAR Q> : PPAR$ HDOFDD. X;8 FASTDIRPPARB Q> :L PPARV DOFDDQ> *` PPARj PPARt Q*}> D~ PPAR Q> 'PPAR;;fix the 174 errors in menu PCPYTYP PDELIM HDODIRL X; X; A. DIRECTORY LIST X; *}/DIRLST AFiles to list, Destination?A== Q> PCPYTYP GETFN DEFPAR DODIRLQ>PAR %>PAR DBUF*}10( $>2 &CSRC;;IOCB10 IS SOURCE< $ OPDIR;;OPEN IOCB10 AS DIRECTORYF X;P Q>DATA& Z PBUFADd Q>DATA*}& n PBUFADx X; Q>& PBUFLEN Q> PBUFLEN X; $>;;CDES=IOCB00 QDELIM GCPY1FSP [X; LDA DE*}LIM ;Somebody who knows what the hell is going on should look at this. Bob? GSGFCPY GETFN2 'IBUF PIBUF*}  SGFCPY$>  Q>GETCHR HDOCALL" X;, CPY1FSPQ>GETREC6 DOCALL&CDES@ COPYFJ %!MENUSL;;THEN RETURN TO CMD. LIN*}ET X;^ BADRN ERRXITh ANeed new file name!A==r CANTDV ERRXIT| 9 ANo drive or directories allowed in new name!A=*}= X; LKMSG ALock A= ULMSG AUnlock A= DELMSG ADelete A= X; X; F. LOCK FILES X; #LKFIL ALock *}which file?A== %>LKMSG $>LKMSG Q>LOCK 'HDOCMD2;;GET FILE NAME THEN LOCK IT X; X; G. UNLOCK FILES *}X; &ULKFIL AUnlock which file?A==& %>ULMSG0 $>ULMSG: Q>UNLOCKD X;N 'DOCMD2'SECSIZ;;do mass lock/unloc*}kX &&SECSIZ;;unless /Q is specifiedb 5l GETFNv CKDSK $OPT (> Q;;Query? FDOPRM HAFTCHK;;branch either wa*}y X; X; D. DELETE FILE(S) X; %DELFIL ADelete what file?A== %>DELMSG $>DELMSG Q>DELETE X; D*}OCMD'SECSIZ &SECSIZ 5 GETFN CKDSK* $OPT4 ((> N;;IF '/N' THEN DO IT THE EASY WAY> FAFTCHKH DOPRM PRINT*}R  AAnswer 'Y' or 'N'A==\ 7f SETSCNp X;z RDFN SCNDIR EDELX;;IF END OF DIRECTORY QSECSIZ $SECSIZ *}PRTMSG Q>PAR $>PAR PRTMSG PRINT A?A= CHRGET R> Y HNODELT $>  CIOCL;;DELETE THE FI*}LE THENNODELT!RDFNX;$ SMPLCMD5. GETFN;;GET FILE NAME8 CKDSK;;VERIFY A DISK FILEB AFTCHK7LISSCMDPICMD*}V$>` CIOCLj QICMDtR>)~ FSETFNJDELX!MENUSLSETFNJ!SETFNMJCANTDV!CANTDVJBADRN!BADRNX;*}X; E. RENAME FILE(S)X;-RENFIL AFile to rename, new name?A== GETFN CKDSK%PTR QDELIMR> ,  FCKNA*}M2R> ;;space HJBADRN( CKNAM232 Q@FNPTR7<R> :F FJCANTDVPR> >;;check for sparta typeZ FJCANTDVdR> 0n DDO*}RENx R> z DCKNAM2DORENQ>RENAME HISSCMDX;X; Q. MAKE A DIRECTORYX;'MKDIR AFull directory name?A=*}=$> &IAUXQ>";;MAKE DIR. COMMAND !SMPLCMDX;X; R. SET DIRECTORYX;1SETDIR ADirectory to be use*}d as 'D:'?A== GETFN" CKDSK,%PTR;;DRIVE OR NULL?6)>@ DCPYDNEJQ>)T !ISSCMD^X;hSETFNM$>rQPTR|*}N> FZAPNAM%>Q> : R@FNPTR7 HALLNEW;;IF NOT SUBDIRECTORY FNDEND2%FNAME9HFNDEND;;END OF OLD D*}IR?PFNAME9X; ALLNEW3 FCPYDNE R@FNPTR7 HALLNEW0;;POINT BACK AT ':')FCPY1ST;;IF START, NO ':' TO PR*}ESERVE&X;0 CPYNAM2: CPY1ST3D Q@FNPTR7NZAPNAMPFNAME9X HCPYNAMb !MENUSLlX;vCPYDNE ERRXIT AInvalid dir*}ectory!A==X;X; SINGLE FILE (DEVICE) COPYX;TOERR1!CIOER1SGCOPY$>&CSRC;;SOURCE IS IOCB10 SOPEN*} ;;INPUT OPEN;;OPEN FUNCTION PAR;;INPUT DEVICE NAM GTOERR1 !SGFCPYX; X; C. COPY FILESX;  DUPFIL*} *-CPYFIL AFile source, destination?A==4Q> ;;space>*PPAR3;;DEFINE CHAR 3 OF DEVICE NAMEHQ>R PCPYTYP\ *}GETFN;;GET SOURCE FILE NAMEfX;pQ>DUPENDz PBUFADQ>DUPEND PBUFADX; QMEMTOP;S>DUPEND P*}BUFLENQMEMTOPS>DUPENDPBUFLENX; DEFPAR QDELIM GSFNAME GETFN2Q>$SFNAMEPSWPFLG.*} TWARMST8 QFNPTRBPIBUF L QFNPTRV PIBUF `QPAR;;DISK DEVICE?jR> Dt HSGCOPY~ Q>PAR %>PAR*} DBUF10X;Q> ?%> QQQPPAR281HQQQX; CWFSD$>$ OPDIR;;OPEN IOCB10 AS DIRECTORYX; *}%> CPSCL13 Q@FNPTR7( PPAR382 HCPSCL1< CPSCL21F Q@FNPTR7PR> :Z FCPSCL3d R> >;;account for sparta typen H*}CPSCL2x CPSCL33 'FNPT2 Q@FNPTR7 FOPINPX;)$>;;SCAN -PAR- STARTING AT 1-ST BYTEMVMSKQ@FNPTR7GWCOPYB*};;1 FILESPEC COPY??R> * FMVNMLR> . DWCOPYB HDOSTORQ> ;;space1DOSTORPPAR293" MVNML2,(>6 D*}MVMSK@ SKPPRD3JMVEXTQ@FNPTR7T FWCOPYB^R> .h&FSKPPRD;;IF A PERIOD, SKIP OVER ITrR> *| FOPINPR> ;;space *}FWCOPYBR> , FWCOPYBR> FWCOPYB3SAVBLKPPAR292(>  DMVEXT EOPINPX;WCOPY CWFSDOPIN*}P SCNDIR *CBYTE& GOPINP0 DWCNEXT: !MENUSLDX;NWCOPYBQ> ;;spaceX HSAVBLKbWCNEXTQ>PAR3lPIBUF0v*} Q>PAR3 PIBUF0X;$> %FNPT2WCNBLDQPAR29 FTERMXR> ? HSTWCC QDATA9STWCCPPAR38R>*} ;;space FOVWRTC3 OVWRTC2 (> DWCNBLD Q> .* PPAR3843>WCEBLDQPAR29H FTERMXRR> ?\ HSTWCECf QDA*}TA9pSTWCECPPAR38zR> ;;space FOVWRTE3 OVWRTE2(>  DWCEBLD TERMXQ> . RPAR38 HNOTOVP1*}NOTOVPQ>$OPT(> Q HNOQUERYQ> ?NOQUERYPPAR38Q>$ PPAR38.X;8 QCPYTYPB HDOONEL Q>PARV $*}>PAR` PRTMSGj PRINTt A-->A=~ Q>PAR3$>PAR3 PRTMSGQOPTR> Q HDOONE CHRGETR> Y*} HSKPCOPDOONEQIAUXPIAUX $>  &CSRCQ>  PIAUX9 Q>PAR %>PAR( DEFBUF2 Q>OPEN*}< SCMDF GCPYERRPX;Z$>dCKFDOSQCKDTST9n RPAR39x HNOXDOS0 HCKFDOS QPAR3PDOSRNMPD*}OSSYSQ>` PPAR3NOXDOSQ>PAR3PIBUF0 Q>PAR3 PIBUF0X;$> &IAUX0$>0 &C*}DES" Q>GETCHR, COPYF;;COPY FILE6X;@SKPCOPQCPYTYPJ HTOEXITT !WCOPY^TOEXIT!MENUSLhCPYERR!CIOER1rX;|X*}; I. FORMAT A DISKX;FMT1050Q> HDOFMTX; FMTDSK ADisk to FORMAT:A=$ GETDN;;GET DRIVE NUMBER OR NAME *} DEFPARX; Q>PARPIBUF Q>PAR PIBUFX;%> Q@FNPTR7 PFMTDVN&X;0"X; MAKE SURE ABOU*}T DRIVE NUMBER:X;D PRINTN& A(Press for Enhanced Dns)A=X AType to Format Drive AbFMTDVN A0:A=lX;v*} CHRGETR> A FFMT1050N> Y HALFMTDDOFMTPIAUXQ>$OPT;;REAL FORMAT?(> N HRELFMTW?RELFM*}TPIAUXX; Q>FORMAT PICMD $> CIOV;;DO FORMAT OF DISK  IALFMTD*$WBERR!CIOER1;;IF ERROR, SAY SO!4*}ALFMTD!MENUSL>X;HX; H. WRITE DOS/DUP TO DISKRX;\DUPFNM AD1:DUP.SYSA=f,WBOOT ADrive to write DOS files to?*}A=p GETDNzQDUPSYS5Q> 1PDUPSYS PNMSAV%> Q@FNPTR7R> : HCANWB QDEFAULTCANWBP*}DOSSYSPDUPFNMX;%1;;SET UP INITIAL VALUES OF PARMS.'OPTQ> PSTATE$X;.Q>DOSSYS8%>DOSSYS*}B DBUF10L"Q>;;OPEN OUTPUT=WRITE DOS.SYSV PIAUX`1 ANYDEN;;OPEN AND WRITE DOS.SYS (ANY DENSITY)j CLOS10t7~ *}PNMSAVPDUPSYSX;"X; **** WRITE DUP.SYS HERE ****X;%>pQ>DUPBASE$>DUPBASE D2B8AQ>D*}UPFNMPIBUFQ>DUPFNMPIBUF;;Bugs fixed RPQ>DUPEND   PHDBUFQ>DUPEND  P*}HDBUF(Q>DUPLEN2 PHDBUF<Q>DUPLENF PHDBUFPQ>ZPTEMP;;CLEAR 'RUN' FLAGd!WRDUP;;WRITE DUP.SYSn*}X;xX; J. DUPLICATE A DISKX;2DUPDSK ASource, Destination (Sectors)?A== GETDN%> Q@FNPTR7M>;;GE*}T DRIVE NUMBER PCSRC PCDES QDELIM;;IF SINGLE DRIVE DUP.R> (FSETSSZ;;GO SET SECTOR SIZE( GETDN2;;ELSE, GET *}SECOND DRIVE NAME%> Q@FNPTR7M> PCDES"RCSRC;;SAME DRIVE?,#HSETSSZ;;YES, SINGLE DRIVE DUP.6$>@ &SWPF*}LGJ SETSSZ>T %CSRC^ QSWPFLGhL>@;;SET DUP-DISK FLAGr PSWPFLG| GDODKDP PRINT( AInsert both disks, type *}A= CHRGETX;DODKDP CWFSD QCSRC;;POINT TO SOURCE DRIVE0 GETDEN;;IDENTIFY DENSITY OF SOURCE DISKETTE%C*}DES;;ELSE, TWO DRIVE DUP. $CSRCQDKTYPE9RDKTYPE8 FSAME 'UNNO SETDEN %CDES $CSRC& QDKTYPE*}90 RDKTYPE8: FSAMED ERRXITN # ADrives not compatible!A==X SAMETWARMSTb V?l PSECSIZv W? )PSECSIZ;;S*}ET SECTOR SIZE (128 OR 256) &DUNIT;;READ SOURCE VTOC X; QDELIM 5 Q> > INIBMPPDATA9 PDATA9 0 *} HINIBMP 7;;BOOT COPY? R> (!'FBLDVTOC;;YES, BUILD IMAGINARY VTOC !R>!FRDVTOC;;NO, DOS COPY !OOPS ERRXIT;;ELSE*}, ERROR*! AInvalid options!A==4!BLDVTOC GETNUM>!)> -H! HOOPSR! PDATA\! &DATAf! GETNUMp!)> )z! HOOPS! *}PDATA! &DATA!%>!'PTR! 'DATA! 'DATA!Q>DATA ! PBUFAD!Q>DATA ! PBUFAD!Q>*}!D26BB$DATA! (DATA" HD26CB" $DATA" (DATA$" ED26D2." D26CB;8"U?B" NXTSCTL" HD26BBV"X;`"D26D*}2$DATAj" (DATAt" DD26EA~" HD26E4" $DATA" (DATA" DD26EA" D26E4T?" NXTSCT" HD26D2"X;" D26EA;"*}U?" ED26EA" P@BUFAD7"X;# RDVTOC; # QMEMTOP# SSECSIZ# PBUFLEN(#QMEMTOP2#SSECSIZ<#PBUFLENF#X;P# Q*}BUFLENZ#R>DUPENDd#QBUFLENn#S>DUPENDx# EENUF# ERRXIT# ANot enough memory!A==#X;#NXTSCTED272E*}# P@BUFAD7#Q># #BUFAD# HD272E# #BUFAD#D272E#DATA# HD2736# #DATA# D2736:$X;$ ENUFQPTR$&F*}SKRDVT;;IF POS, SKIP READING VTOC"$ Q>h,$ $>h6$ PDAUX@$ &DAUXJ$ Q>DATAT$$>DATA^$ PDBUFh$ &DBUF*}r$ RSEC1|$ INOERFD$ !CIOER1$ NOERFD,$ QDATA$-O> ;;ADD IN THE BOOT, MAP AND DIR SECTORS$ PDATA$5DCK2BIT;;*}THEN TAKE CARE OF SECOND BIT MAP IF NEC.$##DATA;;ELSE, BUMP UPPER BYTE$CK2BITQDATA$R>$2DSKRDVT;;IF SINGLE SECT*}OR, SKIP READING SECOND$ #DATA$,$ QDBUF% ODLEN% PDBUF% QDBUF&% ODLEN0% PDBUF:% "DAUXD% RSEC1N%X*};X%SKRDVTQ>b% PDAUXl%Q>v% PDAUX% QDATA % PCBYTE%Q>% PIPTR%Q>DATA %PVECTOR%Q>DATA*} % PVECTOR%X;%DORDQVECTOR% PPTRSAV%QVECTOR%PPTR& QIPTR & PIPSAV& QCBYTE & PCBSAV*& QDAUX4& P*}SECTOR>& QDAUXH&PSECTORR&Q>\&$PCPYTYP;;SET OPERATION TO 'READ'f&LRSQ>DUPENDp& PDBUFz&Q>DUPEND& *}PDBUF&LRS1TCBYTE& "IPTR& HCBIT& #VECTOR& HPAGE1&#VECTOR& PAGE1%>& Q@VECTOR7& PCBYTE&$>& &IPT+}R&CBIT*CBYTE' GASPT' QCPYTYP'T?;;CY=0, READ; CY=1, WRITE$' QCSRC.'DRSECIN;;ACC=DRIVE #8' QCDESB'!RSECIN SECTI+}O;;READ OR WRITEL'IOD,V' QDBUF`' OSECSIZj' PDBUFt' QDBUF~'OSECSIZ' PDBUF'ASPTQDAUX' RDATA' QDAU+}X' SDATA' DASPN'X;'QCPYTYP;;END OF DRIVE'ISTDD2;;IF READ, DO WRITE'!!MENUSL;;IF WRITE, THEN DONE!'X;'+}ASPN#DAUX( HASPX ( #DAUX(*ASPXQBUFLEN;;ELSE, END OF THE BUFFER?( RDBUF((QBUFLEN2( SDBUF<(ELRS1;;NO, G+}ET NEXT SECTORF(X;P( QCPYTYPZ("ISTDD2;;IF WRITE, DO NEXT READd( CWFSDn( !DORDx(X;(STDD2*SWPFLG( ICKFORM( PRIN+}T(3IDD AInsert DESTINATION disk, press A=( CHRGET(CKFORMQ> N(ROPT( FNOFORM(POPT($> ;;IF FORMAT RE+}Q., DO IT(Q>DOSSYS(%>DOSSYS( DEFBUF) Q>FORMAT) PICMD ) QCDES")#L> 0;;CONVERT DRIVE NO. TO ASCII,)PD+}OSSYS6) CIOCL@)&NOFORM"CPYTYP;;THEN, MAKE A WRITEJ) QPTRSAVT) PVECTOR^)QPTRh)PVECTORr) QSECTOR|) PDAUX)Q+}SECTOR) PDAUX) QIPSAV) PIPTR) QCBSAV) PCBYTE)!LRS)X;)X; P. CHANGE DISK FORMAT)X;)$CHDISK ADrive,+ } new density:A=) GETDN;;GET DRIVE NO.) QDELIM*R>;;DRIVE NUMBER ONLY?*"HCHDSK2;;IF SO, CHANGE DEFAULT*BADPCMD + }ERRXIT&* ADrive unchanged.A==0*CHDSK2%PTR:* Q@FNPTR7D*>N*%>X* Q@FNPTR7b*R> 9l* EBADPCMDv* S> 1* DBADPC+ }MD*?*3* 'UNNO*Q>*(> S* FTOSGL*(> D* HBADPCMD*T?*TOSGLPDKTYPE8* DOFSIN*"!SHMEN;;THEN SHOW CHAN+ }GED MENU+X; +(X; O. CONFIGURE SYSTEM OR DISK DRIVE+X; + CHKBANKS=*+%>;;This is BOB code...4+';;uncommented as>++ }';;per usual...H+QR+5\+$>f+ ?L1'p+Q@z+ PMAPBUF8+&@+A+PMAPBUF8+3+H?L1+0+&+&++}&@+&+&+$>+ ?L2',Q@,R>, H?NOT$,2.,&@8,AB,?NOTPMAPBUF8L,3V,H?L2`, &RDKLMTj,X;t,+}$>~,?L8A,%>,?L6RMAPBUF8,F?FO,1,)>,H?L6,4;;was a DEY, ?L9', QMAPBUF8,P@,1,)>-+}H?L9 -7-P-Q>(-P2-Q<-PF-.P-:Z-X;d-?FOCn-PMAPAGE9x-2-(>A-D?L8-%>-H?L9-X;-X;+}-GETRDK PRINT- ARAM disk present?A=- CHRGET-%>-R> N- HRAMDSU- !NOFAST.RAMDSU PRINT.' Axlon or +}E type RAMdisk?A=. CHRGET". %>,. $>6.R> A@. HSAVADRJ. %>T. $>^.SAVADR'RDAD1h. 'RDAD2r.+} 'RDAD3|. &RDAD1. &RDAD2. &RDAD3.$>;;Correct AXLON.&NMLMAP;; type RAMdisk.$>;; error in.&+}NMLMAP;; v.4.50..R> A. FOKP0.$>|;;Reset mask for. &NMLMAP;; XL/XE type RD. CHKBANKS. QRDKLMT. HOKP1/+} PRINT/' ANo extra memory available!A==/%>&/ !NOFAST0/OKP0!RAMDSU2:/X;D/3OKP1$>;;Was #0, but now is an A+}ND not an ORAN/ &NMLMAPX/$>;;Still need a 0 'thob/ &FR0l/T?v/T?/ UFR0/T?/ UFR0/T?/PFR0/ UFR0+}/ IFP/ FASCII/ PRINT/! AUse default config for A=/%>/OKP2Q@INBUFF7/ GOKP303 0 HOKP20 OKP3M> 0 P+}@INBUFF7*0340Q>>0 P@INBUFF7H0 QINBUFFR0$INBUFF\0 PRTMSGf0 PRINTp0 AK?A=z0 CHRGET0R> N0 FRAMDSU20 !+}DVNOQ0X;0RAMDSU2 PRINT0 ASize(K)?A=0 GETLIN0 GETNUM0VVECTOR0W?0VVECTOR0W?0VVECTOR1W+}?1VVECTOR1W?$1 HSAVRDS.1Q>81SAVRDSPRDKLMTB1X;L1X;V1GETSEQN PRINT`1 APage sequence?A=j1 GETLINt1 G+}ETNO2~1)>CR1 HFSNUM1 FRSEQ1DVNOQ PRINT1 ARAM disk drive no?A=1GETRDRV CHRGET1%> ;;ASSUME 91R> 01*DN+}OFAST;;IF DIGIT, CHANGE RAMDISK CODE1R> 91 ENOFAST1M>1?2(NOFAST'RAMDKU;;SET RAMDISK UNIT NO. 2:2X;2 RSEQ?(2+} $PGMAP822 &NMLMAP<2)>F2 ECPAXSQP2 QSQMAP8Z2$>d2 CPY0U?n2U?x252U?2U?2U?2M> 2?2CPY1QSQTAB82 PMAP+}AGE922232A2M>2 HCPY1273(>3 HCPY03CPSEQQSQTAB9"3 PMAPAGE9,3263(>@@3 HCPSEQJ3 FDVNOQT3X;^3CPAX+}SQ$>@h3AXSQLA;;Set up the pager3PMAPAGE9;; map for|30;; AXLON type3HAXSQL;; RAMdisks.3 FDVNOQ3X;3 FS+ }NUM$>353A3FSNCLPDATA9323 HFSNCL373FSLP1&UNNO3)>CR3 FTONML4PDATA@94>4QDATA9&4 H+!}BADSEQ04"DATA9:4%PTRD4 Q@FNPTR7N4R>CRX4 HFSLP4b4 GETLINl4FSLP4 GETNO2v4 $UNNO424(>@4 HFSLP14TONM+"}L(RDKLMT4 HWRONG4 PNMLMAP4 UPDLP104QDATA@94 PMAPAGE94A4 HUPDLP14 !DVNOQ4BADSEQ PRINT5( ADuplica+#}ted sequence number!A== 5 !GETSEQN5X; 5WRONG PRINT*5% AWrong number of entries!A==45 !GETSEQN>5X;H53PGMAP +$}=====;;Was 0,0,0,$FF,$FF,$FFR5SQMAP ==K===\5X;f5SQTAB ===p5 ===z5 ===5+%} ===5X;5 ===5 ===ͬ5 ===5 ===5X;5 ===5 ===5 ==+&}=5 ===5X;5 ===6 ===6 ===6 ===$6X;.6CONSYS PRINT86 AVerify WRITEs?+'}A=B6 DOVRFYL6 PRINTV6! ANumber of File Buffers?A=`6 GETLINj6 GETNUMt6>~6 FSKPFCT6R>6 ESKPFCT6&PFILES;;+(}SET NUMBER OF FILES (0-16)6SKPFCT GETRDK6 MDINIT;;REINITIALIZE DOS36 !DOSOS6X;6ZAPDRVQ>6 ,;;SKIP 2 BYTES6+)} SET52Q>R6 %UNNO6PDRVDEF87 CLRHDS 7CONXIT!MENUSL7X;7(CONFGR ADrive number or :A=(7 CHRGET;;GET+*} DRIVE NUMBER27.R>;;IF RETURN, GO TO SYSTEM CONFIGURATION<7 HCONDRIVF7 !CONSYSP7CONDRIVR> 9Z7 DSAVDVNd7TOBADP!BADPC++}MDn7SAVDVNS> 1x7 DTOBADP7?737 'UNNO7%Q>;;THEN ZERO CONFIGURATION BYTE7PDRVDEF87X;7 PRINT7 ARemov+,}e drive?A=7 CHRGET7R> Y7 FZAPDRV7 PRINT7 AIs drive configurable?A=8 CHRGET8#R> Y;;IF NO, SET TO $52 AND +-}EXIT8 HSET52"8 PRINT,8 AHigh capacity drive?A=68 CHRGET@8R> YJ8 FGETHCDT8 PRINT^8 AIs drive double sided?A=+.}h8 CHRGETr8R> Y|8 HSETSS8Q>8 ORDRV8SETSS PRINT8 ATracks/side?A=8 GETLIN8 GETNUM8R>#8 FSET358+/}?8Q>08)>M8 FSETTKS8Q> 9)>P9 FSETTKS9Q>&9)>(09 HSETSS:9SETTKS ORDRVD9SET35 PRINTN9 AStep rate?A+0}=X9 CHRGETb9R> 4l9 ESET35v9 S> 09 DSET359T?9 ORDRV9 CLRHDS9 !MENUSL9X;9GETHCD PRINT9" ADrive siz+1}e (in sectors)?A=9 GETLIN9 GETNUM9(>9FGETHCD;;INVALID SIZE95: %UNNO :Q>:PDRVDEF8 :Q>*:PDKTYP+2}E84:7>: SETHDSH: !MENUSLR:X;\:#X; S. Set RAMdisk Drive Numberf:X;p:#RAMDRV ARAM disk drive no?A=z: GETRDRV:+3} !MENUSL:X;:$X; V. Set Verify Flag ON or OFF:X;:VERIFY AVerify WRITEs?A=: DOVRFY: !MENUSL:X;:DOVRFY +4}CHRGET:$>W;;ASSUME YES!:R> N: HDOVFY:$>P;/DOVFY&WRCMD;;SAVE THE WRITE COMMAND IN DOS;:;X;$;ORDRV%UNNO.;L+5}DRVDEF88;PDRVDEF8B;:L;X;V;CLRHDS$>`;Aj;SETHDS%UNNOt;PHDTAB8~;A;PHDTAB8; !DOFSIN(s3 ;X;v.4.53/3 mods. by David R. Eichel 12/23/89 6:38 pm$X;SAVE#D4:MDUP3.M65 MYDOS moduleX;(X; K. SAVE FILE C/7}OMMAND2X;<8SAVFIL ASAVE:filename,start,end(,init(,run))A==F GETFNP 'IBUFZPIBUFdQOPTn5x GETN/8}O2(>DUPEND%>p EDSLMFG4%>`;;FORCE MEM.SAV TO MEMORY BEFORE SAVING IMAGEDSLMFG D2B8A GETNO2 PHDBU/9}F &HDBUF; SHDBUF PHDBUFA SHDBUF IADDOK ERRXIT% AInvalid START-END range!A=="AD/:}DOKPHDBUF, #HDBUF6 HINCOK@ #HDBUFJ INCOKQ>T)>CR^ FNINTADh GETNO2r PINITAD|&INITADLINI/;}TAD FNINTADQ>;;SET 'GOT INIT' FLAGNINTADPTEMP)>CR FNRUNAD GETNO2 PRUNAD &RUNAD LRUNAD/<} FNRUNAD #TEMP#TEMP;;SET 'GOT RUN' FLAG NRUNAD7 WRDUP%>'OPT&10 'VECTOR:'VECTORDX;NX; OP/=}EN THE PROGRAM FILEXX;b%>lR> Av HOPTOK1"OPT3OPTOK1'IAUX$>+ ANYDEN;;OPEN FILE 'OUTPUT/ANY DEN/>}SITY' GKIOERRQOPTFFULHDR;;IF NO 'APPEND' DOIO;;WRITE SHORT HEADER   PUTCHR VECTOR GKIO/?}ERR KEXITQHDBUF PILEN  QHDBUF*PILEN4 QHDBUF> PIBUFH QHDBUFRPIBUF\ *STATEf /@}GKMSAVp !WDR1zKMSAV!WDRX;FULHDR WR6BYT IKEXITKIOERR!CIOER1X;D2B8APHDBUF &HDBUF 'STATE/A}:X;#X; N. LOAD PROGRAM INTO MEM.SAVX;0MEMSAV ALoad MEM.SAV from what file?A== QSTATEL>;;TURN ON M/B}EM.SAV FLAG GLOADIT$TOMEN!MENUSL.X;8!X; L. LOAD USER FILE FUNCTIONBX;LBDLDFL%>VBLOWUP!CIOER1`X;j'LD/C}FIL ALoad from what file?A==t QSTATE~M>;;TURN OFF MEM.SAV FLAGLOADITPSTATE GETFN 'IBUFPIBUF/D}$DATA;;JUST A CR? FTOMENQ> PIAUX$> ANYDEN DOIO    GETCHR DATA GBLOWUP/E}( QDATA2 MDATA<R>F HBDLDFLP QDATAZ FTOMENdQOPTnN> Nx FGOTNQ> PWARMSTQ> GOTNN> /F}PIAUXQ>' PICMD Q>CIOV$>CIOV HBRUN1X;X; B. RUN CARTRIDGEX; STCAR QN>"/G}P,R6'HNORAM;;IF ADDRESS SPACE IS NOT RAM@N>JP;;IF RAM, NO CARTRIDGETNOCART ERRXIT^ ANO CARTRIDGE!/H}A==hX;r NORAM$|#HNOCART;;IF NOT ATARI CARTRIDGE QCARTST$CARTSTBRUN1PVECTOR&VECTOR QINIS/I}AV PDOSINIQINISAVPDOSINI QSTATEM> PSTATE !LDFILEX;X; M. RUN AT ADDRESSX;%BRUN AR/J}un from what address?A=& GETLIN0 Q@FNPTR7:R>;;NO ADDRESS?DFBRUN2;;IF SO, ABORTN GETNO2X)>b HBRUN2l%>/K}v 'WARMST FBRUN1BRUN2 ERRXIT, AAddress must be 1-4 hex digits!A==X;*X; PUT A SINGLE CHARACTER ON THE /L}SCREENX;CHRPUT$>PUTCHR &ICMD$> &ILEN &ILEN !CIOVX;X; PUT MESSAGE TO THE SCREEN X;PRTM/M}SGPRAMLO  &RAMLO*PRTNXT$>4 Q@RAMLO6> FPRTXITH CHRPUTRPRTENT#RAMLO\ HPRTNXTf #RAMLOp HPRTNXTz /N}PRTXIT:X;X; PRINT AN IN-LINE STRINGX; PRINT7 PRAMLO7 PRAMLOPRTMEN PRTENT QRAMLO5 QR/O}AMLO5: X; #X; READ A BYTE FROM THE KEYBOARD X;$ !CHRGET XE424;;FETCH THE BYTE. )>8 +GKILLRD;;IF BREAK OR EOF/P}, ABORT COMMANDB R> z;;> LOWER CASE Z?L ENCHGCSV R> a;;< LOWER CASE A?` DNCHGCSj S> ;;CONVERT TO UPPER CASEt NCH/Q}GCS5;;SAVE IT~ R> FCHRXIT;;IF EOL, ECHO IT  CHRPUT;;ELSE, ECHO IT Q>;;FOLLOWED BY EOL CHRXIT CHRPUT 7;;RES/R}TORE FOR PROGRAM :;;THEN EXIT )KILLRD CHRPUT;;MOVE TO NEXT LINE AND +!MENUSL;;EXIT WITHOUT RETURN TO COMMAND X; *X/S}E424 CLOSE7;;get a chr from keyboard & SOPEN;;Open #7 for keyboard input =OPEN KDEV  DOIO;;get a character /T} p===== 5;;save it for a sec( C;;save error stat2 5< CLOSE7F 7;;get error stats againP ?Z 7;;get charact/U}er backd :;;that's all, folks!n KDEV AK:A=;;handler addr.x X; CLOSE7 DOIO;;close IOCB #7  p=== == :/V} X; %X; RAW SECTOR READ/WRITE FUNCTIONS X; RSEC1QCSRC RSEC2, X; SECTIOPDUNIT Q> PRCNT 6 CLD1$SE/W}CSIZ 2 8" 6, BSIOR6 IDRTS@ R>J FTOERR2T "RCNT^ ICLD1h TOERR28r !CIOER1| X; DRTS8 : X; 'X; /X}CHECK FOR 2-COLUMN DIRECTORY LIST X; CLEARIT$CSRC QICMD9 R>GETCHR FCLERXIT QDATA& R> 0 EEOFEXIT/Y} %ILEN9 )> DSHFNL "ILEN9& %>0 SFTSIZQDATA8: PDATA8D 3N HSFTSIZX SHFNLQCOLMN;;Alternate/Z} 2b N>;; column listl PCOLMN;; between col.v PU;; #2 & #21 QTOGGL N> PTOGGL R>;;Only bother if /[}FSHFNL.3;; were on the QDATA;;1st column. R>;;3-char sec cnt? HSHFNL.2;;Br.=4 char. Q> ;;Clear ext/\}ra CR PDATA;; w/a space. SHFNL.2;; QTOGGL;;Re-set A reg. SHFNL.3;; PDATA CLERXIT: X; /]} EOFEXIT* Q>4 RTOGGL> FCLERXITH "IBUF9R #ILEN9\ PDATA'f :p X;z TOGGL  COLMN ;;Scrn column #2/^}1 X; 4X; COPY ONE FILE (AS MANY MEMORY LOADS AS NEEDED) X; COPYFL$CSRC QILEN9 LILEN9 FNOOUTP QSWPFLG/_} IWRFILE Q>IDD $>IDD PRTMSG CHRGET $CDES RESET$WRFILE$CDES. HDOWRFI8 CLEARITB$>L/`}DOWRFIQIOCB9;;OPEN?V"IPUTOUT;;YES, WRITE NEXT BLOCK`X;j$OPTtQ>~(> A;;APPEND? HDOPO1Q> DOPO1$CDES/a} PIAUX9! ANYDEN;;OPEN THE OUTPUT FILE GTOCIORX;PUTOUT$CDES %CSRC QILEN8 PILEN9 QILEN8 PILEN/b}9  QIBUF8 PIBUF9 QIBUF8( PIBUF92 Q>PUTCHR< PICMD9F$ CIOCL;;WRITE NEXT BLOCK OF DATAPNOOUTP$CSRCZ/c}QISTAT9;;EOF?dR>n FCPYXITx QSWPFLG IRECOPY Q>ISD $>ISD PRTMSG CHRGET $CSRC RESET !/d}RECOPYX;COPYF$CSRC PICMD9Q>;;Init TOGGL &PTOGGL;; COLMN for useQ>;; in 2 columnPCOLMN;; /e}dir. list.RECOPY$CSRC"Q>,PDATA6 QBUFAD@ %BUFADJ DEFBUFT QBUFLEN^ PILEN9hQBUFLENr PIL/f}EN9| CIOV;;READ DIRECTORY DATA ITOCPFL)>;;END OF FILE?HTOCIOR;;IF ERROR, ABORTTOCPFL!COPYFLTOCIOR!/g}CIOER1X;CPYXIT$CDES FNOTCL CLOS2'QDOSRNM;;NEED TO RENAME DOS.SYS? FNOTCL7 SOPEN;;IF COPYING DOS.S/h}YS (REALLY 'DIAMOND'OS.SYS)  DELETE$ DOSRNM;;DELETE EXISTING DOS.SYS SOPEN& 0 OPEN: DOSSYS;;MAKE NE/i}W ONED SOPEN;;and close DOS.SYSN = ==;;writingXQ>;;CLEAR RENAME FLAGbPDOSRNMlNOTCL$CSRCv !CLOS2/j}X;X;1X; SCAN DIRECTORY AND BUILD THE NEXT FILE NAME#X; EXIT WITH NOT-EQUAL IF AT ENDX;SCNDIRQ>DATA%>DA/k}TA DBUF10 Q>GETREC PICMDQ>  PILENQ>PILEN "PCBYTE;;ASSUME NOT A DIRECTORY CIOC/l}L;;READ A FILE NAME  QDATA*R> :4 ENOTDIR>R> 0H ESCNDXRNOTDIRFGOTSPC\ QDATA f RCBSAVp HNOTSYSzGOTS/m}PC"CBYTENOTSYS$FNPT%>X;MDN1QDATA8R> ;;space FMDN2 PPAR923)>  DMDN1X; MDN2Q> ./n} PPAR92%> $MDN3QDATA8.R> ;;space8 FMDN4B PPAR9L3V2`)> j DMDN3t MDN4Q> .~ RPAR9 HMDN5/o}0!MDN5Q>;;TERMINATE FILE NAME PPAR9, SCNDX:X;GETLINQ>DATA  PFNPTR PIBUFQ>DATA /p} PFNPTR PIBUF  Q>GETREC PICMD$>( &ILEN20< &ILENF%>P'PTRZX;dCIOCL CIOVnCx GC/q}IOER1:CIOER1'FR0Q> PFR0 IFP FASCII%> Q@INBUFF7 PCIERC3 Q@INBUFF7 PCIERC3/r} Q@INBUFF7M> PCIERC" ERRXIT, AError -- A6CIERC A000A==@X;JHEXDEF%DATAT)>^ HGETNO2h/s}:rX;| GETNUM, $;;SKIP SINGLE BYTEX; GETNO2; WTEMP2 NXTFLD 'VECTOR'VECTORGETNDQ@FNPTR7/t}3R> F;;IS IT A DIGIT EGETNDES> 0;;NOTE THAT CY=0 DGETND1 R> ;;0-9? *TEMP2 IGOT10&!DGOT1;;YES, S/u}HIFT INTO NUMBER0 R>;;A-F?:EGOT16;;YES, HANDLE ITD GETND1;N O> 0XGETNDE'PTRb?l QVECTORv$VECTOR:/v}X;GOT10EGETND15 TVECTORUVECTOR QVECTOR$VECTOR TVECTORUVECTOR TVECTORUVECTOR/w}, OVECTOR  PVECTOR7 6*,4 OVECTOR> PVECTORHAROVECTOR\8fO>pPVECTORz !GETNDX; GOT/x}16S>GOT1TVECTORUVECTOR TVECTORUVECTOR TVECTORUVECTOR TVECTORUVECTOR LVECTOR /y}PVECTOR !GETNDX;0X; GETFN -- READ A LINE, GET FILENAME FROM ITX;$ GETFNQ>.PDOSRNM8 GETLINB FWCTSTL/z}LX;V>X; GETFN2 -- EXTRACT A FILENAME FROM A LINE ALREADY READ IN`-X; X IS THE OFFSET IN THE BUFFERjX;tGETF/{}N2 NXTFLD~WCTSTLQ@FNPTR73R> ?FSETWC;;IF ? OR * FOUND,R> *'HCKEOFN;;SET FLAG, FIND FIRST MATCH SETWCQ>/|} PCPYTYP FWCTSTLX;0CKEOFNR>;;IF EOL, CONTINUE WIT SINGLE FILE FFNSETR> . FWCTSTL R> / DFNSET /}}HWCTSTL(SLSHLPQ@FNPTR72R> S< HNCPSYSF PCBSAVP FSAVEDZNCPSYSR> Xd HNOTSWPnQ>x PSWPFLG GSAVED!NOT/~}SWPPOPT;;SAVE OPTION CODE SAVED1Q> P@FNPTR733 Q@FNPTR73R> / FSLSHLPR> . DFNSETR> F/}FNSET1"X;,+FNSET'PTR;;SAVE POINTER TO SECOND ARG.61@ Q@FNPTR7J PDELIMTQ>^ P@FNPTR7h?r Q@FNPTR7|R> /}0 DDEFDRVR> : FDEFDRV3 ELKFCOL>Q> : R@FNPTR7 FDBEFOR1 P@FNPTR7A HDGTCODX;&LKFCOL/}Q@FNPTR7;;SCAN FOR DRIVE ID FDEFDRV&R> :0FDEVINC;;DEVICE INCLUDED:3D Q@FNPTR7NR> :X FDEVINCbX;lDEFDRVQ>/} :vDGTCOD DECFNPDBEFORQ> D DECFNPDEVINC%FNPTR QFNPTR:X; NXTFLD,QPTR;;MOVE INDEX TO A O/}FNPTR PFNPTRQ>? OFNPTR PFNPTR :X; DECFNP%FNPTR* HDECFP14 "FNPTR>DECFP1"FNPTRH#P/}TRR%>\ P@FNPTR7f GETDN1:pX;z2X; REQUIRE A DISK DRIVE (NO FILE SPECIFICATION)X;&GETDN2 GETFN2;;GET NEXT FILE/} NAME&!GETDNE;;THEN CHECK FOR DRIVE ONLYGETDN GETFNGETDNE'IBUFPIBUF%> GETDNL3> Q@FNPT/}R7 HGETDNL (> :;;ANY FILE NAME INCLUDED?FGETDN1;;NO, THEN RETURN ERRXIT# AFile name not allowed!A==X;$/}%X; UPDATE DENSITY OF DISK IN DRIVE.X;8GETDENR> :B HGTDEN2L QDFUNITV GTDEN2M>;;MAKE UNIT BINARY`$>j &DAUX/}t2~ &DAUX$>DATA  &DBUF$>DATA  &DBUF RSEC2 GGETDN3 !RDCONFX;  Q@FNPTR7R> D FGE/}TDN3( ERRXIT2 ANot a disk file!A==<X;FX; WAIT FOR SOURCE DISKPX;ZCWFSDQSWPFLGd GWFSDn GETDN3:;;IF NO /}WAIT REQUIREDxWFSD PRINT.ISD AInsert SOURCE disk, press A= CHRGET *SWPFLGKGETDN3;;IF IN DUP-DISK/} $CSRCX;RESET%IOCB9 'UNNO QIAUX9 FNOCHGR> ENOCHGSETDENPDKTYPE8$>SAVMAPQMAPB/}UF9 PSAXMAP9"0, ISAVMAP6 DOFSIN@$>JRSTMAPQSAXMAP9T PMAPBUF9^0h IRSTMAPrX;| NOCHG:X;"SAXMAP /}======= =======X;+X; RECONFIGURE DENSITY OR CONFIGURATIONX; DOFSINX;DOFSIN/} LDX #9X;DOFLOP LDA WOTDCB,XX; STA DUNIT+1,X X; DEXX; BPL DOFLOP2X;The above was moved to SETDRV (in /}MDOS1.M65) $>1 &DUNIT $UNNO& '&DUNIT;;TELL SIO DRIVE TO CONFIGURE0 (%DKTYPE9;;GET DENSITY/SECTOR SIZE: (QDR/}VDEF9;;GET DRIVE SPECIFICATIOND !CONFIGR;;GO CONFIGURE DRIVEN X;X FX; SET UP PAR AND IOCB10 FOR A DIRECTORY SCAN (MULTI/}-FILE ACTIVITY)b X;l SETSCNPICMD v Q>PAR $>PAR PIBUF &IBUF SETPTR !$>;;OPEN IOCB10 AS/} DIRECTORY X; %OPDIRQ>;;OPEN IOCB AS DIRECTORY PIAUX9 X; .X; OPEN A FILE INDEPENDENT OF DRIVE DENSITY X; ANY/}DENQ> PIAUX9! PIAUX9 ! Q>OPEN! SCMD ! ISAVDEN*! !CIOER14!X;>!SAVDEN%DUNITH!QDKTYPE8R! PIAUX9\/}!:f!X;p!'X; SET UP 'PAR' FOR A WILD CARD COPYz!X;!DEFPAR SETPTR! Q@FNPTR7! HDEFPX! PCPYTYP! PPAR8!Q> *! /}PPAR8! PPAR8!Q>;;termination!!!! PPAR8! DEFPX:!X;!SETPTR%>" SETLP13" Q@FNPTR7" PPAR8$" HSETLP1/}." SETLP218" QPAR8B"R> :L" FSETLP3V" R> >;;account for sparta type`" HSETLP2j" SETLP33t" 'FNPT~":"X;"%DOSRNM ADA/}==A:A=`=AOS.SYS,A"CKDTST ADOS.SYSA="X;"'X; REPORT ERROR, THEN RETURN TO MENU"X;" ERRXIT7" PRAMLO"7" P/}RAMLO"7 PRTENT;;WRITE ERROR MESSAGE FOLLOWING 'JSR ERRXIT'" !MENUSL;;THEN RETURN TO MENU#X; #+X; Subroutines moved f/}rom resident code:#X;#.X; SAVE MEMORY SUBROUTINE: WRITE FILE BODY,(#X; INIT AND RUN VECTORS2#X;<#&WDR LDMEM;;LOAD MEM./}SAV IF NEEDEDF#%WDR1$>;;WRITE TEXT TO DISK FILEP# CIOVZ#IWRERNO;;don't use BMI!d#WRERRO2!SAVERRn#WRERNO$>INITAD/}x# WRVEC#$>RUNAD# WRVEC# *STATE# KGODOS1# !NOWMS#GODOS1!GODOS#X;#*WRVECVTEMP;;WRITE THIS 6-BYTE V/}ECTOR?#DRTS2;;IF NOT, JUST RETURN# &VECTOR#QINITAD9#PVECTOR#2$QINITAD9$PVECTOR$Q>INITAD/}"$PVECTOR,$PVECTOR6$!&VECTOR;;(X,A)=MIDDLE WORD@$WR6BYT DOIOJ$ ==T$ PUTCHR^$ VECTORh$ IRTS2r$ /}!WRERRO2|$ RTS2:$X;$+ =ADavid R. Eichel rel.ver.1/1/90A=,B05ڢ 5 ~2 `kةE  42B 4  0444 2kF$3}k0 42 G4 224L10 B V 38<4546CT4UՍd4eL0ʍT4Ud4e Q3+3}t4u{zr0 V0 2 Q3L1 30L3D  8n Lu180݂݀.݃`݄݄݆݇3}8~٩֩׭6CשD.ץ8 42 F45 `l ȩ1ȩ:ȱM@DиUвȩPЫ63}CНȩ.ЖȩSЏم٠8$PpE Ȣ@ML1 BLV8hhՠԐJ ȱԝHȱԝIȱԝBȱԝDȱԝEeԨ3}eHH Vhh`@I@ȍI@ӈ@@-44I@@ȍό@Iψ@@`t5urxy3}0 V80a50Z50 4 5 .4 50 4 444T4Ud4e`JB V0s 3}JKB V0]d4e4B