RETRO KUTAK – tehnologija prošlih decenijaStandar Basic

lekcija 7 – Mala škola retro programiranja u standardnom bejziku C64

Sedma i završna lekcija serijala „Mala škola retro programiranja u BASIC-u na Commodore 64“ obuhvata napredne teme: rad sa disketama (1541 jedinica) pomoću komandi OPEN, PRINT# i CLOSE, formatiranje (NEW), brisanje fajlova (SCRATCH), kopiranje (COPY), promenu imena (RENAME), inicijalizaciju (INITIALIZE) i reorganizaciju (VALIDATE). Data je sumirana lista najvažnijih memorijskih lokacija za boje, zvuk, grafiku, sprite-ove i tastaturu. Objašnjen je rad sa bazama podataka u BASIC-u kroz sekvencijalne fajlove, upis, čitanje i brisanje. Obradjene su dodatne naredbe STOP, CONT, WAIT, DEF FN, CMD i USR, kao i matematičke funkcije (SIN, COS, TAN, ATN, SQR, LOG, EXP). Pomenute su i skraćene verzije naredbi za brže programiranje i ručni proračun binarnih u decimalne vrednosti kod sprite dizajna. Ključne fraze: Commodore 64 BASIC advanced tutorial, C64 disk commands, POKE PEEK memorijske lokacije, C64 sekvencijalni fajlovi, retro programiranje baze podataka, WAIT DEF FN primeri, C64 matematičke funkcije.

RETRO KUTAK 

Programiranje u BAIC-u – Lekcija sedam

LEKCIJA PRVA LINK

LEKCIJA DRUGA LINK

LEKCIJA TREĆA LINK

LEKCIJA ČETVRTA LINK

LEKCIJA PETA LINK

LEKCIJA ŠESTA LINK

LEKCIJA SEDMA LINK

Na redove razbrojs (rad sa bazama podataka i sumiranje memorijskih lokacija) 

Dobrodošli na zadnji sedmi čas „Male škole programiranja na Commodore 64 u BASIC-u“. Nadamo se da ste sa nama imali dobru plovidbu retrovodama programiranja u standardnom C64 bejziku. Danas ćemo objasniti dodatne stvari pri radu sa disketama, sumirati sve korisne memorijske lokacije  i još ponešto.

Manipulacija sa podacima na disketi

Iz prethodnih lekcija naučili smo da standardni komodorov bejzik ima samo tri naredbe za rad sa podacima na kasetama, odnosno disketama. To su LOAD – učitaj program, SAVE – snimi program i VERIFY – verifikuj da li je program dobro snimljen. Da bi računar znao da li želimo da koristimo kasetu ili disketu tu su postojali prefiksi i to su bili:

LOAD „ime programa“,1

SAVE  „ime programa“,1

VERIFY „ime programa“,1

za rad sa kasetama mada nije bilo potrebnu upisivati prefiks  ,1 jer se za kasetu to podrazumevalo

LOAD „ime programa“,8

SAVE  „ime programa“,8

VERIFY „ime programa“,8

za rad sa bejzikom na disketama tu je bilo obavezno upisivati prefiks ,8

LOAD „ime programa“,8,1

SAVE  „ime programa“,8,1

VERIFY „ime programa“,8,1

za rad sa bejzikom i mašinskim programima na disketama bilo je obavezno upisivati prefiks ,8,1 – učitaj program u istim memorijskim lokacijama u kojim je i snimljen (ovo je bila najbolja kombinacija i preporučuje se da se koristi kod svih programa bilo bejzika ili mašinca. )

Da bi se video sadržaj diskete kucalo bi se LOAD „$“,8 a onda naredbom LIST video bi se katalog programa na disketi

Kao što vidite ove naredbe nisu dovoljne za sve komande koje su nam bile potrebne kod disketa. (Potrebno nam je da obrišemo fajl sa diskete, promenimo ime fajla, itd.)

Da bi se ovo postiglo postoje naredbe OPEN, PRINT#, CLOSE koje imaju više primena.

Koristeći ove tri naredbe možemo narediti disketnoj jedinici da otvori komandni kanal za rad sa disketom, odradi komandu i zatvori pomenuti kanal.

Kako sve to izgleda?

Kada smo nekada imali pravi C64 u rukama i njegovu disketnu jedinicu koja je nosila oznaku 1541 kupili bi i nove diskete veličine 5,25 inča. Te diskete su mogle da se koriste na više različitih računara pa da bi se iste pripremile za rad sa C64 disketnom jedinicom morale bi se prvo formatirati (prilagoditi za rad na traženom računaru). Kako bi smo to izveli kod C64? (naravno sve ovo važi i za emulatore). Poslužiće nam sledeći program koji koristi gore date naredbe i komandne kodove u okviru njih:

 

NEW – formatiranje nove diskete ili brisanje svih podataka sa stare

10 OPEN 15,8,15

Ovde dajemo računaru naredbu da otvori komandni kanal (15) i poveže ga sa prvom/glavnom disketnom jednicom (8). Moglo se priključiti maskimalno 4 disketne jednice (8-11). Zadnji broj je tzv. sekundardna adresa i ona ima istu vrednosti kao i komandni kanal

20 PRINT#15,“N:ime diskete,ID“

U ovom programskom redu dajemo komandu (N:) kojom vršimo formatizaciju diskete i ujedno brišemo sve stare podatke sa nje ukoliko je pre toga nešto sadržala. Oznaka ID označava identifikacioni dvocifreni broj diskete koji dajemo po našoj želji ali nije obavezan pa se može izostaviti. Moramo biti veoma pažljivi i uvek voditi računa da stavimo novu disketu radi formatizacije ili onu sa koje želimo da izbrišemo sve podatke

30 CLOSE 15

Zatvaramo komandni kanal.

 

Osim formatizacije i brisanja svih podataka ove naredbe i komande u okviru njih su mogle da izvrše i druge bitne operacije na disketama kao što su:

 

SCRATCH – brisanje datoteka na disketi

10 OPEN 15,8,15

20 PRINT#15,“S:ime datoteke 1,ime datoteke 2,…“

U ovom programskom redu dajemo komandu (S:) brisanje datoteka na disketi pod datim imenom. Datoteke su programi sa oznakom PRG ili fajlovi koji sadrže podatke sa oznakom SEQ i sl. Možemo navesti više datoteka koje želimo da izbrišemo.

30 CLOSE 15

 

COPY – Kopiranje datoteka na istu disketu pod drugim imenom

10 OPEN 15,8,15

20 PRINT#15,“C:ime nove datoteke=ime stare datoteke“

U ovom programskom redu dajemo komandu (C:) kopiranje, unosimo ime nove datoteke=ime stare datoteke i nakon toga imaćemo na disketi dve identične datoteke pod različitim imenima

30 CLOSE 15

 

RENAME-promena imena datoteke na disketi

10 OPEN 15,8,15

20 PRINT#15,“R:novo ime datoteke=staro ime datoteke“

U ovom programskom redu dajemo komandu (R:) promena imena. Unosimo novo ime datoteke=staro ime datoteke. Na disketi će se naći data datoteka sa promenjenim imenom

30 CLOSE 15

 

INITIALIZE – Inicijalizuacija (ispravka greške nastale prilikom rada sa disketnom jedincom)

U radu sa disketnom jedinicom dešavalo bi se da dođe do greške koja bi onemogućila dalji radi sa istom. Ova komanda bi rešavala ovaj problem

10 OPEN 15,8,15

20 PRINT#15,“I“

30 CLOSE 15

 

VALIDATE – reorganizacija diskete

Prilikom rada sa disketom i njenoj čestoj upotrebi (pisanje,brisanje i sl.) dolazilo bi do poremećaja podataka u istoj. Oštećene datoteke bile bi označene sa * što bi značilo da iste nisu pristupačne i da ih ne možete koristiti niti obrisati. Tako bi na disketi ostajalo dosta blokiranog i neiskorišćenog prostora. Da bi se to ispravilo i disketa dovela u red postoji ova komanda

10 OPEN 15,8,15

20 PRINT#15,“V“

30 CLOSE 15

 

Sve ove komande su jako korisne pri radu sa C64 disketom bilo fizičkoj ili virtualnoj za emulatore (naravno kod emulatora i PC programa ima i drugih mogućnosti).

 

Sumiranje važnih memorijskih adresa koje smo učili

Dosadašnjim lekcijama prešli smo dosta memorijskih lokacija koje su izuzetno bitne u radu sa C64 standardnim bejzikom (naravno isto tako su bitne i kod asamblera/mašinca). Naredbom POKE vršili smo unos željenih vrednosti u istim i dobijali tražene rezultate, a naredbom PEEK čitali vrednosti iz njih. Najbitnije memorijske lokacije koje smo prešli u dosadašnjim lekcijama sa njihovim opisom i mogućim upisom vrednosti u istima (u svakoj memorijskoj lokaciji u kojim je dozvoljen upis mogu se upisati vrednosti 0-255 ali nisu svi bitovi iskorišćeni ili nisu bitni za traženi rezultat) mogu se videti iz sledećeg pregleda:

 

Memorijska lokacija                             Opis                                                         Vrednosti          

 

Očitavanje tastature

197                              očitavanje tastature u zavisnosti od

pretisnutog tastera – PEEK naredba

Tekstualni mod (prvi grafički mod)

Ekranska memorija

1024-2023                   ekranska memorija 1000 bajta                                    0 – 255

Kolor memorija

55296-56295               kolor memorija 1000 bajta                                          0 – 15

Boje okvira i pozadine

53280                          boja okvira                                                                  0 – 15

53281                          boja pozadine                                                              0 – 15

Zvuk

54272                          niži bajt visine tona 1 kanal                                        0 –  255

54273                          viši bajt visine tona 1 kanal                                        0 –  255

54276                          oblik zvuka 1 kanal                                                     17,33,65,129

54277                          rast i opadanje zvuka (opciono) 1 kanal                     0 – 255

54278                          stalan zvuk i glasnost 1 kanal                                     0 – 255 (240)

54279                          niži bajt visine tona 2 kanal                                        0 –  255

54280                          viši bajt visine tona 2 kanal                                        0 –  255

54283                          oblik zvuka 2 kanal                                                     17,33,65,129

54284                          rast i opadanje zvuka (opciono) 2 kanal                     0 – 255

54285                          stalan zvuk i glasnost 2 kanal                                     0 – 255 (240)

54286                          niži bajt visine tona 3 kanal                                        0 –  255

54287                          viši bajt visine tona 3 kanal                                        0 –  255

54290                          oblik zvuka 3 kanal                                                     17,33,65,129

54291                          rast i opadanje zvuka (opciono) 3 kanal                     0 – 255

54292                          stalan zvuk i glasnost 3 kanal                                     0 – 255 (240)

54296                          jačina zvuka za sva tri kanala                                     0 – 15

Sprajtovi

2040-2047                   određivanje bloka upisa i prikaza za

8 sprajta (blokx64)                                                      13-15,187-191 (do 255)

53248,53250,53252

53254,53256,53258

53260,53262               X kordiinata za sprajtove 0-7 (8 sprajta)                    0 – 255

53249,53251,53253

53255,53257,53259

53261,53263               Y kordiinata za sprajtove 0-7 (8 sprajta)                    0 – 255

53264                          deveti bit za osam sprajta X ose (bit po sprajtu)        0 – 255

53269                          uključivanje visokorez.sprajta (bit po sprajtu)           0 – 255

53271                          proširenje sprajta po Y osi (bit po sprajtu)                  0 – 255

53275                          prioritet prikaza sprajta (bit po sprajtu)                      0 – 255

53276                          uključivanje multikolor sprajta (bit po sprajtu)          0 – 255

53277                          proširenje sprajta po X osi (bit po sprajtu)                 0 – 255

53278                          detekcija sudara sprajta sa sprajtom (bit po sprajtu)   0 – 255

53279                          detekcija sudara sprajta i pozadine (bit po sprajtu)    0 – 255

53285                          boja multikolor sprajta (01) kombinacije tačke          0 – 15

53286                          boja multikolor sprajta (11) kombinacije tačke          0 – 15

53287-53295               boje 8 sprajta visoke rezolucije ili (10) kombinacije

tačke kod multikolor sprajta                                       0 – 15

Grafika visoke (drugi mod) i

multikolor rezolucije (treći grafički mod)

53265                          uključivanje grafike visoke rezolucije                          59

53270                          uključivanje multikolor rezolucije                                23

53272                          određivanje memorijske lokacije za

grafiku visoke ili multikolor rezolucije                         28

53281                          boja pozadine za multikolor tačku (00)                      0 – 15

1024-2023                   ekranska/kolor memorija (matrica 8×8) određuje

vrednost  kod visoke rezolucije za boju

tačke (1) – više bitove, za boju pozadine

(0) – niže bitove,  kod multikolor tačke

kombinacije (01) – više bitove, (10) – niže bitove

ove memorije                                                               0 – 255

55296-56295               kolor memorija (matrica 8×8) određuje boju

multikolor tačke za kombinaciju (11)             0 – 15

8192-16191                 memorija rezervisana za grafiku visoke

rezolucije ili multikolor grafiku                                 0 – 255

 

Kada gledate ovu tabelu imajte u vidu da se pojedine memorijske lokacije koriste za više stvari npr. kolor memorija u tekstualnom i multikolor modu, ekranska memorija kao karakter memorija u tekstualnom modu, a kao kolor memorija u visokorezolucijskom i multikolor modu itd. Takođe sprajtovi se prikazuju u sva tri grafička moda identično.

 

Rad sa bazama podataka

Što se tiče rada sa bazama podataka postoje malo profesionalnih programa za C64 koji su se bavili ovom temom. Naravno svi ti programi koji su bili komercijalni u to vreme pisani su isključivo u asambleru/mašincu. Standardni bejzik C64 nije sadržao direktne naredbe za rad ali ipak je postojao način. Pročićemo sve ovo na brzinu koristeći program koji će kao primer to najbolje ilustrovati:

 

10 PRINT „(SHIFT+CLR/HOME)ZELITE LI UPIS,CITANJE ILI BRISANJE PODATAKA? K ZA KRAJ (U/C/B/K)“

Počinjemo sa pitanjem da li želimo upis,čitanje, brisanje podataka ili kraj programa .

20 GET A$

Ovde očitavamo tastaturu i pretisnuti taster stavljamo u tekstualnu promenljivu A$

30 IF A$=“U“ THEN 100

Ukoliko je pretisnuto slovo „U“ idemo na programski red 100 gde vršimo upis podataka. Inače da napomenemo i ovo ukoliko posle naredbe THEN upišete programski red a ne upišete naredbu GOTO ili GOSUB bejzik će smatrati da je pre programskog reda upisana naredba GOTO te istu možete preskočiti u pisanju

40 IF A$=“C“ THEN 300

Ukoliko je pretisnuto slovo „C“ idemo na programski red 300 gde vršimo čitanje podataka

50 IF A$=“B“ THEN 400

Ukoliko je pretisnuto slovo „B“ idemo na programski red 400 gde brišemo datoteku a samim tim i unete podatke

60 IF A$=“K“ THEN END

Ukoliko je pretisnuto slovo „K“ programu je kraj

70 GOTO 20

Beskonačna petlja dok se ne izabere željena radnja

100 OPEN 5,8,5,“PRIMER,S,W“

Od ovog reda počinje deo za upis podataka. Dati programski red vrši kreiranje datoteke „PRIMER.SEQ“ u kojoj ćemo vršiti upis. Naredbom OPEN otvaramo datoteku pod logičkim brojem 5. Broj određuje programer i može biti u rasponu od 0 do 255 (uglavnom se za logički broj rada sa disketom uzimao broj 5, a za komandni kanal broj 15). Sledeći broj 8 povezuje logičku datoteku sa prvom disketnom jedinicom. Zadnji broj predstavlja tzv.sekundarnu adresu i ona je u našem slučaju ista kao i logički broj. Zatim unosimo naziv datoteke u našem slučaju „PRIMER“. Oznaka „S“ znači da je u pitanju sekvencionalna datotaka (slogovi/redovi se unose redosledno) i na kraju imamo oznaku „W“ što znači da želimo upis u datoteku

110 PRINT „(SHIFT+CLR/HOME)ZA ZADNJI UPIS ZA PREZIME STAVITE KRAJ“

Tekst uputstva kod unosa podataka

120 INPUT „UNESI PREZIME“;P$

Unosimo prezime u promenljivu P$

130 INPUT „UNESI IME“;I$

Unosimo ime u promenljivu I$

140 INPUT „UNESI BROJ BODOVA“;B$

Unosimo broj bodova u promenljivu B$. Vidite da je i ovde bez obzira što je ovo numerički podatak tekstualna promenljiva. Ukoliko nam je potrebno da imamo numerički podatak koristićemo  funkciju VAL kada budemo vršili čtanje podataka ali ukoliko ga samo prikazujemo nije bitno

150 RN$=CHR$(13)

U promenljivi RN$ unosimo kod za RETURN/ENTER. To je iz razloga što nam je ovaj PETASCII kod potreban posle unosa bilo kog podatka u datoteku. Isti označava kraj upisa te promenljive u podacima na disketi

160 PRINT#5,P$RN$,I$RN$,B$RN$

U ovom programskom redu radimo ceo posao. Naredba PRINT# unosi u otvorenu datoteku logičkog broja 5 sve tekstualne promenljive i samim tim pravi slog (red sa svim podacima) datoteke. Obratite pažnju da je na kraj svake promenljive dodata promenljiva RN$ koja sadrži PETASCII kod 13. Malopre smo rekli da je svaki uneti podatak potrebno razdvojiti ovim kodom

170 IF P$<>“KRAJ“ THEN P$=““:I$=““:B$=““:GOTO 120

Ukoliko u promenljivi P$ nije unet KRAJ sve promenljive se prazne i vraća se na programski red  gde se unosi sledeći podatak

180 CLOSE 5

Posle završetka unosa zatvaramo logički kanal 5

190 GOTO 10

Vraćamo se na početak programa gde opet biramo šta želimo da uradimo

300 PRINT „(SHIFT+CLR/HOME)PREGLED UNETIH PODATAKA“

Od ovog programskog reda započinje pregled unetih podataka. Prvo ispisujemo poruku o pregledu unetih podtaka

310 OPEN 5,8,5,“PRIMER,S,R“

Datoteku koju smo kreirali i ispunili podacima ponovo aktiviramo ovog puta za čitanje podataka.  Kao i kod upisa otvaramo datoteku, a dati brojevi imaju isto značenje kao i u primeru za upis. Uzimamo isti naziv datoteke „PRIMER“. Ide S oznaka da je sekvencionalna datoteka i na kraju imamo oznaku R što znači da želimo čitanje iste

320 PRINT „PREZIME   IME   BROJ BODOVA“

330 PRINT „****************************“

U ova dva reda ispisujemo zaglavlje na ekranu i odvajamo od podataka sa zvezdicama

340 INPUT#5,P$,I$,B$

Naredba INPUT# čita podatke unete u datoteci i smešta ih u promenljive koje su identične kao i one kod upisa. Kod 13 koji je upisan uz svaku promenljivu označava gde se ista završava

350 IF P$=“KRAJ“ THEN CLOSE 5:GOTO 500

Ukoliko se došlo do sloga u kome je kao prezime unet tekst „KRAJ“ zatvara se digitalni kanal 5 i odlazi na programski red 500 u kome imamo čekanje da se pretisne neki taster

360 PRINT P$,I$,B$

U ovom programskom redu ispisujemo očitane promenljive iz podataka u datoteci

370 GOTO 340

Vraćamo se ponovo na programski red gde se čita sledeći slog

400 OPEN 15,8,15

Od ovog programskog reda imamo sekvencu za brisanje svih podataka (i same datoteke). Kao i obično otvaramo komandni kanal 15 za prvu disketnu jedinicu 8

410 PRINT#15,“S:PRIMER“

U ovom redu dajemo komandu za brisanje datoteke PRIMER u kojoj su sačuvani svi uneti podaci

420 CLOSE 15

Zatvaramo komandni kanal 15

430 PRINT „PODACI SU IZBRISANI“

Obaveštavamo da su podaci obrisani

500 GET A$:IF A$=““ THEN 500

Čekamo da se pretisne bilo koji taster

510 GOTO 10

Povratak na početak programa

 

Kada startujemo ovaj program dobićemo pitanje šta želimo da uradimo. Prvo ćemo kliknuti na taster „B“ da bi obrisali datoteku ukoliko postoji i spremili za novi unos. Zatim klikćemo na „U“ radi upisa novih podataka. Tu se traži unos prezimena,imena i broj bodova. Unos će se nastaviti sve dok u polju „PREZIME“ ne unesemo „KRAJ“. Kada to uradimo (preskočićemo pritiskom na return/ enter ime i broj bodova) vratiće nas na pitanje šta želimo dalje. Na kraju ćemo pretisnuti taster „C“ radi čitanja unetih podataka. U svakom trenutku možemo da obrišemo sve podatke klikom na taster „B“ u meniju. Za završetak programa pritisnućemo taster „K“.

 

Kao što ste videli i kod C64 možemo raditi sa bazama podataka ali uz ograničenja koje su u to vreme imale diskete i veličine same memorije računara nije bilo naročito efikasno. Zato su komercijalni programi (naravno pisani u asambleru zbog ogromne razlike u brzini izvršavanja) koristili više disketa za čuvanje unešenih podataka sa posebnim načinima katalogizacije. Ipak čak i najbolji komercijalni programi za rad sa bazama podataka za C64 nisu se mogli ni približno uporediti sa programima koji su postajali na računarima poput PC-a, Amige, Atarija ST i sl.računarima pa iz toga nikada nisu bili popularni među korisnicima. Ali dobro je znati da je postojala i ta mogućnost na starom dobrom C64.

 

Naredbe i funkcije koje nisu često korišćene

Danas, kao krajnje lekcije, preći ćemo na brzinu još nekoliko naredbi i funkcija koje nisu često u upotrebi ili zavise od poznavanja asamblersko/mašinskog programiranja

 

STOP – zaustavlja dalje izvršenje programa

Ova naredba se retko koristi i ima istu funkciju kao naredba END sa tom razlikom što kada zaustavi izvršenje programa napiše u kom redu je isti zaustavila porukom BREAK IN broj programske linije. Programeri su je zbog ove činjenice koristili pri testiranju programa

 

CONT – nastavlja izvršenje prekinutog programa

Ukoliko se program prekine bilo na koji način (koji ga neće izbrisati ili korumpirati) ova naredba nastavlja izvršenje programa od mesta na koji je isti prekinut. Daje se u direktnom modu. Dešava se da nastavak programa na ovaj način dovodi do njegovog kraha ili netačnih rezultata. Ukoliko se program nije mogao nastaviti dobijala bi se poruka ?CAN’T CONTINUE  ERROR

 

WAIT – zaustavlja izvršenje programa dok se vrednost u određenoj memorijskoj lokaciji ne

              postavi na zadatu

Naredba koja čeka na dalje izvršenje programa dok se zadata vrednost u memorijskoj lokaciji ne javi.

Format naredbe:

WAIT m,b,c   –  m-memorijska lokacija,b-željena vrednost1(,c-željena vrednost2 opciono)

Primer:

10 PRINT „PROBA“

20 WAIT 197,64

30 GOTO 10

U ovom malom programu imamo beskonačnu petlju. Naredba WAIT ispituje stanje u memorijskoj lokaciji 197 – očitavanje tastature. Ako nije pretisnut nijedan taster očitana vrednost je 64 i petlja će biti aktivna. Ukoliko se pretisne bilo koji taster vrednost očitavanja nije 64 i izvršenje petlje se zaustavlja dok se taster ne pusti. Isto tako ukoliko bi za vrednost stavili neki broj npr.10 za taster „A“ petlja bi stala i samo bi je stisak na taster „A“ pokrenuo.

10 PRINT „PROBA“

20 WAIT 197,64

30 WAIT 197,64,64

40 GOTO 10

U drugom primeru dodali smo programski red. U redu 20 petlja ide dok se ne pretisne neki taster. U sledećem redu 30 ponovo se očitava tastatura (prvi broj i dalje ispituje da li je neki taster pretisnut dok drugi broj čeka da li je pretisnuti taster otpušten. Tako da u kombinaciji sa prethodnom programskom linijom kada se pretisne neki taster štampa se poruka „PROBNO“ i čeka da se taster otpusti. Ponovnim prtiskom štampa se sledeća poruka i tako dalje.

 

DEF FN – naredba koja služi za definiciju sopstvenih funkcija

Ovom naredbom možemo definisati sopstvenu funkciju koju bi smo pozivali po potrebi za rezultate zadatog proračuna

Format naredbe

DEF FN ime(b)=proračun   (ime-ime funkcije, b-argument)

Primer:

10 DEF FN OBIM(R)=2*R*π

20 INPUT „UNESITE POLUPRECNIK“;PP

30 PRINT „OBIM KRUGA JE „; FN OBIM(PP)

Kako ovo funkcioniše? U programskom redu 10 definišemo funkciju koja nosi naziv OBIM i ima argument R. Kao što vidite taj argument je i deo izraza koji služi za proračun. U redu 20 unosimo poluprečnik koji smeštamo u promenljivoj PP. Najzad u redu 30 ispisujemo tekst i funkciji dodeljujemo da odradi proračun za vrednost promenljive PP.  Funkcija vrednost iz ove promenljive stavlja u promenljivu R koja je definisana u prvom redu, odradi proračun i prikazuje rezultat

 

USR – Funkcija definisana od strane programera u obliku asamblerskog/mašinskog

            potprograma

Zahteva poznavanje mašinskog programiranja te istu nećemo dalje objašnjavati

 

CMD – prelazak sa jednog ulazno/izlaznog uređaja na drugi

Ovom naredbom postižemo da se sa jednog ulazno/izlaznog uređaja (npr.enkrana) pređe na drugi (npr.štampač). Pomoću iste možemo odštampati na štampaču ono što se prikazuje na ekranu itd.

Format naredbe:

CMD A,S – gde je argument „A“ logička datoteka koju otvaramo a argumet „S“ string/text koji želimo da pošaljemo na uređaj. String je opciona mogućnost.

Primer:

10 OPEN 1,4

20 CMD 1,“PROBNO“

30 PRINT#1,“STOP“

40 CLOSE 1

Programski red 10 sadrži naredbu OPEN koja otvara logičku datotetku 1,a drugi broj 4 vezuje je za štampač. Programski red 20 sadrži naredbu CMD koja prebacuje ispis na datoteku 1 a samim ti i na štampač i štampa reč „PROBNO“.  Red 30 koristi naredbu PRINT# za rad sa logičkim datotekama štampa reč „STOP“ na štampaču (mogli smo da stavimo samo znake navoda „“). Ovu naredbu smo morali da ubacimo da bi se  prikaz vratio na ekran (inače bi ostala veza sa štampačem koju bi smo morali prekinuti softverskim resetom RUN/STOP+RESTORE). Programska linija 40 zatvara logičku datoteku 1. Ukoliko nije priključen štampač dobili bi smo poruku ?device not present  error

 

Dajemo i funkcije koje nisu često korišćene i koje služe za obračun matematičkih izraza. U svim dole datim funkcijama argumenti mogu biti brojevi ili numeričke promenljive

SIN(A) – sinus ugla datog u argumentu „A“

COS(A) – kosinus ugla datog u argumentu „A“

TAN(A) – tanges ugla datog u argumentu „A“

ATN(A)  – arkustanges ugla datog u argumentu „A“

SQR (A) – kvadratni koren iz argumenta „A“

LOG (A) – prirodni logaritam iz argumenta „A“

EXP(A) – eksponencijalna vrednost iz argumenta „A“

 

Skraćene naredbe u pisanju programa

Prilikom pisanja programa možete se, zbog bržeg pisanja, koristiti skraćenim naredbama. Takođe nemorate u programskom redu stavljati razmaknicu između naredbi i argumenata (to se inače radi lakšeg analiziranja programa). Time štedite memoriju računara ali sve postaje prilično nepregledno. Da vidimo kako neke naredbe u svom skraćenom obliku izgledaju:

PRINT – ?

Za većinu ostalih naredbi se koristi početno slovo i drugo slovo sa pretisnutim šiftom npr.:

LOAD – L(SHIFT+O)

LIST – L(SHIFT+I)

RUN – R(SHIFT+U)

GOTO – G(SHIFT+O)

kod nekih naredbi koje imaju isto početno slovo uzimaju se dva slova plus treće sa pretisnutim šiftom npr.:

GOSUB – GO(SHIFT+S)

RETURN – RE(SHIFT+T)

Kada unesete u programski red ove skraćene naredbe i isti izlistate videćete da ih računar prikazuje u punom nazivu.

Kako bi izgledala verzija programa sa naredbama u skraćenom obliku i bez razmaka među njima i njihovih argumenata možete videti iz sledećeg primera:

10 F(SHIFT+O)I=1TO10

20 ?“PROBNO“,

30 N(SHIFT+E)

 

Kada izlistate program dobili bi ste sledeće:

10 FORI=1TO10

20 PRINT“PROBNO“,

30 NEXT

Naredba NEXT ne mora sadržati naziv promenljive jer istu podrazumeva.

 

Proračun binarne u decimalnu vrednost

U toku rada imali smo dosta slučajeva u kome je bilo bitno pretvoriti binarne u decimalne vrednosti pogotovu u kreiranju sptajta. Uvek nam je pri ruci kalkulator ili neki program,kao i mogućnost da se sve uradi pomoću excela ili sličnih programa,ali nije naodmet da vidimo kako je uraditi proračun ručmo. Uzećemo kao primer sprajt visoke rezolucije iz prethodnih lekcija:

 

                                  B I N A R N E   V R E D N O S T I                                   decimalne vrednosti

red765432107654321076543210
1000000000000000000000000000
2000000000000000000000000000
300111100000000000011110060060
400111111111111111111110063255252
500111111111111111111110063255252
600111111111111111111110063255252
700111111111111111111110063255252
80000001111111111110000003255192
90000001111111111110000003255192
100000001111000011110000003195192
110000001111000011110000003195192
120000001111000011110000003195192
130000001111000011110000003195192
140000001111111111110000003255192
150000001111111111110000003255192
1600000000111111110000000002550
1700111111111111111111110063255252
1800111100000000000011110060060
1900111111111111111111110063255252
2000111100000000000011110060060
21000000000000000000000000000

 

Da vidimo kako to izgleda prilikom proračuna:

redprvi bajt u redudrugi bajt u redutreći bajt u redu
1128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0
2128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0
3128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60
4128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252
5128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252
6128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252
7128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252
8128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
9128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
10128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
11128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
12128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
13128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
14128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
15128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192
16128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0
17128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252
18128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60
19128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252
20128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60
21128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0

 

Ovim završavamo za danas a samim tim i našu malu školu programiranja u standardnom C64 bejziku. Prešli smo naredbe i funkcije, kao i memorijske lokacije koje su najbitnije za rad u istom. Pomenuli smo i neke stvari koje bi vam, po našem mišljenju, mogle biti od koristi.

Nadamo se da ste uživali u našim druženjima. Na vama je da ukoliko to želite ovo osnovno znanje proširite. Najbolje je to uraditi isprobavanjem svega što vam padne na pamet. Imajte u vidu da računar nikako ne možete oštetiti unosom raznih naredbi ili menjanjem vrednosti u memorijskim lokacijama. Ako dođe do kraha (zamrzavanja) računara dovoljno je isključiti ga i ponovo uključiti (sa emultorima je još lakše). S’ druge strane lako je greškom obrisati ili korumpirati sadržaj disketa pa tu treba voditi računa. Ukoliko su vam podaci na disketama bili od velike važnosti postojao je način fizičke zaštite. Naime  dovoljno je bilo prekriti izrez sa strane diskete selotep trakom. Posle toga disketa se mogla čitati ali ne i upisivati ili menjati podaci na njoj. Da bi se vratila u punu funkciju dovoljno je bilo odlepiti selotep traku. Kod emulatora je neuporedivo lakše. Dovoljno je napraviti state ili snapshot memorije C64 ili kopirati virtualnu disketu pod nekim drugim imenom itd. itd.

.d64

U današnje vreme zahvaljujući internetu možete naći gotovo sve što vas interesuje. Zato samo napred. Budite kreativni.

LEKCIJA PRVA LINK

LEKCIJA DRUGA LINK

LEKCIJA TREĆA LINK

LEKCIJA ČETVRTA LINK

LEKCIJA PETA LINK

LEKCIJA ŠESTA LINK

LEKCIJA SEDMA LINK

Ekran sa prikazom Commodore 64 računara i BASIC koda na srpskom jeziku
Commodore 64 – ekran sa BASIC kodom iz lekcije sedam

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

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