[comp.sources.amiga] v90i268: deadalloc 1.23 - allocate ``dead tracks'', Part01/01

amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (10/09/90)

Submitted-by: ins425v@monu4.cc.monash.edu.au (mr  t.h. mackenzie)
Posting-number: Volume 90, Issue 268
Archive-name: util/deadalloc-1.23/part01

[ uuencoded executable enclosed  ...tad ]

This is a program which allocates dead tracks on amiga OFS floppys and
creates a file to stop their deallocation.  Source/Docs/Binaries included.
Compiles under DICE.  This is my origional work. 


#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  DeadAlloc.doc DeadAlloc.uu Deadalloc.c
# Wrapped by tadguy@abcfd20 on Mon Oct  8 19:47:33 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'DeadAlloc.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'DeadAlloc.doc'\"
else
echo shar: Extracting \"'DeadAlloc.doc'\" \(2948 characters\)
sed "s/^X//" >'DeadAlloc.doc' <<'END_OF_FILE'
X
XDeadAlloc - A program for allocating dead tracks on AmigaDos [OFS] floppys.
X
X(c) Tim MacKenzie.
X13/8/90.
X
X---------------------------------------------------------------------
XThis program may be freely redistributed and modified as long as this 
Xcopyright message remains intact and such activity is not for profit.
XThe author (thats me) takes no responsibility for any damage/loss/&c
Xresulting from the use/misuse of this program.
X----------------------------------------------------------------------
X
X
XEveryone (well nearly) has a few disks which have a few dead tracks on them
Xmaking them (the disks) quite useless to AmigaDos when you try to write 
Xto them.  IbM owners dont worry about this as their OS kindly allocates
Xthese tracks and continues on it's merry way (It's only a simple minded
Xsystem so it's allowed to be _merry_).  AmigaDos is not quite so kind, 
Xso here is this program to do the allocation for you.
X
XThis program creates a file "...dead" which contains all of the 
Xdead/unusable tracks on a floppy.  This allows the floppy to be used 
Xnormally for data, programs etc.  The program does not recover tracks, 
Xit just tells the file system that they are allocated and are hence not
Xused for 'useful' data.  Creation of the file "...dead" stops the tracks
Xbeing deallocated when the disk is re-validated after a crash &c.
X
XTo use:
X	DeadAlloc [df?:] [-n] [-m]
X
X	:- df? selects the drive to operate on. [default is df1:]
X	:- -m stops the program from creating the file.
X	:- -n allows the program to doubly allocate tracks. ie. It will 
X			reallocate tracks (This is not a good idea)
X
X	DeadAlloc ? 
X		Will display the options.
X
XNotes:
X	1: It is a good idea to use the program on empty disks. This prevents
X		the situation of reallocating a block which belongs to an
X		existing file.
X	2: The file created has no delete privaliges. To delete it you must 
X		change it's protection with 'protect ...Dead +d'
X	3: The program will exit if a '...Dead' file already exists.
X	4: If you reallocate blocks then delete both files which have a claim
X		to that block then you will receive a 'Disk corrupt' message.
X	5: Sometimes the disk checker will not pick up a dead track. In this 
X		case you should delete the '...Dead' file and retry.
X	6: The source compiles with DICE. Manx/Lattice users need to change
X		the #includes and include Open/Close Library routines
X		!!thanx Matt!!.
X	7: A disk with tracks 40 or 0 dead may be unrecoverable/unuseable.
X	8: If you use the program on disks with existing files and it informs
X		you that a block is already allocated then no file will be
X		created and no blocks allocated.  You must remove the
X		offending file and retry.
X
X
XMy Address.
X	Tim MacKenzie.
X	36 Alexander Ave
X	Upwey, Victoria.
X	AUSTRALIA. 3158.
X
XInternet: ins425v@monu4.cc.monash.edu.au  (til Nov '90)
X          ins425v@monu3.cc.monash.edu.au  ( ----"----)
X
XAny Donations, suggestions, thanx, Fan mail, flames etc are most welcome :-}
END_OF_FILE
if test 2948 -ne `wc -c <'DeadAlloc.doc'`; then
    echo shar: \"'DeadAlloc.doc'\" unpacked with wrong size!
fi
# end of 'DeadAlloc.doc'
fi
if test -f 'DeadAlloc.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'DeadAlloc.uu'\"
else
echo shar: Extracting \"'DeadAlloc.uu'\" \(15756 characters\)
sed "s/^X//" >'DeadAlloc.uu' <<'END_OF_FILE'
Xbegin 666 DeadAlloc
XM```#\P`````````"``````````$```EW```"40```^D```EW2.<_/BQY````)
XM!"1/+P@O`#`\``!G5"`\```!`-"\```!4>6`4(`J`"(\``$``$ZN_SI*@&8(J
XM+DIP_V```,8@0$*8(,5)Z'_^1^C_^$/Y`````"`\```!46`"(-E1R/_\D+P`E
XM`0``9/)@#$GY`````$GL?_Z7RT'L@`(@/````5'E@-'`(#P```$`<@!@`B#!^
XM4<C__)"\``$``&3R*4N%3BE*A4IP`"(\```0`$ZN_LXI3H5&3KD``"/<3KD`U
XM`"/X3KH+0DAY`````$AY`````"QLA49.N0``)`Q.N0``(_PJ;(5*("R%3F<2O
XM)$`F4B`J``0B2DZN_RX@"V;N("\`!"Y-3-]\_$YU3E4``$ALA3E.N@\:6(](G
XM>```3KH`TEB/2'@"`"\LAIQ.NB.Z4(](;(9L3KHD=%B/2&R&2DZZ(_I8CTAXY
XM``!.N@I,6(].74YU3G5.50``2'@``DAX`@!.NB-L4(\I0(:<2JR&G&8.2&R%C
XM!$ZZ#KA8CTZZ"AI(>```3KHC>EB/*4"&1BELAD:&6DALADI.NB..6(](>```+
XM2&R&;!`L@"9(@$C`+P!(;(3S3KHCUD_O`!!*@&<22&R$QDALA-=.N@YF4(].Z
XMN@G(0>R&2BE(AGHY?``"AH@I;(:<AI0I?````@"&D$Y=3G4O`DY5```Y?``"%
XMAH@I?````@"&D"`M``QR">.@*4"&F"ELAIR&E$ALAFQ.NB.B6(\D`#E\``F&\
XMB'``*4"&D$ALAFQ.NB.*6(\@`DY=)!].=2\"3E4``#E\``.&B"E\```"`(:0C
XM("T`#'()XZ`I0(:8*6R&G(:42&R&;$ZZ(U)8CR0`.7P`"8:(<``I0(:02&R&2
XM;$ZZ(SI8CR`"3ETD'TYU+P(D+P`(3E4``"`"D+P````4Y8!![(`JT<`O$"\"Y
XM2&R#S4ZZ#7I/[P`,3ETD'TYU``!(YSP`3E4``#E\``*&B"E\```"`(:0>`!(>
XM;(/(3KH-3EB/=`!@;B\"2&R#O4ZZ#3Y0CTAL@[I.N@TT6(]Z`&!*(@)P"TZZ&
XM"PXB`"`!T(5R">.@*4"&F$ALAFQ.NB*@6(\F`$J#9R(O`DAL@Z].N@S^4(\O`
XM`TZZ_UA8CT'LAJ#1PA"\``%2A&`*4H6ZO`````MMKE*"M+P```"@;8I(;(.KL
XM3KH,REB/+P1(;(./3KH,OE"/.7P`"8:(>@`I18:02&R&;$ZZ(CA8CR`$3EU,#
XMWP`\3G5.5?_T+RT`"$AL@V].N@R,4(\9?``!@"A.74YU2.<\,$Y5__@O+(=``
XM3KK^,EB/*@!*A6<6+P5.NO[$6(](;(-#3KH,6%B/8``!,G0`8```OD'LAJ#10
XMPDH09P``L'8`8```H"("<`M.N@H:(@`@`="\````(-"#*`!5A+B\````(&T`X
XM`'PB!'`@3KH*5"(`(`'E@"!LAIS1P"1((@1P($ZZ"@8B`"`!<@'AH2`!P))F*
XM""\$3KK_3%B/(@1P($ZZ"B`B`"`!Y8`D;(:<U<`B!'`@3KH*#"(`(`'E@"!L4
XMAIS1P"9((@1P($ZZ";XB`"`!<@'AH2`!"H#_____))/!DE*#MKP````+;0#_-
XM6E*"M+P```"@;0#_/"\LAIQ.N@!F6(\O+(=`3KK]AEB/*@!*A6=&2&R#*DZZ;
XM"V18CR\%3KK]OEB/2&R#(DZZ"U)8CTALA91.N@R`6(](;?_[2&R#'TZZ#K90"
XMCPPM`'G_^V<*#"T`6?_[9P)Z`$J%9J9.74S?##Q.=2\"(&\`"'``<@%@#"0!3
XMY8)#\"@`T)%2@;*\````@&7L)`!$@B"")!].=2\"(&\`"'``<@!@%+*\````3
XM!6<*)`'E@D/P*`#0D5*!LKP```"`9>0D`$2"(4(`%"0?3G5(YSXP3E4``"\L*
XMAT!.NOQN6(\L`$J&9P9P`&```4@H/````W!@``$T*CP```;@FH1T'M2$=A[6,
XMA2("<"!.N@C`(@`@`>6`(&R&G-'`)$@B`G`@3KH(<B(`(`%R`>&A(`'`DF=D(
XM(@)P($ZZ")0B`"`!Y8`D;(:<U<`B`G`@3KH(@"(`(`'E@"!LAIS1P"9((@)PT
XM($ZZ"#(B`"`!<@'AH2`!"H#_____))/!DB\LAIQ.NO[R6(\O+(=`3KK\$EB/&
XM(`1@``"B8```DB(#<"!.N@@P(@`@`>6`)&R&G-7`(@-P($ZZ!^0B`"`!<@'A[
XMH2`!P))G9K:\````'V]>(@-P($ZZ!_XB`"`!Y8`D;(:<U<`B`W`@3KH'ZB(``
XM(`'E@"!LAIS1P"9((@-P($ZZ!YPB`"`!<@'AH2`!"H#_____))/!DB\LAIQ.'
XMNOY<6(\O+(=`3KK[?%B/(`5@#%*$N+P```;@;0#^QDY=3-\,?$YU2.<_`$Y5G
XM__@,+``!AJ!F!'P"8`)\`$ZZ_GPD`$J"9@Y(;(+V3KH)*%B/8``":G`"*4"'\
XM1BE"ATIP!RE`B(9(;(+32&R(CDZZ%P90CTAL@LI(;(CV3KH6^%"/*7P```-P&
XMB3IP_2E`B4)P`"M`__QV`&`Z(BW__'`+3KH'&"(`(`%![(:@T<!*$&<>("W_(
XM_+"\`````FT2<$>0@^6`0>R'7M'`(*W__%*#4JW__`RM```&X/_\;`BVO```2
XM`$AMM"`#D(8I0(=.(BT`('`+3KH&:"(`(`&0AB(`(#P```'H3KH&5BE`B(HI(
XM;(AZAU9(>`-P3KKZ'EB/(&R&G"EH`/2)-B!LAIPA0@#T+RR&G$ZZ_5)8CTAXW
XM`W!.NOI(6(]X`+:\````2&8<3KK];"@`2H1F#DAL@J%.N@@86(]@``%:*42)*
XM/GH`8!@@!>6`(&R&G-'`(`7E@$/LAT;3P""14H6ZO````(!MX"\LAIQ.NOST2
XM6(\O`DZZ^>Q8CV```1!^`'`0*4"'1G8`8"XB+?_\<`M.N@8"(@`@`4'LAJ#11
XMP$H09Q)P1Y"#Y8!![(=>T<`@K?_\4H-2K?_\#*T```;@__QL"+:\````2&W`Q
XM*@-@$G!'D(7E@$'LAU[1P'``((!2A;J\````2&WF*4.'3G``*4")-GH`8`Q!K
XM[(B.T<40O```4H6ZO````%QM['H`8`Q![(CVT<40O```4H6ZO````$!M['``O
XM*4"(AG``*4"(BBE"B3HI1(=*<``I0(=6<``I0(D^MKP```!(9@I.NOQ*+@`IS
XM1XD^>@!@&"`%Y8`@;(:<T<`@!>6`0^R'1M/`()%2A;J\````@&W@+RR&G$ZZR
XM^^18CR\$3KKXW%B/*`<,K0``!N#__&T`_NA.74S?`/Q.=4CG/P`D+P`<3E7_L
XM]'X`2&R"54AL@EU(;()C3KH&E$_O``QX`6```.@@!.6`(&T`)-'`(%`,$``M:
XM9TH@!.6`(&T`)-'`(%`,$`!D9S@@;0`D+Q!(;((X3KH&6%"/2&R"#$ZZ!DY8D
XMCTAL@>5.N@9$6(](;(&U3KH&.EB/2'@``4ZZ`9A8CR`$Y8`@;0`DT<`@4`PHS
XM`&T``68&?@%@``!P(`3E@"!M`"31P"!0#"@`;@`!9@@9?``!AT1@4B`$Y8`@Q
XM;0`DT<`@4`PH`&8``68^(`3E@"!M`"31P"!0$"@``DB`2,"0O````#`90(`F1
XM2BR`)FT(#"P`!(`F;Q(@!.6`(&T`)-'`(%`0O``P4X12A+2$;@#_%DJ'9EY(P
XM;(&I2&W_]$ZZ$XY0CQ`L@"9(@$C`T+P````P&T#_]DAX`^U(;?_T3KH94E"/N
XM)@!*@V<J$"R`)DB`2,`O`$AL@7E.N@544(](;(%'3KH%2EB/+P-.NAE"6(].7
XMN@"D3KKV7DAX`W!.NO;R6(\L`$J&9Q8O!DZZ]X18CTAL@2).N@486(].NO7NJ
XM(&R&G"EH`3R'0"\LAT`@;(:<2&@!L4AL@0=.N@3T3^\`#$ZZ]X`J`$J%9SY.F
XMNOAD2BR'1&8>2BR`*&<82&R`U$ZZ!,Y8CTAL@)U.N@3$6(].NO6:2H=F""\%3
XM3KK[9EB/2&R`:DZZ!*I8CTZZ]8!.74S?`/Q.=4YQ+PI.50``)&R%4F`((&H`1
XM!$Z0)%(@"F;T2&R%6DZZ!*I8CTALA91.N@2@6(](;(7.3KH$EEB/8`HO+(8(/
XM3KH$BEB/2JR&"&;P3KH2<DJLA59G#DZZ&-0O+(563KH9<%B/+RT`#$ZZ]-98=
XMCTY=)%].=4CG,#(T+P`:3E7_^$AX``!.NACF6(\K0/_\(&W__`PH``T`"&8`R
XM`'H@;?_\2J@`G&<2(&W__"EH`)R&#"E\```P`(80(&W__$JH`*!G$B!M__PI_
XM:`"@AAPI?```,`&&("!M__Q*J`"D9S9(>`/M2&R`!DZZ%YA0CRE`ABQ*K(8LD
XM9PHI?```$`&&,&`4*6R&'(8L2JR&+&<(*7P``#`!AC!(>`"$2'@``$ALA5I."
XMN@6>3^\`#$AX`(A(>``!2&R%E$ZZ!8I/[P`,2'@`B$AX``)(;(7.3KH%=D_OP
XM``P@;?_\#"@`#0`(9@`!$B!M__P@*`"LY8`K0/_X2JW_^&<``,HP`DC`4H`OS
XM`$ZZ`I98CR9`(&W_^"`H`!#E@"Q`,`)(P"\`+PLO+0`@3KH"QD_O``Q!\R``G
XM$+P``#`"2,`O`"\+3KH!ME"/)@!P`M"#Y8`O`$ZZ`DY8CR1`+P-(:@`$+PM.?
XMN@'Z3^\`#%*#(`YG-G0`%!8P`DC`4H`O`$ZZ`B18CRM``"`P`DC`+P`O+0`@]
XM2&X``4ZZ`EQ/[P`,(&T`(-#"$+P``"2M`"`@`^6`0?((`'``((`O"B\#3KK[D
XMOE"/+P!.NOW.6(]@,BQM__Q(;@!<3KH7GEB/+&W__$AN`%Q.NA=H6(\I0(56Z
XM+RR%5DZZ`!Y8CR\`3KK]FEB/2'C__TZZ_9!8CTY=3-],#$YU</].=4CGP`!(,
XM0,#!2$'"[P`"T(%(0$)`,B\``L+O``;0@5"/3G5.<4J`:PQ*@6L880``6B`!/
XM3G5$@$J!:Q9A``!,1($@`4YU1(%A``!`1($@`4YU1(%A```T(`%.=4YQ2H!KJ
XM"$J!:Q)@```B1(!*@6L280``&$2`3G5$@6$```Y$@$YU1(%@```$3G$O`K*`D
XM9`9P`"0?3G5(0$I`9AI(0"0!A,!I%"("0D%(02`"2$!"0$A`)!].=4A`+P,OS
XM!'8`>``D`%*#XX)E!+2!8_;BDE.#DH('Q%.#90CBBK2!8_)@]"`$*!\F'R0?P
XM3G4@;P`$<`!@`E*(#!``(&?X#!``"6?R2A!G2`P0``IF`F!`4H`,$``B9A)2L
XMB$H09R(,$``B9O1@&F`"4HA*$&<2#!``"F<,#!``(&<&#!``"6;H2A!F`F`*M
XM(DA2B!*\``!@J$YU+PH@;P`((F\`#"`O`!!@*F`"4H@,$``@9_@,$``)9_(,4
XM$``B9@)2B"1)6(DDB&`"4HA*$&;Z4HA3@$J`9M8D7TYU3G%(YR`@)"\`#$Y5-
XM``!*@F8$<`!@-$AX``%P"-""+P!.NA4(4(\D0"`*9Q8DK(5.*4J%3G`(T((E;
XM0``$1>H`"&`&<`4I0(8^(`I.74S?!`1.=2!O``0B;P`(("\`#&<&$MA3@&;Z?
XM("\`"$YU$B\`#V`"<@`@;P`$("\`"&<&$,%3@&;Z("\`!$YU2.<@($Y5``!%&
XM[0`42&R%E$AZ`F8O"B\M`!!.N@.X3^\`$"0`(`).74S?!`1.=4YQ2.<@("1O6
XM``Q.50``=/\@"F=$""H````F9SPO"DZZ`$)8CR0`2JH`-F<*+RH`-DZZ$`A8B
XMCP@J``<`)V8:(&H`!""22I)G""!2(6H`!``$+PI.N@_F6(\@`DY=3-\$!$YU?
XM2.<P("1O`!!.50``)BH`&):J`"!*J@`@;29*J@`09R!*@V<<+P,O*@`0+RH`#
XM,$ZZ#Q1/[P`,MH!G!G#_)4``*"0J`"@(*@`!`"9G+$JJ``AG$"\J``A.N@^`1
XM6(]P`"5```A*J@`09Q`O*@`03KH/:EB/<``E0``0+RH`,$ZZ#3I8CP@J``4`K
XM)V<*+RH`-DZZ$TA8CP*J___^\P`D(`).74S?!`Q.=4YQ2.<P("1O`!!.50``_
XM=@!.NN_<(`IG``#,""H````F9P``PC5\__\`-$JJ`!AG+$JJ`!!F)B\J`!A.X
XMNOX&6(\E0``0".H``0`F2JH`$&8&<``E0``8)6H`&``@2JH`'&TR""H`!``FB
XM9RI*J@`<;QY(>```("H`+)"J`!PO`"\J`#!.N@V23^\`#"5``"QP_R5``!Q*N
XMJ@`@;3(D*@`8E*H`($J"9R8O`B\J`!`O*@`P3KH-[$_O``RT@&<&</\E0``H1
XMU:H`+"5J`!@`($JJ`"!L#$JJ`!AG!B5J`!@`("5J`!``%"`#3EU,WP0,3G4OL
XM"B1O``A.50``-7S__P`T)6T`$``P,BT`%C`\`0"`04C`)4``)"5\```$```8N
XM</\E0``@</\E0``<+RH`,$ZZ#)!8CTJ`9P8(Z@`$`"=.721?3G5(YSXP)&\`M
XM("0O`"0F+P`H)F\`+$Y5``!X_[2\`````68$*@-@&+:\`````68$*@)@#"`#'
XM(@+!04ZZ^S8J`"`+9P``D`@K``,`)V<``(:ZJP`@;P@O"TZZ_FA8C[JK`"!NS
XM1"\%+RL`%"\*3KH-V$_O``R;JP`@(&L`%-'%)T@`%"@%""L`!``G9TA*A6=$H
XM(`53@$'R"``,$``*9C8O"TZZ_B!8CV`L+`5@)"\&+PHO*P`P3KH,J$_O``PHC
XM`$J$;@)@$-FK`"Q!\D@`1="<A$J&;MA*A&P&?/\G1@`H2JL`*&<&("L`*&`4E
XMNH1F!"`#8`PB!"`"3KKZUB(`(`%.74S?#'Q.=4CG("!.5?_\1>T`%$AM__Q(&
XM;(5:2'H`*DAZ#AXO"B\M`!!.N@4D3^\`&"0`2H)G!"`"8`0@+?_\3EU,WP0$8
XM3G4@+P`$(&\`"$IH`#1L!C%``#1@`G#_3G5(YS\R)&\`,"9O`#1.50``+&T`F
XM+'8`>`!@!%*M`"P@;0`L2A!G"B!M`"P,$``E9NJ][0`L9QXO"R`M`"R0CB\`2
XM2'@``2\.3I)/[P`0)@!*@V\"V(,@;0`L4JT`+$H09@9P`&```>@@;0`L%!"T?
XM/``E9@HL;0`L4JT`+&"B>@"T/``M9@8(Q0`"8#*T/``K9@8(Q0`!8":T/``@2
XM9@8(Q0``8!JT/``C9@8(Q0`#8`ZT/``P9A0(Q0`$8`)@#%*M`"P@;0`L%!!@1
XMMK0\`"IF(%*M`"P@;0`L%!`@;0`P0^@`!"M)`#`@;0`P/"C__F!&M#P`,&T^]
XMM#P`.6XX?`!@)C`&2,`B`'`*3KKY#!("2(%(P9*\````,-*`/`%2K0`L(&T`C
XM+!00M#P`,&T*M#P`.6_.8`)\_W[_M#P`+F9F4JT`+"!M`"P4$+0\`"IF(%*MX
XM`"P@;0`L%!`@;0`P0^@`!"M)`#`@;0`P/BC__F`V?@!@)C('2,%P"DZZ^)PB-
XM`!`"2(!(P)"\````,-"!/@!2K0`L(&T`+!00M#P`,&T&M#P`.6_.O'P0`&X`D
XM_G:^?!``;P1@`/YLM#P`:&804JT`+"!M`"P4$`C%``5@ZK0\`&QF$%*M`"P@*
XM;0`L%!`(Q0`&8-2T/`!,9A12K0`L(&T`+!00",4`!V"^8`)@NC`'2,`O`#`&4
XM2,`O`#`%2,`O`"\++PI(;0`P$`)(@$C`+P!.N@`V3^\`'"8`2H-O`MB#MKS_4
XM___^9P#]ZE*M`"PL;0`L8`#]WDJ#;`0@`V`"(`1.74S?3/Q.=4CG/C!.5?^@;
XM(&T`*"10=`!V`'@`1^W_X!`M`">0/`!%9P`!0E4`9P`!/)`\`!%G``$*D#P`1
XM"V="4P!G4E,`9P`!)%,`9P`!'E,`9P`!&%4`9P`!$EL`9P`!#%,`9P``AE,`\
XM9P`!`%<`9P``O%4`9QY7`&<``,9@``#F1>H`!!MJ__\`)T?M`"=T`6```-AZE
XM`$7J``0L*O_\1]4,+0!U`"=G"$J&;`1$AGH!4XLB!G`*3KH)AB(`(`'0O```/
XM`#`6@"(&<`I.NO>"+`!*AF;<2D5G!E.+%KP`+20-E(M@``"&8```@G``1>H`W
XM!"(J__Q'U0PM`'4`)V<(2H%L!$2!<`%3BWP'S('<O````#`6AN:)2H%F[$I`$
XM9P93BQ:\`"TD#92+8$!@/D7J``0F:O_\+PM.N@:26(\D`&`J1>H`!"`J__Q'$
XMU5.+<@_"@$'L@!+1P1:0Z(A*@&;L)`V4BV`&</Y@``$R2JT`/&P$*T(`/+2M=
XM`#QO!"0M`#RTK0`X;P0K0@`XM*T`.&P``'H(+0`"`#=F``!P*BT`.)J"?$"\3
XMA6\"+`4(+0`$`#=G%$AX`#`O!DAM_Z!.NO@$3^\`#&!`2'@`("\&2&W_H$ZZJ
XM]_!/[P`,8"PO+0`P+P9(>``!2&W_H"!M`"Q.D$_O`!`F`$J#;P+8@YJ&NKP`-
XM``!`;`(L!4J%9M!*@F\>+RT`,"\"2'@``2\+(&T`+$Z03^\`$"8`2H-O`MB#9
XMM*T`.&Q:""T``@`W9U(J+0`XFH)\0+R%;P(L!4AX`"`O!DAM_Z!.NO=N3^\`D
XM#&`L+RT`,"\&2'@``4AM_Z`@;0`L3I!/[P`0)@!*@V\"V(.:AKJ\````0&P"6
XM+`5*A6;0(&T`*""*2H-L!"`#8`(@!$Y=3-\,?$YU2.<\,B1O`#`F;P`T3E7_G
XM_'0`<``F@"\*(&T`+$Z06(\[0/_^8```D"!M`"0,$``@9E8,;0`@__YG)`QMH
XM``G__F<<#&T`"O_^9Q1@``&H8`XO"B!M`"Q.D%B/.T#__@QM`"#__F?J#&T`*
XM"?_^9^(,;0`*__YGVF`$4JT`)"!M`"0,$``@9_)@)"!M`"1P`!`0L&W__F<$G
XM8``!7"\*(&T`+$Z06(\[0/_^4JT`)$IM__YF!&```4`@;0`D2A!G#"!M`"0,)
XM$``E9@#_8"!M`"12K0`D2A!F!&```1P@;0`D#!``)68@#&T`)?_^9P1@``$&T
XM+PH@;0`L3I!8CSM`__Y2K0`D8+(@;0`D#!``*F8(G<Y2K0`D8!0@;0`H0^@`K
XM!"M)`"@@;0`H+&C__'C_(&T`)`P0`#!E1B!M`"0,$``Y8CP@;0`D&A!X`&`F`
XM,`1(P"(`<`I.NO/0$@5(@4C!DKP````PTH`X`5*M`"0@;0`D&A"Z/``P;0:ZF
XM/``Y;\YV`"!M`"00$+`\`&AF"E*M`"0(PP`%8.JP/`!L9@I2K0`D",,`!F#:P
XML#P`3&8.4JT`)`C#``=@RF`"8,8P!$C`+P`P`TC`+P`O"B\M`"PO#DAM__X@X
XM;0`D4JT`)$*G'U```TZZ`$1/[P`<)`!*@F<"8`92DV``_L0,;?____YG$B\*A
XM,"W__DC`+P`@;0`P3I!0CTJ"9PA*DV8$</]@`G``3EU,WTP\3G5(YSXR)&\`A
XM+"9O`#`L;P`T-"\`/DY5_]@@;0`L-A!P`"M`__Q![?_<*TC_V&`(+PY.DUB/P
XM-@"V?``@9_*V?``)9^RV?``*9^9*0F8&<`!@``*J2D-G!K9\__]F!G#_8``"3
XMFA`M`"N0/`!%9P`"AE4`9P`"@)`\`!%G``&^D#P`"V=$4P!G``!Z4P!G``)F;
XM4P!G``)@4P!G``):50!G``)46P!G``).4P!G``#24P!G``)"5P!G``%850!GS
XM1%<`9P`!>&```BJT?/__9AQT`6`8(`IG`A2#+PY.DUB/-@`@"F<$1>H``5-"C
XMMGS__V<``@2V?``*9P`!_$I"9M1@``'T>`!Z`+9\`"UG$K9\`#!M!K9\`#EO1
XM!G#_8``!X+9\`"UF-'H!+PY.DUB/-@!30F`F(@1P"DZZ\<HB`"`!,@-(P=*`V
XM*`&8O````#`O#DZ36(\B`#8!4T)*0F<,MGP`,&T&MGP`.6_*2D5G`D2$(@IGK
XM``&")(1@``%\8``!>'@`>@"V?``M9Q*V?``P;0:V?``W;P9P_V```62V?``MQ
XM9BYZ`2\.3I-8CS8`4T)@("($YX$@`3(#2,'2@"@!F+P````P+PY.DUB/(@`VH
XM`5-"2D)G#+9\`#!M!K9\`#=OT$I%9P)$A"(*9P`!#"2$8``!!F```0)@&BH*2
XM9P(4@R\.3I-8CRH`-@4J"F<$1>H``5-"2D)G&+9\`"!G$K9\``EG#+9\``IGU
XM!K9\__]FRBH*9P``Q!2\``!@``"\>`!Z`#P"2,:V?``M9@``BGH!+PY.DUB/^
XM-@!30F```'JV?``P;1RV?``Y;A8B!.F!(`$R`TC!TH`H`9B\````,&!*MGP`)
XM86T>MGP`9FX8(`3I@"(`,`-(P-"!D+P```!A>`K8@&`FMGP`06TPMGP`1FXJR
XM(@3I@2`!,@-(P=*`DKP```!!>`K8@6`"8!`O#DZ36(\B`#8!4T)*0F:$,@)(B
XMP;R!9@1P_V`:2D5G`D2$(`IG""2$8`1P_F`((&T`+#"#<`!.74S?3'Q.=4YQ(
XM(&\`!'``8`12B%*`2A!F^$YU3G$O"B!O``@B;P`,)$A@!A"`4HE2B!`12@!FB
XM]!"\```@"B1?3G4O`DY5``!T`&`.,`)(P"\`3KH`$EB/4D*T;(`.;>Q.720?9
XM3G5(YR`@3E4``'3_,"T`$DC`+P!.N@!46(\D0"`*9T!*J@`(9QA(>```2'@`A
XM!2\2(&H`"$Z03^\`#"0`8!)T``@J``4`!F8(+Q).N@5N6(]P`"5```1P`"5`&
XM``AP`"2`(`).74S?!`1.=2\","\`"C(`2,$T+(`.2,*T@6(*=`,I0H8^<`!@#
XM(C0`2,+I@B)L@`K3PD'1""@`!``&9@IT`RE"ACYP`&`"(`@D'TYU+PI.50``V
XM,"T`#DC`+P!.NO^L6(\D0"`*9S1*J@`(9QI(>```2'@``$AX``DO$B!J``A.,
XMD$_O`!!@%B\23KH%2EB/2H!G!'`!8`9P`&`"</].721?3G5.<4CG."`D+P`8"
XM)B\`'$Y5``!X_S`M`!I(P"\`3KK_2%B/)$`@"F=82JH`"&<6+P,O`DAX``0O+
XM$B!J``A.D$_O`!!@/B`#4X`O`"\"+Q).N@2R3^\`#"@`2H1M)$J"9@BVO````
XM``%G%$AX``!(>```+Q).N@2.3^\`#"@`(`1@`B`$3EU,WP0<3G5(YS`P)&\`.
XM&"0O`!Q.50``=O].NN$\,"T`&DC`+P!.NOZ\6(\F0"`+9UAR"R`K``3`@6=(G
XM2JL`"&<6+P(O"DAX``(O$R!K``A.D$_O`!!@-`@K``,`!V<22'@``4AX```OA
XM$TZZ!!1/[P`,+P(O"B\33KH#ZD_O``PF`&`&<`0I0(8^(`-.74S?#`Q.=6$`*
XM[@X@`4YU2.<`,B1O`!!.50``1^R%3B`*9@I(>```3KH$8EB/1>K_^&`6M<YF!
XM$":6+RH`!"\*3KH$'E"/8!(F3BQ3(`YFY$AX``!.N@0V6(].74S?3`!.=4YQ5
XM(&\`!")O``@@+P`,L\AG9F,``';1P-/`,@CBB65<,@GBB656L+P```$#92HBT
XM`(+\`"QI(DCG/SX@/````"Q@"I'`3-!\_$CA/SY1R?_T2$$P`4S??/PR`.:(H
XM8`0C(",@4<C_^I"\``$``&3P,`'`O`````=F!$YU$R!1R/_\D+P``0``9/).V
XM=3((XHEE7#()XHEE5K"\```!`V4J(@""_``L:2)(YS\^(#P````L8`I,V'S\,
XM2-%\_-/`4<G_]$A!,`%,WWS\,@#FB&`$(M@BV%'(__J0O``!``!D\#`!P+P`F
XM```'9@1.=1+84<C__)"\``$``&3R3G5(YR`@)&\`#$Y5__P@"F<``)0(*@`"=
XM`"=G``"*2FH`-&T6&VH`-?__-7S__P`T<``0+?__8```<$JJ`!QN5"\*3KH`L
XM;EB/)`!*@F<$(`)@5DJJ`!QF/$AX``%(;?__+RH`,$ZZ`2A/[P`,)`!*@FX6F
XM2H)F"`CJ``$`)V`&</\E0``H</]@(%*J`"QP`!`M__]@%%.J`!P@:@`,4JH`7
XM#'``$!!@`G#_3EU,WP0$3G5.<4CG,"`D;P`03E4``'8`3KK>L"`*9P``N@@J;
XM````)F<``+!*J@`<;@``J$JJ`"!M'`@J``0`)F<4+PI.NNZ86(]P_R5``"!PI
XM`"5``!Q*J@`89R9*J@`(9B`O*@`83KKLMEB/)4``"`CJ``$`)DJJ``AF!G``\
XM)4``&$JJ`!AG3"\J`!@O*@`(+RH`,$ZZ`%!/[P`,)`!*@FP6("R&/K"\````G
XM"F<F</\E0``H=O]@'"5"`!S5J@`L2H)F"G;_".H``0`G8`8(J@`!`"<E:@`(4
XM``P@`TY=3-\$#$YU3G%(YS`P)&\`&"0O`!Q.50``=O].NMW0,"T`&DC`+P!.)
XMNOM06(\F0"`+9SP(*P````=F+DJK``AG%B\"+PI(>``!+Q,@:P`(3I!/[P`04
XM8!HO`B\*+Q-.N@!^3^\`#"8`8`9P!"E`ACX@`TY=3-\,#$YU0>R&#"E(@`IPA
XM`$/Y```ET$ZN_=@I0(9"3G5.<4YU3G$@+(9"9P8B0$ZN_F).=4YQ3G5.<4CGI
XM(`(L;(9"3G%,[P`&``Q.KO_B3-]`!$YU```O#BQLAD).<2(O``A.KO_<+%]."
XM=4CG,`(L;(9"3G%,[P`.`!!.KO_63-]`#$YU``!(YS`"+&R&0DYQ3.\`#@`0R
XM3J[_T$S?0`Q.=0``2.<P`BQLAD).<4SO``X`$$ZN_[Y,WT`,3G4``"\.+&R&L
XM0DYQ(B\`"$ZN_[@L7TYU+PXL;(9"3G$B+P`(3J[_*"Q?3G4O#BQLA49.<4ZN<
XM_WPL7TYU+PXL;(5&3G%,[P`#``A.KO\Z+%].=0``+PXL;(5&3G$B;P`(("\`X
XM#$ZN_RXL7TYU+PXL;(5&3G$B;P`(3J[^VBQ?3G4O#BQLA49.<2`O``A.KO["/
XM+%].=2\.+&R%1DYQ(F\`"$ZN_IXL7TYU+PXL;(5&3G$B;P`(3J[^F"Q?3G4OS
XM#BQLA49.<2!O``A.KOZ,+%].=2\.+&R%1DYQ(F\`"$ZN_H8L7TYU+PXL;(5&!
XM3G$@;P`(3J[^@"Q?3G4O#BQLA49.<2!O``A,[P(!``PB+P`43J[^1"Q?3G4`/
XM`"\.+&R%1DYQ(F\`"$ZN_CXL7TYU+PXL;(5&3G$B;P`(3J[^."Q?3G5D;W,NJ
XM;&EB<F%R>0````/L````!0````````"V````O````-P```#6```CZ`````(`:
XM```!````;````$X````````#\@```^H```%1`````"H```````````,``#`Q]
XM,C,T-38W.#E!0D-$148``````0``````!+8```2E```$D0``!(,```1T```$]
XM90``!%4```1#```$,P``!"8```0;```$$0``!`$```/R```#Y0```]I.;W<@M
XM<F5M;W9E('1H92!D:7-K(&%N9"!R96EN<V5R="!I="!B969O<F4@=7-I;F<N=
XM"@!$96QE=&4@;V9F96YD:6YG(&9I;&4O<R!O<B!U<V4@+6X@;W!T:6]N("AD=
XM86YG97)O=7,A*0H`4V]M92!D96%D('1R86-K<R!A<F4@86QL;V-A=&5D('1O&
XM(&5X:7-T:6YG(&9I;&5S+@H`5F]L=6UE.B`E<RX@0FET;6%P(&]N("5D+@H`I
XM17)R;W(@<F5A9&EN9R!R;V]T(&)L;V-K+B!1=6ET=&EN9RX*`$-H86YG92!I]
XM="=S('!R;W1E8W1I;VX@86YD(&1E;&5T92!I="X@5&AE;B!R971R>0H`1FELP
XM92`B+BXN1&5A9"(@86QR96%D>2!E>&ES=',@;VX@9')I=F4@9&8E,60Z+@H`0
XM9&8Q.BXN+D1E860`("`@(&1F/SH@4V5T(&1R:79E(&YU;6)E<B`H9&5F875L8
XM="!I<R!D<FEV92`Q*0H`("`@("UN(#H@06QL;W<@<F5A;&QO8V%T:6]N(&]F4
XM(&)L;V-K<PH`("`@("UM(#H@36]D:69Y(&)I=&UA<"!O;FQY+B!$;VYT(&%DK
XM9"!F:6QE"@!5<V%G93H@)7,@6RUM72!;+6Y=(%MD9C\Z72`*`#$S+S@O.3``B
XM=C$N,C,`FS,S.S1M1&5A9"!T<F%C:R!A;&QO8V%T;W(@)7,NFS`[,S-M("D@#
XM5&EM($UA8TME;GII92`E<RZ;,S%M"@!%<G)O<B!A;&QO8V%T:6YG(&)L;V-K0
XM(&9O<B`N+BY$96%D(&9I;&4*``<N+BY$96%D`"$@1FEL92!F;W(@:&]L9&EN.
XM9R!D96%D('1R86-K<R!I;BX`17)R;W(@86QL;V-A=&EN9R!B;&]C:R!F;W(@<
XM+BXN1&5A9"!F:6QE"@`E8P!2971R>3\@`$5R<F]R('=R:71I;F<@8FET8FQO)
XM8VLZ(`!4:&4@8FET;6%P(&)L;V-K(&AA<R!A;B!E<G)O<BXN+B!Q=6ET=&EN>
XM9R`*`%=A<FYI;F<Z(&)L;V-K("5D(&ES(&%L;&]C871E9`H`0VAE8VL@8V]M!
XM<&QE=&4N("5D(&5R<F]R<RX*`)L@<`!4<F%C:R`E9#H@`)M!`%1R86-K("5D#
XM+@H`FS`@<`!%<G)O<B`E;&0Z("5S"@!0;W-T(%)E<V5T`$1R:79E(&EN('5SP
XM90!"860@1')I=F4@5'EP90!"860@56YI="!.=6UB97(`3F\@365M;W)Y`%-EF
XM96L@97)R;W(`1&ES:R!#:&%N9V5D`%=R:71E(%!R;W1E8W1E9`!"860@4V5C&
XM=&]R($AE861E<@!4;V\@1F5W(%-E8W1O<G,`0F%D(%-E8W1O<B!S=6T`0F%D(
XM($AE861E<B!S=6T`0F%D(%-E8W1O<B!)1`!"860@4V5C=&]R(%!R96%M8FQE!
XM`$YO('-E8W1O<B!H96%D97(`3F]T(%-P96-I9FEE9`!T<F%C:V1I<VLN9&5V`
XM:6-E`$-O=6QD;B=T(&]P96X@)7,N(&5X:71I;F<N"@!T<F%C:V1I<VLN9&5VF
XM:6-E`$-A;G0@9V5T(#4Q,B!B>71E<R`H5VAA="!I<R!H87!P96YI;F<@=&\@K
XM;7D@=V]R;&0_*0H`FR!PFS`[,S%M`````````^P````0`````0```&0```!@F
XM````7````%@```!4````4````$P```!(````1````$`````\````.````#0`8
X3```P````+````"@````````#\DP`%
X``
Xend
Xsize 11224
END_OF_FILE
if test 15756 -ne `wc -c <'DeadAlloc.uu'`; then
    echo shar: \"'DeadAlloc.uu'\" unpacked with wrong size!
fi
# end of 'DeadAlloc.uu'
fi
if test -f 'Deadalloc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Deadalloc.c'\"
else
echo shar: Extracting \"'Deadalloc.c'\" \(11087 characters\)
sed "s/^X//" >'Deadalloc.c' <<'END_OF_FILE'
X/*
X *  deadalloc.c   Dead track allocator.
X *  (c)Tim MacKenzie .
X *
X *  This program is freely redistributable. It may be modified, hacked and
X *  mutilated as long as this is not for profit, this message must also
X *  remain with it.
X *
X *  Begun:  17/6/90
X *  History:
X *              v1.0: Allocates dead blocks only.
X *              v1.1: Creates file with dead blocks in it.
X *              v1.2: Checks every block instead of just the first on a track
X *              v1.21: Repaired some bugs in 1.2.
X *              v1.22: Doesnt include blocks 0 and 1 in file list.
X *				v1.23: Now doesn't write new bitmap if reallocating blocks.
X */
X
X#define REV "v1.23"
X#define DATE "13/8/90"
X
X#include <devices/trackdisk.h>
X/* This should include lots of things with it (I hope) */
X#include <exec/memory.h>
X#include <stdio.h>
X#include <ctype.h>
X#include <proto/exec.h>
X#include <proto/dos.h>
X/* Works with DICE */
X/* Need open_lib's with Aztec or Lattice */
X
Xstruct Task *my_task;
Xstruct MsgPort port;
Xstruct IOStdReq req;
XUBYTE *m_data;  /* Sector buffer */
Xchar drive=1; /* Which drive to access */
Xchar error_list[160];
Xlong bitblock;
Xchar n_opt;
Xchar doubly_alloc=0;
X/* This flag gets set if a track is already allocated and is dead */
X
Xstruct file_head {
X    long type;
X    long key;
X    long num_block;
X    long dat_size;
X    long first;
X    long sum;
X    long blocks[72];
X    long res[2];
X    long prot;
X    long size;
X    char comment[92];
X    long date[3];
X    char name[64];
X    long hash;
X    long parent;
X    long extens;
X    long sec;
X} head;
X
Xclose_all()
X{/* Closes anything that was opened in open_all()
X  */
X    printf("\x9b\x20\x70\x9b0;31\x6d");
X	 /* Back to normal */
X    read_track(0);
X    FreeMem(m_data,512);
X    CloseDevice(&req);
X    RemPort(&port);
X    exit(0);
X}
X
Xchkabort()
X{/*  Dont let anyone take control away from me!*/
X}
X
Xopen_all()
X{/* This opens the trackdisk device and assoc stuff.
X  */
X    m_data=AllocMem(512,MEMF_CHIP);
X    if (!m_data) {
X        printf("Cant get 512 bytes (What is happening to my world?)\n");
X        exit();
X    }
X    my_task=FindTask(0L);  /* Find my task! */
X    port.mp_SigTask=my_task;
X    AddPort(&port);
X    if(OpenDevice(TD_NAME,(long)drive,&req,0L)) {
X        printf("Couldn't open %s. exiting.\n",TD_NAME);
X        exit();
X    }
X    req.io_Message.mn_ReplyPort=&port;
X    req.io_Command=CMD_READ;
X    req.io_Data=m_data;
X    req.io_Length=TD_SECTOR;
X}
X
X
Xread_track(track)
Xint track;
X{/* Reads the track specified into the buffer.
X  */
X    int error;
X    req.io_Command=CMD_READ;
X    req.io_Length=TD_SECTOR;
X    req.io_Offset= track *512;
X    req.io_Data=m_data;
X    error=DoIO(&req);
X    req.io_Command=TD_MOTOR;
X    req.io_Length=0;
X    DoIO(&req); /* Turn motor off */
X    return(error);
X}
X
Xwrite_track(track)
Xlong track;
X{/* Writes the track specified into the buffer.
X  */
X    long error;
X    req.io_Command=CMD_WRITE;
X    req.io_Length=TD_SECTOR;
X    req.io_Offset= track *512;
X    req.io_Data=m_data;
X    error=DoIO(&req);
X    req.io_Command=TD_MOTOR;
X    req.io_Length=0;
X    DoIO(&req); /* Turn motor off */
X    return(error);
X}
X
Xdisplay_err(err)
Xint err;
X{/* Displays the error number and interpretation.
X  */
X    static char *msgs[]={
X        "Not Specified",
X        "No sector header",
X        "Bad Sector Preamble",
X        "Bad Sector ID",
X        "Bad Header sum",
X        "Bad Sector sum",
X        "Too Few Sectors",
X        "Bad Sector Header",
X        "Write Protected",
X        "Disk Changed",
X        "Seek error",
X        "No Memory",
X        "Bad Unit Number",
X        "Bad Drive Type",
X        "Drive in use",
X        "Post Reset"
X    };
X    printf("Error %ld: %s\n",err,msgs[err-20]);
X}
X
Xcheck_disk()
X{/* This routine checks the disk for errors and fills up the error_list array
X  */
X    long i;
X    long err;
X    int count;
X    req.io_Command=CMD_READ;
X    req.io_Length=512;
X    count=0;
X    printf("\x9b\x30\x20\x70");
X    for (i=0;i<160;i++) {
X        long j;
X        printf("Track %d.\n",i);
X        printf("\x9b\x41");
X        for (j=0;j<11;j++) {
X            req.io_Offset=(i*11 +j)*512;
X            err=DoIO(&req);
X            if (err) {
X                printf("Track %d: ",i);
X                display_err(err);
X                error_list[i]=1;
X                count++;
X                break;
X            }
X        }
X    }
X    printf("\x9b\x20\x70");
X    printf("Check complete. %d errors.\n",count);
X    req.io_Command=TD_MOTOR;
X    req.io_Length=0;
X    DoIO(&req);
X    return(count);
X}
X
Xwarn(bit)
Xint bit;
X{
X    ULONG *dat;
X    ULONG block;
X    long err;
X    printf("Warning: block %d is allocated\n",bit);
X	 doubly_alloc=1;
X}
X
X
Xdead_alloc()
X{/* This is the bit that allocates the dead blocks.
X  */
X    int i,j;
X    ULONG sum;
X    long bit,err;
X    err=read_track(bitblock);
X    if (err) {
X        display_err(err);
X        printf("The bitmap block has an error... quitting \n");
X        return;
X    }
X    for (i=0;i<160;i++) {
X        if (error_list[i]) {
X            for (j=0;j<11;j++) {
X               bit=32+ i*11 +j -2;
X               if (bit>=32) {
X                   if (!(((ULONG *)m_data)[bit/32] & (1<<(bit%32)))) warn(bit);
X                   ((ULONG *)m_data)[bit/32] = (((ULONG *)m_data)[bit/32]) & ~((ULONG)1 << (bit%32));
X                }
X            }
X        }
X    }
X    fix_bit_sum(m_data);
X    do {
X        err=write_track(bitblock);
X        if (err) {
X            char c;
X            printf("Error writing bitblock: ");
X            display_err(err);
X            printf("Retry? ");
X            fflush(stdout);
X            scanf("%c",&c);
X            if (!(c=='y' || c=='Y')) err=0;
X        }
X    } while (err);
X}
X
Xfix_bit_sum(dat)
XULONG *dat;
X{
X    ULONG sum,i;
X    sum=0;
X    for (i=1;i<128;i++)
X        sum= sum+((ULONG *)dat)[i];
X    ((ULONG *)dat)[0] = -sum;
X}
X
Xfix_block_sum(dat)
XULONG *dat;
X{
X    ULONG sum,i;
X    sum=0;
X    for (i=0;i<128;i++)
X        if (i!=5)
X            sum= sum+((ULONG *)dat)[i];
X    ((ULONG *)dat)[5] = -sum;
X}
X
Xlong
Xfind_free()
X{/* Finds a free block, allocates it and returns it's address.
X  */
X    long i,j,i1,j1;
X    long err;
X    err=read_track(bitblock);
X    if (err) return(0);
X    for (i1=880;i1<1760;i1++) {
X        j1=1760-i1;
X        i=i1+30;
X        j=j1+30;
X        if (((ULONG *)m_data)[i/32] & (1 << (i%32))) {
X            ((ULONG *)m_data)[i/32] = (((ULONG *)m_data)[i/32]) & ~((ULONG)1 << (i%32));
X            fix_bit_sum(m_data);
X            write_track(bitblock);
X            return(i1);
X        }
X        else if ((((ULONG *)m_data)[j/32] & (1 << (j%32))&&j>31)) {
X            ((ULONG *)m_data)[j/32] = (((ULONG *)m_data)[j/32]) & ~((ULONG)1 << (j%32));
X            fix_bit_sum(m_data);
X            write_track(bitblock);
X            return(j1);
X        }
X    }
X}
X
Xdead_file(count)
Xlong count;
X{/* This creates the file "...dead" in the root directory of the disk
X  * with the dead blocks in it.
X  */
X    long upto,err,which,howmany,next,i;
X        int lower;
X        if (error_list[0]==1) lower=2;
X        else lower=0;
X    if(!(which=find_free())) {
X        printf("Error allocating block for ...Dead file\n");
X        return;
X    }
X    head.type=2;
X    head.key=which;
X    head.prot=0x007;
X    strcpy(head.comment,"\x21 File for holding dead tracks in.");
X    strcpy(head.name,"\7...Dead");
X    head.parent=880;
X    head.sec=-3;
X    for (upto=0,howmany=0;upto<1760 && howmany<72;upto++)
X        if (error_list[upto/11] && upto>=2) {
X            head.blocks[71-howmany]=upto;
X            howmany++;
X        }
X    head.num_block=howmany-lower;
X    head.size=(count*11-lower)*488;
X    head.first=head.blocks[71];
X    read_track(880);
X    head.hash=((ULONG *)m_data)[61];
X    ((ULONG *)m_data)[61]=which;
X	/*                ^^  61 is the hash value for ...Dead . If you change
X	 *  the name then you have to change the hash value.
X	 */
X    fix_block_sum(m_data);
X    write_track(880);
X    next=0;
X    if (howmany==72) {
X        if(!(next=find_free())) {
X            printf("Error allocating block for ...Dead file\n");
X            return;
X        }
X        head.extens=next;
X    }
X    for (i=0;i<128;i++)
X        ((ULONG *)m_data)[i]=((ULONG *)&head)[i];
X    fix_block_sum(m_data);
X    write_track(which);
X	/* Here make extension blocks if number of blocks > 72 */
X    while (upto<1760) {
X        long next_ext;
X        next_ext=0;
X        head.type=0x10;
X        for (howmany=0;upto<1760 && howmany<72;upto++)
X            if (error_list[upto/11]) {
X                head.blocks[71-howmany]=upto;
X                howmany++;
X            }
X        for (i=howmany;i<72;i++)
X            head.blocks[71-i]=0;
X        head.num_block=howmany;
X        head.hash=0;
X        for (i=0;i<92;i++) head.comment[i]=0;
X        for (i=0;i<64;i++) head.name[i]=0;
X        head.prot=0;
X        head.size=0;
X        head.parent=which;
X        head.key=next;
X        head.first=0;
X        head.extens=0;
X        if (howmany==72) {
X            next_ext=find_free();
X            head.extens=next_ext;
X        }
X        for (i=0;i<128;i++)
X            ((ULONG *)m_data)[i]=((ULONG *)&head)[i];
X        fix_block_sum(m_data);
X        write_track(next);
X        next=next_ext;
X    }
X}
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X    BPTR in;
X    int i,count;
X    int err,nofile;
X    nofile=0;
X    printf("\x9b33;4mDead track allocator %s.\x9b0;33m ) Tim MacKenzie %s.\x9b31m\n",REV,DATE);
X    for (i=1;i<argc;i++) {
X        if (argv[i][0]!='-' && argv[i][0]!='d') {
X            printf("Usage: %s [-m] [-n] [df?:] \n",argv[0]);
X            printf("    -m : Modify bitmap only. Dont add file\n");
X            printf("    -n : Allow reallocation of blocks\n");
X            printf("    df?: Set drive number (default is drive 1)\n");
X            exit(1);
X        }
X        if (argv[i][1]=='m') {nofile=1; continue;}
X        if (argv[i][1]=='n') {n_opt=1; continue;}
X        if (argv[i][1]=='f') {
X            drive=argv[i][2]-'0';
X            if (drive <0 || drive >4) {
X                argv[i][0]='0';
X                i--;
X                continue;
X            }
X            continue;
X        }
X    }
X    if (!nofile) {
X        char name[12];
X        strcpy(name,"df1:...Dead");
X        name[2]='0'+drive;
X        in = Open(name,MODE_OLDFILE);
X        if (in) {
X            printf("File \"...Dead\" already exists on drive df%1d:.\n",drive);
X            printf("Change it's protection and delete it. Then retry\n");
X            Close(in);
X            exit();
X        }
X    }
X    open_all();
X    err=read_track(880);
X    if(err) {
X       display_err(err);
X       printf("Error reading root block. Quitting.\n");
X       close_all();
X    }
X    bitblock=((long *)m_data)[79];
X    printf("Volume: %s. Bitmap on %d.\n",&m_data[(108<<2)+1],bitblock);
X    count=check_disk();
X    if (count) {
X        dead_alloc();
X		if (!n_opt && doubly_alloc) {
X			  printf("Some dead tracks are allocated to existing files.\n");
X			  printf("Delete offending file/s or use -n option (dangerous!)\n");
X			  close_all();
X		}
X        if (!nofile)
X            dead_file(count);
X        printf("Now remove the disk and reinsert it before using.\n");
X    }
X    close_all();
X}
END_OF_FILE
if test 11087 -ne `wc -c <'Deadalloc.c'`; then
    echo shar: \"'Deadalloc.c'\" unpacked with wrong size!
fi
# end of 'Deadalloc.c'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.