UEFI vs PC-emulatorer.

ADVARSEL. Dette afsnit er kun for nørder. Der kommer nemlig mange fagudtryk.

I starten af Oktober 2023 var det mere end 11 måneder siden, at der sidst havde været henvendelser om noget support-relateret, så jeg gik i gang med at ændre kernen i en mere hobby-præget retning ved at indføre ny grafikmode med flere farver, og dermed mulighed for 3d (forskellige belysnings intensiteter).


Anledningen var dels, at skitserne havde ligget klar siden 2015, fordi vi allerede dengang havde hørt, at de VGA-kompatible grafik-modes ville forsvinde inden alt for længe, dels den måde jeg har set børnebørn på 7 år lege med spillet “Minecraft” på.
Det kunne være sjovt at lave en 3d-verden med objekter, man kan styre på forskellig vis ved hjælp af gopa, og det var vel ikke uden grund, at en medarbejder under det daværende “Jysk Teknologisk” tilbage i 1989 foreslog at kalde murstens-sproget for CPL (Childrens Programming Language).

Omkring midten af December havde jeg fået gang i en 256 farvers version (VESA 0x103) specielt beregnet til at blive kørt under retro-spil emulatoren DosBox. I modsætning til kerne-udviklingen siden 2016, der har haft fokus på at kunne køre på PC-er med UEFI-bios.
32-bit filen hedder SYSLOAD.L25 (L står for Legacy og 25 for 256 farver) og 16-bit modulet hedder GOPA7.EXE, og der er plads til flere SCB-er end i tidligere udgaver – 1244 i stedet for 869.
Bortset fra grafikken bygger .L25 varianten på .UE0 varianten, der er velgennemprøvet hos DosBox. Før 2019 var SYSLOAD.UE0 den eneste variant, og dengang hed den altid bare SYSLOAD.SYS.

Konceptet bliver, at hvis de to mest betydende bit i pixel-byten er nul, gælder det gamle farveskema, så bestående 16-farvers apps kan køres uden ændringer. Men de to mest betydende bit har jo 3 andre kombinationer, der skal svare til 3 forskellige farver. Man kan tænke på det som 3 forskellige bøtter maling, man kan male maskindele i.
Når en af disse er valgt, vil de nederste 6 bit angive belysnings-intensiteten. Så belysningen af et objekt får så 64 forskellige intensiteter (når kulsort medregnes). Det er ikke så tosset i betragtning af, at mange kendte spil i både 90-ere og nullere kørte med 16-bit video uden palette-support, hvor der typisk kun var 32 mulige belysnings-intensiteter (5 bit pr grundfarve). Da DosBox ikke supporterer MMX, er det meningen, at al rotation og perspektiv-konvertering klares med 3 opslags-tabeller. En kvart sinus-tabel til rotation og to logaritme-tabeller – en i hver retning præcis som en gammeldags regnestok. Sådan nogen kan både gange og dividere superhurtigt, når resultatet ikke behøver være præcist.

Nutidens CPU-er bruger stadig relativt mange clocks på at dividere, og når resultatet ikke behøver være helt præcist, er regnestok-princippet hurtigere. Antallet af fysiske pixels på en skærm er mikroskopisk sammenlignet med den kolossale datamængde, en “state-of-the-art” 3D maskine må pumpe sig igennem (f.ex. Vulkan).

MEN så pludselig – 19-01-24 dukkede der for første gang i over 14 måneder en henvendelse op i mailen fra en, der netop ville køre gopa i emulator. Det drejede sig om at ville bruge den på en virtuel PC – ikke blot til undervisning og leg men med ydre kommunikation i stil med en fysisk PC.

Jeg har selv mest erfaring med retro-spil emulatoren DosBox, som vi jo har brugt til visse ting – f.ex. værktøjsprogrammer, men som jeg ikke umiddelbart ville satse på til direkte styringsformål, fordi man så ville stå på bar bund, hvis man kom ud for, at en app pludselig gik i stå. Så skulle man til at udrede hele emulatoren – herunder dens interaktioner med det underliggende operativsystem.

Det strider også mod gopas speciale: “At være den arkitektur, der giver mest datakraft pr. transistor, hvis forudsigelige responstider er et must”.

Men alligevel:
Der er mange analogier mellem en virtuel PC og så de SMI (System Managament Interrupts) der drillede os i de tidlige UEFI-faser: At ikke-eksisterende hardware med større eller mindre held søges emuleret af nyere hardware ved hjælp af en særligt priviligeret CPU-mode: System Management Mode. Når man tror, at man skriver til eller læser fra f.ex. en IO-port, hopper CPU-en til noget SMI-kode, der oversætter aktiviteten til noget helt andet, før der returneres.
Dette beskrives nærmere i en manual, jeg var begyndt på i sommeren 2021, som skulle have været brugt til undervisning af 1-ste instans supportere.
SMI-kode har været kritiseret specielt inden for Linux-miljøet, men der er opstået en konsensus mellem Linux-miljøet, Microsoft og PC-producenterne om, at en max tidsforsinkelse af eksempelvis interrupts på 2 mikrosekunder er acceptabel. Men det kræver, at man ikke bruger UEFIs CSM-support – eller endnu værre: Lader PC-en boote i legacy-mode (MBR-boot).
Det er forøvrigt også SMI-kode, der potentielt kan “lytte med” på eventuel internet-trafik, og diskret sladre til NSA om alt hvad der foregår.

Ved tilbagetrækningen i starten af 2022 tilføjede jeg 3 nye afsnit til den påbegyndte manual: “UEFI-2 faserne” – “Kontor-PCer i industrimiljø” og “Den digitale kanariefugl” for at huske på, hvor langt vi var kommet.

Den eneste nylige redigering i forhold til starten af 2022 versionen, er faktisk i den oprindelige del fra 2021. Dengang havde der været en .NSH-fil ved navn STARTPCI.NSH, som nu er fjernet.
Denne fil vil komme til at spille en afgørende rolle ved eventuel overgang til UEFI-3, hvor timertick sættes op i tempo, og vi kommer til at køre 100% som UEFI selv gør: Lader timertick (baseret på HPET og xAPIC) være eneste interrupt, og lader alt andet være poll-baseret.

Men i UEFI-2 sammenhæng, hvor vi alligevel udnytter CSM-supportens PCI-BIOS, var det bare en unødvendig komplikation for 1-ste instans supporteren. Det gør ingen skade for gamle apps. Det eneste filen gjorde, var at tænde bus-interfacet (PCI “command” register 0x04) før start af SYSLOAD.SYS, og det tager ikke skade af at blive gjort to gange. Der er tale om 3 forskellige bit, 0=I/O, 1=mem-io, 2=busmaster. F.ex. har et kort som PROFIBUS-kortet CP5613/A3 fra Siemens kun brug for at få tændt bit-1 (mem-io), mens netkortet RTL8139 derudover har brug for bit-2 (busmaster). Denne viden er i dag indbygget i kernens driver-sektion.
Det resulterende dokument UEFI2.PDF er langtfra udtømmende, men kan være interessant for folk, der afprøver gopas evne til at køre på forskellige platforme, fordi problematikkerne ligner, og måderne det kan testes på typisk også.

Hent UEFI2.PDF:

Det kunne da være sjovt på et eller andet tidspunkt inden 2028 (hvor det kan blive svært at skaffe UEFI-2 PC-er) at slutte med en UEFI-3 version med kun en enkelt interrupt-kilde, nemlig timertick. Så er vi tilbage, hvor det hele startede.
Da den allerførste gopa til Zx-Spectrum kørte på TV-skærmen i vinteren 85-86, var der også kun een interrupt-kilde. Den kom 50 gange i sekundet synkront med skærmbilledet, og de 3 grafik-opdaterings frekvenser, man dengang havde til rådighed på gopa-siden var 50, 25 og 16.67 (=50/3) Hz. Det blev senere til 60, 30 og 20Hz på PC-platformen, fordi lysnettet i USA kører ved 60Hz mens Europa kører 50 Hz.