Running Windows 98 today seems like a strange thing to do. First of all, it can’t run natively on a modern 64 bit CPU and definitely not on an M1-based Mac. Secondly, it’s seriously outdated and is considered useless for today’s productivity. Thinking about it further, you will see that it opens a whole new old world. There are so much high quality applications and especially games out there, which you can’t run directly on a modern PC and for sure not on a Mac. By using emulation with UTM and QEMU, we can install Windows 98 SE on a new Mac and are able to revive that past experience and fun you had before. This article covers installing and configuring Windows 98 SE on a MacBook M1 by using UTM.
If you are interested, I also created a YouTube video from this blogpost. If you prefer classic text, you can just follow the rest of this article:
If you let the idea of using such an old OS and the purpose of doing so sink in, you might ask yourself why specifically Windows 98 and not 95, Me or XP for example. The main reason for this choice is that it contains some nice improvements over 95, like USB support, but is not too modern to still have a fully working DOS environment for older games.
To get Windows 98 SE operational on a modern Mac with an Intel x86-64 CPU or M1 SOC, as mentioned above, I’ll be using UTM (https://github.com/utmapp/UTM).
UTM is using QEMU under the hood and is capable of emulating different processor architectures, which includes x86 or i386 which was the architecture of the era where Windows 98 was new. It will also allow us to configure the required hardware like a video card and sound card, compatible with the old OS version.
For this article, I’ll be using a Macbook Air M1 but the exact same instructions work on any other Mac as well. Both with an Intel CPU or M1-variant.
Step 1) get a Windows 98 (SE) ISO file
The first thing we need to get is a copy of the Windows 98 SE installation media.
It shouldn’t be very hard to get your hands on a proper Windows 98 SE ISO file. The first hit I had when searching for the term on Google got me one. Just pay attention that you get an OEM version as that is the version that is bootable from the CD/ISO.
Together with the ISO you will need a product key as well, which I found in the same place as I found the ISO :)
I’m not sure if you can see Windows 98 SE as abandonware yet and it’s a gray area anyway to distribute such software, hence why I don’t provide a direct link here.
Step 2) Downlad and install UTM
After you get your hands on an ISO which we will use to get Windows installed, we first need to install UTM on our Mac if you haven’t done so.
You can download UTM from Github using: https://github.com/utmapp/UTM/releases/latest/download/UTM.dmg
Once downloaded, simply open the .dmg file by double clicking on it and move UTM.app to your Applications folder using Finder:
Then start UTM, simply by launching it as any other application on your Mac.
Step 3) Create a VM for your Windows 98 SE installation
At this point we have both the ISO file for installing Windows and we have our hypervisor/emulator, UTM, ready. Now we need to create a new virtual machine with UTM for use with the next step. It took a lot of time of testing to figure out what was the best match for maximum compatibility.
Start UTM and click on “Create a New Virtual Machine”:
In the first tab: Information:
- Give the VM a name, I chose “Win98SE”
- Optionally choose an icon for the VM:
In the second tab: System:
- Select i386 (x86) as architecture
- As system, choose Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-6.1) (pc)
- Lower the RAM to anything under 512MB, I chose 64MB which should be plenty for most of the things.
- Click “Show Advanced Settings” and uncheck UEFI Boot
The QEMU tab can stay as is. In the Drives tab:
- Click “New Drive”, leave the 10GB and IDE interface and click Create. This will be the hard disk where we will install Windows 98SE.
- Click “New Drive” again, check the removable option and IDE interface and click Create. This is the CD drive where we can mount the earlier mentioned ISO.
In the Display tab:
- Change the emulated display card to Cirrus CLGD 54xx VGA (cirrus-vga)
In the Input tab:
- Check the Legacy (PS/2) Mode
The networking tab can stay as is and finally, in the Sound tab:
- Change the emulated audio card to Creative Sound Blaster 16 (sb16)
Then click Save, the create the VM
One final thing we need to do before we can move to the next step is to mount the installation ISO to the virtual CD drive. To do so, select the VM with the name you gave it on the left in UTM (Win98SE for me), then on the CD/DVD section, choose Browse:
Select the Windows 98 SE ISO at the location where you downloaded it and click open. This will be like we would physically insert that CD in the CD-drive on a real machine.
Step 4) Install Windows 98 SE
All preparation is done and we can now finally launch the VM and get Windows 98 SE installed. Just click the large play button after selecting the VM in the left column in order to do so.
As soon as the VM boots, it will boot from that mounted ISO and you should see the following menu pop up:
Here, go for the second option: “Boot from CD-ROM”, using the arrow keys or by entering the number and press enter. This menu is just to prevent people from running into issues with booting their PC when they would leave the Windows 98 CD in the drive.
In the next menu, choose to “Start Windows 98 Setup from CD-ROM” (first option):
This will load some drivers (like the one for the CD drive) and will load a tool that checks if there is a partition created to install Windows onto, which is not the case as it’s the first time we do this:
Just press enter here and in the next screen choose to use all unallocated space for Windows:
In the next screen, choose “Yes, enable large disk support”. As we have what is considered a “large” disk in the VM:
After doing this, the system must reboot. And we need to repeat the first steps here again in order to continue the setup: Choose Boot From CD-ROM and then Start Windows 98 Setup from CD-ROM. Exactly the same as before.
This time, the setup program will format the hard drive (or at least the disk image which we assigned to the VM). This might take some time:
Once the format process is done, there will still be a quick disk integrity check with Microsoft Scandisk. I even forgot that tool existed although I spent hours of my time looking at it in the past :)
If all goes well, you will end up at the graphical interface of the Windows 98 Setup:
In case you have issues with the mouse pointer, click the mouse-pointer icon in the top bar of the UTM VM. This will allow you to better control the mouse in the VM. You can press Control+Alt to release the mouse back to macOS:
Click on Continue in the welcome screen and choose the default installation location (C:\Windows) as destination. After the installer checked if there is enough space etc., you can choose what to install:
I went for a custom install and selected as good as everything I could install but it shouldn’t really matter much as all of these components can be removed or added later as well.
Once you’re done, click Next and give the VM a name. Not very important for the way how we’ll be using the VM. Then click Next. Choose the keyboard layout, locale settings and location in the next screens and click Next to start the actual installation:
This will copy the required files to the virtual hard disk and will again take some time. After that step is done, the VM will restart.
I noticed that in some cases, the VM gets stuck while restarting. If that’s the case, just turn off the VM, then start it again using the buttons on top of the VM window in UTM. It can be pretty annoying but unfortunately that’s how it is.
After the reboot, you should be presented with the first boot screen of your fresh Windows 98 SE installation:
This brings back some memories for sure!
Once the VM is fully booted, the setup process will continue and you can enter your name,, organisation and product key:
The next stage of the installation tries to install drivers for the (virtual) hardware in the system.
During this process, one or more reboots are required which might result in a stuck VM again. In case that happens, just power it off and on as explained above. Eventually we end up with the last stage:
This again can take quite some time but in the end, and off course after another reboot, you will end up with a nice and clean retro Windows 98 desktop:
Pure nostalgia to see this if you ask me…
This is the end of the installation step and you now have a working Windows 98SE installation on your Mac.
Step 5) Post-installation steps and drivers
At this point, the installation already works pretty well. Especially since we chose specific virtual hardware that is fairly compatible with Windows 98. For example. if your sound was on, you could already heard that nostalgic Windows 98 boot sound.
Let’s first have a look at the system properties:
A Pentium II, at least that’s what the VM thinks it is running on, and 64MB of RAM.
Device Manager shows us that there is still some work to do:
Changing the resolution and color depth
As the drivers for the video card are present, this should allow you to change the resolution and color depth to a better value. To do so, right click on the desktop and choose Display settings. Then set this to your preference:
We can also choose a nice background/wallpaper to make the experience complete. This is just beautiful if you ask me…
Prepare to Install missing drivers
We still have a few drivers and devices (like the network card) missing as we could see in Device Manager above. The network card is an important component in case you want to easily copy files back and forth to the VM. To fix this, we will first need to tell Windows that the Plug and Play BIOS system device is actually the PCI bus. This will allow the OS to detect the components connected to it (like the network card).
Before we continue, it is also a good idea to copy the network drivers to the PC itself. The card selected in UTM is a Realtek RTL8193 and Windows 98 SE doesn’t have drivers for it by default.
I prepared an ISO file, which you can download here (https://jensd.be/download/win98tools.iso) that contains these drivers and some other small tools which are very useful for use on this kind of Windows VM on Mac.
So release the mouse of your VM (Control + Alt), download the win98tools.iso and swap the ISO file to the win98tools.iso in UTM for which I provided the link above:
In your Windows 98 VM, navigate again to your CD drive and this time, copy the RTL8139 drivers folder to your desktop:
Then we can also run nusb33e to install missing USB drivers, these will be used in a later step:
Don’t reboot when asked to after installing this.
Before moving on, we now need to mount back the Windows 98 SE installation ISO to the VM. This goes in the same way as we did the first time in UTM:
Install the driver for the PCI bus
Now we can go to Device Manager (right click on My Computer -> Properties -> Device Manager) again and double-click on the Plug and Play BIOS system device with the exclamation mark on it:
In the dialog, choose the Driver tab and click Update Driver:
Click Next and choose to display a list of drivers:
Choose “Show all hardware” and in the right list select PCI bus:
Click Next, finish the steps and reboot the VM when asked to do so.
Install the rest of the drivers
When Windows is getting started after this, a lot of new hardware is being detected:
For each of these components, go through the following steps. Only take a different approach when Windows is detecting the network card, as explained further.
Click Next at the start of the Add new Hardware Wizard:
Select the first option: to search for the best driver and click Next
In the following step, uncheck all places where to search and click Next again. In most cases, Windows will find the correct driver.
After installing the driver for a specific component is finished and Windows asks to restart, choose for it to not restart:
When you see that the new hardware is called PCI Ethernet Controller, we need to take a little different approach as that is the network card for which we need to point to the RTL8193 drivers which we copied earlier:
For this, in the first screen, just click Next but then select to display a list of all the drivers instead:
In the list that comes up, choose Network Adapters and click Next again:
Click ‘Have Disk’ in the next screen:
Navigate to the location where we copied the drivers for the network card: (C:\Windows\Desktop\RTL8139 drivers) and click OK:
Select the only option in the list of proposed hardware and continue with the installation of the driver:
Repeat the earlier steps as explained above for the rest of the hardware. When you eventually end up on your desktop, restart the VM.
When the system comes back, more hardware, like the IDE controller is getting detected and another reboot is required…
EDIT: Change the emulated video card and install drivers for improved graphics
While playing around with the VM, I noticed some issues related to graphics. As a virtual video card, I chose the cirrus CLGD 54xx. A good reason for that was because that card had drivers included in the standard Windows 98 driver database.
When trying to set the resolution higher, for example 1024×768 you can see that things do not look as expected:
But even though 800×600 looked fine at first sight, I noticed strange issues over time. Another disadvantage, even if a higher resolution like 1024×768 would work fine, is the aspect ratio. At the time 4 by 3 was definitely the standard while today it is 16 by 9 or 16 by 10. and as a result you end up with black borders when running the VM fullscreen.
To overcome these issues, I found a project called VBEMP 9x: https://bearwindows.zcm.com.au/vbe9x.htm. The outcome is a generic VBE driver for older windows versions like windows 98.
VBE or VESA BIOS extension defines an improved interface that can be used by software to access video cards. The VBEMP project basically backported the generic Windows XP VBE driver to something that works on Windows 95, 98 and so on.
Even better is that the driver has good support for emulated video cards like the ones available in QEMU. And on top of that adds support for resolutions which have a modern 16 by 9 or 16 by 10 ratio.
To make it easy to use this, I included the driver on an updated version of the win98tools.iso:
Now to change the emulated video card and to use the drivers, first shut down the VM.
Then, in UTM, right click on your VM in the list and choose Edit. In the Display tab, change the emulated video card to Spice QXL and save the changes:
Before booting the VM again, mount the updated win98tools.iso as explained before. Then start it.
Once the VM is booted, you will see that Windows detected the changed video card. As we have the drivers on the virtual CD drive, choose to display a list of drivers and then choose Have disk:
Browse for the drivers on the CD and click OK:
In the upcoming list, the only option shown is what we need. Click ok and continue the installation
and choose to reboot when asked.
After the reboot, things do not look as expected. We clearly can’t use VBE yet. In device manager we can see that the old virtual video card is still there, causing a conflict with the new one.
To resolve this, let’s remove that cirrus logic card and, you might have guessed it, perform another reboot.
Once rebooted, you will see that you have now a much wider range of resolutions, the graphical issues are no longer seen and as a bonus, performance got improved as well:
After completing this, everything is configured and installed and we can start using the VM.
Step 6) Use the VM and exchange files with the host (macOS)
It took a lot of steps and many reboots but if you’re still following at this stage, all drivers are installed and all components in your Windows 98 SE install should be fully functional.
One last thing which I wanted to explain is how to get software and files on the VM. The easiest option is to use ISO files. A lot of games and apps are available for download in this format so it’s definitely a good option. You can use the virtual CD drive in UTM to mount and unmount different ISO images, as we did a few times in the above steps already. Do keep in mind that bin/cue or mdf files will first need to be converted to the ISO format before they are usable.
In order to easily exchange files between macOS and the Windows 98 VM we need something different. Unfortunately most modern methods and protocols did not yet exist or did but the versions supported became considered unsafe in the meanwhile like SMB v1, SCP or HTTPS.
After some searching, for me using FTP, although kind of considered unsafe as well, worked the best. It’s not easy to find a working FTP-server for a modern macOS version like Big Sur or Monterey but fortunately I found an application called QuickFTP Server. This app is free and can be installed from the App store in macOS.
Download and install this app on macOS and start it. In the main screen, select a root path. This is the directory which will be accessible from Windows 98 and select a port. The port number has to be higher than 1024 so the default FTP port 21 will not work:
In the Authentication tab, enter a username and password, this will be required in order to access the files. You can also choose if you want this access to be read-only or read-write.
Then click the Start Server button on the first screen:
As you can see, this also displays the IP address of your macOS device. This is the IP (192.168.0.221) which we will need to connect to from our Windows 98 VM.
Back on the VM, as we installed the drivers for the network card and UTM is configured to have that card in a shared network with our macOS device, we should be able to reach the IP where the FTP-server is now listening on.
Unfortunately as we are not using the default FTP port (21), we cannot use the Windows CLI FTP client as it doesn’t support specifying a port number. Luckily the built-in FTP client in Internet Explorer does support that.
In order to start using Internet Explorer, we will first need to go through the Internet Connection Wizard. Without doing so, we can’t start Internet Explorer as we get pushed to install a modem and setup MSN (not much changed at Microsoft in all those years I guess):
So to overcome this, navigate to: Start – Settings – Control Panel – Internet Options – Connections and click on the Setup button:
Choose for a manual configuration and click Next:
In the next screen, choose “I connect through a local area network (LAN)” and click Next:
Then uncheck the automatic discovery of the proxy server:
And choose to not set up internet mail when asked.
Going through these steps allows us to start Internet Explorer. To connect to the FTP-server which we started on macOS, we can enter the following in the address bar: ftp://<IP address>:<port>. So for my example: ftp://192.168.0.221:2121:
If all goes well, IE will ask for a username and password, which should match with whatever user and password you entered in the Authentication tab before starting the Quick FTP Server:
Once logged in, you can just drag/drop or copy/paste files between the FTP-server and the VM which makes it easy to exchange files back and forth between macOS and the vintage VM:
The rest I leave up to you.
In case you would need some inspiration, I had a lot of fun with this VM with Duke Nukem 3D, Rollercoaster Tycoon 2, SimCity3000 and Theme Hospital but there is plenty more available to explore.