
                         UIDE DOS Device Driver
          ===========================================================

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

   UIDE is a DOS disk and CD/DVD caching driver.   It intercepts "Int 13h"
   BIOS I-O and caches data for up to 22 BIOS disks on up to 9 "Legacy" or
   "Native PCI" SATA/IDE controllers, including A: or B: diskettes.   UIDE
   handles hard-disks of any size (has full 48-bit LBA logic!) and accepts
   48-bit LBA or 24-bit CHS I-O calls from a new or old DOS system.   UIDE
   "calls the BIOS" for diskettes and intercepts I-O for "Int 13h" drivers
   loaded first, thus UIDE caches ALL drives on a DOS system!   ("ASPI" or
   other "non Int 13h" drivers are unsupported).   Up to 4 SATA/IDE or old
   PIO-mode CD/DVD drives are also handled.    UIDE caches CD/DVD data and
   directories for MUCH greater speed, and it can play audio CDs and input
   "raw" trackwriter data (audio or trackwriting is not cached).

   UIDE caches 5 Megabytes to 4 GIGABYTES of data!    All its cache tables
   and data are in XMS memory.    UIDE uses 4448 bytes of upper/DOS memory
   for all cache sizes.    A non-caching UIDE (/B switch, no diskettes nor
   caching) can be set for tests/diagnostics and uses 3472 bytes of upper/
   DOS memory.   UIDE's /H switch can load most of the driver in free HMA,
   thus using only 880 bytes of memory (768 non-cached)!

   The small CC.COM "Clear Cache" program can help verify files written by
   UIDE.   Entering  CC  at a command prompt makes UIDE "flush" its cache.
   Disk data (NOT cache data) can then be compared to the original output.
   NOTE:  Some CompactFlash cards cause CC to execute very slowly.


2. NO Warranties
   -------------

   UIDE is offered at no cost, "as is", "use at your own risk", and with
   NO warranties, not even an implied warranty of FITNESS for any
   particular purpose nor of MERCHANTABILITY!


3. Switch Options
   --------------

   UIDE usually needs only a /H switch to use HMA space and a /S switch to
   specify its cache size.   All UIDE switches are as follows:

      /A     Specifies ALTERNATE addressing, for "legacy IDE" controllers.
                The first legacy controller uses 01E8h/0168h addresses and
                a second (if present!) uses 01F0h/0170h addresses.   /A is
                only for "odd" mainboards with REVERSED addressing for the
                two legacy IDE controllers!   Without /A, the first legacy
                controller uses 01F0h/0170H and a second uses 01E8h/0168h,
                as is normal for most PC mainboards.

      /B     Requests a "basic" UltraDMA driver for disks and CDs/DVDs, no
                caching nor diskette handling.   This may help in tests or
                diagnostics.   The /B driver can request 128K of XMS as an
                UltraDMA I-O buffer, and it can load in the HMA.

      /D:    Specifies the "device name", used by the CD/DVD Redirector to
                access CD/DVD drives.   For example:  /D:CDROM1  /D:SANYO1
                etc.   If /D: is not given, or the name following a /D: is
                missing/invalid,  UDVD1  is set by default.   If no CD/DVD
                drives were found,  UIDE$  overrides any /D: name, for use
                with FreeDOS autoloader scripts.

      /E     Makes the driver call the BIOS for any hard disk I-O request.
                /E avoids setup trouble on some DOS emulators (VirtualBox,
                etc.) that do not emulate all PC hardware logic!   /E also
                allows using hard disks on 1994 or older PCs which have no
                PCI/EDD BIOS.   /E still caches disk data, unlike /N1 that
                removes ALL disk support!   If /B is given, /E is ignored.

                ***** NOTE *****

                Using /E on protected-mode systems (JEMM386 etc.) may LOSE
                much speed!   For full details, see the "Technical Notes"
                section below. If /E is necessary, the DOS system should
                be run in real-mode (UMBPCI, etc.) whenever possible.

      /H     Loads most of the driver in "free HMA" space.   UIDE will use
                only 880 bytes of upper/DOS memory (768 when /B is given).
                /H must not be used with ROM-DOS, which has no "free HMA"!
                MS-DOS kernels have ERRORS in posting free HMA space which
                can give CRASHES!   Specifying /H is "At the user's risk!"
                and PCs should be tested before /H is used in any critical
                tasks.   FreeDOS offers no "free HMA" before FDAUTO is run
                so using /H with FreeDOS requires the drivers to load from
                FDAUTO.BAT (not from FDCONFIG.SYS).

      /N1    Requests NO hard-disk handling by the driver.

      /N2    Requests NO CD/DVD handling by the driver.

      /N3    Requests no XMS memory.    /N3 sets UIDE's /B "basic" driver.
                /N3 requires loading in low-memory, or UIDE aborts!    /N3
                can LOSE much speed, as misaligned or other I-O unsuitable
                for UltraDMA requires calling the BIOS for a disk or using
                PIO-mode for CD/DVD drives!

      /N4    See /Z.

      /Q     Awaits a "data request" before doing UltraDMA disk transfers.
                /Q is for "old" systems and may be used only if the driver
                loads O.K. but seems unable to transfer data.   /Q must be
                OMITTED with SATA-to-IDE adapters from Sabrent and others,
                since they may not emulate "data request" from SATA disks!
                /Q does not affect CD/DVD drives.

      /R15   "Reserves" 15-MB or 63-MB of XMS, for old DOS "game" programs
      /R63      which require XMS memory below 16- or 64-MB.   The drivers
                must be able to reserve this memory, reserve their own XMS
                memory beyond that, and then "free" the 15/63-MB XMS.   If
                not, the drivers display "XMS init error" and abort!   For
                further details, see the "Technical Notes" section below.

      /Snn   Specifies the desired cache size, in megabytes of XMS memory.
                Values for /S can be 5, 15, 25, 40, 50, or any number from
                80 to 4093.    If /S is omitted/invalid, an 80-MB cache is
                set.   Except for 25 or 50, values below 80 are cut to 40-
                15- or 5-MB.    UIDE displays "XMS init error" and aborts,
                if not-enough XMS memory is free!   If so, a smaller cache
                must be set.   Older V2.0 XMS managers (ROM-DOS, etc.) may
                use only /S5 to /S50.

      /UX    Disables all CD/DVD UltraDMA, even for drives that can do it.
                CD/DVD data input then uses "PIO mode".   Except for a few
                "odd" drives by Sony, etc. that do not obey ATAPI "rules",
                /UX is rarely needed.   /UX does not affect hard disks.

      /Z     For UHDD, moves protected-mode XMS data in 6K blocks (not 64K
                blocks), and for XMGR/UIDE, 2K blocks.    With JEMM386, /Z
                is unneeded.   With other EMM/VCPI/DPMI drivers, a PC must
                be tested to find if /Z is needed.   BAD schemes, allowing
                too few interrupts during XMS moves, may still be in use!

   For all switches, a dash may replace the slash and lower case letters
   may be used if desired.


4. Setup and Configuration
   -----------------------

   XMGR, UIDE, UHDD, and UDVD2 all load thru the CONFIG.SYS file.    RDISK
   loads via either the CONFIG.SYS or the AUTOEXEC.BAT file.   Your CONFIG
   or AUTOEXEC should contain command lines similar to these examples:

      DEVICE=C:\DOSDVRS\XMGR.SYS /N128 /B

      DEVICEHIGH=C:\DRIVERS\RDISK.COM /S200

      DEVICEHIGH=C:\SYSTEM\UIDE.SYS /D:TOSHIBA1 /S500 /H

      DEVICEHIGH=C:\USERDVRS\UHDD.SYS /S250 /H

      DEVICEHIGH=C:\MYDVRS\UDVD2.SYS /D:BLURAY1 /H

   Note that "Int 13h" BIOS drivers must be loaded first, so UIDE/UHDD can
   intercept and cache their I-O requests.   Note also that if UDVD2 is to
   share UHDD's XMS buffer and/or call it for CD/DVD data caching, it must
   load after UHDD, so UDVD2 can locate UHDD in memory and "link" with it.
   See the CONFIG.SYS examples below.

   With V3.70+ UMBPCI and XMGR, a "boot" procedure is not needed!   UMBPCI
   loads first to enable upper-memory, then XMGR loads to offer it and XMS
   to DOS, then other drivers may load.    For V6.22/V7.10 MS-DOS, JEMM386
   can also be loaded, to offer extra upper-memory in the "video graphics"
   areas, or if other JEMM386 features are desired.

   NOTE:  FreeDOS and some other DOS variants will not "add up" the memory
   found by both UMBPCI and JEMM386, like MS-DOS does!   FreeDOS users who
   desire more upper-memory or other protected-mode items must omit UMBPCI
   and load HIMEMX/JEMM386 per their instructions, or load XMGR/JEMM386 as
   shown in the third example below.

   An example CONFIG.SYS file using V3.70+ UMBPCI and XMGR is as follows:

          ..
          ..
      DOS=HIGH,UMB
      DOSDATA=UMB                               ;When available
      DEVICE=C:\BIN\UMBPCI.SYS
      DEVICE=C:\BIN\XMGR.SYS /W
      DEVICE=C:\BIN\JEMM386.EXE I=B000-B7FF X=C800-EFFF NOEMS   ;Optional
          ..
          ..  Int 13h drivers cached by UIDE/UHDD load now.
          ..
      DEVICEHIGH=C:\BIN\UHDD.SYS /S250 /H       ;Or UIDE alone.  Load via
      DEVICEHIGH=C?\BIN\UDVD2.SYS /H            ;  FDAUTO with FreeDOS
      DEVICEHIGH=C:\BIN\RDISK.COM /S125         ;Optional
          ..
          ..  Etc.
          ..

   XMGR can be used "stand alone" on a small XMS-only system.   It must be
   the first DOS system driver to load, and it must load in LOW memory, as
   in the following example:

          ..
          ..
      DOS=HIGH
      SHELL=C:\DOS\COMMAND.COM C:\DOS /E:512 /P
      DEVICE=C:\BIN\XMGR.SYS
          ..
          ..  Int 13h drivers cached by UIDE/UHDD load now.
          ..
      DEVICE=C:\BIN\UHDD.SYS /S80               ;Or UIDE alone.  Load via
      DEVICE=C:\BIN\UDVD2.SYS                   ;  FDAUTO with FreeDOS
      DEVICE=C:\BIN\RDISK.COM /S20              ;Optional
          ..
          ..  Etc.
          ..

   With JEMM386 and XMGR,  XMGR loads first in "boot" mode,  then JEMM386,
   then XMGR finally loads into upper-memory.   An example CONFIG.SYS file
   which uses the XMGR "boot" procedure is as follows:

          ..
          ..
      DOS=HIGH,UMB
      DOSDATA=UMB                               ;When available
      DEVICE=C:\BIN\XMGR.SYS /B                 ;Loads only XMGR's "boot"
      DEVICE=C:\DOS\JEMM386.EXE I=B000-B7FF ...
      DEVICEHIGH=C:\BIN\XMGR.SYS                ;Loads the runtime XMGR
          ..
          ..  Int 13h drivers cached by UIDE load now.
          ..
      DEVICEHIGH=C:\BIN\UHDD.SYS /S250 /H       ;Or UIDE alone.  Load via
      DEVICEHIGH=C?\BIN\UDVD2.SYS /H            ;  FDAUTO with FreeDOS
      DEVICEHIGH=C:\BIN\RDISK.COM /S500         ;Optional
          ..
          ..  Etc.
          ..

   After the above drivers are loaded, further CONFIG.SYS drivers (SETVER,
   ANSI.SYS, etc.) can then load in any desired order.

   FreeDOS users should load UIDE/UHDD/UDVD2 via FDAUTO.BAT (not FDCONFIG)
   using the DEVLOAD program, so the drivers can load in "free HMA" with a
   /H switch.   Example FDAUTO command lines are:

          ..
          ..
      DEVLOAD /H C:\BIN\UHDD.SYS /S20 /H        ;20-MB+ cache recommended
      DEVLOAD /H C:\BIN\UDVD2.SYS /H            ;Must load after UHDD
          ..
          ..  Etc.
          ..

   When a specific RDISK drive letter is required, RDISK can now be loaded
   by AUTOEXEC.BAT, and its /: switch can specify any "free" drive letter,
   e.g.  /:Q  assigns drive Q: for RDISK files.    Whenever RDISK is used,
   AUTOEXEC.BAT should also include commands to copy all RDISK programs or
   data up to the RAM-disk.   This is required each time DOS loads, as XMS
   memory is LOST when a system shuts down!    Such copies usually require
   little time.

   If RDISK and UIDE/UHDD are used, users must balance how much XMS memory
   the drivers use.   RDISK must take no more XMS than its files may need.
   UIDE/UHDD can take most remaining XMS for its caches.   Some XMS memory
   must be saved for other programs needing it!   As an example, on a 4-GB
   system, RDISK might use 500-MB, UIDE/UHDD might use 3-GB, and 500-MB is
   free for other programs.   These values can be adjusted, so RDISK holds
   programs and "fast" data files, while UIDE/UHDD cache "ordinary" files.
   Properly balanced use of XMS will give a VERY high-speed DOS system!

   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
   "UltraDMA" or "UDMA Capable" for a disk, enable it.

   "Laptop" power-saving items like a "drive spin-down timeout" should run
   O.K. but must be TESTED before use!   All these drivers allow 7 seconds
   for a disk or CD/DVD drive to spin-up, after being idle.   More DRASTIC
   power-saving items like a "drive SHUTDOWN timeout" (may require "extra"
   logic to restart the drive!) should be DISABLED, or driver I-O requests
   may time out!

   Also, be sure to use an 80-pin IDE cable with any UltraDMA drive set to
   "mode 3" ATA-44 (44 MB/sec) or higher.   When cabling a single drive to
   an IDE channel, note that you MUST use both "ends" of the cable, NOT an
   "end" and the middle connector!   This prevents ERRORS, since an unused
   cable-end can pick up "noise", like a RADIO antenna!

   Be sure to enable all CD/DVD drive(s) through the BIOS set-up routines!
   A drive that is "disabled" may cause the BIOS to clear all its UltraDMA
   flags and force the drive into "PIO mode" zero, which is terribly SLOW!


5. Revision History
   ------------------------

    5-Mar-15   UIDE now handles 9 controllers, 22 BIOS disks or diskettes,
                 4 CD/DVD drives. UHDD binary-search buffer is again 512
                 bytes. UIDE "CD/DVD" cache deleted.

   24-Nov-14   UIDE "User" caches and user-cache logic deleted, due to
                 non-use. UIDE now runs 26 disks/diskettes and 6 CD/DVD
                 drives (same as UHDD + UDVD2) which saves memory.

   26-Jan-14   UIDE error handling CD/DVD media-changes for "stand alone"
                 mode is fixed.

   12-Jan-14   UIDE /UD switch deleted (many problems!).

   12-Dec-13   UIDE /N2 dismisses CD/DVD logic. UIDE /C switch added, user
                 caching improved.

    9-Sep-13   UIDE now uses all 32 CD/DVD LBA bits in caching calls.

   15-Oct-12   UIDE again detects A: and B: diskettes from BIOS data,
                 NOT from "Int 13h" calls that FAIL with an LS-120 drive!

    2-Aug-12   New /UD switch in UIDE, for CD/DVD directory caching.

    9-Jul-12   UIDE/UIDEJR device select error, for master + slave CD/DVD
                 units on one IDE channel, is corrected.   Many Thanks to
                 Doug Beneway for finding this error!

   25-Jun-12   UIDE2 deleted:  Not-enough added speed, complex to use.

   17-Jun-12   UIDE/UIDE2/UIDEJR /A switch, init of 2 "Old IDE" channels,
                 and CD-audio "Q"/status data corrected.   Many Thanks to
                 Japheth for his research and audio-test program!

   29-May-12   UIDE and UIDE2 check for diskettes via Int 13h, avoid DPTE
                 tests if no PCI BIOS, let the BIOS do I-O for disks with
                 bad DPTE data, all re: VirtualBox BUGS!

   16-Oct-11   UIDE /M switch deleted, search-buffer is always 512 bytes.
                 UIDE.SYS back to 7.5K, UIDE-S dropped, UIDE2 improved.

    7-Oct-11   All UIDE drivers updated to avoid BIOS "DPTE" ERRORS:  Bad
                 DPTE data for USB sticks!   Many Thanks to Daniel Nice!

    9-Sep-11   UIDE2 re-added.   UIDE-S and UIDE2 handle 6 CD/DVD drives.

   22-Jul-11   UIDE /E switch added for DOS emulators (VirtualBox, etc.).

   20-May-11   UIDE-S ("short" UIDE) added, for systems with limited HMA.

   25-Apr-11   BAD "code mods" init error corrected!

    5-Dec-10   UIDE/UIDEJR /R15 and /R63 switches added to handle old DOS
                 "games" (Thanks, Guillermo Grana Gomez!).

   28-Nov-10   Minor updates:  UIDEJR audio track-number error corrected.
                 Added /Z.

   15-Aug-10   UIDE audio track-number error corrected (Thanks, Nagatoshi
                 Uehara!).

   10-Aug-10   UIDE/UIDEJR use of $ in CD/DVD names is fixed (Many Thanks
                 to Japheth!).

    4-Jul-10   README file update -- UIDE can use "Native IDE" mode, same
                 as "Legacy"/"Compatibility", for AHCI mainboards.

   10-Jun-10   UIDE now ignores "removable HARD disks", size reduced.

   16-Nov-09   UIDE now caches 4 GIGABYTES of data!

    6-Oct-09   UIDE and UIDEJR /H requests HMA use "at the user's risk"!

   23-Jun-09   Corrected UIDE CD/DVD handling of VDS errors.

    9-Jun-09   UIDE/UIDEJR /N3 switch added for no XMS memory.   Override
                 of /D: name by UIDE$/UIDEJR$ added for no CD/DVD drives.

   25-Apr-09   UIDE license and FreeDOS prohibition deleted, drivers and
                 sources are again available to all.


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

   UIDE will return normal CD/DVD error codes, as needed. They are listed
   in the Microsoft "MS-DOS CD-ROM Extensions 2.1" document, are available
   from Microsoft or from other Internet sources.

   UIDE works as a "BIOS driver" and returns whichever codes are set
   for diskettes and hard-disks handled by the BIOS.    For SATA and IDE
   hard-disks, UIDE can post the following error codes:

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

   Many DOS programs display only "Disk Error" messages with NO code, thus
   disk errors may require running a diagnostic to get better information!


7. Technical Notes
   ---------------

   Protected-mode users must pretest "I=nnnn-nnnn" or "X=nnnn-nnnn" values
   for JEMM386, as its "I=TEST" or "X=TEST" options may fail on newer PCs.
   Protected-mode is unrecommended with old DOS games needing reserved XMS
   as JEMM386 takes some XMS memory first.   Newer "cheap BIOS" mainboards
   now OMIT logic used only for DOS and need a disk UltraDMA driver loaded
   before JEMM386 sets its protected-mode!    With such boards, CONFIG.SYS
   example C above will require Int 13h drivers cached via UHDD, then UHDD
   itself, to load only in LOW memory, after XMGR's "boot" provides XMS to
   the system.    JEMM386 can then load and set its protected-mode safely.
   2015 or older mainboards with a "regular" BIOS usually do not need this
   and can use example C as-is.   Use of JEMMEX or other "EMM" drivers but
   JEMM386 should now be avoided.   Other "EMM" drivers got abandoned long
   ago, some with leftover ERRORS!   JEMMEX cannot be used on "cheap BIOS"
   boards with these drivers and has caused crashes on newer PCs, probably
   due to an old XMS detection scheme.   If not updated, JEMMEX should now
   be viewed as "obsolete"!

   The drivers' /R15 or /R63 switch is for a real-mode system using UMBPCI
   and XMGR, to play old DOS games.   Game players prefer real-mode, as it
   gives higher speed.   If UIDE or UDVD2 are used alone, they can use the
   /R15 or /R63 switches with no problem.   If UDVD2 is loaded after UHDD,
   only UHDD can "reserve" XMS memory, and UDVD2 must not use a /R switch.
   Note that NO other programs or drivers that require XMS memory can load
   before the "game", so the reserved XMS cannot be re-allocated to anyone
   else!   Also note that if the "game" cannot be loaded and then "frozen"
   (not started immediately!), loading other programs and drivers AFTER it
   will be impossible!   Both of these issues make using JEMM386/EMM386 or
   other "EMM" drivers difficult, so an old "game" program which must have
   XMS memory below 16- or 64-MB will usually need to be run in real-mode.

   UHDD handles only "Legacy" or "Native PCI" IDE controllers.   RAID-only
   chipsets, "port multiplier" chips, and ADMA chipsets are not supported.
   UHDD requires "Legacy", "Compatibility", or "Native IDE" mode with AHCI
   controllers.   For mainboards with no such controller settings, Sabrent
   or similar SATA-to-IDE cards will let UHDD or UDVD2 run SATA disks/CDs/
   DVDs from a parallel-port IDE controller (80-pin cable), at DMA speeds.
   "Add on" PCI-bus adapter cards, that can be detected via normal PCI-bus
   logic, may also be used for disks/CDs/DVDs.

   XMGR loads in UMBPCI upper memory that is not "provided" to the system.
   With UMBPCI, a "MEM" list may begin with a block having a 00A7h offset,
   or greater with 80 or 128 XMS "Handles".    The upper memory skipped by
   this offset contains XMGR.

   The UMBPCI upper memory manager uses system "Shadow RAM" that cannot do
   DMA.    A newer BIOS may use UltraDMA to load programs in upper memory.
   If this is "Shadow RAM", a HANG can occur!    These two rules apply, if
   using UMBPCI with XMGR and UHDD:

     A) V3.70+ UMBPCI must load before XMGR, so XMGR finds UMBPCI and sets
        its "I-O Catcher", to handle diskette "Shadow RAM" DMA forever and
        to handle disk "Shadow RAM" UltraDMA until UHDD is loaded.   Older
        UMBPCI drivers, or other UMBPCI load schemes, are not recommended!

     B) When CHS I-O is done (MS-DOS V6.22 or older), every disk must have
        valid CHS parameters set in the BIOS.    If not, the "I-O Catcher"
        and UHDD let the BIOS handle CHS I-O.   When BIOS UltraDMA is left
        enabled, a "Shadow RAM" HANG can occur!

   Old BIOS programs may not configure a mainboard controller when no user
   drives are on it!   The drivers then display "BAD controller" and go on
   looking for others to use.   If this message is given, users must check
   that all SATA/IDE drives are set "active" with the BIOS setup routines.
   If so, "BAD controller" means a chip is not using "Bus Master" and "I-O
   Space" modes, and a BIOS update is needed!

   Known Issues

   In general, use of UIDE is no longer recommended, aside from the
   specific situation where there is not room on disk for the better and
   recommended option of using both UHDD and UDVD2 together.

   This driver:

      A) Lacks the Ninho 386/SX compatibility patches

      B) Fails to use UDMA speed on ATAPI-style CF cards

      C) Has errors when I/O crosses the 128 GB limit
