DOS diskette filesystem logical structure program
Otto J. Makela
otto at tukki.jyu.fi
Fri Nov 23 00:33:08 AEST 1990
Here is some C code for reading and writing files on a MS-DOS diskette.
Only root directory is supported etc., but that's why I'm releasing it...
Enjoy. Sample binaries for MS-DOS machines included.
#!/bin/sh
# This is a shell archive (shar 3.32)
# made 08/17/1990 08:23 UTC by otto at tukki
#
# existing files WILL be overwritten
#
# This shar contains:
# length mode name
# ------ ---------- ------------------------------------------
# 803 -rw-rw-rw- clear.c
# 6810 -rw-rw-rw- clear.com
# 1033 -rw-rw-rw- io.asm
# 286 -rw-rw-rw- io.h
# 449 -rw-rw-rw- makefile
# 13494 -rw-rw-rw- msdos.c
# 2050 -rw-rw-rw- msdos.doc
# 1403 -rw-rw-rw- msdos.h
# 1079 -rw-rw-rw- read.c
# 7178 -rw-rw-rw- read.com
# 1030 -rw-rw-rw- write.c
# 7284 -rw-rw-rw- write.com
#
if touch 2>&1 | fgrep 'amc' > /dev/null
then TOUCH=touch
else TOUCH=true
fi
# ============= clear.c ==============
echo "x - extracting clear.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > clear.c &&
X/*
X** Test main program for MS-DOS diskette routines: format diskette
X*/
X
X#include "io.h"
X#include "msdos.h"
X
Xchar *names[]={"360k","1.2M","720k","1.44M"};
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[]; {
X register int i;
X
X if(argc!=2) {
Xusage: printf( "usage: clear [drive_letter]format\n"
X "formats:\n");
X for(i=0; i<sizeof(names)/sizeof(char *); i++)
X printf("%d\t%s\n",i,names[i]);
X exit(2);
X }
X
X if((i=*argv[1])>'9') {
X if(i>'Z') i-=32;
X drive_number = i-'A';
X argv[1]++;
X }
X
X if( (i=*argv[1]-'0')>3 || i<0) goto usage;
X
X printf( "WARNING! Clearing drive %d to %s diskette (type %d)\n"
X "All files on the disk will be ERASED !\n"
X "Press ENTER to continue, or CTRL/C to abort\n",
X drive_number,names[i],i);
X getchar();
X
X disk_clear(i);
X exit(0);
X}
X
SHAR_EOF
$TOUCH -am 0807030090 clear.c &&
chmod 0666 clear.c ||
echo "restore of clear.c failed"
set `wc -c clear.c`;Wc_c=$1
if test "$Wc_c" != "803"; then
echo original size 803, current size $Wc_c
fi
# ============= clear.com ==============
echo "x - extracting clear.com (Binary)"
sed 's/^X//' << 'SHAR_EOF' | uudecode &&
Xbegin 600 clear.com
XMZ;,258OL5H-^!`)T-+C3&%#H+PN#Q`*^``#K%HO&T>"+V/^WMAA6N/\84. at 5
XM"X/$!D:#_ at 1RY;@"`%#HL12#Q`*+7@:+7P**!YB+\(O&/3D`?A:#_EI^`X/&
XMX(O&!;__HK<!BUX&_T<"BUX&BU\"B@>8B_`%T/^+\(O&/0,`?XV#_@!\B%#1
XMX(O8_[>V&*"W`2KD4+@&&5#HJ`J#Q`CHVPE6Z%L%@\0"N```4.A`%(/$`EZ+
XMY5W#``D``@!5B^RT`NL%58OLM`-0+J&Z`2[W)K@!B\B+1 at 3W\8KH,]*+1 at 0N
XM]S:X`8/"`8K*,](N]S:Z`8KR+HH6MP%8L`&+7@;-$XK$,N1=PU=6N+(<4+@`
XM`%#HJ?^#Q`2+\(7V=`]6N```4+B2&5#H,`F#Q`:@OAPJY(O(AN`JP(O(H+T<
XM*N0+P:..&:"_'"KDH[(@H,$<*N2+R(;@*L"+R*#`'"KD"\&CM""@PAPJY*.V
XM(*#$'"KDB\B&X"K`B\B at PQPJY`O!H[@@H,D<*N2+R(;@*L"+R*#('"KD"\&C
XMNB"@RQPJY(O(AN`JP(O(H,H<*N0+P:.X`:#-'"KDB\B&X"K`B\B at S!PJY`O!
XMH[H!H,\<*N2+R(;@*L"+R*#.'"KD"\&CO""ANB#W)K8 at 4*&X(+D%`-/@*]+W
XM-HX9B\A8`\$#!K0 at B\BAO"`#R(D.OB"_``#K+(O']R:.&07`(%"AM"`#QU#H
XMGOZ#Q`2+\(7V=`]6_S:T(+B7&5#H)0B#Q`9'.SZZ('+.7E_#58OL@\3^5U:A
XMCAFY!0#3X`7`,HE&_J&Z(/<FMB`#!K0@`P:\($BCD!F_``#IC0"ACAFY!0#3
XMX`7`,CM&_G<L_P:0&;C`,E#_-I`9Z"[^@\0$B_"%]G0/5O\VD!FXG!E0Z+4'
XM@\0&QT;^P#*#?@0`="NX"P!0_W8$_W;^Z*L/@\0&A<!U%8M>_HI'"RKDJ1X`
XM=0B+PUY?B^5=P^L;BU[^B@<JY(OPA?9T!H'^Y0!U"(O#7E^+Y5W#@T;^($<[
XM/K@@<P/I:O^X``!>7XOE7<-5B^Q6BW8$BT0:HZ`;BD0=F)FY"`#1X-'2XOJ+
XMR(O:BD0<F)D+P0O34%**1!Z8F8O(B]J2*\"+R(O:6E at +P0O34E"*1!^8F9(K
XMP+D(`-'@T=+B^HO(B]I86 at O!"].)%IX;HYP;H8X9]R:R(`6R'*.:&[@``(,^
XMH!L`=0.X`0!>B^5=PX,^GAL`=06#/IP;`'4$N/__PZ&.&?<FLB`%LAP[!IH;
XM=QW'!IH;LAS_-J`;Z,\$@\0"_S:@&^CL!8/$`J.@&X,&G!O_ at Q:>&_^+'IH;
XM_P::&XH'*N3#58OL@\3^5O]V!.A,_H/$`HE&_H7`=$:+V(I'"RKDJ0$`=`BX
XM``!>B^5=PXM'&J.@&X7`=".+-J`;B\90Z)`%@\0"HZ`;N```4%;HP06#Q`2!
XM/J`;^`]RW>@!!>LNN```4.CU_8/$`HE&_H7`=!6^``"+7 at 2*`(M>_H@`1H/^
XM"WSPZPBX``!>B^5=PXM>_L=''@``QT<<``"+7O['1QH``(M>_L9'"R"+7O['
XM1Q@``(M>_L='%@``N,`R4/\VD!GH&OR#Q`2+\(7V=`]6_S:0&;BA&5#HF at 6#
XMQ`;'!J`;``#'!IX;``#'!IP;``"ACAGW)K(@!;(<HYH;BT;^7HOE7<-5B^Q6
XMH8X9]R:R(`6R'#L&FAMW2(,^H!L`=`K_-J`;Z-\#@\0"BS:@&T;K`496Z)T$
XM@\0"A<!U](,^H!L`=`U6_S:@&^C&!(/$!.L&BUX$B7<:B3:@&\<&FANR'(I&
XM!HL>FAN(!_\&FAN#!IP;`8,6GAL`N```7HOE7<-5B^Q6 at SZ@&P!U!5Z+Y5W#
XMH)P;BUX$B$<<H9P;BQ:>&[D(`.,&T>K1V.+ZBUX$B$<=H9P;BQ:>&Y(KTHM>
XM!(A''J&<&XL6GAN2*]*Y"`#1ZM'8XOJ+7 at 2(1Q^XP#)0_S:0&>C[^H/$!(OP
XMA?9T#U;_-I`9N*<94.A[!(/$!O\VH!OH`@.#Q`*X_P]0_S:@&^@`!(/$!.A(
XM`UZ+Y5W#58OL@\3^5KX``,:$LAP`1H'^``)\](M&!(O0L0/3X"O"B]B*AZX9
XM*N2CN`&*AZ\9*N2CN@''!HX9``**A[$9*N2CNB#'!K0@`0#'!K8@`@"*A[(9
XM*N3W)HX9N04`T^BCN""*A[,9*N2CLB#'!KP@``"ANB#W)K8 at 4(J'LADJY(O(
XM6`/!`P:T(`,&O""COB#&!K(<Z\8&LQP\Q@:T')"^``"[U!F*`(B$M1Q&@_X(
XM?/&@CAFBO1RACAF&X"KDHKX<H+(@HK\<H+0 at HL`<H;0 at AN`JY*+!'*"V(*+"
XM'*"X(*+#'*&X((;@*N2BQ!R+1 at 2+T+$#T^`KPHO8BH>M&2KD]R:X`?<FN@&B
XMQ1R*AZT9*N3W)K@!]R:Z`8;@*N2BQAR*A[`9HL<<H+H at HL@<H;H at AN`JY*+)
XM'*"X`:+*'*&X`8;@*N2BRQR at N@&BS!RAN@&&X"KDHLT<H+P at HLX<H;P at AN`J
XMY*+/'+X``(J$R1F(A-T<1H/^"WSRN+(<4+@``%#H0?F#Q`2+\(7V=`]6N```
XM4+C=&5#HP0*#Q`:+1 at 2+T+$#T^`KPHO8BH>P&:+`(,8&P2#_Q@;"(/^^`P#K
XM!L:$P"``1J&.&?<FNB`[QG?OZ'(!ZP;&A,`R`$:!_@`"?/3'1O[`,KX``(J$
XMR1F+7OZ(`$:#_ at M\\8M>_L9'"PBANB#W)K8@`P:T(`,&O""CD!FXP#)0_S:0
XM&>BI^(/$!(OPA?9T#U;_-I`9N.,94. at I`H/$!KX``(M>_L8``$:#_ at M\](M>
XM_L9'"P#_!I`9BT8$B]"Q`]/@*\*+V(J'LADJY#L&D!EV);C`,E#_-I`9Z%/X
XM@\0$B_"%]G0/5O\VD!FXZ1E0Z-,!@\0&Z[Y>B^5=PU6+[(/$_%=6BW8$QT;\
XMLAR+QDA(]R:R(`,&OB"+\,=&_@``ZR;_=OQ6Z`'X@\0$B_B%_W0,5U:X[QE0
XMZ(L!@\0&_T;^1J&.&0%&_(M&_CL&LB!RT5Y?B^5=PU6+[(/$_%=6BW8$QT;\
XMLAR+QDA(]R:R(`,&OB"+\,=&_@``ZR;_=OQ6Z*[W@\0$B_B%_W0,5U:X]!E0
XMZ#$!@\0&_T;^1J&.&0%&_(M&_CL&LB!RT5Y?B^5=PU=6OP``ZV.+Q_<FCAD%
XMP"!0H;0@`\=0Z&;W@\0$B_"%]G015J&T(`/'4+CZ&5#HY`"#Q`:+Q_<FCAD%
XMP"!0H;0@`P:Z(`/'4. at U]X/$!(OPA?9T%5:AM"`#!KH@`\=0N``:4.BO`(/$
XM!D<[/KH@<I=>7\-5B^Q6BT8$B]#1X`/"T>B+V(J'P"`JY(OPBH?!("KDAN`J
XMP`OP]T8$`0!T"8O&N00`T^CK!8O&)?\/7HOE7<-5B^Q6BT8$B]#1X`/"T>B+
XMV(J'P"`JY(OPBH?!("KDAN`JP`OP]T8$`0!T$HM&!KD$`-/@B\Z!X0\`"\'K
XM#HM&!B7_#XO.@>$`\`O!B_"+QHB'P""+QH;@*N2(A\$@7HOE7<-5B^S_=@C_
XM=@;_=@2X!AI0Z-@`@\0(N`$`4.AZ"H/$`HOE7<.X,AI0Z`(`6<-5B^Q75HMV
XM!%;H-@!9B_B+QSW__W0H(P8P&HOXB\?K#X!,!@BX__]>7XOE7</KV3T``'3Y
XM/0T`=/0]&@!TXHO'Z^55B^Q75HMV!(L$.T0"<E^*1`:8J1@`=`FX__]>7XOE
XM7<.`9`;[@WP$`'4%5NA.`EG_=`G_=`2*1`>84. at 2"H/$!HOXB\<]``!_&HI$
XM!IB+R+ at 0`(7_=0.X"``+P8A$!KC__^NWBT0$B00#QXE$`HL$_P2+V(H'F"7_
XM`.N?58OLC48&4/]V!+A;#%#H)02#Q`:+Y5W#58OLN#\:4/]V!.@'`(/$!(OE
XM7<-5B^Q75HMV!(M^!H/^"G495[@-`%#H&P"#Q`0]__]U";C__UY?B^5=PU=6
XMZ`4`@\0$Z_!5B^Q6BW8&BP0[1`)R$XM&!"7_`%!6Z*P`@\0$7HOE7<.*1 at 10
XMBP3_!(O86(@'F"7_`.OH5KXR&HO&@\8-4.@)`%F!_C8;<O!>PU6+[%=6BW8$
XMOP``A?9U";C__UY?B^5=PX!\!@!T2(I$!IBI!`!T#;C__U!6Z$P`@\0$B_B*
XM1`>84. at E"5D+^(I$!IBI`@!T!_]T!.C``EF*1`:8J2``=`[_=`OH. at E9_W0+
XMZ*D"6;@``,<$``")1`*)1`3&1`8`B\?KEU6+[%=6BW8$QP9F&]8,BD0&F*D0
XM`'0)N/__7E^+Y5W#BD0&F*D$`'0KBSPK?`17_W0$BD0'F%#H?0B#Q`8[QW03
XM@$P&$+@``,<$``")1`*X___KQH-^!O]U$X!D!ONX``#'!```B40"N```ZZV#
XM?`0`=056Z&8`68-\"0%U'K@!`%"-1 at 90BD0'F%#H*0B#Q`8]`0!UJXM&!NE^
XM_XM$!(D$`T0)B40"@$P&!(I&!E"+!/\$B]A8B`>8)?\`Z5O_5KXR&H!\!@!T
XM$(/'^-AMR!;@``%[#Z^J+QNOX58OL@\3^5HMV!(I$!YA0Z',)687`=!+'
XM1`D!`(O&!0@`B40$7HOE7<.X``10Z(@`68E&_H7`=-_'1`D`!(!,!@*+1OZ)
XM1`3KVU6+[(/$_%=6BW8$BT3^)?[_B4;^*\:)1OP[1 at 9V#8M&!HE&_(O.`\B)
XM3OY6Z#X!6?]V!N at Y`%F+^(7_="H[_G0F_W;\5U;HK at B#Q`8[-J0;=Q6AI!L[
XM1OYS#:&B&XL.I!LKSHO9B0&+QUY?B^5=PU6+[(/$^E=6BT8$0$!`T>C1X(E&
XM!(,^I!L`=1+'!J8;IAN!#J8;`0#'!J0;IAO'1OH``(LVI!N)=OX[-C8;=6'_
XM1OJ+1OH]`0!^5L=&_``$_W;\Z)<(68OXB\<]__]U";@``%Y?B^5=PXO&!0(`
XM._AT#HD\@0P!`/]._/]._(OWB_X#?OR)/,<%IAN!#0$`B3XV&XM>_HL')?[_
XM.\9U`HOS]P0!`'5*B7;^BP0E_O^+^(O?]P<!`'4&BP6)!.OK*]Z)7OP[7 at 1R
XM*#M>!'82B\8#1 at 2)!(O8BP>CHAN+'(D_BP2CI!N!#`$`B\8%`@#I<O^+!"7^
XM_XOPZ3__Z67_58OL5HMV!(/&_O<$`0!U"+C__UZ+Y5W#@23^_XDVI!NX``#K
XM[DQL:$9.;WA8=61I<V-P;F5%9F=')2$1*!$L$2\1+!$V$3\1.Q%$$4D121%M
XM$HP2L1*T$EP25A)<$EP25A*4$#`Q,C,T-38W.#EA8F-D968 at +6QM(&9I<G-T
XM`%6+[('L5`%75OR+=@;'1OX``,9&]0"L/"5T$H3`=`7H1P+K[HM&_EY?B^5=
XMP\9&]"#&1O(`QD;S`,=&^O__K#PM=0:`3O4(Z_4\*W4&QD;R*^OK/"!U#(!^
XM\@!UX<9&\B#KVSPC=0:`3O40Z]$\,'4%QD;T,*SH)P*%TGD&]]J`3O4(B5;\
XM/"YU!ZSH$@*)5OJ,SX['OQ\0N14`\JZ![R`0T><N_Z4T$(!.]0&LZ^:`3O4"
XMK.O?@$[U!*SKV+D(`.L1@$[U(+D0`.L(N0H`ZP.Y"O\>!XM^"":+!8/'`O9&
XM]0)T"":+%8/'`NL'*]*$[70:F83M=!6*;O*(;O.%TGD+QD;S+??:]]B#V@")
XM?@B#?OH`?07'1OH!`+4`C->.QXV^P/Z%TG4$A<!T(RO;.\IW#E"+PBO2]_&+
XMV%CW\>L"]_&'TRZ*GUX03R:('>O5]D;U$'05@/D*=!"`^1!U!L9&\WCK!4\F
XMQ at 4PC8[`_BO/BT;Z*\&)1OI^`RE&_(E.^(!^\P!T#(!^\WAU`_]._/]._"E.
XM_'X:]D;U"'44@'[T,'4#Z*T`BD;TZ+T`_T[\?_7HGP#_3OIX![`PZ*L`Z_3_
XM3OAX"2:*!4?HG0#K\O]._'@'L"#HD0#K].DU_H!.]2`$((-&"`B,R([`OVX0
XM at V[\"NO,Z(\`5[``N?__\J[WT4D[3OIV`XM.^E_'1OH``.EJ_QX'BWX()HH%
XM@\<"B7X(B(:L_KD!`(S0CL"-OJS^QT;Z``#I1?_IU_WH2`"+1OXFB07V1O4"
XM=`8FQT4"``#IO_V*1O.$P'0K/'AU![`PZ`8`L'C&1O,`_T;^]D;U('0*/&%R
XM!CQZ=P(L(`8JY%#_5 at 18!\,>!XM^"/9&]01U!XL]@T8(`L,FQ#V#1@@$PSPJ
XM=1`>!XM^"":+%8/'`HE^"*S#*]*T`#PP<A4\.7<1+##1XHO*T>+1X@/1`]"L
XMZ^?#58OL_%97BW8$C-^.QXM^!JVO=3^$P'0UA.1U].LO58OLBTX(B]'1Z?Q6
XM5XMV!(S?CL>+?@;C#JVO=1B$P'0.A.3@]'0(]L(!=`.F=1,KP%]>7<.#[P*N
XM=0>$P'3PBL2N&\!XZT#KZ`````"]``"%[74"C-TNC!ZT$XL>`@`KW8'[`!!V
XM#XV>`!",P"O8M$K-(;L`$([%)HP>2ANQ!-/C)H,^?AL`=!<FH7H;T>`FBQYX
XM&]/C.]AW`HO8@</"-/J.U8OC^X7;=0.[__\FB1Y&&R:#/GX;`'0V)HLV?!N+
XMPT`FHSH;T^8#WG,#N___)HD>1AN#PP_3ZXS``]B,V"O8C,6.P+1*S2%S!;#^
XMZ:,`CL7\OYH;N<(T*\]!T>GC!"O`\ZN.!BP`*_^Y_W\FBB6`_#UT%H3D=`3R
XMKG3PB at Z``"KMOH$`N`$`ZPDKP*J+]XS'CM]0CL4FBSXZ&U?C"*R$P'0#JN+X
XM*L"JCMU'@>?^_XD^.AN)/D(;QP9$&\(T at SY^&P!U!(D^1!NA1!L#!GH;HT0;
XMC!X^&XP.0!OH&0%R!>@V`.L-M`FZ3!O-(;#]ZP)86+1,S2$N_RZR$P`````N
XMCP8%%2Z/!@<5'^@%`"[_+ at 455U;+N```PU6+[%=6BW8$N```4.B7`EFB@!NX
XM`0!0Z(P"6:*!&[@"`%#H at 0)9HH(;BT8&T>!`0%#HD@)9HZH;N&@;BQZJ&\<'
XM:!N+1@:CJ!O1X(L^JAL#^(`\('0%@#P)=0-&Z_.`/`!T28DU1T?_!J@;N`(`
XM4.A4`ED]__]U&K at .`%"X:1M0N`(`4.AT`(/$!KC(`%#H1O]91H`\`'02B at 0\
XM('0$/`EU!L8$`$;K`NOHZZ7'!0``_S:J&_\VJ!OH)>N#Q`2X``!0Z`<`65Y?
XMB^5=PU6+[/\69AO_=@3H_OY9B^5=P_C#58OLM#^+7 at 3K+E6+[+1`BUX$ZR15
XMB^RT/^L%58OLM$"+7 at 2`OX`;`'0.78#\/W0$_R:6&_\FE!N+5@:+3 at C-(7,&
XMHSP;N/__7<-5B^RT/HM>!,TA<PBC/!NX__]=PRO`7<-5B^RT0HI&"HM6!HM.
XM"(M>!,TA<PBC/!NX__^+T%W#58OLM$&+5 at 3-(7,(HSP;N/__7<,KP%W#58OL
XM5[16BU8$C-^.QXM^!LTA7W,(HSP;N/__7<,KP%W#58OL5HLVP#2%]G4PN`0!
XM4+BL&U#_=@3H+/^#Q`:+\(7V=`^`O*L;"G4(3J"8&XB$JQO'!K`<K!N)-L`T
XM.W8(?@.+=@B%]G0.5O]V!O\VL!SH=`"#Q`8!-K`<*3;`-(O&7HOE7<-5B^Q7
XM5HM^!HMV".LNB]]'@#\*=2:+QRM&!E#_=@;_=@3HQ_Z#Q`:X`0!0N)D;4/]V
XM!.BV_H/$!HE^!HO&3H7`=<L[?@9T$HO'*T8&4/]V!O]V!.B5_H/$!HM&"%Y?
XMB^5=PU6+[)S\5E>,WX['BW8$BWX&BTX(C,",VCO"=1<[_G0?<A']`_D#\4].
XM]L$!=`&D3T[K!O;!`70!I-'I=`+SI?Q?7IU=PU6+[(M>!+@`1,TA<@_VPH!T
XM"O;"`W0%N`$`7<,KP%W#58OL5XM&!(L^.AN%P'T&*_AR%NL$`\=R$%#H%P!9
XMA<!U`HO'7X7`7</'!CP;^/^X___K\%6+[(M&!$`D_CL&0AMR<(,^?AL`=1B+
XMW"L>>AL[PW-?HSH;`P9Z&Z-$&RO`7<,[!D8;=PL[!CH;<@6C.AOKZU"+V+D$
XM`-/K@>/_#X/#08'CP/]3!HS9`]F.!DH;*QY*&[1*S2$'6UAR%J,Z&_?#`.!U
XM#;D$`-/CB1Y&&RO`7</'!CP;^/^X__^%P%W#58OLB\0K1 at 2C>AM=P[X8PQC(
XM&,T8,S8P:P`Q+C)-`#<R,&L`,2XT-$T`=7-A9V4Z(&-L96%R(%MD<FEV95]L
XM971T97)=9F]R;6%T"F9O<FUA=',Z"@`E9`DE<PH`5T%23DE.1R$@0VQE87)I
XM;F<@9')I=F4@)60@=&\@)7, at 9&ES:V5T=&4@*'1Y<&4@)60I"D%L;"!F:6QE
XM<R!O;B!T:&4 at 9&ES:R!W:6QL(&)E($5205-%1"`A"E!R97-S($5.5$52('1O
XM(&-O;G1I;G5E+"!O<B!#5%),+T,@=&\@86)O<G0*```"__]R96%D`')E860`
XM<F5A9`!W<FET90!W<FET90`H"0+]`@<"4`\"^0<.`5`)`OD#!P)0$@+P"0X!
XM37D at 1&ES:V5T=&5->6-R;V9T*@!W<FET90!W<FET90!W<FET90!R96%D`'=R
XM:71E`'=R:71E`'=R:71E`$-A;B=T("5S(&QO9VEC86P@<V5C=&]R("5D+"!S
XM=&%T=7,])3`R>`H``/\``````````0```0````````````$!``$`````````
XM```!`@`!`````````````0,``0````````````$$``$`````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM``````"F&Z8;PC0```````````````#__P``.#`X-R\X,#(X-R!I<R!R97%U
XM:7)E9"$-"B0?%0!4;V\@;6%N>2!A<F=S+@```0`(``$`````````````````
X/````````````O18B%PH-
X`
Xend
SHAR_EOF
$TOUCH -am 0815172890 clear.com &&
chmod 0666 clear.com ||
echo "restore of clear.com failed"
set `wc -c clear.com`;Wc_c=$1
if test "$Wc_c" != "6810"; then
echo original size 6810, current size $Wc_c
fi
# ============= io.asm ==============
echo "x - extracting io.asm (Text)"
sed 's/^X//' << 'SHAR_EOF' > io.asm &&
X include lmacros.h
X public drive_number_,sectors_per_track_,number_of_heads_
Xdrive_number_ db 0
Xsectors_per_track_ dw 9
Xnumber_of_heads_ dw 2
X
X; sector = logical_sector_ % sectors_per_track_ + 1
X; head = (logical_sector_ / sectors_per_track_) % number_of_heads_
X; cylinder = logical_sector / (sectors_per_track * number_of_heads_)
X
X procdef read_sector,<<logical_sector,word>,<buffer,ptr>>
X mov ah,2
X jmp short write1
X
X entrdef write_sector,<<dummy1,word>,<dummy2,ptr>>
X mov ah,3
Xwrite1: push ax
X
X mov ax,number_of_heads_
X mul sectors_per_track_
X mov cx,ax
X mov ax,logical_sector
X div cx
X mov ch,al ; Load cylinder
X
X xor dx,dx
X mov ax,logical_sector
X div sectors_per_track_
X add dx,1
X mov cl,dl ; Load sector
X
X xor dx,dx
X div number_of_heads_
X mov dh,dl ; Load head
X
X mov dl,drive_number_; Load drive number
X
X pop ax ; Get read/write function request
X mov al,1 ; One sector
X ldptr bx,buffer,es ; Load buffer offset
X
X int 13h
X mov al,ah
X xor ah,ah
X pret
X pend read_sector
X finish
SHAR_EOF
$TOUCH -am 0804213590 io.asm &&
chmod 0666 io.asm ||
echo "restore of io.asm failed"
set `wc -c io.asm`;Wc_c=$1
if test "$Wc_c" != "1033"; then
echo original size 1033, current size $Wc_c
fi
# ============= io.h ==============
echo "x - extracting io.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > io.h &&
X/*
X** Sector read routines
X*/
X
Xunsigned int read_sector(unsigned int logical_sector,unsigned char *sector);
Xunsigned int write_sector(unsigned int logical_sector,unsigned char *sector);
X
Xextern unsigned char drive_number;
Xextern unsigned int sectors_per_track,number_of_heads;
SHAR_EOF
$TOUCH -am 0804213590 io.h &&
chmod 0666 io.h ||
echo "restore of io.h failed"
set `wc -c io.h`;Wc_c=$1
if test "$Wc_c" != "286"; then
echo original size 286, current size $Wc_c
fi
# ============= makefile ==============
echo "x - extracting makefile (Text)"
sed 's/^X//' << 'SHAR_EOF' > makefile &&
X#
X# M S - D O S d i s k e t t e f i l e s y s t e m
X#
X
XCFLAGS= +f0 -n
XLNFLAGS=
X
Xall: read.com write.com clear.com
X @echo -
X
Xread.com: read.o io.o msdos.o
X ln $(LNFLAGS) -o read.com read.o io.o msdos.o -lc
X
Xwrite.com: write.o io.o msdos.o
X ln $(LNFLAGS) -o write.com write.o io.o msdos.o -lc
X
Xclear.com: clear.o io.o msdos.o
X ln $(LNFLAGS) -o clear.com clear.o io.o msdos.o -lc
X
Xread.o write.o clear.o msdos.o: io.h msdos.h
SHAR_EOF
$TOUCH -am 0815172890 makefile &&
chmod 0666 makefile ||
echo "restore of makefile failed"
set `wc -c makefile`;Wc_c=$1
if test "$Wc_c" != "449"; then
echo original size 449, current size $Wc_c
fi
# ============= msdos.c ==============
echo "x - extracting msdos.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > msdos.c &&
X/*
X** M S - D O S d i s k e t t e f i l e s y s t e m
X*/
X
X/*
X** Current limitations:
X** Only one file may be "open" at a time - either for read or write
X** There is no provision if the diskette becomes full when writing
X*/
X
X#include "io.h"
X#include "msdos.h"
X
X /* Macros for converting two bytes to word and vice versa */
X#define GET_WORD(i,a) ((unsigned int)(a[i] | (a[(i)+1]<<8)))
X#define SET_WORD(i,a,v) (a[i]=(v), a[(i)+1]=(v)>>8)
X
X /* Same for converting four bytes to long and vice versa */
X#define C(a) ((char *)&(a))
X#define L(i,a) ((unsigned long)(C(a)[i]))
X
X#define GET_LONG(l) (L(0,l) | (L(1,l)<<8) |\
X (L(2,l)<<16) | (L(3,l)<<24))
X#define SET_LONG(l,v) ((C(l)[0]=(v)), (C(l)[1]=(v)>>8),\
X (C(l)[2]=(v)>>16), (C(l)[3]=(v)>>24))
X
X /* Error marking routines */
X#define READ_ERROR(sector,status) general_error("read",sector,status)
X#define WRITE_ERROR(sector,status) general_error("write",sector,status)
X
X /* Some markers */
Xunsigned int sector_size=SECTORSIZE,sectors_per_fat,reserved_sectors,file_area;
Xunsigned int fats_per_disk,file_slots,sectors_per_cluster,hidden_sectors;
X
X /* Single directory sector entry */
Xunsigned int dirsector_number=-1;
Xunsigned char dir_sector[SECTORSIZE];
X
X /* FAT buffer (largest floppy FAT is 9 sectors, on a 1.44M) */
Xunsigned char fat[9*SECTORSIZE];
X
X /* Cluster buffer (largest floppy cluster is 2 sectors) */
Xunsigned char cluster[2*SECTORSIZE];
X
X /* Some function prototypes */
Xvoid read_cluster(unsigned int number);
Xvoid write_cluster(unsigned int number);
X
Xvoid write_fat();
Xunsigned int get_fat_entry(unsigned int cluster);
Xvoid set_fat_entry(unsigned int cluster,unsigned int value);
X
Xvoid general_error(char *dowhat, unsigned int sector,unsigned int status);
X
X/*
X** Read sector zero, set values appropriately; read FAT into the buffer
X*/
Xvoid disk_open() {
X register int i,j;
X
X if(i=read_sector(0,cluster)) READ_ERROR(0,i);
X
X sector_size = GET_WORD(0x0B,cluster);
X sectors_per_cluster = cluster[0x0D];
X reserved_sectors = GET_WORD(0x0E,cluster);
X fats_per_disk = cluster[0x10];
X file_slots = GET_WORD(0x11,cluster);
X sectors_per_fat = GET_WORD(0x16,cluster);
X sectors_per_track = GET_WORD(0x18,cluster);
X number_of_heads = GET_WORD(0x1A,cluster);
X hidden_sectors = GET_WORD(0x1C,cluster);
X file_area = reserved_sectors + hidden_sectors +
X sectors_per_fat*fats_per_disk +
X (file_slots*sizeof(directory))/sector_size;
X
X Db( printf(
X "\ndrive %d\n"
X "media OEM signature \"%.8s\"\n"
X "bytes/sector=%u\n"
X "sectors/cluster=%u\n"
X "reserved=%u\n"
X "FATs=%u\n"
X "root directory file slots=%u\n"
X "total sectors=%u\n"
X "media descriptor=%xh\n"
X "sectors/FAT=%u\n"
X "sectors/track=%u\n"
X "heads=%u\n"
X "hidden sectors=%u\n"
X "boot signature=%02X%02X\n"
X "file area begins at sector %d\n\n",
X drive_number,
X cluster+3,
X sector_size,
X sectors_per_cluster,
X reserved_sectors,
X fats_per_disk,
X file_slots,
X GET_WORD(0x13,cluster),
X cluster[0x15],
X sectors_per_fat,
X sectors_per_track,
X number_of_heads,
X hidden_sectors,
X cluster[sector_size-2],cluster[sector_size-1],
X file_area);
X )
X
X /* Can't read FAT as multiple sectors; FAT can span tracks */
X for(j=0; j<sectors_per_fat; j++)
X if(i=read_sector(reserved_sectors+j,fat+j*sector_size))
X READ_ERROR(reserved_sectors,i);
X}
X
X
X/*
X** Search root directory for given filename (or free entry if NULL given),
X** return pointer to it's entry or NULL if no find
X*/
Xdirectory *find_dir(filename)
Xchar *filename; {
X register int i,j;
X directory *dp = (directory *)dir_sector+sector_size;
X
X dirsector_number = reserved_sectors + hidden_sectors +
X sectors_per_fat * fats_per_disk - 1;
X
X for(j=0; j<file_slots; j++, dp++) {
X if(dp >= (directory *)dir_sector+sector_size) {
X if(i=read_sector(++dirsector_number,dir_sector))
X READ_ERROR(dirsector_number,i);
X dp = (directory *)dir_sector;
X }
X if(filename) {
X /* Name must match and must not be volabel, dir etc. */
X if(!(strncmp(dp->filename,filename,8+3) ||
X (dp->attribute & ATTR_SPECIAL)) )
X return(dp);
X } else {
X /* Must be either unused or deleted entry */
X if(!(i=dp->filename[0]) || i==0xE5)
X return(dp);
X }
X }
X
X return(NULL);
X}
X
X
X/*
X** "Open" a file for read, return true if file cannot be read (zero length)
X*/
Xstatic unsigned int current_cluster;
Xstatic unsigned long int bytes_in_file;
Xstatic unsigned char *next_char;
X
Xint file_open(dir_item)
Xregister directory *dir_item; {
X current_cluster = dir_item->cluster;
X bytes_in_file = GET_LONG(dir_item->filesize);
X next_char = cluster+sector_size*sectors_per_cluster;
X
X Db( printf("Opened file, size %ld bytes\n",bytes_in_file); )
X
X return(!current_cluster);
X}
X
X
X/*
X** Get next character from file previously opened with file_open
X*/
Xint file_getc() {
X if(!bytes_in_file) return(EOF);
X if(next_char >= cluster+sector_size*sectors_per_cluster) {
X next_char = cluster;
X read_cluster(current_cluster);
X current_cluster = get_fat_entry(current_cluster);
X }
X bytes_in_file--;
X return(*next_char++);
X}
X
X
X/*
X** "Open" filename for writing, return pointer to directory item if
X** successful; return NULL if old file can't be overwritten or there
X** is no room in the root directory for a new file
X*/
Xdirectory *file_create(filename)
Xchar *filename; {
X register int i;
X directory *dp;
X
X /* If file already exists, truncate it to zero length */
X if(dp=find_dir(filename)) {
X /* Can't truncate if file is readonly */
X if(dp->attribute & ATTR_READONLY) return(NULL);
X
X /* Remove FAT chain */
X if(current_cluster = dp->cluster)
X do {
X current_cluster =
X get_fat_entry(i=current_cluster);
X set_fat_entry(i,0);
X Db( printf("Freeing cluster %03x\n",i); )
X } while(current_cluster < 0xFF8);
X /* Then rewrite FAT */
X write_fat();
X } else
X /* Allocate a unused or deleted directory entry, copy name */
X if(dp=find_dir(NULL))
X for(i=0; i<8+3; i++) dp->filename[i]=filename[i];
X else
X return(NULL);
X
X /* Then clear directory entry, filesize and cluster ptr */
X dp->filesize = 0L;
X dp->cluster = 0;
X dp->attribute = ATTR_ARCHIVE; /* File archive bit set (modified) */
X dp->date = 0x0000; /* You may insert anything appropriate here */
X dp->time = 0x0000; /* These values mean "no date" for MS-DOS */
X if(i=write_sector(dirsector_number,dir_sector))
X WRITE_ERROR(dirsector_number,i);
X
X /* Clear indicators for file_putc() */
X current_cluster = 0;
X bytes_in_file = 0L;
X next_char = cluster+sector_size*sectors_per_cluster;
X
X return(dp);
X}
X
X
X/*
X** Put next character to the file previously opened with file_create
X*/
Xint file_putc(dp,c)
Xdirectory *dp;
Xint c; {
X register int i;
X
X /* Note that there is no provision for running out of FAT */
X if(next_char >= cluster+sector_size*sectors_per_cluster) {
X if(current_cluster)
X write_cluster(current_cluster);
X for(i=current_cluster+1; get_fat_entry(i); i++);
X
X if(current_cluster)
X set_fat_entry(current_cluster,i);
X else
X dp->cluster = i;
X
X Db( printf("Allocated cluster %03x\n",i); )
X current_cluster = i;
X next_char = cluster;
X }
X *next_char++ = c;
X bytes_in_file++;
X return(0);
X}
X
X
X/*
X** Close the file written to by file_putc
X** Rewrite directory item and FAT, write disk buffer
X*/
Xvoid file_close(dp)
Xdirectory *dp; {
X register int i;
X
X Db( printf("Closing file, size %ld bytes\n",bytes_in_file); )
X
X /* Do nothing if file hasn't actually been written to */
X if(!current_cluster) return;
X
X /* Update file size */
X SET_LONG(dp->filesize,bytes_in_file);
X
X Db( printf("Closing file, size %ld bytes\n",dp->filesize); )
X
X if(i=write_sector(dirsector_number,dir_sector))
X WRITE_ERROR(dirsector_number,i);
X
X /* Write cluster buffer to disk */
X write_cluster(current_cluster);
X /* Mark as end-of-file to FAT */
X set_fat_entry(current_cluster,0xFFF);
X /* Rewrite FAT to disk */
X write_fat();
X}
X
X
X/*
X** Erase disk's logical structure, create standard MS-DOS disk;
X** this basically does a logical format to the target disk -- nothing
X** is done physically. THIS WILL TOTALLY ERASE THE WHOLE DISKETTE !
X** Idea is that one does not have to do disk_open once this is done
X**
X** Note: if Atari ST 720k diskette support is wanted, the media
X** descriptor byte for type 2 should be set to 0xF7.
X*/
X
Xstatic struct {
X unsigned char tracks,sectors,heads,media,fat,files,cluster;
X} disk_data[4] = {
X/* tracks sectors heads media FAT files cluster */
X { 40, 9, 2, 0xFD, 2, 7, 2 }, /* 360k */
X { 80, 15, 2, 0xF9, 7, 14, 1 }, /* 1.2M */
X { 80, 9, 2, 0xF9, 3, 7, 2 }, /* 720k */
X { 80, 18, 2, 0xF0, 9, 14, 1 }, /* 1.44M */
X};
Xstatic unsigned char volume_label[8+3]="My Diskette";
X
Xvoid disk_clear(disktype)
Xint disktype; {
X register int i;
X directory *dp;
X
X /* First, make logical sector 0 */
X for(i=0; i<SECTORSIZE; i++) cluster[i]='\0';
X
X sectors_per_track = disk_data[disktype].sectors;
X number_of_heads = disk_data[disktype].heads;
X
X sector_size = SECTORSIZE;
X sectors_per_fat = disk_data[disktype].fat;
X reserved_sectors = 1;
X fats_per_disk = 2;
X file_slots = sector_size*disk_data[disktype].files/sizeof(directory);
X sectors_per_cluster = disk_data[disktype].cluster;
X hidden_sectors = 0;
X
X file_area = reserved_sectors + hidden_sectors +
X sectors_per_fat*fats_per_disk +
X disk_data[disktype].files;
X
X /*
X ** Seems Messy-Dos can't read a 3.5" diskette unless these
X ** are here (it has no problems reading 5.25" diskettes !)
X ** they actually are the instructions JMP 003E and NOP for
X ** the iAPX86 family microprocessors - talk about a kludge!
X */
X cluster[0]=0xEB; cluster[1]=0x3C; cluster[2]=0x90;
X
X /* Diskette creator (OEM) signature - that's me, folks! */
X for(i=0; i<8; i++) cluster[i+3]="Mycroft*"[i];
X
X SET_WORD(0x0B,cluster,sector_size);
X cluster[0x0D] = sectors_per_cluster;
X SET_WORD(0x0E,cluster,reserved_sectors);
X cluster[0x10] = fats_per_disk;
X SET_WORD(0x11,cluster,file_slots);
X SET_WORD(0x13,cluster,
X disk_data[disktype].tracks*sectors_per_track*number_of_heads);
X cluster[0x15] = disk_data[disktype].media;
X SET_WORD(0x16,cluster,sectors_per_fat);
X SET_WORD(0x18,cluster,sectors_per_track);
X SET_WORD(0x1A,cluster,number_of_heads);
X SET_WORD(0x1C,cluster,hidden_sectors);
X
X /*
X ** This volume label is actually extraneous, since we haven't
X ** inserted the MS-DOS 4.0 signature byte 0x29 at offset 0x26
X ** (as we'd have to figure a volume serial number for the disk)
X */
X for(i=0; i<8+3; i++) cluster[i+0x2B]=volume_label[i];
X
X if(i=write_sector(0,cluster))
X WRITE_ERROR(0,i);
X
X /* Then create empty FAT */
X fat[0] = disk_data[disktype].media;
X fat[1] = 0xFF;
X fat[2] = 0xFF;
X for(i=3; i<sector_size*sectors_per_fat; i++) fat[i]=0;
X write_fat();
X
X /* Lastly, clear directory area (except for volume label) */
X for(i<0; i<SECTORSIZE; i++) dir_sector[i]='\0';
X dp = (directory *)dir_sector;
X for(i=0; i<8+3; i++) dp->filename[i]=volume_label[i];
X dp->attribute = ATTR_VOLABEL;
X
X dirsector_number = reserved_sectors + hidden_sectors +
X sectors_per_fat * fats_per_disk;
X
X if(i=write_sector(dirsector_number,dir_sector))
X WRITE_ERROR(dirsector_number,i);
X
X for(i=0; i<11; i++) dp->filename[i]='\0';
X dp->attribute = 0;
X
X while(++dirsector_number < disk_data[disktype].files)
X if(i=write_sector(dirsector_number,dir_sector))
X WRITE_ERROR(dirsector_number,i);
X
X}
X
X
X/*
X** Get the requested cluster to the cluster buffer
X*/
Xstatic void read_cluster(number)
Xregister unsigned int number; {
X register int i,j;
X unsigned char *cp=cluster;
X
X Db( printf("Read cluster %03x\n",number); )
X
X number=CLUSTER_TO_SECTOR(number);
X for(j=0; j<sectors_per_cluster; j++, number++, cp+=sector_size)
X if(i=read_sector(number,cp))
X READ_ERROR(number,i);
X}
X
X
X/*
X** Put the requested cluster from the cluster buffer
X*/
Xstatic void write_cluster(number)
Xregister unsigned int number; {
X register int i,j;
X unsigned char *cp=cluster;
X
X Db( printf("Wrote cluster %03x\n",number); )
X
X number=CLUSTER_TO_SECTOR(number);
X for(j=0; j<sectors_per_cluster; j++, number++, cp+=sector_size)
X if(i=write_sector(number,cp))
X WRITE_ERROR(number,i);
X}
X
X
X/*
X** Write modified FAT back to disk (both copies)
X*/
Xstatic void write_fat() {
X register int i,j;
X
X for(j=0; j<sectors_per_fat; j++) {
X if(i=write_sector(reserved_sectors+j,fat+j*sector_size))
X WRITE_ERROR(reserved_sectors+j,i);
X if(i=write_sector(reserved_sectors+sectors_per_fat+j,
X fat+j*sector_size))
X WRITE_ERROR(reserved_sectors+sectors_per_fat+j,i);
X }
X}
X
X
X/*
X** Get FAT entry for specified cluster
X*/
Xstatic unsigned int get_fat_entry(cluster)
Xunsigned int cluster; {
X register unsigned int i=GET_WORD(3*cluster/2,fat);
X
X return (cluster&1)? (i>>4): (i&0x0FFF);
X}
X
X
X/*
X** Set FAT entry for specified cluster
X*/
Xstatic void set_fat_entry(cluster,value)
Xunsigned int cluster,value; {
X register unsigned int i=GET_WORD(3*cluster/2,fat);
X
X i = (cluster&1)?
X ((value<<4) | (i & 0x000F)):
X ((value & 0x0FFF) | (i & 0xF000));
X
X SET_WORD(3*cluster/2,fat,i);
X}
X
X
X/*
X** Report error and terminate
X*/
Xstatic void general_error(dowhat,sector,status)
Xchar *dowhat;
Xunsigned int sector,status; {
X printf("Can't %s logical sector %d, status=%02x\n",
X dowhat,sector,status);
X exit(1);
X}
SHAR_EOF
$TOUCH -am 0807074190 msdos.c &&
chmod 0666 msdos.c ||
echo "restore of msdos.c failed"
set `wc -c msdos.c`;Wc_c=$1
if test "$Wc_c" != "13494"; then
echo original size 13494, current size $Wc_c
fi
# ============= msdos.doc ==============
echo "x - extracting msdos.doc (Text)"
sed 's/^X//' << 'SHAR_EOF' > msdos.doc &&
XThis package reads and writes files in the root directory of a MS-DOS
Xformat diskette. Reads from and to files in directorys are not supported,
Xdirectorys are ignored.
X
XThe format is the one used on MS-DOS since version 2.01, ie. media
Xdescriptor bytes are not tested or supported. Diskettes formatted with
XMS-DOS versions 2.01 through 4.01 should all work. It should also be
Xpossible to use Atari ST -formatted diskettes, if the controller chip
Xtiming supports the different gap lengths of the format. However, the
XTOS on the Atari expects to see the media descriptor byte set to 0xF7
Xfor 720k diskettes; thus, the formatting routine will have to be changed
Xin this respect. Diskettes with this media descriptor will unfortunately
Xget the warning "Probable non-DOS diskette" from the MS-DOS chkdsk program.
X
XThe following sample programs are supplied: read (read a diskette file
Xusing the routines), write (write a diskette file) and clear (logically
Xformat a MS-DOS diskette).
X
XSome guidelines for producing generally MS-DOS compatible diskettes/files
Xwith this package:
X
X* filenames are 8 characters, with 3 character file extensions; both parts
X consist of uppercase characters padded from the right with spaces but
X they should NOT contain imbedded spaces; the filename cannot be all blank
X but the extension can be, and a period is assumed between the two parts;
X for example, the on-disk filename "MYFILE EXT" maps logically to the name
X "MYFILE.EXT" and the logical filename "2ND-FILE" maps to "2ND-FILE "
X
X* do not use lowercase characters or any of the DOS reserved characters
X which are ?*,;.:+"/<=>[\]| in the filenames you create
X
X* do not use either of the characters 0x00 (NUL) or 0xE5 as the first character
X of a filename; the first means a never used directory entry, the second a
X deleted one
X
X* use only "whole" diskettes, ie. if a diskette is physically or logically
X damaged and you try to write onto it with this package, the results will
X probably be bad (if not worse)
SHAR_EOF
$TOUCH -am 0814105390 msdos.doc &&
chmod 0666 msdos.doc ||
echo "restore of msdos.doc failed"
set `wc -c msdos.doc`;Wc_c=$1
if test "$Wc_c" != "2050"; then
echo original size 2050, current size $Wc_c
fi
# ============= msdos.h ==============
echo "x - extracting msdos.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > msdos.h &&
X/*
X** M S - D O S d i s k e t t e f i l e s y s t e m
X*/
X
X /* Default (implicitly assumed) sector size */
X#define SECTORSIZE 512
X
X /*
X ** FAT entries are based at 2, since the first two entries in
X ** the FAT table are reserved for the ancient media descriptor byte
X */
X#define CLUSTER_TO_SECTOR(cluster) (((cluster)-2)*sectors_per_cluster + \
X file_area)
X
X /* Some basically stdio.h constants that we define just in case */
X#ifndef NULL
X#define NULL ((void *)0)
X#endif
X#ifndef EOF
X#define EOF (-1)
X#endif
X
X /* Debugger's aid macro */
X#ifdef DEBUG
X#define Db(x) x
X#else
X#define Db(x)
X#endif
X
X /* Directory data entry format */
Xtypedef struct {
X unsigned char filename[11],attribute;
X char reserved[10];
X unsigned int time,date;
X unsigned int cluster;
X unsigned long int filesize;
X} directory;
X
X#define ATTR_READONLY 0x01
X#define ATTR_HIDDEN 0x02
X#define ATTR_SYSTEM 0x04
X#define ATTR_VOLABEL 0x08
X#define ATTR_DIRECTORY 0x10
X#define ATTR_ARCHIVE 0x20
X#define ATTR_UNUSED1 0x40
X#define ATTR_UNUSED2 0x80
X
X#define ATTR_SPECIAL 0x1E
X
X /* Function call prototypes */
Xvoid disk_open();
Xdirectory *find_dir(char *filename);
X
Xint file_open(directory *dir_item);
Xint file_getc();
X
Xdirectory *file_create(char *filename);
Xint file_putc(directory *dir_item,int character);
Xvoid file_close(directory *dir_item);
X
Xvoid disk_clear(int disktype);
SHAR_EOF
$TOUCH -am 0807035590 msdos.h &&
chmod 0666 msdos.h ||
echo "restore of msdos.h failed"
set `wc -c msdos.h`;Wc_c=$1
if test "$Wc_c" != "1403"; then
echo original size 1403, current size $Wc_c
fi
# ============= read.c ==============
echo "x - extracting read.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > read.c &&
X/*
X** Test main program for MS-DOS diskette routines: read file
X*/
X
X#include <stdio.h>
X#include "io.h"
X#include "msdos.h"
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[]; {
X register int i,j;
X directory *dp;
X FILE *f=stdout;
X
X if(argc!=3) {
X printf( "usage: read diskette_file [other_file|-]\n"
X "Filenames may have leading A: B: or\n"
X "imbedded periods, indicating spaces\n");
X exit(2);
X }
X
X for(i=0; j=argv[1][i]; i++)
X if(j=='.')
X argv[1][i]=' ';
X else if(j>='a' && j<='z')
X argv[1][i]-=32;
X
X if(argv[1][1]==':') {
X drive_number=*argv[1]-'A';
X argv[1]+=2;
X }
X
X disk_open();
X
X if(!(dp=find_dir(argv[1]))) {
X printf("No match for \"%11.11s\"\n",argv[1]);
X exit(1);
X }
X
X printf("Reading file \"%11.11s\" %02x %ld %04x/%04x\n",
X dp->filename,dp->attribute,dp->filesize,dp->date,dp->time);
X
X if((*argv[2]!='-' || argv[2][1]) && (!(f=fopen(argv[2],"w")))) {
X printf("Cannot open file \"%s\" for writing\n",argv[2]);
X exit(1);
X }
X
X file_open(dp);
X
X while((i=file_getc())!=EOF)
X putc(i,f);
X
X fclose(f);
X exit(0);
X}
SHAR_EOF
$TOUCH -am 0807043490 read.c &&
chmod 0666 read.c ||
echo "restore of read.c failed"
set `wc -c read.c`;Wc_c=$1
if test "$Wc_c" != "1079"; then
echo original size 1079, current size $Wc_c
fi
# ============= read.com ==============
echo "x - extracting read.com (Binary)"
sed 's/^X//' << 'SHAR_EOF' | uudecode &&
Xbegin 600 read.com
XMZ?0358OL@\3\5U;'1ORO&X-^!`-T%+CX&5#H>`N#Q`*X`@!0Z`D6@\0"O@``
XMZR2#_RYU"XM>!HM?`L8`(.L3 at _]A?`Z#_WI_"8M>!HM?`H``X$:+7@:+7P**
XM`)B+^(7_=<V+7@:+7P*`?P$Z=0Z*!P2_HD@"BUX&@T<"`N at 8`8M>!O]W`NA)
XM`H/$`HE&_H7`=1J+7@;_=P*X:AI0Z/8*@\0$N`$`4.B'%8/$`HM>_O]W%O]W
XM&/]W'O]W'(I'"RKD4%.X at AI0Z,P*@\0.BUX&BU\$@#\M=0:`?P$`=#&XK1I0
XMBUX&_W<$Z",*@\0$B4;\A<!U&HM>!O]W!+BO&E#HE`J#Q`2X`0!0Z"45@\0"
XM_W;^Z(L"@\0"Z`@#B_"+QCW__W0,_W;\4.C*"H/$!.OH_W;\Z`D+@\0"N```
XM4.CQ%(/$`EY?B^5=PP`)``(`58OLM`+K!56+[+0#4"ZA2P(N]R9)`HO(BT8$
XM]_&*Z#/2BT8$+O<V20*#P@&*RC/2+O<V2P**\BZ*%D@"6+`!BUX&S1.*Q#+D
XM7<-75K at B'E"X``!0Z*G_@\0$B_"%]G0/5K@``%"XUAI0Z#`)@\0&H"X>*N2+
XMR(;@*L"+R*`M'BKD"\&CTAJ at +QXJY*,B(J`Q'BKDB\B&X"K`B\B@,!XJY`O!
XMHR0BH#(>*N2C)B*@-!XJY(O(AN`JP(O(H#,>*N0+P:,H(J`Y'BKDB\B&X"K`
XMB\B at .!XJY`O!HRHBH#L>*N2+R(;@*L"+R*`Z'BKD"\&C20*@/1XJY(O(AN`J
XMP(O(H#P>*N0+P:-+`J`_'BKDB\B&X"K`B\B@/AXJY`O!HRPBH2HB]R8F(E"A
XM*"*Y!0#3X"O2]S;2&HO(6`/!`P8D(HO(H2PB`\B)#BXBOP``ZRR+Q_<FTAH%
XM,")0H20B`\=0Z)[^@\0$B_"%]G0/5O\V)"*XVQI0Z"4(@\0&1SL^*B)RSEY?
XMPU6+[(/$_E=6H=(:N04`T^`%,#2)1OZA*B+W)B8B`P8D(@,&+")(H]0:OP``
XMZ8T`H=(:N04`T^`%,#0[1OYW+/\&U!JX,#10_S;4&N at N_H/$!(OPA?9T#U;_
XM-M0:N.`:4.BU!X/$!L=&_C`T at WX$`'0KN`L`4/]V!/]V_N at 9$(/$!H7`=16+
XM7OZ*1PLJY*D>`'4(B\->7XOE7</K&XM>_HH'*N2+\(7V=`:!_N4`=0B+PUY?
XMB^5=PX-&_B!'.SXH(G,#Z6K_N```7E^+Y5W#58OL5HMV!(M$&J,0'8I$'9B9
XMN0@`T>#1TN+ZB\B+VHI$')B9"\$+TU!2BD0>F)F+R(O:DBO`B\B+VEI8"\$+
XMTU)0BD0?F)F2*\"Y"`#1X-'2XOJ+R(O:6%H+P0O3B18.':,,':'2&O<F(B(%
XM(AZC"AVX``"#/A`=`'4#N`$`7HOE7<.#/@X=`'4%@SX,'0!U!+C__\.ATAKW
XM)B(B!2(>.P8*'7<=QP8*'2(>_S80'>C/!(/$`O\V$!WH[`6#Q`*C$!V#!@P=
XM_X,6#AW_BQX*'?\&"AV*!RKDPU6+[(/$_E;_=@3H3/Z#Q`*)1OZ%P'1&B]B*
XM1PLJY*D!`'0(N```7HOE7<.+1QJC$!V%P'0CBS80'8O&4.B0!8/$`J,0';@`
XM`%!6Z,$%@\0$@3X0'?@/<MWH`07K+K@``%#H]?V#Q`*)1OZ%P'05O@``BUX$
XMB@"+7OZ(`$:#_ at M\\.L(N```7HOE7<.+7O['1QX``,=''```BU[^QT<:``"+
XM7O[&1PL at BU[^QT<8``"+7O['1Q8``+ at P-%#_-M0:Z!K\@\0$B_"%]G0/5O\V
XMU!JXY1I0Z)H%@\0&QP80'0``QP8.'0``QP8,'0``H=(:]R8B(@4B'J,*'8M&
XM_EZ+Y5W#58OL5J'2&O<F(B(%(AX[!@H==TB#/A`=`'0*_S80'>C?`X/$`HLV
XM$!U&ZP%&5NB=!(/$`H7`=?2#/A`=`'0-5O\V$!WHQ at 2#Q`3K!HM>!(EW&HDV
XM$!W'!@H=(AZ*1@:+'@H=B`?_!@H=@P8,'0&#%@X=`+@``%Z+Y5W#58OL5H,^
XM$!T`=05>B^5=PZ`,'8M>!(A''*$,'8L6#AVY"`#C!M'JT=CB^HM>!(A'':$,
XM'8L6#AV2*]*+7 at 2(1QZA#!V+%@X=DBO2N0@`T>K1V.+ZBUX$B$<?N#`T4/\V
XMU!KH^_J#Q`2+\(7V=`]6_S;4&KCK&E#H>P2#Q`;_-A`=Z`(#@\0"N/\/4/\V
XM$!WH``2#Q`3H2`->B^5=PU6+[(/$_E:^``#&A"(>`$:!_@`"?/2+1 at 2+T+$#
XMT^`KPHO8BH?R&BKDHTD"BH?S&BKDHTL"QP;2&@`"BH?U&BKDHRHBQP8D(@$`
XMQP8F(@(`BH?V&BKD]R;2&KD%`-/HHR at BBH?W&BKDHR(BQP8L(@``H2HB]R8F
XM(E"*A_8:*N2+R%@#P0,&)"(#!BPBHRXBQ at 8B'NO&!B,>/,8&)!Z0O@``NQ@;
XMB@"(A"4>1H/^"'SQH-(:HBT>H=(:AN`JY*(N'J`B(J(O'J`D(J(P'J$D(H;@
XM*N2B,1Z@)B*B,AZ@*"*B,QZA*"*&X"KDHC0>BT8$B]"Q`]/@*\*+V(J'\1HJ
XMY/<F20+W)DL"HC4>BH?Q&BKD]R9)`O<F2P*&X"KDHC8>BH?T&J(W'J`J(J(X
XM'J$J(H;@*N2B.1Z at 20*B.AZA20*&X"KDHCL>H$L"HCP>H4L"AN`JY*(]'J`L
XM(J(^'J$L(H;@*N2B/QZ^``"*A`T;B(1-'D:#_ at M\\K at B'E"X``!0Z$'Y@\0$
XMB_"%]G0/5K@``%"X(1M0Z,$"@\0&BT8$B]"Q`]/@*\*+V(J']!JB,"+&!C$B
XM_\8&,B+_O@,`ZP;&A#`B`$:ATAKW)BHB.\9W[^AR`>L&QH0P-`!&@?X``GST
XMQT;^,#2^``"*A`T;BU[^B`!&@_X+?/&+7O[&1PL(H2HB]R8F(@,&)"(#!BPB
XMH]0:N#`T4/\VU!KHJ?B#Q`2+\(7V=`]6_S;4&K at G&U#H*0*#Q`:^``"+7O[&
XM``!&@_X+?/2+7O[&1PL`_P;4&HM&!(O0L0/3X"O"B]B*A_8:*N0[!M0:=B6X
XM,#10_S;4&NA3^(/$!(OPA?9T#U;_-M0:N"T;4.C3`8/$!NN^7HOE7<-5B^R#
XMQ/Q75HMV!,=&_"(>B\9(2/<F(B(#!BXBB_#'1OX``.LF_W;\5N@!^(/$!(OX
XMA?]T#%=6N#,;4.B+`8/$!O]&_D:ATAH!1OR+1OX[!B(B<M%>7XOE7<-5B^R#
XMQ/Q75HMV!,=&_"(>B\9(2/<F(B(#!BXBB_#'1OX``.LF_W;\5NBN]X/$!(OX
XMA?]T#%=6N#@;4. at Q`8/$!O]&_D:ATAH!1OR+1OX[!B(B<M%>7XOE7<-75K\`
XM`.MCB\?W)M(:!3`B4*$D(@/'4.AF]X/$!(OPA?9T$5:A)"(#QU"X/AM0Z.0`
XM@\0&B\?W)M(:!3`B4*$D(@,&*B(#QU#H-?>#Q`2+\(7V=!56H20B`P8J(@/'
XM4+A$&U#HKP"#Q`9'.SXJ(G*77E_#58OL5HM&!(O0T>`#PM'HB]B*AS`B*N2+
XM\(J',2(JY(;@*L`+\/=&!`$`=`F+QKD$`-/HZP6+QB7_#UZ+Y5W#58OL5HM&
XM!(O0T>`#PM'HB]B*AS`B*N2+\(J',2(JY(;@*L`+\/=&!`$`=!*+1@:Y!`#3
XMX(O.@>$/``O!ZPZ+1 at 8E_P^+SH'A`/`+P8OPB\:(AS`BB\:&X"KDB(<Q(EZ+
XMY5W#58OL_W8(_W8&_W8$N$H;4.B9`(/$"+@!`%#H*@N#Q`*+Y5W#58OL5NAD
XM`HOPA?9U"+@``%Z+Y5W#5O]V!O]V!.@%`(/$!NOL58OL5U;_=@CH`@%9OG0;
XM@#P`=0_'!JP<`0"X``!>7XOE7</_=@96Z.\'@\0$A<!T!8/&!>O9_W0#_W8$
XMZ$0'@\0$B_B+QSW__W4%N```Z\V+QXM>"(A'!XM>",9'!@&+1 at CKN56+[(U&
XM!E#_=@2XK0Q0Z"4$@\0&B^5=PU6+[+BO&U#_=@3H!P"#Q`2+Y5W#58OL5U:+
XM=@2+?@:#_ at IU&5>X#0!0Z!L`@\0$/?__=0FX__]>7XOE7<-75N@%`(/$!.OP
XM58OL5HMV!HL$.T0"<A.+1 at 0E_P!05NBL`(/$!%Z+Y5W#BD8$4(L$_P2+V%B(
XM!Y at E_P#KZ%:^HAN+QH/#H"0!9@?ZF''+P7L-5B^Q75HMV!+\``(7V=0FX
XM__]>7XOE7<.`?`8`=$B*1`:8J00`=`VX__]05NA,`(/$!(OXBD0'F%#H%`I9
XM"_B*1`:8J0(`=`?_=`3HP`)9BD0&F*D@`'0._W0+Z"D*6?]T"^BI`EFX``#'
XM!```B40"B40$QD0&`(O'ZY=5B^Q75HMV!,<&UAPH#8I$!IBI$`!T";C__UY?
XMB^5=PXI$!IBI!`!T*XL\*WP$5_]T!(I$!YA0Z&P)@\0&.\=T$X!,!A"X``#'
XM!```B40"N/__Z\:#?@;_=1.`9`;[N```QP0``(E$`K@``.NM at WP$`'4%5NAF
XM`%F#?`D!=1ZX`0!0C48&4(I$!YA0Z!@)@\0&/0$`=:N+1@;I?O^+1`2)!`-$
XM"8E$`H!,!@2*1 at 90BP3_!(O86(@'F"7_`.E;_U:^HAN`?`8`=!"#Q at V!_J8<
XM<@6X``!>P^OJB\;K^%6+[(/$_E:+=@2*1`>84.AB"EF%P'02QT0)`0"+Q at 4(
XM`(E$!%Z+Y5W#N``$4.B(`%F)1OZ%P'3?QT0)``2`3`8"BT;^B40$Z]M5B^R#
XMQ/Q75HMV!(M$_B7^_XE&_BO&B4;\.T8&=@V+1@:)1OR+S@/(B4[^5N@^`5G_
XM=@;H.0!9B_B%_W0J._YT)O]V_%=6Z)T)@\0&.S84'7<5H10=.T;^<PVA$AV+
XM#A0=*\Z+V8D!B\=>7XOE7<-5B^R#Q/I75HM&!$!`0-'HT>")1 at 2#/A0=`'42
XMQP86'18=@0X6'0$`QP84'18=QT;Z``"+-A0=B7;^.S:F''5A_T;ZBT;Z/0$`
XM?E;'1OP`!/]V_.B&"5F+^(O'/?__=0FX``!>7XOE7<.+Q at 4"`#OX=`Z)/($,
XM`0#_3OS_3OR+]XO^`W[\B3S'!18=@0T!`(D^IAR+7OZ+!R7^_SO&=0*+\_<$
XM`0!U2HEV_HL$)?[_B_B+W_<'`0!U!HL%B03KZRO>B5[\.UX$<B@[7 at 1V$HO&
XM`T8$B02+V(L'HQ(=BQR)/XL$HQ0=@0P!`(O&!0(`Z7+_BP0E_O^+\.D__^EE
XM_U6+[%:+=@2#QO[W!`$`=0BX__]>B^5=PX$D_O^)-A0=N```Z^Y,;&A&3F]X
XM6'5D:7-C<&YE169G1R5S$7H1?A&!$7X1B!&1$8T1EA&;$9L1OQ+>$@,3!A.N
XM$J at 2KA*N$J at 2YA`P,3(S-#4V-S at Y86)C9&5F("UL;2!F:7)S=`!5B^R![%0!
XM5U;\BW8&QT;^``#&1O4`K#PE=!*$P'0%Z$<"Z^Z+1OY>7XOE7</&1O0 at QD;R
XM`,9&\P#'1OK__ZP\+74&@$[U".OU/"MU!L9&\BOKZSP@=0R`?O(`=>'&1O(@
XMZ]L\(W4&@$[U$.O1/#!U!<9&]#"LZ"<"A=)Y!O?:@$[U"(E6_#PN=0>LZ!("
XMB5;ZC,^.Q[]Q$+D5`/*N@>]R$-'G+O^EAA"`3O4!K.OF@$[U`JSKWX!.]02L
XMZ]BY"`#K$8!.]2"Y$`#K"+D*`.L#N0K_'@>+?@@FBP6#QP+V1O4"=`@FBQ6#
XMQP+K!RO2A.UT&IF$[705BF[RB&[SA=)Y"\9&\RWWVO?8@]H`B7X(@W[Z`'T%
XMQT;Z`0"U`(S7CL>-OL#^A=)U!(7`=",KVSO*=PY0B\(KTO?QB]A8]_'K`O?Q
XMA],NBI^P$$\FB!WKU?9&]1!T%8#Y"G00@/D0=0;&1O-XZP5/)L8%,(V.P/XK
XMSXM&^BO!B4;Z?@,I1OR)3OB`?O,`=`R`?O-X=0/_3OS_3OPI3OQ^&O9&]0AU
XM%(!^]#!U`^BM`(I&].B]`/]._'_UZ)\`_T[Z>`>P,.BK`.OT_T[X>`DFB at 5'
XMZ)T`Z_+_3OQX![`@Z)$`Z_3I-?Z`3O4@!""#1@@(C,B.P+_`$(-N_`KKS.B/
XM`%>P`+G___*N]]%).T[Z=@.+3OI?QT;Z``#I:O\>!XM^"":*!8/'`HE^"(B&
XMK/ZY`0",T([`C;ZL_L=&^@``Z47_Z=?]Z$@`BT;^)HD%]D;U`G0&)L=%`@``
XMZ;_]BD;SA,!T*SQX=0>P,.@&`+!XQD;S`/]&_O9&]2!T"CQA<@8\>G<"+"`&
XM*N10_U8$6`?#'@>+?@CV1O4$=0>+/8-&"`+#)L0]@T8(!,,\*G40'@>+?@@F
XMBQ6#QP*)?@BLPRO2M``\,'(5/#EW$2PPT>*+RM'BT>(#T0/0K.OGPU6+[/]V
XM!K@!`U#_=@3H!P"#Q`:+Y5W#58OL5U:+1 at 8E\P"+^`T`/8OX]T8&``)T`[\`
XM/+@``%#_=@17Z-8`@\0&B_"+QCW__W4<]T8&``%T$[@``%#_=@2X/`!0Z+4`
XM@\0&B_#K&_=&!@`$=!16Z(`#6<<&K!P3`+C__UY?B^5=PX/^`'PC]T8&``AT
XM$[@"`%"X``"Z``!24%;H;`.#Q`A6Z,D$68B$\!R+QNO.58OL_%97BW8$C-^.
XMQXM^!JVO=3^$P'0UA.1U].LO58OLBTX(B]'1Z?Q65XMV!(S?CL>+?@;C#JVO
XM=1B$P'0.A.3@]'0(]L(!=`.F=1,KP%]>7<.#[P*N=0>$P'3PBL2N&\!XZT#K
XMZ%6+[(M&!(3D=0*&X(#\"G(G5@:`_$=U"(M6"(MV!NL&BTX(BU8&S2&,P@=S
XM"*.L'+C__XO07EW#BU8&S2$E_P!=PP````"]``"%[74"C-TNC![U%(L>`@`K
XMW8'[`!!V#XV>`!",P"O8M$K-(;L`$([%)HP>NARQ!-/C)H,^[AP`=!<FH>H<
XMT>`FBQ[H'-/C.]AW`HO8@<,R-OJ.U8OC^X7;=0.[__\FB1ZV'":#/NX<`'0V
XM)HLV[!R+PT`FHZH<T^8#WG,#N___)HD>MAR#PP_3ZXS``]B,V"O8C,6.P+1*
XMS2%S!;#^Z:,`CL7\OPH=N3(V*\]!T>GC!"O`\ZN.!BP`*_^Y_W\FBB6`_#UT
XM%H3D=`3RKG3PB at Z``"KMOH$`N`$`ZPDKP*J+]XS'CM]0CL4FBSZJ'%?C"*R$
XMP'0#JN+X*L"JCMU'@>?^_XD^JAR)/K(<QP:T'#(V at S[N'`!U!(D^M!RAM!P#
XM!NH<H[0<C!ZN'(P.L!SH&0%R!>@V`.L-M`FZO!S-(;#]ZP)86+1,S2$N_R[S
XM%``````NCP9&%BZ/!D at 6'^@%`"[_+D865U;+N```PU6+[%=6BW8$N```4.B7
XM`EFB\!RX`0!0Z(P"6:+Q'+@"`%#H at 0)9HO(<BT8&T>!`0%#HD@)9HQH=N-@<
XMBQX:'<<'V!R+1@:C&!W1X(L^&AT#^(`\('0%@#P)=0-&Z_.`/`!T28DU1T?_
XM!A@=N`(`4.A4`ED]__]U&K at .`%"XV1Q0N`(`4.AT`(/$!KC(`%#H1O]91H`\
XM`'02B at 0\('0$/`EU!L8$`$;K`NOHZZ7'!0``_S8:'?\V&!WHY.F#Q`2X``!0
XMZ`<`65Y?B^5=PU6+[/\6UAS_=@3H_OY9B^5=P_C#58OLM#^+7 at 3K+E6+[+1`
XMBUX$ZR15B^RT/^L%58OLM$"+7 at 2`O_`<`'0.78#\/W0$_R8&'?\F!!V+5@:+
XM3 at C-(7,&HZP<N/__7<-5B^RT/HM>!,TA<PBCK!RX__]=PRO`7<-5B^RT0HI&
XM"HM6!HM."(M>!,TA<PBCK!RX__^+T%W#58OLM$&+5 at 3-(7,(HZP<N/__7<,K
XMP%W#58OL5[16BU8$C-^.QXM^!LTA7W,(HZP<N/__7<,KP%W#58OL5HLV,#:%
XM]G4PN`0!4+@<'5#_=@3H+/^#Q`:+\(7V=`^`O!L="G4(3J`('8B$&QW'!B`>
XM'!V)-C`V.W8(?@.+=@B%]G0.5O]V!O\V(![H=`"#Q`8!-B`>*38P-HO&7HOE
XM7<-5B^Q75HM^!HMV".LNB]]'@#\*=2:+QRM&!E#_=@;_=@3HQ_Z#Q`:X`0!0
XMN`D=4/]V!.BV_H/$!HE^!HO&3H7`=<L[?@9T$HO'*T8&4/]V!O]V!.B5_H/$
XM!HM&"%Y?B^5=PU6+[)S\5E>,WX['BW8$BWX&BTX(C,",VCO"=1<[_G0?<A']
XM`_D#\4].]L$!=`&D3T[K!O;!`70!I-'I=`+SI?Q?7IU=PU6+[(M>!+@`1,TA
XM<@_VPH!T"O;"`W0%N`$`7<,KP%W#58OL5XM&!(L^JAR%P'T&*_AR%NL$`\=R
XM$%#H%P!9A<!U`HO'7X7`7</'!JP<^/^X___K\%6+[(M&!$`D_CL&LAQR<(,^
XM[AP`=1B+W"L>ZAP[PW-?HZH<`P;J'*.T'"O`7<,[!K8<=PL[!JH<<@6CJASK
XMZU"+V+D$`-/K@>/_#X/#08'CP/]3!HS9`]F.!KH<*QZZ'+1*S2$'6UAR%J.J
XM'/?#`.!U#;D$`-/CB1ZV'"O`7</'!JP<^/^X__^%P%W#58OLB\0K1 at 2CZAQ=
XMPP!U<V%G93H@<F5A9"!D:7-K971T95]F:6QE(%MO=&AE<E]F:6QE?"U="D9I
XM;&5N86UE<R!M87D@:&%V92!L96%D:6YG($$Z($(Z(&]R"FEM8F5D9&5D('!E
XM<FEO9',L(&EN9&EC871I;F<@<W!A8V5S"@!.;R!M871C:"!F;W(@(B4Q,2XQ
XM,7,B"@!296%D:6YG(&9I;&4@(B4Q,2XQ,7,B("4P,G@@)6QD("4P-'@O)3`T
XM>`H`=P!#86YN;W0@;W!E;B!F:6QE("(E<R(@9F]R('=R:71I;F<*```"__]R
XM96%D`')E860`<F5A9`!W<FET90!W<FET90`H"0+]`@<"4`\"^0<.`5`)`OD#
XM!P)0$@+P"0X!37D at 1&ES:V5T=&5->6-R;V9T*@!W<FET90!W<FET90!W<FET
XM90!R96%D`'=R:71E`'=R:71E`'=R:71E`$-A;B=T("5S(&QO9VEC86P@<V5C
XM=&]R("5D+"!S=&%T=7,])3`R>`H``'(`````<BL``@!W```!`W<K``(#80``
XM`0EA*P`""7@```$%>"L``@4````````````````!```!`````````````0$`
XM`0````````````$"``$````````````!`P`!`````````````00``0``````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM`````````````````!8=%ATR-@```````````````/__```X,#@W+S at P,C at W
XM(&ES(')E<75I<F5D(0T*)&`6`%1O;R!M86YY(&%R9W,N```!``@``0``````
X7``````````````````````#^%V,8"@UM
X`
Xend
SHAR_EOF
$TOUCH -am 0815172890 read.com &&
chmod 0666 read.com ||
echo "restore of read.com failed"
set `wc -c read.com`;Wc_c=$1
if test "$Wc_c" != "7178"; then
echo original size 7178, current size $Wc_c
fi
# ============= write.c ==============
echo "x - extracting write.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > write.c &&
X/*
X** Test main program for MS-DOS diskette routines: delete file
X*/
X
X#include <stdio.h>
X
X#include "io.h"
X#include "msdos.h"
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[]; {
X register int i,j;
X directory *dp;
X FILE *f=stdin;
X
X if(argc!=3) {
X printf( "usage: write diskette_file [other_file|-]\n"
X "Diskette filename may have leading A: B: or\n"
X "imbedded periods, indicating spaces\n");
X exit(2);
X }
X
X if((*argv[2]!='-' || argv[2][1]) && (!(f=fopen(argv[2],"r")))) {
X printf("Cannot open file \"%s\" for reading\n",argv[2]);
X exit(1);
X }
X
X for(i=0; j=argv[1][i]; i++)
X if(j=='.')
X argv[1][i] = ' ';
X else if(j>='a' && j<='z')
X argv[1][i] -= 32;
X if(argv[1][1]==':') {
X drive_number = *argv[1]-'A';
X argv[1] += 2;
X }
X
X disk_open();
X
X if(dp=file_create(argv[1]))
X printf("Created file \"%s\"\n",argv[1]);
X else {
X printf("Could not create file \"%s\"\n",argv[1]);
X exit(1);
X }
X
X while((i=getc(f))!=EOF)
X file_putc(dp,i);
X
X file_close(dp);
X fclose(f);
X exit(0);
X}
SHAR_EOF
$TOUCH -am 0807043590 write.c &&
chmod 0666 write.c ||
echo "restore of write.c failed"
set `wc -c write.c`;Wc_c=$1
if test "$Wc_c" != "1030"; then
echo original size 1030, current size $Wc_c
fi
# ============= write.com ==============
echo "x - extracting write.com (Binary)"
sed 's/^X//' << 'SHAR_EOF' | uudecode &&
Xbegin 600 write.com
XMZ6 at 458OL@\3\5U;'1OP,'(-^!`-T%+AL&E#H[`N#Q`*X`@!0Z'T6@\0"BUX&
XMBU\$@#\M=0:`?P$`=#&XYQI0BUX&_W<$Z#D+@\0$B4;\A<!U&HM>!O]W!+CI
XM&E#HJ at N#Q`2X`0!0Z#L6@\0"O@``ZR2#_RYU"XM>!HM?`L8`(.L3 at _]A?`Z#
XM_WI_"8M>!HM?`H``X$:+7@:+7P**`)B+^(7_=<V+7@:+7P*`?P$Z=0Z*!P2_
XMHD`"BUX&@T<"`NC.`(M>!O]W`NBF`X/$`HE&_H7`=!*+7@;_=P*X#!M0Z"@+
XM@\0$ZQJ+7@;_=P*X'QM0Z!8+@\0$N`$`4.BG%8/$`O]V_.C_"8/$`HOPB\8]
XM__]T#%#_=O[H6`2#Q`3KXO]V_NC(!(/$`O]V_.B%"X/$`K@``%#H;16#Q`)>
XM7XOE7<,`"0`"`%6+[+0"ZP55B^RT`U`NH4,"+O<F00*+R(M&!/?QBN at STHM&
XM!"[W-D$"@\(!BLHSTB[W-D,"BO(NBA9``EBP`8M>!LT3BL0RY%W#5U:XC!Y0
XMN```4.BI_X/$!(OPA?9T#U:X``!0N$`;4. at P"8/$!J"8'BKDB\B&X"K`B\B@
XMEQXJY`O!HSP;H)D>*N2CC"*@FQXJY(O(AN`JP(O(H)H>*N0+P:..(J"<'BKD
XMHY`BH)X>*N2+R(;@*L"+R*"='BKD"\&CDB*@HQXJY(O(AN`JP(O(H*(>*N0+
XMP:.4(J"E'BKDB\B&X"K`B\B at I!XJY`O!HT$"H*<>*N2+R(;@*L"+R*"F'BKD
XM"\&C0P*@J1XJY(O(AN`JP(O(H*@>*N0+P:.6(J&4(O<FD")0H9(BN04`T^`K
XMTO<V/!N+R%@#P0,&CB*+R*&6(@/(B0Z8(K\``.LLB\?W)CP;!9HB4*&.(@/'
XM4.B>_H/$!(OPA?9T#U;_-HXBN$4;4. at E"(/$!D<[/I0B<LY>7\-5B^R#Q/Y7
XM5J$\&[D%`-/@!9HTB4;^H90B]R:0(@,&CB(#!I8B2*,^&[\``.F-`*$\&[D%
XM`-/@!9HT.T;^=RS_!CX;N)HT4/\V/AOH+OZ#Q`2+\(7V=`]6_S8^&[A*&U#H
XMM0>#Q`;'1OZ:-(-^!`!T*[@+`%#_=@3_=O[HE1"#Q`:%P'45BU[^BD<+*N2I
XM'@!U"(O#7E^+Y5W#ZQN+7OZ*!RKDB_"%]G0&@?[E`'4(B\->7XOE7<.#1OX@
XM1SL^DB)S`^EJ_[@``%Y?B^5=PU6+[%:+=@2+1!JC>AV*1!V8F;D(`-'@T=+B
XM^HO(B]J*1!R8F0O!"]-04HI$'IB9B\B+VI(KP(O(B]I:6`O!"]-24(I$'YB9
XMDBO`N0@`T>#1TN+ZB\B+VEA:"\$+TXD6>!VC=AVA/!OW)HPB!8P>HW0=N```
XM at SYZ'0!U`[@!`%Z+Y5W#@SYX'0!U!8,^=AT`=02X___#H3P;]R:,(@6,'CL&
XM=!UW'<<&=!V,'O\V>AWHSP2#Q`+_-GH=Z.P%@\0"HWH=@P9V'?^#%G@=_XL>
XM=!W_!G0=B@<JY,-5B^R#Q/Y6_W8$Z$S^@\0"B4;^A<!T1HO8BD<+*N2I`0!T
XM"+@``%Z+Y5W#BT<:HWH=A<!T(XLV>AV+QE#HD`6#Q`*C>AVX``!05NC!!8/$
XM!($^>AWX#W+=Z`$%ZRZX``!0Z/7]@\0"B4;^A<!T%;X``(M>!(H`BU[^B`!&
XM at _X+?/#K"+@``%Z+Y5W#BU[^QT<>``#'1QP``(M>_L='&@``BU[^QD<+((M>
XM_L='&```BU[^QT<6``"XFC10_S8^&^@:_(/$!(OPA?9T#U;_-CX;N$\;4.B:
XM!8/$!L<&>AT``,<&>!T``,<&=AT``*$\&_<FC"(%C!ZC=!V+1OY>B^5=PU6+
XM[%:A/!OW)HPB!8P>.P9T'7=(@SYZ'0!T"O\V>AWHWP.#Q`*+-GH=1NL!1E;H
XMG02#Q`*%P'7T at SYZ'0!T#5;_-GH=Z,8$@\0$ZP:+7 at 2)=QJ)-GH=QP9T'8P>
XMBD8&BQYT'8@'_P9T'8,&=AT!@Q9X'0"X``!>B^5=PU6+[%:#/GH=`'4%7HOE
XM7<.@=AV+7 at 2(1QRA=AV+%G@=N0@`XP;1ZM'8XOJ+7 at 2(1QVA=AV+%G@=DBO2
XMBUX$B$<>H78=BQ9X'9(KTKD(`-'JT=CB^HM>!(A''[B:-%#_-CX;Z/OZ@\0$
XMB_"%]G0/5O\V/ANX51M0Z'L$@\0&_S9Z'>@"`X/$`KC_#U#_-GH=Z``$@\0$
XMZ$@#7HOE7<-5B^R#Q/Y6O@``QH2,'@!&@?X``GSTBT8$B]"Q`]/@*\*+V(J'
XM7!LJY*-!`HJ'71LJY*-#`L<&/!L``HJ'7QLJY*.4(L<&CB(!`,<&D"("`(J'
XM8!LJY/<F/!NY!0#3Z*.2(HJ'81LJY*.,(L<&EB(``*&4(O<FD")0BH=@&RKD
XMB\A8`\$#!HXB`P:6(J.8(L8&C![KQ@:-'CS&!HX>D+X``+N"&XH`B(2/'D:#
XM_ at A\\:`\&Z*7'J$\&X;@*N2BF!Z at C"*BF1Z at CB*BFAZACB*&X"KDHIL>H)`B
XMHIP>H)(BHIT>H9(BAN`JY**>'HM&!(O0L0/3X"O"B]B*AUL;*N3W)D$"]R9#
XM`J*?'HJ'6QLJY/<F00+W)D,"AN`JY**@'HJ'7ANBH1Z at E"*BHAZAE"*&X"KD
XMHJ,>H$$"HJ0>H4$"AN`JY**E'J!#`J*F'J%#`H;@*N2BIQZ at EB*BJ!ZAEB*&
XMX"KDHJD>O@``BH1W&XB$MQY&@_X+?/*XC!Y0N```4.A!^8/$!(OPA?9T#U:X
XM``!0N(L;4.C!`H/$!HM&!(O0L0/3X"O"B]B*AUX;HIHBQ@:;(O_&!IPB_[X#
XM`.L&QH2:(@!&H3P;]R:4(CO&=^_H<@'K!L:$FC0`1H'^``)\],=&_IHTO@``
XMBH1W&XM>_H@`1H/^"WSQBU[^QD<+"*&4(O<FD"(#!HXB`P:6(J,^&[B:-%#_
XM-CX;Z*GX@\0$B_"%]G0/5O\V/ANXD1M0Z"D"@\0&O@``BU[^Q@``1H/^"WST
XMBU[^QD<+`/\&/AN+1 at 2+T+$#T^`KPHO8BH=@&RKD.P8^&W8EN)HT4/\V/AOH
XM4_B#Q`2+\(7V=`]6_S8^&[B7&U#HTP&#Q`;KOEZ+Y5W#58OL@\3\5U:+=@3'
XM1OR,'HO&2$CW)HPB`P:8(HOPQT;^``#K)O]V_%;H`?B#Q`2+^(7_=`Q75KB=
XM&U#HBP&#Q`;_1OY&H3P;`4;\BT;^.P:,(G+17E^+Y5W#58OL@\3\5U:+=@3'
XM1OR,'HO&2$CW)HPB`P:8(HOPQT;^``#K)O]V_%;HKO>#Q`2+^(7_=`Q75KBB
XM&U#H,0&#Q`;_1OY&H3P;`4;\BT;^.P:,(G+17E^+Y5W#5U:_``#K8XO']R8\
XM&P6:(E"ACB(#QU#H9O>#Q`2+\(7V=!%6H8XB`\=0N*@;4.CD`(/$!HO']R8\
XM&P6:(E"ACB(#!I0B`\=0Z#7W@\0$B_"%]G055J&.(@,&E"(#QU"XKAM0Z*\`
XM@\0&1SL^E")REUY?PU6+[%:+1 at 2+T-'@`\+1Z(O8BH>:(BKDB_"*AYLB*N2&
XMX"K`"_#W1 at 0!`'0)B\:Y!`#3Z.L%B\8E_P]>B^5=PU6+[%:+1 at 2+T-'@`\+1
XMZ(O8BH>:(BKDB_"*AYLB*N2&X"K`"_#W1 at 0!`'02BT8&N00`T^"+SH'A#P`+
XMP>L.BT8&)?\/B\Z!X0#P"\&+\(O&B(>:(HO&AN`JY(B'FR)>B^5=PU6+[/]V
XM"/]V!O]V!+BT&U#H%0&#Q`BX`0!0Z*8+@\0"B^5=PU6+[%=6BW8$BP0[1`)R
XM7XI$!IBI&`!T";C__UY?B^5=PX!D!ON#?`0`=056Z-8"6?]T"?]T!(I$!YA0
XMZ(D+@\0&B_B+QST``'\:BD0&F(O(N!``A?]U`[@(``O!B$0&N/__Z[>+1`2)
XM!`/'B40"BP3_!(O8B@>8)?\`ZY]5B^Q6Z&0"B_"%]G4(N```7HOE7<-6_W8&
XM_W8$Z`4`@\0&Z^Q5B^Q75O]V".@"`5F^WAN`/`!U#\<&%AT!`+@``%Y?B^5=
XMP_]V!E;H[P>#Q`2%P'0%@\8%Z]G_=`/_=@3H1`>#Q`2+^(O'/?__=06X``#K
XMS8O'BUX(B$<'BUX(QD<&`8M&".NY58OLC48&4/]V!+ at A#5#H)02#Q`:+Y5W#
XM58OLN!D<4/]V!.@'`(/$!(OE7<-5B^Q75HMV!(M^!H/^"G495[@-`%#H&P"#
XMQ`0]__]U";C__UY?B^5=PU=6Z`4`@\0$Z_!5B^Q6BW8&BP0[1`)R$XM&!"7_
XM`%!6Z*P`@\0$7HOE7<.*1 at 10BP3_!(O86(@'F"7_`.OH5KX,'(O&@\8-4.@)
XM`%F!_A`=<O!>PU6+[%=6BW8$OP``A?9U";C__UY?B^5=PX!\!@!T2(I$!IBI
XM!`!T#;C__U!6Z$P`@\0$B_B*1`>84. at 4"ED+^(I$!IBI`@!T!_]T!.C``EF*
XM1`:8J2``=`[_=`OH*0I9_W0+Z*D"6;@``,<$``")1`*)1`3&1`8`B\?KEU6+
XM[%=6BW8$QP9`'9P-BD0&F*D0`'0)N/__7E^+Y5W#BD0&F*D$`'0KBSPK?`17
XM_W0$BD0'F%#H;`F#Q`8[QW03@$P&$+@``,<$``")1`*X___KQH-^!O]U$X!D
XM!ONX``#'!```B40"N```ZZV#?`0`=056Z&8`68-\"0%U'K@!`%"-1 at 90BD0'
XMF%#H&`F#Q`8]`0!UJXM&!NE^_XM$!(D$`T0)B40"@$P&!(I&!E"+!/\$B]A8
XMB`>8)?\`Z5O_5KX,'(!\!@!T$(/'^$!UR!;@``%[#Z^J+QNOX58OL@\3^
XM5HMV!(I$!YA0Z&(*687`=!+'1`D!`(O&!0@`B40$7HOE7<.X``10Z(@`68E&
XM_H7`=-_'1`D`!(!,!@*+1OZ)1`3KVU6+[(/$_%=6BW8$BT3^)?[_B4;^*\:)
XM1OP[1 at 9V#8M&!HE&_(O.`\B)3OY6Z#X!6?]V!N at Y`%F+^(7_="H[_G0F_W;\
XM5U;HG0F#Q`8[-GX==Q6A?AT[1OYS#:%\'8L.?ATKSHO9B0&+QUY?B^5=PU6+
XM[(/$^E=6BT8$0$!`T>C1X(E&!(,^?AT`=1+'!H`=@!V!#H`=`0#'!GX=@!W'
XM1OH``(LV?AV)=OX[-A`==6'_1OJ+1OH]`0!^5L=&_``$_W;\Z(8)68OXB\<]
XM__]U";@``%Y?B^5=PXO&!0(`._AT#HD\@0P!`/]._/]._(OWB_X#?OR)/,<%
XM@!V!#0$`B3X0'8M>_HL')?[_.\9U`HOS]P0!`'5*B7;^BP0E_O^+^(O?]P<!
XM`'4&BP6)!.OK*]Z)7OP[7 at 1R*#M>!'82B\8#1 at 2)!(O8BP>C?!V+'(D_BP2C
XM?AV!#`$`B\8%`@#I<O^+!"7^_XOPZ3__Z67_58OL5HMV!(/&_O<$`0!U"+C_
XM_UZ+Y5W#@23^_XDV?AVX``#K[DQL:$9.;WA8=61I<V-P;F5%9F=')><1[A'R
XM$?41\A'\$042`1(*$@\2#Q(S$U(3=Q-Z$R(3'!,B$R(3'!-:$3`Q,C,T-38W
XM.#EA8F-D968 at +6QM(&9I<G-T`%6+[('L5`%75OR+=@;'1OX``,9&]0"L/"5T
XM$H3`=`7H1P+K[HM&_EY?B^5=P\9&]"#&1O(`QD;S`,=&^O__K#PM=0:`3O4(
XMZ_4\*W4&QD;R*^OK/"!U#(!^\@!UX<9&\B#KVSPC=0:`3O40Z]$\,'4%QD;T
XM,*SH)P*%TGD&]]J`3O4(B5;\/"YU!ZSH$@*)5OJ,SX['O^40N14`\JZ![^80
XMT><N_Z7Z$(!.]0&LZ^:`3O4"K.O?@$[U!*SKV+D(`.L1@$[U(+D0`.L(N0H`
XMZP.Y"O\>!XM^"":+!8/'`O9&]0)T"":+%8/'`NL'*]*$[70:F83M=!6*;O*(
XM;O.%TGD+QD;S+??:]]B#V@")?@B#?OH`?07'1OH!`+4`C->.QXV^P/Z%TG4$
XMA<!T(RO;.\IW#E"+PBO2]_&+V%CW\>L"]_&'TRZ*GR013R:('>O5]D;U$'05
XM@/D*=!"`^1!U!L9&\WCK!4\FQ at 4PC8[`_BO/BT;Z*\&)1OI^`RE&_(E.^(!^
XM\P!T#(!^\WAU`_]._/]._"E._'X:]D;U"'44@'[T,'4#Z*T`BD;TZ+T`_T[\
XM?_7HGP#_3OIX![`PZ*L`Z_3_3OAX"2:*!4?HG0#K\O]._'@'L"#HD0#K].DU
XM_H!.]2`$((-&"`B,R([`OS01 at V[\"NO,Z(\`5[``N?__\J[WT4D[3OIV`XM.
XM^E_'1OH``.EJ_QX'BWX()HH%@\<"B7X(B(:L_KD!`(S0CL"-OJS^QT;Z``#I
XM1?_IU_WH2`"+1OXFB07V1O4"=`8FQT4"``#IO_V*1O.$P'0K/'AU![`PZ`8`
XML'C&1O,`_T;^]D;U('0*/&%R!CQZ=P(L(`8JY%#_5 at 18!\,>!XM^"/9&]01U
XM!XL]@T8(`L,FQ#V#1@@$PSPJ=1`>!XM^"":+%8/'`HE^"*S#*]*T`#PP<A4\
XM.7<1+##1XHO*T>+1X@/1`]"LZ^?#58OL_W8&N`$#4/]V!.@'`(/$!HOE7<-5
XMB^Q75HM&!B7S`(OX#0`]B_CW1 at 8``G0#OP`\N```4/]V!%?HU@"#Q`:+\(O&
XM/?__=1SW1 at 8``703N```4/]V!+@\`%#HM0"#Q`:+\.L;]T8&``1T%%;H@`-9
XMQP86'1,`N/__7E^+Y5W#@_X`?"/W1 at 8`"'03N`(`4+@``+H``%)05NAL`X/$
XM"%;HR019B(1:'8O&Z\Y5B^S\5E>+=@2,WX['BWX&K:]U/X3`=#6$Y'7TZR]5
XMB^R+3 at B+T='I_%97BW8$C-^.QXM^!N,.K:]U&(3`=`Z$Y.#T=`CVP@%T`Z9U
XM$RO`7UY=PX/O`JYU!X3`=/"*Q*X;P'CK0.OH58OLBT8$A.1U`H;@@/P*<B=6
XM!H#\1W4(BU8(BW8&ZP:+3 at B+5@;-(8S"!W,(HQ8=N/__B]!>7<.+5@;-(27_
XM`%W#`````+T``(7M=0*,W2Z,'FD5BQX"`"O=@?L`$'8/C9X`$(S`*]BT2LTA
XMNP`0CL4FC!XD';$$T^,F at SY8'0!T%R:A5!W1X":+'E(=T^,[V'<"B]B!PYPV
XM^H[5B^/[A=MU`[O__R:)'B`=)H,^6!T`=#8FBS96'8O#0":C%!W3Y@/><P.[
XM__\FB1X@'8/##]/KC,`#V(S8*]B,Q8[`M$K-(7,%L/[IHP".Q?R_=!VYG#8K
XMST'1Z>,$*\#SJXX&+``K_[G_?R:*)8#\/706A.1T!/*N=/"*#H``*NV^@0"X
XM`0#K"2O`JHOWC,>.WU".Q2:+/A0=5^,(K(3`=`.JXO at JP*J.W4>!Y_[_B3X4
XM'8D^'!W'!AX=G#:#/E@=`'4$B3X>':$>'0,&5!VC'AV,'A@=C`X:'>@9`7(%
XMZ#8`ZPVT";HF'<TAL/WK`EA8M$S-(2[_+F<5`````"Z/!KH6+H\&O!8?Z`4`
XM+O\NNA975LNX``##58OL5U:+=@2X``!0Z)<"6:):';@!`%#HC`)9HEL=N`(`
XM4.B!`EFB7!V+1@;1X$!`4.B2`EFCA!VX0AV+'H0=QP="'8M&!J."'='@BSZ$
XM'0/X@#P@=`6`/`EU`T;K\X`\`'1)B35'1_\&@AVX`@!0Z%0"63W__W4:N`X`
XM4+A#'5"X`@!0Z'0`@\0&N,@`4.A&_UE&@#P`=!**!#P@=`0\"74&Q at 0`1NL"
XMZ^CKI<<%``#_-H0=_S:"'>APZ8/$!+@``%#H!P!97E^+Y5W#58OL_Q9`'?]V
XM!.C^_EF+Y5W#^,-5B^RT/XM>!.LN58OLM$"+7 at 3K)%6+[+0_ZP55B^RT0(M>
XM!("_6AT`=`Y=@/P_=`3_)G`=_R9N'8M6!HM.",TA<P:C%AVX__]=PU6+[+0^
XMBUX$S2%S"*,6';C__UW#*\!=PU6+[+1"BD8*BU8&BTX(BUX$S2%S"*,6';C_
XM_XO07<-5B^RT08M6!,TA<PBC%AVX__]=PRO`7<-5B^Q7M%:+5 at 2,WX['BWX&
XMS2%?<PBC%AVX__]=PRO`7<-5B^Q6BS::-H7V=3"X!`%0N(8=4/]V!. at L_X/$
XM!HOPA?9T#X"\A1T*=0A.H'(=B(2%'<<&BAZ&'8DVFC8[=@A^`XMV"(7V=`Y6
XM_W8&_S:*'NAT`(/$!@$VBAXI-IHVB\9>B^5=PU6+[%=6BWX&BW8(ZRZ+WT>`
XM/PIU)HO'*T8&4/]V!O]V!.C'_H/$!K@!`%"X<QU0_W8$Z+;^@\0&B7X&B\9.
XMA<!URSM^!G02B\<K1 at 90_W8&_W8$Z)7^@\0&BT8(7E^+Y5W#58OLG/Q65XS?
XMCL>+=@2+?@:+3 at B,P(S:.\)U%SO^=!]R$?T#^0/Q3T[VP0%T`:1/3NL&]L$!
XM=`&DT>ET`O.E_%]>G5W#58OLBUX$N`!$S2%R#_;"@'0*]L(#=`6X`0!=PRO`
XM7<-5B^Q7BT8$BSX4'87`?08K^'(6ZP0#QW(04. at 7`%F%P'4"B\=?A<!=P\<&
XM%AWX_[C__^OP58OLBT8$0"3^.P8<'7)P at SY8'0!U&(O<*QY4'3O#<U^C%!T#
XM!E0=HQX=*\!=PSL&(!UW"SL&%!UR!:,4'>OK4(O8N00`T^N!X_\/@\-!@>/`
XM_U,&C-D#V8X&)!TK'B0=M$K-(0=;6'(6HQ0=]\,`X'4-N00`T^.)'B`=*\!=
XMP\<&%AWX_[C__X7`7<-5B^R+Q"M&!*-4'5W#`'5S86=E.B!W<FET92!D:7-K
XM971T95]F:6QE(%MO=&AE<E]F:6QE?"U="D1I<VME='1E(&9I;&5N86UE(&UA
XM>2!H879E(&QE861I;F<@03H at 0CH@;W(*:6UB961D960@<&5R:6]D<RP@:6YD
XM:6-A=&EN9R!S<&%C97,*`'(`0V%N;F]T(&]P96X at 9FEL92`B)7,B(&9O<B!R
XM96%D:6YG"@!#<F5A=&5D(&9I;&4@(B5S(@H`0V]U;&0@;F]T(&-R96%T92!F
XM:6QE("(E<R(*`````O__<F5A9`!R96%D`')E860`=W)I=&4`=W)I=&4`*`D"
XM_0('`E`/`OD'#@%0"0+Y`P<"4!("\`D.`4UY($1I<VME='1E37EC<F]F="H`
XM=W)I=&4`=W)I=&4`=W)I=&4`<F5A9`!W<FET90!W<FET90!W<FET90!#86XG
XM="`E<R!L;V=I8V%L('-E8W1O<B`E9"P@<W1A='5S/24P,G@*``!R`````'(K
XM``(`=P```0-W*P`"`V$```$)82L``@EX```!!7 at K``(%````````````````
XM`0```0````````````$!``$````````````!`@`!`````````````0,``0``
XM``````````$$``$`````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM````````````````````````````````````````````````````````````
XM``````````````````````````````````````"`'8`=G#8`````````````
XM``#__P``.#`X-R\X,#(X-R!I<R!R97%U:7)E9"$-"B34%@!4;V\@;6%N>2!A
XG<F=S+@```0`(``$`````````````````````````````<AC7&`H-
X`
Xend
SHAR_EOF
$TOUCH -am 0815172890 write.com &&
chmod 0666 write.com ||
echo "restore of write.com failed"
set `wc -c write.com`;Wc_c=$1
if test "$Wc_c" != "7284"; then
echo original size 7284, current size $Wc_c
fi
exit 0
--
/* * * Otto J. Makela <otto at jyu.fi> * * * * * * * * * * * * * * * * * * */
/* Phone: +358 41 613 847, BBS: +358 41 211 562 (CCITT, Bell 24/12/300) */
/* Mail: Kauppakatu 1 B 18, SF-40100 Jyvaskyla, Finland, EUROPE */
/* * * Computers Rule 01001111 01001011 * * * * * * * * * * * * * * * * */
More information about the Alt.sources
mailing list