lekcija 3 – Mala škola retro programiranja u standardnom bejziku C64
RETRO KUTAK
COMMODORE 64 – PROGRAMIRANJE U STANDARDNOM BEJZIKU
Lekcija treća
Obojimo ga i ozvučimo da liči na nešto (boje.grafika zvuk samo najčistije upoznavanje)
Dobrodošli na treći čas „Male škole programiranja na Commodore 64 u BASIC-u“. Danas ćemo nastaviti sa upoznavanjem mogućnosti i naredbi C64 računara. Naravno kao i obično daćemo neke savete i primere za ono što učimo.
Počnimo sa malim savetima i objašnjenjima
Softverski reset – prekid programa i vraćanje osnovnih podešavanja
Prilikom rada sa računarom može doći da nemožemo prekinuti program sa RUN/STOP tasterom (ESC kod emulatora). Takođe možemo poremetiti grafiku, boje, čuje se konstantni zvuk i td. Samim tim potrebno nam je nešto jače a to postižemo istovremenim pritiskom na dva tastera RUN/STOP+RESTORE (kod emulatora ESC+PAGEUP). Na taj način vraćamo C64 u radno stanje sa osnovnim bojama i podešavanjima. Ova kombinacija čak ima mogućnost da prekine izvršavanje nekih mašinskih programa (ukoliko isti nisu previše uticali na rad sistema).
Ubacivanje karaktera
Ako imamo potrebu da ubacimo neki tekst u postojeći, dovešćemo kursor na željeno mesto i pritisnuti SHIFT+INST/DEL (kod emulatora SHIFT+BACK SPACE) onoliko puta koliko želimo da napravimo prazna mesta za željeni tekst koji dodajemo.
Boje i objašnjenje memorijske mape
C64 ima mogućnost rada sa 16 boja. Ukoliko želite promeniti boje karaktera na ekranu putem tastature to je lako uraditi. Upotrebićemo control taster kod komodora (tab kod emulatora) i dobiti prvih 8 boja pritiskajući tastere od 1 do 8. Za drugih 8 boja koristićemo komodore taster (ctrl kod emulatora) i ponovo tastere od 1 do 8. Takođe ćemo napomenuti da control 9 ukjučuje, a control 0 isključuje inverzni prikaz znakova. Jedan od načina promene boja karaktera programskim putem je naredba PRINT. Naprimer da bi smo dobili belu boju karaktera pišemo PRINT „CONTROL+1“ (pritiskom ove kombinacije u zagradi će se prikazati inverzno slovo E).
Što se tiče podešavanja boje okvira i pozadine standardni bejzik C64 ne poseduje ove naredbe. Kako onda promeniti boju istih? Važno je da imate na umu činjenicu da sve komodorove mogućnosti postoje u memorijskoj mapi računara. Memoriju računara možemo zamisliti kao gomilu električnih kutija koje su označene brojevima od 0 do 65535. Svaka od njih poseduje 8 prekidača (bitova), koji se uključuju i isključuju (0 i 1 stanje bita, 0 – isključeno, 1-uključeno), po želji korisnika ili potrebe računara. Ako svakom prekidaču (bitu) dodelimo sledeće težinske vrednosti 1,2,4,8,16,32,64 i 128 njihovom kombinacijom dobijamo bilo koji broj od 0 do 255 (uzimajući u obzir nulu 256 ukupnih kombinacija). Zbog ove činjenice komodor je svrstan u 8-bitne računare. Neke memorijske lokacije služe za upisivanje podataka (bejzik programa, stanje promenljivih, asamblerskih programa i td.), dok su neke zadužene za prikaz znakova na ekranu, boje, zvuka, rad sistema i sve ostalo, neke možemo samo čitati, u neke samo upisivati i td. Tu postoje i neka preklapanja memorije ali za nas je najbitnije da znamo da manipulacijom vrednostima memorijskih adresa možemo postići sve što nam treba kod C64 računara.
Sada kako to ide kod boja. Memorijske lokacije 53280 (okvir) i 53281 (pozadina) sadrže vrednosti koje računar neprestano očitava i na osnovu tih vrednosti prikazuje boje okvira i pozadine.
Danas ćemo naučiti važnu naredbu koja nam omogućava manipulisanje stanja memorijskih lokacija i videćemo iz primera kako to funkcioniše.
Zvuk
Kao i kod boja nepostoje direktne naredbe kod standarnog bejzika za zvuk. Da bi smo postigli da se zvuk čuje potrebno je manipulisati memorijskim lokacijama odgovornih za muzičke sposobnosti računara. C64 poseduje tri kanala za zvuk, 8 oktava po svakom kanalu i mnoge muzičke mogućnosti. Po tvrdnji mnogih stručnjaka SID čip koji je odgovoran za zvuk kod C64 je u to vreme bio najnapredniji računarski sintisajzer bez premca među osobitnim računarima. Memorijske lokacije odgovorne za sva tri muzička/zvučna kanala kreću se od memorijske adrese 54272 do 54300 i svaka od ovih lokacija je zadužena za nešto (jačinu tona, oblik, šum i td.)
Grafika
Kao i kod boja i zvuka za rad sa grafikom nema naredbi kod standardnog C64 bejzika, pa i ovde moramo manipulisati direktno vrednostima memorijske mape. Postoji tekstualni način rada (onaj u kome se odmah nađemo kada uključimo računar i tu se prikazuju 40 karaktera u 25 reda sa 16 boja po karakteru), rad sa visokom rezolucijom 320×200 u dve boje (u ovom modu rada prikazuju se 320 tačaka po horizontali i 200 tačka po vetikali prikaza i tačke se boje u veličini karaktera 8×8 u dve boje, pozadina i lice karaktera) i multikolor rezolucijom od 160×200 u četri boje po karakteru (u ovom modu rada prikazuju se 160 tačaka po horizontali i 200 tačaka po vetikali prikaza i tačke se boje u veličini karaktera 8×8 u četri boje. To je razlog da je rezolucija horizontale upola manja od visoke i tu je boja pozadine, lica karaktera i dve dodatne boje). Tu su još i hardverski sprajtovi (visoke i multikolor rezolucije, sličice koje se kreću na ekranu i koje se mnogo koriste prilikom izrade igrica pogotovo arkadnog tipa. Ima ih ukupno 8) i mnogo toga. Zadržimo se za sada na ovom kratkom objašnjenju.
Krenimo sa današnjom lekcijom
Funkcije – Naredbe koje nisu samostalne
Danas ćemo obratiti pažnju na naredbe/funkcije koje se izvršavaju zadavanjem napredbe PRINT i naziva funkcije ili dodeljuju svoje vrednosti nekoj od zadatih promenljivih. Iste utiču na prikaz ispisa na ekranu ili vrše različite proračune. One funkcije koje se koriste za manipulaciju ispisa na ekranu se izvršavaju putem zadavanja naredbe PRINT a kod onih koje se koriste za razne proračune njihovi rezultati mogu se prikazati ili upisati u željene promenjive za kasniju obradu.
TAB – ispisivanje na ekranu u željenoj koloni
Oblik funkcije je
TAB(A) ono što prikazujemo. Argument „A“ može imati vrednost od 0 do 255.
Ispisivanje teksta počinje od mesta udaljeno za „A“ karaktera od početka reda.
Primer:
10 FOR I=1 TO 20
20 PRINT TAB(I)I;“POMERENO“
30 NEXT I
Obratite pažnju da između funkcije TAB i zagrade ne sme biti razmak.
Izvršavanjem ovog kratkog programa dobićemo 20 ispisanih reda od kojih je svaki pomeren za karakter udesno u odnosu na prethodni red, ispisaće se broj kolone i tekst „POMERENO“.
SPC – ispisivanje na ekranu u željenoj koloni
Oblik funkcije je:
SPC(A) ono što prikazujemo. Argument „A“ može imati vrednost od 0 do 254. I ova funkcija ispisuje tekst na ekranu u željenoj koloni. U čemu je razlika? Za razliku od TAB funkcije ova vrši ispisivanje tako što za argument „A“ unosi toliko praznih mesta u odnosu na poslednje mesto ispisivanja.
Primer:
10 PRINT „PRIKAZ1″SPC(10)“PRIKAZ2″SPC(5)“PRIKAZ3“
Obratite pažnju da i ovde između funkcije SPC i zagrade ne sme biti razmak.
Izvršavanjem dobićemo na početak reda ispis PRIKAZ1 kurzor će se udaljiti se za 10 karaktera i ispisati PRIKAZ2, a zatim udaljiti za 5 karaktera i ispisati PRIKAZ3.
POS(A) – utvrđivanje broja kolone gde je izvršen zadnji ispis znaka
Ova funkcija nam pruža mogućnost da utvrdimo broj kolone u kojoj je izvršen upis karaktera poslednji put.
Oblik je:
POS(A) – argument „A“ može biti bilo koji broj. Neophodno ga je upisati. Zašto? To znaju smo konstruktori računara.
Evo malog primera ove funkcije:
10 FOR I=1 TO 10 STEP 2
20 PRINT TAB(I)“P“;POS(1)
30 NEXT I
Ovim programom će se prikazati 10 reda sa ispisima pomerenih za dva karaktera udesno u odnosu na prethodni red i na kraju svakog reda ispisaće se slovo P i njegova pozicija u koloni.
INT – zaokruživanje vrednosti decimalnih brojeva na celu vrednost
Oblik funkcije je:
INT (A)
Za razliku od prethodnih funkcija vezanih za naredbu PRINT vrednost ove možemo dodeliti numeričkoj promenljivi po našoj želji. Imajte u vidu da će ova funkcija uvek zaokružiti iznos na manju celobrojnu vrednost. Za argument „A“ možemo upisujemo bilo koji celi ili decimalni broj ili staviti bilo koju numeričku promenljivu. Decimale se kod C64 odvajaju decimalnom tačkom.
Primer:
10 I=11.4
20 PRINT INT(I)
30 PRINT (5.7)
40 X=INT (12.8)
50 PRINT X
Prilikom izvršenja programa dobićemo rezultate 11, 5 i 12. Kao što vidite svi brojevi su zaokruženi na manju celobrojnu vrednost.
RND – generisanje slučajnih brojeva
Ova funkcija se često koristi u raznim programa i igricama. Generiše slučajne decimalne brojeve između 0 i 1.
Kao i kod prethodne i kod ove funkcije, osim prikaza putem naredbe PRINT, njenu vrednost možemo dodeliti numeričkoj promenljivi po našoj želji.
Oblik funkcije je:
RND (A) – gde argument „A“ ima vrednost 1, 0, -1
Kada pod argument stavimo 1 dajemo računaru do znanja da generiše brojeve koji nisu u potpunosti slučajni. Ti brojevi koje nam računar prikazuje se formiraju kod uključivanja računara i ima ih 65535 posle čega se ponavljaju. Kod argumenta 0 dobijaju se brojevi iz računarskog ugrađenog sata i to su pravi slučajni brojevi. Kada je argument -1 takođe se dobija slučajan broj koji prvo postavi slučajnu početnu vrednost i na osnovu nje generiše ostale slučajne decimalne brojeve.
Primeri:
10 FOR I=1 TO 10
20 PRINT RND(0)
30 NEXT I
Prikazaće se 10 slučajno generisanih decimalnih brojeva između 0 i 1.
10 FOR I=1 TO 10
20 X=PRINT INT(RND(0)*50)+1:PRINT X
30 NEXT I
Programski redovi 10 i 30 su nam poznati. U programskom redu 20 dali smo računaru da zaokruži slučajnu decimalnu vrednost od 0 do 1 pomnoženu sa 50 i uvećali je za jedan. Tako smo dobili slučajnu celobrojnu vrednost između 1 i 50. Onda smo istu dodelili numeričkoj vrednost X i prikazali je naredbom PRINT (U mnogim programima koje programeri rade je nephodno generisati slučajne brojeve i njihove vrednosti čuvati u numeričkim promenljivama).
Dakle šta se ovde dešava? Prikazaće se 10 celih brojeva od 1 do 50 i neki od njih će se možda ponoviti.
Nastavićemo sa još funkcija u sledećoj lekciji a za danas ćemo još naučiti veoma bitnu naredbu za manipulaciju memorijskim lokacijama i funkciju za čitanje njihove vrednosti.
POKE – upis vrednosti u memorijsku lokaciju
Format naredbe je:
POKE m,b
gde je argument „m“ memorijska lokacija (0-65535) a argument „b“-osmobitna vrednost (0-255).
Ovom naredbom možemo uneti u bilo kojoj memorijskoj lokaciji (u kojoj je dozvoljen upis) bilo koju osmobitnu vrednost. Kada smo pričali o bojama, zvuku, grafici i td., rekli smo i da standardni C64 bejzik ne poseduje naredbe za rad sa njima. Ovaj nedostatak se nadomešta korišćenjem naredbe POKE koja u odgovarajuće memorijske adrese koje su zadužene za ove radnje unosi željene vrednosti koje će dati traženi rezultat. Ukoliko kod memorijske lokacije unesemo veći broj od 65535 ili kod vrednosti veći broj od 255 dobićemo poruku o grešci „illegal quantity error“.
Sledeći kratki primer će demonstrirati ovu naredbu:
10 FOR I=1 TO 17
20 POKE 53280,RND(0)*16
30 POKE 53281,RND(0)*16
40 FOR S=1 TO 1000:NEXT S
50 NEXT I
U programskom redu 10 dajemo programsku petlju sa 17 ciklusa. U liniji 20 unosimo u memorijsku lokaciju 53280 (ova memorijska lokacija je odgovorna za boju okvira) slučajan decimalni broj od 0 do 1 koji množimo sa 16. Imajte u vidu da vrednosti za boje idu od 0 do 15. Bez obzira mi množimo sa 16 jer se argumenti kod POKE naredbe ponašaju kao i kod funkcije INT i uzimaju se samo celi brojevi, a ukoliko postoje decimale zaokružuje se na manji ceo broj (bez obzira i da je dobijena vrednost 15.99999 uzeće se broj 15). U redu 30 postupak je identičan samo se uzima memorijska adresa 53281 koja je zadužena za boju pozadine. U programskom redu 40 imamo petlju koja odbrojava od 1 do 1000 i na izgled ne radi ništa. U stvari ova petlja usporava izvršenje računarskog programa da bi smo bolje videli promene boja. U zadnjoj programskoj liniji uvećava se za 1 promenljiva I i ispitujemo da li je prestigla vrednost 17, ukoliko nije program se vraća na liniju 20, a ako jeste glavna petlja se završava i pošto nema drugih naredbi program prestaje sa radom.
PEEK – funkcija koja vrši prikaz sadržaja memorijske lokacije
Format funkcije je:
PEEK (m)
Ova funkcija čita vrednost zadate memorijske lokacije od 0 do 65535 i prikazuje je ili je smešta u neku promenljivu.
Primer:
10 PRINT PEEK(53280)
20 X=PEEK(53281): PRINT X
Dati mali program će prikazati vrednost boje okvira i pozadine. Nemojte se začuditi kada dobijete veliki broj. Naime, pošto je ovim memorijskim lokacijama potrebno 16 kombinacija za boje ona koristi 4 niža bita za iste, a ostala viša četri bita su setovana. Zbog toga treba oduzeti od prikazanog broja 240 i dobićete traženu vrednost.
Ovim završavamo za danas.
Lekcije koje smo do sada prešli su tu da vam zagolicaju znatiželju kako bi ste i sami počeli da istražujete zanimljivosti i mogućnosti retro računara. Uživajte u njima.