This is the first era documented build-by-build, and it is where the OS grew teeth: real networking, real audio, real USB, and the first serious collision with the constraints that would define the whole project.
The DOOM detour
An attempt to run doomgeneric brought in a kernel heap (kheap_init) and, with it, a boot failure that took days to corner. The screen went black. Not "wrong colours" black — nothing-at-all black, no boot menu, no log, no text, even though serial output proved the kernel was executing and setting 1280×1024.
The debugging technique that eventually cracked it is worth recording: the kernel was made to paint the entire screen a solid colour before each boot stage. Whatever colour it froze on identified the exact call that died.
A framebuffer fix was attempted — pulling the LFB address from the GPU's PCI BAR0 instead of trusting the value at 0x5000 — and it made things worse, not better. BAR0 sizing temporarily disables the VGA's memory decode, and doing it before any drawing disrupted the video path. The theory was abandoned. The resolution was a clean revert to a pre-DOOM baseline. Not every road leads somewhere.
V20 — Input and Sound
- Device Manager grew a POINTING hardware row and a taller window.
- PS/2 touchpad init rewritten properly: PIT-clocked timing, retry logic. The previous version worked in the VM and not on metal.
- xHCI keyboard binding. The USB driver had been skipping keyboards entirely — now both keyboard and mouse endpoints get configured, with separate transfer rings and a second device-context page for multi-port controllers.
- The boot chime became a three-note C-E-G melody through AC97, falling back to HDA, falling back to the PC speaker.
V21 — USB input reaches userland
xhci_poll()wired into syscalls 22 and 25 — the two input calls that loadable ELF programs use. USB mouse and keyboard finally worked inside running programs, not just on the desktop.- VirtualBox USB Tablet absolute-coordinate support: protocol 0 maps the 0-32767 range onto screen dimensions; protocol 2 stays relative.
V22 — The 512KB discovery
The most consequential bug of the era. The stage-2 bootloader was loading exactly 512KB of kernel — not the 557KB the ISO splice window implied. Any kernel over 524,288 bytes had its font tail and .data section silently truncated. The visible symptom: missing lowercase glyphs. The invisible symptom: anything else past the cut, gone.
V23 — The devkit
font8x14.hgenerated by stretching and bit-reversing the kernel's own 8×8 font to 14 rows.editor.c— a syntax-highlighting editor covering nine languages.pyidle.c— a Python IDLE, embedding pymini, with an editor pane, F5 to run, a green output console, and ESC as an interrupt hook.PYRUN.NVXas a standalone. All wrapped in NVXA containers, shipped on a six-file VHD.
V24 — Polish and an honest label
- The PY IDLE launcher icon: Python's blue and yellow interlocked blocks, with eyes, drawn entirely from
fill()primitives. - Terminal aliases
idleandpyidle. - The Wi-Fi command output was relabelled to match the real pipeline —
STEP 4 SCAN / STEP 5 WPA2-WPA3 / STEP 6 AUTHENTICATION / STEP 7 DHCP / STEP 8 INTERNET— every one of them marked[WAITING ON 2-3]. That label has aged into the most honest line in the operating system.
Also from this era, discovered rather than built: Flappy Bird was already in the OS. The complete game — gravity, flapping, scrolling pipes, scoring — had been sitting in the code with no launcher icon, so there was no way to open it. It didn't need writing. It needed a bird icon.