ROM za Galaksiju

 

Posle zilion izmena, ROM za Galaksiju je zaključen 3. januara 1984, desetak dana pošto su se Računari u vašoj kući pojavili na kioscima. Dok su Računari bili u štampi Voja je dodao još nekoliko novih stvari, ispravio bagove i... to je bilo to. Posao jednom mora da se završi, a EPROM-e je trebalo poslati u Grac da se kopiraju za one koji naručuju komponente. Nakon svih skraćivanja i optimizacija, za oznaku verzije je ostao bajt na adresi 0x37 (55 dekadno).

E sad zašto baš na adresi 0x37 odnosno 37h... Zvuči neobično, očekivalo bi se da oznaka verzije bude na nekoj "okrugloj" adresi, ili možda na kraju ROM-a. Lepa stvar kod kompjutera je što za sve postoji neki razlog, što ne znači da je taj razlog uvek očigledan.

Elem, arhitektura procesora Zilog Z80 poznaje nekoliko "povlašćenih" memorijskih adresa. U setu instrukcija postoje naredbe RST 00h, RST 08h, RST 10h, RST 18h, RST 20h, RST 28h, RST 30h i RST 38h, pa je tako RST 30h isto što i CALL 30h (poziv potprograma koji počinje na adresi 30h), s tim što RST 30h zauzima samo jedan bajt, a CALL 30h zauzima tri bajta. U današnje vreme dva bajta dobitka ne zvuče kao nešto vredno pomena, ali u ono vreme, i uz svega 4 KB raspoloživog prostora za sistemski softver Galaksije, dva bajta su velika kao kuća. Zato su potprogrami koji se najčešće pozivaju smešteni na adrese 8h, 10h, 18h, 20h, 28h i 30h.

Evo i primera. U Galaksijinom ROM-u se na 28h nalazi program koji stavlja 0 u registar HL. Uobičajeno stavljanje nule u HL zahteva tri bajta, dok RST 28h "troši" samo jedan bajt. Pošto na puno mesta u kodu treba obrisati sadržaj HL registra, dva bajta po dva bajta... eto lepe uštede. U normalnoj situaciji ne bi trebalo raditi ovako nešto, pošto se na pozivanje potprograma i povratak iz njega nepotrebno troši vreme, ali kada je svaki bajt dragocenost onda neke neracionalnosti mogu da postanu racionalne.

Pošto od jednog do drugog restarta ima 8 bajtova, optimalno je da odgovarajući potprogram bude tačno toliko dugačak, što je teško očekivati. Ako je potprogram duži, na njegovom kraju se skoči negde izvan ove privilegovane zone, uz utrošak nešto prostora na samu instrukciju skoka, i nešto vremena na njeno izvršavanje. Kod pomenutog RST 28h su, pošto je nula stavljena u HL (3 bajta) i izvršena instrukcija RET (1 bajt), preostala četiri bajta do sledećeg restarta iskorišćena za memorisanje konstante 0.1 koja je potrebna kod nekih operacija u pokretnom zarezu.

Potprogram RST 30h, koji interpreter poziva kad god treba preći na narednu bejzik komandu, ima 7 bajtova tj. završava se na 36h - niti mu je osmi bajt potreban, niti se potprogram može smisleno skratiti tako da se napravi blok od 3-4 bajta za nešto drugo. Već sledeća adresa, 38h, predstavlja početak rutine koju procesor poziva kad god dobije zahtev za interapt, gde se nalazi ključni potprogram za iscrtavanje slike na ekranu. Arhitektura Z80 zahteva da, u interapt modu koji se koristi, interapt rutina počne na adresi 38h i ne može se pomeriti na, recimo, 37h. Tako je bajt na adresi 37h ostao u procepu između "prerano" završene prethodne rutine i sledeće rutine koja mora da se nađe na fiksnom mestu, pa se nije mogao ni za šta koristiti. Osim možda za oznaku verzije.

Postavilo se onda pitanje koja je verzija ROM-a aktuelna. Da su verzije stvarno brojane, možda ni dva bajta ne bi bila dovoljna, a kad već imamo jedan, da stavimo neki arbitrarni broj. Predložio sam 28 (dekadno), jer je to savršen broj (jednak zbiru svih svojih delilaca, 1+2+4+7+14=28).

Tokom narednih meseci pronađeno je nekoliko sitnih bagova u Galaksijinom bejziku, ali nisu to bila vremena kada ste tri puta nedeljno mogli da šaljete nove verzije softvera preko Interneta. Da, bagovi su mogli da budu ispravljeni, ali ko bi obrisao i ponovo programirao 10.000 EPROM-a? Osim toga, izmene bi neminovno izazvale "pomeranje" ulaznih tačaka u potprograme - kada je objavljen detaljan vodič kroz Galaksijin ROM i distribuiran njegov disasemblirani listing, na izmene smo mogli da zaboravimo. Verzija 28 ostaje zauvek.

Ili ne baš zauvek. Kada je krajem 1984. objavljen ROM 2 za Galaksiju, trebalo je rešiti pitanje njegove inicijalizacije. Da bi operativni sistem prepoznavao nove naredbe, trebalo je izvršiti A=USR(&1000)... i to svaki put kada uključite ili resetujete računar. Ta gnjavaža može da se izbegne samo modifikovanjem ROM-a 1 tako da na adresama &3F9, &3FA i &3FB bude &C4, &00, &10... a kad se već menja, onda i na &37 upisati broj 29, da se zna da je u pitanju sledeća verzija, ma koliko izmene bile minorne. Elektronika inženjering je u komercijalne primerke ugrađivala oba ROM-a, tako da je verzija uvek 29.

Napravljena je još jedna izmena koju je retko ko primetio. Naime, u originalnom karakter generatoru dva znaka su "potrošena" za logotip firme koju je Voja Antonić s još jednim kolegom osnovao, a koja se zvala MIPRO (kao kuriozitet, da pomenem da se i firma iz Slovenije koja je distribuirala komplete za samogradnju Galaksije takođe zvala MIPRO, što je čista koincidencija - valjda su tada MIkroPROcesori zvučali ultra-moderno, pa je i izbor takvog imena očekivan; danas je, opet kurioziteta radi, domen mipro.rs slobodan). Logotip Vojine firme MIPRO je izgledao otprilike ovako:

Galaksijini karakteri su predstavljeni matricom 8*13 tačaka, a za MIPRO znak su potrošene dve pozicije u ASCII setu - 39 i 64. Tako je Galaksija ostala bez apostrofa ' i "majmuna" @, koji su smatrani nebitnim. Doduše, Ray Tomlinson je desetak godina ranije, još 1972. godine, smislio da se @ koristi u e-mail adresama, ali 1983. godine takav servis nismo mogli ni da sanjamo.

Kada je Elektronika inženjering otkupila projekat, nije želela da se pre svakog READY ispisuje znak neke druge firme, pa su tražili da se karakter generator modifikuje i da se u njega ugradi njihov logotip. Taj znak je izgledao otprilike ovako:

Eto, to je jedina softverska razlika između komercijalne Galaksije i Galaksije u samogradnji.

 

[Dejan Ristanović, 04/09/2018]