home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d01xx / d0177.lha / DiskSalv / DiskSalv.doc < prev    next >
Text File  |  1989-02-04  |  24KB  |  553 lines

  1.  
  2.  
  3.             D i s k S a l v
  4.  
  5.          AmigaDOS Disk Salvage Program
  6.  
  7.          Copyright 1988 by Dave Haynie
  8.  
  9.           Version 1.32 for AmigaOS 1.3
  10.  
  11.  
  12. INTRODUCTION
  13.  
  14.     DiskSalv V1.32 is a disk recovery program for all Amiga file
  15. system devices that use either the AmigaOS V1.2/V1.3 Standard File
  16. System or the AmigaOS V1.3 Fast File System.  DiskSalv will scan a bad
  17. disk volume for anything that can be recovered, and will restore these
  18. items to any AmigaDOS volume.  It does not make any attempt to fix the
  19. bad device in place; thus, any file that can't be restored with DiskSalv
  20. might possibly be restored with an alternate method.
  21.  
  22.     DiskSalv V1.32 fixes all bugs found in DiskSalv V1.3 (there might
  23. still be bugs, but no one found them...).  There was apparently a
  24. problem that sometimes occurred with Fast Filesystem, in which files
  25. being recovered would be truncated to approximately 36K.  This is now
  26. fixed.    Another V1.3 bug was that an input disk with lots of zero length
  27. files could cause DiskSalv to crash; this as well is fixed.  And it now
  28. returns an error if the input and output devices are the same device.
  29.  
  30.     DiskSalv V1.32 also contains some improvements.  First of all,
  31. files that are suspected bad by DiskSalv will be tagged with a File Note
  32. to this effect.  Also, a "feature" of FFS could cause DiskSalv to
  33. believe that a file was much larger than it actually was, resulting in
  34. false "Disk Full" reports.  The handling of file size estimates is now
  35. much more robust, and recovery from any overflows that do occur works
  36. better.  Finally, the scan window of DiskSalv now contains a close gadget
  37. which can abort the scan.
  38.  
  39.  
  40. 1. THE BASICS OF DISKSALV V1.32
  41.  
  42.     DiskSalv V1.32 (from here on referred to as "DiskSalv") is a
  43. program designed to "salvage" any files and directories from a damaged
  44. AmigaDOS file system device to a good one.  DiskSalv is run from an
  45. Amiga CLI, and in the simplest case is used very much like the AmigaDOS
  46. "DiskCopy" program.  For example, to recover files from a bad disk in
  47. DF0: and restore them on a good disk DF1:, the user will type:
  48.  
  49.     1> DiskSalv FROM DF0: TO DF1:
  50.  
  51. Here the "FROM" and "TO" keywords are fully optional if the ordering of
  52. the input and output devices is kept INPUT OUTPUT.  The following line
  53. would also achieve the same result:
  54.  
  55.     1> DiskSalv TO DF1: FROM DF0:
  56.  
  57. In either case, DiskSalv will immediately print to the shell's screen:
  58.  
  59.     DiskSalv V1.32 Copyright ⌐ 1988 by Dave Haynie
  60.  
  61.     Salvage FROM Device DF0: TO Path DF1:
  62.  
  63.       DEVICE     =      trackdisk.device   (DF0:)
  64.       UNIT         =          0    FLAGS      =        0
  65.       HEADS      =          2    SECTORS    =       11
  66.       LOCYL      =          0    HICYL      =       79
  67.       LOBLOCK    =          0    HIBLOCK    =     1759
  68.       RESERVED   =          2    MEMTYPE    =        3
  69.       ROOT BLOCK =        880    DISK SIZE  =     1760
  70.  
  71.     Scan Range: START 2, STOP 1759, Expecting Standard FileSystem
  72.  
  73.     Should I continue [Y]
  74.  
  75. At this point, a simple RETURN entered will start up the recovery
  76. process, while an "N" followed by a RETURN will abort the recovery.
  77.  
  78. 1.1 The Scan Phase
  79.  
  80.     If we proceed with the recovery, DiskSalv will start the first
  81. phase of it's recovery.  At this point, the input device will be scanned
  82. from start to finish (blocks 2 though 1759).  DiskSalv is looking for
  83. valid AmigaDOS file or directory blocks.  A small Intuition window
  84. called "DiskSalv Scan" will open on the Amiga's WorkBench screen.  There
  85. are three columns in this window, BLOCK, NODES, and TYPE.  As each block
  86. is read, it's number is displayed under BLOCK.  This happens pretty
  87. quickly; ordinarily, there's no need to examine individual block numbers
  88. anyway.  The TYPE field indicates whether the block is a file (FILE),
  89. root directory (ROOT), user directory (UDIR), data block (DATA), unused
  90. block (FREE), unknown block type (????), or bad block (ERR!).  Note that
  91. under the new AmigaDOS V1.3 Fast FileSystem, there's no way to
  92. distinguish between DATA and FREE blocks during a scan, so these are
  93. always displayed as unknown blocks.  The final field, NODES, indicates
  94. the number of user directory or file blocks that have been located so
  95. far.
  96.  
  97.     The other feature of this phase is the file list, which takes
  98. place on the screen.  The shell window will indicate "Building Directory
  99. Map...", and the name of each directory and file that's found will be
  100. displayed under this heading.  Note that at any time during this
  101. scanning phase, clicking the Scan Window close gadget will abort the
  102. program.
  103.  
  104. 1.2 The Directory Resolution Phase
  105.  
  106.     The next phase is usually a very short one.  The scanning window
  107. will disappear, and the shell window will indicate that DiskSalv is
  108. "Resolving Stray Directories...".  During the scanning phase, when
  109. DiskSalv finds a file block, it attaches it to a directory in it's
  110. directory list.  To make the scan phase fast, however, DiskSalv only
  111. does a single linear pass over the input disk during that phase.  If the
  112. parent directory for a file or subdirectory isn't available, DiskSalv
  113. makes a dummy directory for it in it's directory list.
  114.  
  115.     Normally, all of those dummy directories get changed into normal
  116. ones as they are found in the scan.  However, there are some DiskSalv
  117. modes (covered later) that may result in only a partial scan being
  118. performed.  In this case, valid directory entires may be outside of the
  119. scanning range.  In order to get the proper names of such directories,
  120. the resolution phase goes through the directory entires in it's dummy
  121. list and tries to find real directories to match them.    If a directory
  122. can't be found, it was probably located on a bad block.  That's no
  123. problem, all that's lost is the name of that directory, not any of it's
  124. contents.
  125.  
  126. 1.3 The Directory Pruning Phase
  127.  
  128.     The next pass happens purely in memory, and it attempts to
  129. remove any empty directories from the directory list.  There are rarely
  130. any empty directories that need to be restored, and there are some
  131. DiskSalv options that tend to force a number of empty directories to be
  132. created in the directory list.    This pass can be overridden if empty
  133. directories are deemed important.
  134.  
  135. 1.4 The Disk Salvage Phase
  136.  
  137.     In this next phase, the disk structure is actually restored to
  138. the output device.  This proceeds until stopped via ^C, or until the
  139. output device is full.    If the output device fills up, a new one can be
  140. inserted if the device supports removable media.  The most common form
  141. of this would be floppy disk.
  142.  
  143.     There are certain output devices which may not return proper
  144. volume sizing information through AmigaDOS.  For instance, the RAM:
  145. device always says it's full.  A DiskSalv option allows output size
  146. checking to be turned off, and it's automatically selected if the
  147. output device is RAM:.
  148.  
  149.     DiskSalv uses normal AmigaDOS I/O routines to re-create the
  150. recovered files.  Thus, it may restore to a subdirectory instead of the
  151. root of a device.  If a subdirectory is specified that doesn't exit,
  152. DiskSalv will create it.  Similarly, DiskSalv may output to a logical
  153. volume name instead of a device name.
  154.  
  155.     On occasion, a file will be found that DiskSalv considers to be
  156. suspect.  The screen output will indicate the problem, but that tends to
  157. scroll by very quickly.  DiskSalv will now add a FileNote to any file
  158. that it suspects, indicating its concern.  This option can be overridden.
  159.  
  160.     Finally, there are occasions under which there may be file name
  161. collisions.  If the output device has a file by the same name as one
  162. that's on the input device, such a collision occurs.  DiskSalv won't
  163. overwrite files.  Instead, the colliding file is renamed before it is
  164. rebuilt.  An extension is added to it, starting at "-0" and going on up
  165. to "-100" as collisions continue to occur.
  166.  
  167.  
  168. 2. DISKSALV REFERENCE GUIDE
  169.  
  170.     The DiskSalv program is run and controlled completely via
  171. command-line arguments.  It should run without problem from all Amiga
  172. shell programs; it currently can't be run from the WorkBench.
  173.  
  174. 2.1 Command-Line Options
  175.  
  176.     There are quite a few options in DiskSalv that'll modify in
  177. various ways the recovery action described above.  The syntax for the
  178. DiskSalv command line is given as:
  179.  
  180.     DiskSalv [FROM] InDev: [TO] OutPath [FFS|NOFFS] [ASK]
  181.          [NOPRUNE] [NOCHECK] [NOTD] [NOTAG] [QUICK]
  182.          [FORMAT] [START block|ROOT] [STOP [+]block]
  183.          [MASK [a|A][r|R][w|W][e|E][d|D][p|P][s|S]]
  184.  
  185.     or
  186.  
  187.     DiskSalv HELP|INFO
  188.  
  189. The first form actually runs the program; the second form gives the user
  190. a little built-in documentation.  In each case, text in brackets ("[]")
  191. indicates an optional parameter, text outside of brackets indicates a
  192. required parameter, and "|" indicates a choice of parameters.  The
  193. options are:
  194.  
  195. ASK
  196.     This options allows the Disk Salvage pass to proceed
  197.     interactively instead of automatically.  The user is prompted
  198.     at each file or directory.  A reply of 'Y' will recover that
  199.     file or move into that directory, a reply of 'N' will skip that
  200.     item.  Replying '?' will list all the valid options.  A reply of
  201.     'A' will recover everything left at the current directory level;
  202.     a reply of 'U' will skip everything left at the current
  203.     directory level.  Finally, a reply of 'Q' will quit the program
  204.     completely.
  205.  
  206. FFS | NOFFS
  207.     This allows the disk's filesystem to be selected.  Normally,
  208.     DiskSalv can tell the difference between a fast and standard
  209.     filesystem disk, and will act accordingly.  However, if that
  210.     disk is badly damaged, this assumption may be incorrect.  In
  211.     such a case, DiskSalv will usually assume standard filesystem.
  212.     If it's assumption is wrong, the filesystem can be forced with
  213.     these options.
  214.  
  215. FORMAT
  216.     This forces the output device to be formatted before any output
  217.     files are directed to it.  If the output device isn't a device,
  218.     but instead a handler, DiskSalv will return an error message if
  219.     this option is selected; it only knows how to format devices.
  220.     DiskSalv will also offer the option of formatting the output
  221.     device if it fills up during a recovery.  An important note on
  222.     all DiskSalv formatting options -- the disk validator MUST be
  223.     accessible for the format to work.  If it's not available,
  224.     DiskSalv will refuse to format an output disk.    If you specify
  225.     the FORMAT option on the command line, DiskSalv will return with
  226.     an error message if the validator can't be located.  If you
  227.     don't specify FORMAT and the validator can't be found, a warning
  228.     will be issued.  If you go on from there, everything will work
  229.     OK, but you'll never be offered the FORMAT option.  The best way
  230.     to insure that it's present is to have the L: directory with the
  231.     disk validator in it on the same disk that DiskSalv is run from.
  232.     It may be necessary to Assign L: to that disk.
  233.  
  234. FROM InDev:
  235.     This option allows an input device to be specified.  The input
  236.     device must be a real device, not a path specification.  The
  237.     FROM keyword is optional, but can be used to allow FROM and TO
  238.     specifications to be given in any order.
  239.  
  240. HELP
  241.     The HELP option lists some information about the various options
  242.     available.  It should be specified in the command line without
  243.     any other options.
  244.  
  245. INFO
  246.     The INFO option lists some information about the program, it's
  247.     distribution, bug reporting, and other stuff.  It should be
  248.     specified in the command line without any other options.
  249.  
  250. MASK [a|A][r|R][w|W][e|E][d|D][p|P][s|S]
  251.     This options allows the user to specify a protection bit mask as
  252.     a filter.  The supported bits are "A" for Archive, "R" for Read,
  253.     "W" for Write, "E" for Execute, "D" for Delete, "P for Pure, and
  254.     "S" for Script.  Specifying the bit in lowercase indicates a mask
  255.     for that bit not set, a bit in uppercase indicates a mask for that
  256.     bit set.  For example, specifying "MASK a" will scan for only
  257.     those files that don't have the archive bit set; "MASK WD" will
  258.     scan only for those files with Write and Delete permission
  259.     enabled.  Any bits not specifically MASKed can be in either state.
  260.  
  261. NOCHECK
  262.     This option prevents the output device's size from being
  263.     checked.  Normally this would only be used with a device that
  264.     doesn't properly report it's size, and it's automatically
  265.     invoked with output to RAM:.
  266.  
  267. NOPRUNE
  268.     This option prevents the directory pruning phase from taking
  269.     place.    If the input device contains empty directories that must
  270.     be restored, use this option.
  271.  
  272. NOTAG
  273.     This option prevents DiskSalv from tagging possibly damaged files
  274.     with a FileNote explaining it's concern.
  275.  
  276. NOTD
  277.     DiskSalv does some special optimizations when it's recovering from
  278.     a floppy disk device based on the "trackdisk.device" driver.  While
  279.     there's currently no real use for this option, a future version of
  280.     "trackdisk.device" might possibly not work with these enhancements.
  281.     This option will turn the enhancements off, making a recovery from
  282.     the "trackdisk.device" work exactly like any other recovery.
  283.  
  284. QUICK
  285.     This option performs a quick scan.  The scan speed is improved
  286.     by not displaying the block number and type information for every
  287.     block.    This doesn't make as much difference as it did in the
  288.     earlier versions of DiskSalv; the "DiskSalv Scan" window routine
  289.     has been greatly sped up this display.
  290.  
  291. TO OutPath
  292.     This option allows an output path to be specified.  The output
  293.     device can be any valid AmigaDOS file device specification.  The
  294.     TO keyword is optional, but can be used to allow FROM and TO
  295.     specifications to be given in any order.
  296.  
  297. START block | ROOT
  298.     This option allows the scanning routine to start at any place on
  299.     the input device.  This position is either given as a decimal
  300.     block number, or as the string ROOT.  Since many files are
  301.     clustered after the directory root on most disks, it's often
  302.     possible to get many of a disk's files back starting the scan
  303.     there instead of at the start of the disk.
  304.  
  305. STOP [+]block
  306.     This option allows the scanning routine to stop at any place on
  307.     the input device.  This position is either given as a decimal
  308.     block number, or (via the optional "+") as an offset relative to
  309.     the START of the disk.    Thus, specifying START ROOT STOP +50
  310.     would scan a disk's root and the next 49 blocks.
  311.  
  312. 2.2 Input Device Specification
  313.  
  314.     DiskSalv requires a DOS name specification for its input device.
  315. Such a name is automatically created by the operating system for each
  316. 3.5" disk drive attached, and for some hardware add-ons during automatic
  317. device binding process initiated by the AmigaDOS BindDrivers command.
  318. Other DOS names are created by the Mount command and the MountList file.
  319.  
  320.     On occasion, a few problems show up in this theory.  First of all,
  321. a device like a hard disk may store its physical layout, necessary to
  322. create a DOS node, on the disk itself.    If the disk is damaged, this
  323. special information may not be available any longer, and as a result, the
  324. hard disk's device driver won't be able to create a DOS node.  In this
  325. case, the user will have to create a MountList entry by hand for the
  326. device.  This device will then be Mount-ed, and DiskSalv can take over
  327. from there.
  328.  
  329.     The other problem I've found is that allowing AmigaDOS to access
  330. a bad volume can occasionally result in a system crash.  With a mounted
  331. volume, that's no big problem; AmigaDOS won't try to access the
  332. device, or even load the device driver, until that drive is actually
  333. accessed.  It's OK, and in fact required by DiskSalv, to just "Mount"
  334. the device.  With floppies, this is a bit harder.  The trackdisk.device
  335. looks for a diskchange signal from all 3.5" floppies, whenever a floppy
  336. is changed.  So as soon as you insert a floppy disk, DOS will look at it.
  337. If that disk causes a crash, it'll take effect as soon as the disk is
  338. inserted.  Fortunately, there's a cure for this.  You can run DiskSalv,
  339. giving it the proper device input, without the floppy actually in the
  340. device.  Once DiskSalv starts up (at the "Should I Continue [Y]" prompt),
  341. it inhibits that drive.  The dangerous floppy can then be inserted
  342. without any problems.
  343.  
  344. 3. WARNINGS AND ERRORS
  345.  
  346.     DiskSalv produces a variety of error messages when it thinks
  347. something is wrong.  These fall into two basic classes.  First of these
  348. are fatal errors that may result from the program being run incorrectly
  349. in some way.  This results in the program terminating with a message of
  350. some kind.  The second class are warning messages that result due to some
  351. condition DiskSalv reacting to, but don't actually stop the program from
  352. executing.
  353.  
  354. 3.1 Fatal Errors
  355.  
  356. "Illegal Command Line Option"
  357.  
  358.     You typed an invalid option at the cli.  DiskSalv options are case
  359. independent, but must match exactly letter for letter.
  360.  
  361. "DiskSalv User Abort"
  362.  
  363.     You terminated DiskSalv with a ^C or other user-invoked abort.
  364.  
  365. "Must have input and output objects"
  366.  
  367.     You didn't specify both a "TO" and a "FROM" device on the command
  368. line.  There are no default input or output devices.
  369.  
  370. "Input DEVICE Not Mounted"
  371.  
  372.     The input device specified does not appear in the system device
  373. list.  It's possible that you just forgot to mount the device.
  374.  
  375. "START/STOP flag conflict"
  376.  
  377.     This is usually the result of specifying a START block greater than
  378. your STOP block.  DiskSalv won't scan a disk backwards.  It's also possible
  379. that you specified an out-of-range block.
  380.  
  381. "Out of Memory"
  382.  
  383.     If DiskSalv can't get the memory it needs, this error message will
  384. result.  This will only happen if it can't get memory that's absolutely
  385. necessary.  On systems with lesser memory, some features may no be invoked
  386. if the memory in the system gets too low, but this will not result in an
  387. error message.
  388.  
  389. "DiskSalv cannot format output device\n"
  390.  
  391.     You have requested the FORMAT option for an output device that
  392. DiskSalv doesn't know about, format-wise.  DiskSalv only knows how to
  393. format standard devices, like "trackdisk.device", "ramdrive.device",
  394. "hddisk.device", etc.
  395.  
  396. "Input and output object collision"
  397.  
  398.     You've specified the same device for both input and output; that's
  399. not permitted.
  400.  
  401. "Cannot get 'intuition.library'"
  402.  
  403.     For some reason, the inutition.library cannot be opened by DiskSalv.
  404.  
  405. "Cannot get 'dos.library'"
  406.  
  407.     For some reason, the dos.library can't be opened by DiskSalv.
  408.  
  409. "Cannot create message port"
  410.  
  411.     DiskSalv can't create the message port it needs for using the
  412. input device driver directly.
  413.  
  414. "Cannot find the disk validator"
  415.  
  416.     You have requested the FORMAT option for an output device, but
  417. DiskSalv can't find the disk validator necessary to validate that device
  418. after formatting it.  The disk validator is found in the "L:" directory.
  419. This mistake is most commonly made when recovering your normal system
  420. disk.
  421.  
  422. "Cannot create I/O port"
  423.  
  424.     DiskSalv can't create the I/O port it needs for using the input
  425. device driver directly.
  426.  
  427. 3.2 Run-Time Warnings
  428.  
  429. "No formatting, cannot find disk validator"
  430.  
  431.     The disk validator isn't around, but since you may not need it,
  432. we go ahead.  If this warning is printed, you lose the option to format
  433. output disks during a recovery.
  434.  
  435. "Resolving link conflict # <-> #"
  436.  
  437.     This warning results from a condition on there input disk where, for
  438. a data block on that disk, the block's file header link and block chain link
  439. don't match.  DiskSalv tries to resolve this conflict by choosing the best
  440. of the two, but it is possible that neither is the proper choice.  This will
  441. only happen with Standard FileSystem; there is no data block chain link in
  442. the Fast FileSystem.
  443.  
  444. "Bad Extension Block - No More Link Check"
  445.  
  446.     Under Standard file system, an Extension block can't be found.  We
  447. can still proceed.  Under Fast FileSystem, this could never happen.
  448.  
  449. "Possible Disk Fault, File may be incomplete"
  450.  
  451.     This is printed for each file that was recovered from a partially
  452. bad trackdisk sector.
  453.  
  454. "Disk Fault, File may be incomplete"
  455.  
  456.     Means pretty much the same thing as the last one, only that this
  457. time we're certain that a block be sure about that.
  458.  
  459. "Double Disk Fault, File truncated"
  460.  
  461.     There have been serious errors in the current file, to the extent
  462. that the file may not be recoverable.
  463.  
  464. 4. KNOWN BUGS
  465.  
  466.     There currently appears to be a problem with the DiskSalv formatting
  467. routine and some devices.  This option is really intended to support the
  468. formatting of multiple floppies during a recovery of a large volume such as
  469. a hard disk, and to date, no problem with floppies has been discovered.
  470. A future release of DiskSalv will definitely fix this problem.
  471.  
  472.  
  473. 5. THE FUTURE OF DISKSALV
  474.  
  475.     The next release of DiskSalv is already in development, so don't
  476. consider this a dead end.  I am actively seeking any and all feedback on
  477. the subject.  Please, if there's something that doesn't work right, or
  478. something DiskSalv isn't doing that you'd like to see it do in the future,
  479. please let me know.  I can't put it in there if I don't think of it.
  480.  
  481.  
  482. 6. LISCENCING AND DISTRIBUTION
  483.  
  484.     This program may be distributed free of charge, provided that no
  485. extra restrictions are placed on it.  Nominal charges for copying or
  486. on-line services are permitted provided that they are only for those
  487. services.  This program was written to help out the Amiga community, not
  488. to make folks feel guilty.  Thus, no payment is required for its use.
  489.  
  490.     I certainly don't mind donations, including donations of bug
  491. reports, comments, suggestions for future enhancements, macadamia nuts,
  492. or even software.  BUT PLEASE, DON'T SEND ME ANY PIRATED SOFTWARE.  YOU
  493. WILL REGRET IT.  I wouldn't have thought it necessary to mention this,
  494. given the quality of the people working with the Amiga (intelligent folks
  495. recognize superiority).  But I received several such disks from users of
  496. DiskSalv V1.0.    They all came from out of the country, and served me just
  497. fine as blank disks.  But it really annoys me to see this.  Anyway, I can
  498. be reached at:
  499.  
  500.         Dave Haynie
  501.         645 Allen Avenue
  502.         Gibbstown, NJ 08027
  503.  
  504.         BIX:    hazy
  505.         PLINK:    D-DAVE H
  506.         USENET: ...!cbmvax!daveh
  507.  
  508. If you really want to send money, consider sending a donation instead to:
  509.  
  510.         GreenPeace
  511.         1436 U Street NW
  512.         Washington, DC 20009
  513.  
  514. Tell me about it, and I'll include you in my registration files.  I know
  515. you don't get rich from "ShareWare"; while I got some donations from
  516. DiskSalv V1.0 (which I'm certainly very grateful for), they certainly
  517. didn't pay for the writing of DiskSalv V1.32.  I wrote DiskSalv V1.32
  518. because it's needed, because I like to write programs in my spare time,
  519. and for my ego -- if I didn't write DiskSalv V1.32, someone else out
  520. there is going to write a better disk recovery program, and then mine
  521. won't be the best any more.  Don't know if DiskSalv V1.32 necessarily is
  522. the best these days, but I know it's better than DiskSalv V1.0.  Anyway,
  523. while DiskSalv's saving your disks, maybe the folks at GreenPeace will
  524. get a little extra money to save a few more important things, like clean
  525. air, clean water, and wildlife.
  526.  
  527.  
  528. 7. CREDITS AND THANKS
  529.  
  530.     My thanks go out to the Amiga community in general, for all the
  531. good stuff they're doing.  Special thanks to:
  532.  
  533.     - Jim Goodnow II and Manx, for SDB.  Which is why DiskSalv V1.32
  534.       is out now instead of next year.
  535.     - Bill Hawes for AREXX and WSH, which help make the Amiga the best
  536.       programming environment I've ever used.
  537.     - Commodore, for letting me build that great 32 bit CPU board
  538.       that makes compiles go so fast.
  539.     - Iggy and Banzo, for keeping my feet warm.
  540.     - The Arthur Guinness Company.
  541.     - The gang at PLINK for continued help.
  542.     - Beta testers and other folks who've helped out, including:
  543.       Greg Berlin, Bob Eller, Michael van Elst, Andy Finkel,
  544.       Peggy Herrington, Dan James, Harv Laser, D.C. Murphy, Brian
  545.       Neissan, Steve Pietrowicz, Larry Rosenman, Mike Scalora, Bill
  546.       Seymour, Jon Wolf, and all the folks I've probably forgotton
  547.       to mention (lots my list; next time I'll keep much better
  548.       track of who's doing what in beta testing).
  549.  
  550.                 -Dave Haynie
  551.                  November 23, 1988
  552.  
  553.