otto@tukki.jyu.fi (Otto J. Makela) (11/22/90)
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@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.@5 XM"X/$!D:#_@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@3W\8KH,]*+1@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@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@S!PJY`O! XMH[H!H,\<*N2+R(;@*L"+R*#.'"KD"\&CO""ANB#W)K8@4*&X(+D%`-/@*]+W XM-HX9B\A8`\$#!K0@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@+P0O34E"*1!^8F9(K XMP+D(`-'@T=+B^HO(B]I86@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_@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@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@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@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@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@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@HL`<H;0@AN`JY*+!'*"V(*+" XM'*"X(*+#'*&X((;@*N2BQ!R+1@2+T+$#T^`KPHO8BH>M&2KD]R:X`?<FN@&B XMQ1R*AZT9*N3W)K@!]R:Z`8;@*N2BQAR*A[`9HL<<H+H@HL@<H;H@AN`JY*+) XM'*"X`:+*'*&X`8;@*N2BRQR@N@&BS!RAN@&&X"KDHLT<H+P@HLX<H;P@AN`J XMY*+/'+X``(J$R1F(A-T<1H/^"WSRN+(<4+@``%#H0?F#Q`2+\(7V=`]6N``` XM4+C=&5#HP0*#Q`:+1@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(`$:#_@M\\8M>_L9'"PBANB#W)K8@`P:T(`,&O""CD!FXP#)0_S:0 XM&>BI^(/$!(OPA?9T#U;_-I`9N.,94.@I`H/$!KX``(M>_L8``$:#_@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.@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.@2"H/$!HOXB\<]``!_&HI$ XM!IB+R+@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@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.@E"5D+^(I$!IBI`@!T!_]T!.C``EF*1`:8J2``=`[_=`OH.@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@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@9V#8M&!HE&_(O.`\B) XM3OY6Z#X!6?]V!N@Y`%F+^(7_="H[_G0F_W;\5U;HK@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@1R XM*#M>!'82B\8#1@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@+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@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@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@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@Z``"KMOH$`N`$`ZPDKP*J+]XS'CM]0CL4FBSXZ&U?C"*R$P'0#JN+X XM*L"JCMU'@>?^_XD^.AN)/D(;QP9$&\(T@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'^@%`"[_+@455U;+N```PU6+[%=6BW8$N```4.B7`EFB@!NX XM`0!0Z(P"6:*!&[@"`%#H@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@.`%"X:1M0N`(`4.AT`(/$!KC(`%#H1O]91H`\`'02B@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@3K+E6+[+1`BUX$ZR15 XMB^RT/^L%58OLM$"+7@2`OX`;`'0.78#\/W0$_R:6&_\FE!N+5@:+3@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@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@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,@9&ES:V5T=&4@*'1Y<&4@)60I"D%L;"!F:6QE XM<R!O;B!T:&4@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@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@_]A?`Z#_WI_"8M>!HM?`H``X$:+7@:+7P** XM`)B+^(7_=<V+7@:+7P*`?P$Z=0Z*!P2_HD@"BUX&@T<"`N@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@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@B'E"X``!0Z*G_@\0$B_"%]G0/5K@``%"XUAI0Z#`)@\0&H"X>*N2+ XMR(;@*L"+R*`M'BKD"\&CTAJ@+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@.!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@N_H/$!(OPA?9T#U;_ XM-M0:N.`:4.BU!X/$!L=&_C`T@WX$`'0KN`L`4/]V!/]V_N@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(`$:#_@M\\.L(N```7HOE7<.+7O['1QX``,=''```BU[^QT<:``"+ XM7O[&1PL@BU[^QT<8``"+7O['1Q8``+@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@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@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@2+T+$# XMT^`KPHO8BH?R&BKDHTD"BH?S&BKDHTL"QP;2&@`"BH?U&BKDHRHBQP8D(@$` XMQP8F(@(`BH?V&BKD]R;2&KD%`-/HHR@BBH?W&BKDHR(BQP8L(@``H2HB]R8F XM(E"*A_8:*N2+R%@#P0,&)"(#!BPBHRXBQ@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@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:#_@M\\K@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@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.@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@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@CKN56+[(U& XM!E#_=@2XK0Q0Z"4$@\0&B^5=PU6+[+BO&U#_=@3H!P"#Q`2+Y5W#58OL5U:+ XM=@2+?@:#_@IU&5>X#0!0Z!L`@\0$/?__=0FX__]>7XOE7<-75N@%`(/$!.OP XM58OL5HMV!HL$.T0"<A.+1@0E_P!05NBL`(/$!%Z+Y5W#BD8$4(L$_P2+V%B( XM!Y@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@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@90BP3_!(O86(@'F"7_`.E;_U:^HAN`?`8`=!"#Q@V!_J8< XM<@6X``!>P^OJB\;K^%6+[(/$_E:+=@2*1`>84.AB"EF%P'02QT0)`0"+Q@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@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@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@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@2KA*N$J@2YA`P,3(S-#4V-S@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@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@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@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@Z``"KMOH$`N`$`ZPDKP*J+]XS'CM]0CL4FBSZJ'%?C"*R$ XMP'0#JN+X*L"JCMU'@>?^_XD^JAR)/K(<QP:T'#(V@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@6'^@%`"[_+D865U;+N```PU6+[%=6BW8$N```4.B7 XM`EFB\!RX`0!0Z(P"6:+Q'+@"`%#H@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@.`%"XV1Q0N`(`4.AT`(/$!KC(`%#H1O]91H`\ XM`'02B@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@3K+E6+[+1` XMBUX$ZR15B^RT/^L%58OLM$"+7@2`O_`<`'0.78#\/W0$_R8&'?\F!!V+5@:+ XM3@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@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@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@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@P,C@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@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@N#Q`2X`0!0Z#L6@\0"O@``ZR2#_RYU"XM>!HM?`L8`(.L3@_]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@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.@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@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.@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@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@_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@SYZ'0!T#5;_-GH=Z,8$@\0$ZP:+7@2)=QJ)-GH=QP9T'8P> XMBD8&BQYT'8@'_P9T'8,&=AT!@Q9X'0"X``!>B^5=PU6+[%:#/GH=`'4%7HOE XM7<.@=AV+7@2(1QRA=AV+%G@=N0@`XP;1ZM'8XOJ+7@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_@A\\:`\&Z*7'J$\&X;@*N2BF!Z@C"*BF1Z@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@E"*BHAZAE"*&X"KD XMHJ,>H$$"HJ0>H4$"AN`JY**E'J!#`J*F'J%#`H;@*N2BIQZ@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@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@2+T-'@`\+1Z(O8BH>:(BKDB_"*AYLB*N2& XMX"K`"_#W1@0!`'0)B\:Y!`#3Z.L%B\8E_P]>B^5=PU6+[%:+1@2+T-'@`\+1 XMZ(O8BH>:(BKDB_"*AYLB*N2&X"K`"_#W1@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!+@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@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.@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@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@9V#8M&!HE&_(O.`\B)3OY6Z#X!6?]V!N@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@1R*#M>!'82B\8#1@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@+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@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@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@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@8``G0#OP`\N```4/]V!%?HU@"#Q`:+\(O& XM/?__=1SW1@8``703N```4/]V!+@\`%#HM0"#Q`:+\.L;]T8&``1T%%;H@`-9 XMQP86'1,`N/__7E^+Y5W#@_X`?"/W1@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@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@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@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@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@0`1NL" XMZ^CKI<<%``#_-H0=_S:"'>APZ8/$!+@``%#H!P!97E^+Y5W#58OL_Q9`'?]V XM!.C^_EF+Y5W#^,-5B^RT/XM>!.LN58OLM$"+7@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@2,WX['BWX& XMS2%?<PBC%AVX__]=PRO`7<-5B^Q6BS::-H7V=3"X!`%0N(8=4/]V!.@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@90_W8&_W8$Z)7^@\0&BT8(7E^+Y5W#58OLG/Q65XS? XMCL>+=@2+?@:+3@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.@7`%F%P'4"B\=?A<!=P\<& XM%AWX_[C__^OP58OLBT8$0"3^.P8<'7)P@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@0CH@;W(*:6UB961D960@<&5R:6]D<RP@:6YD XM:6-A=&EN9R!S<&%C97,*`'(`0V%N;F]T(&]P96X@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@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@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 * * * * * * * * * * * * * * * * */