Jag vill skriva en emulator!

Emulering av spelkonsoler har alltid fascinerat mig ända sedan min kompis i mellanstadiet berättade att han redan nu spelar Banjo-tooie hemma på datorn innan spelet släppts. Det var en lögn. I slutet av 90-talet var det inte möjligt för den tidens datorer att emulera Nintendo 64 (Nu kan du spela N64 på bärbara maskiner).

Vad kompisen sa var inte sant men att kunna köra mjukvara på en annan maskin än vad den var tänkt att köra på är fullt möjligt.


Senare i livet var jag en gång på öppet hus vid den högskola där jag sen skaffade min kandidat. Vid montern för det datavetenskapliga programmet stod en mycket blyg kille ihop med en dam som jag tog jobbade vid lärosätet. För att locka förbipasserande visades på en laptop en Commodore 64 emulator utvecklad av den blyga killen. Wow tänkte jag, är det sådant här man får lära sig, och utveckla, på programmet så kommer det passa mig perfekt! Efter genomförd utbildning kan jag konstatera att ingenstans dök den här emulatorn upp men det stoppar inte mig från att själv ge mig på ett försök till en Game Boy emulator i Java.


Så klart finns det redan emulatorer skrivna i alla språk, till alla system. Om du enbart vill spela något från när du var liten kan du bara sätta dig ner och spela nästan lika enkelt som vilket spel som helst.

Men vill du fördjupa dig kan det också vara en mycket nyttig övning att borra sig ner genom alla lager i datorn så du nästan kommer till silikonen som ett sätt att bli en bättra programmerare.

A big percentage of so-called experts today only know how to configure tools, but they understand nothing about how things work at the deeper level. This is a real challenge and a big problem for the future.

We have used too many levels of abstractions and now the future looks bleak

När du är där nere klickar förståelsen på ett helt annat sätt att allt bara handlar om bytes som far runt och ändras mellan CPU, RAM och disk.


Vart börjar vi?

Du behöver känna till det binära talsystemet, nu skall vi prata ettor och nollor och hur tal representeras. Sedan behöver du boolesk algebra och kunna koda hjälpligt i valfritt språk som kan rita något på skärmen.

Nästa steg är lite knivigare. Nu behöver vi lära oss hur en CPU arbetar. Att den exekverar en instruktion i taget vars resultat ändrar dess interna register eller skriver något till minnet.

von Neumann architecture

Förslagsvis väljer du att emulera något system från 80-talet där arkitekturen är enkel, entrådig och saknar dedikerad GPU, lagring till disk etc. I följande videos diskuteras Nintendo 8-bitars och Game Boy på den tekniska nivån du behöver.

Till systemet behöver du någon form av dokumentation av hårdvaran och CPU instruktioner. Game boy dokumentation hittas här.

När du börjar koda så börja med att modellera alla delar i systemet som bevarar något form av tillstånd. Skapa egna variabler som representerar varje register i processorn och hela RAM minnet. Läs sedan in alla bytes från en ROM till ditt ”fake” RAM och försök exekvera den första instruktionen i programdelen.

En del av all kod, grafik och känslor i Super Mario bros.

Det här är svåra grejer men fantastiskt häftigt när programmet får liv och kör den här flera decennier gamla koden 🙂


Publicerat

i

av

Etiketter: