Male tajne velikih majstora programiranja

Ovo poglavlje namenjeno je vlasnicima stonih i džepnih računara koji su savladali osnovne korake u programiranju i zaželeli da iskoriste svoj računar do maksimuma. Posle nekoliko uvodnih napomena, opisaćemo neke manje poznate karakteristike pojedinih računara i predložiti neka područja njihove primene. Istraživanja manje poznatih tehnika zahtevaju "beskrajno" strpljenje i okupiraju svo slobodno vreme zainteresovanog vlasnika računara. Većina nestandardnih postupaka, ma koliko vreme bilo utrošeno na njihovo pronalaženje, ostaje bez praktične vrednosti i primene. Ipak, istraživanja ovog tipa su dala i mnogobrojne korisne rezultate, od kojih će neki ovde biti izloženi.

Kada savladamo osnove programiranja, poželećemo da koristimo računar za rešavanje problema sa kojima se srećemo u svakodnevnom životu. Većina korisnika, ipak, nema dovoljno takvih problema da bi skupo plaćeni računar bio u dovoljnoj meri "zaposlen" na njihovom rešavanju, pa im ostaje da računar zaposle i drugim poslovima. Kupovanje komercijalnih programa za igre (a o takvim programima je bilo dosta reči u ovom izdanju) pruža prilično zabave, ali zabave koja je po svojoj prirodi nekreativna. Pisanje programa za igre je, bar za neke, mnogo zanimljivije, ali je za pisanje igara potrebno mnogo različitih i originalnih ideja čiji izvor, pre ili kasnije, presuši. Jedna grupa korisnika se tada okreće hardverskim proširenjima računara. Kako na računar može, na primer, da se priključi dobar sintetizator govora? Može li, pored njega, da se priključi i analizator zvuka koji bi omogućio da računar, naravno ograničeno, razume govor i odgovara na njega? Izrada hardvera koji ovo omogućava je vrlo složen posao, a pisanje programa koji bi kontrolisao taj hardver još složeniji.

Kako prevariti računar

Sigurno je da se dogradnjama računara možemo zabavljati čitavog života i da nam rad na ovom planu može doneti mnogo prijatnih trenutaka. Ipak, za ovakve poslove je neophodno solidno poznavanje elektronike, dosta iskustva u samogradnjama (mada se, jasno, iskustvo ne može steći bez samogradnji) i oderđena materijalna sredstva za nabavku komponenti. Sigurno je da dobar deo vlasnika računara ne poseduje sve to! Ipak, i oni mogu da se zabavljaju "proširujući" svoj računar, s tim što to proširivanje neće biti hardversko nego programsko.

Operativni sistem računara je vrlo složen program koji bi trebalo da reaguje ispravno u svim slučajevima i da, kada korisnik preduzme neku akciju koja nije predviđena, prijavi odgovarajuću grešku. Jasno je, međutim, da konstruktor računara i programer koji je pripremao operativni sistem ne mogu da predvide svaku akciju korisnika. Računar, ipak, na svaku akciju mora nekako da odgovori i tako nastaje ono što se u programerskom žargonu naziva BAG (bug na engleskom znači bubica, ali se ovde odnosi na slučaj u kome računar (ili neki program) ne radi onako kako je predviđeno). U većini slučajeva "bag" ne donosi ništa korisno - ukoliko korisnik nepravilno rukuje računarom, vrlo je verovatno da će se on blokirati i neće izvršavati nikakve naredbe sve dok mu se memorija ne obriše isključivanjem iz mreže. Ipak, ponekad "bag" može da omogući pristup nekim internim operacijama računara i pruži korisniku mogućnost da, u većoj ili manjoj meri, prilagodi operativni sistem računara nekim svojim potrebama. Pažljivo proučavanje i klasifikovanje "bagova" predstavlja softversku dogradnju računara i veliki korak ka potpunom razumevanju njegovog rada.

Traganje za nestandardnim tehnikama i instrukcijama je posebno okupilo jednu grupu korisnika koja je izgubila interes za bilo kakvu drugu upotrebu računara. Kako piše eminentni časopis "Byte", postoje vlasnici računara koji najveće zadovoljstvo nalaze u tome da pritiskaju po pet tastera istovremeno i posmatraju šta će da se desi ili izvršavaju programske sekvence lišene svake logike u nadi da će "prevariti" računar. Takvi korisnici, piše "Byte", ne žele da pišu programe niti da pronalaze bilo kakvu aplikaciju onoga što su pronašli; njihov cilj je samo pronalaženje.

Rizik bez rizika

Ovakvi ljubitelji računara su, očigledno, zaboravili da računar, u osnovi, služi za rešavanje praktičnih problema, ali im se mora priznati neverovatna upornost i značajna inteligencija. Iako je dobro što većina nas nije u njihovoj koži, čini nam se da svako treba da se upozna sa korisnim nestandardnim instrukcijama i tehnikama koje mogu da se primenjuju na njegovom računaru. Nema nikakvog opravdanja za one koji se plaše korišćenja bilo čega što nije jasno opisano u okviru uputstva za upotrebu računara - korišćenje nestandardnih tehnika može da bude neobično korisno, a njihovo razumevanje zanimljivo.

Pre nego što pređemo na konkretne primere, treba da kažemo da gotovo ni jedan proizvođač računara ne podržava primenu nestandardnih tehnika. Razlog za to nije u tome što su one štetne već u tome što izazivaju često nepredvidljivo ponašanje računara. Gubici memorije, "blokiranje" tastature, brisanje nekih delova memorije i prikazivanje "nepredviđenih" karaktera na ekranu kosi se sa ambicijama svakog proizvođača da njegov računar deluje tačno onako kako je propisano. Proizvođač obično nema ni dovoljno vremena ni dovoljno kadra da proučava (kako se izrazila firma "Hewlett-Packard") "rudimente operativnog sistema računara". Ekipa koja je konstruisala neki računar se najčešće raspada posle završetka projekta; jedan deo ljudstva biva angažovan na drugim zadacima, a neki i menjaju firmu u kojoj su zaposleni. Dakle, nema ko da odgovara na korisnička pitanja ovog tipa, pa ova jednostavno bivaju ignorisana. Zato američki stručni časopisi sve nestandardne tehnike klasifikuju terminom NOMAS (No Manufacturer Support, tj. ono što proizvođač ne podržava). Članci označeni ovakvim zaglavljem upozoravaju korisnika da ne pita proizvođača računara o onome što mu nije jasno u vezi onoga što je u tekstu spomenuto. Treba se obratiti njegovom autoru ili, jednostavno, "mućnuti glavom". U smislu te klasifikacije, dalji deo ovog poglavlja može da bude označen sa NOMAS.

Maternji jezik računara

Većina stonih računara, kako često kažemo, radi na bejziku. Ova tvrdnja je samo delimično tačna: stoni računari, sa gledišta korisnika, rade na bejziku jer on kuca nardbe na tom jeziku i na njemu dobija odgovore od računara. Sam računar ne "razume" bejzik - u njegov ROM je ugrađen vrlo složen program koji naredbe bejzika prevodi na za računar jedino razumljiv jezik - mašinski jezik ili mikrokod - koji se sastoji od velikih nizova nula i jedinica. Maternji jezik računara se, dakle, ne odlikuje velikom konciznošću i preglednošću (razumljivosti da i ne govorimo), a ipak je bolji od bilo kog postojećeg programskog jezika!

Čitavo ovo poglavlje posvećeno je onima koji, poznavajući blagodeti bejzika, žele da se upuste u pisanje mašinskih programa. Zar ima takvih? Ima ih, i to mnogo - svaki ozbiljan vlasnik računara će, pre ili posle, preći na mašinski jezik. Zato, pre nego što pređemo na ovaj jezik, moramo da objasnimo potrebu za njim.

Razgovor bez prevodioca

Pre svega, zamislite da razgovarate sa nekim Francuzom ne znajući njegov jezik. Razgovor se, dakle, odvija preko prevodioca. Očigledno je da je potrebno vreme da ono što ste želeli da kažete objasnite prevodiocu, pa zatim on prevede vašu rečenicu, saopšti je Francuzu, razume njegov odgovor i prevede je vama. Isto je tako i kod računara - prevođenje svake naredbe traje dugo. Ako se jedan ciklus u programu izvršava 1000 puta, naredbe unutar tog ciklusa će 1000 puta biti prevođene. Programi koji rade na mašinskom jeziku zato, po pravilu, rade 40-100 puta brže od odgovarajućih BASIC programa!

Problemi sa brzinom će, u daljem razvoju računara, verovatno biti prevaziđeni, ali potreba za mašinskim jezikom neće. Možete li Francuzu sa kojim razgovarate posredstvom prevodioca da saopštite tačno ono što mislite? Njemu ne govorite vi nego prevodilac; on nehotice modifikuje neke vaše rečenice tako da se nijansa njihovog značenja može lako promeniti. Bejzik omogućava realizaciju čak i vrlo složenih programa za obradu podataka, ali kada se dođe do osetljive oblasti rada sa periferijskim jedinicama (štampačem, ploterom, modemom i, naročito, disk-jedinicom) počinju da se javljaju "nesporazumi" - korisnik tačno zna šta bi računar trebalo da uradi, a računar radi nešto slično tome, ali ne to! Korisnik tada, u većini slučajeva, modifikuje svoje potrebe, što izaziva delimični gubitak poverenja u računar.

I ovaj problem može da bude prevaziđen bez mašinskog jezika - postoje specijalizovani viši programski jezici za rad sa periferijskom opremom. No, vratimo se opet razgovoru sa Francuzom i prevodiocu: šta ako želite da razgovarate o nekoj specifičnoj temi (npr. računaru ZX Spectrum) koju i vi i sagovornik odlično poznajete ali prevodilac o njoj nema pojma? Proći će mnogo, mnogo vremena dok prevodilac ne shvati ono što želite da kažete; njegov prevod će, u nedostatku poznavanja stručnih termina, postati nerazumljiv i na kraju ćete morati da prekinete razgovor. Nikada ni jedan konstruktor računara i programskih jezika neće moći da predvidi sve potrebe korisnika i da obuhvati sve oblasti u kojima će računar biti korišćen! Mašinski jezik omogućava korisniku da natera računar da radi tačno ono što njemu treba bez posredstva operativnih sistema. Pomoću mašinskog jezika realizuje se složeni softver za obavljanje specifičnih potreba koji, kasnije, lako može da preraste u poseban programski jezik.

Treba, ipak, reći da većina prosečnih korisnika računara počinje da piše mašinske programe ne zbog zadovoljavanja potreba za nekim sasvim specifičnim aplikacijama računara već da bi programi za igre brže radili. Ovo se posebno odnosi na vlasnike sporog ZX81.

Mašinska abeceda

Iako su mašinski jezici, kao što smo rekli, nizovi jedinica i nula, oni se prikazuju na nešto pogodniji način preko mnemoničkih skraćenica. Pre svega, jedinice i nule treba pretvoriti u heksadekadne brojeve (smatramo da vam je poznato šta su heksadekdani brojevi - u njima se, osim cifara 0-9, javljaju i slova A, B, C, D, E i F, koja redom predstavljaju "cifre" 10, 11, 12, 13, 14 i 15). Zatim se heksadekadni brojevi grupišu dva po dva (jer su dve heksadekadne cifre jedan bajt dok se, sa stanovišta memorije, jedna heksadekadna cifra naziva "nibble". Zatim se programske instrukcije zamenjuju skraćenicama koje opisuju njihovo dejstvo. Kod procesora Z80 se, na primer, često koristi naredba LD A, H koja se heksadekadno kodira kao 7C. Skraćenica LD dolazi od "load" i znači: prenesi sadržaj registra H u registar A (akumulator).

Za pisanje programa na mašinskom jeziku potrebno je, najpre, shvatiti strukturu naredbi. Svaka naredba se sastoji od mnemoničke skraćenice (u gornjem primeru to je bilo LD) koja se prevodi u dve ili četiri heksadekadne cifre (jedan ili dva bajta). Iza skraćenice se piše adresni deo koji govori računaru gde se nalaze podaci koje treba da obrađuje. Ovaj adresni deo može da bude neki od procesorskih registara (B, C, D, A, E, H, L kod procesora Z80, na primer) ili adresa nekog bajta memorije. Naredba LD A, (7530), na primer, prenosi sadržaj memorijskog bajta čija je adresa 7530 (ova adresa je heksadekadna i njoj odgovara dekadna adresa 30000) u procesorski registar A radi obrade.

Kada smo napisali program u mnemoničkim skraćenicama, pristupamo njihovom pretvaranju u heksadekadne brojeve. Za to možemo da koristimo tabelu (prema njoj se gore pomenuta naredba LD A, (7530) prevodi sa 3A 30 75) ili gotov program koji vrši prevođenje. Ovakav program može da bude više ili manje složen, a vrlo su popularni složeni "asembler programi" koji omogućavaju unošenje skraćenica, ispravljanje, prevođenje programa i snimanje na kasetu. Ukoliko radimo manuelno, treba dobijene heksadekadne brojeve pretvoriti u dekadne (za to se koristi bejzik program ili, najčešće, neki programabilni džepni računar) i uneti ih memoriju pomoću naredbe POKE.

Da sve ovo ne bi ostalo na nivou teoretisanja, sastavićemo kratak mašinski program koji uvećava sadržaj nekog bajta memorije za 1 i odgovarajući prateći bejzik program. Mašinski program je pisan za procesor Z80 koji poseduje većina popularnih modela (ZX81, Spectrum, TRS 80...) koji su kod nas zastupljeni. Naš mašinski program će počinjati od adrese 30000 (heksadekadno 7530) i imaće svega četiri instrukcije. Prva instrukcija (LD A, (753A)) će u registar A (često se naziva i akumulator) dovesti broj koji se nalazi na adresi 753A (dekadno 30010), sledeća će povećati sadržaj registra A za jedan (INC A), zatim će sadržaj akumulatora biti vraćen na odgovarajuće mesto u memoriji (LD (753A),A) i na kraju će se izvršavanje mašinskog programa prekinuti (naredba RET) i računar će se vratiti u bejzik program iz koga je usledio poziv mašinskog. Ceo program, kodiran, izgleda ovako:

7530 3A 3A 75  LD A, (753A)
7533 3C        INC A
7534 32 3A 75  LD (753A),A
7537 C9        RET

Sa leve strane se nalaze adrese instrukcija, a odmah do njih su same instrukcije predstavljene kao heksadekadni brojevi. Mnemoničke skraćenice su ispisane pored njih radi kompletnosti - one računaru ništa ne znače.

Rutine iz ROM-a

Program glasi 3A 75 3A 3C 32 75 3A C9 ili, kada ove brojeve pretvorimo u dekadne: 58 117 58 60 50 117 58 201. Sada nam ostaje da sastavimo bejzik program koji će uneti mašinske instrukcije u memoriju, a zatim demonstrirati rad programa:

10 FOR I=0 TO 7
20 READ A
30 POKE 30000+I,A
40 NEXT I
50 INPUT A
60 POKE 30010,A
70 CALL 30000
80 PRINT PEEK 30010
90 GOTO 50
100 DATA 58,117,58,60,50,117,58,201

Nije teško razumeti rad programa. Najpre se iz DATA naredbe u memoriju unosi mašinski program koji počinje od adrese 30000. Zatim se od korisnika traži da otkuca neki broj (podrazumeva se da je taj broj manji od 256), a zatim računar poziva potprogram i na ekranu prikazuje rezultat.

Čak i na ovom jednostavnom primeru se vidi koliko se mašinski programi razlikuju od računara do računara. ZX81, na primer, ne poseduje naredbe READ i DATA, pa bi unošenje programa moralo drukčije da se organizuje. Naredba CALL 30000 bi kod mnogih računara morala da se zameni sa, na primer, B=USR(30000), a kod nekih drugih bi broj 30000 morao da bude smešten negde u memoriji, pa bi se koristilo B=USR(0). Kod računara koji ne koriste Z80 procesor morale bi da se izvrše korenite izmene: čitav mašinski program bi, što se kodova tiče, bio sasvim različit, a možda ne bi imao ni isti broj naredbi. Kada bismo ovaj program želeli da primenimo na računaru BBC model B, sve instrukcije bejzik programa bi morale da budu promenjene, a neke uopšte ne bi ličile na one koje smo koristili!

Lako je primetiti da sastavljanje mašinskih programa nije ni malo jednostavan posao. Naš program je "znao" gde se nalazi argument operacije koju treba da izvrši i gde da smesti rezultat. Da smo, međutim, bili ambiciozniji i poželeli da eliminišemo potrebu za bejzik programom i da na mašinskom jeziku realizujemo unošenje broja sa tastature i prikazivanje rezultata na ekranu, naš program bi se produžio na stotinak instrukcija. Baš u ovome i leži umešnost dobrog programera: cilj je upotrebiti rutine iz ROM-a računara za obavljanje nekih zadataka! Računar, jasno, negde u ROM-u ima potprogram koji služi za unošenje podataka sa tastature (ovaj potprogram se koristi za bejzik naredbu INPUT). Zar ne bi bilo bolje pozvati ovaj program? Na žalost, ROM je toliko veliki da ovaj program nije lako pronaći, a nije lako ni zaključiti u kom će se memorijskom bajtu nalaziti broj koji je korisnik otkucao posle njegovog izvršavanja.

Kako ući u ROM?

Disaasembliranje (prevođenje nekog mašinskog programa na mnemoničke skraćenice i razumevanje njegovog delovanja) čitavog ROM-a je posao čija složnost prevazilazi mogućnosti 99% korisnika. Pored toga, ovom poslu je potrebno posvetiti se nekoliko meseci da bi se okončao na zadovoljavajući način. Na sreću, postoje takozvane "supermape" bejzika pojedinih računara. Njih su sastavili korisnici koji su disasemblirali ROM svog računara i koji sada prodaju rezultate svoga rada ostalima ili (u retkim služajevima) sami proizvođači računara.

"Supermapu" bejzika računara TRS 80 sastavio je Amerikanac Rodžer Fuler (Roger Fuller). Na njenih četrdesetak strana nalaze se adrese svih važnijih (pa čak i većine nevažnih) rutina u ROM-u, kao i objašnjenje sistema adresiranja. Jednostavnim pogledom u supermapu vidimo da se početak mašinskog potprograma koji realizuje naredbu INPUT nalazi na 219A, a da se ono što korisnik otkuca unosi u "bafer" koji se nalazi na adresama 41E8-42E8.

Supermapa je, dakle, neophodna alatka za onoga ko želi da se upusti u mašinsko programiranje na ozbiljnijem nivou. Supermapu, međutim, mogu da koriste i oni koji ne žele da se bave mašinskim programiranjem već žele da iskoriste neke "skrivene" mogućnosti računara. Korišćenje tih mogućnosti obradićemo na primeru koji se ponovo odnosi na TRS 80.

U toku izvršavanja programa pritisak na taster BREAK izaziva prekid rada i ispisivanje READY na ekranu. Zamislimo da sastavljamo bejzik program koji će simulirati neki drugi programski jezik (autor se sa ovim problemom susreo u toku sastavljanja programa koji simulira zamišljeni računar NAR 1 sa kojim se srednjoškolci upoznaju u okviru predmeta računari i programiranje). U toku rada interpretatora pritisak na BREAK treba da prekine izvršavanje programa, ali ne programa-simulatora nego programa čiji se rad simulira! Dakle, pritisak na BREAK treba da izazove prelazak na izvršavanje neke unapred predviđene bejzik naredbe. Kako to izvesti bez mašinskih programa?

Konsultacija supermape daje da se, po pritisku na taster BREAK izvršava naredbe koja je smeštena na 400C (dekadno 16396). Pomoću PEEK se uveravamo da se na tom mestu nalazi naredba RET (C9 ili 201 dekadno), a da su sledeća dva bajta slobodna. Upravo ono što nam je potrebno! Unesimo u naš bejzik program naredbe POKE 16396, 195: POKE 16397,45:POKE 16398,1. Na ovaj način će računar, kada pritisnemo BREAK, izvršiti mašinske naredbe JP 012D čime će se izvršavanje preneti na program u ROM-u koji počinje od 012D. Ovaj broj smo ponovo dobili konsultacijom supermape - tamo se nalazi rutina koju računar normalno izvršava kada naiđe na nepostojeću naredbu, u kom slučaju se na ekranu izdaje poruka "L3 ERROR". Ukoliko u okviru našeg bejzik programa dodamo naredbu ONERRORGOTO 1000, svaki pritisak na taster BREAK će izazivati prelazak na liniju 1000. Tamo, ukoliko treba da usledi prekid rada programa, može da se nađe naredba POKE 16396,201 čime će rad tastera BREAK biti normalizovan.

Još jedan primer upotrebe supermape je realizacija novih naredbi. TRS 80, na primer, ima tridesetak naredbi koje su aktivne samo kada su priključeni diskovi. Ukoliko njih nema, nije loše sastaviti mašinske potprograme koji ove naredbe preimenuju u neke nove koje su korisniku potrebne. Na primer, kada računar naiđe na naredbu MERGE, on izvršava instrukciju koja se nalazi na adresi 418B. Ukoliko tamo, pomoću POKE, postavimo mašinsku naredbu JP 7530, naredba MERGE u programu će izazivati početak izvršavanja našeg mašinskog programa koji počinje od adrese 30000! Ova tehnika se, nažalost, ne može primeniti kod sinklerovih računara jer njihovi konstruktori nisu predvideli tzv. link za izlazak iz ROM-a.

Prevođenje programa

Deo namenjen iskusnijim programerima koji ne bi obradio prilagođavanje programa pisanih za jedan računar nekom drugom modelu ne bi bio kompletan. Računari koji su dugo na tržištu kao što su Apple II+ i TRS 80 imaju moćnu programsku podršku - hiljade ljudi je napisalo desetine hiljada programa koji mogu da se nađu u knjigama, kopiraju od prijatelja i slično. Noviji računari su, po mogućnostima, daleko moćniji od starih, ali im je programska podrška slaba - generacije računara se u poslednje vreme smenjuju toliko brzo da nema vremena za pisanje dovoljnog broja programa. Zato nije malo onih koji požele da prilagode postojeće programe svome računaru.

Ako je program pisan na bejziku i ako se u njemu ne koriste naredbe PEEK, POKE pozivi mašinski rutina iz ROM-a (naredba CALL), on se, u principu, može prilagoditi svakom računaru. Postoje, naravno, programi koje je gotovo nemoguće preraditi - neki numerički proračun koji se zasniva na tome da TRS 80 računa sa 13 tačnih cifara ne može da se prilagodi za ZX81 koji računa sa 4-5 tačnih cifara. Isto tako, program koji zahteva grafiku visoke rezolucije teško može da se prilagodi računaru koji ovu rezoluciju ne poseduje, a da ne bude "osakaćen".

Programe koji sadrže PEEK i POKE možete da prilagodite vašem računaru ako pronađete nekoga ko poseduje računar za koji je program pisan i ko može da vam kaže šta je tim PEEK i POKE naredbama postignuto. Ukoliko se u programu na početku nalazi neko POKE, vrlo je verovatno da ono služi za iniciranje nekog posebnog moda računara (npr. broja karaktera u redu i slično), pa ćete verovatno moći potpuno da ga zanemarite. Ukoliko je POKE korišćena više puta u raznim delovima programa, moraćete da shvatite za šta ona služi ili da nađete nekoga ko će vam to objasniti.

Ukoliko naiđete na program koji sadrži mašinske potprograme, dobro promislite pre nego što pređete na prevođenje. Ukoliko ti mašinski potprogrami makar na jednom mestu pozivaju neku rutinu iz ROM-a, savetovali bismo vam da odustanete od posla - mnogo će lakše biti da napišete nov program nego da prilagodite stari!

Postoje dva tipa prevođenja programa. Jedan zahteva da se uklopimo u logiku polaznog programa, shvatimo kako on radi (eventualno nacrtamo njegovu blok-shemu), a zatim napišemo novi program. Drugi način jemehaničko prevođenje programa: čitamo naredbu po naredbu i one naredbe koje su zajedničke za oba računara prenosimo bez razmišljanja. Ukoliko naiđemo na neku naredbu koju naš računar ne poznaje, pokušavamo da je zamenimo naredbom (ili grupom naredbi) našeg računara koja će imati isto dejstvo. Pri radu na drugi način mi ne shvatamo kako program funkcioniše već ga "kopiramo" uz rešavanje problema "u letu".

Svaki iskusniji korisnik računara će, ako je ikako moguće, težiti da prevodi program na drugi način jer se tako štedi u vremenu. Problem se javlja kada prevedemo program i vidimo da on ne radi. Pronalaženje grešaka je vrlo jednostavno ukoliko imamo pristup do računara za koji je program pisan - postavljanje STOP naredbi na strateški dobro izabrana mesta u programu i proveravanje sadržaja promenljivih bi trebalo da dovede do brzog lociranja i ispravljanja greške. Ukoliko nemamo na raspolaganju oba računara, moramo se delimično uklopiti u logiku programa u nadi da ćemo naći variable koje imaju nelogične vrednosti i istražiti uzrok ovih nelogičnosti. Posedovanje štampača znatno olakšava prevođenje s obzirom na to da svaki računar poseduje neki TRACE mod (u ovom modu se ispisuju, na ekranu ili štampaču, sadržaji promenljivih posle svake naredbe, linijski brojevi naredbi koje se izvršavaju i slično).

Sve u svemu, prevođenje složnih programa na jezike drugih računara zahteva dobro poznavanje bar dva računara, prilično strpljenje i upornost. Neki programi se lako prilagođavaju, dok je to kod drugih praktično nemoguće. Tabela pokazuje naredbe sa istim dejstvom kod nekoliko različitih računara.

Mašinac iz bejzika

Većina bejzik računara ima mogućnost programiranja na mašinskom jeziku što znači da se, regularnim naredbama, može pristupiti svim sistemskim registrima, menjati sadržaj bajtova u memoriji i slično. To se najčešće postiže BASIC naredbama PEEK, POKE i CALL (BBC računari, na primer, imaju nešto drukčije naredbe, ali one imaju isto dejstvo; kod nekih računara se umesto CALL koristi OPN, a kod nekih USR). Naredba PEEK zahteva adresni deo: A=PEEK 16000 (kod nekih računara 16000 mora da bude u zagradi) će promenljivoj A dodeliti vrednost bajta koji, u apsolutnoj mapi adresa koja obuhvata ROM i RAM, ima broj 16000. Naredba POKE ima dva adresna dela razdvojena zarezom: POKE 16000,11 će u bajt čija je adresa 16000 staviti sadržaj 11 (dekadno).

Naredba CALL (prati je adresa) započinje izvršavanje mašinskog programa čiji se početak nalazi na zadatoj adresi. Povratak u bejzik program mora da obezbedi sam mašinski potprogram odgovarajućom RTN naredbom.

Ništa lakše od smeštanja proizvoljnog sadržaja u neki bajt memorije, ali rezultati takve akcije mogu da budu vrlo neprijatni. Pre svega, postoji mogućnost da naredba POKE ne deluje: rekli smo da se RAM i ROM adresiraju zajedno; kod većine ražunara adrese 0-15000 predstavljaju ROM koji, jasno, ne može da se menja. Ukoliko pokušate da, uz pomoć POKE naredbe, smestite neki broj na adresu u ROM-u, ništa se neće dogoditi i imaćete utisak da je naredba pravilno izvršena. No, ako pomoću PEEK pokušate da proverite dejstvo naredbe POKE, videćete da ona uopšte nije delovala.

Može, isto tako, lako da se desi da, pomoću POKE, unesete neki broj u deo memorije koji sadrži program koji ste prethodno otkucali. Ukoliko taj broj dođe u sredinu neke bejzik naredbe, neće biti nekih velikih problema - jedna intrukcija će biti zamenjena drugom i to će, odgovarajućim editovanjem ili ponovnim kucanjem iste naredbe, lako moći da se ispravi. No, u okviru svake naredbe se, obično, nalazi i adresa sledeće. Ukoliko nehotice poremetite ovu adresu, računar će dospeti u totalnu komfuziju i potpuno će pogrešno prikazivati i izvršavati program (verovatno ćete, kada otkucate LIST, videti samo naoko besmislene karaktere kako lete po ekranu). Kucanjem naredbe NEW ovakav problem će sigurno biti korigovan.

Najveća opasnost leži u menjanju sadržaja neke sistemske promenljive. Tu se nalaze konstante neophodne za ispravan rad računara: adresa prvog korisnikovog programa, adresa kraja memorije, početna i krajnja adresa dala memorije u kome su smeštene informacije koje računar prikazuje na ekranu, adresa isntrukcije koja se trenutno izvršava i slično. Ukoliko promenite neke od ovih konstanti, rezultati su nepredvidljivi. Moguće je da se neće ništa dogoditi. Moguće je da se u početku neće ništa dogoditi i da će se problemi pojaviti nekoliko časova posle primene inkriminisane POKE naredbe. No najverovatnije je da će problemi nastupiti istog momenta: program će "nestati" iz memorije ili će se pojaviti neki delovi; možda će se ekran "smanjiti" ili će računar prijaviti besmislene greške ili će se, jednostavno, sve blokirati. Ukoliko se desi poslednje, ostaje vam samo da isključite i ponovo uključite računar.

Naredba POKE je, dakle, vrlo opasna ako ne znate tačno šta radite.. Da biste znali šta radite, morate da imate tzv. mapu memorije. U mapi memorije su ubeležene početne i krajnje adrese RAM-a i ROM-a i sistemske promenljive i napomenuto šta je smešteno u svaku od njih. Ovakve mape se najčešće nalaze u uputstvima za upotrebu računara ili u posebnim knjigama posvećenim programiranju na mašinskom jeziku.

ZX-81 bez tajni Moja home strana