RETRO KUTAK – tehnologija prošlih decenijaStandar Basic

lekcija 6 – Škola programiranja u standardnom bejziku C64

Ova lekcija škole BASIC-a za Commodore 64 obrađuje ekransku i kolor memoriju, rad sa visokom i multikolor grafikom, upotrebu spriteova, PETASCII kodove i nove BASIC funkcije (CHR$, ASC, LEN, STR$, VAL, FRE, TIME, TIME$, ON). Uključeni su praktični programi za manipulaciju ekranskim karakterima, bojama, grafikom i animacijom, kao i mini igra sa spriteovima, sudarima i kontrolom pomoću tastature. Lekcija je optimizovana za ključne pojmove: BASIC programiranje C64, ekranska memorija, kolor memorija, sprite grafika, visoka rezolucija, multikolor grafika, PETASCII kodovi, retro programiranje.

RETRO KUTAK

Lekcija 6 – Ekranska memorija, boje i sprite grafika u Commodore 64 BASIC-u

LEKCIJA PRVA LINK

LEKCIJA DRUGA LINK

LEKCIJA TREĆA LINK

LEKCIJA ČETVRTA LINK

LEKCIJA PETA LINK

LEKCIJA ŠESTA LINK

LEKCIJA SEDMA LINK

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

LEKCIJA PRVA LINK

LEKCIJA DRUGA LINK

LEKCIJA TREĆA LINK

LEKCIJA ČETVRTA LINK

LEKCIJA PETA LINK

LEKCIJA ŠESTA LINK

LEKCIJA SEDMA LINK

 

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *