lekcija 6 – Škola programiranja u standardnom bejziku C64
RETRO KUTAK
Lekcija 6 – Ekranska memorija, boje i sprite grafika u Commodore 64 BASIC-u
Svemirci su među nama (modovi grafike, rad sa multikolor sprajtovima)
Dobrodošli na šesti čas „Male škole programiranja na Commodore 64 u BASIC-u“. Danas ćemo nastaviti sa upoznavanjem mogućnosti i naredbi C64 računara. Dajemo kao i obično neke savete i primere za ono što učimo.
Počnimo sa savetima i objašnjenjima
Za sam početak jedna važna napomena
Kod unosa vrednosti u memorijske lokacije naredbom POKE moramo veoma paziti da li su te lokacije dozvoljene za unos ili su zauzeti programom, važnim podacima za rad sistema i sl. U slučaju da tu pokušamo da unesemo neku vrednost možemo izazvati krah sistema, poremećaj rada računara, brisanje programa koji smo uneli ili korupciju istog i još mnogo neželjenih posledica gde softverski reset (RUN/STOP+RESTORE) ne pomaže. Naravno ukoliko ugasimo i upalimo računar sve će se vratiti u normalu. Neki računari su imali ugrađeni reset taster koji su u većini slučajeva rešavali ovaj problem. (Kod emulatora postoji takozvani softverski i hardverski reset. Softverski će resetovati virtualni sistem kod programa koji nisu uništili važne podatke u bitnim memorijskim lokacijama, a hard reset postavlja sve na početak tako da prekida bilo koju neugodnu situaciju. Uvek možemo isključiti pa ponovo ukljućiti emulator). Naravno sa unetim programom možemo se pozdraviti ako isti nismo prethodno snimili na kasetu, disketu ili kod emulatora na virtualnu disketu ili opcijom state i sl.
Ekranska memorija
Prilikom startovanja računara ulazimo u takozvani tekstualni mod. Sve što u tom trenutku vidimo na ekranu mora da se nalazi negde u memorijskoj mapi C64. Memorijske lokacije koje su zadužene za prikaz karaktera na ekranu počinju od adrese 1024 i završavaju sa 2023 (ukupno 1000 karaktera). Svaki karakter nosi svoj broj (0-255) i ima ih ukupno 256. Pošto postoje dva seta karaktera (set 1 velika slova,brojevi i veća grupa simbola i set 2 mala i velika slova,brojevi i manja grupa simbola) imamo 512 mogućih karaktera (naravno na ekranu ih nemožemo sve ispisati istovremeno, već zavisi u kom setu se nalazimo. Takođe mnogi karakteri iz prvog seta se ponavljaju u drugom tako da u stvari nemamo 512 različitih karaktera). Upisom nekog broja u memorijsku lokaciju dobićemo karakter vezan za taj broj. To će najbolje ilustrovati sledeći primeri:
5 M=0
10 PRINT „(SHIFT+CLR/HOME)“
20 FOR I=1024 TO 1279
30 POKE I,M
40 M=M+1
50 NEXT I
Ovaj program će ispisati svih 256 karaktera seta u kome se nalazimo počev od gornje ivice ekrana (memorijska lokacija 1024 do 1279 – 256 bajta).
Takođe ovo znači da svaki karakter možemo trenutno prikazati bilo gde na ekranu što se da videti iz sledećeg primera:
10 M=INT(RND(1)*1000)
20 B=INT(RND(1)*256)
30 POKE 1024+M,B
40 GOTO 10
U programu se generišu dve promenljive. Jedna sadrži slučajan broj od 0 do 999 a druga od 0 do 255. Zatim se u prvoj memorijskoj lokaciji ekranske memorije uvećanoj za slučajni broj od 0 do 999 unosi slučajan broj od 0 do 255. Na kraju se daje besonačna petlja.
Posle startovanja ovog programa neprestano će se pojavljivati slučajni karakteri po celom ekranu
Ovde je bitno napomenuti da se ekranska memorija nalazi između bitnih memorijskih lokacija odgovornih za rad računara i postavke bejzika. Ukoliko prilikom unosa jednog ili skupa karaktera putem naredbe POKE u ekranskoj memoriji slučajno pogrešno unesemo vrednosti memorijskih lokacija možemo krahirati računar, izbrisati/oštetiti bejzik program koji smo upravo uneli i sl. Onda moramo isključiti/uključiti računar pa sve iz početka (naravno ukoliko nismo pre toga snimili naš program što bi nas izvuklo iz ove situacije).
Kako još možemo iskoristiti direktni unos podataka u ekransku memoriju? Na taj način što možemo programskim putem uvek ispisivati karaktere na željeno mesto nezavisno od naredbe PRINT, crtati karakterima. brisati željene i sl.
Dajemo mali primer:
10 PRINT „PROBA“
20 POKE 1079,1: POKE 1080,2:POKE 1081,3:POKE 1082,4:POKE 1083,5
30 FOR I=1 TO 100:NEXT I
40 GOTO 10
U redu 10 imamo ispis na ekranu „PROBA“. Programska linija 20 direktno unosi u memorijske lokacije zadužene za prikaz karaktera pet slova ABCDE koji će se uvek tu ispisivati. Red 30 usporava ispis. Red 40 pravi beskonačnu programsku petlju
Startovanjem ovog programa naredba PRINT će neprestano ispisivati reč PROBNO a ceo sadržaj ekrana kada ispis dođe do kraja skrolovati na više. Istovremeno u drugom redu desno ispisivaće se 5 slova ABCDE uvek na istom mestu. Kada se ekran skroluje slova će se pomeriti na gore a nova pet karaktera će se upisati na njihovo mesto i tako beskonačno.
Kolor memorija
Kolor memorija u tekstualnom modu se kreće u memorijskim lokacijama od 55296 do 56295 za svaki karakter u ekranskoj memoriji. Svi karakteri u ekranskoj memoriji 1024-2023 imaju svog para u kolor memoriji 55926-56295.
To nam pruža mogućnost da promenimo boju svakom karakteru navodeći memorijsku lokaciju boje na mestu gde se karakter nalazi. Naprimer želimo da slovo A bude u prvoj koloni i prvom redu ekrana i da bude crvene boje. Dodeljujemo ekranskoj memorijsoj lokaciji 1024 vrednost 1 a zatim u kolor memorijskoj lokaciji 55296 unosimo broj 2
Primer:
10 FOR I=1024 TO 2023
20 POKE I,1
30 NEXT I
40 FOR I=55296 TO 56295
50 POKE I,RND(0)*16
60 NEXT I
70 END
U redu 10 daje se petlja koja ide od 1024 do 2023 (ekranska memorija). U redu 20 unosimo u memorijsku lokaciju vrednost 1 što odgovara slovu „A“. Red 30 pravi petlju sve dok se ne ispuni svih 1000 ekranske memorijske karakterom „A“. U redu 40 započninjemo novu petlju ovog puta od 55296 do 56295 (kolor memorija). U redu 50 unosi se u kolor memorijsku lokaciju slučajna vrednost od 0 do 15. Red 60 pravi petlju koja traje dok se ne ispuni svih 1000 kolor memorije slučajmim bojama karaktera. Red 70 označava kraj programa (nije potrebno upisati).
Šta će se desiti? Program će redosledno ispuniti ekran sa slovom „A“, a zatim ih obojiti u 16 slučajnih brojeva
Petascii karakteri
Do sad smo govorili o karakterima koje se direktno unose u memorijsku mapu a takođe smo rekli da naredba PRINT ima mogućnost ispisivanja i promene boje karaktera kao i njihovog položaja na ekranu i sl. E sada preokret u priči. Naredba PRINT radi sa drugačijem sistemom kontrole karaktera od onh koje smo videli kada smo direktno unosili vrednosti u ekranskoj memoriji. Konstrukori su zamislili da korisniku što više olakšaju rad zato su uneli u sistem tzv.PETASCII kodove (ovde su obuhvaćene karakteri.boje i akcije) koje koristi naredba PRINT (da ne bude zabune i te petascii karaktere i boje koje zadajemo programski sistem pretvara u karaktere ekranske memorije i u boje kolor memorije i kao takve ih upisuje). U tabeli PETASCI kodova nalaze se svi raspoloživi karakteri u setu kao i maniplacije sa mestom ispisa, bojama i dr. PETASCII kodovi za karaktere se razlikuju po brojevima od ekranskih kodova za iste (primer:ekranski kod za slovo A je 1 a kod PETASCII je 65). Takođe postoji funkcija koju ćemo izučavati u ovom tekstu koja zadavanjem broja PETASCII koda ispisuje karakter, menja boje ili sprovodi akcije (npr.brisanje ekrana, pomera kursor i td.) iz tabele.
Grafika visoke rezolucije
Već smo se upoznali sa nedostacima standardnog bejzika C64. Jedan od njih je da ne postoje naredbe za visoku grafiku. Da bi smo do nje došli i ovde moramo manipulisati vrednostima memorijske mape koje su zadužene za to. Rezolucija ove grafike je 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 (lice karaktera i transparentna pozadina). Imajte u vidu da se rad sa visokom rezolucijom nikako ne isplati u standardnom C64 bejziku zbog značajne sporosti. Tako da ćemo ubuduće ostati u tekstualnom načinu rada, a samo ćemo pomenuti kako možemo doći do visoke grafike i dati primere.
Kako uključiti ekran visoke rezolucije? Tako što ćemo u memorijsku adresu 53265 uneti vrednost 59. Zatim u memorijsku adresu 53272 unosimo vrednost 28. Ovo iz razloga da bi nam ekran visoke rezolucije počinjao od memorijske adrese 8192, imao veličinu 8000 bajta i završavao se sa memorijskom adresom 16191 (imajte u vidu da memorijske lokacije 53265 i 53272 imaju još podešavanja, svaki bit nešto znači, ali nama je bitno samo da uključimo ekran visoke rezolucije i to ovako postižemo). Kada ovo uradimo ekran će promeniti izgled, više se neće videti karakteri već nepoznati grafički oblici, boje veličine karaktera i sl.(zavisi šta se već nalazi u ovim memorijskim lokacijama kada budemo uključili ekran visoke rezolucije).
Da bismo videli kako možemo manipulisati visokom rezolucijom iz standardnog bejzika C64 dajemo mali primer:
10 POKE 53265,59
Uključuje se visoka rezolucija.
20 POKE 53272,28
Podešava se da memorija visoke rezolucije počinje od memorijske adrese 8192 (veličina je 8000 bajta), a ekranska (koja je ovde postaje kolor memorija) od 1024 i veličine je 1000 bajta
30 POKE 53280,0
Daje se boja okviru (ova memorijska adresa sadrži boju okvira i jedina važi za sva tri grafička moda)
40 FOR I=1024 TO 2023
Aktiviramo ciklus koji ide od vrednosti 1024 do 2023 (ekranska/kolor memorija)
50 POKE I,16
Punimo ove adrese vrednošću od 0 to 255. (logička jedinica (1) ekrana visoke rezolucije se farba bojom koja se nalazi u viša 4 bita ekranske memorije a pozadina logička nula (0) bojom iz nižih 4 bita iste). U našem primeru unosimo vrednost 16 u svim memorijskim lokacijama ekranske/kolor memorije tako da će lice grafike visoke rezolucije biti ofarbano belom, a pozadina crnom bojom (16 – 0001 0000 – 1-boja lica, 0-boja pozadine) u matrici 8×8
60 NEXT I
Petlja se završa unosom vrednosti u svim memorijskim lokacijama u ekranskoj/kolor memoriji
70 FOR I=8192 TO 16191
Određuje se petlja sa svim adresama ekrana visoke rezolucije
80 POKE I,0
Brišemo vrednosti iz memorijskih lokacija ekrana visoke rezolucije i samim tim ga praznimo
90 NEXT I
Završavamo petlju kada obrišemo ceo ekran visoke rezolucije
100 FOR I=8192 TO 16191
Otvaramo novu petlju za unos vrednosti u svim memorijskim lokacijama ekrana visoke rezolucije
110 POKE I,202
Unosimo vrednost u memorijskim lokacijama od 0-255 u našem slučaju broj 202 i na ovaj način punimo ekran visoke rezolucije šarom (binarna vrednost broja je 11001010)
120 NEXT I
Zatvaramo petlju kada unesemo sve vrednosti u ekran visoke rezolucije
Iz ovog primera jasno vidimo dve stvari. Prva stvar je da se memorijske lokacije visoke rezolucije pune po matricama 8×8 (horizontala iz kombinacije bita u bajtu čiju smo vrednost uneli a vertikala iz 8 unetih bajtova),zatim se prelazi na sledeću matricu i tako do kraja. Matrice su poređane u 40 kolona horinzontalno i 25 kolona vertikalno. Svaki bit je tačka u visokoj rezoluciji.
Što se tiče druge stvari kada startujete program videćete zašto se ne isplati ni pomisliti raditi standardnim bejzikom u visokoj rezoluciji. Trebaćemo oko minut,dva da dovrši zadatak. Mašinac sve ovo odradi u deliću sekunde
Multikolor grafika
Sve što važi za visokorezolucijsku grafiku važi i za multikolor grafiku sa razlikom da je ovde rezolucija 160×200 u četri boje po karakteru (u ovom modu rada prikazuju se 160 tačaka po horizontali i 200 tačaka po vertikali prikaza i tačke se boje u veličini karaktera 8×8 u četri boje, boja pozadine, lica karaktera i dve dodatne boje), To se postiže deobom bajta na četri dela po 2 bita tako da je tačku moguće iskazati u četri boje (kombincije 11,10,01,00). Zbog toga je horizontalna rezolucija multikolor grafike dva puta manja ali zbog duplo duže tačke pokriva se ista horizontalna površina kao i kod visokorezolucije.
Najlakše je da objasnimo rad u multikolornoj grafici sledećim primerom:
10 PRINT (SHIFT+CLR/HOME)
Brišemo ekran
20 POKE 53265,59
Uključuje se visoka rezolucija
30 POKE 53270,23
Uključuje se multikolor grafika
40 POKE 53272,28
Podešava se da grafika bude od 8192 memorijske lokacije a ekranska bude od 1024 (obe zauzimaju po 1000 bajta. Kako u visokorezolucijskom, tako i u multikolor modu ekranska memorija služi za boje, samo što kod multikolor rezolucije i kolor memorija igra svoju ulogu)
50 POKE 53280,4
Određuje se boja okvira
60 POKE 53281,5
Ovde se određuje boja pozadine za kombinaciju (00)
100 FOR I=1024 TO 2023
Aktivira se petlja za unos vrednosti u svim adresama ekranske memorije. Prva četri viša bit daju 16 boje kod kombinacije (01), a druga 4 niža bita daju boju kombinaciji (10) za vrednosti koje su unete u multikolor rezoluciji
110 POKE I,16
U svim memorijama ekranske rezolucije možemo uneti vrednosti od 0 do 255. U našem primeru uzimamo broj 16 (binarno se iskazuje kao 0001 0000 – 1,0 decimalno). Znači da će tačke multikolor grafike sa kombinacijom (01) biti obojene crno, a (10) – belom bojom u matrici 8×8
120 NEXT I
Završavamo unos vrednosti u celoj ekranskoj memoriji
200 FOR I=55296 TO 56295
Petlja za unos vrednosti u svim adresama kolor memorije. (4 niža bita daju boju kombinaciji 11).
210 POKE I,2
U svim memorijama kolor rezolucije unosimo vrednosti od 0 do 15. U našem primeru koristimo broj 2. Znači da će multikolor tačke sa kombinacijom (11) biti obojene crveno u matrici 8×8
220 NEXT I
Završavamo sa unosom vrednosti u svim memorijskim lokacijama kolor memorije
300 FOR I=8192 TO 16191
Ovde pravimo petlju za unos podataka u celoj multikolor memoriji
310 POKE I,0
Brišu se vrednosti iz memorijskih lokacija multikolor grafike (u memoriji se unosi vrednost 0)
320 NEXT I
Završetak petlje brisanja memorije multikolor rezolucije
400 FOR I=8192 TO 16191
Ovde ponovo aktiviramo petlju za unos podataka u celoj multikolor memoriji
410 POKE I,201
Unosimo u multikolor memoriji broj 201 (od mogućih 0-255). Zašto baš njega? Zato što se on binarno piše kao 11001001 – (11)(00)(10)(01) imamo kombinacije za sve tri boje plus pozadina
420 NEXT I
Završetak petlje unosa podataka u svim memorijskim lokacijama multikolor rezolucije
Kada aktiviramo program prebacićemo se u ekran visoke rezolucije pa odmah u multikolor rezoluciju. Podesiće se boja okvira na ljubičastu, a boja multikolor pozadine kombinacije (00) na zelenu. Zatim će se uneti u svim memorijskim lokacijama ekranske memorije po matricama vrednost 16 za kombinaciju (01)-crno, a (10)-belo. Sledeće je setovanje svih memorijskih lokacija u kolor memoriji što će multikolor tačkama kombinacije (11) dati crvenu boju. Na kraju brišemo multikolor ekran i ispunjavamo ga vrednošću 201 čija binarna vrednost u sebi sadrži sve multikolor kombinacije.
Iz ovog primera vidite da rad sa multikolor grafikom, kao i sa visokorezolucijskom grafikom, u standardnom bejziku nema nikakvog smisla zbog izuzetne sporosti. Prema tome nećemo se vraćati više na njih u našim lekcijama.
Kako startujemo uneseni mašinski program iz standardnog bejzika
Znam da su ovo časovi bejzika i nećemo se petljati sa naredbama koje su vezane za mašinski jezik ali ipak ćemo se osvrnuti na jednu. To je naredba SYS i služi za startovanje mašinskog programa iz standardnog bejzika C64 navodeći memorijsku adresu gde se on nalazi. Napomenućemo samo jedan bitni slučaj i to je SYS 64738. Ovo će pozvati mašinski podprogram samog sistema koji je zadužen za postavljanje osnovnih podešavanja sistema odnosno sofversko resetovanje računara. Kada je zadamo kompjuter će se vratiti u stanje u kojoj je bio priikom uključenja (dobro ako radimo u asembleru/mašincu ti programi će i dalje bii u memoriji ali to za nas nije bitno)
Krenimo sa današnjom lekcijom
Danas ćemo naučiti još neke funkcije
CHR$- prikaz komodorovog (Petascii) koda kao odgovarajućeg karaktera,boje ili akcije
Ova funkcija nam pruža mogućnost da iz komodorove (Petscii) tabele unošenjem odgovarajućeg broja prikažemo neki karakter,boju ili akciju. Takođe možemo rezultat smestiti u neku tekstualnu promenljivu
Formati funkcije:
PRINT CHR$(65)
A$=CHR$(I)
Primer:
10 FOR I=0 TO 255
Dajemo ciklus za svih 255 karaktera
20 PRINT „KOD“;I;“DAJE „;:PRINT CHR$(I)
Štampamo tekst „Kod“ i ispisujemo njegov broj onda štampamo „Daje“ i dajemo izgled tog Petascii koda (naravno tu može kako smo to napomenuli osim karaktera biti promena boje,seta,mesta ispisa i td.)
30 GET A$:IF A$=““ THEN 30
Ovde čekamo dok korisnik ne pretisne bilo koji taster
40 POKE 53281,I
U ovom redu stalno menjamo boju pozadine iz razloga ako petascii kod za boju karaktera da boju pozadine neće se ništa videti dok neki drugi kod ne promeni boju karaktera
50 NEXT I
Kraj petlje kada se prikažu svih 256 mogućnosti (0-255 petascii kodova)
U ovom programu će biti prikazani svih 256 karaktera boja i akcija koje su date u Petascii tabeli. Može vas zbuniti kada set pređe iz velika u mala slova i obrnuto (pritisak na commodore i shift taster), ili kad ispis počne od prvog reda (home) ili red preskoči (enter) itd. ali to je i prava snaga korišćenja mogućnosti Petascii kodova. Pomoću ovog programa možete videti tačno koji su vam kodovi potrebni i to kasnije iskoristite u svojim programima
ASC – prikazuje brojnu vrednost Petascii karaktera
Data funkcija nam nalazi i prikazuje koja je brojna vrednost prvog karaktera koga otkucamo u tekstu ili se nalazi u nekoj tekstualnoj promenljivi iz Petascii tabele. U slučaju da neznamo koji broj karaktera nosi neki znak a želimo da isti iskoristimo putem funkcije CHR$ ovo je najbrži način da saznamo.
Formati funkcije
PRINT ASC („ABCD“)
A=ASC(X$)
Primer:
10 A$=“ABCD“
20 PRINT ASC (A$)
30 B=ASC(„MIKI“)
40 PRINT B
Dobićemo rezultat 65 i 77 (što odgovara slovu „A“ i „M“ iz Petasci tabele)
LEN – prikaz broja karaktera u tekstu ili tekstualnoj promenljivi
Ova funkcija izračunava koliko karaktera ima u nekom tekstu ili tekstualnoj promemljivi i rezulat prikazuje ili smešta u zadatu numeričku promenljivu
Format funkcije
PRINT LEN („ABCDE“)
A=LEN (A$)
Primer:
10 PRINT „UNESITE REC SA NAJVISE 5 SLOVA“
20 INPUT X$
30 A=LEN (X$)
40 IF A>5 THEN PRINT „POGRESNO. OVA REC IMA“;A;“UNESITE PONOVO“:GOTO 10
50 PRINT „UNELI STE ISPRAVNO. VASA REC IMA“;A;“SLOVA“
Posle startovanja programa traži se da se unese reč. Naredba LEN proračunava koiko ta reč ima slova. Ukoliko ima više od 5 traži se ponovni unos. Ukoliko ne sve je uredu i program se završava.
STR$ – pretvaranje numeričke u tekstualnu vrednost
Pomoću ove naredbe svaki numerički podatak bilo broj ili vrednost numeričke promenljive postaju tekst koji se može prikazati ili uneti u tekstualnoj promenljivi
Format funkcije:
PRINT STR$ (4)
X$=STR$(M)
Primer
10 PRINT „UNESI PRVI BROJ“
20 INPUT A
30 X$=STR$(A)
40 PRINT „UNESI DRUGI BROJ“
50 INPUT B
60 Y$=STR$(B)
70 C$=X$+Y$
80 PRINT „OVO JE SVE TEKST BEZ OBZIRA STO STE UNELI BROJEVE“;C$
Program traži unos dva broja, pretvara ih u string/tekst i smešta u tekstualne promenljive a zatim ispisuje poruku sa tim unetim bivšim numeričkim, sada tekstualnim karakterima
VAL – pretvaranje tekstualne vrednosti u numeričku
Ova funkcija pretvara tekstualnu vrednost iz teksta ili tekstualne promenljive u numeričku u slučaju da je na početku teksta ili tekstualne promenljive broj ili predznak + ili – sa pratećim brojem
Format funkcije
PRINT VAL („43“)
M=VAL (X$)
Primer
10 PRINT „UNESITE TEXT SA BROJEM NA POCETKU“
20 INPUT X$
40 A=VAL (X$)
50 PRINT „UNETI BROJ NA POCETKU TEKSTUALNE PROMENLJIVE „;
60 PRINT „PRETVORILI SMO U NUMERICKI PODATAK I POMNOZILI SA 5 =“;
70 PRINT A*5
Kada startujemo program i unesemo traženu tekstualnu vrednost ukoliko na početku ima broj sa ili bez predznaka naredba će prihvatiti taj broj i pomnožiti sa 5. Zatim prikazujemo tekst i vrednost.
FRE – prikaz slobodne memorije za bejzik i promenljive
Data funkcija prikazuje koliko još imamo slobodne memorije za unos bejzika i njegovih promenljivi u trenutku kada je aktiviramo. Ovo je jedna od retkih naredbi/funkcija koja sadrži u sebi grešku (bag). Prilikom startovanja često se očitava negativna vrednost. Da bi ispravili ovo treba ukoliko je očitana negativa vrednost dodati broj 65535.
Oblik funkcije
PRINT FRE(0) – umesto nule možemo staviti bilo koji broj (nepotrebni argument ali je obavezan)
A=FRE(0)
Primer:
PRINT FRE(0)+65535*ABS((FRE(0)<0))
Šta ovde imamo? Kada damo naredbu FRE(0) na vrednost iste dodajemo vrednost 65535 množenu sa istinitostim rezultata da li je prikaz memorije manji od nule. Ako jeste 65535 se množi sa 1 (istinitost daje rezultat -1 ali ASB ga pretvara u pozitivnu vrednost). Takođe smo mogli jednostavno da stavimo -65535 čime bi se izbegla potreba za ABS naredbom ali ovo je za primer kada dodajemo vrednost. Ako nije manja od nule onda je istinitost 0 tako da kada se pomnoži sa 65535 daje 0 i ostaje samo očitana vrednost. Zašto nismo dali ovu funkciju u programskom redu? Iz razloga što bi smo time umanjili bejzik memoriju za veličinu programskog reda a to ne želimo
TIME – (TI) čita vrednost tzv.čifa (1/60 sekunda) od uključenja kompjutera
Ova funkcija nam pokazuje koliko je čifa tj.60 dela sekunde prošlo od uključenja računara. Takođe imajte na umu da je ovo funkcija a ne promenljiva zato TIME ili TI ne možete koristiti kao numeričku promenljivu
Format funkcije:
PRINT TIME
A=TI
Primer:
10 PRINT „OD UKLJUCENJA RACUNARA JE PROSLO“;TIME/60;“SEKUNDI“
Prikazuje se vreme u sekundama (čif smo podelili sa 60) od uključenja računara (ili emulatora)
Vreme je za nove naredbe i primere.
TIME$ – (TI$) – Očitava i podešava vreme u računaru
Ova naredba služi da očitamo ili podesimo vreme iz unutrašnjeg časovnika kompjutera i povezana je sa funkcijom TIME. Kao što smo rekli za prethodnu naredbu ugrađeni časovnik u računaru odbrojava vreme svakih 60 dela sekunde (čif). Da se ne bismo zamajavali proračunom a i da bi smo mogli da setujemo vreme, data je naredba TIME$ ili TI$
Format naredbe:
TIME$=“102015″
PRINT TI$
X$=TIME$
Primer:
10 PRINT „(SHIFT+CLR/HOME)“
Brišemo ekran
20 TIME$=“071020″
Podešavamo vreme (u našem slučaju 7 sati,10 minuta i 20 sekundi)
30 SAT$=LEFT$(TIME$,2)
Za gornju promenljivu uzimamo iz vremena prva dva karaktera sa leve strane (sati)
40 MIN$=MID$(TIME$,3,2)
Za gornju promenljivu uzimamo iz vremena dva karaktera počev od 3 karaktera u sredini (minute)
50 SEC$=RIGHT$(TIME$,2)
Za gornju promenljivu uzimamo iz vremena prva dva karaktera sa desne strane (sekundi)
60 PRINT „(KURZOR GORE)“+SAT$+“:“+MIN$+“:“+SEC$
Ovde prikazujemo promenljive za sat,minute i sekunde odvojene „:“ i sa zadatim kurzorom gore na početku stalno se vraćamo na prethodni red tako da se vreme ispisuje uvek na istom mestu
70 GOTO 30
Beskonočna petlja
Kada startujemo program dobićemo stalno ispisivanje vremena u gornjem levom uglu ekrana.
ON – odlazak na željeni programski red zavisno od argumenta
Ovom naredbom odlazimo na programsku liniju zavisno od numeričke vrednosti argumenta i navedenih programskih brojeva posle GOTO ili GOSUB naredbe. Naredba ON nam može poslužiti kada želimo grananje u programu zavisno od nekog rezultata
Format naredbe:
ON A GOTO broj linije,…broj linije
ON A GOSUB broj linije,…broj linije
Primer:
10 PRINT „IDI NA PROGRAMSKI LINIJU UNOSOM 1-50, 2-60, 3-70“
20 INPUT A
30 IF A<1 OR A>3 THEN PRINT „NEISPRAVNO“:GOTO 10
40 ON A GOTO 50,60,70
50 PRINT „OVO JE LINIJA 50“:END
60 PRINT „OVO JE LINIJA 60“:END
70 PRINT „OVO JE LINIJA 70“:END
Na kraju dajemo još jednu arkadu. Ovde ćemo naučiti o nekim cakama koje mogu da vam pomognu prilikom programiranja.
Igra je krajnje jednostavna. Svemirski brod (koji ni malo ne liči na svemirski brod ili možda?) treba da dođe do svoje stanice a da ga pritom ne pogode projektili. Inače može da izdrži pet udarca a onda igri je kraj.
10 GOSUB 2000
Odlazimo na podprogram gde se ispisuje naziv i uputstvo
20 FOR I=1 TO 20
Počinjemo petlju od 20 ciklusa
30 A=PEEK(53278)
40 A=PEEK(53279)
U redovima 30 i 40 očitavamo memorijske vrednosti sudar sprajta sa pozadinom i drugim sprajtom
50 NEXT I
Zavšavamo petlju. Zašto smo je uopšte radili? Dešava se da zadnja očitavanja sudara iz prethodne igre ne budu odmah resetovane tako da zbog toga nova igra može da se trenutno završi jer ispitivanje smatra da je detektovan sudar. Kad očitamo više puta ove vrednosti iste se normalizuju
60 FOR I=1 TO 25:PRINT:NEXT I
Ova petlja štampa 25 prazna reda. To radimo iz razloga da kursor dođe do kraja ekrana i da može da radi skrolovanje ekrana na više koje će nam ubrzo zatrebati
70 FOR I=832 TO 894
Pravimo ciklus kojim ćemo ispuniti adresu od 832 do 894 podacima o izgledu sprajta
80 READ M
Očitavamo te podatke iz DATA linija
90 POKE I,M
Upisujemo te podatke u memorijske lokacije rezervisane za sprajt
100 NEXT I
Zatvaramo petlju posle unosa svih 63 bajta izgleda sprajta
110 RESTORE
Pokazivač čitanja podataka iz DATA linija se vraća na početni podatak
120 POKE 53269,1
Uključujemo prvi sprajt
130 POKE 2040,13
Za prvi sprajt unosimo da se isti nalazi u memorijskoj lokaciji 832 (13×64) gde smo ga i smestili
140 POKE 53248,170:POKE 53264,0
Određujemo početnu horizontalnu vrednost prvog sprajta i poništavamo 9 bit (koji kad je setovan za X kordinatu daje vrednost 256). Podsećamo da horizontalna kordinata ide od 0 do 320
150 POKE 53249,30
Određujemo početnu vertikalnu vrednost prvog sprajta. Y kordinata ide od 0 do 255
160 POKE 53269,3
Uključujemo i drugi sprajt. Gore smo uključili prvi sprajt dodelivši memorijskoj lokaciji 53269 vrednost za prvi bit 1. Kada uključujemo drugi sprajt u ovoj lokaciji dodajemo vrednost drugog bita a to je dva. Da bi smo imali oba sprajta uključena to daje ukupnu vrednost 3 što znači da su nulti (za prvi sprajt) i prvi (za drugi sprajt) bitovi setovani (uključeni)
170 POKE 53250,170:POKE 53264,0
Ovde podešavamo za drugi sprajt horizontalnu poziciju (isto kao i kod prvog samo što je ovo memorijska lokacija X horizontalne pozicije za drugi sprajt)
180 POKE 53251,230
Ovde dajemo vrednost za vertikalnu poziciju drugog sajta
190 POKE 53276,1
Uključujemo da je prvi sprajt multikolorni. I ovde važi da svaki sprajt ima svoj bit u ovoj memorijskoj lokaciji
200 POKE 2041,13
E sada ono glavno. Podešavamo da drugi sprajt takođe ima memorijsku lokaciju od 832 do 894. Time smo izgled koji smo dali prvom sprajtu dali i drugom sa jednom bitnom razlikom. Kod drugog nismo uključili da je multikolorni sprajt tako da će izgledati kao razlivena jednobojna verzija prvog sprajta. Takođe mogli smo i njemu da damo da je multikolor i dodelimo boje ali smatramo da je ovaj efekat bolji. Ovaj način dodeljivanja istog izgleda možemo sprovesti kod svih 8 sprajtova
205 XK=170:YK=30:XI=170
Ovim programskim redom formiramo numeričke promenljive za X i Y osu prvog sprajta kao i X osu drugog sprata (njega ćemo pokretati samo po X osi) i dodeljujemo im početne vrednosti
210 A=PEEK(197)
Iz ove memorijske lokacije iščitavamo tastaturu. Svaki pretisnuti taster ima svoj broj
220 IF A=10 THEN XK=XK-5
Vrednost 10 znači da je pretisnuto slovo „A“. Smanjujemo X kordinatu prvog sprajta za 5
230 IF A=18 THEN XK=XK+5
Vrednost 18 znači da je pretisnuto slovo „D“. Povećavamo X kordinatu prvog sprajta za 5
240 IF A=9 THEN YK=YK-5
Vrednost 9 pretisnuto je slovo „W“. Smanjujemo Y kordinatu prvog sprajta za 5
250 IF A=13 THEN YK=YK+5
Vrednost 13 pretisnuto je slovo „S“. Povećavamo Y kordinatu prvog sprajta za 5
260 IF XK<20 AND IN=0 THEN XK=20
Ova ispitivanja su identična kao i kod igrice Formula 1 iz prošle lekcije ali da ponovimo opis. Ukoliko je X kordinata prvog sprajta manja od 20 i nije setovan 9 bit onda dodeljujemo X kordinati vrednost 20 i samim tim sprečavamo da prvi sprajt ode sa ekrana na levoj strani
270 IF XK<0 AND IN=1 THEN XK=255:POKE 53264,0:IN=0
Ukoliko je X kordinata prvog sprajta manja od 0 i setovan je 9 bit onda dodeljujemo X kordinati vrednost 255 i time radimo prelaz iz 9 bita (256) u maksimum 8 bita (255). Poništavamo 9 bit i indikator
280 IF XK>255 THEN XK=0:POKE 53264,1:IN=1
Ukoliko je X kordinata prvog sprajta veća od 255 onda dodeljujemo X kordinati vrednost 0 i setujemo 9 bit prvog sprajta (256) i indikator
290 IF XK>64 AND IN=1 THEN XK=XK-5
Ukoliko je X kordinata prvog sprajta veća od 64 i setovan je 9 bit to znači da smo izašli iz okvira maksimuma X ose prvog sprajta (256+64=320). Zato umanjujemo X osu za 5 i samim tim sprečavamo da prvi sprajt ode sa ekrana na desnoj strani
300 IF YK<50 THEN YK=50
Ovde ispitujemo da li je Y kordinata prvog sprajta manja od 50. Ukoliko jeste dodeljujemo joj vrednost 50 i samim tim sprečavamo da nestane nagore sa ekrana
310 IF YK>230 THEN YK=230
Ispitujemo da li je Y kordinata prvog sprajta veća od 230. Ukoliko jeste dodeljujemo joj vrednost 230 i samim tim sprečavamo da nestane nadole sa ekrana
320 POKE 53248,XK
330 POKE 53249,YK
U ova dva reda unosimo kordinate X i Y ose prvog sprajta zavisno od gore ispunjenih uslova
340 IF XI>254 THEN XI=RND(0)*254
Ovde ispitujemo da li je kordinata drugog sprajta veća od 254 ukoliko jeste dodeljujemo joj joj slučajnu vrednost od 0 do 254 (baza se teleportuje). Možemo ograničiti kretanje baze po želji
350 POKE 53250,ABS (XI)
Unosimo X kordinatu u memorijsku lokaciju zaduženu za X kordinatu drugog sprajta. Funkcija ABS nam daje pozitivnu vrednost ako je promenjilva XI zadužena za X kordinatu drugog sprajta manja od 0
360 GOSUB 500
Idemo na podprogram koji pokreće projektile i proverava sudare
370 GOTO 210
Pravimo petlju dok se ne uspune uslovi o pobedi ili gubitku igre
500 B=INT(RND(0)*40)
U ovom podprogramu upravljamo projektilima, ispitujemo sudare i pomeramo bazu levo/desno
Prva linija formira promenljivu sa slučajmim brojem od 0 do 39
510 POKE 1923+B,65
Unosimo u lokaciju ekranske memorije (krajnje dole levo) uvećanu za slučajan broj od 0 do 39 karakter pika (65) koji liči na projektil bar po mom mišljenju. Tako se upisuje simbol pika u slučajnu kolonu kranjeg reda ekrana
520 PRINT
Ovde naredbom PRINT vršimo skrolovanje ekrana za 1 gore (na početku smo uneli 25 prazna reda, tako da ova naredba skroluje ekran za jedan na gore sa svim karakterima na ekranu i projektili se kreću na gore)
530 IF PEEK(53279)=1 THEN GOSUB 800
Ukoliko je došlo do sudara prvog sprajta sa pozadinom (memorijska lokacija 53279 sadrži bit za svaki sprajt koji se sudari sa pozadinom) znači da nas je pogodio projektil (karakter) i idemo na podprogram u redu 800 gde se ispituje koliko je raketa udarilo naš brod, Ukoliko ih je više od 5 dobijamo poruku da smo izgubili i pitanje da li želimo novu igru
540 IF PEEK(53278)=3 THEN 900
Ukoliko je došlo do sudara dva sprajta (memorijska lokacija 53278 sadrži bitove za svaki sprajt u našem slučaju to su sprajtovi 1 i 2 (bit 0 i bit 1) što daje 1+2=3 decimalno) to znači da smo stigli do baze i onda idemo na podprogram 900 gde proglašavamo pobedu
550 E=INT(RND(0)*2)+1
U ovoj promenljivi unosimo slučajan broj od 1 do 2
560 IF E=1 THEN XI=XI-10
Ako je vrednost 1 smanjujemo horinzontalnu vrednost drugog sprajta za 10
570 IF E=2 THEN XI=XI+10
Ako je vrednost 2 povećavamo horinzontalnu vrednost drugog sprajta za 10
580 RETURN
Povratak na glavni program
800 POKE 53280,RND(0)*16
Počinjemo sa podrprogramom koji obrađuje sudar broda (prvog sprajta) sa pozadinom/raketom/ karakter pika) Prvo prilikom sudara menjamo boju okvira u jednu od 16 slučajnih boja
810 IF PO>5 THEN PRINT „(SHIFT+CLR/HOME)IGRI JE KRAJ. IZGUBIO SI“:GOTO 910
Ako je promenljiva koja sadrži pogotke broda raketama veća od 5 brise se ekran, ispisuje se poruka o gubitku ige i ide na programski red 910 koji ispituje da li želimo novu igru ili ne
820 PO=PO+1
Ovde povećavamo promenljivu koja sadrži broj pogotka za jedan
830 RETURN
Povratak na glavni program
900 PRINT „(SHIFT+CLR/HOME)POBEDIO SI. SVAKA CAST“
910 PRINT „JOS JEDNA IGRA? (M/N)“
Ovo je deo programa koji nam obrađuje pobedu. Na početku imo poruku o pobedi i pitanje da li želimo novu igru
920 POKE 53269,0
Isključujemo oba sprtajta da ne bi ostali na ekranu
930 GET A$:IF A$=““ THEN 920
Proveravamo da li je pretisnut neki taster. Ako nije vrtimo se u petlji
940 IF A$=“M“ THEN GOTO 10
Ako je pretisnuto slovo M odlazimo na programski red 10 i otpočinjemo novu igru
950 IF A$=“N“ THEN END
Ako je stisnut taster N onda je igri kraj
960 GOTO 930
Vrtimo se u petlji dok se ne zadovolji neki od dva uslova
1000 DATA 0,0,0
1010 DATA 0,0,0
1020 DATA 0,0,0
1030 DATA 5,85,64
1040 DATA 5,85,80
1050 DATA 26,170,164
1060 DATA 170,170,170
1070 DATA 176,0,14
1080 DATA 140,85,50
1090 DATA 143,0,242
1100 DATA 131,255,194
1110 DATA 128,255,2
1120 DATA 128,0,2
1130 DATA 128,0,2
1140 DATA 191,255,254
1150 DATA 37,85,72
1160 DATA 9,85,96
1170 DATA 2,85,128
1180 DATA 0,170,0
1190 DATA 0,0,0
1200 DATA 0,0,0
Od 1000 do 1200 nalaze se podaci o opisu sprajta koji koristimo (koriste se i za prvi i za drugi sprajt)
2000 PRINT „(SHIFT+CLR/HOME)“
2010 PRINT „SVEMIRSKA BAZA 1“
2020 PRINT „ZADATAK JE OSTVARITI KONTAKT SA BAZOM I IZBECI PROJEKTILE“
2030 PRINT „BROD MOZE PREZIVETI PET UDARCA PROJEKTILA PRE NEGO STO SE RASPADNE“
2040 PRINT „UPRAVLJANJE A-LEVO,D-DESNO,W-GORE,S-DOLE“
2050 PRINT „POKAZITE KOLIKO STE DOBAR PILOT! SAMO NAPRED!“
2060 PRINT „PRITISNITE BILO KOJI TASTER ZA IGRU“
Ovo je podprogram početnog ekrana. Od linije 2000 do 2060 dajemo naslov i uputstvo igračima
2070 GET A$:IF A$=““ THEN GOTO 2070
Ispitujemo da li je pritisnut neki taster. Ako nije vrtimo se u petlji
2080 PO=0
Vrednost promenljive koja sadrži broj pogodaka projektila postaje nula
2090 PRINT „(SHIFT+CLR/HOME)“
Brišemo ekran
2100 RETURN
Povratak na glavni program
Na vama je da dobro analizirate datu igricu. Probajte sami da dodate zvuk, još neki sprajt i slično. Naravno imajte u vidu da će sve što dodate usporiti ionako sporu igru ali to je sve u cilju učenja. Zato ne ustručavajte se. Nagomilajte stvari pa makar posle toga bio jedan frejm u sekundi. Izbacite nešto, dodajte svoje zamisli, promenite parametre, uradite sve što vam padne na pamet.
Ovim završavamo za danas.
Želimo vam uspeha u učenju i uživajte u retro stvarima