Džojstik za Galaksiju
Na novu Galaksiju se lako mogu povezati dodatni uređaji. Korišćenjem razvojne platforme Arduino Uno realizovali smo džojstik koji se može koristiti čak i sa starim igrama.
Galaksija je davne 1983. zamišljena kao računar koji se hardverski i softverski može proširivati, pa je za povezivanje dodataka na nju predviđen paralelni port, preko koga eksterni uređaji dobijaju pristup magistralama procesora i tako mogu da komuniciraju s računarom.
Paralelni interfejsi su u međuvremenu izašli iz mode, pa novi projekat samogradnje iz 2024, umesto paralelnog, predviđa serijski interfejs. Preko njega se nova Galaksija lako može povezati s brojnim uređajima, među kojima je i Arduino Uno razvojna platforma, pomoću koje je autor ovog teksta realizovao jednostavno rešenje za komunikaciju sa džojstikom.
Da bi stare igre podržale Arduino džojstik, potrebno je, pre njihovog pokretanja, izvršiti nekoliko jednostavnih komandi
Ovim malim projektom omogućeno je da se standardni Arduino džojstik poveže na Galaksiju 2024 i na njoj koristi na uobičajeni način. Rešenje, osim namenski pisane, podržava i mnoge postojeće programe i igre pisane za staru ili novu Galaksiju. Uslov za kompatibilnost s postojećim programima jeste da su oni napravljeni tako da pritisak tastera na tastaturi detektuju direktnim čitanjem sa adresa na koje je tastatura mapirana – mnogi programi i igre su pisani upravo tako. Za osposobljavanje starih programa za rad sa džojstikom potreban je mali zahvat: nakon njihovog učitavanja, a pre startovanja, potrebno je izmeniti sadržaj nekoliko memorijskih lokacija. Klasične igre za Galaksiju, kao što su Galaktički rat, Jumping Jack, Zamak, a i nove poput Belt-a, nakon ovakve izmene uspešno su testirane sa Arduino džojstikom (potrebno je koristiti najnoviju ažuriranu verziju igre Belt koja se može naći na racunari.com/galaksija).
Gradnja i povezivanje
Za realizaciju ovog projekta od hardvera su potrebni samo Arduino Uno ili kompatibilni mikrokontroler (oko 2000 din / 17 evra u maloprodaji u Srbiji), standardni mali Arduino džojstik (oko 200 dinara) i nekoliko odgovarajućih patch kablova za povezivanje.
U Arduino IDE razvojno okruženje (besplatan download) koje ste pokrenuli na PC-ju, treba uneti kod čiji je listing dat na slici 5 i upload-ovati ga na Arduino mikrokontroler (podrazumeva se da je on povezan na USB port PC-ja). Arduino će početi neprestano da ga izvršava – do isključenja napajanja ili unosa nekog drugog programa.
Ovim malim projektom omogućeno je da se standardni Arduino džojstik poveže na Galaksiju 2024 i na njoj koristi na uobičajeni način
Povezivanje treba obaviti prema šemi prikazanoj na slici 1. Treba osigurati da se, dok je sve povezano, ne uradi upload nekog pogrešnog programa na Arduino, koji bi na serijski port Galaksije mogao da pošalje nešto što nije dozvoljeno (npr. da pokuša da piše na istu liniju na koju piše i Galaksija). Pri povezivanju džojstika, Arduina i Galaksije treba biti obazriv, a posebnu pažnju treba posvetiti vezi Arduino ploče sa Galaksijom, i osigurati da prijemni pin Arduina ide na predajni pin Galaksije i obrnuto, da se ne bi desilo da npr. oba uređaja istovremeno emituju sadržaj na istu liniju.
Naredne korake treba obaviti na strani Galaksije. Potrebno je uneti program čiji je listing dat na slici 4 (poželjno je snimiti ga na ugrađeni flash za buduću upotrebu) i pokrenuti ga. Njegovim pokretanjem Galaksija počinje da sa Arduino ploče neprestano očitava stanje džojstika. Za one koji ne žele da ponovo osete čari vremena kada se do novih programa dolazilo prekucavanjem koda iz časopisa, oba programa su postavljena uz ovaj tekst na sajtu pcpress.rs a biće raspoloživi i na racunari.com/galaksija.
Džojstik je sada spreman za upotrebu. Možete sami napisati program koji će ga koristiti ili učitati neki postojeći program ili igru koji stanje tastature očitavaju direktno iz adresnog prostora. U slučaju korišćenja postojećih programa, potrebno je da se, nakon što se program učita u memoriju, a pre njegovog startovanja, u komandnoj liniji Galaksije unese nekoliko BYTE naredbi koje će kod programa izmeniti tako da se komande, umesto sa tastature, primaju sa džojstika. Na slici 2 su date potrebne naredbe za nekoliko igara, a biće objašnjeno i kako sami možete da pronađete odgovarajuće naredbe za neku drugu igru.
Program za džojstik je napravljen kao kratka mašinska rutina koja je povezana na link u interapt rutini Galaksije
Redosled koraka na strani Galaksije mora biti upravo onakav kakav je naveden: učitavanje i startovanje programa za džojstik, učitavanje igre, izdavanje BYTE komandi, pa startovanje igre. Ne može se prvo učitati igra pa program za džojstik, jer će je on u tom slučaju prebrisati u memoriji. Ako se komande BYTE izdaju pre učitavanja igre, učitana igra će prebrisati izmenu i komande će se i dalje primati sa tastature umesto sa džojstika.
Kako to radi?
Program za džojstik je napravljen kao kratka mašinska rutina koja je povezana na tzv. link u interapt rutini Galaksije. Jedini interapt koji postoji u Galaksiji koristi se za iscrtavanje ekrana, i odgovarajuća interapt rutina, u kojoj se nalazi video-drajver, pokreće se svakih 20 ms (50 puta u sekundi) da bi se iscrtao jedan frejm. U kodu ove rutine, pred sam njen kraj, nalazi se instrukcija bezuslovnog skoka (link) na adresu upisanu u registar IY. Podrazumevano, u IY se nalazi prva naredna adresa u memoriji, odnosno izvršavanje se nastavlja kao da instrukcije skoka nema, i kod interapt rutine se ubrzo završava. Ova, naizgled nepotrebna, instrukcija omogućava da se upisom alternativne adrese u registar IY, svaki put pred kraj interapt rutine pokrene neki potprogram. Ova mogućnost je iskorišćena za realizaciju programa koji komunicira sa Arduinom da bi očitao stanje džojstika. Tako je obezbeđeno da Galaksija stanje džojstika očitava i smešta u memoriju pedeset puta u sekundi, što je sasvim dovoljno.
Program za džojstik sa ulaza na serijskom portu (Rx) očitava pet bitova koje šalje Arduino. Četiri odgovaraju položajima džojstika levo, desno, gore i dole, a peti stanju tastera na džojstiku – da li je pritisnut ili ne. Arduino šalje nulu ako je palica pomerena a jedinicu ako nije (nula u petom bitu označava da je taster pritisnut a jedinica da nije). Ove bitove Galaksija smešta u bitove najmanjeg značaja u pet memorijskih lokacija: &8001 (za taster) i &801B, &801C, &801D, &801E (za položaje džojstika). Adrese preko &8000 su izabrane jer su dovoljno visoko u mapi memorije, RAM od 6 KB originalne Galaksije u kome su smeštene sve klasične igre završava se već na &4000, pa je tako osigurano da stare igre ne prepišu ove lokacije, a ni sam program za džojstik koji je smešten počevši od adrese &9000. Čitanjem lokacija &8001, &801B, &801C, &801D i &801E igra dobija informaciju da li je džojstik pomeren i na koju stranu (biće registrovana i istovremena pomeranja na dve strane, poput gore-desno).
Svaki taster na tastaturi Galaksije ima svoju adresu u adresnom prostoru mikroprocesora i na toj adresi će se na poziciji bita najmanje težine nalaziti nula sve dok je taster pritisnut, a jedinica ako nije (zato i program za džojstik postavlja upravo najniži bit). Veliki broj igara proverava da li je neki taster pritisnut tako što izvrši instrukciju čitanja sa adrese na koju je on mapiran i ispita stanje najnižeg bita.
Ako se igra preusmeri da, u trenutku kada proverava stanje tastera, umesto adrese tastera pročita jednu od adresa &8001, &801B, &801C, &801D, &801E (u koje je potprogram za džojstik prethodno smestio stanje palice i tastera), onda će ona reagovati na džojstik umesto na tastaturu. Tasterima strelica odgovaraju adrese &201B (gore), &201C (dole), &201D (levo) i &201E (desno) u adresnom prostoru – zato su adrese u memoriji za smeštanje informacije o stanju četiri položaja džojstika izabrane tako da im se donji bajt poklapa sa adresama odgovarajućih strelica na tastaturi. Adresa &8001, na koju se smešta informacija o stanju tastera džojstika, odgovara adresi &2001 na koju se mapira slovo A, koje je izabrano jer se koristi u igri Galaktički rat. Zahvaljujući tome, preusmeravanje se vrši vrlo jednostavno – potrebno je samo u instrukcijama u kodu igre koje očitavaju stanje tastera, u gornji bajt adrese upisati &80 umesto &20.
Modifikacija postojećih programa
Adrese u kodu programa na koje treba upisati &80 umesto &20, da bi se on sa tastature „preusmerio“ na džojstik, relativno je jednostavno naći. Stanje tastera se u programima obično ispituje tako što se u registar A procesora učita podatak sa adrese na koju je taster mapiran, a potom proveri sadržaj registra – nula na poziciji bita najmanje težine ukazuje da je taster pritisnut, a jedinica da nije. Primera radi, za očitavanje stanja tastera strelice na levo na tastaturi, koristi se instrukcija LD A,(&201D). Ona se smešta u tri susedna bajta u memoriji kao (&3A &1D &20 – prvo se u memoriju smešta niži bajt adrese, &1D, pa viši, &20). Adrese tih instrukcija mogu se pronaći korišćenjem monitor programa koji se nalazi u ROM-u nove Galaksije (inicijalizuje se sa SHIFT+ESC+M). Komanda *W &2C3A, &4000, &201D će pretražiti celu memorijsku mapu originalne Galaksije sa 6 KB RAM (za koju su stare igre i pisane) i pronaći sva mesta u memoriji gde se nalazi konstanta &201D. Ako njoj u memoriji prethodi &3A, to znači da je reč o instrukciji koja se traži (LD A, (&201D)), i na toj adresi vrednost &20 treba zameniti vrednošću &80. Jedan primer pretrage je dat na slici 3. Ako konstanti &201D ne prethodi &3A, onda je reč o nekoj drugoj instrukciji i taj sadržaj ne treba menjati. Na isti način nalaze se instrukcije koje ispituju druge tastere, i preusmeravaju na jednu od pet lokacija gde se nalaze informacije o stanju položaja i tastera džojstika.
Važne napomene
- Ovo rešenje radi jedino sa Galaksijom napravljenom po projektu samogradnje iz 2024. Na originalnom računaru iz 1984, koji nema serijski port, ono naravno nije podržano, ali se slična logika može primeniti da bi se napravili odgovarajući programi i hardversko rešenje.
- Kompatibilnost sa starim igrama je na jednostavan način moguće ostvariti jedino kod igara koje stanje tastera na tastaturi direktno očitavaju sa adresa mapiranih na tastere na opisan način. Programi koji koriste druge načine komunikacije sa tastaturom (npr. BASIC komandu KEY) zahtevaju temeljniju preradu.
- Tasteri na koje se džojstik mapira ne moraju biti strelice – ako se izmene oba bajta adrese u instrukciji LOAD, bilo koji taster sa tastature se može preusmeriti na džojstik.
- Ako su igre prepravljene da se umesto određenih tastera koristi džojstik, ti tasteri se na tastaturi ne mogu istovremeno koristiti. Ostali tasteri, koji nisu premapirani, funkcionišu normalno. Izvan igre, u komandnoj liniji računara i u BASIC-u, cela tastatura funkcioniše normalno. Programi se mogu namenski napisati tako da se premapirani tasteri na tastaturi i džojstik mogu koristiti istovremeno.
- Unošenje BYTE naredbi svaki put pred startovanje igre može da bude zamorno, pa se one mogu uneti na početak BASIC koda igara i tako izmenjena igra snimiti na flash (kao nova verzija, npr. SAVE ZAMAK1). Tako se svaki naredni put samo startuju program za džojstik i nakon njega nova verzija igre.
- Pošto je serijski port povezan na selektor tastature, retko se dešavalo da se na ekranu pojavi neželjeni karakter, kao i da se računar zbuni ako Arduino nije povezan na napajanje. Restart jednog ili oba uređaja, odnosno povezivanje Arduina na napajanje rešavali su ove probleme.
Komunikacija sa Arduinom
Za komunikaciju Galaksije i Arduina nije korišćen standardni serijski protokol koji Galaksija 2024 podržava (on je optimizovan za prenos veće količine podataka od ovde potrebne), već je osmišljen krajnje jednostavan protokol koji sinhronizuje rad programa koji se izvršava na Arduinu i programa za džojstik koji se izvršava na Galaksiji.
Lako je ustanoviti kako treba izmeniti neku staru igru da bi radila sa Arduino džojstikom
Arduino program funkcioniše tako što očita stanje džojstika i u skladu s tim postavi promenljive za svako od četiri usmerenja (Left, Right, Up, Down) i taster (s). Potom sledi while petlja u kojoj se čeka da se na liniji koja je povezana na transmit (Tx) liniju Galaksije pojavi nula. Tu nulu, svakih 20 ms, postavlja Galaksijin program za džojstik u liniji 70, kao znak spremnosti za prijem podataka od Arduina. Kada Arduino program registruje tu nulu, njegovo izvršavanje se nastavlja tako što se na vod koji je povezan na receive liniju Galaksije postavlja nula ako je džojstik pomeren ulevo, a jedinica ako nije, a onda pravi pauza od 15 mikrosekundi da se vrednost na vodovima stabilizuje i bude spremna za ispravno očitavanje sa strane Galaksije.
Istovremeno, traje izvršavanje potprograma na Galaksiji. U njemu se, da bi se sačekalo da Arduino ispravno postavi vrednost na Rx liniju, pet puta izvrši ista instrukcija (linije 80-88) da bi se nakon toga u liniji 90 u registar A smestila vrednost koju je na liniju Rx postavio Arduino.
Postupak se onda ponavlja za preostala tri položaja džojstika i njegov taster. Program za džojstik na Galaksiji se nakon toga završava, a Arduino program vraća na početak, gde u novoj iteraciji while petlje čeka da se na strani Galaksije ponovo pokrene interapt rutina na čijem se kraju pokreće program za džojstik, koji će svoju spremnost za novo očitavanje opet signalizirati nulom na liniji Tx.
Ovde je od ključnog značaja usklađivanje tajminga programa koji se izvršavaju na Arduinu i na Galaksiji. Da bi u trenutku kada Galaksija čita bit sa linije Rx on bio stabilan i ispravno očitan, Arduino ga mora pravovremeno postaviti na svoj izlaz.
Nekada i sada
Nova samogradnja Galaksije nastala je kao modernizacija stare, a i za novi projekat džojstika se može reći da ima utemeljenje u prošlosti. Tokom 1984. je na malim oglasima za oko 10 odsto cene samog računara (u današnjem novcu to je grubo oko 25 evra) nuđen džojstik za Galaksiju, napravljen od – ručice za motocikl. Priča o ovom džojstiku može se naći na https://dejanristanovic.com/refer/dzojstik.htm.






