Free Pascal Atari ST-n

Berlinben voltam az októberi Deadline 2016 demopartyn, amikor is egy Atari ST kóderrel történt beszélgetésünk közben szóba jött a Free Pascal.

Kiderült, hogy az ember PC-n szívesen használt Pascalt és azon belül is az FPC-t mindenféle scene-vel kapcsolatos cuccokra, de hát sajnos Atarira nincsen... Én persze mondtam neki, hogy szerintem pár nap munkával portolható lenne, most hogy nagyjából kész a 68k kódgenerátor. Jaj, de hát az túl nagy meló és amúgyse, esetleg később. Na mindegy, - gondoltam én - mivel release-em úgysem készült, és kéznél volt egy szakértő, nekiugrottam ott a partyn. Kötöttunk egy fogadást, hogy sikerül egy "Hello World"-ot elérnem, még ott helyben. :)

Annyit sikerült elérni néhány óra munkával, hogy a komplett FPC runtime library lefordult Atarira, nem sokkal később pedig a packages gyűjtemény nagyobbik része is. Persze, szinte az egész használhatatlan volt, hiszen ugyan - még a 2000-s évek környékén - volt már egy befejezetlen port próbálkozás, de azóta jó sok minden megváltozott, fejlődött, ráadásul a korabeli kód egy része is elveszett, szóval a System unit 80%-a és a Sysutils unit 95%-a ezen a ponton csak semmit sem csináló stub függvényekből állt, vagy ősrégi kikommentezett kód volt.

Mindenesetre, bár a "Hello World" a partyn nem sikerült, minimális tákolással (alignment problémák és a szétfagyó, assemblyben írt startup kód javítása) és egy nappal később már igen. Ehhez a memóriafoglalást és a legalapvetőbb I/O függvényeket kellett implementálni a System unitban. Meg persze megtanítani a fordítót, hogy tud Atari GEMDOS trap-eket generálni. És voila, Hello world!. Persze csak keresztfordítóval. Ez volt tehát október 3-án.


Hello World!

Aztán eltemetett a munka meg a való élet, és minimálisan ugyan bökködtem rajta október hátralévő részében, meg novemberben, de ez nem volt számottevő. Befejeztem a File I/O függvényeket a System unitban, kisöpörtem ezt-azt és legallyaztam a meglévő dolgokat.

De most karácsonykor nekiálltam, mert a rengeteg projektem közül nyilván az szúrja az oldalam leginkább, ami senki mást nem érdekel rajtam kívül, dehát ez van, szóval olvasgattam az üres Sysutils unit forrását meg a TOS dokumentációját, megírtam egy egyszerűnek tűnő függvényt, aztán még egyet, aztán még egyet, egyszer csak azon vettem magam hogy a Directory kezelés, a System unit legnagyobb hiányzó darabja kész, valamint a Sysutils unit jó kétharmada is.

A fordító tehát először fordult le úgy TOS-ra, hogy esélye is volt működni. És be is jött a help text, de ha paraméterezni akartam, szétfagyott. Hmmm. Apróbb egyéb bugfixek után kiderült, hogy a korabeli assembly startup kód eredete bizonytalan, használhatósága kétséges, szóval inkább újraírtam azt is, Pascalban. Köszönhetően annak, hogy a fordítóban megcsináltam a GEMDOS trap generálást ez kb. 1 órás munka volt, ráadásul megjavította a paraméterkezelést, és sok más egyebet is.

Az Atari TOS-on futó, kereszfordítóval lefordított fordító tehát először képes volt lefordítani egy Hello World-ot. És aztán dobni egy jó nagy errort, hiszen hiányzott alóla a GNU assembler, meg egy linker. De kézzel, a host platformon összelinkelve az egészet már működött.


Hello ... ERROR!... World!

De itt fel is akartam adni, mert fingom sem volt honnét szedek működő GNU assemblert és linkert TOS-ra. (Minden csomag azt írta hogy MiNT kell neki, ami egy multitasking-POSIX "feltét" TOS-ra. Kiderült ezek nagy része megy sima TOS-on is. De hát értek én hozzá? Sose volt Atarim...) Végül előkerült az októberi scener kolléga e-mailben, és egy működő GNU assemblerhez irányított. Juhé!

Viszont a GNU linker szétfagyott. Szóval Amigához hasonlóan, Atarin is a VBCC compiler vlink-je lett a nyerő megoldás. Szóval némi hackeléssel és a maradék pár Sysutils függvény implementálásával később:


Hello Native World!

Kapcsolódó dokumentáció itt. Runtime library forráskód itt.

Egyetlen dolog maradt még, ami kicsit böki a csőröm - a GUI-s alkalmazások. A GEM alatti AES és hasonló függvények kissé más ABI-t használnak, azt is meg kéne tanítani a fordítónak, hogy ne kelljen kézzel assembly-t írni.

De mivel az Amiga után a TOS-tól nem vagyok elhalva (és akkor nagyon finom voltam), gépem sincs (és nem is volt, bár még lehet) és amúgy sem óhajtok még egy nemlétező OS-re még egy portot a nulláról implementálni és karbantartani, ezért ez nagyon jó eséllyel ennyi volt. De mókának nem volt rossz.

Szerk (másnap):
Well, GUI-s alkalmazások, mire jó ha az embernek nem jön álom a szemére, ugye:

Na de tényleg ennyi. :)

Hozzászólások