Krissz.hu- Kézműves szoftverfejlesztés -

Írok egy emulátort!

Belekezdtem régóta halogatott projektembe, böngészőben futó Commodore 64 emulátor írására adtam a fejem. Az első hónap tapasztalatait, tanulságait, és az emulátor programozásának eddigi élményeit összegzem ezzel a bejegyzéssel.

Az igény úgy merült fel bennem, hogy a jelenleg elérhető emulátorok mindegyike vacak. Valamilyen módon kényelmetlen azok használata. Noha mérnöki szemmel vannak közel tökéletesek, de a felhasználói élmény minden esetben katasztrófa. Kezdve azzal, hogy telepítgetni kell. Aztán, hogy kézre is essen, a használat közben folyton obskúrus menürendszerekben kell bolyongani, almenük almenüjeiben kell checkboxokat pipálgatni, még a legtriviálisabb igények kielégítéséhez is, mondjuk ha a joystick portokat akarja felcserélni az ember, vagy ha le akarja tekerni a hangot, stb. Én egy olyan élményt álmodtam meg, ahol az érdeklődő csak beüt egy webcímet, ENTER, és azonnal az arcába robban egy teljes képernyős emulátor, készre konfigurálva, minden sallang nélkül, mintha csak a jó öreg C64-et kapcsolta volna be.

A kihívás is motivál. Egy emulátor írásához elengedhetetlen a célgép 100%-os ismerete, annak tervezési hibáival együtt, mert még a hardveres bugokat is le kell programozni szoftveresen. Bő egy hónap után tisztán látszik, hogy ez egy véget nem érő tanulási folyamat. A kihívás másik felét a választott platform adja, a webes környezet. A natív alkalmazásokhoz képest én csak a böngészők adta kereteken belül tudok ugrálni, ami még ma is egy elég szűk ketrec. A mikroszekundumra pontos időzítések és a valós párhuzamosítás teljes hiánya feladta a leckét. Lesz ami lesz alapon belekezdtem, szokásomhoz hűen nulláról indulva, semmilyen külső forráskódra nem támaszkodva, hisz a lényeg maga a tanulás, ami csak így mélyülhet el.

Elsőként a processzort programoztam le. Ez volt talán a legegyszerűbb, mert egyértelmű, hogy melyik utasítás mit csinál. (Bár azért a decimális módban működtetett ADC és SBC műveleteknél volt hajtépés.) Itt az illegális utasítások terén tanultam sokat, mert bár azok hivatalosan nem dokumentált utasítások, amik pusztán a processzor tervezési sajátosságai miatt működnek, ennek ellenére nem hagyhattam ki ezeket sem, mert a gép minden cseppjét kifacsaró scene bizony él velük. De kérdem én, hogyan lehet helyesen leemulálni olyan utasításokat, amik a gép üzemi hőmérsékletétől függően esetenként instabil eredményt adnak?

Hogy lássak is valamit, nekiálltam a VIC, vagyis a videó chip leprogramozásának. Az egész rendszerben ez a legnagyobb falat, gyakorlatilag a legfontosabb áramkör a C64-ben. Konkrétan a televíziós készülék katódsugarának vonulását kellett szoftveresen működtetni. Másodpercenként 50 képkockát kell legyártani úgy, hogy minden képkocka minden egyes pixelének színkódját valós időben számítom ki a gép aktuális memóriatartalmától függően. Sebességoptimalizálás terén ez őrült nagy kihívás, agyig kellett optimalizálni a kódot. A VIC kapcsán sok minden, addig homályos félinformáció állt össze bennem egésszé: megtanultam, hogy mi is a különbség a PAL és NTSC rendszerek között, és hogy miből adódik az, hogy a C64 órajele nálunk Európában 985,248 kHz.

C64 kezdőkép

És ezen a ponton történt meg a csoda. Eddig ugyebár vakon voltam, semmit nem láttam a kódhalmazom eredményéből. A VIC alapjainak megírásakor csak az egyszínű szöveges grafikai üzemmódot dolgoztam ki, mert az már elegendő ahhoz, hogy ellenőrizhessem a gép futását. Ekkor belöktem az órajelet, elindítottam a progit, és megjelent a szemem előtt a mindenki által jól ismert kék képernyő a szokásos üdvözlő szövegekkel! Ez azért volt óriási élmény, mert ugyebár én semmi olyat nem írtam a kódba, hogy kék legyen a kép és hogy ki legyen írva hogy 38911 BASIC BYTES FREE, meg a többi szöveg. Én csupán a hardvert programoztam le, és miután beindítottam a szoftvert, az adta ki magától azt az eredményt, amit a hardver ad ki. A katarzis pedig akkor következett be, amikor a C64 legbugosabb chipjeit, a két CIA áramkört is lekódoltam. Ekkor ugyanis az általuk generált megszakítások következtében elkezdett villogni a kurzor, lehetett írni a képernyőre, a beírt parancsokat futtatta a BASIC interpreter, egyszóval életre kelt a gép! Próbálom most megfogalmazni, de szavakkal úgysem tudnám átadni az érzést: mintha a 7 éves koromban elkezdődött történet ekkor ért volna körbe...

Úgy voltam vele, hogy ha csak eddig jutott el a projekt, már megérte belefogni, ám evés közben jött meg az étvágy. Hirtelen annyi továbbhaladási irányt bontakozott ki, hogy a napok végére úgy éreztem, öt Krissz sem lenne elegendő ezek leprogramozására. Kezdtem nagy kedvencemmel, a CRT filterrel, aminek révén már úgy írhattam az ívelt formájú, zajos képernyőre, hogy a legrosszabb színkombinációkat kiválasztva szinte semmit ne lássak a betűkből. Ötletrohamaim során olyan fícsör is eszembe jutott, hogy a webkamerával rögzített képnek az árnyképét halványan rárakom a C64 képére, így még az ablak előtti függöny TV-ben való visszatükröződésének égető kérdése is megoldott. :) A trafó melegének talppal való letapogatására még nem találtam ki semmit, de ígérem, ami késik, nem múlik!

CRT filter

A funkciók folyamatos bővítésével egyre több betöltött program működött. A tufább játékok már simán lefutottak. Sok vicces dolog is történt. Amikor már minden grafikus üzemmódot leprogramoztam, de a spriteok kezelése még hiányzott, elindítottam az Aztec Challenget, és mivel nem volt futó emberke, a sorfalat álló tömeg pedig csak lesett és nem dobáltak dárdákat, így meghalni sem lehetett, és a piramis csak közeledett... :) Szóval úgy is lehet csítelni egy játékban, ha valaki köré ír egy emulátort.

Született egy pofás kis grafikus billentyűzet a lenyomott gombok visszajelzésére, és a PC billentyűzetén nem megtalálható gombok benyomására. Az is felbecsülhetetlenül hasznos, hogy a BASIC kódokat be lehet copy-pastelni az emulátorba, így nem kell bepötyögni a hosszas listákat. Számomra az igazi killer feature viszont az, hogy az emulátor tabjába automatikusan betöltődik a fejlesztői környezetemben épp lefordított program, akadálymentessé téve így a tesztelést. Nem titkolt szándékom, hogy a C64-re fejlesztő szűk, de lelkes közösség számára is vonzóvá tegyem a rendszert azáltal, hogy teljes körű debug felületre lehet váltani, ahol minden fontosabb regiszter valós idejű változását nyomon követheti a bitek mélyére ásó kóder. Mindent igyekszem elkövetni az átlag végfelhasználók maximális kiszolgálása érdekében is, így hatalmas játékkatalógusból válogathat bárki kedvére, egy kattintással indíthatja kedvenc játékát, nem kell innen-onnan letöltögetnie .d64 meg .prg fájlokat.

Grafikus billentyűzet

A legendás SID chip, vagyis a hanggenerátor programozása is rengeteg időmet emésztette fel, és még közel sem tökéletes. Úgy, ahogy az emulátorom egyetlen része sem az, és nem is lesz az soha. Viszont folyamatosan egyre javul, bővül, finomodik. Ez egy olyan projekt, amit szeretettel dédelget az ember. Amikor a nap 10. munkaórájában már nem én írom a kódot, hanem a kód íródik magától, az az igazi kézműves szoftverfejlesztés.

Ha mutatkozik rá igény (értsd: kapok legalább két érdeklődő levelet a témával kapcsolatban), akkor csinálok neki egy oldalt, ahol mindig az épp legfrissebb változat lesz elérhető, annak ellenére, hogy ez még egy igencsak experimentális cucc.

Ha tetszenek a munkáim, és szeretnél támogatni, nyomj rá a gombra, és hívj meg egy kávéra!

Buy me a coffee!

< Kezdőlap