Download os8088

Four raw floppy images. Two of them are boot disks carrying the same 14,376-byte kernel -- one laid out for a 1.44MB drive, one for the 360KB 5.25" disks an IBM PC/XT can actually read. The other two are the software disk that holds Minesweeper and HELLO, in the same two geometries.

There is no installer and nothing to unpack. Write an image to a disk, or hand it to an emulator as drive A:, and it boots.

Disk
The os8088 desktop a few seconds after boot: a white menu bar across the top with a chip logo, File and Special, a 50 percent checkerboard gray desktop below it, floppy icons labelled Disk A and Disk B stacked at the right edge, an arrow cursor in the middle, and an empty white dock strip under a black rule along the bottom.
This is what a successful boot looks like. Menu bar, dithered desktop, one floppy icon per drive the BIOS reports, and an empty dock. Nothing is running yet -- everything is launched from the menus, with the mouse.

The four images

The SHA-256 column shows the first 16 hex characters of the full 64-character digest. This table is generated from the release manifest at build time, so it always describes the bytes actually being served. The software disks hold MINES (1,593 bytes) and HELLO (171 bytes).

Release v1.0.20260726, built 2026-07-26 from 16672e002.

os8088 release downloads
FileWhat it isSizeSHA-256 (first 16)
os8088.imgBoot disk, 1.44MB geometry: 80 cylinders, 2 heads, 18 sectors per track. For QEMU.1,474,560 bytesbdbd41f41b14dff0
os8088-360.imgBoot disk, 360KB geometry: 40 cylinders, 2 heads, 9 sectors per track. For 86Box and real XT hardware.368,640 bytes42f1beb5355ad199
apps.imgSoftware disk, 1.44MB: an os88fs volume holding MINES and HELLO. Not bootable.1,474,560 bytese535aad8a5ae9a87
apps360.imgSoftware disk, 360KB. The same two packages, same filesystem, different geometry.368,640 bytes049486a249192380

Which one do I want?

  • QEMU -- take the 1.44MB pair: os8088.img as drive A:, apps.img as drive B:.
  • 86Box, or a real IBM PC/XT -- take the 360KB pair: os8088-360.img and apps360.img. A 1.44MB drive postdates the 8086 by years and an XT BIOS knows nothing about that format.

The two boot disks contain identical kernels. The only difference is the boot sector, which is assembled with the disk's sectors-per-track and head count baked in so it can turn a sector number into a cylinder, head and sector for the BIOS.

You need the matching software disk in the second drive to get Minesweeper. os8088 boots and runs perfectly well without one -- you just get a Disk window with nothing in it, because there is no program floppy to list.

Or boot it in your browser

Running it in QEMU

This is the command the repository's make run target issues, with the paths spelled out:

qemu-system-i386 \
  -drive file=os8088.img,format=raw,if=floppy -boot a \
  -chardev msmouse,id=m0 -serial chardev:m0 \
  -drive file=apps.img,format=raw,if=floppy,index=1

The two -chardev and -serial arguments are not optional. QEMU's msmouse backend emulates a Microsoft serial mouse on COM1, which is the only pointing device os8088 has a driver for. Leave them out and the machine boots to a desktop with no cursor and no way to open a menu, because every launch path in the system goes through the mouse.

index=1 puts the software disk in the second floppy slot. That is drive B:, which is where the Disk window looks first.

Click into the window to give QEMU the pointer, and the arrow on the desktop starts following it. Menus are press-drag-release, the way they were on a Macintosh: hold the button down in the menu bar, drag onto the item, let go.

Running it in 86Box

86Box emulates the period machine rather than a generic PC, so this is the closer approximation of what os8088 was written for. The configuration checked into the repository at vm/xt/86box.cfg is:

The 86Box machine configuration os8088 is tested on
MachineIBM PC/XT (machine = ibmxt)
CPUIntel 8088, no dynamic recompilation
Clock4,772,728 Hz -- 4.77MHz, the stock XT crystal divided down
RAM256 KB
VideoOak OTI-067, an 8-bit ISA VGA card
KeyboardPC/XT
MouseMicrosoft serial (msserial), on COM1
Floppy 1os8088-360.img, mounted write-protected
Floppy 2apps360.img, mounted write-protected

VGA arrived in 1987, nine years after the 8086, but 8-bit ISA VGA cards did work in XTs. It is a legitimate if slightly fancy period configuration, and mode 12h is a VGA mode -- an EGA card tops out at 640x350 and cannot run this at all.

Repaints at 4.77MHz are slow, and that is the hardware. A window opening, a menu closing or the Task Manager redrawing its list takes long enough that you watch it happen row by row. Nothing is wrong. There is no back buffer -- an off-screen copy of a 640x480 16-color screen is 153,600 bytes, more than half the machine's memory -- so every pixel is composited live on the visible display, at the speed an 8088 can push bytes at an ISA card. In QEMU the same code is instant.

Every change is tested in QEMU. The 360KB images boot in 86Box on the configuration above; real XT hardware is what the system targets, not what it is regression-tested on.

Writing to real media

The 360KB image is 720 sectors of 512 bytes, laid out as 40 cylinders, 2 heads and 9 sectors per track. It goes on a double-density 5.25" disk, written by a drive that can write that format, and it is a sector-for-sector copy -- no filesystem tool is involved because there is no DOS filesystem on it.

dd if=os8088-360.img of=/dev/fd0 bs=512

Check the device name before you press Return. dd writes to whatever you name in of= and asks no questions. Name the wrong device and you overwrite that disk, including the one you booted from. List the devices first -- lsblk on Linux, diskutil list on macOS -- confirm the size matches a floppy, and unmount it before writing.

Two things that do not work, stated plainly:

  • You cannot write the 360KB image to a 1.44MB disk and have an XT read it. An XT's drive is a 5.25" 360KB unit and its BIOS has no notion of 1.44MB media; on top of that, the boot sector in that image asks the BIOS for 9 sectors per track, which is not the geometry a 1.44MB disk is formatted with.
  • A 1.2MB high-density 5.25" drive can write 360KB-format disks, but it writes narrower tracks than a real 360KB drive does. Disks made that way are frequently unreadable in period hardware. If the XT will not boot a disk that looks fine on your modern machine, this is usually why -- write it in a genuine 360KB drive.

Put the boot disk in A: and the software disk in B:. With one drive, os8088 still boots; the desktop just shows a single floppy icon and there is no program disk to load from.

Building from source

git clone https://github.com/jggonz/os8088.git
cd os8088
make

That writes all four images into build/, along with the intermediate kernel.bin (14,376 bytes) and boot.bin, which the Makefile checks is exactly 512 bytes and fails the build if it is not.

The dependencies are nasm, qemu-system-i386 and python3. NASM assembles the kernel, the boot sector and the packages; Python builds the os88fs software disk and stamps the relocation tables into the packages; QEMU is only needed to run the result. There is no linker anywhere in the build -- every binary is nasm -f bin flat output, which is deliberate, because a linker on a modern Mac only emits Mach-O. 86Box is optional, and only for make xt.

Makefile targets
makeBuild all four floppy images into build/.
make runBoot the 1.44MB pair in QEMU with the emulated serial mouse attached.
make testBoot headless with a QMP control socket at build/qmp.sock, for scripted clicks and screendumps.
make debugBoot with QEMU halted, waiting for gdb on port 1234.
make xtBoot the 360KB pair in 86Box using vm/xt/86box.cfg.
make cleanRemove build/.

The kernel is assembled with cpu 8086 and -w+error, so any instruction newer than 1978 is a build failure rather than a surprise on real hardware. If your build succeeds, it runs on an 8088.

The source is at github.com/jggonz/os8088, under the MIT license.

What you need to run it

Hardware requirements for os8088
CPUIntel 8086 or 8088Nothing newer is required and nothing newer is used. A faster x86 runs it too, in real mode.
RAM256 KBThe kernel and every buffer it statically reserves come to 38,977 bytes; loaded programs get a 20,480-byte pool above that.
VideoVGAMode 12h, 640x480 in 16 colors. An 8-bit ISA VGA card in an XT is fine. CGA, MDA and EGA are not -- none of them have this mode.
MouseMicrosoft serial mouse on COM1Port 0x3F8, IRQ 4, 1200 baud 7N1, three bytes per report. Required: there is no keyboard route into the menus, so with no mouse nothing can be launched.
KeyboardAny PC keyboardRead through BIOS int 16h. Used for typing into the Note Pad and for Minesweeper's F and N keys, not for navigation.
DrivesOne floppy to boot, two to be usefulA: is the boot disk, B: is the software disk. There is no hard disk support, no CD and no network boot.

Then what

Pull down the File menu and open a Note Pad, a Clock and a couple of Bounce windows, then drag one of them around by its title bar. The clocks keep time and the balls keep moving underneath the drag, which is the whole argument the project is making.