¢ cc65 - C crosscompiler¢ ======================¢ Ji@) Svoboda¢¢ Za'alo to nevinn%. Jednoho dne se v na&) prost%jovsk[ konferenci objevil e-mail od Radka ③t%rby s jedinou kr*tkou pozn*mkou ve smyslu "O tomhle jsme se bavili ve ZBAKu" ╱co( u( je ofici*ln) term)n pro sch+zky Atariklubu, konan[ u Zdeka Buriana; j* tam tentokr*t nebyl$ a link vedouc) na http://www.cc65.org. Tam jsou domovsk[ str*nky programu, nad jeho( neexistenc) jsem si d@)ve ji( n%kolikr*t posteskl a proto(e jsem ani nep@edpokl*dal, (e by snad mohl existovat, nikdy mne nenapadlo jej hledat.¢¢¢ O co jde?¢ ---------¢ Jde o voln% &i@iteln` k@)(ov` kompil*tor jazyka C pro stroje postaven[ na procesorech 6502.¢ Term)n k@)(ov` kompil*tor - crosscompiler - vyjad@uje, (e kompil*tor generuje kd pro odli&nou platformu ╱typicky jin` CPU$, ne( na kter[ s*m b%(). Pro n*s to prakticky znamen* mo(nost programovat v jazyce C pro na&e mal[ Atari, ale vyu()t p@itom v&ech v`hod, kter[ sk`taj) daleko modern%j&) stroje. P)&ete sv+j program v komfortn%j&)m prost@ed) modern%j&)ho po')ta'e, p@)mo tam jej p@ekl*d*te ╱je to rychl[, p@i chyb*ch nemus)te neust*le znovu nahr*vat jednotliv[ '*sti syst[mu - editor, p@eklada', linker, ... z diskety 'i ramdisku$ a a( v`sledn` kd p@enesete na mal[ Atari, kde jej spust)te. Samoz@ejm% si jej nap@ed m+(ete vyzkou&et v emul*toru.¢¢¢ M+j prvn) pokus¢ ---------------¢ V roce 1994 jsem pro magaz)n FLOP, p@esn%ji pro kurz jazyka C v tomto magaz)nu, napsal krati'kou textovku v jazyce C. Jmenovala se DUUM. Byla naps*na ve standardn)m C a d)ky tomu jsem ji beze zm%n postupn% ]sp%&n% p@elo(il pro Amigu, Atari ST i PC ╱OS Microsoftu i Linux$. Na mal[m Atari jsme tehdy pou()vali Deep Blue C, ov&em to na p@eklad nesta'ilo. Pokud si dob@e pamatuji, probl[my tehdy byly s absenc) struktur. Se Zdekem Burianem jsme tehdy zkou&eli je&t% jeden p@eklada', ten struktury um%l, ale zase nebyl dostatek pam%ti pro p@eklad tak "rozs*hl[ho" programu.¢ V cc65 se sice prvn) p@eklad nezda@il ╱musel jsem odstranit lom)tka, kter* umo(uj) pokra'ovan) logick[ho @*dku na dal&)m fyzick[m @*dku$, ale ji( druh` p@eklad prob%hl bez chyby a z)skal jsem funk'n) aplikaci pro mal[ Atari. P@)jemn`m p@ekvapen)m bylo, (e zat)mco zdrojov` kd m%l cca. 10kB, v`sledn` kd byla cca. o 1kB men&).¢¢¢ Kde se to vzalo?¢ ----------------¢ cc65 je kompil*tor jazyka C, p+vodn% p@izp+soben` pro po')ta'e Atari Johnem R. Dunningem. Je to n*sledn)k jazyka Small C s n%kolika roz&)@en)mi a odstran%n`mi n%kter`mi limity.¢ Proto(e u n*s ve ZBAKu vznikly okolo p+vodu tohoto programu drobn[ nejasnosti, opakuji, (e tento kompil*tor JE p+vodn% program pro mal[ Atari a JE tak tak[ st*le k dispozici. Je to nav)c onen tajemn`, v p@edchoz)m odstavci zm)n%n` "je&t% jeden p@eklada'".¢¢¢ Co to ╱ne$um)?¢ --------------¢ Kompil*tor je t[m%@ ISO C kompatibiln), z jeho omezen) vyb)r*m:¢ - modifik*tory "const" a "volatile" jsou dostupn[, ale nic ned%laj)¢ - datov[ typy "float" a "double" nejsou dostupn[¢ - inicializace lok*ln)ch prom%nn`ch je mo(n* pouze pro skal*rn) datov[ typy ╱tj. ne pole a struktury$¢ - funkce nemohou vracet struktury; p@i@azov*n) struktur je mo(n[¢ - existuj) ur'it[ limity velikosti lok*ln)ch prom%nn`ch; nejsou dostupn[ v&echny operace, pokud velikost lok*ln)ch prom%nn`ch p@ekro') 256 bajt+¢ V z*vislosti na syst[mu, pro kter` je p@eklad prov*d%n, mohou existovat dal&) limity ╱viz. n)(e$.¢ Vlastnost), se kterou je tak[ nutno po')tat, je to, (e kompil*tor neoptimalizuje. Jako v d*vn`ch dob*ch p@i programov*n) na PC mus) program*tor p@em`&let ╱pokud tedy chce produkovat kvalitn) kd$, co jak kompil*tor p@elo(). Prakticky to nap@. znamen* nepou()vat p@i proch*zen) polem b%(n` index ╱kter` se p@i ka(d[m pr+chodu znovu po')t*$, ale vyu()t ukazatele. Rychlost v`sledn[ho kdu se t)m dramaticky zv`&).¢¢¢ Kompil*tor nen) v&echno¢ -----------------------¢ To rozhodn% ne! Pokud se tro&ku zab`v*te programov*n)m, jist% pochop)te, (e by to bylo tro&ku m*lo. Tak(e co v&echno se v bal)ku nach*z)?¢¢ - cc65 - vlastn) p@eklada' jazyka C ╱na jeho v`stupu je zdrojov` kd assembleru$¢ - ca65 - makro assembler¢ - ld65 - linker¢¢ - cl65 - compile and link utility ╱frontend pro cc65, ca65 a ld65$¢¢ - ar65 - archiver ╱pro tvorbu vlastn)ch knihoven funkc)$¢ - da65 - disassembler¢ - od65 - object file dump utility ╱pro z)sk*n) informac) z ✓.o soubor+$¢¢¢ Build ╱sestaven)$¢ -----------------¢ Vlastn) sestaven) v`sledn[ho spustiteln[ho programu prob)h* minim*ln% ve t@ech kroc)ch. V prvn)m kroku p@eklada' cc65 p@elo() zdrojov` kd jazyka C ╱soubor.c$ do zdrojov[ho kdu assembleru ╱soubor.s$, v druh[m assembler tento soubor p@elo() do bin*rn) podoby ╱soubor.o$. V posledn)m kroku linker p@ipoj) k v`sledn[mu kdu na platform% z*visl` spou&t%c) kd ╱v na&em p@)pad% atari.o$ a knihovny ╱z*klad je atari.lib, ale m+(ete m)t i svoje$. T)m je sestaven) hotovo a z)sk*v*me na Atari spustiteln` kd.¢ V grafick[m zn*zorn%n) by to vypadalo takto ╱kompilujeme soubor "hello.c"$:¢¢⇩---------⇩¢| hello.c |¢⇩---------⇩¢ |¢ cc65¢ |¢⇩---------⇩¢| hello.s |¢⇩---------⇩¢ |¢ ca65¢ |¢⇩---------⇩ ⇩---------⇩ ⇩---------⇩¢| hello.o | | atari.o | |atari.lib|¢⇩---------⇩ ⇩---------⇩ ⇩---------⇩¢ | | |¢ ld65----------⇩------------⇩¢ |¢⇩---------⇩¢| hello |¢⇩---------⇩¢¢ Samoz@ejm% je mo(n[ vytvo@it si vlastn) .o soubory ╱t@eba s obr*zky, texty atp.$ a p@ipojit je k programu tak[. Z v)ce soubor+ .o si m+(ete vytvo@it vlastn) knihovnu ╱.lib$.¢¢¢ Nen) to zbyte'n% slo(it[?¢ -------------------------¢ Mo(n* to tak vypad*, ale nikdo po v*s nechce, abyste v&echny kroky prov*d%li ru'n%. Zjednodu&uj)c) mo(nosti jsou hned dv%. Prvn) spo')v* v pou(it) frontendu, programu cl65, kter`m m+(ete v&echny pot@ebn[ kroky ud%lat jedn)m povelem. A druh*? Ti z v*s, kte@) nez+stali pouze ve sv%t% osmibit+, ur'it% zav`sknou. P@)kaz "make" a jeho "Makefile". D%s)c) se u(ivatele mus)m uklidnit, (e p@)slu&n[ "Makefile" je o pozn*n) jednodu&&) ne( t@eba u zdroj*k+ Linuxov[ho kernelu...¢¢¢ Jenom Atari?¢ ------------¢ Ne, Atari nen) jedin` po')ta' s CPU @ady 65xx. Kd tedy m+(eme krom% Atari p@ekl*dat i pro n%kolik po')ta'+ Commodore a po')ta' Apple . I kdy( v&ak byl crosskompiler z p+vodn)ho p@eklada'e p@epracov*v*n pro pou(it) s Commodore 64, tak d)ky tradi'n% skv%l[ pr*ci Atari program*tor+ je podpora File I/O dostupn* pouze pro Atari syst[my. Prakticky to pro ostatn) syst[my znamen* nedostupnost spousty kl)'ov`ch funkc) ╱nap@. printf$ a nutnost obch*zen) t[to slabiny ╱pro v&echny syst[my alespo existuje knihovna conio, kter* @e&) vstup z kl*vesnice a v`stup na obrazovku$. To v`razn% sni(uje pou(itelnost p@eklada'e. Pro m[n% zasv%cen[ zde dopluji, (e to nen) vlastnost 'i chyba p@eklada'e ale jde jen o ╱ne$dostupnost p@)slu&n`ch knihoven. Na&t%st) se to n*s, atarist+, net`k*.¢¢¢ Na 'em m+(u kompilovat?¢ -----------------------¢ Ur'it% na stroj)ch s opera'n)mi syst[my Linux, DOS, Windows, OS/2, FreeBSD, BeOS a Irix. Proto(e je v&ak cel` projekt dostupn` i ve zdrojov`ch kdech, nem%l by b`t probl[m zkompilovat crosscompiler i pro jin[ platformy ╱Atari ST$. Autor ╱auto@i$ s*m uv*d), (e cel` kd je s jedinou v`jimkou ╱funkce access╱$$ 'ist[ ISO C.¢ J* s*m jsem crosscompiler kompiloval ze zdrojov`ch kd+ na sv[m obl)ben[m OS Linux, redak'n) kolega Robert Petru(ela zkou&el hotov[ bin*rky pro Windows.¢¢¢ Na co jsme p@i&li p@i "hran)"¢ -----------------------------¢ Crosscompiler s*m nep@ekl*d* p@)mo do spustiteln[ho kdu, ale jeho v`stupem je zdrojov` kd pro assembler ╱jak bylo zm)n%no v`&e$. Je zaj)mav[ sledovat, jak jsou C konstrukce p@ekl*d*ny, pokud se v*m je poda@) v kdu nal[zt. Nic pro norm*ln) lidi. :-$¢ Tisk znaku "<tady_m*_bejt_vobr*cen`_lom)tko,_kter`_ten_zatrolenej_⇨apek_neum)>b" ╱backspace$ funkc) printf╱$ nen) korektn), m)sto vymaz*n) znaku je vyti&t%n jeden z grafick`ch symbol+.¢ Nen) o&et@en stisk kl*vesy BREAK. Prakticky to znamen*, (e po jej)m stisku procesor n%kam "zabloud)" a to je konec korektn)ho b%hu aplikace. Teoreticky by to m%lo j)t obej)t nastaven)m vektor+ kl*vesy BREAK. P@i nejbli(&) p@)le(itosti to hodl*m vyzkou&et.¢¢¢ Z*v%r? Nem*m r*d z*v%ry.¢ ------------------------¢ Skv%l* v%ci'ka! Opravdu jsem j) nad&en! ③koda jen, (e m% nenapad*, co bych mohl na Atari naprogramovat... Ale n%kte@) z V*s ji ur'it% vyu(ij). Tak(e hur* na http://www.cc65.org...¢