13.4.2018 13:19 | Reportáže a publicistika

Programovanie pre 8-bity: „Mágia“ aj pomoc od inžinierov

8-bit nie je len o histórii, v praxi sa používa dodnes. (ilustračná snímka)
8-bit nie je len o histórii, v praxi sa používa dodnes. (ilustračná snímka) Zdroj: Oliver Lindau

Vznik hier či softvéru pre 8-bitové zariadenia bol niekedy programátorským orieškom. Napriek tomu stále generujú miliardové obraty.

Počítače z 80. a 90. rokov síce po stránke výkonu a grafiky mladšie generácie neohromia, v čase ich najväčšej slávy však vznikli viaceré legendárne kúsky softvéru či hier.

Vtedajší programátori aj napriek obmedzeniam hardvéru dokázali vyšperkovať obsah či grafiku svojich diel rôznymi trikmi. Práve o nich si povieme v poslednej časti série o 8-bitových počítačoch. Na záver spomenieme aj využitie 8-bitového hardvéru v súčasnosti.

Do obdobia 8-bitových počítačov sa svojimi modelmi zapísalo aj Československo.
Čítajte aj Počítačové legendy 8-bitovej éry. Pamätáte si ich ešte?

Programovanie vtedy a dnes

Hoci má každá programátorská éra svoje pozitíva a negatíva, ostrieľaní programátori by vedeli rozprávať, o koľko náročnejšie boli programovanie v 8-bitovej ére. Väčšia potreba znalostí konkrétneho hardvéru, rôzne typy grafických adaptérov či nízke programovacie jazyky.

Tieto a ďalšie „bariéry“ dnes zväčša nemusíme riešiť. Vyššie jazyky dokážu v jednom príkaze obsiahnuť veľké a početné operácie, rôzne IDE doplnia či vygenerujú kúsky kódu aj za programátora. Jediný kód je možné použiť aj pre viaceré platformy a jeho pamäťové či výpočtové nároky dnes zďaleka nie sú kontrolované tak prísne.

Kompromisy a triky, ktorými programátori 8-bitových počítačov prekonávali nízke frekvencie procesorov či obmedzenú kapacitu RAM tak môžu dnes znieť priam nemysliteľne.

Čo majú spoločné oblaky a tráva z hry Super Mario Bros.? Aj tento programátorský „trik“ si vysvetlíme ďalej v článku. fotogaléria / 4
Čo majú spoločné oblaky a tráva z hry Super Mario Bros.? Aj tento programátorský „trik“ si vysvetlíme ďalej v článku. Zdroj: Redakcia

Obmedzenia hardvéru prekonané trikmi

Pomocnú ruku pri programovaní podali niektoré počítače už vo svojom návrhu. Ako príklad uvedieme podrobnejší pohľad na tvorbu grafiky a správu farieb pre počítač Commodore 64.

Maximálne rozlíšenie tohto počítača je 320 × 200 pixelov. Ak chcel vývojár každému pixelu (obrazovému bodu na displeji) priradiť jednu zo 16 farieb, potreboval uložiť 64 kB dát (postup výpočtu uvádzame v boxe nižšie) Tento postup by však spotreboval polovicu pamäte RAM.

Trochu výpočtov

Šestnásť farieb je v kóde reprezentovaných pomocou čísel 0 až 15 v dvojkovej sústave (0000 až 1111). Z počtu cifier vyplýva ich veľkosť 4 bity.

Rozlíšenie Commodoru 64 je v základe 320 × 200 pixelov, po vynásobení tak dostaneme 64 000 pixelov, z ktorých každému chceme priradiť štvorbitovú informáciu o farbe.

Jedna obrazovka s grafikou tak zaberie v pamäti 64 000 × 4 = 256 000 bitov, respektíve 32 000 bajtov (31,25 kB). To je takmer polovica z kapacity pamäte RAM, ktorú obsahoval Commodore 64.

Inžinieri teda pomyselne rozdelili obrazovku na štvorce s veľkosťou 8 × 8 pixelov. Programátori následne mohli každému štvorcu priradiť pixely s maximálne dvoma farbami (reprezentovanými 0 alebo 1).

Každý štvorec sa skladal zo 64 bitov dát o konkrétnom umiestnení pixelov a dodatočných ôsmich bitov s uloženou hodnotou farieb. To je spolu 72 bitov na 1 000 štvorcov. Namiesto 32 kB tak aktuálna grafika programu zabrala iba necelých 9 kilobajtov.

Pre porovnanie, informácia o umiestnení farieb bez rozdelenia na štvorce by presiahla 8 kilobajtov už pri použití monochromatickej témy (čierna a biela).

Výpočty po úspore

Počet pixelov obrazovky (64 000) vydelíme vynásobeným „rozlíšením“ 8-pixelového štvorca. Dostaneme tak 64 000 : 64 = 1 000 štvorcov na obrazovke.

V každom štvorci sa budú nachádzať dve farby. Na ich reprezentáciu nám tento raz stačí nula a jednotka s veľkosťou 1 bit. Informáciu o tom, ktoré dve farby vo štvorci použijeme, vtesnáme do 2 x 4 bitov.

Na jeden štvorec grafiky teda využijeme 8 x 8 = 64 bitov, doplnených o 8 bitov informácií o farbách. Keďže je štvorcov na displeji tisíc, v pamäti nám grafika zaberie 72 x 1 000 = 72 000 bitov, čo je 9 000 bajtov, alebo 8,79 kB.

Žiadna skromná grafika

Ešte výraznejšiu úsporu ponúkal Low Resolution Mode (mód nízkeho rozlíšenia), ktorý umožňoval do štvorca zakódovať informácie až 4 farieb výmenou za dvojnásobnú šírku pixelu. Rozlíšenie sa tak zmenilo na 160 × 200 px a grafické informácie zaberali necelých 5 kilobajtov.

Ak sa vám zdá tvorba oku lahodiacej grafiky so spomenutými obmedzeniami nemožná, dobre preskúmajte nasledujúci obrázok.

Rozloženie farieb na tomto obrázku zďaleka nie je vecou náhody. fotogaléria / 4
Rozloženie farieb na tomto obrázku zďaleka nie je vecou náhody. Zdroj: Oliver Lindau

Na prvý pohľad ide o vrchol vtedajšej grafiky bez zdanlivého obmedzenia na dve farby. Ak si však ľubovoľnú časť obrázka zväčšíme a rozdelíme na štvorce spomínanej veľkosti, ľahko postrehneme, že v jednotlivých úsekoch sa skutočne nenachádzajú viac než dve farby.

Aj napriek deleniu na štvorce s dvomi farbami si používatelia mohli vychutnať detailné obrázky. fotogaléria / 4
Aj napriek deleniu na štvorce s dvomi farbami si používatelia mohli vychutnať detailné obrázky. Zdroj: Redakcia

Za zmienku stojí aj skutočnosť, že obrázok zachytávajúci hru je aj po kompresii do stratového formátu JPG približne 4-krát objemnejší oproti kapacite vykreslenej grafiky v pamäti RAM mikropočítača.

Dva v jednom

Šetrenie pamäti pri tvorbe a vykresľovaní grafiky však mohlo fungovať aj inak. Vráťme sa k screenshotu z hry Super Mario Bros. Možno ste si všimli, že obrázok použitý pre oblak a trávu sa líši len farbou. V skutočnosti naozaj ide o jediný „sprite“ (označenie 2D obrázka v hre) s odlišne nastavenou farebnou paletou. Tento princíp využíva aj postavička hráča, ktorá pri Mariovi využíva červeno-hnedú a v prípade Luigiho bielo-zelenú paletu.

Vlastné „vychytávky“ nielen po stránke grafiky ponúkali aj ďalšie vtedy predávané systémy. Na ich zhrnutie by však jeden článok nestačil. Ak však dobre ovládate angličtinu a zaujímate sa o triky používané pri tvorbe grafiky a zvuku v osembitových počítačoch podrobnejšie, určite si pozrite vysvetľujúce videá používateľa The 8-Bit Guy na YouTube.

Pozrite si, ako fungovali herné kartridže a ako dokázali rozšíriť schopnosti počítača/konzoly:

„Extrémne“ programovanie

Okrem grafickej stránky bol v tom čase rovnako ako dnes kladený dôraz aj na rýchlosť spracovania inštrukcií. Programátori sa teda v snahe ušetriť čo najviac prostriedkov procesora a vykonať viac inštrukcií rýchlejšie uchyľovali napríklad k používaniu symbolických inštrukcií pred vyšším programovacím jazykom alebo neštandardným volaniam príkazov (použitie príkazu na iný účel, než bol pôvodne zamýšľaný). Za všetky uveďme uprednostnenie funkcie XOR pred príkazom určeným na vynulovanie hodnoty premennej.

Slovník pojmov

Jazyk symbolických inštrukcií

Programovací jazyk najnižšej úrovne, ktorý je založený na nahradení strojového kódu jednoduchými príkazmi, pracujúcimi priamo s procesorom. Oproti vyššie postaveným jazykom tak odpadá nutnosť písania dlhých kódov a postupného prekladania až na úroveň strojového kódu, čo sa odrazí na malej veľkosti programu a jeho rýchlejšom vykonaní. Nevýhodou je však odlišnosť jednotlivých príkazov pre rôzne architektúry procesorov.

XOR (Exclusive OR)

Binárna operácia nazývaná tiež „Vylučujúce alebo“. Nadobúda pravdivostnú hodnotu 1 iba vtedy, keď jednotlivé argumenty nemajú rovnakú hodnotu (1 XOR 0, 0 XOR 1). Ak teda na premennú použijeme XOR s rovnakou hodnotou (napr. a = a XOR a), výsledkom bude nula. Tento príkaz je väčšinou vykonaný omnoho rýchlejšie ako použitie špeciálne naprogramovanej funkcie na vynulovanie premennej.

8-bitová éra ešte neskončila

Hoci sa spomenutá 8-bitová technika zdá v dnešných pomeroch ako výkonnostne a kapacitne nedostačujúca, predaje mikrokontrolérov (jednočipových počítačov) z 80. až 90. rokov minulého storočia stále presahujú miliardové hodnoty.

Rozhodne však nie sú využívané iba v retro projektoch či výrobných zariadeniach v továrňach. Práve naopak – sú bežne okolo nás a v posledných rokoch ich počet prudko rastie. Reč je o inteligentných (smart) zariadeniach.

Tie často plnia funkciu jednoúčelových zariadení, zameraných napríklad na meranie teploty či monitorovanie dobytka. Na zber a spracovanie dát preto nepotrebujú extrémne výkonné a drahé komponenty, či širší register. Do príchodu nových typov nabíjania či batérií je kľúčovým parametrom aj celková výdrž, ktorá nepriamoúmerne klesá s rastúcim výkonom.

„Bastliarsky“ mikropočítač Arduino Uno s 8-bitovým procesorom ATmega328P. fotogaléria / 4
„Bastliarsky“ mikropočítač Arduino Uno s 8-bitovým procesorom ATmega328P. Zdroj: SparkFun Electronics, Wikimedia Commons, CC-BY 2.0

Domáci „majstri elektroniky“ tiež dôverne poznajú napríklad open-source platformu Arduino, ktorej modely poháňajú rôzne verzie 8-bitového mikrokontroléra ATmega od firmy Atmel. Pre porovnanie, obľúbený mikropočítač Ti MSP430 využíva 16-bitovú architektúru a Raspberry Pi ponúka v jednotlivých modeloch 32- a 64-bitové procesory.

Tip: Programovaniu jednoduchých IoT zariadení sa obsiahle venuje seriál Poďme programovať elektroniku na českom Živě.cz.

Preverené časom

Keď sa teda nabudúce pozriete napríklad na 3D tlačiareň alebo budete inštalovať IoT senzory v domácnosti, možno budete mať česť s významným kúskom histórie, ktorá odštartovala takmer pred polstoročím. Práve tieto zariadenia totiž aj dnes môžu využívať 8-bitovú architektúru.

Diskusia 12 Príspevkov