
             QCACHE, QDMA, and QDBOOT -- DOS Disk Drivers, V5.7
           ======================================================

1. Description
   -----------

   QCACHE, QDMA, and QDBOOT are a package of DOS hard-disk drivers.

   QCACHE is a DOS hard-disk caching driver.   It intercepts DOS "Int 13h"
   I-O requests to the BIOS and will cache data for up to 8 hard disks, of
   which 4 may be UltraDMA disks.   New types with over 128-GB of data are
   supported.   QCACHE accepts 48-bit LBA mode and 24-bit CHS mode DOS I-O
   requests, so it works with new and old DOS systems.   QCACHE caches 2.5
   to 250 MEGABYTES of disk data!    With UltraDMA disks, all possible I-O
   is handled through its XMS cache buffers, for better speed and to avoid
   "intermediate" main-memory transfers!   QCACHE calls the BIOS to handle
   I-O for other disks.   So, it offers caching to ALL hard-disks on a DOS
   system!   SATA and other non-UltraDMA disks need only their BIOS logic.
   DOS "Int 13h" drivers can load before QCACHE, and it can cache data for
   their disks, too!

   QCACHE has its own internal UltraDMA logic!   Full handling of UltraDMA
   or "SATA-to-IDE converted" disks is provided, for use on PC systems and
   mainboards with standard UltraDMA chips from Intel, VIA, SIS, ALi, etc.
   With its internal UltraDMA logic, QCACHE can run 4 UltraDMA and 4 other
   type disks.   If /N is given or no UltraDMA disks are found, QCACHE can
   disable its UltraDMA logic and then run up to 8 hard disks of any type,
   along with their DOS drivers if available.   QCACHE uses 3.5K to 10K of
   memory depending on the cache size desired.   The "driver" is only 2.5K
   and the rest is its search table.    An XMS manager (QHIMEM or similar)
   and 2.5 to 250-MB of XMS memory for a cache are also required.   64K of
   this XMS memory is a "main I-O buffer", for user requests not suited to
   UltraDMA (misaligned etc.).   QCACHE shares this buffer with the QCDROM
   driver.   See section 4 below, for /S cache sizes and other switches.

   QDMA is a small stand-alone UltraDMA disk driver, without caching.   It
   offers full-speed performance with UltraDMA and "SATA-to-IDE converted"
   disks.   QDMA can handle I-O across 64K UltraDMA boundaries with its /F
   switch.   It also handles "misaligned" or other I-O requests unsuitable
   for UltraDMA using a 64K "main I-O buffer" in XMS memory.   This buffer
   will be "shared" with the QCDROM driver.    QDMA requires 1328 bytes of
   system memory, and 128K of XMS memory is recommended (but not required)
   as a "main I-O buffer".    With its /X switch, QDMA will omit its stack
   and take only 816 bytes of memory, on systems where it loads as an "I-O
   slave" for QCACHE or other cache programs with their own stack.   Users
   needing only "basic" UltraDMA I-O support, for diagnostics or to handle
   some other type of cache, will find QDMA ideal!

   QDBOOT is a DOS "boot" driver for one or two diskettes and up to 8 hard
   disk drives.   Many users prefer the UMBPCI upper-memory driver written
   by Uwe Sieber, as it takes much less low memory than EMM386.   To avoid
   DMA trouble in UMBPCI "Shadow RAM" upper-memory, QDBOOT loads first and
   "catches" diskette and hard disk I-O above 640K.   It does such I-O one
   sector at a time, using a safe buffer in low memory and BIOS I-O calls.
   Drivers like QCACHE can then load in upper-memory and take over I-O for
   their units.   Diskettes or SATA disks may continue using BIOS I-O, and
   QDBOOT goes on "catching" their I-O for upper-memory.   UMBPCI can thus
   run safely.   QDBOOT's /W switch causes use of the DOS workspace buffer
   and its /R switch loads its logic into temporary memory.   After UMBPCI
   loads, QDREL can move QDBOOT's logic to upper-memory.   With /W and /R,
   QDBOOT uses only 32 bytes of low memory!   QHIMEM now has similar logic
   but QDBOOT/QDREL are still offered for use with other XMS drivers.

   The FLUSH.COM program is available to help verify files, after they are
   written by QCACHE.    Entering  FLUSH  at a DOS command-prompt issues a
   BIOS "reset" to every disk.    This causes QCACHE to discard all cached
   data.     Data from the disk (NOT data still in the cache!) can then be
   compared v.s. the original output.

   In V5.7+ QCACHE, /SS now requests a 2.5-MB cache and /S0 now requests a
   5-MB cache.   Each has 640 cache blocks (not 508), so the "tiny" caches
   perform better when handling LARGE data files.    V5.7+ QCACHE also has
   corrected handling of XMS errors in "protected mode".   Users of UMBPCI
   ("real mode") are unaffected, and XMS memory errors are quite rare, but
   all users should upgrade to V5.7 QCACHE, to remain "safe"!   V5.7 QDMA,
   QDBOOT, and QDREL are unchanged.

   *** NOTE ***
     Due to incessant, unfavorable posts on FreeDOS forums, these drivers
     are PROHIBITED from use with FreeDOS and will now ABORT if loaded in
     that system.   Using these drivers in all other DOS systems (MS-DOS,
     EDR-DOS, etc.) is still supported and is unaffected.


2. NO Warranty
   -----------

   All drivers in this set are offered as free software, "as is", and "use
   at your own risk" WITHOUT any warranty, not even the implied warranties
   of MERCHANTABILITY nor of FITNESS for ANY particular purpose!

   Driver questions may be addressed to Johnson Lam at <johnson@tmfc.net>.
   The author of the drivers in the U.S.A. will try to answer and will try
   to update the drivers as needed.


3. Revisions
   ---------

   V5.7   6-Apr-07  QCACHE logic for XMS memory errors corrected.   Size
                      of /SS and /S0 caches increased to 2.5 and 5-MB.

   V5.6   1-Apr-07  QCACHE now has ALL cache tables in XMS!    6K driver
                      size caches 120-MB, 10K size caches 250 MEGABYTES!
   V5.5  28-Mar-07  QCACHE "tiny" 4-MB cache added, and QSCACHE deleted.
                      Stand-alone QCACHE driver deleted, QDMA re-added.
   V5.4  23-Mar-07  QCACHE is MUCH smaller!   12K "medium" driver caches
                      120-MB, 22K "huge" driver caches 250 MEGABYTES!
   V5.3  20-Mar-07  QCACHE stand-alone UltraDMA driver corrected to post
                      full error codes.   QCACHE can set up to 30-MB for
                      V2.0 XMS drivers (ROM-DOS, etc.).
   V5.2  18-Mar-07  New QCACHE "huge" option caches up to 250 MEGABYTES!
                      Large option reduced and medium options increased.
                      QCACHE now uses the cache for UltraDMA block I-O.
   V5.1  14-Mar-07  QCACHE now has "full caching" in XMS memory for 8 to
                      200 MEGABYTES of disk data!    Thanks to Lucho for
                      helping keep QCACHE a 5K driver!    The old Sector
                      Caching driver was renamed QSCACHE.
   V5.0  29-Jan-07  QCACHE reserves high XMS memory, to allow more space
                      below 16-MB for older software.    Thanks to Erwin
                      Veermans for this idea.   Fixed a QCACHE error for
                      /N or if no UltraDMA disks are found.
   V4.9  23-Jan-07  QCACHE VDS-lock error affecting JEMM386/EMM386 users
                      corrected.   UMBPCI users not affected.
   V4.8  14-Jan-07  QCACHE updated to work with V3.8+ QHIMEM.
   V4.7   8-Jan-07  QCACHE is now "all in one" and runs as a stand-alone
                      UltraDMA disk driver!   QDMA deleted.    Thanks to
                      Luchezar Georgiev for this idea!
   V4.6  26-Dec-06  QCACHE has internal UltraDMA logic!  QDMA-C deleted.
   V4.5  21-Dec-06  QDMA-C and QDMA again run with VMWare!   Many Thanks
                      to Erwin Veermans for his help!
   V4.4  17-Dec-06  QDMA-C "A20" logic fixed, 0BBh code set for errors.
   V4.3  11-Dec-06  Added QDMA-C for "UltraDMA only" systems.
   V4.2   8-Dec-06  Corrected a QDMA load-time ERROR.
   V4.1   6-Dec-06  QCACHE /X switch deleted, added QDMA /Q data-request
                      switch.    Driver use with FreeDOS now PROHIBITED!
   V4.0  12-Nov-06  QCACHE/QDMA "A20 line" handling corrected.

            ...
            ...
            ...

   V1.0  20-Feb-06  Original release.


4. Switch Options
   --------------

   QDREL and FLUSH use no switches.

   QCACHE switch options are as follows:

      /386  Specifies a system with an old 80386 or 80486 CPU.   Newer CPU
      /486    models need no switches.    Such old CPUs must do "protected
              mode" XMS moves in smaller sections so high-speed interrupts
              are not "missed"!

      /A    Requests use of the old "alternate" EIDE controller addresses.
              /A is rarely needed -- see section 7 below for details.

      /N    Uses NO "internal" UltraDMA logic and permits handling up to 8
              hard disks of all models, not 4 UltraDMA and 4 non-UltraDMA.
              When /N is specified, or if no UltraDMA disks are found, the
              /A and /Q switches will be ignored.

      /Q    Enables awaiting "data request" before beginning UltraDMA data
              transfers.   With new SATA-to-IDE adapters by Sabrent, etc.,
              /Q must be OMITTED, as such adapters may not emulate a "data
              request" from SATA disks!   /Q is not needed with most newer
              controllers and IDE disks.   It is for "old" systems, and it
              should be used only if the driver loads O.K. but is not able
              to transfer any data.

      /Sn   Specifies the desired cache size, as follows:

                 /SS   2.5-MB cache, "tiny" 3.5K driver size,  4K blocks.
                 /S0     5-MB cache, "tiny" 3.5K driver size,  8K blocks.

                 /S1     8-MB cache, small  4.5K driver size,  8K blocks.
                 /S2    16-MB cache, small  4.5K driver size, 16K blocks.

                 /S3    30-MB cache, medium   6K driver size, 16K blocks.
                 /S4    60-MB cache, medium   6K driver size, 32K blocks.
                 /S5   120-MB cache, medium   6K driver size, 64K blocks.

                 /S6   180-MB cache, large    8K driver size, 64K blocks.

                 /S7   250-MB cache, "huge"  10K driver size, 64K blocks.

              If /S is omitted, /S2 is the default.   If not enough memory
              for the given /S is found, the largest driver that "fits" in
              available memory will be the default.   Driver "free memory"
              tests demand MS-DOS V5.0 and up.   Older DOS systems may use
              up to /S2 or 16-MB.   With an old V2.0 XMS manager (ROM-DOS,
              etc.), the maximum that can be set up is /S3 or 30-MB.   /SS
              is for "ancient" 4-MB DOS systems and can lose efficiency in
              handling today's HUGE files!   /S0 or better is recommended.

            --- NOTE ---
              QCACHE now loads in 4.5K of memory, and its lowest "default"
              is the small driver 16-MB cache.    QCACHE will NOT set less
              than a 16-MB cache, not even by "default", unless ORDERED to
              do so by the  /SS /S0 /S1  switches!    Also, once its cache
              size is set, QCACHE has no logic to reconfigure itself again
              for not-enough XMS memory.   If available XMS cannot support
              the given cache size, the driver ABORTS!   Users MUST give a
              proper /Sn switch, on systems whose XMS memory is "limited"!

   QDMA switch options are as follows:

      /A    Requests use of the old "alternate" EIDE controller addresses.
              /A is rarely needed -- see section 7 below for details.

      /F    Enables "Fast DMA".    I-O crossing an UltraDMA "64K boundary"
              is done in 2 parts, below and above the boundary, to improve
              speed.   Misaligned I-O (not at an even 4-byte address) must
              go through the driver "main I-O buffer" in XMS memory, or it
              is "passed" to the BIOS if /B is also given.

            --- NOTE ---
              NOT ALL chipsets and mainboards do multi-part DMA correctly!
              /F must be TESTED on each system and used with CARE!

      /L    Limits UltraDMA to memory below 640K.    /L is REQUIRED to use
              UMBPCI or other drivers whose "Shadow RAM" upper-memory will
              NOT do DMA!   /L can be omitted with JEMM386/EMM386 or other
              drivers that set regular upper memory.   /L makes the driver
              use its "main I-O buffer" in XMS memory for I-O beyond 640K.
              If /B is also given, such I-O is "passed" to the BIOS.

      /Q    Enables awaiting "data request" before beginning UltraDMA data
              transfers.   /Q is rarely needed -- see /Q for QCACHE above.

      /X    Reserves NO local-stack and saves 512 bytes.   /X may be given
              only if QDMA will run as a "slave" to QCACHE or other caches
              with an adequate stack.   Without QCACHE, it is best to omit
              /X and let QDMA set its own stack, so a CRASH cannot occur!

      /B    Reserves NO 64K I-O buffer in XMS memory.   I-O unsuitable for
              UltraDMA is "passed" to the BIOS.    /B can LOSE much speed!
              It is a LAST-Choice if absolutely needed or for diagnostics.

   QDBOOT switch options are as follows:

      /Mn   Specifies a "temporary" memory area when needed for QDBOOT and
              its I-O buffer, as follows:

                  /M1 = 00010000h (64K).      /M5 = 00050000h (320K).
                  /M2 = 00020000h (128K).     /M6 = 00060000h (384K).
                  /M3 = 00030000h (192K).     /M7 = 00070000h (448K).
                  /M4 = 00040000h (256K).     /M8 = 00080000h (512K).

              With no /M, QDBOOT defaults to /M5 and uses the 320K area as
              needed for temporary memory.   DOS systems may NOT load from
              address 0 up and may have temporary data anywhere in memory!
              If needed, /M can be used to alter QDBOOT's address and find
              a safe area that it can use.

      /R    Requests "relocation" of QDBOOT's logic to upper-memory.   The
              logic first goes in temporary memory.   When upper-memory is
              enabled by UMBPCI, the QDREL driver copies QDBOOT's logic to
              its final upper-memory.

      /W    Requests use of the DOS "workspace" I-O buffer.   MS-DOS V5.0+
              or similar is required.    If /W is omitted, an "old" DOS is
              used, or workspace logic is not provided by DOS, QDBOOT will
              set its own buffer.   For more details, see section 7 below.

   Most QDMA users will want /F for "Fast DMA" and /L when UMBPCI is used.
   QDBOOT users will want /R and /W to save low memory.     Other switches
   may be used as needed.   For all switches, a dash may replace the slash
   and lower-case letters may be used if desired.


5. Setup and Configuration
   -----------------------

   All drivers are loaded by command lines in the CONFIG.SYS file.    Your
   CONFIG.SYS must have lines similar to:

      DEVICE[HIGH] = [path] QCACHE.SYS [/A] [/N] [/Q] [/Sn] [/486] [/386]

      DEVICE[HIGH] = [path] QDMA.SYS [/A] [/F] [/L] [/Q] [/X] [/B]

      DEVICE = [path] QDBOOT.SYS [/Mn] [/R] [/W]

      DEVICEHIGH = [path] QDREL.SYS

   If V3.70+ UMBPCI and QHIMEM are used, "boot" drivers are unneeded!   In
   this case, UMBPCI loads first to enable upper-memory, then QHIMEM which
   provides memory to DOS, then other drivers.   /L is no-longer needed by
   V5.5+ QCACHE, but QDMA and QCDROM both need /L switches, if loaded with
   UMBPCI.   JEMM386/EMM386 can be used optionally to enable the B000-B7FF
   "monochrome" space as upper-memory, etc.     An example CONFIG.SYS file
   using V3.70+ UMBPCI and QHIMEM is as follows:

      SHELL=C:\DOS\COMMAND.COM C:\DOS /E:512 /P
      DEVICE=C:\BIN\UMBPCI.SYS
      DEVICE=C:\BIN\QHIMEM /N32 /W
      DOS=HIGH,UMB
      DEVICE=C:\BIN\EMM386.EXE I=B000-B7FF X=C400-EFFF       [Optional]
      DEVICEHIGH=C:\BIN\QCACHE.SYS /S5                       [Or QDMA /L]
      DEVICEHIGH=C:\BIN\QCDROM.SYS /D:CDROM1 /UF /L
          ..
          ..  Etc.
          ..

   When JEMM386/EMM386 is used without UMBPCI, QHIMEM normally loads first
   in "boot" mode, then the EMM driver, then QHIMEM loads in upper-memory.
   /L switches for QDMA or QCDROM are unnecessary, since the "EMM" drivers
   do not use "Shadow RAM" for upper-memory.    An example CONFIG.SYS file
   using QHIMEM in "boot" mode is as follows:

      SHELL=C:\DOS\COMMAND.COM C:\DOS /E:512 /P
      DEVICE=C:\BIN\QHIMEM.SYS /N32 /B               [/B for "boot"]
      DOS=HIGH,UMB
      DEVICE=C:\DOS\EMM386.EXE I=B000-B7FF NOEMS     [Or JEMM386, etc.]
      DEVICEHIGH=C:\BIN\QHIMEM.SYS                   [No /B used here!]
      DEVICEHIGH=C:\BIN\QCACHE.SYS /S7               [/S7 = 250-MB cache!]
      DEVICEHIGH=C:\BIN\QCDROM.SYS /D:CDROM1 /UF
          ..
          ..  Etc.
          ..

   QDBOOT and QDREL are now rarely needed.   QHIMEM now has its own "copy"
   of the QDBOOT "I-O Catcher" for use with UMBPCI, and JEMM386/EMM386 set
   normal upper-memory.   Only unusual systems may need the "I-O Catcher",
   for example, a system using disks run by BIOS logic, but the BIOS logic
   FAILS if used for upper-memory (bad BIOS programs DO exist)!   For such
   a case, /L switches should be used for QDMA or QCDROM, to be "safe" and
   avoid I-O above 640K.   The system can then be loaded using QDBOOT with
   its "I-O Catcher" and QDREL, as follows:

      SHELL=C:\DOS\COMMAND.COM C:\DOS /E:512 /P
      DEVICE=C:\BIN\QHIMEM.SYS /N32 /B                  [/B for "boot"]
      DOS=HIGH,UMB
      DEVICE=C:\BIN\QDBOOT.SYS /R /W
      DEVICE=C:\DOS\EMM386.EXE I=B000-B7FF NOEMS        [Or JEMM386, etc.]
      DEVICEHIGH=C:\BIN\QDREL.SYS                       [Moves QDBOOT up!]
      DEVICEHIGH=C:\BIN\QHIMEM.SYS                      [No /B used here!]
      DEVICEHIGH=C:\BIN\QCACHE.SYS /S5                  [Or QDMA with /L]
      DEVICEHIGH=C:\BIN\QCDROM.SYS /D:CDROM1 /UF /L     [/L to be "safe"!]
          ..
          ..  Etc.
          ..

   In these examples, QHIMEM with /B handles XMS requests temporarily, and
   QDBOOT (if used) loads drivers safely in upper-memory.   JEMM386/EMM386
   loads next to enable upper-memory.   QDREL (if used) can put the QDBOOT
   routines in upper-memory.   The main QHIMEM can load next.    QCACHE or
   QDMA can load after QHIMEM, so they can request XMS memory.   Where the
   QCDROM driver is used, it should load after QCACHE/QDMA, to "share" the
   XMS buffer.   When other "Int 13h" hard-disk drivers are used, they can
   be loaded after QHIMEM but before QCACHE, so it can provide caching for
   the other drivers as well.   For more detail, see the QHIMEM and QCDROM
   "README" files.   All other drivers in the CONFIG.SYS file (SETVER.EXE,
   ANSI.SYS etc.) can then be loaded in any desired order.

   Please be sure to set each hard disk's geometry correctly in your BIOS.
   Set it to "Auto", "LBA" or "LBA Assisted", but NOT to "None", "Normal",
   "CHS", "ECHS".   "User Cylinders/Heads/Sectors", "Revised ECHS" or "Bit
   Shift" should run but are NOT preferred.   If a BIOS has a setting like
   "UDMA Capable" for a disk, enable it.   Power-saving features such as a
   "drive spin-down timeout" should be DISABLED or driver I-O requests may
   time out!   Also, be sure to use an 80-connector cable for any UltraDMA
   disk operating in "mode 3" ATA-44 (44 MB/sec) or higher.   When cabling
   a single disk to an IDE channel,  note that you MUST use both "ends" of
   the cable, NOT one "end" and the middle connector!   This avoids ERRORS
   as an unused cable-end can pick up "noise", like a RADIO antenna!


6. Error Reporting
   ---------------

   Errors during I-O are "passed back" from QDBOOT to the calling program.
   QCACHE and QDMA work as "BIOS drivers" and post I-O errors in the usual
   BIOS way.   On exit from successful I-O, the AH-register is zeroed, and
   the carry flag is reset.   For an I-O error, the carry flag is SET, and
   the AH-register has one of the following error codes:

      Code 08h - DMA timeout.         CCh - Disk FAULT.
           0Fh - DMA error.           E0h - Hard I-O error.
           20h - Controller busy.     FFh - XMS memory error.
           AAh - Disk not ready.

   V5.5+ QCACHE now posts all the above error codes (the BBh "Unspecified"
   code is no-longer used).    Note that DOS programs often display only a
   "Disk Error" message with NO code!   If disk errors occur, a diagnostic
   program may be needed to determine the actual problem!


7. TECHNICAL NOTES
   ---------------

   QCACHE provides 9 different cache-size options.    The 8K large and 10K
   "huge" drivers are for SERIOUS caching of 180 or 250 MEGABYTES of data!
   Most DOS users will want the 6K medium driver for regular work, and the
   tiny/small drivers can be used to save memory.   All offer large blocks
   for higher capacity and smaller blocks for better efficiency.   Smaller
   blocks "lose" less memory in the last partly-full block of each file or
   if DOS caches single directory sectors.   Over 80% of the cache usually
   is occupied by file data, and directory sectors take the rest.    Cache
   losses to directory sectors are inevitable; DOS does only single sector
   directory I-O.   QCACHE "packs" cache blocks by updating or lengthening
   them when it can.    This merges groups of directory sectors (FAT data,
   etc.) and sequential file data into the minimum number of cache blocks,
   to reduce losses.    Larger cache blocks have little performance impact
   when "packed" and allow QCACHE to hold MUCH more disk data!

   QCACHE needs only /Sn to set its cache size.    It does a binary-search
   and least-used deletions, for best speed.   Cache data tables for V5.7+
   QCACHE reside in 32K or 64K of XMS memory, handled via "Fast XMS" logic
   borrowed from QHIMEM.   QCACHE "hooks" only the Int 13h BIOS I-O vector
   and is INDEPENDENT of the DOS system in use (MS-DOS, DR-DOS etc.)!   To
   keep it simpler, QCACHE does "write through" output, not delayed "write
   backs".   Though this is not optimum for disk sorts, databases or other
   "intense" tasks, the high efficiency of QCACHE lets it perform well for
   heavy-duty work!   QCACHE provides high capacity and excellent speed to
   almost any DOS system, with no need for complex caches like SMARTDRV or
   NCACHE2!   Note that QCACHE intercepts only "Int 13h" BIOS I-O requests
   and does not support drivers with ASPI or other I-O schemes.   Omitting
   such drivers and using only their disks' BIOS read/write logic will let
   QCACHE provide caching performance for all hard-disks.

   QDBOOT handles ALL diskettes or hard disks on a DOS system.   This lets
   UMBPCI work with SATA and other disks that use BIOS I-O, not "drivers".
   MS-DOS etc. may not declare a "workspace" buffer until after CONFIG.SYS
   runs, and temporary buffer memory MAY be needed!    QDBOOT checks for a
   workspace buffer on every I-O call and "picks up" the buffer as soon as
   DOS posts it.   QDBOOT /R and /W can be omitted on "odd" systems or for
   test.   NOTE:  QDBOOT does hard disk I-O in 48-bit LBA mode.   CHS mode
   (V6.22 MS-DOS etc.) causes random ERRORS with some BIOS programs!   LBA
   mode requires an "EDD BIOS", standard on virtually all PC systems since
   1997.   If the BIOS refuses LBA mode I-O (no EDD logic) for a disk, the
   disk will be IGNORED by QDBOOT!

   The /A switch permits running on systems whose EIDE controller uses the
   alternate I-O addresses.    EIDE systems, and most SATA systems with an
   EIDE controller, assign "normal" addresses of 01F0h-01F7h (primary) and
   0170h-0177h (secondary) to the EIDE channels.   However, some SATA BIOS
   programs give these addresses to their SATA channels, and they give the
   alternate 01E8-01EFh (primary) and 0168h-016Fh (secondary) addresses to
   the EIDE chip!   In such a case, /A must be used with QCACHE, QDMA, and
   QCDROM, so EIDE drives will run properly.   SATA BIOS programs show I-O
   address data for their SATA and EIDE chips, so users can "see" if /A is
   needed to deal with 01E8h or 0168h.   Normally, /A is not needed.

   The UMBPCI upper-memory manager uses system "Shadow RAM" that CANNOT do
   DMA!   Newer BIOS programs may use UltraDMA to load programs into upper
   memory.   If this is UMBPCI "Shadow RAM", a CRASH will occur!   To stop
   this, and handle new BIOS programs, the following RULES apply for using
   UMBPCI together with QCACHE or QDMA:

     A) If QCACHE or QDMA load in low memory, they must load before UMBPCI
          so they can take over all disk UltraDMA from the BIOS.

     B) When loaded in upper-memory, QCACHE or QDMA must load after UMBPCI
          so UMBPCI can enable that memory first!   QHIMEM or QDBOOT/QDREL
          can load the drivers into upper-memory safely, as shown above.

     C) QDMA must load using its /L switch, to prevent UltraDMA in "Shadow
          RAM" memory above 640K.   /L is no-longer used for V5.5+ QCACHE.

     D) Loading QDMA with both /B and /L is NOT RECOMMENDED!   This causes
          QDMA to ABORT, when loaded in upper-memory!   QDMA then requires
          XMS memory (not "Shadow RAM"!) for issuing its UltraDMA command-
          lists.   Also --

     E) If QDMA loads in low memory with /L, XMS is still recommended, and
          if CHS I-O will be done (MS-DOS V6.22 or older), every disk must
          have proper CHS values.   Improper CHS data, or no XMS for QDMA,
          forces some I-O to be "passed" to the BIOS.   When BIOS UltraDMA
          has not been DISABLED, the same CRASH will occur!

   These rules are only "advice", and the drivers have no logic to enforce
   them.   To run UMBPCI with QCACHE/QDMA, the USER must obey these rules!

   The EDD BIOS for old "notebooks" (IBM ThinkPad, etc.) or mainboards may
   be missing/incomplete, and QCACHE may not find needed "DPTE" data while
   scanning for UltraDMA disks to use!   If no disks are found via the EDD
   BIOS, a hardware-only scan is done.   In such a case, all these drivers
   assume the BIOS assigns the disks DEFAULT "units", as follows:

       A) Primary-master   disk must be BIOS "unit 80h".
       B) Primary-slave    disk (if present) must be BIOS "unit 81h".
       C) Secondary-master disk (if present) must be BIOS "unit 82h".
       D) Secondary-slave  disk (if present) must be BIOS "unit 83h".

   These default "units" are used ONLY if the UltraDMA disks are cabled to
   the system as above.    The first disk MUST be primary-master, a second
   disk must be primary-slave etc.   Other IDE units may use the remaining
   IDE positions, so the BIOS "sees" all UltraDMA disks FIRST!   When SCSI
   disks are used too, their controller BIOS (if any) must be DISABLED, so
   SCSI disks are not given BIOS "units".   An IDE disk must "boot" such a
   system.    After "boot", the controller's DOS driver can be used to run
   SCSI disks.   Note that if a full EDD BIOS is present and hardware-only
   scans are not needed, SCSI or IDE disks may be set up in ANY order, and
   a SCSI controller BIOS may be enabled.

   Some "CD-ROM boot" programs handle the CD/DVD as a "fake" hard disk and
   provide incorrect EDD BIOS data for it!   In scanning for disks to use,
   the drivers may display "EDD BIOS error!  Unit ignored.", then continue
   looking for more UltraDMA disks.   Users who did NOT "boot" from CD/DVD
   need to see which disk was passed-over and why.    Users who DID "boot"
   from CD/DVD, when all UltraDMA disks are detected O.K., may IGNORE this
   message!     It is caused by an ERROR in the "CD-ROM boot" program, NOT
   by a problem with these drivers or their UltraDMA disks!

   Some BIOS programs may NOT "configure" a mainboard controller chip when
   no user devices are found!   When the drivers detect no UltraDMA disks,
   QDMA displays "No disk to use", then it aborts.     QCACHE will display
   "No UltraDMA disk" and then proceed without its UltraDMA logic.    But,
   the drivers check for an UltraDMA controller chip first, and an "uncon-
   figured" chip may cause "BAD UltraDMA controller" to be displayed, then
   an abort!   If the latter message displays, users must first check that
   every hard disk was set "active" using the BIOS set-up logic.   If this
   WAS done, "BAD controller" means the chip did NOT get both "Bus Master"
   and "I-O Space" commands, and the BIOS needs to be UPDATED!   Also note
   that all these drivers will not handle a "Native PCI mode" chip (i.e. a
   "server"), only a "Legacy IDE mode" chip.

