lekcija 7 – Mala škola retro programiranja u standardnom bejziku C64
RETRO KUTAK
Programiranje u BAIC-u – Lekcija sedam
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
red | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 60 | 0 | 60 |
4 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 63 | 255 | 252 |
5 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 63 | 255 | 252 |
6 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 63 | 255 | 252 |
7 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 63 | 255 | 252 |
8 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 255 | 192 |
9 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 255 | 192 |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 195 | 192 |
11 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 195 | 192 |
12 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 195 | 192 |
13 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 195 | 192 |
14 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 255 | 192 |
15 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 255 | 192 |
16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 255 | 0 |
17 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 63 | 255 | 252 |
18 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 60 | 0 | 60 |
19 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 63 | 255 | 252 |
20 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 60 | 0 | 60 |
21 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Da vidimo kako to izgleda prilikom proračuna:
red | prvi bajt u redu | drugi bajt u redu | treći bajt u redu |
1 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 |
2 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 |
3 | 128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60 |
4 | 128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252 |
5 | 128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252 |
6 | 128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252 |
7 | 128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252 |
8 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
9 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
10 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
11 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
12 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
13 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*0+16*0+8*0+4*0+2*1+1*1= 128+64+0+0+0+0+2+1=195 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
14 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
15 | 128*0+64*0+32*0+16*0+8*0+4*0+2*1+1*1= 0+0+0+0+0+0+2+1=3 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*0+16*0+8*0+4*0+2*0+1*0= 128+64+0+0+0+0+0+0=192 |
16 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 |
17 | 128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252 |
18 | 128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60 |
19 | 128*0+64*0+32*1+16*1+8*1+4*1+2*1+1*1= 0+0+32+16+8+4+0+0=63 | 128*1+64*1+32*1+16*1+8*1+4*1+2*1+1*1= 128+64+32+16+8+4+2+1=255 | 128*1+64*1+32*1+16*1+8*1+4*1+2*0+1*0= 128+64+32+16+8+4+0+0=252 |
20 | 128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*1+16*1+8*1+4*1+2*0+1*0= 0+0+32+16+8+4+0+0=60 |
21 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*0+64*0+32*0+16*0+8*0+4*0+2*0+1*0= 0+0+0+0+0+0+0+0=0 | 128*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.
