home *** CD-ROM | disk | FTP | other *** search
- RESTORE.DOC - Documentation for F/RESTORE.COM
-
- Current Versions: FRESTORE - 1.3
- RESTORE - 1A
-
- Significant changes from the previous version are
- indicated by asterisks (*) in the left margin.
-
- Note that the program previously called RESTORE is now
- called FRESTORE. The program now called RESTORE is
- completely new. So, FRESTORE 1.3 is the updated
- version of RESTORE 1.2. Sorry for the name change,
- but I expect the 'new' RESTORE to get the most in the
- way of development, and to be the restoration utility
- that most people use most often. But, since the
- original version will also be used, I couldn't just
- declare a quantum revision and start over with RESTORE
- Version 2.0. Oh well.
-
- Description:
-
- F/RESTORE is a utility program that improves disk
- performance by re-grouping the allocation groups
- assigned to each file on the disk so that each
- file is allocated to sequential sectors on the
- disk, i.e. 'restoring' the disk to the condition
- it was in when it was new.
-
- Discussion:
-
- CP/M-compatible operating systems store files on
- disk in what are called "allocation groups." The
- size of an allocation group is determined by the
- system's BIOS, and is typically 1K or 2K bytes
- for floppy disks, and 2K, 4K, or 8K for hard
- disks. The allocation group is the smallest unit
- of storage on the disk; if you write a one-byte
- file to the disk, it will take up just as much
- space (in the sense of making that space
- unavailable for storing other files) as would a
- file the size of one entire allocation group.
-
- When a disk is formatted, all allocation groups
- are free, and the first file written to the disk
- occupies the allocation groups immediately after
- the directory, in sequence. The next file
- written to the disk occupies the groups after the
- first, and so on. When a file is deleted, its
- allocation groups are freed up, and may be reused
- by the system.
-
- As files are written and erased, later files
- start to become 'fragmented'; i.e. they are
- written with some allocation groups in one
- location and other groups in other locations.
- Thus, when these 'fragmented' files are read or
- written, the system must position the read/write
- head over one track for part of the file, then
- move the head to another track for more of the
- file. This starts to degrade disk performance,
- because more and more time is spent moving the
- head around to find the various parts of the
- file, causing access times for the files to get
- longer and longer. This problem affects both
- floppy and hard disks. The effect this has on
- the system response is dependent on how the
- system buffers the disk data in memory. A system
- that uses a 'track buffer' system, where an
- entire track is saved in memory each time the
- disk is read, will be VERY much slower when
- accessing severely fragmented files than when the
- files are stored in sequential allocation groups,
- and thus several related groups are kept in
- memory together. Similarly, a system that uses
- multiple-sector disk I/O will be seriously
- degraded by disk fragmentation. Conversely, an
- unbuffered BIOS, and especially an unblocked
- BIOS, will be less affected, because latency (the
- time the controller has to wait for the desired
- sector to rotate under the head) is more
- significant in comparison to track stepping times.
-
- The only way to recover from this situation has
- been to copy all files on the disk to backup
- disks, reformat the disk (or simply erase all the
- files), and then recopy the files from the backup
- disk(s) to the working disk. This takes a
- significant amount of time to do, and it is even
- more inconvenient if files are assigned to
- several user areas on the disk, since each user
- area on the backup disk must be individually
- entered and the files in that area copied to the
- corresponding area on the work disk.
-
- F/RESTORE is designed to make this process easier
- by eliminating the copy to and from the backup
- disks. F/RESTORE works only on the disk being
- restored, and thus may be used even in a
- single-disk system.
-
- ***WARNING***
-
- Since F/RESTORE does in-place restoration of the disk,
- is has simply INCREDIBLE potential for wreaking
- havoc with your disk if something goes wrong while
- it is working, like a loss of power or a controller
- fault. Therefore, you should ALWAYS back up the
- disk to be F/RESTOREd shortly before running the
- program. This shouldn't be much of a problem, since
- you do a full back up of your hard disk at least
- every weekend, right? RIGHT? NO?!! Well, if you
- don't, you should. It only takes one occurrence of
- having to rebuild a disk's directory one group at a
- time to make you a believer. Just after a full
- backup is the optimum time to run F/RESTORE.
-
- Versions:
-
- * There are two versions of RESTORE. The version
- * called FRESTORx, where 'x' is either 'I' or 'Z',
- is the fully-relocating, 'brute-force' method
- version. It will move every group on the disk,
- if necessary, to get all groups to be in
- sequence. This version is much slower than the
- other, but will always be able to return the disk
- to a 'like-new' condition.
-
- * The second version, called 'RESTOREx', with 'x'
- * again being 'I' or 'Z', only insists on each
- * directory entry having sequential groups
- * allocated to it. It will typically move many
- * fewer groups than the fully-relocating version,
- * and is therefore much faster. However, since it
- * only moves enough groups to get each directory
- * entry back in sequence, it will leave 'holes' in
- * the allocation map of the disk. Over time, these
- * 'holes' may become small enough that they can not
- * be reused by RESTORE, and it is not able to get
- * all directory entries back in sequence. If this
- * happens, RESTORE will fix as many directory
- * entries as it can, and will ask you to use
- * FRESTORE to recover the lost space on the disk.
-
- Throughout this documentation, any discussions
- that apply both to FRESTORE and to RESTORE will
- talk about 'F/RESTORE'. Those topics that only
- apply to one version of the program will continue
- to refer to the name of the appropriate version,
- either 'RESTORE' or 'FRESTORE'.
-
- Use:
-
- NOTE: FRESTORE (only) wants the directory of the
- disk to be restored to be sorted first, by
- running SAP or CLEANDIR or some similar program.
- * If FRESTORE finds that the directory is not
- * sorted, it will tell you so and ask if you want
- * to restore the disk anyway. Also note that some
- older versions of CLEANDIR, SAP, etc. did not
- properly sort the directory because they did not
- include the last directory entry on the disk in
- the sort. FRESTORE WILL find this entry, and
- will tell you that your directory is not sorted.
- You can use DUU, DU3, PATCH, or your own favorite
- disk utility to examine the directory of the disk
- to see what is wrong.
-
- Once you have the disk's directory sorted, if
- required, simply start the program by typing
- 'FRESTORE' or 'RESTORE'. The program will sign
- on, and ask you to change disks if you desire.
- This allows single-disk users to place the disk
- containing the program in the drive, start the
- program, and then swap in the disk to be
- restored. This means you don't have to copy the
- program to each disk you want to restore.
-
- Note that F/RESTORE --ALWAYS-- works on the
- user's default disk, i.e., the one you were on
- when you invoked the program. So, if you want to
- restore the disk in drive B but F/RESTORE is on
- the disk in drive A, you MUST log onto disk B and
- then call the program from drive A, i.e.
-
- A>b:<cr>
- B>a:restore<cr> or a:frestore<cr>
-
- F/RESTORE reads in the directory of the default
- disk, analyzes the directory, and prints some
- information; how many directory entries are on
- the disk, how many groups are allocated, how many
- groups have to be relocated, and how many times
- the directory will be rewritten. This last is
- significant since 1) directory writes usually
- take much longer than other writes, because most
- BIOSs immediately write their buffer to the disk
- after a change in the directory, rather than
- waiting until the user wants to write somewhere
- else, and 2) the directory takes up several
- allocation groups, and the entire directory is
- rewritten after each directory entry has been
- fixed. Note that the number of directory entries
- reported by F/RESTORE will probably not match the
- number of files on the disk, since each extent of
- a file takes up its own directory entry.
-
- After F/RESTORE tells you what it is going to
- have to do to the disk, it asks you to type 'Y'
- to restore the disk, or anything else to abort.
- You may enter an upper or lower case Y, or even
- type Control-Y. Anything else will cause
- F/RESTORE to abort without doing anything to the
- disk.
-
- After you type 'y', F/RESTORE will start to fix
- your disk. It prints the name of the directory
- entry is is working on, including the extent, so
- you can keep track of how it is doing. You may
- type a Control-C at any time, and F/RESTORE will
- abort after it finishes the current directory
- entry, and tell you how many directory entries
- are left over. Left to itself, F/RESTORE will
- finish the disk, then tell you it is finished and
- terminate.
-
- If you are using a system that does not reload
- the directories from disk on each warm boot, like
- ZRDOS version 1.5 and later, you will need to do
- whatever your system needs (run DISKRST in the
- case of ZRDOS) to restore the system's directory
- to match the one on disk. Remember, F/RESTORE
- works through the BIOS, so the DOS has no idea
- * what is going on. The program may be patched to
- * automatically do this disk reset if desired; see
- * the section on user patches below.
-
- System
- Requirements:
-
- Operating System - A CP/M-compatible operating
- system that supports console input and output and
- the following direct BIOS function calls:
-
- Select Disk
- Set Track
- Set Sector
- Set DMA Address
- Disk Read
- Disk Write
- Sector Translation
-
- These are the only direct BIOS calls used by
- F/RESTORE. Console I/O is done via the BDOS, so
- you may use the Control-P to echo the output to
- your printer. If you do so, you may need to
- install the linefeed patch discussed below.
-
- Processor - Versions are provided for both
- 8080/8085-compatible processors (FRESTORI.COM or
- RESTOREI.COM) and for Z80-compatible processors
- (FRESTORZ.COM or RESTOREZ.COM). The Z80 version
- is about 5% smaller and runs about 1% faster than
- the 8080 version. Select the versions
- appropriate for your hardware and rename them to
- FRESTORE.COM and RESTORE.COM.
-
- * Memory - No particular minimum required.
- * F/RESTORE uses an incremental-read system to read
- * in the directory, so it will handle any size
- * disk. The amount of memory available determines
- * how many ACTIVE directory entries F/RESTORE can
- * handle. On a 48K TPA system restoring a disk
- * with 4K allocation groups, F/RESTORE can restore
- * a disk with about 1200 active directory entries.
- * F/RESTORE skips over erased entries as it reads in
- * the directory, so the total number of directory
- * entries on your disk (the DRM value) does not
- * affect F/RESTORE's operation.
-
- Note that F/RESTORE is NOT a ZCPR3 utility. I
- have tried to make it as nearly universal as
- possible. It does not use cursor-positioning
- sequences for the terminal, or require any
- installation. The only thing your terminal has
- to be able to do is receive and display standard
- ASCII characters, including being able to do a
- carriage return without a linefeed. This is used
- in the display of the files being processed. The
- same line is rewritten as each new file is
- started. If your terminal can not do a carriage
- return without a line feed (or makes a mess doing
- so, like a TTY), or if you want to echo the
- output of the program to your printer without
- wearing a hole in the paper, install the linefeed
- patch below.
-
- Patches:
-
- * There are three and a half user patches in the
- * program. Each one is a flag value, where 0
- * indicates 'NO' and a non-zero value indicates
- * 'YES'. The patches are located at the beginning
- * of the program. When you look at the object code
- * with your favorite debugger, you will see the
- * header '==USER PATCHES==' followed by three (or
- * four) labels. Each label ends in an arrow ( -> )
- * that points to the location of the flag. The
- * address of the patch byte is always xxxF (hex),
- * and, on a standard sixteen-bytes-per-line display
- * (DDT, ZDM, Z8E, etc.) the patch byte is always
- * the last byte on the line where the label ends.
- * Change the value at the pointed-to location as
- * needed. Remember, only zero or non-zero matters.
-
- * Patch location 1 controls the disk-change wait.
- * Its label is 'Wait for User to start?'. As
- * released, the program will print a message
- * telling you to change disks if necessary, and
- * press any key when ready. Then it waits for you
- * to press any key. Later, after the statistics
- * for the disk are printed, it asks you to press
- * 'y' to continue, or any other key to abort. If
- * you don't want these waits, or you want to do
- * unattended 'batch processing' of multiple drives,
- * you will need to patch this byte to zero. As an
- * alternative, the input for these two user waits
- * is done using the BDOS 'Read Console Buffer'
- * function, so ZEX or XSUB may be used to provide
- * the input; note, however, that doing so will cost
- * you about 3K of TPA (which equates to about 100
- * active directory entries), and may cause a memory
- * shortage problem. Try it on your largest disk.
- * If it works, you can have it both ways.
-
- * The second user patch controls linefeed output.
- * The label is 'Use Linefeed on Output?'. To make
- * the file display do a line feed as well as a
- * carriage return after each filename displayed,
- * change this value to non-zero.
-
- * The third (and last on RESTORE) patch determines
- * if the program resets the disk system when it
- * finishes. The label for this patch is 'Reset
- * Disk when Done?'. A non-zero value here will
- * cause F/RESTORE to reset the disk when it
- * completes, using function 37.
- * THIS FLAG SHOULD NEVER BE SET NON-ZERO
- * IF YOU ARE USING THE PLAIN CP/M BDOS!!
- * CP/M's function 37 has some problems with
- * reallocating space that make is unacceptable for
- * use. And besides, CP/M reloads the allocation map
- * on each warm boot anyway. If you are using a
- * modified BDOS or early ZRDOS, you may set this
- * flag, although it probably won't do much for you.
- * If you are using ZRDOS 1.5 or later, or some other
- * system that does not reload its disk allocation
- * maps on a warm boot, you SHOULD set this flag, so
- * that the system will find out about the modified
- * directory immediately. On these systems, if this
- * flag is not set, and the appropriate disk reset
- * utility is not used immediately after F/RESTOREing
- * the disk, you will probably have problems with the
- * system reallocating blocks that have been used by
- * F/RESTORE, since it doesn't know about them yet.
-
- * FRESTORE (only) has a fourth user patch
- * controlling the action taken when the directory
- * is found to be out of order. The label is
- * 'Ignore Directory Sort?'. If this value is
- * patched to non-zero, RESTORE will not ask you if
- * you want to continue if the directory is not
- * sorted, but will just go ahead on its own. This
- * patch is similar to the user-wait patch, but is
- * provided separately so that you can set up the
- * program for batch operation in conjunction with
- * CLEANDIR or SAP, but bail out if they are not
- * able to properly sort the directory.
-
- Limitations:
-
- One of the problems associated with a program of
- this type is the handling of bad sectors on the
- disk. Since there is no standard way of marking
- bad sectors, I have completely ignored the issue
- in writing the program. I recommend the
- following system for those with bad sectors on
- their hard disk:
-
- 1) You have probably used BDxx, FBAD, or
- whatever you use to mark the bad
- sectors on the disk. Use DUU, DU3,
- PATCH, or your own disk utility to
- examine the disk's directory. Note the
- allocation groups that are assigned to
- the '.BAD' (or however your utility
- marks them) files. Make a list of the
- allocation groups containing the bad
- sectors.
-
- 2) After you finish backing up your disk
- (that IS when you use F/RESTORE, isn't
- it? See the WARNING above if not), run
- F/RESTORE, then use your disk utility to
- look at the disk's directory and see
- what files are now assigned to the
- allocation groups on your list of bad
- groups. Make a list of these files.
-
- 3) Erase the files on the list.
-
- 4) Rerun FBAD, etc. to re-mark the bad
- groups.
-
- 5) Copy over the files on the list from
- your backup disk.
-
- I realize that this is somewhat cumbersome, and I
- apologize for that. But, since there is no
- standardized method for handling bad sectors,
- this is the best I have been able to come up with.
-
- Operation:
-
- FRESTORE uses a brute-force method to relocate
- allocation groups. It reads in the directory
- (which should be sorted), and decides from the
- directory allocation data in the Disk Parameter
- Block for the disk how many groups are allocated
- to the directory. The next sequential allocation
- group should be assigned to the first file in the
- directory. FRESTORE looks to see if that is the
- case. If not, it scans the directory to find
- what file has that group allocated to it. If the
- desired group is not allocated, FRESTORE copies
- the group referenced in the directory into the
- desired group, then changes the directory entry
- to show the new group. If the group is allocated
- to another file, FRESTORE reads both groups into
- memory, then writes them to the alternate
- locations, effectively swapping the groups in
- place. Both directory entries are modified, the
- next sequential allocation group is selected, and
- the process repeats. The updated directory is
- written to the disk after each directory entry is
- completed, not after each allocation group swap.
- Thus, the number of directory rewrites will
- typically be about one-half to one-fourth (on a
- hard disk; one-fourth to one-eighth on a floppy
- disk) of the number of group swaps required.
-
- When I say that the method is 'brute force', I
- mean that no intelligence is used in the sort
- process. Under worst-case conditions, the first
- allocation group on a disk might be free, with
- all other groups assigned in the desired sequence
- to the files in the directory. In this case, the
- disk is really not fragmented, and nothing needs
- to be done. If you run FRESTORE on a disk in
- this situation, it will tell you that EVERY GROUP
- on the disk must be moved, and will do so if you
- let it. No analysis of the fragmentation of the
- disk is done, and no optimization is used to
- figure out how to restore the disk using the
- least number of group swaps.
-
- * RESTORE, by contrast, is much smarter in its
- * operation. After the directory is read in,
- * RESTORE builds a table of free spaces on the
- * disk. Each table entry has the number of a free
- * allocation group and a count of the contiguous
- * free groups starting at that group. When the
- * table is built, RESTORE starts through the
- * directory. It checks to see that the allocation
- * groups assigned to each directory entry are in
- * sequential order. If they are, nothing is done.
- * If a directory entry has non-sequential groups
- * assigned, RESTORE counts the number of groups
- * allocated to that directory entry, then goes and
- * looks in the free-space table for a space that
- * has at least that number of contiguous free
- * groups. If it finds one, the groups are copied
- * to the new space, and the previously used groups
- * are returned to the free-space list. The table is
- * rebuilt after every fourth directory entry
- * requiring relocation is finished, and the table is
- * kept sorted in increasing order by the size of the
- * free space, so the search routine always returns
- * the smallest space that will hold the data needing
- * to be moved.
-
- * If there is no space in the table large enough to
- * relocate the entry, RESTORE sets a flag to tell
- * itself to make another pass through the
- * directory. The idea is that later moves may open
- * up a space large enough, by freeing up space next
- * to an already free area. When the entire
- * directory is checked, RESTORE tells you how many,
- * if any, entries could not be relocated. If there
- * are any, it starts the entire process over again,
- * starting with reading in the directory. This
- * process continues until all entries are fixed, or
- * until RESTORE is unable to relocate any more
- * entries by making another pass. If this happens,
- * it means that the remaining free spaces are too
- * small and too spread out for RESTORE to be able
- * to use them. RESTORE will recommend that you use
- * the fully-relocating FRESTORE version to recover
- * these areas.
-
- * One noticeable difference between the two
- * versions is the length of the wait between when
- * you 'Press any key to continue' (or the program
- * signs on if it is set up to skip user waits) and
- * the time it prints out the statistics. RESTORE
- * takes two to three times as long as FRESTORE,
- * since it has to build the free-space table. This
- * extra time comes back later, though, since
- * RESTORE will move anywhere from one-sixth to
- * one-tenth (or less) as many groups as FRESTORE.
-
- On the subject of speed: F/RESTORE is, in
- addition to being more convenient than copying
- all the files back from a backup disk,
- considerably faster than that method. While
- times vary depending on the degree of
- fragmentation and the hardware, I have found
- FRESTORE to be about 20% faster than a
- NON-VERIFYING copy of files from backup floppies
- back to my hard disk (F/RESTORE does
- read-after-write CRC verification of all disk
- * writes). RESTORE, since it moves many fewer
- * groups than FRESTORE, is more on the order of
- * 4-8 times as fast as a floppy backup. Plus, you
- don't have to sit around and feed your machine
- floppies for hours. FRESTORE will process a
- filled 20 Meg hard disk in about 5 hours on my
- hardware; doing the same thing, with
- verification, from floppies takes over 9 hours
- * and about 28 disk swaps! Using RESTORE cuts this
- * time to less than one hour. With F/RESTORE,
- simply use a multiple-command line or
- * ZEX/XSUB/SUBMIT file, and let F/RESTORE crunch
- * away during lunch, or while watching 'Friday the
- * 13th Part 27'. Note that if you want to use this
- 'batch processing' of multiple drives, you must
- patch the user-wait flag to zero as described
- * above to disable the two user waits. If you are
- * using FRESTORE and don't sort your directories
- * first, you will also need to patch the ignore-
- * directory-sort flag to non-zero.
-
- DISCLAIMER:
-
- This is a very useful utility, and I have tested
- it extensively. However, as noted above, it is
- also very capable of lunching your disks
- completely if the system has a problem. Use it
- in good health and happiness, but MAKE BACKUPS
- BEFORE YOU USE IT!!. Papa Wallenda ran his
- system without a backup. He's not around any
- more. 'Nuff said.
-
- * Some users of the previous version have had
- * trouble with read errors after RESTOREing their
- * disks. From the discussions I saw (actually,
- * 'overheard' is more accurate--I received copies
- * of some messages left on Chicago's 'Lillipute'
- * ZNode; the people who had the problems never
- * bothered to contact me to report the problem), it
- * sounds like their drives got hot under the,
- * admittedly, much greater than usual demands that
- * FRESTORE places on the drive, and exceeded track-
- * positioning tolerances. The new RESTORE version
- * should reduce this problem considerably, since it
- * does much less in the way of disk reads and
- * writes, and has longer waits in between directory
- * rewrites while it rebuilds the free space table.
- * PLEASE contact me if you have any problems; I
- * want to make F/RESTORE as useful as possible to
- * as many users as I can.
-
-
- Steve Dirickson 7 June 1987
- 21145 Raintree Place NW
- Poulsbo WA 98370-9726
-
- Voice: 206-697-1270/9311
-
- BBS: Seattle's 'downspout': 206-325-1325
- ZNode Central: 415-948-6656