how a from-scratch PC emulator learned to boot Windows 2000

MDDOSEM · WINDOWS 2000 PROFESSIONAL SP4 · 28 MAY – 19 JULY 2026

BOOT TO DESKTOP

At 03:02 on 19 July 2026, a PC that exists only as Rust code settled onto a teal desktop — Start button, taskbar, a clock quietly insisting it was 2:04 AM. Windows 2000 had installed and booted, natively, inside an emulator whose setup had spent weeks answering its own wizard in an endless loop. Fifty-three days, sixty-one disk images, one press of the Enter key: this is the whole story.

Starting up… recreation · the bar as it stood at 02:43, 19 July
Recreation; the originals are capture-45/screen.png (the bar at roughly 40%, 02:43 on 19 July) and capture-22/boot-002.png (the identical screen with the bar empty, three days earlier) in the run archive.
53
days — first Win2K checkpoint (28 May) to settled desktop (19 July)
4
shared emulation fixes, all required at once; the last landed 22 minutes before acceptance
47
numbered captures in the final campaign, 15–19 July
128 MiB
hang.bin — the RAM dump of the “deadlocked” machine, exactly 134,217,728 bytes
61
two-GiB disk images across the two campaigns; the endgame archive alone ≈85 GiB
2,512
interpreter tests green at acceptance, 0 failed

Three in the morning

The last screenshot of the campaign is called desktop-settled.png, and it was written at 03:02 on the morning of 19 July 2026. It shows a teal desktop; a Search Results window reporting, with perfect honesty, “0 object(s)”; and, front and centre, the “Getting Started with Windows 2000” wizard, patiently explaining that to open a file you should “click an icon twice quickly (double-click)”. On the taskbar, beside the speaker icon, the clock reads 2:04 AM — the guest machine’s own opinion of the time, gently adrift of the host’s.

Seventy-three minutes earlier that same night, the same machine had blue-screened — a STOP 0x7B, INACCESSIBLE_BOOT_DEVICE, later traced to the run’s own debugging instrumentation rather than to the emulator (chapter 7 has the minute-by-minute). That is the kind of story this is: for seven weeks, the hardest adversary was usually the evidence. The desktop was reached twice that night, from two independent fresh copies of the installed disk, each ending in a clean restart — proof by repetition, not luck.

The machine that did it

mddosem is a hardware-accurate PC emulator written from scratch in Rust. It builds a complete mid-nineties PC out of code — a 386-class CPU, the 8259 interrupt controllers, the 8254 timer, a PIIX3 IDE chipset, VGA — and for this campaign it booted real firmware on that emulated board rather than faking the BIOS in software. Its natural habitat is DOS and Windows 3.1: F1GP, DOOM, Word. Windows 2000 — protected mode and paging everywhere, a PCI disk controller it interrogates and second-guesses, exact interrupt-wire behaviour, V86 mode for video BIOS calls — was by several orders of ambition the hardest thing it had ever been asked to do. Chapter 1 tours the machine and NT’s demands of it; each demand became a chapter of the debugging story.

Every run in the final campaign executed on the interpreter — the plain, one-opcode-at-a-time correctness engine; every version banner in the run archive says interpreter-only. The dynamic recompiler, mddosem’s opt-in performance engine, sat the campaign out: its own Windows 2000 bug (KILN-00005) is still open.

The goal and its rules

The formal goal was set on 23 June: make Windows 2000 Professional SP4 install and boot to a usable desktop — FreeCell running — reproduced twice, and do it by fixing the emulation, not the symptom. The goal prompt’s first rule: “Fix underlying emulation behavior only. Do not patch, bypass, preseed, or fake…” No game-specific hacks is house doctrine for mddosem; here it meant no Windows-specific hacks either. When Windows misbehaved, the working assumption had to be that the emulated hardware was lying to it.

The work was tracked as a single bug, MDD-BUG-KILN-00004, raised on 30 June once the failing shape had a name — GUI setup failing at “set system security” and re-running its wizard forever (chapter 2). It was flipped to Fixed at 03:27 on 19 July. Not Closed: the project’s two-eyes rule says the author of a fix may not close it, so the ledger waits for an independent verifier. The acceptance record ends with four negatives — “without a transplanted install, Windows-specific bypass, disabled component, or omitted CD-ROM.”

Fifty-three days, twenty beats

The whole campaign compresses into twenty recorded beats below. Cobalt dots are milestones; green dots are fixes that landed; the red dot is 30 June, the marathon day on which five plausible theories died, each killed by a controlled experiment. Filter it and notice the shape: refutation after refutation, and a wall that moved downstream every time a real fix landed.

The road to desktop, 22 April → 19 July 2026 filter by kind · all dates 2026
milestone fix landed red herring waypoint
    Every entry is transcribed from the bug ledger (MDD-BUG-KILN-00004), the engineering journals, and the preserved run artifacts. The dots’ full stories live in the chapters.

    The chapters

    Seven chapters, in story order. The numbers in them are transcribed from the record, not remembered.

    How to read this site

    The chapters build on one another — machine, loop, wires, forensics, twist, fixes, desktop — but each stands alone and owns its own part of the mechanism; if you only want the twist, chapter 5 will seat you without homework. Interactive figures are step-through: click ◀ ▶, or focus a figure and use the arrow keys. If your system asks for reduced motion, the figures oblige and show their final state.

    Everything checkable is checked. Every number, address and filename on this site traces to the bug ledger, the engineering journals of 28 May – 19 July 2026, or the preserved artifacts — and where the record is honestly uncertain, the site says so rather than guessing. The Windows screens you will see are HTML-and-CSS recreations built for this essay, captioned as such; no Microsoft screenshot is republished. One absence is deliberate: the product key appears in this story only as those three words.

    Sources for this site — the mddosem bug ledger (MDD-BUG-KILN-00004 and its sibling KILN-00005); the engineering journals, 28 May – 19 July 2026; and the preserved run archive: 47 numbered captures, 61 two-GiB disk images, the 128 MiB hang.bin RAM dump, 6,763 + 114 screenshots, and a 654 MB syscall trace. Full evidence table in chapter 7.