Računar "galaksija" je, dakle, sastavljen i nalazi se pred vama. Teži i riskantniji deo posla je time završen; preostalo vam je da testirate kompjuter i - uživate u plodovima svoga rada! Vaš novi računar poznaje programski jezik bejzik i sa pravom isto to očekuje i od svog vlasnika. Da biste se, dakle, uspešno sporazumevali sa računarom, morate da uđete u tajne ovog jezika što, kao što ćete videti, nije mnogo težak posao. Ovo uputstvo za upotrebu će izložiti sve naredbe koje računar "galaksija" razume i dati primere njihove upotrebe. Ono, ipak, nije pisano tako da bude potpuno samostalno - u okviru ovog specijalnog izdanja nalazi se osnovna škola bejzika, koju bi svaki vlasnik računara "galaksija" koji nema iskustva sa programiranjem trebalo da pročita pre nego što nastavi sa ovim tekstom. Primetićete da su neke naredbe računara "galaksija" različite od onih koje su pomenute u školi bejzika. To ne treba da vas uplaši - bejzik nije standardizovan jezik i razlikuje se od kompjutera do kompjutera. No, kada se jednom potrudite i shvatite neki od njegovih dijalekata, prilagođavanje nekom drugom računaru je prava dečja igra.
Ovo uputstvo je koncipirano tako da vam omogući da pišete programe pre nego što ga potpuno pročitate i savladate. Zato su najvažniji oblici naredbi izloženi na njegovom početku, dok se deo za bolje poznavaoce računara nalazi na samom kraju. Onima koji imaju iskustva sa stonim računarima preporučujemo da jednostavno pogledaju spisak naredbi i memorijsku mapu i počnu sa radom - na uputstvo ćete se vraćati kada osetite potrebu.
Računar "galaksija" može da bude povezan sa bilo kojim televizorom koji prima UHF područje. Za to se koristi koaksijalni priključak koji se nalazi sa njegove zadnje strane. Stoga uzmite odgovarajući kabl i povežite ga sa antenskim ulazom u televizor. Zatim uključite televizor, prebacite ga na UHF područje i, laganim okretanjem birača kanala, pokušajte da na ekranu dobijete poruku READY (READY znači da je računar spreman da primi vaše naloge). Kada je ugledate, možete da uzviknete EUREKA - računar radi kako treba!
Čitaoci koji poseduju monitor ili prepravljeni televizor će poželeti da povežu računar sa njim i tako oslobode kućni TV aparat. Za to treba koristiti monitorski izlaz i kabl sa priključcima koji zavise od samog monitora.
Računar "galaksija" ima 54 tastera koji su raspoređeni poput dirki na pisaćoj mašini. Kada god pritisnete neki od njih, računar na ekranu ispisuje odgovarajući simboli to na mestu gde se prethodno nalazio kurzor (_). čim se neki simbol pojavi na ekranu, kurzor se pomera za jedno mesto udesno da bi vam pokazao gde će se pojaviti sledeći znak. Ukoliko otkucate toliko slova da se ispuni čitav red, računar će automatski preći u sledeći bez ikakve crtice koja bi to označila - računar ne deli reći na slogove niti obraća pažnju na to da li je neka reč nelogično "presečena".
Pritisnite, na primer, taster A dvadesetak puta. Zatim će vam postati jasno da veliki broj slova A ne znači ništa, pa ćete poželeti da ih obrišete. Za to vam nije potrebno nikakvo korekturno mastilo - dovoljno je da pritisnete taster ß i kurzor će se pomeriti za jedno mesto ulevo brišući automatski slovo na čije je mesto došao. Uzastopnim pritiscima na ovaj taster možete da obrišete sva otkucana slova - sve do početka reda.
Na tastaturi postoji, jasno, i tačka, ali ćete se za koji trenutak uveriti da vaš računar tu tačku ne smatra krajem rečenice. Otkucajmo, na primer, RAČUNAJ i stavimo tačku. Kompjuter ne reaguje, što znači da nije ni shvatio da mu je izdata neka naredba. U programiranju je, naime, uobičajeno da se na kraju rečenice, umesto tačke, pritisne taster koji je označen sa RET. Pritisnimo ga i na ekranu će se pojaviti poruka WHAT? iza koje će . slediti uobičajeno READY; šta se dogodilo? Pritiskom na RET stavili smo računaru do znanja da je izdata naredba koju on treba da izvrši. On je analizirao tekst koji smo otkucali i primetio da se među naredbama koje poznaje ne nalazi RAČUNAJ. Zato je na ekranu ispisao WHAT?, a zatim i READY, stavljajući nam do znanja da je spreman za.novu naredbu, koja, kako se nada, neće biti nerazumljiva.
Taster RET je, dakle, neobično značajan. Ne zaboravimo da ga pritisnemo kada god dovršimo neku naredbu ili rečenicu - ako to ne učinimo, računar će mirno čekati da nešto preduzmemo, ispoljavajući pri tom upornost koja daleko prevazilazi našu.
Ako nastavimo da pritiskamo RET, ekran će ubrzo biti popunjen. Tada će se prvi redovi postepeno gubiti, a ono što kucamo pojavljivati u poslednjem. Stalno opštenje sa poslednjim redom može nekome da se učini ponižavajućim - u tom slučaju treba da naredimo računaru da obriše sadržaj čitavog ekrana i počne da piše od njegovog vrha. Jedan od načina je da isključimo i ponovo uključimo računar, ali ima i jedan bolji.
Upoznajmo, najpre, taster SHIFT. Ovaj napis ne vredi tražiti na tastaturi: odnosi se na dva neobeležena tastera. Istovremenim pritiskom na SHIFT i neki broj dobijamo na ekranu znak napisan iznad tog broja (pritisnimo, na primer, istovremeno SHIFT i 2. i na ekranu će da se pojavi znak navoda). Kod brojeva je, kao što vidimo, simbol napisan na samom tasteru ali postoje i neke dirke sa skrivenom šiftovanom funkcijom. Pritisnimo, na primer, istovremeno SHIFT i DEL (ukoliko smo, kao što je planirano, pri montaži predvideli dva SHIFT tastera, možemo da koristimo bilo koji od njih) i ekran će biti obrisan. Kada nam, dakle, računareve poruke WHAT?, koje su izazvane našim početničkim greškama dosade, pritisnućemo SHIFT DEL i obrisati ekran.
Taster SHIFT će nam otkriti još neke male tajne računara "galaksija". Pritisnimo, na primer tastere SHIFT i C i na ekranu će se pojaviti slovo Ć. Sasvim slično, SHIFT S daje slovo Š, SHIFT Z slovo Ž a SHIFT X (zapamtićete ga po tome što kapa iznad slova č ima oblik koji podseća na polovinu iksa) - Č. Ostali tasteri nemaju šiftovane funkcije - SHIFT A, na primer, daje slovo A.
Ako ste, čitajući ovaj tekst, eksperimentisali sa kucanjem, verovatno ste, namerno ili slučajno, pritisnuli taster REPT. Tada se desilo nešto prilično čudno - računar je počeo da ispisuje gomile istih slova. Taster REPT dakle, ima funkciju koju programeri nazivaju "autorepeat" (automatsko ponavljanje) - pritisak na njega nalaže računaru da ponavlja funkciju poslednjeg pritisnutog tastera. Namerno nismo rekli "da ponavlja poslednje slovo": otkucajte red sa dosta slova a zatim pritisnite ß. Poslednje slovo je, kao što smo i očekivali, obrisano. No, pritisak na REPT će proizvesti daleko efektnije dejstvo: računar će "gutati" slova sve dok ne obriše čitav red.
Osim tastera koje smo upoznali na tastaturi se nalaze još tri strelice kao i dirke sa tajanstvenim napisima BRK i LIST/STOP (u daljem tekstu LIST). BRK je skraćenica od BREAK (u bukvalnom prevodu "slomi"); pritisak na ovaj taster nalaže računaru da prekine sa izvršavanjem nekog programa i na ekranu ispiše READY. Taster LIST nalaže računaru da na ekranu prikaže sadržaj programa koji se nalazi u njegovoj memoriji, a strelice nemaju neku posebnu funkciju - koriste se u igrama i računar može da kontroliše da li je neka od njih pritisnuta. Za sada ne umemo da pišemo programe pa su nam svi ovi tasteri prilično beskorisni, ali to neće trajati dugo.
Sa zadnje strane računara se nalazi dugme iznad koga bi trebalo da piše RESET. Ono predstavlja pojačanu verziju tastera BRK: ukoliko vam se ikada desi da se računar blokira i otkaže poslušnost (ovo se dešava, ako je računar ispravan, samo kod onih koji pišu programe na mašinskom jeziku ili pri čitanju programa sa kasete), pritisak na RESET će, u 99% slučajeva, izazvati ispisivanje uobičajenog READY, pri čemu memorija računara neće biti izbrisana. U preostalom procentu slučajeva moraćete da isključite i ponovo uključite računar, čime će programi biti izbrisani. Važno je zapamtiti da ni jednom naredbom ili grupom naredbi računar ne može da bude oštećen - isključivanje i ponovno uključivanje će ga uvek povratiti.
Pre nego što pođemo dalje, moramo da izreknemo i jedno upozorenje vezano za dugme RESET: ono nije namenjeno stalnoj upotrebi. Pokušajte, na primer, da brzo pritiskate RESET više puta, pa lako može da se desi da memorija računara bude kompletno izbrisana. RESET, dakle, koristite samo kao poslednju soluciju, kada nikako drukčije ne možete da "probudite" vaš kompjuter.
Uz računar "galaksija" ste, svakako, naručili i kasetu sa programima. Ona je namenjena testiranju računara, navikavanju na rad sa kasetofonom i, prevashodno, zabavi. Da biste je koristili, povežite džek na kome piše EAR (ili neki drugi napis, zavisno od kasetofona) sa računarom prema ranije prikazanoj šemi, stavite demo-kasetu, otkucajte OLD, pritisnite RET i startujte kasetofon. Ovo OLD, doduše, znači star, ali neće naterati računar da postane stara i istrošena mašina - ono mu jednostavno nalaže da sa kasete učite program koji je ranije snimljen i pripremi ga za izvršavanje. Ekran će se najpre potpuno zatamniti, da bi se, desetak sekundi docnije, pojavilo READY. Ako se na ekranu i posle, tridesetak sekundi ne pojavljuje ništa, računar nije primio program. Bez panike - to se dešava zbog toga što jačina zvuka ne odgovara potrebama kompjutera. Pritisnite zato RESET, premotajte kasetu na početak, ponovo otkucajte OLD RET i startujte kasetofon uz malo manipulisanje sa potenciometrom za regulisanje jačine zvuka. Posle kraćeg ili dužeg truda, program će biti učitan u memoriju računara i moći ćete da ga startujete. Startovanje se obavlja kucanjem naredbe RUN i pritiskanjem tastera RET. Bez brige: računar neće nikuda pobeći (RUN=trči, beži) nego će početi sa izvršavanjem upravo učitanog programa. Ne možemo da vam kažemo šta će se tada desiti. U okviru prvog programa računar će vas upoznati sa sadržajem demo-kasete i poučiti šta da radite.
Za učitavanje preostalih programa procedura je ista: otkucate OLD pritisnete RET, startujete kasetofon i, kada se na ekranu pojavi READY, otkucate RUN i pritisnete RET. Računar će, zatim, ispisati ime programa i upitati vas da li su potrebna uputstva za njegovu upotrebu. Odgovorite sa D (od DA) i pažljivo ih pročitajte.
Možda će se naći neko ko dalji tekst neće ni čitati - nekoliko igara sa demo-kasete će mu oduzeti toliko vremena da će smatrati da je računar ispunio svoju funkciju i opravdao uloženi novac. Ipak, učenje programiranje je lak i prijatan posao u koji se vredi upustiti.
Počećemo na najjednostavniji mogući naćin: otkucaćemo, slovo po slovo, tekst PRINT "RAČUNAR GALAKSIJA" i pritisnuti RET (navodnici se dobijaju istovremenim pritiskom na tastere SHIFT i 2, a slovo Č pritiskom na SHIFT X). Tako smo naložili računaru da na ekran prenese tekst naveden između znakova navoda - u ovom slučaju RAČUNAR GALAKSIJA. Možemo da ponavljamo ovu naredbu veći broj puta umećući između znakova navoda bilo koji tekst proizvoljne dužine i računar će biti poslušni izvrsilac naših želja. Svaka naredba se analizira i izvršava onoga momenta kada smo pritisnuli RET, pa se ovaj način rada naziva komandnim (na ovaj način računaru izdajemo komande kojima kontrolišemo njegov rad).
Osim komandnog treba da upoznamo programski režim rada. I kod njega računaru izdajemo komande, ali se one ne izvršavaju odmah - računar ih pamti i izvršava tek kada mu to bude naloženo. Da bi kompjuter razlikovao komande od naredbi koje treba da "pamti", uvedeni su brojevi programskih linija. Broj programske linije (ili, kao što se ponekad nazivaju, linijski broj) ukazuje računaru na redosled kojim će, kada mu to bude naloženo, izvršavati "zapamćene" instrukcije. Ovaj broj treba da se nalazi na samom početku linije.
Otkucajmo, na primer, 10 PRINT "RAČUNAR GALAKSIJA" i pritisnimo RET. Računar nije izvršio naredbu; ona je zapamćena i dodeljen joj je linijski broj 10. Otkucajmo zatim 20 PRINT "JE MOJ PRVI KOMPJUTER" i ponovo pritisnimo RET. Obzirom da je linijski broj druge naredbe (20) veći od linijskog broja prve (10), računar će najpre ispisati RAČUNAR GALAKSIJA a zatim JE MOJ PRVI KOMPJUTER. Da proverimo ovo rezonovanje, otkucaćemo RUN (ovo je naredba koju smo dobro upoznali igrajući se sa demo-kasetom - ona nalaže računaru da započne sa izvršavanjem programa) i pritisnuti neizbežno RET. Računar će, kao što se i očekivalo, izvršiti program i na ekranu ispisati:
RAČUNAR GALAKSIJA JE MOJ PRVI KOMPJUTER READY
Ono READY nije posledica neke od naredbi našeg programa već uobičajeni signal da je računar spreman da primi sledeću naredbu. To ponovo može da bude RUN - program će se izvršavati onoliko puta koliko poželimo.
Pokušajmo da proširimo program koji smo sastavili i da se uverimo da računar izvršava naredbe po redosledu njihovih brojeva a ne po redu unošenja: otkucajmo 15 PRINT "KONSTRUISAN SEPTEMBRA 1983", i pritisnimo RET. Po startovanju programa (RUN i RET) na ekranu će biti ispisan tekst:
RAČUNAR GALAKSIJA KONSTRUISAN SEPTEMBRA 1983 JE MOJ PRVI KOMPJUTER READY
što znači da je linija 15 umetnuta između linija 10 i 20 - baš kao što smo i očekivali.
Ako na ovaj način počnemo da umećemo naredbe, ubrzo ćemo zaboraviti kako program izgleda. To je lako proveriti: jednostavno pritisnemo taster LIST (LIST bi slobodno moglo da se prevede sa "prikaži program"). Dok taster LIST držimo pritisnut, računar će ispisivati program koji se nalazi u njegovoj memoriji, liniju po liniju. Čim otpustimo ovaj taster, ekran će se "zamrznuti", pa ćemo moći da analiziramo uneseni program. Ako želimo da se listanje nastavi, ponovo ćemo pritisnuti taster LIST, a ukoliko ne želimo pritisak na BRK će na ekranu prikazati uobičajeno READY.
Umesto da pritiskamo taster LIST, možemo da otkucamo reč LIST i pritisnemo RET. Sve dok je RET pritisnut, prikazivanje programa traje, a otpuštanje tastera privremeno prekida ovaj proces. Na prvi pogled nema smisla koristiti naredbu LIST kada je obezbeđen taster sa istim dejstvom. Ovakav zaključak je samo donekle tačan: ponekad ćemo poželeti da prikazujemo program počevši od neke linije. U tom slučaju treba da otkucamo LIST, a zatim navedemo broj te linije i pritisnemo RET (npr. LIST 200). Na taj način ne moramo da posmatramo početak programa ako nam je potreban njegov kraj. Za početak će, doduše, naši programi biti toliko kratki da će bez problema stajati na ekran, pa naredbu LIST ostavljamo za blisku budućnost.
Ni izvršavanje programa ne mora da počne od početka: možemo, na primer, da otkucamo RUN 15 i pritisnemo RET. Računar će početi da izvršava program od linije 15 i ispisati na ekranu:
KONSTRUISAN SEPTEMBRA 1983. JE MOJ PRVI KOMPJUTER READY
Ova rečenica je besmislena, ali za računar nije postojao razlog da odbije da je prenese na ekran, pošto su sve instrukcije u programu bile valjane. U budućnosti ćemo videti da postoje programi koji ne mogu da se izvršavaju od proizvoljne linije bez katastrofalnih posledica (računajući i gubitak čitavog programa) ali nam je i ovo bila dobra škola - započinjanje programa od neke neplanirane tačke ne mora da izazove grešku, ali su rezultati nepredvidljivi.
Unošenje programa i njegovo neprekidno izvršavanje je, bez sumnje, lepa zabava, ali će nam i ona dosaditi. Kada poželimo da izbrišemo otkucani program iz memorije, možemo da isključimo računar iz napajanja i trenutak docnije ga ponovo uključimo ili, što je sasvim isto, otkucamo PRINT USR(0) i pritisnemo RET. Na raspolaganju je i naredba NEW (posle nje se, naravno, pritiska RET) koja briše samo program, ali ne i sadržaj ekrana i promenljivih.
Naredbe PRINT koje smo do sada koristili su nalagale računaru da tekst otkucan između navodnika jednostavno prenese na ekran. No, ova naredba može da obavi i mnogo aktivniju ulogu: otkucajmo, na primer, PRINT 17+13 i pritisnimo RET. Na ekranu će se pojaviti broj 30, što znači da je postavljeni zadatak izvršeni Umesto 17+13 možemo da otkucamo bilo koji izraz na način koji je uobičajen u matematici: uz upotrebu zagrada, pri tome treba da pazimo da se množenje obeležava zvezdicom (*) a deljenje kosom crtom (/) i da se množenje ne podrazumeva: PRINT (12+2)(17+3) bi izazvalo grešku, dok bi se PRINT (17+2)*(17+3) korektno izvršilo. Evo kako bi izgledala naredba koja izračunava brojni izraz:
4.5+17.2-19.45 --------------- * 3 2.1-12.4/16.22
PRINT (4.5+17.2* 19.45)/(2.1-12.4/16.22))*3
Izvršavanje ove naredbe će na ekranu dati rezultat 761.595, koji je tačan na šest cifara.
Videli smo da brojevi sa kojima računar "galaksija" operise ne moraju da budu
celi - dovoljno je da koristimo decimalnu točku umesto kod nas uobičajenog
zareza. Ipak, brojevi sa kojima možemo da radimo su ograničeni na raspon od
-999999 do 999999. Brojevi veći ili manji od ovih limita se prikazuju na drugi
način: pomoću stepena broja 10. Otkucajmo, na primer. PRINT 1000000 i računar će
Ispisati 1E+06 (podrazumevamo da ste zapamtili da se posle svake naredbe
pritiska RET, pa ubuduće nećemo pisati odgovarajući komentar). Slovo E potiče od
reci eksponent, a zapis se prevodi kao 1*1066-3637
Krajnje je vreme da sastavimo i prvi program. Obzirom da tek počinjemo, to će biti jednostavan programčić koji računa vreme potrebno za putovanje od jednog do drugog mesta. Da pojednostavimo problem, pretpostavićemo da je brzina kretanja konstantna na čitavom putu i da je unapred zadata (ovakvim zahtevima bi se verovatno pokoravao voz koji ne nailazi na semafore, krivine i slične prepreke). Ako put koji treba da se pređe označimo slovom S, brzinu slovom V a potrebno vreme slovom T, važiće relacija T = S/V (ovu relaciju osnovci uče u VI razredu a i mlađima bi trebala da bude očigledna: što je veći put, duže se putuje; što je veća brzina, kraće se putuje). No, pre nego što počnemo da pišemo program, pokušaćemo da iskoristimo naredbu PRINT i proverimo kako sve u praksi izgleda.
Od Beograda do Dubrovnika, na primer, ima 370 km u pravoj liniji, a avion "Caravelle" se kreće brzinom od nekim 800 km/h. Da nađemo vreme (u časovima), otkucaćemo:
PRINT 370/800
i na ekranu će se pojaviti broj 0.4625. Olovka i papir (za sada još ne umemo da iskoristimo računar da obavi sve potrebne operacije) će pokazati da ovo predstavlja 27 minuta i 45 sekundi.
Koliko bi put trajao da se avion kretao brzinom od 900 km/h? Ili, šta da je putovao od Beograda do Zagreba? Mogli bismo, jasno, stalno da kucamo naredbe PRINT ali ćemo uvideti da od toga nema velikih vremenskih ušteda. Zato ćemo u program uneti instrukciju
30 PRINT S/V
30 je, kao što se sećamo, broj programske linije ali šta su S i V? Programeri ih nazivaju promenljive i koriste za smeštanje nekih podataka u memoriju računara. Svaka promenljiva je ime nekog podatka koji docnije može da bude pozivan da bi se sa njim računalo. Njeno ime može da bude bilo koje slovo od A do Z (ne računajući slova Č, Ć, Š i Ž) i pogodno je koristiti slova koja asociraju na podatak koji promenljiva čuva (mi smo upotrebili slova S i V). Ipak, program koji smo sastavili nije potpun. Ako otkucamo RUN na ekranu će da se pojavi broj 1 koji svakako ne predstavlja rešenje našeg problema. Razlog je jednostavan: računar "galaksija" još nije naučio da čita naše misli i nema nikakav način da zna šta bi trebalo da sadrže promenljive S i V. U početku rada one imaju jednaku vrednost (pažnja: ta vrednost nije nula!) pa je rezultat deljenja jedan. Zato ćemo da dodamo naredbe 10 S=370 i 20 V=800 (nismo zaboravili da se posle svake linije pritiska RET?) i startovati program sa RUN. Ovoga puta sve je korektno radilo i računar je ispisao vreme putovanja od Beograda do Dubrovnika i to izraženo u časovima.
Ako želimo da ubrzamo zamišljeni avion, otkucaćemo 20 V=900. Kako nova linija ima isti linijski broj kao i stara, jedna od njih mora da napravi mesto drugoj. Računar uvek smatra da je linija koju smo poslednju otkucali merodavna i uklanja iz memorije liniju 20 V=800 da bi je zamenio sa 20 V=900. Program se ponovo startuje sa RUN i dobija se novi rezultat.
Prikazivanje rezultata koje smo primenili nije baš srećno izabrano: računar nam prikazuje vreme u časovima i to na način koji nam nije prirodan: navikli smo da se vreme izražava u časovima, minutima i sekundama. Da prikažemo rezultat na ovakav način potrebna nam je jedna nova funkcija - INT. INT je skraćenica od INTEGER i označava, u bukvalnom provodu, ceo broj. U "galaksijinom" bejziku INT je funkcija koja izračunava "ceo deo" izraza koji je naveden iza nje. Ako, na primer, otkucamo PRINT INT(3.1415) i pritisnemo RET, na ekranu će se pojaviti broj 3 - računar je odbacio decimale broja u zagradi. U zagradi nije morala da se nalazi konstanta: mogli smo da napišemo PRINT INT(A/1000) ili čak PRINT INT(2.5+(A-17.2+C)).
Da bismo broj pretvorili u časove, minute i sekunde, moramo da pomnožimo vreme u časovima sa 60 i ceo deo rezultata proglasimo za potreban broj minuta; broj časova dobijamo deljenjem vremena sa šezdeset i uzimanjem celog dela rezultata (možete da uzmete papir i olovku i proverite ovo rezonovanje na primerima; nema nikakvog smisla da nastavljate sa čitanjem pre nego što vam do sada korišćene naredbe ne postanu kristalno jasne). Evo i programa:
10 S=370 20 V=800 30 T=S/V 40 PRINT INT(T) 50 PRINT "ČASOVA," 55 M=(T-INT(T))*60 60 M=INT(M) 70 PRINT M 80 PRINT "MINUTA."
Program, kao što se vidi, prikazuje samo časove i minute ali ćete, ako ste ga razumeli, bez problema povećati taćnost navođenjem sekundi!
Da bismo u prethodnom programu izbegli neprekidno kucanje brojnog izraza koji računa S/V i kome prethodi naredba PRINT, koristili smo promenljive. Na žalost ni na ovaj način kucanje nije bitno skraćeno: bolje bi bilo da nas, pri svakom izvršavanju programa, računar pita za pojedine vrednosti, a da mi samo kucamo potrebne brojeve. Ovaj problem resava naredba INPUT, čije ćemo dejstvo upoznati pošto modifikujemo prethodni program:
10 PRINT "KOLIKO SU MESTA UDALJENA?" 15 INPUT S 20 PRINT "KOLIKA JE BRZINA?" 25 INPUT V
Kada računar naiđe na naredbu INPUT, privremeno će da prekine sa izvršavanjem programa i na ekranu ispiše znak pitanja. Od korisnika se očekuje da otkuca neki broj i, kada to učini, pritisne RET. Računar će otkucani broj dodeliti promenljivoj čije je ime navedeno iza INPUT i nastaviti sa radom.
Program se, kao i obično, startuje sa RUN. Računar ispisuje:
KOLIKO SU MESTA UDALJENA? ?_
Otkucajmo broj 370 i pritisnimo RET. Računar ispisuje:
KOLIKA JE BRZINA? ?_
čim otkucamo 800 i pritisnemo RET, na ekranu će pisati:
0 ČASOVA, 27 MINUTA. READY
READY je znak da je računar spreman za dalji rad; možemo da otkucamo RUN i damo podatke za neki drugi grad ili brzinu. No, ubrzo će nam dosaditi stalno kucanje naredbe RUN. Zar ne bi bilo bolje naložiti računaru da se, po izvršavanju programa i izdavanju rezultata, vrati na početak programa i od nas zatraži nove podatke? Za to će nam dobro poslužiti naredbe bezuslovnog prelaska (skoka).
Dodajmo našem programu naredbu 90 GOTO 10 (pažnja: u principu nije bitno da li u programu ostavljamo prazne prostore između GOTO (ili bilo koje druge naredbe) i broja 10 ali ne smemo da ostavljamo prostor unutar same naredbe: GO TO 10 će izazvati poruku WHAT? i prekid rada programa). Smisao naredbe GOTO je sasvim jasan čak i za onoga ko nije imao nikakvih kontakta sa računarima: kada kompjuter naiđe na nju, preći će na izvršavanje linije broj 10. Na ovaj način smo sastavili program koji je "opasan": kada ga jednom startujemo on će se neprekidno izvršavati, stalno nas pitajući za podatke. Kada iscrpimo sve podatke, izvršavanje programa postaje bespredmetno i treba ga prekinuti. Jednostavno ćemo pritisnuti taster BRK i računar će ispisati BREAK 15 (što znači da je, u momentu kada smo ga zaustavili, izvršavao liniju broj 15) i uobičajeno READY. Zatim možemo da otkucamo NEW i tako obrišemo program, ali ćemo se za sada uzdržati od toga - program možemo da proširimo upoznajući dve nove naredbe.
Naredba GOTO se izvršava uvek na isti način - kada računar naiđe na nju, prelazi na izvršavanje naredbe čiji je broj naveden iza GOTO (možemo da napišemo i GOTO A ako je promenljivoj A ranije dodeljen broj linije na koju računar treba da ide, ali ćete ovo indirektno adresiranje, bar u početku, rede koristiti).
Postoji i naredba koja izaziva različito dejstvo u zavisnosti od nekih parametara - to je naredba IF. Iza IF se nalazi neka pogodbena relacija čiju tačnost računar ispituje. Da bismo ovo razumeli, dodaćemo u naš program naredbu 18 IF S=0 STOP. Treba, pre svega, da razumemo njenu sintaksu: STOP je naredba koju tek upoznajemo i koja jednostavno izaziva prekid rada. S=0 iza IF naredbe ne označava kao do sada da se promenljivoj S dodeljuje vrednost nula već navodi računar da ispita da li je vrednost promenljive S jednaka nuli. Ako jeste, izvršava se naredba STOP i računar prestaje sa radom, a ako nije, naredba STOP biva ignorisana i računar prelazi na izvršavanje sledeće naredbe.
Uz IF se često koristi i naredba ELSE. Možemo da unesemo novu naredbu 18 koja glasi:
18 IF S=0 STOP: ELSE PRINT "NASTAVLJAM SA RADOM"
Ukoliko je S zaista nula, računar će se zaustaviti. Ako nije, računar će izvršiti naredbu iza ELSE, a zatim nastaviti da izvršava program. Dve tačke ispred ELSE za sada morate da primite "zdravo za gotovo" - njihova uloga će vam postati jasna nešto kasnije.
Kakav je smisao promena koje su izvršene? Korisniku je sada pružena mogućnost da, kada računar traži podatak o rastojanju gradova, otkuca 0 i pritisne RET. Računar će prestati sa radom i ispisati READY, eliminišući potrebu za pritiskanjem tastera BRK.
Umesto znaka = u pogodbenoj relaciji može da se nađe znak manje, na primer:
IF A<B PRINT "PRVI JE MANJI" : ELSE PRINT "DRUGI JE MANJI ILI SU JEDNAKI"
ili veće:
IF X>0 PRINT "BROJ JE POZITIVAN": ELSE PRINT "BROJ JE NEGATIVAN"
Ako eksperimentima sa IF naredbama poremetimo naš program koji će nam za dalji rad biti potreban, moraćemo da obrišemo suvišne linije. Brisanje linije broj 18, na primer, je vrlo jednostavno: otkucamo 18 i pritisnemo RET. Metoda je pogodna, ali stvara jedan artefakt: želimo, na primer, da izračunamo koliko je 31/17 i zaboravimo da otkucamo PRINT. Računar će shvatiti da smo uneli programsku liniju broj 31 i obrisati eventualnu naredbu našeg programa koja ima isti broj, zamenivši je besmislenom linijom /17.
Već smo upoznali poruke WHAT? i HOW? koje bivaju ispisane na ekranu kada našem kompjuteru "nešto nije jasno". Poruka WHAT? se uglavnom odnosi na sintaksne greške: upotrebili smo naredbu koju naš računar ne poznaje ili smo valjanu naredbu napisali na pogrešan način (PRINT AB, na primer, nema smisla jer se množenje ne podrazumeva).
Poruku HOW? računar izdaje kada smo prekoračili opseg brojeva sa kojima se računa, kada smo naredbu GOTO (ili naredbu CALL koju tek treba da upoznamo) propratili linijskim brojem nepostojeće naredbe, kada smo pozvali previše potprograma i u sličnim situacijama.
Pored HOW? i WHAT?, postoji sistemska poruka sa kojom se nećemo sresti u skoroj budućnosti: SORRY. Ona nas obaveštava da je ono što smo želei i da učinimo sasvim moguće i ispravno napisano, ali da šest kilobajta (ili više ako smo proširili memoriju) nije dovoljno za smeštanje potrebnog programa ili podataka. Ako ovo uputstvo niste čitali "na preskok" upoznavši tako matrice A i X$, Jedini način da na ekranu vidite SORRY je da otkucate neki program koji ima više od pet kilobajta (računar "galaksija" u osnovnoj verziji ima 6 kilobajta RAM-a, ali se nešto više od jednog kilobajta koristi za neke interne potrebe računara).
Ukoliko računar prijavi grešku u okviru neke komande (otkucali smo, na primar, RAN umesto RUN), na ekranu će se pojaviti jednostavno WHAT?, HOW? ili SORRY. No, ako računar naiđe na grešku u programu on će, pored uobičajene poruke, ispisati čitavu liniju u kojoj je nastupila greška, stavljajući znak pitanja na ono mesto u liniji na kome je naišao na nerazumljiv simbol ili konstrukciju. Tako ne bi trebalo da bude teško da locirate grešku i, prekucavajući liniju ili koristeći komandu EDIT, dovedete program u ispravno stanje. U početku ćete verovatno mnogo grešiti kod oblika (sintakse) naredbi, ali će se docnije greške svesti na pogrešno kucanje i, na žalost, logičke greške (najopasnije su greške koje računar ne primećuje) - program se na prvi pogled korektno izvršava, ali su dobijeni rezultati pogrešni.
Znanje koje smo stekli nam omogućava da pišemo relativno komplikovane programe. Međutim, svaki put kada isključimo računar ti programi bivaju obrisani pa ih, po ponovnom uključivanju, moramo kucati, što je dosadan i nepotreban posao. Na svu sreću, računar "galaksija" može da se poveže sa kasetofonom i snima programe na standardne kasete. Programi snimljeni na kasetu nemaju imena pa može da se desi da, nekoliko meseci po snimanju, zaboravimo šta koji program radi. Zato je korisno na početku programa dodati liniju 1 ! OVO JE PROGRAM ZA RAČUNANJE...
Uzvičnik na početku ove linije govori računani da ona sadrži komentare koji su za njega nebitni: pri izvršavanju programa linije sa uzvičnicima bivaju ignorisane. Samo se po sebi razume da linija koja počinje uzvičnikom ne mora da bude prva u programu. Možemo, na primer, da pre svake grupe naredbi ubacimo komentar koji objašnjava njihovo dejstvo, ali treba imati u vidu da ovakve naredbe troše jedan bajt memorije po svakom upotrebljenom slovu što je, u uslovima ograničenog memorijskog prostora, često luksuz.
Kada pripremimo program za snimanje, jednostavno povezujemo odgovarajući džek sa priključkom MIC na kasetofonu, startujemo snimanje (dirke PLAY i REC), kucamo SAVE i pritiskamo RET (SAVE znači "sačuvaj"). Ekran će se potpuno zamračiti i ovakvo stanje će potrajati izvesno vreme. Kada računar snimi program, ekran će oživeti sa novom porukom READY. Sačekajmo još nekoliko trenutaka i prekinimo snimanje.
Posle snimanja je vrlo korisno izvršiti verifikaciju. To što se na ekranu pojavilo READY još ne mora da znači da je program verno prenet na kasetu: moguće je da je traka bila oštećena (ovo oštećenje može da bude prisutno i kod potpuno nove kaseta i ne mora biti uočljivo golim okom) ili da je kasetofon u nekom trenutku za momenat promenio brzinu. Ukoliko je nastupila neka greška ovog tipa, možemo da imamo velikih problema: isključimo računar i, posle pokušaja da učitamo program koji smo razvijali satima ili danima, utvrdimo da je on nepovratno izgubljen. Ako izvršimo verifikaciju, bićemo upozoreni na problem, pa ćemo moći da snimimo program na neku drugu kasetu.
Da bismo izvršili verifikaciju, moramo da premotamo kasetu na mesto koje prethodi početku snimljenog programa (veoma je preporučljivo posedovati kasetofon sa brojačem mada se i bez njega program prepoznaje po veoma karakterističnom zvuku; teško da ste ikada čuli neprijatnije zujanje) i zaustavimo ga. Povežimo utičnicu EAR na kasetofonu sa odgovarajućim priključkom računara, postavimo nivo zvuka blizu maksimuma i otkucajmo OLD? RET. Zatim startujemo kasetofon (taster PLAY) i čekamo. Može da se dogodi jedna od tri stvari:
Treća opcija pri radu sa kasetofonom je unošenje programa sa trake i verovatno smo je savladali pri korišćenju demo-kasete. Povežimo računar sa kasetofonom na način opisan kod opcije OLD?, otkucajmo OLD RET i startujmo traku (taster PLAY). Posle izvesnog vremena, program će biti učitan i na ekranu će pisati READY. Ukoliko je to jedini prisutni komentar, program je vrlo verovatno ispravno upisan i možemo da ga startujemo sa RUN. No, ako se pre READY našlo WHAT?, računar je primetio grešku pri upisu. Možemo da otkucamo LIST (ne zaboravimo da listanje programa traje samo dok držimo pritisnut taster RET) i pogledamo na šta program liči: sasvim je moguće da su grupe slova promenjene ili ispuštene. Najbolje je da u ovakvom slučaju pokušamo upisivanje još jedanput, menjajući jačinu tona u nadi da će sve biti u redu.
Ukoliko ne uspemo, ostaje nam da pokušamo da ispravimo program što može da bude vrlo neprijatno, pogotovu ako nismo njegov autor. Iz iskustva možemo da kažemo da se problemi ovoga tipa ne javljaju kod verifikovanih programa, osim kada su snimani na jednom a učitavanl sa drugog kasetofona. No, ako nam je neki program važan, želećemo da eliminišemo sve moguće izvore problema: u tom slučaju je korisno da snimimo program dva puta i to po mogućnosti na različite kasete. Obzirom da snimanje oduzima svega 2 minuta po kilobajtu, ova mera predostrožnosti neće predstavljati veliki gubitak vremena.
Na samom početku smo rekli da će ovo uputstvo biti organizovano "po krugovima": prvi krug predstavlja upoznavanje tastature i rad sa demo-kasetom, drugi osnove programiranja a treći, u koji upravo ulazimo, "luksuznije" naredbe i njihove verzije. Polazimo ponovo od PRINT.
Do sada smo iza PRINT stavljali tekst pod znacima navoda ili neki brojni izraz koji je izračunavan i prikazivan na ekranu. Na taj način smo u jednom redu mogli da ispišemo samo jednu rečenicu što je, ako ništa drugo, neestetski. U okviru jedne naredbe PRINT može da se nađe više promenljivih, izraza i komentara koji će biti prikazani u istom redu. Računar, međutim, zahteva da ovi komentari budu odvojeni jedan od drugog znakom ; ili običnim zarezom. Ukoliko su dve stavke u naredbi PRINT odvojene simbolom ; računar će ih nadovezati jednu na drugu, a ako je upotrebljen zarez - razmaknuće ih tako da druga počinje od osmog, šesnaestog ili dvadeset četvrtog mesta u redu. Ovu naredbu ćemo najbolje shvatiti na primeru.
Vratimo se na program za izračunavanje vremena putovanje između dva mesta i obrišimo linije 40, 50, 70 i 80 a zatim otkucajmo:
70 PRINT INT(T); "ČASOVA" ; M; "MINUTA."
Izvršimo program i unesimo uobičajene podatke za rastojanje Beograd-Dubrovnik i brzinu 800 km/h. Na ekranu će se pojaviti izveštaj:
0ČASOVA 27MINUTA.
Nije baš sjajno - redovi više nisu odvojeni, ali je računar očigledno preterao sa zbijanjem. Ispred svakog broja je, doduše, ostavljao po jedno prazno mesto (to mesto, u stvari, nije prazno - na njega bi bio smešten znak minus da je broj bio negativan), ali nam je neophodan blanko simbol i iza njega. Jedan od načina da resimo problem je da otkucamo:
70 PRINT INT(T), "ČASOVA,", M, "MINUTA."
ali će tako rečenica biti nelogično izdeljena na polja. Pravo rešenje je naredba:
70 PRINT INT(T); " ČASOVA"; M; " MINUTA."
Upoznavanjem simbola , i ; još nismo iscrpli sve mogućnosti naredbe PRINT: ona može da posluži i za pisanje teksta na proizvoljnom delu ekrana. Da bi ovakvo pisanje imalo nekog smisla, treba najpre da upoznamo naredbu za brisanje čitavog sadržaja ekrana. Ovaj efekat se u komandnom modu postiže istovremenim pritiskom na tastere SHIFT i DEL, a u programskom izvršavanjem naredbe HOME (HOME nalaže računaru da "vrati kurzor kući" koja se nalazi u levom gornjem uglu ekrana. Pritom se čitav sadržaj ekrana briše).
Ekran je podeljen na 16 redova, a svaki od tih redova na 32 mesta. Mesta su numerisana brojevima od 0 (karakter u levom gornjem uglu ekrana) do 511 (karakter u desnom donjem uglu). Naredba PRINT AT može da počne da štampa od proizvoljnog mesta koje je navedeno iza AT; pun oblik naredbe je, dakle, PRINT AT 32, "RAČUNAR GALAKSIJA" - u ovom primeru tekst "računar galaksija" se pojavljuje na početku drugog reda, dok sadržaj prvog ostaje nepromenjen.
Pri prikazivanju nekih komplikovanijih tekstova treba posebno paziti na jednu stvar: ako najpre ispisujemo tekst u desnoj polovini neke linije, a zatim u levoj, neka PRINT AT naredba može lako da poremeti postojeći sadržaj nekog reda. Da se obezbedimo od toga, završavaćemo svaku naredbu PRINT znakom ; (pišemo, na primer, PRINT AT 300, "RAČUNAR";).
Prethodno poglavlje nije razjasnilo sve oznake sa mape ekrana: tamo su redovi podeljeni na po tri dela. a kolone na po dva. Na ovaj način su dobijene takozvane tačke ili "pikseli" kojih ima po 64 u svakom od 48 redova. Svaku ovu tačku (to je, zapravo, kvadratić) možemo slobodno da osvetlimo ili zatamnimo koristeći naredbe DOT i UNDOT (DOT znači tačka). Treba odmah da uočimo razliku između "tački" i karaktera: tačka je osvetljena ili zatamnjena. dok su karakteri daleko raznovrsniji (sve slova, brojevi, interpunkcijski znaci, prazno mesto...); karakteri su adresirani brojevima od 0 do 511, a tačke na mnogo komforniji način - za obraćanje svakoj navodimo red u kome se ona nalazi i njen položaj u tom redu; najzad, tačke su šest puta manje od karaktera, pa njima mogu da se dobijaju bolje slike na ekranu.
Naredbu DOT prate koordinate tačke koju treba osvetliti (DOT 0,0, na primer, osvetljava tačku u levom gornjem uglu, DOT 1,0 tačku desno od nje, DOT 31,23 tačku u sredini ekrana a DOT 63,47 tačku u desnom donjem uglu). Naredba UNDOT ima obrnuto značenje: ona zatamnjuje tačku čije su koordinate navedene na isti način. Program:
10 HOME 20 DOT 31,23 30 DOT 40,40 40 UNDOT 31,23 50 UNDOT 40,40 60 GOTO 20
neprekidno uključuje i isključuje tačke čije su koordinate (31,23) i (40,40).
Naredba DOT može da se upotrebi i unutar IF, ali tada ima sasvim drugačiji smisao: linije 100 IF DOT 10,10 GOTO 1000 ne osvetljava tačku 10,10 nego ispituje da li je ta tačka osvetljena pa, ako jeste, prelazi na liniju broj 1000.
Ukoliko je neka tačka osvetljena, primena naredbe DOT na nju neće promeniti ovo stanje; slično tome, UNDOT neće promeniti status tačke koja je već zatamljena. Naredbe DOT i UNDOT su veoma značajne i zaslužuju da ih upoznamo na dodatnim primerima. Ipak, sačekaćemo izvesno vreme obzirom da je za ovakvu demonstraciju neophodno realizovati cikluse (petlje), a to ćemo biti u stanju da uradimo daleko bolje kada upoznamo grupu novih naredbi.
Često je potrebno da se određeni skup instrukcija ponovi određen broj puta i da se, zatim, nastavi sa izvršavanjem programa. Pretpostavimo da nam je potreban program koji izračunava faktorijel nekog broja. Faktorijel se definiše kao proizvod svih prirodnih brojeva zaključno sa brojem čiji se faktorijel traži (faktorijel broja 6 je, na primer, 1*2*3*4*5*6=720). Potrebno je. dakle, da počnemo od broja 1 i množimo ga redom sa 2, 3, 4... sve do nekog n. Ovaj problem može, primenom naredbe IF, da se reši na sledeći način:
10 INPUT N 20 Y=1 30 I=0 40 I=I+1 50 Y=Y*I 60 IF I<N GOTO 40: ELSE PRINT Y
Vidimo da je bilo neophodno uvesti naredbu koja inicijalizuje brojač (I=0), naredbu za povećavanje tog brojača kao i naredbu kojom ispitujemo da li je posao završen. Ovakvo rešenje, naravno, može da se primeni i u mnogo složenijim slučajevima, ali su takvi programi teži za sastavljanje (da smo, na primer, promenili redosled naredbi 40 i 50 u IF komandi bi morali da poredimo I sa N+1), manje pregledni i sporije rade.
Naredba FOR...TO i odgovarajuća naredba NEXT su pripremljene tako da olakšaju realizaciju ciklusa. Pre nego što pređemo na njihov detaljan opis, videćemo kako se prethodni problem rešava njihovom primenom:
10 INPUT N 20 Y=1 30 FOR I=1 TO N 40 Y=Y*I 50 NEXT I 60 PRINT Y
Dobijeni program ima šest naredbi kao i prethodni ali, u celini gledano, zauzima manje memorije i brže se izvršava. Čak i ako vam je ovo prvi susret sa naredbama FOR-TO-NEXT, verovatno ste shvatili da se ciklus odvija između naredbi 30 i 50. Računar, po nailasku na naredbu 30, "inicira brojač" odnosno dodeljuje promenljivoj I sadržaj 1 (da je naredba 30 glasila FOR I=2 TO N promenljivoj bi bio dodeljen sadržaj 2 i tome slično) i "pamti" mesto na kome je ciklus počeo. Izvršavanje programa se nastavlja sasvim normalno sve dok računar ne naiđe na naredbu NEXT I ("sledeće I"). U tom trenutku on dodaje jedan promenljivoj I i ispituje da li se došlo do N. Ako nije, ciklus automatski počinje od početka. Ako jeste, naredba NEXT I se preskače i računar prelazi na izvršavanje naredbe 60.
U okviru naredbe FOR može da se nalazi i opcija STEP (korak). Da smo, umesto naredbe 30, otkucali FOR I=1 TO N STEP 2 računar bi, svaki put kada naiđe na naredbu NEXT I, uvećavao sadržaj promenljive I za dva pa bi računao proizvod Y=1*3*5*7*...N (za slučaj da je N neparan broj ovo bi bila funkcija bez posebnog imena koja se obeležava sa N!!, a ako je N paran rezultat ne bi imao matematičko značenje). Da bi program računao proizvod 2*4*6*8*...N = N!! (za parne brojeve), naredbu 30 bi trebalo izmeniti tako da glasi FOR I=2 TO N STEP 2.
Nema nikakve prepreke da STEP bude negativan. Program:
10 FOR I=30 TO 0 STEP -1 20 PRINT I 30 NEXTI
će brojati od 30 do 0 i to unazad. Ipak, postoji jedno ograničenje vezano za naredbe FOR-STEP-NEXT koje treba imati u vidu ako u praksi verovatno neće izazvati nikakve probleme: konstante ili promenljive koje figurišu u ovim naredbama moraju da budu celi brojevi: ako to nisu, računar će sam "odseći" decimale. Naredba FOR I=0.5 TO 11.5 STEP 0.5 će se izvršavati nekorektno obzirom da će računar podrazumevati STEP 0.
Svi rezultati koje računar daje su precizne funkcije ulaznih veličina. Računar "galaksija" je opremljen jednom naredbom koja, na prvi pogled; odstupa od ove definicije: ona je namenjena generisanju slučajnih brojeva. Slučajni brojevi koje računar generiše su, u stvari, pseudoslučajni - rezultat su komplikovanih operacija nad sadržajima nekih sistemskih promenljivih i korisnik nema nikakvog načina da ih predvidi; za njega su, dakle, oni slučajni u dovoljnoj meri.
Otkucajmo NEW i unesimo jednostavni program:
10 PRINT RND 20 GOTO 10
i startujmo ga sa RUN. Na ekranu će velikom brzinom početi da se pojavljuju brojevi koje, istini za volju, nećemo stići ni da pročitamo. Došao je, dakle, pravi trenutak da otkrijemo poslednju tajnu tastature našeg računara. Pritisnimo taster DEL i držimo ga pritisnutog. Događaji na ekranu su se najednom "zamrzli" - izgleda da je izvršavanje programa zaustavljeno. Prvi utisak ovde ne vara: izvršavanje programa je zaista zaustavljeno i taj prekid će trajati sve dok je taster DEL pritisnut; njegovim otpuštanjem program nastavlja da se izvršava. Treba odmah uočiti razliku između DEL i BRK: po pritisku na BRK izvršavanje programa je trajno prekinuto i na ekranu piše READY, dok pritisak na DEL samo zaustavlja rad računara koji se nastavlja po otpuštanju tastera.
Kada znamo kako da prekinemo rad programa, možemo da se usresredimo na naredbu RND. Na ekranu se nalaze brojevi koje mi unapred ne možemo da predvidimo - oni su slučajan izbor vašeg računara. To su, u svakom slučaju, brojevi između O i 1, koji imaju po pet-šest decimala (ne treba se zbuniti ako neki od njih bude u eksponencijalnoj notaciji).
U praksi nam najčešće nisu potrebni decimalni brojevi između O i 1, nego celi brojevi između nekih a i b (ako, na primer, hoćemo da simuliramo kockicu za igru "čoveče, ne ljuti se" trebaju nam slučajno izabrani brojevi od 1 do 6). Prava je prilika da se podsetimo naredbe INT i naučimo formulu R=INT(RND*(B-A)+A). Njenom primenom računar generiše cele slučajne brojeve između A i B (ovi brojevi mogu da budu jednaki A ali ne mogu da budu jednaki B; matematičari bi rekli da se ovi brojevi nalaze u intervalu [A,B).
Sastavimo program koji bi demonstrirao naredbe DOT i UNDOT. Najpre ćemo da obrišemo ekran, a zatim osvetljavati slučajne tačke. Ukoliko naiđemo na tačku koja je već osvetljena, zatamnićemo je:
10 HOME 20 X=INT(RND*64) 30 Y=INT (RND*48) 40 IF DOT X, Y UNDOT X,Y: ELSE DOT X,Y 50 GOTO 20
Ako imate problema sa razumevanjem programa, moraćete da se vratite na poglavlje "crtanje po ekranu" i "naredba IF". Ako ga razumete, pokuštajte da ga dopunite tako da se u desnom gornjem uglu ekrana neprekidno ispisuje broj osvetljenih taćaka. Ukoliko je generator slučajnih brojeva dobar, posle izvesnog vremena bi trebalo da se uspostavi "dinamička ravnoteža" - stanje u kome se približno jednak broj tačaka osvetljava i zatamnjuje u nekom intervalu.
U mnogim programima se javljaju grupe instrukcija koje se ponavljaju. Računar "galaksija", na primer, nije opremljen logaritamskom funkcijom, pa će mnogi poželeti da je dodaju. Oni će, dakle, koristeći neku numeričku formulu ili iterativni algoritam sastaviti program koji izračunava log(x) za zadato x i poželeti da ga koriste u mnogim prilikama. Ako, međutim, navode čitav skup instrukcija svaki put kada im logaritam zatreba, neće daleko stići: izdaće ih strpljenje ili memorija računara. Zato se ovakav skup instrukcija odvaja u poseban program koji se iz glavnog programa poziva kao potprogram.
Potprogram se ne započinje ni na kakav poseban način - bitno je samo zapamtiti broj njegove prve linije. Na kraju potprograma mora da se nađe naredba RETURN (= vrati se) koja nalaže računaru da nastavi sa izvršavanjem glavnog programa. U glavnom programu se, kada je god potprogram potreban, piše naredba CALL koju prati broj prve linije potprograma (npr. CALL 1000).
Sve će biti mnogo jasnije kada pogledamo primer. Sastavićemo program koji pravom linijom spaja tačke čije su koordinate zadate, a zatim ćemo ga upotrebiti kao potprogram da uokvirimo ekran. Evo, najpre, potprograma koji je nešto pojednostavljen pretpostavkom da su dve tačke koje treba spajati nalaze na istoj horizontali ili vertikali. Ulazne veličine su brojevi X, Y, Z i T koji daju koordinate prve (X,Y) odnosno druge (Z,T) tačke; obzirom na uvedeno ograničenje mora da bude X=Z ili Y=T.
100 IF X=Z FOR I=Y TO T: DOT X,I: NEXT I: ELSE FOR I=X TO Z: DOT I,Y: NEXT I 110 RETURN
U potprogramu ima noviteta: napisana je jedna linija koja se sastoji od više naredbi razdvojenih znakom : Na ovaj način možemo da postupamo kada god želimo da sledimo memoriju ili kada nam se čini da grupu naredbi treba "spakovati" u isti red pošto predstavljaju logičku celinu. Postoje, ipak, dva razloga zbog kojih čitav program ne može da bude smešten u jednu programsku liniju: maksimalna dužina linije koju računar "galaksija" može da primi je četiri reda, a naredba koja se ne nalazi na početku neke linije ne može da se dosegne pomoću naredbi GOTO i CALL.
Evo, najzad, i programa koji će uokviriti ekran koristeći dati potprogram:
5 HOME 10 X = 0: Y=0: Z=63: T=0: CALL 100 20 Y=47: T=47: CALL 100 30 X=63: Y=0: CALL 100 40 X=0: Y=0: Z=0: CALL 100
Vidi se da pre svakog poziva potprograma nisu postavljeni sadržaji svih promenljivih. Razlog je u tome što se ovi sadržaji u toku potprograma ne menjaju, pa nema potrebe ponavljati iste naredbe i razbacivati memoriju.
Testiranje programa (koji je, jasno, povezan sa potprogramom) u prvom trenutku prolazi povoljno: računar uokviruje ekran. No, posle toga nastupa greška i to u naredbi RETURN. Zašto? Računar je četiri puta pozvao i izvršio potprogram i tako završio naredbu 40. Posle toga je, jednostavno, počeo sa izvršavanjem naredbe 100 koja sledi iza nje, još jednom povukao istu liniju i naišao na RETURN. Pošto potprogram nije pozivan, računar nije znao kuda da se vrati (RETURN = vrati se) pa je prijavio grešku.
Prva modifikacija u cilju rešavanja ovog problema je da se doda naredba 50 STOP (sećate li se naredbe STOP?). Solucija je dobra samo na prvi pogled: kada računar naiđe na STOP, on prestaje sa izvršavanjem programa i izdaje poruku READY kvareći tako jedan deo teškom mukom nacrtanog okvira. Zato ćemo dodati naredbu 50 GOTO 50 koja navodi računar da se neprekidno vrti u "mrtvoj petlji" ne kvareći izgled ekrana (ovo je takozvano "dinamičko zaustavljanje"). Tako možemo da se divimo uokvirenom ekranu i pritisnemo taster BRK tek kada nam on dosadi.
U okviru potprograma može da se pozove sledeći potprogram, baš kao što u okviru jednog ciklusa (petlje) može da se započne drugi, ali je broj ovakvih poziva ograničen na 13. U praksi se sigurno neće događati da vam je potrebno više od trinaest nivoa potprograma, ali morate da pazite na početničke greške poput ove:
10 CALL 100 100 A=... 150 GOTO 10
Na ovaj način računar neće nikada nailaziti na naredbu RETURN, pa će stalno pozivati nove i nove potprograme sve dok ne dođe do greške. Ovakvu grešku je često teško otkriti: program dobro radi jedno vreme a onda, u nepravilnim intervalima, na ekranu ugledamo poruku HOW?
Jedini način za ispravljanje grešaka u programu koji smo do sada upoznali bio je prekucavanje linije, što je neekonomična i neobično "nervirajuca" solucija (u to ste se i sami uverili, pogotovu ako ste pisali neki program koji koristi naredbu PRINT AT). Računar "galaksija" poseduje i specijalnu komandu EDIT koja je namenjena ispravkama. Ona ne sme da se nađe u programu (blisko je pameti da programi mogu da se edituju samo u komandnom modu) i treba da je prati linijski broj naredbi koja se edituje. Pritiskom na RET računar briše ekran i u njegovim prvim redovima ispisuje liniju koju smo poželeli da menjamo. Kurzor se nalazi na njenom kraju. Koristeći tastere ß i à možemo da ga pokrećemo u okviru naredbe sve dok ne dođemo do mesta na kome treba da ispravimo grešku. Ako želimo da izbacimo slovo koje se nalazi desno od kurzora, treba jednostavno da pritisnemo taster DEL. Ukoliko želimo da ubacimo novi deo programske linije, jednostavno ga otkucamo i on će da bude umetnut počevši od tekuće pozicije kurzora. Pri pomeranju kurzora i brisanju pojedinih, delova programske linije, taster REPT (autorepeat) dolazi do punog izražaja.
Kada smo završili sa ispravkama neke linije (nema nikakve prepreke da, u toku ispravki, nekoliko puta menjamo isti deo linije), možemo da pritisnemo RET i tako se saglasimo sa izvršenim izmenama ili da pritisnemo BRK i tako naložimo računaru da ignoriše izmene i ostavi liniju u stanju u kom je bila pre nego što je editovanje započeto.
Pri editovanju se pojavljuje i jedan artefakt: nema prepreke da promenimo i sam broj programske linije pod uslovom da u okviru njega ne ostavljamo razmake (broj linije 10 02 nije dopušten). Kada pritisnemo RET, računar će u memoriju uneti novu programsku liniju dok stara neće biti ni promenjena ni izbrisana. Ovo pruža mogućnost "umnožavanja" jedne naredbe u okviru programa bez potrebe da se ona svaki put iznova kuca.
Do sada smo upoznali promenljive A, B, C,... Y i Z pomoću kojih smeštamo podatke u memoriju računara. Ovi podaci su međusobno logički odvojeni: promenljiva V, na primer, može da čuva podatak o brzini nekog objekta, F o sili koja deluje na njega, T o vremenu i slično. Ponekad smo suočeni sa potrebom da obradimo grupu međusobno srodnih podataka. Želimo, na primer, da sortiramo podatke po veličini. Besmisleno je da koristimo promenljive A, B,... obzirom da bismo u programu morali da navedemo veliku grupu naredbi koja bi poredila sadržaj svake promenljive sa sadržajima svih ostalih. Osim toga, šta da radimo ako treba da sortiramo više od 26 podataka?
Računar "galaksija" može da radi sa numeričkim nizom A(I) (ne treba ga mešati sa promenljivom A). Elementi ovog niza su A(0), A(1), A(2) itd - njihov broj je ograničen jedino raspoloživom memorijom. Iako ćemo mapu memorije objaviti tek docnije, potrebno je da već sada u grubim crtama objasnimo razmeštaj elemenata niza A(I) da bi se shvatile njegove promenljive dimenzije. Zamislimo da se od početka memorije prema kraju smešta BASIC program a od kraja memorije prema početku elementi niza A(I). Svaki element (A(0), A(1),...) zauzima po četiri bajta. Jasno je da se, negde na sredini memorije, niz A(I) i BASIC program "susreću". Računar smatra da je BASIC program značajniji i ograničava niz A(I) tako da popunjava samo slobodan deo memorije. Ukoliko pokušamo da menjamo vrednost nekog elementa niza A(I) koji bi promenio bejzik program, računar će prekinuti sa radom i izdati poruku SORRY.
Kako da saznamo sa koliko elemenata niza A(I) raspolažemo? Jedan od načina je da otkucamo jednostavan program:
10 I=0 20 A(I)=A(I) 30 I=I+1 40 GOTO 20
i startujemo ga sa RUN. Kada se na ekranu pojavi poruka SORRY, otkucamo PRINT I i saznamo broj prvog nepostojećeg elementa niza. Ovaj način nije naročito dobar, ponajviše zato što u postojeći bejzik program treba da dodajemo nove naredbe koje ga nepotrebno produžavaju i tako smanjuju broj članova niza. Zato je dizajnirana naredba MEM. PRINT MEM prikazuje na ekranu broj bajtova memorije koji su slobodni da prime niz A(I). Kako svaki element ovog niza zauzima po četiri bajta, PRINT MEM/4 će dati maksimalan broj elemenata koji nam stoji na raspolaganju.
Evo, na posletku, i programa koji će olakšati razumevanje rada sa nizom A(I). Program uređuje grupu brojeva u rastući niz i prikazuje dobijene rezultate. Korišten je umereno dobar algoritam (postoje, naravno, i daleko bolji, ali su manje razumljivi za početnike), pa program unekoliko ilustruje brzinu rada računara "galaksija".
10 PRINT "KOLIKO IMA BROJEVA": INPUT N 20 FOR I=1 TO N: INPUT A(I): NEXT I 30 FOR I=1 TO N-1: FOR J=I+1 TO N 40 IF A(I)< A(J) GOTO 60 50 P=A(I): A(I)=A(J): A(J)=P 60 NEXT J: NEXT I 70 FOR I=1 TO N: PRINT A(I),: NEXT I
Do sada smo radili isključivo sa brojevima, dok smo komentare pisane standardnim srpskohrvatskim jezikom umetali isključivo između navodnika u PRINT naredbama i iza znaka !. Računar "galaksija", međutim, poseduje i mogućnost rada sa nizovima znakova (pod znakom ovde podrazumevamo slovo, broj, interpunkcijski znak i prazan prostor) ili, kratko rečeno, alfanumericima.
Poput brojeva, za smeštanje reci koristimo promenljive koje se nazivaju alfanumeričkim. U programu se prepoznaju po tome što se iza imena svake nalazi oznaka za dolar ($). U svaku alfanumeričku promenljivu može da se smesti tekst koji ima najviše 16 znakova, računajući i razmake, interpunkcijske znakove i slično.
Postoje dve fiksne alfanumerićke promenljive koje se nazivaju X$ i Y$. Njima možemo da dodeljujemo vrednosti korišćenjem standardnih bejzik naredbi, pri čemu ne smemo da zaboravimo da sadržaj uvek (osim kod izvršavanja naredbe INPUT) stavljamo između znakova navoda. Možemo, na primer, da napišemo: X$="ALFANUMERIK", a zatim PRINT X$ i na ekranu će se pojaviti reč ALFANUMERIK.
Pored uobičajenog prenošenja sadržaja jedne promenljive u drugu (naredba X$=Y$), raspolažemo i funkcijom CHR$. Ovu funkciju prati argument u zagradi koji je broj između 0 i 255. Ovaj broj dobijamo iz tablice koja sledi. Tablicu sličnu ovoj možete da dobijete na ekranu i ako izvršite sledeći BASIC program:
10 FOR I=32 TO 255 20 PRINT I;" ";CHR$(I), 30 NEXT I
32 | blanko |
33 | ! |
34 | " |
35 | # |
36 | $ |
37 | % |
38 | & |
39 | spec |
40 | ( |
41 | ) |
42 | * |
43 | + |
44 | , |
45 | - |
46 | . |
47 | / |
48 | 0 |
49 | 1 |
50 | 2 |
51 | 3 |
52 | 4 |
53 | 5 |
54 | 6 |
55 | 7 |
56 | 8 |
57 | 9 |
58 | : |
59 | ; |
60 | < |
61 | = |
62 | > |
63 | ? |
64 | spec |
65 | A |
66 | B |
67 | C |
68 | D |
69 | E |
70 | F |
71 | G |
72 | H |
73 | I |
74 | J |
75 | K |
76 | L |
77 | M |
78 | N |
79 | O |
80 | P |
81 | Q |
82 | R |
83 | S |
84 | T |
85 | U |
86 | V |
87 | W |
88 | X |
89 | Y |
90 | Z |
91 | Č |
92 | Ć |
93 | Ž |
94 | Š |
95 | _ |
Naredba PRINT CHR$(65) će, na primer, pokazati slovo A. Funkciju CHR$ koristimo pri formiranju složenih arfanumerika koje se obavlja sabiranjem. Alfanumerici, jasno, nisu brojevi koje ima smisla sabirati - iako se za sabiranje alfanumerika koristi isti znak kao i za sabiranje brojeva (plus), pojam ima sasvim drukčiji smisao: alfanumerici se nadovezuju. Ako, na primer, napišemo X$="GALA"+CHR$(75)+"SIJA" a zatim PRINT X$, na ekranu će se pojaviti reč GALAKSIJA obzirom da CHR$(75) odgovara slovu K.
Na prvi pogled bi se reklo da naredbe poput gornje nemaju velikog smisla: zar nije jednostavnije napisati X$="GALAKSIJA"? No, posmatrajmo naredbu X$=CHR$(34)+"GALAKSIJA"+CHR$(34). Po njenom izvršavanju PRINT X$ daje reč "GALAKSIJA" koje se nikako drukčije nije mogla dobiti obzirom da znaci navoda ne mogu da budu deo nekog teksta pošto označavaju njegov početak i kraj.
U okviru naredbe X$=... može da se nalazi promenljiva Y$ pa čak i sama promenljiva X$, ali uz jedno ograničenje: ona mora da bude sasvim na početku izraza. Dakle, naredba X$=X$+Y$ će nadovezati sadržaj promenljive Y$ na promenljivu X$, ali će X$=Y$+X$ izazvati neželjeno ponašanje (probajte!). Slično; može da se napiše Y$=Y$+CHR$(60)+X$ ali ne i Y$=CHR$(99)+Y$+X$.
Ako nam dve alfanumeričke promenljive nisu dovoljne, možemo da definišemo alfanumerički niz koji se zove X$(I) (ne treba ga, ponovo, mešati sa promenljivom X$). Na početku programa treba da stavimo naredbu ARR$(n) gde je n broj elemenata niza X$(I) koji nam je potreban (svaki od tih elemenata može da se upotrebi za čuvanje 16 znakova), a zatim možemo da postavljamo i menjamo sadržaje nekih od tih elemenata, koristeći ranije izložena pravila za sabiranje (nadovezivanje) alfanumerika i funkciju CHR$.
Ponekad može da nam zatreba da uporedimo neka dva alafanumerika da bismo saznali da li su oni jednaki. Afanumerici se smatraju jednakim ako sadrže iste znakove na istim mestima i ako su jednake dužine. U tom smislu je "ABC"="ABC" ali nije "ABC"="ABC ". Za poređenje alfanumerika koristimo funkciju EQ; napišimo:
100 IF EQ Y$,X$(10) GOTO 1000: ELSE PRINT "RAZLIČITI SU"
i računar će, ako su sadržaji promenljivih X$(10) i Y$ jednaki, preći na naredbu 1000, a ako nisu prikazati na ekranu RAZLIČITI SU i nastaviti sa radom. Možemo, jasno, da poredimo promenljive X$ i Y$, bilo koja dva elementa alfanumeričkog niza X$(I) ili bilo koju kombinaciju.
Za početnika je teško da pravi razliku između numeričkih i alfanumeričkih promenljivih - naredba X$="123" je sasvim različita od naredbe X=123. U prvom slučaju smo dobili niz znakova koji ne podleže aritmetičkoj obradi (ako izuzmemo pomenuto nadovezivanje), a u drugom operativni broj 123. Promenljive X$ i X su različite i računar ih čuva na raznim mestima u memoriji.
U nekim slučajevima može da bude korisno da se alfanumerik koji se sastoji od cifara pretvori u broj. Za to nam služi naredba VAL. Otkucajmo program:
10 INPUT X$ 20 PRINT VAL(PTR X$)+1
i startujmo ga sa RUN. Kada računar zatraži od nas da otkucamo X$, odgovorimo sa 25 (posle toga, naravno, pritiskamo RET). Trenutak docnije na ekranu se pojavio broj 26. Računar je, dakle, naišao na naredbu PRINT, našao VAL (vrednost) afanumeričke promenljive X$ i dodao joj jedan, dobivši rezultat 26. Napominjemo da sintaksa naredbe VAL koja je ovde korišćena ne može da bude jasna čitaocu koji nije čitao "na preskok" jer se u njoj koristi naredba PTR koju još nismo obradili. Za sada je, ipak, primite onakvu kakva jeste, a docnije će sve postati jasnije.
Kada unosimo X$, ne moramo da se ograničimo samo na brojeve: možemo kucamo čitav izraz, koristeći imena promenljivih i pazeći da on nema više od 16 simbola. Naredba VAL (PTR X$) će izračunati vrednoet ovog izraza i pretvoriti ga u broj.
Računar "galaksija" je opremljen vrlo preciznim kvarcnim časovnikom koji će, po svoj prilici, naći upotrebu kao štoperica. Ovaj časovnik može, ako mu to naredimo, da prikazuje samo sate i minute, ali može da bude i toliko precizan da prikazuje i pedesetinke sekunde. Za rad sa njim je potrebna promenljiva Y$ i naredbe DOT* i UNDOT*.
Najpre treba da postavimo tekuće vreme. Napišemo (u komandnom modu ili u programu) Y$="21:45:20:50" i pritisnimo RET (ako želimo da časovnik pokazuje samo sate i minute, napisaćemo Y$="21:45" a ako želimo sate, minute i sekunde, Y$="21:45:20"; ukoliko želimo da merimo vreme, napisaćemo Y$= "00:00:00:00"). Računar će smatrati da je sada tačno 21 čas, 45 minuta, 20 sekundi i 50 stotinki, ali njegov časovnik još neće započeti da radi: treba da ga startujemo sa DOT*. Ako poželimo da zaustavimo časovnik, upotrebićemo naredbu UNDOT*. Evo, na primer, programa koji u desnom gornjem, uglu ekrana neprekidno prikazuje tačno vreme:
10 HOME:Y$="10:15:20:15" (ili bilo koje drugo vreme) 20 DOT* 30 PRINT AT 20; Y$; 40 GOTO 30
Ovako rešen časovnik ima tri mane: prva je što se isključivanjem računara briše tekuće vreme, druga što časovnik ne radi dok se program snima ili učitava sa kasete, a treća što, ako je u programu korišćena naredba DOT*, moramo da pazimo da li su dve tačke treći simbol promenljive Y$. Ako jesu, računar će smatrati da Y$ sadrži tekuće vreme, pa će menjati njen sadržaj što može da proizvede neželjene posledioe.
Do sada smo primali podatke isključivo pomoću naredbe INPUT, a dodeljivali sadržaje pomenljivima i pomoću komandi tipa A=123. Često nam je, međutim, u početku programa neophodno da dodelimo vrednosti mnogobrojnim promenljivima i elementima matrice A. U takvim slučajevima naredba TAKE može da bude neobično praktična.
Iza TAKE se navodi lista promenljivih kojima treba dodeliti vrednosti. To mogu da budu numeričke promenljive, elementi matrice A, alfanumeričke promenljive ili elementi niza X$ (ako je ovaj prethodno definisan sa ARR$). Elementi ove liste se odvajaju zarezima. U početku programa će se, dakle, često naći naredba:
10 TAKE A,B,C,X,Z
Odakle računar može da uzme (TAKE=uzmi) ove podatke? U okviru programa mora na proizvoljnom mestu (pre ili posle naredbe TAKE, po želji) da se nađe jedna ili više linija koje počinju simbolom #. Ovaj simbol obaveštava računar da se u linijama koje ga sadrže nalazi tablica podataka koji će biti pročitani sa TAKE. Brojevi i reći u ovim tabelama treba da budu razdvojeni zarezima.
Ako se, na primer, u programu nalazi naredba:
100 # 10, 20, 30, -11, 79, 779
a računar izvrši ranije navedenu TAKE naredbu, promenljiva A će dobiti vrednost 10, promenljiva B dvadeset itd. promenljiva Z će dobiti vrednost 79. Računar će "zapamtiti" dokle je došao sa čitanjem podataka pa će. ako naiđe na naredbu 50 TAKE L, promenljivoj L dodeliti broj 779.
Ako se u listi iza # nalazi manje podataka nego što se u TAKE naredbi traži, računar će prijaviti grešku. Obrnuto, ukoliko se ne učitaju svi podaci iz liste, računar neće reagovati, što je i prirodno.
Ponekad može da bude potrebno da se u okviru programa ponovo uzimaju isti podaci (potrebne su, na primer, početne vrednosti za neku igru, a želimo da se, po završetku svake partije, automatski započne nova sa istim početnim parametrima). U tom slučaju, pre prve naredbe TAKE koja se nalazi u programu treba da stavimo TAKE 0 (nula a ne slovo O). Na taj način će računar započeti uzimanje podataka od samog početka prve # liste. Umesto nule, iza TAKE možemo da stavimo neki drugi broj. U tom slučaju računar pronalazi liniju sa tim brojem i priprema se da u sledećoj TAKE naredbi uzme podatke iz # liste koja se nalazi u toj liniji. Ukoliko u navedenoj naredbi nema # liste, računar će pronaći prvu sledeću takvu listu, odakle vidimo da je TAKE 0 samo specijalni slučaj naredbe TAKE n. Naredba RUN automatski izvršava TAKE 0.
U nekim igrama su potrebne brze reakcije igrača - naredba INPUT postaje sasvim nepogodna. INPUT A, na primer, prekida rad programa sve dok korisnik ne unese neki broj i ne pritisne RET, što znači da je vreme za razmišljanje neograničeno. Osim toga, naredba INPUT ispisuje na ekranu znake koje korisnik kuca i tako kvari sliku koja je na njemu prikazana. Zato računar "galaksija" poseduje naredbu KEY.
Taster | N |
A | 1 |
B | 2 |
C | 3 |
D | 4 |
E | 5 |
F | 6 |
G | 7 |
H | 8 |
I | 9 |
J | 10 |
K | 11 |
L | 12 |
M | 13 |
N | 14 |
O | 15 |
P | 16 |
Q | 17 |
R | 18 |
S | 19 |
T | 20 |
U | 21 |
V | 22 |
W | 23 |
X | 24 |
Y | 25 |
Z | 26 |
á | 27 |
â | 28 |
ß | 29 |
à | 30 |
blanko | 31 |
0 | 32 |
1 | 33 |
2 | 34 |
3 | 35 |
4 | 36 |
5 | 37 |
6 | 38 |
7 | 39 |
8 | 40 |
9 | 41 |
; | 42 |
: | 43 |
, | 44 |
= | 45 |
. | 46 |
/ | 47 |
RET | 48 |
RPT | 50 |
LIST | 52 |
SHIFT | 53 |
Iza KEY se, u zagradi, nalazi broj koji se određuje iz tablice. Vidi se da svakom tasteru odgovara neki broj, pa postaje jasno za šta KEY(n) služi: ova naredba omogućava ispitivanje da li je neki taster pritisnut ili nije. Posmatrajmo, na primer, program:
10 IF KEY (1) PRINT "PRITISNUO SI A": ELSE GOTO 10
Program se neprekidno izvršava sve dok korisnik ne pritisne taster A, zatim se na ekranu pojavljuje odgovarajući komentar, posle čega računar prestaje sa radom. Na demo kaseti je naredba KEY mnogo eksplibatisana naročito za ispitivanje pritiska neke od strelica (u okviru naredbe INPUT čak se i ne može uneti strelica kao karakteri), pa će analiza programa sa nje pružiti neiskusnom korisniku predstavu o značaju ove naredbe.
KEY(0) ima funkciju koja je u mnogo čemu različita od funkcije do sada opisane naredbe KEY. KEY(0), naime, daje kod znaka koji je pridružen tasteru koji korisnik pritisne (kod se računa prema tabeli koja je data u diskusiji naredbe CHR$). Naredba IF KEY(0) se, dakle, neće pravilno izvršavati, ali zato može da se napiše A=KEY(0). Kada računar, u toku izvršavanja programa, naiđe na ovu naredbu, on će čekati sve dok korisnik ne pritisne neki taster, a zatim će vrednost koda (broj 80 ako korisnik pritisne taster P, na primer) znaka koji je ispisan na tom tasteru pridružiti promenljivoj A.
10 HOME 20 PRINT CHR$(KEY(0)); 30 GOTO 20
prenosi na ekran slova koja korisnik kuca pa se tako. na neki način, imitira "normalan" rad računara. Međutim, program:
10 X$="" 20 X$=X$+CHR$(KEY(0)) 30 GOTO 20
imitira naredbu INPUT X$, s tim što se uneseni tekst smešta u X$ bez kvarenja izgleda ekrana.
Ovim poglavljem započinjemo poslednji krug: to je deo uputstva za upotrebu koji je namenjen onima koji su solidno savladali osnove programiranja i upoznali sve do sada izložene karakteristike računara "galaksija". Njim započinje deo koji će, silom prilika, biti manje jasan i zahtevati više napora za savladavanje. Za to postoje jaki razlozi: programiranje na mašinskom jeziku, koje želimo da upoznamo, predstavlja viši stupanj i neku vrstu nadgradnje bejzlka i nije namenjeno neiskusnim korisnicima. Ovim, naravno, ne želimo nikoga da plašimo: mašinsko programiranje nije teško; ono zahteva samo malo više rada i nema smisla upuštati se u njega dok nismo savladali bejzik.
Sa mašinskim programiranjem, ipak, ne možemo da počnemo baš odmah. Potrebno je da upoznamo neke tajne našeg računara i shvatimo kako je organizovana njegova memorija, kako možemo slobodno da menjamo njen sadržaj i kakvim se opasnostima pri tome izlažemo. Najpre ćemo ppmenuti jednu karakteristiku koja može u mnogome da nam olaksa manipulisanje sa računarom: mogućnosti skraćivanja naredbi.
Svaka naredba koju računar "galaksija" poznaje i koja ima vise od dva slova može da se skrati. Umesto, na primer, da pišemo PRINT 10*2, možemo da otkucamo jednostavno P. 10*2. Taćka iza P govori računaru da je pred njim skraćena naredba PRINT. Ovako skraćena, naredba PRINT zauzima dva bajta memorije (PRINT zauzima pet), brže se izvršava i lakše kuca. Na žalost, skraćivanjem naredbi degradiramo izgled bejzik programa i činimo program znatno nerazumljivijim za početnika.
Bejzik kojim je opremljen računar "galaksija" je tako koncipiran da svaka naredba može da se skrati što eliminiše potrebu da navedemo tabelu skraćenih oblika! Ovo, na prvi pogled, zvuči nemoguće: već smo, na primer, upoznali naredbe INPUT i INT, NEW i NEXT i slične koje počinju istljm slovom. Verovali ili ne, računar "galaksija" u ovoj prilici može ograničeno da čita vaše misli - skratite bilo koju naredbu na jedno slovo i on će pogoditi šta ste želeli da učinite! Objašnjenje je jednostavno: INPUT predstavlja naredbu koja počinje od početka neke linije bejzika ili od oznake: a INT funkciju koja se nalazi samo desno od znaka jednakosti gde naredba INPUT svakako ne može da se nađe. Isto tako, RETURN nema smisla u komandnom, a RUN u programskom modu, pa svaka od njih može da se zameni sa R. O svemu ovome ne morate mnogo da mislite: jednostavno skratite svaku naredbu koja ima više od dva slova na jedno slovo i stavite tačku, a računar se nikada neće zbuniti.
Obzirom da se u IF naredbi mogu naći samo logički izkazi u kojima se koriste oznake <, > i =, svi oni koji su pisali iole složene programe susretali su se sa problemima tipa: potrebno mi je da računar ode na liniju broj 100 ako je X manje ili jednako Y. Ukoliko ste se dosetili trika koji ćemo da izložimo, zaslužujete sve komplimente i imate sve šanse da postanete dobar programer:
10 IF X>Y ELSE GOTO 100
ili, s obzirom na prethodno poglavlje:
10 IFX>YE.G.100
Šta se desilo? Ako je X veće ili jednako Y, odgovor na pitanje "da li je X manje od Y" je negativan, pa računar izvršava ono što se nalazi iza ELSE. Ukoliko je X manje od Y, ELSE biva ignorisano i računar prelazi na sledeću liniju.
Kako smo smeli da izostavimo dve tačke ispred ELSE? To u ovom slučaju sme da se uradi obzirom da ne postoji nikakva dvoznačnost i da se tako štedi jedan bajt RAM-a. U radu sa računarom "galaksija" ćete primetiti da u mnogim slučajevima neke naredbe mogu da se iskoriste u pojednostavljenom obliku koji nije izložen da bi se izbegla konfuzija kod početnika. U našem primeru dve tačke ispred ELSE ne bi nikako zasmetale računaru!
Ovaj trik je ipak nedovoljan: često želimo da se neka naredba izvrši ako je ispunjeno nekoliko logičkih iskaza (ako je, na primer, X veće od Y i Z veće od 2), Računar "galaksija" omogućava i korišćerije logičkih operacija i odnosno ili, ali na indirektan način.
Svakom logičkom iskazu koji je tačan dodeljuje se vrednost jedan, a onome koji je netačan - nula. Otkucajmo, na primer, PRINT 2=2 i na ekranu će se pojaviti broj jedan obzirom da je dva jednako dva. Možemo, isto tako, da napišemo PRINT (B=2)+(A=3). Ukoliko je B zaista dva a A tri, na ekranu će se pojaviti broj 2 (1+1=2). Ukoliko je B jednako dva ali je A različito od tri ili ako je B različito od dva a A jednako tri, na ekranu će se pojaviti broj 1 (1+0=0+1=1). Ako je, najzad, A različito od tri, a B od dva, na ekranu će se pojaviti nula (0+0=0).
Naredba IF izračunava vrednost izraza koji je naveden iza nje i smatra da je on netačan ako je jednak nuli a tačan ako je različit. U tom smislu je IF S=O ELSE GOTO 100 potpuno ekvivalentno sa IF S GOTO 100, pri čemu je druga naredba kraća i brže se izvršava.
Koristeći upravo stečena znanja, logičko i ćemo lako zamenjivati množenjem, a logičko ili sabiranjem. Primer naveden tri pasusa ranije može da se sažme u naredbu:
10 IF (X>Y)*(Z>2) PRINT "USLOV JE ISPUNJEN": ELSE PRINT "USLOV NIJE ISPUNJEN"
Naredba HOME nalaže računara da obriše sadržaj ekrana i o njoj se, izgleda, ne mora više razgovarati. No iza HOME može da se nađe i neki broj između 1 i 512 koji unekoliko menja smisao ove naredbe.
Kada računar ispuni čitav ekran, prva linija nestaje, sve ostale se pomeraju za jedan red nagore, a novi tekst se pojavljuje u poslednjem (šesnaestom) redu ekrana. To je prirodan tok stvari, ali ponekad može da bude korisno da se jedan deo ekrana zaštiti od automatskog brisanja. Na tom delu ekrana može da se nađe neki tekst koji u toku čitavog rada programa treba da bude vidljiv (na primer, sažeto uputstvo za upotrebu kod neke igre). Da bismo, na primer, zaštitili prva tri reda ekrana, izvršićemo sledeći jednostavni program:
10 HOME 20 PRINT "OVI REDOVI": PRINT "SU": PRINT "ZAŠTIĆENI" 30 HOME 96
Zatim kucajmo neke naredbe i, kada ostatak ekrana bude ispunjen, primetimo da je "pokretan" samo deo ispod trećeg reda.
Zaštita prvih redova nije potpuna: pomoću PRINT AT možemo da menjamo njihov sadržaj, pa čak i da ga obrišemo pritisnuvši SHIFT DEL. Međutim, zona na ekranu ostaje zaštićena čak i ako promenimo njen sadržaj - automatski scroll (pomeranje redova) je ne remeti.
Postoji jedno ograničenje, vezano za zaštitu ekrana: kada je ona aktivirana, uobičajeni fini scroll (pomeranje redova nije naglo nego prijatno za oči) je isključen. To znači da će listanje programa biti oko tri puta brže nego obično, ali će ga biti teže pratiti obzirom da redovi prebrzo "preleću" ekran. Ako želimo samo da isključimo fini scroll bez zaštite dela ekrana, otkucacemo HOME 512. Ovo stanje, kao i zaštita bilo kog dela ekrana, opoziva se sa HOME.
Za rad sa mašinškim jezikom je pogodno koristiti heksadecimalni brojni sistem. U njemu se, uz cifre 0, 1, 2, 3, 4, 5, 6, 7, 8 i 9 koriste i "cifre" A, B, C. D, E i F. Broj 10 se u heksadekadnom sistemu piše kao 0A ili, jednostavno A, 11 je 0B, 12 je 0C, 13 je OD, 14 je 0E, 15 je OF, a 16 se piše kao 10. Ako u broju nema slova A, B, C, D, E i F, lako može da dođe do zabune u kom je sistemu pisan. Problem se u programiranju (a ponekad i u matematici) rešava tako što se ispred heksadekadnog broja stavlja oznaka & (na primer &10, &5A i slično). Ova konvencija je poznata i računaru "galaksija" otkucajmo, na primer, PRINT &000A (ili samo PRINT &A) i pritisnimo RET - na ekranu će se pojaviti broj 10 koji predstavlja prevod heksadekadnog broja 000A u dekadni sistem.
Kada god u nekoj naredbi treba da napišemo neki dekadni broj, možemo da ga zamenimo heksadekadnim pri čemu ispred njega stavljamo znak &. Tako možemo da zamenimo naredbu HOME 32 naredbom HOME &20, znajući da se u svakom redu nalazi po &20 (&20=32) karaktera. Treba voditi računa o činjenici da se oznakom & mogu dobiti i negativni brojevi: &8001 nije 32769 nego -32767.
Rad sa heksadekadnim sistemom postaje posebno značajan tek sa naredbama BYTE i WORD.
Naš računar je opremljen ROM-om od četiri kilobajta i istim tolikim RAM-om (dodavanjem čipova, ROM može da se proširi do 8 KB a RAM do 6KB; dodavanjem posebne pločice RAM bi mogao da se proširi do 54 kilobajta). ROM i RAM možemo da zamislimo kao skup ćelija koje su poredane u red i numerisane brojevima od &0000 do &FFFF. U svaku ćeliju može da se smesti bilo koji broj između &00 i &FF ili, da budemo precizniji, u nekim od ćelija već se nalaze fiksirani brojevi. Ove ćelije se nalaze na početku memorije (adrese &000 do &OFFF) i čine ROM - deo memorije u koji je upisan sistemski program koji omogućava ispravno funkcionisanje našeg računara. U ostale ćelije možemo slobodno da upisujemo sadržaj koji će biti interpretiran kao mašinski program koji može da se izvršava.
Adrese &1000 do &1FFF odgovaraju ROM-u koji se ne nalazi u vašem računam - to je proširenje koje će jednoga dana biti na raspolaganju. Adrese &2000 do &27FF obuhvataju ćelije koje, u sadašnjoj situaciji, za nas nisu od interesa: računar ih interno koristi za rad sa tastaturom. Informacije sadržane u ćelijama &2800 do &2C39 su veoma značajne: tu se nalaze sistemske promenljive, video-memorija (o sistemskim promenljivima i video memoriji ćemo govoriti docnije), aritmetički akumulatori i stek. Počev od &2C3A, u memoriju se smešta bejzik program (ukoliko sadržaj jedne sistemske promenljive nije promenjen, ali i o tome docnije) dok je kraj memorije rezervisan za nizove: od &37FF (ili &3FFF ako imate RAM od 6 kilobajta) se, unazad prema bejzik programu, smešta alfanumerički niz X$(I), a ispod njega numerički niz A(I). Ukoliko se bejzik program i numerički niz "susretnu" na sredini memorije, računar ispisuje SORRY i odbija da dodaje nove elemente numeričkom nizu.
Koristeći naredbu BYTE možemo da proverimo i, po potrebi, promenimo sadržaj bilo kog bajta (ćelije) memorije. Otkucajmo, na primer, PRINT BYTE (&2BA8) i pritisnimo uobičajeno RET - na ekranu će se pojaviti broj 11. To znači da ćelija čija je adresa &2BA8 sadrži broj 11 (dekadno). Otkucajmo, dalje, BYTE &2BA8, 12 i primetimo da se slika na našem monitoru pomerila udesno. PRINT BYTE (32BA8) će nas uveriti da je prethodna naredba naložila računaru da promeni sadržaj ćelije &2BA8 i u nju smesti broj 12 umesto dosadašnjeg 11. Samo pomeranje slike nije direktno izazvano naredbom BYTE - ćelija &2BA8 kazuje računaru gde počinje slika, pa se promene njenog sadržaja trenutno primećuju. Pouka je da je vrlo opasno menjati sadržaje memorije pomoću BYTE ukoliko tačno ne znamo šta radimo - greška može da izazove brisanje programa pa čak i blokiranje računara posle koga ni RESET neće pomoći - moraćemo da isključimo i ponovo uključimo kompjuter, što je, kao što znamo, lek za sve probleme. U sadašnjem slučaju dovoljno je da otkucamo BYTE &2BA8,11 i sve će se vratiti u normalno stanje.
Evo još jednog primera upotrebe naredbe BYTE: želimo, na primer da osvetlimo sve tačke na ekranu. Ako to radimo pomoću DOT, posao će potrajati prilično dugo. Ako koristimo PRINT, nećemo nikako moći da osvetlimo poslednji karakter. Na svu sreću, program:
10 FOR I=&2800 TO &29FF 20 BYTE I, 255: NEXT I
rešiće problem u prihvatljivom vremenu. Možemo da izmorimo vreme potrebno za ovu jednostavnu operaciju (ako ste dobro upoznati računar "galaksija", povećajte preciznost merenja koristeći računarev časovnik) obzirom da ćemo isti problem docnije rešiti i na mašinskom jeziku.
Izdvajanje slova iz neke alfanumeričke promenljive je do sada bilo skopčano sa velikim problemima (praktično nemoguće), što je onima koji su pisali programe moralo da priredi dosta neprijatnih trenutaka. Da bi se problemi resili, treba upoznati naredbu PTR. Izvršimo, na primer, PRINT PTR X$ i na ekranu će se pojaviti broj 10864. To znači da je promenljiva X$ u memoriji smeštena počevši od ćelije 10864 (ili, što je isto, &2A70). Znajući da alfanumerička promenljivd prima 16 slova, zaključujemo da će ćelije &2A70 do &2A7F koriste za promenljivu X$.
Unesimo sledeći jednostavni program:
10 INPUT X$ 20 Y$="" 30 FOR I=0 TO 2 40 BYTE PTR Y$+I, BYTE (PTR X$+I) 50 NEXT I: BYTE (PTR Y$+3), 0
Startujmo ovaj program i unosimo bilo koju reč koja ima manje od 16 slova. Trenutak docnije na ekranu će se pojaviti prva tri slova reci. Čitaoci ovih redova koji su razumeli rad sa alfanumericima će primetiti da bi naredbe 40 i 50 mogle da se zameni sa:
40 Y$=Y$+CHR$ (BYTE (PTR X$+I): NEXT I
Naredbu PTR možemo da koristimo i za pronalaženje elemenata numeričkog ili alfanumeričkog niza ili fiksnih promenljivih. Kao vežbu pokušajte da sastavite program koji će sortirati reci po abecednom redu. Problem postaje bitno složeniji kada posmatramo reči koje sadrže i slova ČĆŠŽ.
Tabela koja sledi prikazuje mapu sistemskih promenljivih i drugih značajnih memorijskih adresa. Sistemske promenljive označavaju memorijske ćelije u koje računar smešta podatke od značaja za njegovo normalno funkcionisanje. Jednu od sistemskih promenljivih smo već upoznali - ćelija čija je adresa &2BA8 odgovorna za poziciju slike na ekranu.
Adresa | Bajta | Inicijalno | Sadržaj |
2800 | 512 | 20 | Video memorija |
2A00 | 104 | 00 | Numeričke varijable A-Z |
2A68 | 2 | 2800 | Pozicija kurzora u memoriji |
2A6A | 2 | 3800 | Kraj memorije |
2A6C | 2 | 00 | Blokiranje dela video memorije |
2A6E | 2 | 00 | TO registar za FOR-NEXT |
2A70 | 16 | 00 | X$ |
2A80 | 16 | 00 | Y$ |
2A91 | 2 | 00 | Stek za aktivnu petlju |
2A93 | 2 | 00 | Pozicija tekuće linije (za vreme FOR-NEXT) |
2A95 | 2 | 00 | Basic pointer (za vreme CALL i FOR-NEXT) |
2A99 | 2 | 00 | 16*ARR$+16 |
2A9B | 2 | 00 | Adresa NEXT varijable |
2A9D | 2 | 2C3C | TAKE pointer |
2A9F | 2 | 00 | Pozicija tekuće linije |
2AA1 | 2 | 00 | Registar za aktivni FOR-NEXT |
2AA3 | 2 | 00 | SP privremeno za aktivni CALL |
2AA5 | 2 | 00 | Diferencijator za tastaturu |
2AA7 | 3 | 00 | RND |
2AAC | 124 | 00 | Aritmetički akumulatori (IX) |
2BA8 | 1 | 0B | Horizontalna pozicija teksta |
2BA9 | 3 | C9 | Link za naredbe |
2BAC | 3 | C9 | Link za video |
2BAF | 1 | 00 | Ako je bit 7=1, sat radi |
2BB0 | 1 | 00 | Brojač za pomeranje slike |
2BB1 | 1 | 00 | Flag za pomeranje slike |
2BB4 | 1 | 00 | Registar za REPT |
2BB5 | 1 | 00 | Flag za štampač |
2BB6 | 125 | 00 | Bafer |
2C36 | 2 | 2C3A | Pointer početka basic-a |
2C38 | 2 | 2C3A | Pointer kraja basic-a |
2C3A | ?? | 00 | Basic program |
Većina sistemskih promenljivih zauzima dva bajta obzirom da se u njima nalaze adrese nekih drugih delova memorije (sistemska promenljiva koja zauzima ćelije &2C36 i &2C37, na primer, daje adresu početka bejzik programa). To znači da nam naredba BYTE pomaže samo posredno: možemo da ispitamo sadržaje obe ćelije koje čine neku sistemsku promenljivu i da ih kombinujemo u jedan broj (u datom primeru PRINT 256*BYTE (&2C37)+BYTE (&2C36) daje 11322 (isto što i &2C3A) - adresu početka bejzik programa koja se slaže sa mapom). Ovakav način, posebno kada treba promeniti sadržaj neke sistemske promenljive, nije baš prijatan, pa je "galaksija" opremljena, naredbom WORD koja je namenjena baš radu sa sistemskim promenljivima.
Naredba WORD je neobično slična naredbi BYTE osim u jednoj sitnici: ona operiše sa dva bajta memorije. Otkucajmo, na primer, PRINT WORD (&2C36) i na ekranu će se pojaviti broj 11322 - nikakva konverzija nije bila potrebna.
Otkucajmo, dalje, WORD &2C36, &2D3A: WORD &2C38, &2D3A i pritisnimo RET. Time smo promenili sadržaj sistemskih promenljivih u kojima računar čuva informacije o početku i kraju bejzik programa, pa će svi bejzik programi koje od tog momenta kucamo počinjati 256 bajta više (počevši od &2D3A). Tako dobijenih 256 bajta može da se koristi za smeštanje mašinskih programa.
Raspoloživi prostor nam, na žalost, ne dopušta da se ozbiljno bavimo mašinskim programiranjem, ali ćemo izložiti neke podatke vezane za smeštanje, snimanje i startovanje mašinskih programa na računaru "galaksija" i dati jedan primer. Za praćenje daljeg teksta je vrlo korisno posedovati spisak instrukcija procesora Z80A.
Postoje dva mesta koja su "prirodno određena" za mašinske programe: jedno je već spomenuto (ispred bejzika), a drugo na vrhu memorije, tamo gde se normalno nalazi niz X$(I). Prva ideja je, bar po našem mišljenju, pogodnija jer se mašinski programi snimaju zajedno sa bejzikom (o tome docnije), pa ćemo se zadržati na njoj.
Da bi za mašinski program rezervisali nnnn bajtova, treba da pomerimo početak bejzika. To možemo da uradimo pomoću naredbe WORD (kao u prethodnom poglavlju), ali možemo da upotrebimo i novu opciju: NEW nnnn. Primenom ove naredbe briše se postojeći bejzik program iz memorije i početak svih budućih bejzik programa pomera za nnnn bajtova. Mašinski program se, u nedostatku programa koji bi to olakšao, unosi pomoću naredbe BYTE, bajt po bajt počevši od &2C3A. Da vidimo kako to izgleda na primeru.
Sastavićemo program koji popunjava ekran punim karakterima i videti koliko je mašinski jezik brz. Evo programa uz korišćenje standardne mnemonike procesora:
2C3A 01 00 02 LD BC, 200H ; treba "osvetliti" &200 bajtova 2C3D 21 OO 28 LD HL, 2800H ; adresa početka ekrana 2C40 36 FF CIKL LD (HL), 0FFH ; FF je "pun karakter" 2C42 23 INC HL ; HL se uvećava 2C43 OB DEC BC ; brojač je umanjen 2C44 CB 78 BIT 7,B ; da li je BC negativan? 2C46 28 F8 JR Z,CIKL ; ako nije, ponavlja se ciklus 2C48 C9 RET ; povratak u BASIC.
Mašinski program se unosi tako što se najpre otkuca NEW 15 (program ima 15 bajtova). a zatim BYTE &2C3A, &01 RET BYTE &2C3B,&00 RET BYTE&2C3C,&02 RET BYTE&2C3D,&21 RET itd. Poslednje se kuca BYTE &2C47,&F8 RET BYTE &2C48,&C9 RET čime je unošenje mašinskog programa završeno. Da bismo ga isprobali, otkucajmo:
10 A=USR(&2C3A) 20 GOTO 20
USR je nova naredba. Ona nalaže računaru da izvrši mašinski program čiji se početak nalazi na adresi koja je navedena u zagradi. Po izvršavanju programa (mašinsko RET, C9) promenljiva A će dobiti vrednost iz HL registra, što u datom primeru nije mnogo bitno. Naredba 20 sprečava da se izvršavanje programa prekine i da izgled ekrana tako bude pokvaren.
Otkucajmo RUN, pritisnimo RET i, ako nije bilo greški u kucanju, ekran će biti popunjen tačkama. Uporedimo ovo sa "brzinom" (posle ovakve demonstracije navodnici su neophodni) bejzik programa koji smo nedavno sastavili pa će nam postati jasno zašto se bolji programeri okreću mašinskom jeziku. Za one koji ne mogu da se sete kako da izmere vreme izvršavanja mašinskog programa da kažemo da je ono oko 0.02 sekunde što, u poređenju sa bejzikom, predstavlja ubrzanje od oko 580 puta.
Želeli bismo da stimulišemo pisanje programa na mašinskom jeziku. Računar "galaksija" je dobar poligon za njih: taster RESET će popraviti posledice najvećeg broja grešaka, tako da nećete morati stalno da unosite program kada računar "krahira". I pored toga, biće neophodno da mašinske programe snimate na kasetu. U tome će vam pomoći sledeće poglavlje.
Ako mašinski program unesemo na način izložen u prethodnom poglavlju, obično SAVE će, zajedno sa bejzikom, snimiti i sve što se nalazi u memoriji, počevši od adrese &2C3A. Ponekad je, ipak, potrebno da na kasetu snimimo proizvoljan segment memorije. Za to će nam poslužiti naredba SAVE mmmm, nnnn.
Da bismo, na primer, snimili mašinski program koji se nalazi u ćelijama memorije čije su adrese &3C30 do &3FFF, otkucacemo SAVE &3C30, &3FFF, startovati snimanje na kasetofonu i pritisnuti RET. Posle toga, ukoliko nam je program važan, možemo da izvršimo verifikaciju na uobičajeni način.
Za učitavanje koristimo obično OLD: računar će učitane bajtove smestiti na iste adrese na kojima su se nalazili pre snimanja. Ponekad ćemo, međutim, poželeti da učitavanje programa započnemo određen broj bajtova pre ili posle mesta sa koga su snimljeni (ovo retko ima smisla, jer će sve JP i CALL mašinske naredbe neispravno funkcionisati posle pomeranja). Ako, na primer, želimo da mašinski program bude pomeren naviše za 1024 bajta, otkucacemo OLD 1024 (ili, što je isto, OLD &400), pritisnuti RET i startovati kasetofon. Da je pomeranje trebalo da bude negativno (prema početku memorije) otkucali bismo OLD -1024. Obzirom da je ovakvo pomeranje relativno, svaki put kada snimamo neki mašinski proigram pomoću SAVE mmmm, nnnn, treba da zapišemo adresu njegovog početka i kraja.
Čak i dok niste započeli da pišete programe, u vašem računaru se nalazio jedan program i to toliko veliki i moćan da ćete sličan moći da napišete tek kad postanete daleko iskusniji programer. To je sistemski program od četiti kilobajta koji omogućava računaru "galaksija" da radi ono što mu vi nalažete; taj program omogućava prevođenje bejzik naredbi koje unosite na oblik pristupačan mašini, izdavanje odgovora na ekranu, rad sa kasetofonom...
U jednom velikom programu, kao u metrou, ima mnogo stranica na kojima možete da se "ukrcate", "otputujete negde" i "izađete". Poznavanje adresa tih "stanica" je dovoljno da iskoristite naredbu USR i dođete do njih. Vreme koje nam je bilo na raspolaganju za pripremanje ovog uputstva kao i njegov obim nam, na žalost, nisu dopustili da se pozabavimo nabrajanjem interesantnih mašinskih potprograma. Odabrali smo samo jedan primer, koji će čitaoca podstaći na dalja istraživanja i, istovremeno, povećati mogućnosti računara "galaksija".
U toku rada (osim pri snimanju programa na kasetu) računar na ekranu neprekidno prikazuje sliku na šta se, prirodno, gubi određeno vreme. Ponekad nam je potrebno da izvršimo neki komplikovani proračun koji odnosi dosta vremena, a slika nam nije bitna; zar ne bi bilo dobro "isključiti" sliku i smanjiti vreme izvršavanja programa tri-četiri puta? Za ovakav ubrzani režim rada poslužiće nam naredba A=USR(14) (umesto A možemo da stavimo bilo koju promenljivu, napišemo PRINT USR(14) i slično). Povratak u normalan režim rada se postiže naredbom A=USR(22) ili automatski nastupa po završetku rada programa (taj završetak može da bude posledica naredbe STOP, pritiska na BRK ili RESET i slično). Evo i primera:
10 A=USR(14) 20 FOR I=1 TO 10000: NEXT I
Startujmo program sa RUN, a zatim sa RUN 20 (time ubrzani režim nije iniciran) i primetimo razlike u vremenu izvršavanja. Za to ne možemo da koristimo računarev interni časovnik jer je on "isključen" u toku ubrzanog režima rada.
Ovim smo stigli do kraja uputstva za upotrebu računara "galaksija". Ostalo je još dosta stvari koje nismo pomenuli, "caka" koje ni mi ne poznajemo i, naravno, bezbroj ideja za programe. Ako ste sastavili računar "galaksija" i naučili da se služite njime, pošaljite nam barem kratko pismo u kom ćete nas obavestiti o tim činjenicama. "Galaksija" planira da otvori svoje stranice i posveti redovne rubrike temama vezanim za računar "galaksija", kao i da u postojeći katalog bejzik programa uvrsti što više dobrih programa za njega, koji će tako biti na raspolaganju svim korisnicima. Čitava ova akcija zavisi u mnogome i od svakog čitaoca ovih redova: vi ste ti koji treba da napisu programe i da ih pošalju na našu adresu. Samo udruženim naporima računar "galaksija" može da bude dopunjen onim što mu trenutno jedino nedostaje - programskom podrškom.
0000-0FFF ROM A 1000-1FFF Mesto za ROM B 2000-2037 Mapirana tastatura 2038-203F Latch 2040-27FF Ponavlja se latch i tastatura 15 puta 2800-2BFF Video RAM 2C00-3FFF RAM na ploči 4000-FFFF RAM proširenje
ARR$ | ARR$(20) |
BYTE | PRINT BYTE(11176) |
BYTE 11176,12 |
|
CALL | CALL 100 |
CALL 10*A+100 |
|
CHR$ | PRINT CHR$(34) |
DOT | DOT 20,10 |
DOT * |
|
IF DOT 20,10 PRINT "BELO" |
|
EDIT | EDIT 20 |
ELSE | IF B<17 X=1 ELSE GOTO 100 |
EQ | IF EQ Y$,X$(5) GOTO 100 |
FOR | FOR I=A TO 100 |
GOTO | GOTO 100 |
GOTO 10*A+100 |
|
HOME | HOME |
HOME 64 |
|
HOME 512 |
|
IF | IF A>5 GOTO 100 |
INPUT | INPUT A |
INPUT X$ |
|
INT | A=INT(B/C) |
KEY | IF KEY(1) GOTO 100 |
A=KEY(0) |
|
LIST | LIST |
LIST 500 |
|
MEM | PRINT MEM |
NEW | NEW |
NEW 256 |
|
NEXT | NEXT I |
OLD | OLD |
OLD -50 |
|
PTR | PRINT PTR X$ |
PRINT A+2*B |
|
PRINT A;"*";B;"=";C |
|
PRINT A,B,C |
|
PRINT "GALAKSIJA" |
|
RETURN | RETURN |
RND | A=RND |
PRINT INT(7*RND+1) |
|
RUN | RUN |
RUN 100 |
|
SAVE | SAVE |
SAVE 15728,16251 |
|
STEP | FOR I=100 TO 0 STEP -5 |
STOP | STOP |
TAKE | TAKE A,100,B,C,250,X$ |
UNDOT | UNDOT 20,10 |
UNDOT * |
|
USR | A=USR(14) |
VAL | PRINT VAL(PTR X$) |
WORD | WORD 10905,0 |
PRINT WORD(10905) |
|
! | ! PROGRAM ZA SUMIRANJE |
# | # 10,30,"JANUAR" |
& | PRINT &2CBA |
Kraj izdanja | Moja home strana |