A K.I.T.T. challenge
Az illusztráció tárgya egyébként nem állt túlzottak közel hozzánk, átlagos, illetve banális német akciósorozatnak tekintettük szerintem mindketten az osztálytársammal, akivel ebben a projektbe belevágtunk.
Én egy kicsivel később kapcsolódtam be az assembly nyelv tanulásába, mint ő, megpróbáltam gyorsan felzárkózni. Nagyjából hasonló témákkal kísérleteztünk, amikor eszünkbe jutott, hogy a számítógép párhuzamos portjára (amit akkor nyomtatásra, gép-gép összeköttetésre használtak általában) lehet LED-eket dugni.
Hát így:
A LED-ek felvillantása olyan egyszerű feladat volt, hogy ötlet ötletet követett és heuréka felkiáltásban végződött: villogtassuk őket úgy, mint a KITT!
A megoldáshoz 5 db LED-et használtunk, természetesen pirosat. Nem kellett forrasztgatni, áramkörökkel bíbelődni, hol volt akkor még az IoT meg az Arduino (sehol). Egyszerűen beudgtuk a boltban vett LED két lábát a megfelelő lukakba a párhuzamos porton és készen is volt a mágia.
Az assembly nyelv, amire fent már utaltam, nagyon közel állt a gépi kódhoz, tulajdonképpen annak egy olvasható változata volt, a forráskódot közel 1:1 arányban a processzor nyers utasításaivá lehetett fordítani (ellentétben a ma használatos nyelvekkel, amik néha 3-4 köztes fázison is átmennek, mire valódi CPU utasítás lesz belőlük).
Ez a viszonylag nyers kód természetesen azt is eredményezte, hogy nagyon gyors volt, emiatt a LED-ek oda-vissza villogtatása folyamatos világításnak tűnt, annyira gyorsan váltott a számítógép egyik LED-ről a másikra. Az első kihívás tehát az volt, hogy hogyan lehet a késleltetést megoldani egy olyan környezetben, ahol az a lényeg, hogy minden a lehető leggyorsabb legyen.
Az első megoldás a számítógép órájának felhasználása lett volna, ami másodpercenként 18.2-ször "üt" (55 ms-enként). Ennek az elborult számnak történeti okai vannak, de egészen sokáig megkeserítette a webfejlesztők életét is, mivel a böngészők sem tudtak ennél gyorsabb ütemet diktálni. De a lényeg az, hogy ezzel egyrészt kényelmetlen volt számolni, másrészt elég sok kódot kellett volna hozzá írni, hogy akár csak egy fél másodperces villogást be tudjunk állítani.
Második megoldás: ne csináljunk semmit, de azt sokszor. Professzionálisan hangzik, de a lényege nagyon egyszerű: nézzük meg, hogy egy adott számláló kisebb-e, mint nulla, ha nem, akkor vonjunk ki belőle egyet, ha igen, akkor villantsuk fel a következő LED-et. Az akkori processzoroknak bizony nehezére estek ezek az egyszerű utasítások is, és nagyjából 3000 ilyen kivonás már jól látható sorfényt tudott eredményezni.
A projekt készen is van, a LED-ek szépen sorban, látható időkülönbségekkel felvillannak, KITT!
Itt a kód amúgy.
A kész, futtatható program hozzávetőleg ilyen nagy lett (a kép csak illusztráció, valójában 104 byte lett, nem 96, mint ez):
Összehasonlításképpen: ha ez a kódsor kb. 0.5 cm, akkor a Google Chrome böngészőjének hossza a monitorod aljától kicsivel a föld középpontja után végződne.
Aztán megírtuk Pascalban is, az ennek az egysoros programnak a harmincszorosa (!) lett. Szóval itt vérszemet kaptunk: legyen minél kisebb! Egymástól függetlenül elkezdtünk azon gondolkodni, hogy ebből az amúgysem terjedelmes programból mit lehet megspórolni úgy, hogy még mindig működőképes legyen. Adtuk-vettük az ötleteket, küldözgettük egymásnak a kisebbnél-kisebb változatokat, a méret folyamatosan 4-6 byte-okkal csökkent.
Egy idő után nem bíbelődtünk az assemblyvel, hanem konkrét gépi kódot írtunk (kis segítséggel, a Hiew-vel):
A végső változat 44 byte lett, ami még mindig pont ugyanúgy működött, mint az eredeti 104 byte-os verzió, de feleakkora helyre sem volt szüksége:
na ez már nem illusztráció, hanem a konkrét működő program kódja
Nem volt már hova optimalizálni az akkori tudásunkkal, így ezzel be is fejeződött a projekt. Kíváncsi lennék, hogy össze lehet-e rakni még gépet, amin ez működik :)