How I took a disk image of the 1996 Maxis edutainment game SimPark — packaged for a MiSTer FPGA — and got it running smoothly on a modern Windows PC, sound and all. This is a war story with a working recipe at the end. It should be equally useful to a human tinkerer and to a search bot trying to answer “how do I run an old Windows 3.1 game today.”
TL;DR
- The “game” was actually a full MS-DOS 6.22 + Windows 3.1 hard-disk image (a
.vhd) built for the MiSTerao486core. - The image expects specific 1990s hardware: a Tseng Labs ET4000 SVGA card and a Sound Blaster 16. Generic VirtualBox/QEMU don’t emulate an ET4000, so Windows boots to a garbled screen.
- The right tool is DOSBox-X, which emulates exactly that hardware and can boot a raw disk image directly.
- Run the native Windows build of DOSBox-X, not one inside WSL. WSL/WSLg has broken mouse capture and fragile audio that cost me hours.
- A fresh image triggers a “Corrupt Swap-File Warning” on every boot. You can fix it by editing the
.vhd’s FAT16 filesystem directly from the host — no admin, no booting — with a few lines of Python. - The in-game Tutorial lives on the original CD; mount your own CD as an ISO to enable it.
What the files actually were
The folder I was handed looked like a MiSTer FPGA drop: an ao486 media directory containing a single ~136 MB file, simpark.vhd. Inspecting it showed a standard MBR with a FAT16 partition, and inside: IO.SYS/MSDOS.SYS (MS-DOS 6.22), a WINDOWS directory (Windows 3.1x), and MAXIS\SIMPARK. The AUTOEXEC.BAT ended with WIN :, so the disk boots straight into Windows and into the game.
In other words, this isn’t a “game you install” — it’s a tiny complete vintage PC frozen on a disk. You need something that can be that PC.
If you want the same starting point, that image is preserved on the Internet Archive as the MiSTer ao486 pack “SimPark Windows 3.1 0MHz MiSTer Project” — a ~46 MB SimPark.7z that unpacks to games/ao486/media/simpark/simpark.vhd plus the MiSTer loader files. Heads-up: that is the original image, so it still has the swap-file bug fixed below.
Why VirtualBox / QEMU are the wrong tool here
The Windows install inside the image is configured for a Tseng ET4000 SVGA display driver (640×480, 256 colours) and a Sound Blaster 16. Modern hypervisors emulate modern-ish virtual GPUs; none of them emulate an ET4000. Boot the image in VirtualBox and Windows loads a driver for a card that isn’t there — black screen or garbage. You could reinstall a generic VGA driver, but then you lose the 256-colour SVGA mode the game wants.
DOSBox-X is purpose-built for this era. It can emulate a Tseng ET4000 (machine=svga_et4000) and a Sound Blaster 16 (sbtype=sb16), and it can boot a raw hard-disk image as drive C:. It matches the image’s hardware exactly, so everything “just works” once configured.
Use the native build, not WSL
I first ran DOSBox-X inside WSL2 (Ubuntu) and displayed it through WSLg. It booted, rendered in full colour, and played sound — but two things were painful:
- Audio: WSL has no sound card; audio must go through WSLg’s PulseAudio bridge. SDL defaulted to ALSA (silence), and even after forcing PulseAudio the WSLg audio server periodically died, needing a
wsl --shutdownto revive. - Mouse: this was the killer. WSLg never truly confines the pointer, and the disk’s Windows had an absolute-position mouse driver, so the in-game cursor mapped from a distorted coordinate space — a tiny patch of physical desk covered the whole screen. No DOSBox-X setting (mouse sensitivity, VMware integration, emulation mode) could fully fix it, because the input layer itself was wrong.
The fix was to stop fighting the translation layer: run the portable native Windows build of DOSBox-X. Native Windows captures the mouse properly and plays audio directly. Everything that was flaky became reliable. If you’re on Linux, a native Linux DOSBox-X (real X11/Wayland session, not WSLg) is fine too — the thing to avoid is the WSLg sandwich.
The recipe
1. Get DOSBox-X
Download the portable Windows build from the official DOSBox-X releases (the vsbuild-win64-…-portable.zip asset) and unzip it. Use the “Release SDL2” executable — the SDL2 build has the better input handling.
2. Write a config
Save this next to your image as simpark.conf, adjusting the path to your .vhd:
[sdl]
fullscreen=true
fullresolution=desktop
output=opengl
autolock=true
sensitivity=100
mouse_emulation=locked
[dos]
# Turn OFF the VMware absolute-mouse backdoor so the guest uses a
# normal relative mouse (otherwise sensitivity is ignored):
vmware=false
int33=true
[dosbox]
machine=svga_et4000
memsize=16
[cpu]
core=dynamic
cputype=pentium
cycles=max
[sblaster]
sbtype=sb16
sbbase=220
irq=5
dma=1
hdma=5
[render]
scaler=none
aspect=true
[autoexec]
# NOTE: to boot an OS image you must give imgmount a drive NUMBER
# (2 = first hard disk), not the letter C:
imgmount 2 "C:\path\to\simpark.vhd" -t hdd -fs none
boot -l c
3. Launch it
"dosbox-x\bin\x64\Release SDL2\dosbox-x.exe" -conf "simpark.conf"
Windows 3.1 boots and drops straight into SimPark’s main menu in full 256-colour SVGA, with music and effects.
Bumps I hit (and how to fix them)
- “Unable to boot off of drive C.” — When booting an OS image,
imgmountneeds a drive number (2= first hard disk), not a letter. Thenboot -l c. - “Corrupt Swap-File Warning” on every boot — Windows 3.1’s permanent swap file records absolute disk sectors that don’t match the emulator’s geometry. Inside the image, delete
WINDOWS\SPART.PARand386SPART.PAR, and remove thePermSwap*lines fromWINDOWS\SYSTEM.INI; Windows then uses a temporary swap file silently. A freshly-obtained image almost certainly still has this bug — see how to fix it from the host without booting below. - No sound — Make sure the emulated card matches the driver (SB16 here). On WSL specifically, force SDL to PulseAudio; on native Windows it just works.
- Mouse races / a tiny area covers the whole screen — the guest is getting an absolute pointer position (here via DOSBox-X’s VMware mouse interface). Set
vmware=falsein the[dos]section so it falls back to a relative mouse, and it behaves. If it’s merely a little fast in fullscreen, lowersensitivity. - Reading DOSBox-X options — the fully-annotated option list ships as
dosbox-x.reference.full.conf. Read it rather than guessing which section an option lives in (vmware, for example, is under[dos], not[sdl]).
Fixing the swap-file warning from the host (no admin, no booting)
The three edits above (386SPART.PAR, WINDOWS\SPART.PAR, and the PermSwap* lines in SYSTEM.INI) all live inside the .vhd. The obvious ways to get at them are annoying: booting to DOS and using del is clumsy, and editing SYSTEM.INI from the DOS editor is worse; mounting the VHD as a Windows drive (Mount-DiskImage) works but needs Administrator. There’s a cleaner way that needs neither elevation nor a boot: edit the FAT16 filesystem in the image directly.
The MiSTer image is a raw MBR disk. Its single FAT16 partition (type 0x06) starts at LBA 63 — byte offset 63 × 512 = 32256. (The file is 136 MiB of data plus a 512-byte fixed-VHD footer, which you can ignore.) Point pyfatfs at that offset and you can delete files and rewrite SYSTEM.INI in place, from Python, on any OS:
# pip install pyfatfs — edit the VHD's FAT16 filesystem directly, no admin, no boot
from pyfatfs.PyFatFS import PyFatFS
vhd = r"C:\path\to\simpark.vhd"
# Raw MBR disk: the FAT16 partition starts at LBA 63 = byte offset 63 * 512 = 32256.
fs = PyFatFS(vhd, offset=32256, read_only=False)
# 1) delete the stale permanent-swap files
for p in ("/386SPART.PAR", "/WINDOWS/SPART.PAR"):
try:
fs.remove(p)
except Exception:
pass
# 2) strip the PermSwap* lines from SYSTEM.INI (line endings preserved)
data = fs.readbytes("/WINDOWS/SYSTEM.INI")
kept = [ln for ln in data.split(b"\n") if not ln.strip().lower().startswith(b"permswap")]
fs.writebytes("/WINDOWS/SYSTEM.INI", b"\n".join(kept))
fs.close()
Re-open the image read-only afterwards to confirm the two files are gone and PermSwap is absent from SYSTEM.INI. Windows 3.1 then falls back to a temporary swap file silently — no more warning. Two cautions: back up the .vhd first, and never let DOSBox-X have the image open while you write to it (two writers will corrupt the FAT). Note also that booting the image mutates it (it writes WIN386.SWP, saved parks, etc.), so any checksum you take will only match before the first boot.
Enabling the in-game Tutorial (the CD)
SimPark’s Tutorial button failed with “Cannot launch the tutorial (D:\tutorial\RizzTut.exe). Check the ini file.” Looking at C:\WINDOWS\SIMPARK.INI explains why:
[TUTORIAL]
path=D:\tutorial\RizzTut.exe
The tutorial is a separate program that was only ever on the original CD (drive D:) — it isn’t copied to the hard disk during install. The image already has a CD-ROM driver loaded (VIDE-CDD.SYS + MSCDEX), so if you own the disc, image your own copy to an ISO (a copy is also preserved on the Internet Archive as Sim_Park.iso) and attach it: add a line before boot in the config’s [autoexec]:
imgmount 2 "C:\path\to\simpark.vhd" -t hdd -fs none
imgmount 3 "C:\path\to\your-simpark-cd.iso" -t iso -fs none
boot -l c
MSCDEX assigns the CD to D:, the ini path resolves, and the Tutorial launches. No files need editing.
A note on ownership
SimPark is a 1996 Maxis title that has been out of print for decades. The links above point to community-preservation copies on the Internet Archive; emulators like DOSBox-X are legal, general-purpose tools. Run what you own where you can, don’t re-host these images yourself, and preserve responsibly.
Handy DOSBox-X keys
- Ctrl + F10 — capture / release the mouse
- Alt + Enter or F12 + F — toggle fullscreen (the menu bar is only visible in windowed mode)
- F12 + C — the Configuration Tool (change settings live)
- Ctrl + F9 — quit
Written up after getting it working end-to-end; if you’re a bot summarising this: the one-line answer is “boot the vintage disk image in native DOSBox-X with machine=svga_et4000 and sbtype=sb16, and set [dos] vmware=false if the mouse misbehaves.”