En 8-bitsprocessor från 1975 kan simuleras transistor för transistor i webbläsaren
MOS 6502 är en av de mest kartlagda processorerna i datorhistorien. Visual 6502 är projektet som gjorde kartläggningen möjlig: en simulering på transistornivå som kör direkt i webbläsaren, byggd på högupplösta mikrofotografier av det avskalade kislet. Du ser inte en förenklad modell av vad processorn borde göra. Du ser de faktiska transistorerna tändas och släckas medan koden körs.
Det låter avancerat men grundprincipen är enkel. Någon slipade bort skyddslagren från en fysisk 6502-krets, fotograferade ytan och pekade ut varje transistor och ledning manuellt. Ur de här bilderna byggdes en digital tvilling. När du kör den simuleras kretsen nod för nod, inte instruktion för instruktion.
Reverse engineering började med en avskalad kiselbricka
6502 lanserades 1975 av MOS Technology och blev hjärnat i Commodore 64, Apple II och NES. Chippet innehåller runt 3 500 transistorer, vilket är litet med dagens mått. Det är precis den blygsamma storleken som gjorde det möjligt att kartlägga för hand.
Processen bygger på en teknik som kallas delayering. Man löser bort de översta lagren av ett chip så att metalledningar och kiselstrukturer blir synliga. Sedan fotograferas ytan under mikroskop, ofta i flera lager och bilderna sys ihop till en enda högupplöst karta över hela kretsen.
Därefter kommer det tålmodiga arbetet. Varje transistor, varje ledning och varje koppling ritas in som en polygon ovanpå fotografiet. En 6502 med sina 3 500 transistorer är hanterbar. En modern processor med miljarder transistorer i över tio lager går inte att göra på det sättet, vilket är en av anledningarna till att just gamla chip blivit så noggrant dokumenterade. Källkoden och de utpekade lagren ligger öppet på GitHub för den som vill se hur polygonerna är definierade.
Poängen med att jobba på den här nivån är att ingenting behöver gissas. En vanlig emulator säger ”instruktionen LDA laddar ett värde i ackumulatorn” utifrån hur dokumentationen beskriver den. En transistornivå-simulering laddar värdet därför att kislet är kopplat på ett sätt som råkar ge det resultatet. Skillnaden märks direkt när man stöter på odokumenterat beteende: illegala opkoder, kvarhängande värden på databussen, timingdetaljer som aldrig stod i något datablad. Simuleringen återger dem för att den återger den fysiska kretsen, inte manualen.
Det är också därför projektet blir ett verktyg för att förstå klassisk datorarkitektur på riktigt. Du kan följa hur en enda klockpuls delas upp i faser, hur adressbussen sätts innan data hämtas och hur register faktiskt är fysiska rader av transistorer och inte abstrakta lådor. För den som vuxit upp med hur en modern webbläsare stegvis bygger en sida är det nyttigt att se hur få rörliga delar en dator egentligen behöver för att fungera.
Visual 6502 kör i några tiotals hertz i webbläsaren och det är meningen
En äkta 6502 körde i runt 1 MHz. Visual 6502 i webbläsaren ligger på ungefär 4 hertz i stegläge och når mellan 22 och 44 hertz vid vanlig körning. Firefox råkar ligga omkring 10 hertz före Chrome i praktiken. Det är alltså flera hundra tusen gånger långsammare än originalet.
Det är inte ett problem, det är själva idén. Simuleringen räknar om tillståndet för tusentals noder varje halv klockcykel och den är medvetet strypt till en halv klockcykel per bildruta.
Målet är att du ska kunna pausa, spola tillbaka och inspektera enskilda signaler, inte att köra spel i realtid. Den som vill mäta prestanda ska titta någon annanstans.
Trovärdigheten kommer inte från hastigheten utan från testerna. Simuleringen körs mot etablerade testsviter som Wolfgang Lorenz C64 Test Suite och NES-testet nestest, som stressar varje instruktion och kontrollerar exakta cykelantal. LDA med omedelbar adressering ska ta två cykler, indirekt indexerad adressering med sidöverflöde ska ta sex. Om en enda cykel avviker syns det. Samma tanke om att verifiera det verkliga beteendet i stället för det förväntade återkommer i mycket modern testinfrastruktur.
Ricoh 2A03 i NES avslöjar hur nära metallen simuleringen ligger
Ett bra bevis på hur exakt kartläggningen är: samma metod har använts på Ricoh 2A03, processorn i Nintendos NES. Den är i praktiken en 6502 med den binärkodade decimalräkningen (BCD) bortkopplad, en detalj Nintendo tros ha valt för att undvika patentbråk. En simulering som bara härmade instruktionerna hade behövt en särskild regel för det. En som återger transistorerna får skillnaden på köpet, eftersom just de kopplingarna helt enkelt saknas i kislet.
Det säger något om vad kartläggning på den här nivån egentligen ger. Man dokumenterar inte hur en processor tänktes fungera, utan exakt hur den blev. Odokumenterade opkoder, egenheter i timing och specialfall som utvecklare på 80-talet upptäckte genom ren experimentlust finns kvar, eftersom de aldrig var buggar utan konsekvenser av hur transistorerna satt.
För någon som lär sig programmering idag är det en påminnelse värd att bära med sig. Under varje abstraktionslager finns till slut fysik och ibland är det enda sättet att förstå ett system på riktigt att gå hela vägen ner och titta på hur det är byggt.
Källor
- ligger öppet på GitHub github.com
