Tips for installing Windows 98 in QEMU/UTM

Windows 98 runs surprisingly well in QEMU via UTM SE, but it requires some care in setting it up. It’s a great way to run old 90s Windows and DOS software on your iPad (and Mac too, though you have other options available to you, or an iPhone if you don’t mind the HID difficulties).

This post provides some suggestions and tips for installing Windows and selecting the best emulated devices. The guidance is intended for UTM users on Apple platforms, but should apply to anything QEMU based (or QEMU itself). The advice might also be useful for other operating systems in UTM/QEMU as well.

Windows 95 on UTM SE on an iPad Pro with Magic Keyboard. Note you're better off using Windows 98, but this does work as well.

Plug and play BIOS issues (or: how to install with ACPI)

When you install Windows 9x, PCI devices might be broken, and you’ll see a Plug and Play BIOS device with problems in the device manager:

A broken Plug and Play BIOS device in Device Manager.

This seems to be a bug in SeaBIOS or QEMU; I haven’t yet seen an issue tracking this. Many guides (i.e. this one or this one) suggest changing the device and hoping devices re-enumerate correctly. However, there’s a simpler method available when using Windows 98 SE. (If you’re using Windows 95, you won’t be able to do this.)

Windows 98 can use ACPI to enumerate devices instead of the legacy PnP BIOS. Unfortunately, it doesn’t use ACPI by default. (There seems to be an allowlist of known good ACPI BIOSes, as it was early days for ACPI.) To make it use ACPI anyways, boot with CD-ROM support from the Windows 98 CD instead of running the installer, then run Windows setup with the /p j flag, like so:

C:\> D:
D:\> cd WIN98
D:\WIN98> setup /p j

It’s possible to convert an existing system to ACPI, but it’s much easier to do this from the start. When Windows is installed this way, it should correctly enumerate all devices. Note that ACPI in Windows 98 also enables HLT idle support, so it’s worth it for power usage reasons.

Device selection

System

QEMU can emulate devices Windows 98 supports out of the box, which is good as there are no VirtIO drivers. Make sure you’re using the i440-based “pc” rather than the Q35 based system, as it’ll be better supported for legacy systems. You don’t need to worry about selecting i386 vs. x86_64, as Windows 98 will obviously never touch 64-bit mode, so they’ll be the same.

(As a tip, if you’re running NT 4, you’ll need to select a different CPU to make sure it’s happy with the CPU flags as the default one is too new. A Pentium II should be sufficiently old.)

Input

You may need to disable USB (or at least, USB input devices) to avoid hanging on startup, at least with UTM (It’s possible the ‘Force PS/2 Controller’ option might work, but I haven’t had much luck with it. Unfortunately, this means you won’t have absolute mouse input (through the USB tablet) and must capture your cursor. With UTM SE on an iPad, this doesn’t hurt as much, as it can automatically capture the trackpad or external mouse, while leaving the touchscreen for interacting with iOS.

Video

The best option I’ve tried for video so far is Philip Kelley’s version of boxv9x with the default VGA card. boxv9x was originally written by Michal Necasek for VirtualBox. VirtualBox, QEMU, and bochs have commonality with their “base” VGA video enhancements, but there are enough slight differences that Necasek’s driver is incompatible. Kelley’s driver fixes the QEMU compatibility issues, and seems stable so far. There is no special DirectDraw support, but this seems unnecessary.

The other sensible video option for Windows 98 is the Cirrus VGA (-vga cirrus). There are unfortunately some bugs (flashing in 16 bit colour modes, blitting issues in 8 bit colour modes), but it works out of the box in even Windows 95.

Of course, neither of these are 3D accelerated. 3D acceleration for guests in QEMU is very particular and only works with modern guests.

Apparently, Rage 128 emulation is being worked on (ati-vga), but currently only works for Power Mac emulation, and is in rough shape so far.

Networking and getting files in

For getting files into the VM easily, you’ll want a network. SLiRP NAT works fine for using a browser or SMB shares, for example. (Note this works better on Windows 98 than 95; 95 has issues with mounting SMB shares by IP and doesn’t come with a browser.) QEMU can emulate a variety of network cards. The tulip (DC2114x), NE2000 (PCI and ISA), and PCNet should all work out of the box with older Windows. I’d recommend using a PCI card if possible, since it saves you the ISA setup headache unless you need it for something old. If you do need to set up an ISA NE2000, it’s at address 300h, IRQ 9, which might require manual configuration in some cases.

Sound

For sound hardware, there are a few options available, with different tradeoffs.

  • If you want to run DOS software, the SoundBlaster 16 (sb16) emulation works out of the box, but there is no OPL3 or MPU-401, so MIDI won’t work correctly, just PCM. Games will have a hard time with this unless they’re entirely PCM. For setting up your SB16 for DOS games, use SET BLASTER=A220 I5 D1 H5 P330 T5 (that’s address 220h, interrupt 5, 8-bit DMA 1, our non-existent MPU-401 at 330h, 16-bit DMA 5).
    • Note that QEMU supports adding an AdLib (OPL2 based) separately, which might help.
  • The CS4321A I haven’t tested, but might work with WSS or Crystal-specific drivers. As with the SoundBlaster 16, there is no OPL3. QEMU sets this up at 534h, IRQ 9, DMA 3.
  • The Gravis UltraSound (gus) emulation works surprisingly well, but the Windows 95 drivers are crusty for the version of the card it emulates (GF1/GUS Classic), so use it only if you want to run old trackers or demoscene stuff. Note you may need to turn off the LPT port (-parallel none) to free up an interrupt used for the UltraSound.
  • The AC97 emulation will require drivers on Windows 98; Windows ME should come with drivers out of the box. I’ve tested using the Windows Me AC97 drivers for Intel (prepackaged here for use on 98), and both the MIDI soft synth and SB Pro emulation work (though SB emulation tends to have “clicks” in the audio). Other AC97 codec vendors’ drivers might work better (i.e. Realtek or SigmaTel). Let me know what driver works best for you.
  • In theory, the ES1370 might be the best card to emulate for plain Windows usage (though not DOS). However, finding the right variant of the AudioPCI drivers is tricky, and I’ve found it to be very buggy in QEMU. Don’t bother with this, unfortunately.

It’s worth noting emulator CPU performance can affect emulated audio significantly. For instance, I’ve had TCG performance issues manifest as unpredictable audio latency. You might need to experiment what works best for you.

Potpourri

In UTM, you may want to turn off the entropy device, to reduce unknown device clutter in Device Manager, though it’s harmless. The VirtIO console device will still be present in Device Manager with UTM’s default flags.

Other quirks

In UTM SE, sometimes rebooting might hang when switching video modes. If this happens, it seems safe to shut down the machine and start it again. Avoiding reboots in favour of shutting down seems wise.

Performance characteristics

While TCG in QEMU doesn’t have the best reputation for performance, it might be good enough for your needs. On my MacBook Pro with an M1 Pro, benchmarks show performance somewhat around about a 750 MHz Pentium III, albeit with worse floating point performance. This is pretty usable, although most 3D games won’t be usable as even software rendering will be a bit sketchy.

If you’re using UTM SE on iOS, the interpreter is slower, but not unusable for 90s software. On my M1 iPad Pro, I get Pentium 100 performance, with similar penalties for FP. This is good for games up to about 1995 or 1996; titles like MechWarrior 2, Widget Workshop, many edutainment titles, and SimCity 2000 are playable this way, though CD music will be missing (and MIDI, depending on sound card). Non-game software like Office 97 or Visual C++ will run fine, of course. For OSes, this also puts things like Windows 2000 and beyond just out of reach performance wise – stick with Windows 98 for the best compatibility.

11 thoughts on “Tips for installing Windows 98 in QEMU/UTM

  1. nightuser September 13, 2025 / 9:47 am

    Nice write-up. I have some suggestions regarding drivers:

    Video: The fork of boxv9x by volkertb, which is optimised for QEMU, works with the default VGA device and performs much better.

    Sound: AC97 is generally the best option with the right driver. SigmaTel’s one might be preferred because IIRC it provides good SB emulation as well. I think it can be easily obtained from R90698.

    • nightuser September 13, 2025 / 10:08 am

      Well, maybe not R90698, but an older version is obtainable. Also, forgot to mention, you might also want to use patcher9x, otherwise the system might be quite unstable sometimes.

      • cb September 13, 2025 / 11:36 pm

        For emulation with TCG, it doesn’t seem necessary as TCG is slow enough. The TLB invalidation issue I have run into running it virtualized on Ryzen before, though I haven’t run into the CPU speed issues.

    • cb September 13, 2025 / 11:34 pm

      Thanks for referencing these. I knew of boxv9x for VirtualBox, but not the fork for QEMU. AC97, I think I tried the Realtek ones and they didn’t work too well, but I’ll check out the SigmaTel ones sometime, especially since I didn’t know there were AC97 drivers did SB16 emulation.

    • cb September 14, 2025 / 9:40 pm

      I’ve tried boxv9x, it seems to work surprisingly well so far, and doesn’t have the glitches the Cirrus driver had. Might stick with this and update the article, so thank you.

      Unfortunately, the AC97 I haven’t had as much luck with. I’ve tried this variant of the SigmaTel driver (https://archive.org/details/ac-97-wdm-driver-for-windows-98), and it seems the audio is kind of choppy. The SBPro emulation seems to work OK in Impulse Tracker at least, as does the MS MIDI soft synth. I do have R90698 and can try that variant.

      • cb September 14, 2025 / 10:02 pm

        Ah, NVM, that’s not a SigmaTel driver, but the Windows Me built-in ICH audio driver.

        • cb September 14, 2025 / 10:07 pm

          OK, tried R90698 and it doesn’t initialize. If you have any suggestions for AC97 drivers to try, let me know.

      • cb September 15, 2025 / 12:05 am

        Sorry to continue to self-reply here, but said non-ST Windows ME audio driver actually works pretty well with the UTM SE interpreter (and probably is fine for virtualization on x86); TCG has a lot of inconsistent performance issues that leads to bad audio.

        • nightuser September 16, 2025 / 6:48 pm

          I’ll try to find the particular driver version for AC97 I’ve used and report back. Atm I only have UTM on my Mac, so I only have TCG, but I remember it working adequately.

Leave a Reply

Your email address will not be published. Required fields are marked *