changeset 470:6e1cff14e8c4

Article about recovering from disk crash
author roug
date Sat, 05 Oct 2002 16:08:53 +0000
parents 6b15b51ee3ba
children ce6c1122bee6
files docs/articles/diskcrash.article
diffstat 1 files changed, 483 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/articles/diskcrash.article	Sat Oct 05 16:08:53 2002 +0000
@@ -0,0 +1,483 @@
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
+<!-- The author has not been contacted about adding this article to the
+     documentation set.
+-->
+<article>
+<articleinfo>
+<author><firstname>Dave</><surname>Gantz</></author>
+<title>Arrgh!!!!! My disk crashed, now what do I do?</title>
+</articleinfo>
+<para>
+Fixing crashed disks or at least recovering data from crashed disks can
+be a time consumming ordeal which is why the best recommendation is to
+ALWAYS keep current backups or DON'T use the disk at all if it is your
+only copy.  However, crashed disks do not have to mean lost data if you
+know how to go about recovering the data.
+</para>
+<para>
+Thats  what  this article is all about and comes as a result of the
+three crashed disks I've had this past week as well as Chris Spry's
+current predicament.  I have co-written one other article on this
+topic, but that pertained more specifically to boot disk problems.
+(See the OS9 Newletter, Volume III Issue 11B, November 30, 1992)
+</para>
+<para>
+You'll be needing a few tools handy to follow along with this article
+and if your planning to just practice for the eventuallity of a
+crashed disk then for God sakes use a backup of something.
+</para>
+<para>
+------------------------------Tool List--------------------------------
+</para>
+<para>
+OS9 Level II Manual, the big thick one that comes with the OS9 Level II
+disks.
+</para>
+<para>
+DED -- Copyright 1987 by Doug DeMartinis -- preferably the edition below
+</para>
+<screen width="80">
+Header for:  dEd                  This edition has a patch made to it
+Module size: $17A2    #6050       so that it will recognize and
+Module CRC:  $299A3F (Good)       identify the Bit Allocation Map or
+Hdr parity:  $8F                  BAM for short.  The BAM is also
+Exec. off:   $0665    #1637       sometimes called DAM or Disk
+Data Size:   $0316    #790        Allocation Map....
+Edition:     $05      #5
+Ty/La At/Rv: $11 $82              Besides its the one I use.  You could
+Prog mod, 6809 obj, re-en, R/O    also use Qtip, but displays will differ
+</screen>
+<para>
+A screen dump utility of some sort would also come in handy for this
+exercise in avoiding futility.  See the end of this article for
+suggested files and source(s).
+</para>
+<para> 
+Now to dive in there and rescue Data &lt;Grin&gt;.........
+</para>
+<para>
+
+The first thing will cover is the breakdown of Logical Sector Number
+zero on any OS9 disk, as well as the invocation of DED.  All numbers
+with a preceding $ are in hexadecimal (base 16) and others will be
+in decimal (base 10).
+</para>
+<para>
+To invoke DED for this excercise type the following from any OS9
+prompt on any 80x24 or 80x25 text screen or graphics screen with
+stdfonts merged.
+</para>
+<screen>
+OS9: DED /Dx@         (where x = the drive number with the disk
+                                 to be worked on in it.)
+</screen>
+<note>
+<para>
+The @ in the above command allows us to open any disk just as
+if it were a file by itself, thus allowing us to work with
+any and all data the disk contains with the exception of
+high density disks in most cases.
+</para>
+</note>
+<para>
+Here is an example of my LSN $00.  Offsets (Relative Addresses) are
+read as LSN+left most column+top row.  See the ** in the last row?
+This would be read as LSN or $00+column or $70+top row or $04 or a
+total offset of $0074.  If we were on sector 1 then it would be $0174.
+The definitions of the important bytes follow the excerpt.  Also see page
+5-2 in the technical reference section of the OS9 Level II manual.
+</para>
+<screen width="80">
+------------------------------------------------------------------------
+LSN=$00  00
+
+      0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0 2 4 6 8 A C E
+00:  00 0B D0 12 01 7A 00 01 00 00 03 00 00 FF D4 E3    ..P..z....... Tc
+10:  07 00 12 00 00 00 00 00 00 00 5D 03 08 10 2D 52    ..........]...-R
+20:  69 42 42 53 20 43 6F 6D 6D 61 6E 64 73 20 44 69    iBBS Commands Di
+30:  73 EB 00 00 00 00 00 00 00 00 00 00 00 00 00 01    sk..............
+40:  01 03 21 03 00 54 02 00 00 12 00 12 03 09 00 61    ..!..T.........a
+50:  40 00 00 00 00 00 00 00 00 00 00 00 00 74 2D 00    @............t-.
+60:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+70:  00 00 00 00 ** 00 00 00 00 00 00 00 00 00 00 00    ................
+ 
+
+       Relative   Size
+Name   Address   (Bytes)        Use or Function                 Mine
+----------------------------------------------------------------------
+DD.TOT   $00        3     Number of sectors on disk.          $000BD0
+DD.TKS   $03        1     Track size in sectors.              $12
+DD.MAP   $04        2     Number of bytes in allocation map.  $017A
+DD.BIT   $06        2     Number of sectors per cluster       $0001
+DD.DIR   $08        3     Starting Sector of of Root Dir      $000003
+DD.OWN   $0B        2     Owners ID number (usually 0)        $0000
+DD.ATT   $0D        1     Disk attributes                     $FF
+DD.DSK   $0E        2     Disk identification (internal use)  $D4E3
+DD.FMT   $10        1     Disk Format, bit mapped             $07
+DD.SPT   $11        2     Number of sectors per track         $0012
+DD.RES   $13        2     Reserved for future use             $00
+DD.BT    $15        3     Starting sector of bootstrap file   $000000
+DD.BSZ   $18        2     Size of bootstrap file              $0000
+DD.DAT   $1A        5     Date of creation (Y:M:D:H:M)        $5D0308102D
+DD.NAM   $1F        32    Disk name, last char has MSB set    see above
+DD.OPT   $3F              Path descriptor options
+</screen>
+<para>
+Probably the most important byte to us here are the bytes at offsets
+$08, $09, and $0A which tell us where the root directory begins.
+Speaking of which, that is our next stop in the CoCo Zone....
+</para>
+<screen width="80">
+
+LSN=$03  03
+ 
+      0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0 2 4 6 8 A C E
+00:  BF 00 00 5D 04 1A 0D 0A 02 00 00 01 20 00 00 00    ?..]........ ...
+10:  00 00 04 00 07 00 00 00 00 00 00 00 00 00 00 00    ................
+20:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+30:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+40:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+50:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+60:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+70:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+80:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+90:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+A0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+C0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+E0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+</screen>
+<para> 
+Well here we are exactly where LSN $00 said the root directory starts,
+at LSN $000003.  But where are the filenames, you ask?  Well they
+start on the next sector.
+</para>
+<para>
+This sector is called a File Descriptor sector or FD for short.  Every
+file or directory on an OS9 disk has one of these.  This is why you can't
+store a true 360K worth of files and user data on a DSDD 40 track drive
+for example.
+</para>
+<para>
+For our purpose I'm going to skip the explanation of the first 16 bytes
+and get on with what we need from this sector to start finding data.
+</para>
+<para>
+Starting with offset $10 ($0310) is what is called a segment list.  This
+segment list tells OS9 where a file or directory on disk is located and
+how many sectors that file or directory occupies.  There are 48 of these
+segments avaiable each being 5 bytes wide.  For you programmers, think of
+it as a two dimensional array such as: DIM segment(48,5).  What this
+means is that your file or directory can occupy space in 48 different
+locations on disk if it is badly fragmented.
+</para>
+<para>
+In this case mine only occupies one segment starting at LSN $0400 and
+is 7 sectors in size.  So guess where our trip through the OS9 disk
+takes us next?  If you said sector 4 or offset $0400 your right!
+</para>
+<screen width="80">
+
+LSN=$04  04
+ 
+      0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0 2 4 6 8 A C E
+00:  2E AE 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+10:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03    ................
+20:  AE 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+30:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03    ................
+40:  43 4D 44 D3 00 00 00 00 00 00 00 00 00 00 00 00    CMDS............
+50:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B    ................
+60:  53 59 D3 00 00 00 00 00 00 00 00 00 00 00 00 00    SYS.............
+70:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 0A    ................
+80:  72 69 62 62 73 2E 63 66 E7 00 00 00 00 00 00 00    ribbs.cfg.......
+90:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 2F    .............../
+A0:  72 69 62 62 73 67 EF 00 00 00 00 00 00 00 00 00    ribbsgo.........
+B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 AC    ...............,
+C0:  4D 45 4E 55 D3 00 00 00 00 00 00 00 00 00 00 00    MENUS...........
+D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 42    ...............B
+E0:  4C 4F 47 D3 00 00 00 00 00 00 00 00 00 00 00 00    LOGS............
+F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 A3    ...............#
+</screen>
+<para> 
+Well here we are, finally.  The root directory.  Again for our purposes
+I'm going to skip the first 32 bytes of this sector.
+</para>
+<para>
+Each entry for each file or directory is composed of 32 bytes.  29 of
+them represent the file or directory name while the last 3 tell where
+to find that individual files or directories FD is located on the disk.
+Looking at this perhaps you can see the importance of having your
+directory names in ALL UPPERCASE and your file names in all lowercase.
+</para>
+<para>
+In this example I have 4 directories (CMDS, SYS, MENUS, and LOGS) and
+two files (ribbs.cfg and ribbsgo).  Lets start with a file, ribbsgo
+in this case.
+</para>
+<para> 
+Its entry starts at offset $A0 ($04A0) and ends at $BF ($04BF).  The
+first 29 bytes as I said are for the file name, the last character of
+which has its Most Significant Bit set to mark the end of the file
+name.  The last 3 bytes tell us where to find the FD for ribbsgo which
+is $0002AC or $02AC since the Most Significant Byte is 0.
+</para>
+<para>
+So this is where we are off to next, sector $02AC.
+</para>
+<screen width="80">
+
+LSN=$2AC  684
+ 
+      0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0 2 4 6 8 A C E
+00:  0B 00 00 5D 04 19 0C 11 01 00 00 04 A5 5D 04 19    ...]........%]..
+10:  00 02 AD 00 05 00 00 00 00 00 00 00 00 00 00 00    ..-.............
+20:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+30:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+40:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+50:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+60:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+70:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+80:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+90:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+A0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+C0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+E0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+</screen>
+<para> 
+Ok here we are.  This FD is very similar to the one we examined on our
+way to the root directory.  It contains all the same information and
+takes on exactly the same format as the FD for the root directory except
+that this time we are talking about a file and not a directory.
+</para>
+<para>
+It tells us that our file, ribbsgo, begins at sector $0002AD or $02AD and
+occupies 5 sectors.  So that is where we will go next.  For the purposes
+I will only include the first and last sectors in this text as examples.
+I forgot to mention that we have proceeded through pages 5-3, 5-4, and
+most of 5-5 of the technical reference section at this point.
+</para>
+<screen width="80">
+
+LSN=$2AD  685
+ 
+      0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0 2 4 6 8 A C E
+00:  6F 6E 65 72 72 20 67 6F 74 6F 20 66 61 74 61 6C    onerr goto fatal
+10:  65 72 72 6F 72 0D 63 64 20 2F 64 64 0D 63 78 20    error.cd /dd.cx
+20:  2F 64 64 2F 63 6D 64 73 0D 76 61 72 2E 30 3D 22    /dd/cmds.var.0="
+30:  22 0D 64 69 73 70 6C 61 79 20 30 43 20 30 32 20    ".display 0C 02
+40:  33 34 20 32 32 20 31 42 20 33 32 20 30 33 20 30    34 22 1B 32 03 0
+50:  35 20 32 30 0D 65 63 68 6F 20 50 6C 65 61 73 65    5 20.echo Please
+60:  20 49 6E 73 65 72 74 20 79 6F 75 72 20 4F 53 39     Insert your OS9
+70:  20 42 6F 6F 74 20 44 69 73 6B 20 69 6E 20 2F 44     Boot Disk in /D
+80:  30 2E 0D 64 69 73 70 6C 61 79 20 30 32 20 34 45    0..display 02 4E
+90:  20 32 45 20 31 42 20 32 32 20 30 31 20 31 41 20     2E 1B 22 01 1A
+A0:  31 30 20 31 39 20 30 33 20 30 30 20 30 31 20 30    10 19 03 00 01 0
+B0:  31 20 30 32 20 32 36 20 32 32 0D 65 63 68 6F 20    1 02 26 22.echo
+C0:  50 72 65 73 73 20 41 6E 79 20 4B 65 79 0D 76 61    Press Any Key.va
+D0:  72 2E 30 0D 2A 6E 6F 6B 65 79 70 72 65 73 73 0D    r.0.*nokeypress.
+E0:  69 66 20 25 30 3D 22 22 0D 67 6F 74 6F 20 6E 6F    if %0="".goto no
+F0:  6B 65 79 70 72 65 73 73 0D 65 6E 64 69 66 0D 64    keypress.endif.d
+</screen>
+<para> 
+Well we made it!  The actual file data.  There are no special codes or
+anything of that nature here to explain.  Just the ASCII codes for the
+contents of the ribbsgo script file.  With program modules it would be
+the hexadecial representations of the commands and variables and such
+within the program.
+</para>
+<para>
+As I said there are 5 consecutive sectors (or 1 segment) that this file
+occupies but I will only include this and the last sector, because
+everything in between is technically the same.
+</para>
+<screen width="80">
+
+LSN=$2B1  689
+ 
+      0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F    0 2 4 6 8 A C E
+00:  6F 63 6D 64 73 0D 67 6F 74 6F 20 2B 65 78 69 74    ocmds.goto +exit
+10:  0D 2A 66 61 74 61 6C 65 72 72 6F 72 0D 65 63 68    .*fatalerror.ech
+20:  6F 20 45 72 72 6F 72 20 25 2A 20 69 6E 20 52 69    o Error %* in Ri
+30:  42 42 53 47 6F 2E 20 20 46 69 78 20 61 6E 64 20    BBSGo.  Fix and
+40:  74 72 79 20 61 67 61 69 6E 0D 67 6F 74 6F 20 2B    try again.goto +
+50:  65 78 69 74 0D 2A 66 69 6E 69 73 68 75 70 0D 64    exit.*finishup.d
+60:  69 73 70 6C 61 79 20 31 62 20 32 33 0D 72 69 62    isplay 1b 23.rib
+70:  62 73 6D 61 69 6E 20 23 31 36 4B 20 3C 3E 3E 3E    bsmain #16K &lt;&gt;&gt;&gt;
+80:  2F 77 37 26 0D 2A 65 78 69 74 0D 64 69 73 70 6C    /w7&amp;.*exit.displ
+90:  61 79 20 31 62 20 33 32 20 30 30 20 30 35 20 32    ay 1b 32 00 05 2
+A0:  31 20 30 43 0D 00 00 00 00 00 00 00 00 00 00 00    1 0C............
+B0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+C0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+E0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
+</screen>
+<para> 
+Ok this is the last sector of the ribbsgo file.  The important thing
+to mention here is that this file does not contain essential information
+throughout the entire sector.  The file ends with a carriage return
+($0D) at offset $A4 or $355 taking into account for the sector we are on.
+See all the $00's following that carriage return?  We don't need them.
+I'll explain how to get rid of them later, for now its enough for you to
+know that there not needed.  In some cases those extra bytes may contain
+$E5's which is the value that OS9 writes to each sector when you format
+a disk.
+</para>
+<para>
+Now that you have a basic understanding of how an OS9 disk is put
+together to become an effective storage medium we can go on and discuss
+how we are gonna go about recovering data.
+</para>
+<screen>
+
+   Up/Down Arrows  Read &amp; display Next/Previous sector
+ &lt;CR&gt; Clean up the screen display
+   *  Restart
+   $  Fork a SHELL (Ctrl-BREAK to return)
+*  A  Append displayed sector to output file
+*  C  Close output file
+   D  Diddle (adjust) file length
+   E  Edit the displayed sector
+   F  Find a byte or text string (BREAK aborts)
+   H  Help screen (also use '?')
+   L  Link to a module - List all modules
+*  N  Next occurrence of byte(s) or string (Find)
+*  O  Open a file for output (use with Append)
+   P  Push current sector onto stack
+   Q  Quit dEd - Exit to OS9
+   R  Remove and display a sector from stack
+*  S  Skip to given sector (sector # in hex)
+   U  Unlink from module
+   V  Verify all modules in file
+   W  Write the sector back to the disk
+   X  eXpert mode toggle on/off
+   Z  Zap (fill in) the sector displayed
+</screen>
+<para> 
+What you see above is the built in help from DED.  The options we will
+be using most often are the starred options above.
+</para>
+<para>
+*  S  Skip to given sector (sector # in hex)
+</para>
+<para>
+This option will let us skip to the sector(s) that we have identified
+from the file desciptors (FD's) and will speed things up considerably.
+</para>
+<para>
+*  O  Open a file for output (use with Append)
+</para>
+<para>
+Once we have found the first sector of the data we wish to recover
+we can use this option to open a path to another disk (or RAM disk)
+on which we will store the recovered data.  Since we will have to
+do some editing on the recovered file a RAM disk is recommended.
+</para>
+<para>
+*  A  Append displayed sector to output file
+</para>
+<para>
+Once we have opened the destination file for the data we are trying
+to recover this option will let us add the current sector to that
+new file.  You use this until you either reach the end of that
+particular segment (Another FD will most likely be displayed at the
+end of a segment or file) or the end of the file.
+</para>
+<screen>
+
+   Up/Down Arrows  Read &amp; display Next/Previous sector
+ &lt;CR&gt; Clean up the screen display
+   *  Restart
+   $  Fork a SHELL (Ctrl-BREAK to return)
+*  A  Append displayed sector to output file
+*  C  Close output file
+   D  Diddle (adjust) file length
+   E  Edit the displayed sector
+*  F  Find a byte or text string (BREAK aborts)
+   H  Help screen (also use '?')
+   L  Link to a module - List all modules
+*  N  Next occurrence of byte(s) or string (Find)
+*  O  Open a file for output (use with Append)
+   P  Push current sector onto stack
+   Q  Quit dEd - Exit to OS9
+   R  Remove and display a sector from stack
+*  S  Skip to given sector (sector # in hex)
+   U  Unlink from module
+   V  Verify all modules in file
+   W  Write the sector back to the disk
+   X  eXpert mode toggle on/off
+   Z  Zap (fill in) the sector displayed
+</screen>
+<para>
+-------------------------------------------------------------------------
+*  C  Close output file
+</para>
+<para>
+Now that we have recovered the data or file we must close the file before
+doing anything else with it.
+</para>
+<para>
+*  F  Find a byte or text string (BREAK aborts)
+*  N  Next occurrence of byte(s) or string (Find)
+</para>
+<para>
+If you know specific words or byte sequences to look for within the data
+or file your trying to recover then these two are handy for locating
+those words or sequences.
+</para>
+<para>
+Well we've recovered a file or data.  There is, if you recall, quite
+likely some extra unwanted bytes.  What do we do to get rid of them?
+Thats easy,  again using DED (and ident for program modules) we
+diddle with the file length.  Now you won't be dealing with real
+sector numbers, just the relative sector offset from the beginning
+of the file.  In this case it will read LSN $00 thru $04 although
+we may not actually be on sectors 0-4.
+</para>
+<para>
+
+At any rate you need to find the last relative sector of the file
+probably using the arrow keys to scroll through it.  When you reach
+the last sector look and the LSN, left column number, and top row
+number and determine the offset for the last byte (the carriage
+return) and add 1.  In this example that last byte will be at
+$04A4 then add 1 giving us $04A5.
+</para>
+<para>
+Hit D for Diddle with file length.  It will tell you the old length
+and ask for the new length.  Type it in ($04A5 for this example) and
+press enter.  You will see the extra bytes disappear in front of you.
+</para>
+<para>
+Now hit Q to quit and answer 'Y' and you have just recovered your first
+file.  Give yourself a pat on the back, get a cup of coffee and dig in
+cause your gonna be dancin on the keyboard for several hours to
+completely recover one DSDD disk.
+</para>
+<para>
+It took me roughly 24 hours to recover all data from 3-3 1/2" 756K
+floppies (I have mine formatted for 84 tracks double side rather than
+the usual 80 tracks double side &lt;Evil Grin&gt;).
+</para>
+<para>
+For some disks your directories will get trashed and there is little
+one can do to recover the directories (that I know of) in which case
+you will have to sit there with the arrow keys in DED identifying
+FD's and locating the 'lost' files.  This is what took me so long,
+my directories got trashed.
+</para>
+<para>
+This is, as I said, a time consumming method but I know of no program
+that will do it for you.  If I ever get some of my other programming
+projects finished I intend to write something, but for now this
+method will have to do.
+</para>
+<para>
+Good luck recovering that lost data!
+</para>
+</article>