os8088 – Een Mac-stijl GUI OS voor de IBM PC XT

Systeemeigenschappen:

  • Resolutie: 640x480 pixels
  • Kleuren: 16
  • RAM: 256K
  • Kernelgrootte: 52.718 bytes
  • Taakslots: 12
  • Pre-emption: 18,2 Hz

Wat het is

os8088 boot vanaf de eerste sector van een diskette rechtstreeks naar een grafische desktop. Er draait geen DOS onder en er is nergens een opdrachtregel aanwezig. De bootsector van 512 byte laadt een kernel van 40KB; de kernel stelt vast welke displayadapter de machine heeft, schakelt deze over naar de grafische modus, maakt gebruik van de eigen 8x8 tekenset van de videokaart en plaatst een menubalk.

Alles daarna is de interface zoals men die zich herinnert van een Macintosh uit 1984: vensters die je via de titelbalk kunt verslepen met een 'rubber-band' omlijning, menu's die je naar beneden trekt en doorheen sleept, een sluitknop en een minimaliseerknop, iconen voor elke diskettestation en een dock onderaan met één tegel per draaiend programma. Programma's worden geladen vanaf een tweede diskette en draaien als volwaardige applicaties, waarvan er meerdere tegelijk actief kunnen zijn.

Het geheel past in 256K RAM op een Intel 8086 of 8088 — de processor in de originele IBM PC en PC/XT. Het is een hobbyproject dat compleet genoeg is om te gebruiken; de broncode bestaat uit 66.183 regels NASM die je in een middag kunt lezen.

Specificaties in cijfers

Alle onderstaande gegevens zijn afkomstig uit de build, niet uit het geheugen.

Geverifieerde specificaties van os8088

  • Kernelgrootte (52.718 bytes): Bevat de scheduler, window manager, VGA-driver, muisdriver, sound layer, file manager, loader, Taakbeheerder en het Configuratiescherm.
  • Bootsector (512 bytes): LBA-naar-CHS vertaling en het opnieuw proberen van BIOS-diskettelezingen. De build faalt als dit een andere grootte heeft.
  • Segment footprint (59.031 bytes): Code plus elke buffer die de kernel via DS bereikt. Dit moet passen binnen het 64K segment — er is momenteel 6.505 bytes aan headroom. Taakstacks, diskbuffers en elk geladen programma bevinden zich buiten het segment en worden hier niet meegeteld.
  • Regels assembly (66.183): Handgeschreven real-mode 8086. Geen C, geen linker, geen runtime library.
  • Display: VGA, Hercules of CGA (wordt bij boot gedetecteerd). VGA modus 12h is 640x480 in 16 kleuren — vier 1-bit planes, 80 bytes per scanline; Hercules is 720x348 en CGA 640x200, beide monochroom en banked. Op alle drie wordt direct naar de framebuffer getekend.
  • Back buffer (optioneel, standaard uit): Een off-screen kopie van het scherm is 153.600 bytes, meer dan de helft van het geheugen van de machine. Daarom tekent een 256K machine altijd direct naar het display, net als de Macintosh uit 1984. Bij 500K of meer kan dit in het Configuratiescherm worden ingeschakeld.
  • Taken: 12 slots, stacks van 1.536 bytes. Elke Klok en elk 'Bounce'-venster is een eigen pre-empted taak.
  • Context switch rate (18,2065 Hz): De standaard timer-rate van de PC. Bij elke tick slaat de handler negen registers op, wisselt de stack pointer en keert terug naar een ander programma.
  • Laadbare programma's: Elk programma neemt één segment in beslag. Pakketten worden vanaf een tweede diskette geladen in hun eigen regio's van het conventionele geheugen — ongeveer 107K arena op een 512K machine, 233K bij 640K. Meerdere programma's kunnen tegelijk resident zijn en geven hun geheugen vrij bij het sluiten.
  • Muis: 1200 baud, 7N1A Microsoft seriële muis op COM1, drie bytes per rapport, gedecodeerd in een interrupt-handler die ook de cursor tekent.
  • Doelhardware: IBM PC/XT, 8088 op 4,77MHz; 256K RAM, een seriële muis en een VGA-, Hercules- of CGA-kaart. Het opnieuw tekenen van het scherm is traag genoeg om live te kunnen volgen.
  • Instructieset: Uitsluitend 8086 (afgedwongen via cpu 8086 plus -w+error). Alles wat nieuwer is, leidt tot een build-fout. Een instructieset uit 1978, mechanisch gegarandeerd.

Wat het doet

Pre-emptieve multitasking

Er is geen samenwerking tussen programma's nodig. Twee klokken houden de tijd bij en twee ballen blijven bewegen terwijl je in iets anders typt. De timer-interrupt vuurt 18,2 keer per seconde, slaat de actuele taak op, wisselt de stack pointer en keert terug naar de volgende taak — een proces van ongeveer dertig instructies. De Macintosh uit die periode kon dit helemaal niet: System 1 draaide één applicatie tegelijk, en toen MultiFinder in 1987 verscheen, was deze coöperatief.

Rubber-band slepen

Het venster verplaatst zich pas wanneer je de muis loslaat. Een XOR-omlijning van één pixel volgt de aanwijzer en het venster springt naar die positie bij loslaten. Dit is gedaan omdat het hertekenen van een volledig venster bij elk muisrapport onmogelijk was op 4,77MHz, precies zoals dat in 1984 het geval was.

Laadbare software

Programma's worden geladen vanaf een tweede diskette. Door dubbel te klikken op een bestand in het Schijfvenster wordt het geladen in een eigen segment en uitgevoerd als een echte applicatie. Minesweeper is bijvoorbeeld 1.510 bytes inclusief icoon. Meerdere pakketten — of meerdere kopieën van één programma — kunnen tegelijk resident zijn.

Taakbeheerder

De taakbeheerder houdt zichzelf in de gaten. Het bevat een live CPU-meter met een scrollende geschiedisgrafiek, een RAM-uitlezing en één rij per draaiend programma. Applicaties zonder eigen taak krijgen hun window callbacks getimed op de dispatch-locatie en worden daarop gefactureerd, zodat de rijen samen altijd optellen tot één totaal.

Werkt op echte hardware

Alle bovenstaande beelden zijn vastgelegd in een emulator. In augustus 2026 heeft iemand de diskette-images geschreven naar fysieke diskettes en deze geboot op drie machines uit die periode — een IBM 5150 uit 1981, een Toshiba T1100 Plus en een 286 — en daar foto's van gemaakt.

IBM 5150, 8088 op 4,77MHz: Zes programma's tegelijk op een IBM PC uit 1981. Een echte 5150 die een Hercules-kaart aanstuurt op 720x348, geboot vanaf een 360K diskette. De lijst met hardwarecomponenten van de machine is getypt in een Notitieblok dat vanaf diezelfde diskette was geladen. De fotograaf (Elendilon) rapporteerde dat het systeem hier niet trager is dan onder emulatie.

De geschiedenis waar het mee concurreert

In februari 1985 leverde Digital Research GEM 1.0 voor de IBM PC: een desktop in Macintosh-stijl met overlappende vensters en iconen, draaiend op standaard XT-hardware. Apple spande een rechtszaak aan. De schikking leidde in 1986 tot GEM Desktop 2.0, waarbij overlappende vensters en desktop-iconen op de PC werden verwijderd — terwijl de Atari ST-versie, die niet onder de overeenkomst viel, deze functies behield.

De PC had dit dus kortstondig, en daarna niet meer. os8088 is een herbouw van dat idee, vanaf nul, veertig jaar later, op hetzelfde type machine — inclusief de pre-emptieve multitasking die noch GEM, noch de Macintosh uit die periode bood.

Wat het niet is

  • Geen DOS: Het is geen DOS en het draait geen DOS-programma's. Er zit geen DOS onder; het systeem beheert de machine vanaf de bootsector omhoog.
  • Geen geheugenbescherming: De 8086 biedt dit niet. Elk programma deelt één 64K segment met de kernel, wat precies is waarom een context switch goedkoop genoeg is om uit te voeren.
  • Geen file handles of seeking: De disk-API verplaatst hele bestanden tegelijk (schrijven, lezen, verwijderen, hernoemen). Dit is de grootste subset die eerlijk blijft zonder diskcache en met twaalf pre-empted taken.
  • Geen netwerking of hardeschijfondersteuning.

Het is een hobbyproject, geen commercieel product. Het is echter compleet genoeg om direct te kunnen gebruiken, wat precies het doel is.

Probeer het uit

De browserdemo boot de echte diskette-image in een geëmuleerde PC — exact dezelfde bytes als je op een fysieke diskette zou schrijven. Voor wie het zelf wil draaien: de downloadpagina biedt 360K images voor period hardware en 86Box, en 1,44MB images voor QEMU.