How to add USB flash drive capability to MS-DOS and Windows 98
Apart from my Internet-capable Windows 7 machine, there is one other machine I keep set up and "work ready". This is a dual-boot Celeron Windows 98/Windows XP machine which I use for floppy file recovery, disk imaging and writing 5.25 inch floppy disks in various formats for use in a number of vintage machines. It's actually got three operating systems on call:
- Windows XP
- Windows 98SE
- MS-DOS 7.1
All three operating systems are needed as I use imaging tools which specifically require them.
Figure 1. My disk-imaging Celeron
My disk imaging computer is not networked in any way. Networking is complicated between MS-DOS/Win 98SE and Windows 7. Also, the only way to ensure reasonable speed with my Windows XP SP3 install on this 500Mhz Celeron computer is to have all network services disabled. Besides, I don't want my XP partition to be anywhere near the Internet due to security concerns.
This stand-alone configuration presented a problem, namely how to transfer files between it and my main, internet-capable computer. As both computers are right next to each other on my desk, the simplest way to share files is to use a removable USB flash drive. This is not an issue in Window XP as the software detects the USB ports. However, it was an issue in Windows 98 and MS-DOS as these did not come with native USB drivers.
This article details how I got my Windows 98SE and MS-DOS environments "USB-flash drive capable" and it provides the resources I used. Hopefully the page will be useful to those wondering how to do this. Standard disclaimers apply though. What I'm about to cover worked for my system. Given hardware differences these techniques and drivers might not work for you...worse still they might lock up your machine. Use of these drivers and methods is entirely at the reader's own risk. It goes without saying that the required USB hardware needs to be present on the computer in question.
The Windows 98SE graphical user interface and the MS-DOS command prompt
Windows 98SE has two environments which can (optionally) be selected when the system is booted. One is the graphical user interface (GUI) that most people associate with a Windows environment. The other is a command line interface (CLI) which drops the user into MS-DOS version 7.1. Programs which require a straight MS-DOS environment can run just fine in this, whereas they might not run smoothly with the GUI, hence the desirability of both environments on the same machine.
Selecting the environments on boot can be done in several ways, either by pressing various function keys or adding/changing switches in the MSDOS.SYS file hidden in the root directory of the Windows 98SE partition (Google MSDOS.SYS and Windows 98 if you want more details). Note that running the MS-DOS CLI in a window after loading the GUI is NOT the same as booting to the MS-DOS CLI. Many MS-DOS-only programs requiring direct hardware access will not run in a Windows 98 MS-DOS CLI window. They need pure MS-DOS.
The CLI and the GUI can be loaded sequentially. If the system has booted to straight MS-DOS 7.1 (i.e. the CLI), the GUI can normally be loaded by typing "Win" at the command prompt.
If drivers and programs are required for the MS-DOS environment, then these can be loaded by editing (or creating) CONFIG.SYS and AUTOEXEC.BAT in the root directory.
The problem with MS-DOS USB drivers in Windows 98SE
Separate USB drivers are needed for the GUI and the CLI environments. However, USB drivers required for the MS-DOS 7.1 CLI environment are not compatible with the GUI environment. This presents a problem because Windows 98SE when booting processes everything in CONFIG.SYS and AUTOEXEC.BAT regardless of whether the GUI or the CLI is being loaded. Hence the user, if booting straight to the GUI, needs to prevent those MS-DOS USB drivers being automatically loaded. Later in this article I'll show how that can be done.
The USB drivers
I'm not going to elaborate on the history of these drivers or how they work. That information can be found on the Internet or in the linked zip files. I'll just present them here and show how I used them.
(i) For the Windows 98SE GUI
I managed to find a driver which can be downloaded here. It's an installation executable designed to be run from the Windows 98SE GUI (Google 'nusb33e.exe' to find out more). On my machine, this installs without an issue and recognises many flash drive devices. If you are JUST going to use USB with Windows 98 and not with native MS-DOS programs run from MS-DOS 7.1 then this is all you need.
Figure 2. Windows 98SE with USB support (Note Drive E:)
(ii) For MS-DOS 7.1 (also adding CD-ROM support)
Setting up USB for MS-DOS 7.1 is a little more involved . Three drivers and one executable are needed.
- USBASPI v2.20 (As far as your computer is concerned this turns your USB device into a SCSI device in ASPI mode)
- DI1000DD.SYS (Novac ASPI Mass Storage Device Driver (aka the Motto Hairu USB Mass storage Driver))
- OAKCDROM.SYS (a generic CD-ROM driver)
- MSCDEX.EXE (Microsoft's program to allow CD-ROM access and control)
Here is some more information on the first two drivers if you want to know more.
Download the drivers to a sensible place in the Win 98SE partition. They can go anywhere but I created a folder called "DOSUSB" under the \WINDOWS\SYSTEM32\DRIVERS directory and put them there. MSCDEX can be found in the \WINDOWS\COMMAND folder of a standard Windows 98SE install.
Configuring the startup files
Here's how I solved the problem of driver incompatibility. Essentially I instructed the machine to commence booting towards a command prompt (CLI) environment, then used a menu system in CONFIG.SYS to choose between calling up the GUI (without loading the USB MS-DOS drivers) or continuing on to the CLI (loading the MS-DOS USB drivers). The only downside is that if you decide you want the GUI after working in MS-DOS 7.1, you can't just type "Win" to load the former. You'll need to reboot and select it from the menu.
Here's the code needed in the various system files:
MSDOS.SYS is a read-only hidden, system file in the root directory of the Windows 98SE partition. Remove the read-only and hidden properties then edit it so it contains the following line in the "Options" section:
This prevents the computer trying to load the GUI without further instruction. Once you've edited the file, it may be wise to make it read-only and hidden again.
CONFIG.SYS may exist already in the root directory of your machine, or you may need to create it. Here's what mine looks like...
;Menus are first set up
;On Windows selection no DOS drivers loaded. Section is blank
;Autoexec.bat is then processed
;on MS-DOS selection the following drivers are loaded
;The following line loads Panasonic's universal USB- controller driver
devicehigh=c:\windows\system32\drivers\dosusb\usbaspi.sys /v /w
;Then the CD-ROM driver is loaded
devicehigh = c:\windows\system32\drivers\dosusb\oakcdrom.sys /d:mscd001
;Finally the aspi mass storage driver for usb- connected HDs and compactflash memory cards
;Autoexec.bat is then processed
As with CONFIG.SYS, this file may exist already in the root directory of your machine, or you may need to create it. Here's mine ...
Rem Go to the section selected after CONFIG.SYS is processed
Rem Load the Windows 98 GUI
Rem Map the CD-ROM to a drive
Rem Set pathways
Rem Go to directory with MS-DOS programs
At the end of the script I've set pathways to useful folders and changed the directory to where my MS-DOS programs are (i.e. dosprogs). You'll need to delete these lines or customise them for your own system.
Note these are MY CONFIG.SYS and AUTOEXEC.BAT files. If these two files already exist on your machine, then they are likely to contain content that needs to be included along with the above. Don't simply replace your content with mine without considering this. Keep the original versions and experiment with what you need to do.
Figures 3 and 4 shows segments of the scripts above in action.
Figure 3. Screen showing the menu options as determined by CONFIG.SYS
Figure 4. A boot into MS-DOS 7.1 showing some of the driver install messages. Note USB drive is drive D, CD-ROM is drive E.
How about straight MS-DOS 6.2?
If you want to use the drivers on a straight MS-DOS 6.2 install, it's lot a simpler. Download the drivers into a suitable folder (say\DOS\USB). Ensure the following lines are in CONFIG.SYS...
devicehigh=c:\dos\usb\usbaspi.sys /v /w
devicehigh = c:\dos\usb\oakcdrom.sys /d:mscd001
...and AUTOEXEC.BAT contains this...
You could also use a similar CONFIG.SYS and AUTOEXEC.BAT configuration to boot from a floppy. Just have all the necessary files (including HIMEM.SYS) present on the disk and remove the pathways which point to the files.
(i) The size and FAT type of the USB flash drive partition
The type of partitions recognised will depend on the OS being used. If using MS-DOS 7.1 or the Windows GUI then FAT32 is supported. However, if using MS-DOS 6.x then the partition on the USB drive needs to be less that 2GB and formatted in FAT16. Otherwise it won't be recognised.
(ii) The order the drivers are loaded and possible "speed wobbles"
The driver DI1000DD.SYS always needs to be loaded AFTER USBASPI.SYS. On many web pages where examples are given of the CONFIG.SYS files, the line loading DI1000DD.SYS comes immediately after USBASPI.SYS. I initially configured my own CONFIG.SYS this way. It worked fine when I booted from an MS-DOS 6.2 floppy but not when I booted directly to the MS-DOS 7.1 CLI on my own Windows 98 machine? The system seemed to recognise the USB stick and allocate it a code number, but DI1000DD.SYS couldn't find it? What was going on??
The weird thing was, if I stepped through loading the drivers one by one on the way to the CLI, as you can do in diagnostic mode when booting, it worked? What the heck??
I figured it had something to do with speed, as that was the only difference I could see between loading step-by-step in a diagnostic mode boot (or booting off a floppy), and a standard boot. My hypothesis is that on a "fast" machine (fast for MS-DOS that is...like a 500 MHz Celeron) somehow DI1000DD.SYS is loaded and executed so quickly, that if this occurs directly after USBASPI is loaded it somehow fails to capture the latter's output?
Anyway, after much experimentation I found if I instructed the CDROM driver to load BETWEEN USBASPI.SYS and DI1000DD.SYS, the issue disappeared. Loading that driver between the two seemed to allow USBASPI.SYS to get it's output ready before DI1000DD.SYS demanded it!
One thing to note is that if it is a speed issue then a very fast machine (say a P4) still might spit the dummy, even with the CDROM driver "delay" as introduced.
So there it is. I hope this information is useful. I've tried to keep the instructions simple but, depending on how familiar you are with MS-DOS and Windows 98, some background reading may be required. Like most things in computer-land there is more than one way to configure a system to get a similar outcome. PIF files can be used for example, but I consider them less flexible than the configuration I've described above. For those wanting to explore further, a detailed discussion of Windows 95/98 startup processes and how real-mode MS-DOS is entered can be found here.
Original 5th February, 2018
Updated 10th February, 2018 (added link to discussion on Windows 95/98 startup processes)