BIZIT 11 - prvi dan

Minimalizam u projektovanju

Ovaj projekat je napravljen s ciljem da na jednom hakerskom kongresu ilustruje predavanje o današnjim mikrokontrolerima, koji bi mogli da preuzmu neke od zadataka za koje se, po inerciji, koriste glomazni personalni računari, sa sporim i nepouzdanim operativnim sistemima. Ovde je čitava konzola za video igre smeštena u jedan čip.

joystickKrajem svake godine, od 27. do 30. decembra, u Hamburgu se održava hakerski kongres pod nazivom CCC (Chaos Communication Congress), na kome oko 10.000 hakera iz celog sveta razmenjuje ideje i druži se na kreativan način. Veliki broj govornika u nekoliko sala okuplja slušaoce, a istovremeno se na 2.000 kvadratnih metara tokom četiri dana održava niz radionica, na kojima posetioci sami stvaraju sve što se tiče softvera i hardvera.

U septembru 2014. sam na novosadskom BalCCon‑u, koji je sličan CCC‑u ali naravno manjeg obima, upoznato Miča Altmana (Mitch Altman), poznatog hakera iz San Franciska, zaduženog da organizuje i vodi ove radionice. Tada mi je predložio da pripremim svoje predavanje i neki projekat koji bi bio prilagođen samogradnji, s kojim bih se krajem 2015. godine pojavio na CCC‑u, a možda i na avgustovskom CCC kampu, takođe u Hamburgu. Projekat je upravo završen i ovaj tekst je njegova prva promocija, a predavanje će biti pretočeno u neki od tekstova za časopis „PC“ tokom 2015. godine.

Slika… nekad i sad

Pre nepune četiri decenije, krajem sedamdesetih godina, pravio sam svoje prve hardverske video‑jedinice sa desetinama TTL čipova i nizom 265‑bajtnih MOS memorija. Tada sam pomislio da bi dobro bilo kada bi mikroprocesor mogao da zameni sav taj hardver i da softverski generiše video‑signal, ali su tadašnji mikroprocesori, uz puno sreće i lukavstva u projektovanju, bili tako spori da su jedva mogli da predstave dva‑tri ogromna slova na monohromatskom ekranu, pa bi softverski generisana grafika u najboljem slučaju mogla da ima horizontalnu rezoluciju od desetak piksela.

Ekran za pauzu je istovremeno i glavni meni igre „Jumping Jack“
Ekran za pauzu je istovremeno i glavni meni igre „Jumping Jack“

Posle 40 godina burnog razvoja digitalne tehnike, situacija je neuporedivo bolja. Čak i ako ne računamo skupe i složene procesore nego samo male mikrokontrolere, videćemo da je njihova procesorska snaga nekoliko stotina puta veća, a uz to u istom čipu dobijamo i interni RAM, ROM, portove, oscilator, kao i na desetine novih periferijskih jedinica, a sve to po znatno nižoj ceni. Tako sam, zahvaljujući porastu procesorske snage, na granici ostvarenja svoje mladalačke maštarije, tim pre što se u mikrokontrolere danas ne ugrađuju video jedinice. Naravno, ne zbog toga što se proizvođači nisu dosetili ili nisu hteli da ugrade video jedinicu, već zato što nije jasno šta bi procesor mogao da radi s tom internom video jedinicom koja bi nudila grafiku visoke rezolucije, pošto je za manipulaciju s velikim brojem piksela na ekranu potrebna ili ogromna procesorska snaga, koju obični mikroprocesori još uvek nemaju, ili specijalizovani grafički procesor, koji posebnim hardverom i grupom internih aritmetičkih koprocesora „crta“ po video memoriji.

Zato nam je za ovakve entuzijatske projekte potrebno nekoliko kompromisa, koji bi pomirili nedostatke i od raspoloživih resursa načinili dobro izbalansirani sistem. Ograničenja koja su u ovom slučaju postavljena dovela su, uz pomoć nekoliko programerskih trikova, do projekta „gejmerske“ 2D video konzole koja je po karakteristikama slična prvim 8‑bitnim personalnim računarima, a u nekim karakteristikama ih nadmašuje.

Pročitajte i:  '5D' memorijski kristal da može da čuva podatke zauvek — ljudski genom je već upisan na jedan mali kristal

Retro‑igra u jednom čipu

Upotrebljen je mikrokontroler PIC24EP512GP202‑I/SP. Svako slovo u ovoj oznaci ima svoje značenje, pa kad ih dekodujemo, saznajemo da je to 16‑bitni mikrokontroler opšte namene, čija je maksimalna brzina 70 MIPS, sa internom programskom memorijom od 512 KB i internim RAM‑om kapaciteta 48 KB, koji radi u temperaturnom opsegu ‑40 do +85 stepeni, a to sve u 28‑pinskom DIP kućištu. Ovo poslednje nije nevažno, jer DIP kućište ima obične lemne nožice sa korakom od 2,54 mm koje se leme sa donje strane štampane pločice i pogodno je za samograditelje. Njegov pandan u SMD (Surface Mount Device) kućištu, koji se lemi odozgo, ima pet puta gušće nožice (po dve na svakom milimetru) i može da se lemi samo posebnim alatom i iskusnom rukom.

I­gra ko­ris­ti spraj­to­ve, po prin­ci­pu prav­lje­nje kla­si­čnog ani­mi­ra­nog fil­ma s na­crta­nim „ce­lo­vi­ma“ ko­ji se, po sce­na­ri­ju, re­đa­ju na crtež po­za­dine
I­gra ko­ris­ti spraj­to­ve, po prin­ci­pu prav­lje­nje kla­si­čnog ani­mi­ra­nog fil­ma s na­crta­nim „ce­lo­vi­ma“ ko­ji se, po sce­na­ri­ju, re­đa­ju na crtež po­za­dine

Konzola generiše VGA signal u grafičkom modu 800×600 piksela. Ako koristimo po jedan bajt (256 boja) za svaki piksel, trebalo bi nam 800×600=480.000 bajtova internog RAM‑a, što je daleko od raspoloživih 49.152 bajta. Zato ćemo napraviti nekoliko kompromisa. Prvo, smanjićemo efektivnu rezoluciju na 400×300, tako što ćemo svaki piksel prikazati na 2×2 piksela monitora. Tako se zahtev smanjuje na jednu četvrtinu, dakle treba nam samo 120.000 bajtova. Toliko RAM‑a još uvek nemamo, pa ćemo i broj boja smanjiti sa 256 na 16, što znači da ćemo umesto 8‑bitnog piksela imati 4‑bitni, pa će svaki bajt biti dovoljan za po dva piksela. Sada nam treba samo još malo uštede, što ćemo postići prikazujući 380×240 umesto 400×300 piksela; ostatak će biti crni ram na monitoru širine 10 piksela. Nešto širi ram u dnu slike ćemo pokriti jednim redom teksta, koji video rutina neće prikazati u grafičkom nego u tekst modu, tako da će na njega otpasti samo onoliko bajtova koliko zauzima ASCII tekst. Računica je pokazala da ovde može da stane 39 karaktera, tako da će biti utrošeno 39 bajtove i još toliko na atribute boje, da bi svaki karakter mogao da ima svoju boju i boju pozadine. Sve u svemu, potrebbo je 380×240/2+39×2 = 45.678 bajtova. Ovaj mikrokontroler ima 49.152, tako da nam ostaje slobodno 3.474 bajtova, što je sasvim dovoljno za režijske stvari, bafere i lokalne registre.

Zašto ne bismo upotrebili mikrokontroler koji ima više RAM‑a? Zato što takav ne postoji u 16‑bitnoj PIC kategoriji – na spisku raspoloživih 16‑bitnih procesora videćete da postoje takvi koji imaju 96 KB RAM‑a, ali su oni daleko sporiji (samo 16 MIPS‑a), ili sa 52 KB, ali samo u velikom 64‑pinskom ili 100‑pinskom SMD kućištu. A i ne treba nam više – rezolucija 380×240 je sasvim dovoljna da bismo simulirali gejmersku retro‑konzolu od pre nekoliko decenija. Osim toga, taj broj piksela u video memoriji nam nudi odličan balans između rezolucije, snage mikrokontrolera i procesorskog takta.

Brzina od 70 MIPS znači da mikrokontroler može da izvršava 70 miliona instrukcija u sekundi. Učestanost generisanja piksela za VGA monitor u modu 800×600 sa 56 frejmova u sekundi iznosi 36 MHz, što nam daje polaznu osnovu za računicu. Već je rečeno da se svaki piksel prikazuje na polju od 2×2 fizička piksela, dakle naš dot clock (takt generisanja piksela) će biti samo 18 MHz. Računicu ćemo lako zaokružiti na 4 instrukcije za svaki piksel tako što ćemo takt mikrokontrolera podići samo malo, da brzina ne bude 70 nego 72 MIPS. Overklok će iznositi samo 2,8%, što je zanemarljivo po pitanju sigurnosti u radu i toplotnoj disipaciji – potrošnja je samo 0,2 W, pa je temperatura čipa takva da prstom ne možemo da ga razlikujemo od isključenog uređaja.

Pročitajte i:  '5D' memorijski kristal da može da čuva podatke zauvek — ljudski genom je već upisan na jedan mali kristal

Sprajtovi

Iz šeme veza se vidi da je koncept uređaja   maksimalno pojednostavljen
Iz šeme veza se vidi da je koncept uređaja maksimalno pojednostavljen

Ostaje još pitanje kako da omogućimo procesoru da u realnom vremenu manipuliše velikim brojem piksela u video memoriji. Da stvar bude još gora, dve trećine ukupnog vremena biće utrošeno na generisanje slike, pa će biti nemoguće za preostalu trećinu vremena animirati likove kroz video‑memoriju i korektno rekonstruisati pozadinu iza njih.

Ovaj problem se rešava na isti način kao u starim video‑procesorima namenjenim za 2D video igre. Scena se događa u dve ravni, od kojih drugu čini pozadina „nacrtana“ iz video memorije, a prvu čine sprajtovi, sličice koje se nalaze na specijalnim mestima u RAM‑u ili ROM‑u, i koje se nikada ne menjaju. Procesor nikada ne menja sadržinu ovih sličica nego samo dojavljuje video‑jedinici koje su „u igri“ i gde se svaka od njih fizički nalazi na ekranu – kao pravljenje animiranog filma klasičnom metodom sa nacrtanim „celovima“ (providnim celuloidnim tabacima) koji se po scenariju ređaju na crtež pozadine. U internom RAM‑u će, dakle, biti pozadina, a u ROM‑u su crteži faza pokreta junaka igre; procesor, umesto da premešta hiljade piksela po memoriji, samo bira faze pokreta animacije iz tabele u ROM‑u i upisuje njihove koordinate i adrese u posebne registre.

Na slici je primer skoka junaka igre na sledeći sprat. Ovo nisu svi frejmovi koji će se pojaviti na ekranu tokom skoka, jer će se neki od njih ponavljati, a neki će ostati isti dok se menjaju samo koordinate sprajtova u 2D prostoru. Zato postoje tabele redosleda prikazivanja ovih slajdova, kojom se definiše svaki pokret. Upravljanje igrom se na kraju svodi na podešavanje pointera kojima se smenjuju ovi skriptovi pokreta učesnika igre, čime uz minimum utroška procesorskog vremena može da se stvori složena mizanscena.

Već je rečeno da video jedinica radi u 4‑bitnom modu (16 boja) po RGB sistemu, plus jedan bit za intenzitet piksela. Tako osim crvene, zelene, plave, crne, bele i sive, imamo i žutu, cijan i magentu. Postoji još jedna boja koja se, barem na sprajtovima, uopšte ne prikazuje – to je „providna“ boja, kroz koju se vidi pozadina ili neki drugi sprajt nižeg nivoa prioriteta. Ona je na crtežu prikazana narandžastom bojom, koja inače u binarnom RGB sistemu ne postoji. Prilikom crtanja sprajtova za animaciju u nekom od grafičkih programa boja se vidi kao i na priloženoj slici, ali će je video drajver ignorisati i umesto nje prikazati pozadinu.

Pročitajte i:  '5D' memorijski kristal da može da čuva podatke zauvek — ljudski genom je već upisan na jedan mali kristal

Zvuk

Šta bi video igra bila bez zvučnih efekata? Zvuk je takođe rešen softverski, na još jednostavniji način nego video signal. Izlazi tonskih kanala su digitalni, dakle zvučni signal je binarni, kao što je bio slučaj u starim igrama. Jednostavan niskopropusni filter čini ovakav zvuk prijatnijim za uho, tim pre što postoji pet nezavisnih tonskih kanala. Jedan od njih se koristi za zvučne efekte glavnog junaka, drugi za efekte njegovih neprijatelja, a preostala tri su za muziku. Svaki od ovih kanala može da se isključi ili da se aktivira u dva nivoa jačine, pa je uobičajen režim da se muzika pusti tiho, a efekti u punoj jačini. Na pločici konzole postoji standardni koaksijalni konektor za PC zvučnike ili slušalice.

Muzika je poseban kvalitet ovog projekta i za nju je zaslužan Marko Antonić, koji je izvanredno prilagodio aranžmane ovom zvučnom medijumu. Za sada su u igru ugrađene dve pesme koje su bile popularne u vreme ovakvih video konzola, jedna je Golden Brown grupe Stranglers, a druga Jumping Jack grupe Rolling Stones. Ova druga nikako ne bi smela da se zaobiđe, jer igra nosi upravo naziv Jumping Jack. Igra je poznata starijim čitaocima, koji su nekada uživali u igrama za Sinclair Spectrum, a svojevremeno je napravljena i za računar Galaksija. Za sada je za konzolu napravljena samo ova igra, ali je sistem koncipiran tako da postoji univerzalni operativni sistem, na koji je dograđen scenario i niz skriptova za igru Jumping Jack. Postoji i ulaz za RS‑232 port, zahvaljujući kome može da se distribuira svaka druga igra preko Interneta i da se upiše u flash ROM mikrokontrolera. Pošto će konzola biti demonstrirana na međunarodnom hakerskom kongresu, moguće je da će se naći entuzijasti koji će napraviti još neke igre i ponuditi ih preko Interneta. Svi današnji mikrokontroleri imaju sposobnost samoprogramiranja, pa ako je u njihovu programsku memoriju upisan inicijalni bootstrap program i imaju bilo kakav ulazni port, mogu da menjaju sadržinu programske memorije i da tako sami sebe programiraju, bez specijalnog programatora.

Možda bi lepo bilo kada bi se ovaj upis ostvario putem USB porta, ali PIC mikrokontroleri u DIP kućištu nemaju ugrađen USB port, pa nam tako ostaje samo RS‑232. Zanimljivo je zapažanje da se najmlađa deca, inače potpuno ravnodušna prema savremenim 3D video igrama, naprosto zaljubljuju u likove iz ovakvih jednostavnih igrica. Najsavršenije 3D video igre mogu da impresioniraju posmatrača sposobnošću generisanja realističnog prostora u realnom vremenu, ali šarm koji donose stare 2D igre nestao je zajedno s njima i nikakva tehnička bravuroznost ne može da ga nadoknadi. To su dve zasebne discipline, kao što su dela starih majstora slikarstva i savremena fotografija, ili antička vajarska dela i skulpture izrađene sistemom koji čini 3D skener i 3D printer.

Civilizaciju čini tehnički napredak, a kulturu negovanje svih kvaliteta i sećanje na njih.

Nastavak ovog opisa i uputstva za samogradnju možete pročitati u februarskom broju časopisa „PC“.

Voja Antonić

(Odštampano u časopisu PC#217)

Facebook komentari:
Računari i Galaksija
Tagovi: , ,