Opisi:
Svet Kompjutera, #11, November 1988, ZX Intro Servis, Predrag Bećirić
I mi MAKER za trku imamo
U vremenu između ovog i prošlog broja Sveta kompjutera desile su se neke
promene, koje mogu imati velike posledice za vlasnike Spectruma. Mogu, ali i ne
moraju. Evo o čemu se zapravo radi.
Do sada su samo Commodoreovci imali mogućnost da, koristeći neke već gotove
Intro Makere, na jednostavan način naprave svoje introe, a zatim ih povezu sa
igrom. Od sada tu mogućnost imaju i Spectrumovci.
Trenutno za Spectrum postoje tri Intro Makera, od kojih vam u ovom broju
dajemo najbolji: CRAZY INTRO MAKER. Preostala dva (BIG1 I.M. i FUNNY I.M.)
verovatno ćete imati čast da dobijete u jednom od narednih izdanja ove
rubrike.
Crazy Intro Maker nudi sledeće opcije:
1. LOAD SCREEN$
2. SAVE INTRO
3. INSTRUCTIONS
4. CHANGE COLOURS
Prva opcija omogućava vam da učitate, a zatim prebacite u bafer sliku koju
želite da vam se pojavi po startu ovog introa. Opcija pod rednim brojem 2
omogućava vam da Intro snimite na kasetu. Treću opciju nije potrebno
objašnjavati. Njeno ime sve govori, i savetujemo vam da je startujete pre nego
što resetujete kompjuter. Pritiskom na taster sa brojem 4 ulazimo u novi meni:
1. COLOURS UP
2. COLOURS DOWN
3. EXIT
Pored ovog menija, u drugoj trećini ekrana biće prikazana slika koju smo
učitali koristeći komandu 1 iz prethodnog menija. Sada ćemo, koristeći tastere
1 i 2, moći da menjamo boju ekrana. Kada odredimo boju kojom želimo da bude
obojen skrin koji je učitan, pritiskom na taster tri vraćamo se u prethodni
meni.
Kako raditi sa C.I.M.-om?
Prva stvar koju je potrebno uraditi jeste da se učita neki skrin, koji ste
ranije u nekom programu za crtanje definisali. Skrin mora da bude nacrtan u
gornjoj trećini ekrana i to tako da je potpuno popunjava. Naravno, mora da bude
monohromatski. Zatim treba startovati četvrtu opciju prvog menija C.I.M.-a i u
njoj odrediti boje za tu sliku. Nakon ovoga moguće je snimiti ceo intro na
kasetu. Intro je dugačak 2,5 kb s tim što 2048 bajtova zauzima bafer za sliku.
Kako ubaciti intro u igru?
Potrebno je da učitamo celu igru u memoriju računara, ali tako da se ona pri
tom ne startuje. Zatim je potrebno pretražiti memoriju i pronaći negde prazan
blok memorije dužine 2,5 Kb. U ovo područje je, sada, potrebno učitati
snimljeni intro. Preostalo nam je još samo da učinimo da igra, pre nego što se
startuje, pozove ovaj naš intro.
Kao što znamo, u poslednje vreme sve igre za Spectrum dolaze snimljene
uglavnom na dva načina. Prvi je takozvani Spec-Mac sistem, a drugi način je
učitavanje direktno iz BASIC-a. Ukoliko se igra u koju želimo da unesemo
intro učitava Spec-Mac sistemom, potrebno je da u BASIC-u takve igre izvršimo
sledeću izmenu:
1. Učitamo BASIC sa MERGE""
2. Nakon toga potrebno je da pogledamo sadržaj lokacija 23797, 23800 i
23808. Zapamtićemo lokaciju čiji je sadržaj bio 205.
3. Zatim je potrebno 20. liniju BASIC-a zameniti sa:
20 CLEAR 24999: POKE (zapamćena adresa) ,195:
RANDOMIZE; USR 23760,: RANDOMIZE USR
(adresa gde je učitan intro): RANDOMIZE USR (zapamćena adresa + 3)
4. Ovako prepravljen BASIC sada možemo da snimimo na neku kasetu. Iza
BASIC-a treba snimiti ostale delove igre (screen$, prvi deo od
25000 u dužini 20000, drugi deo od 45000 u dužini 20536, treći deo od
23296 dužine 1704 i drugi screen$). Naravno, tu je potrebno da bude
snimljen i intro.
Ukoliko se igra u koju želimo da ubacimo intro učitava iz BASIC-a,
potrebno je da uradimo sledeće:
1. Učitamo BASIC sa MERGE""
2. Ispred poslednje RANDOMIZE USR instrukcije stavićemo
RANDOMIZE USR (adresa gde je učitan intro)
3. Snimimo BASIC, a iza njega i igru u koju je ubačen intro.
Ukoliko se igra u koju želite da ubacite ovaj intro učitava na neki drugi
način, pokušajte sami da pronađete način n'a koji ćete to izvesti.
Šta radi C.I.M.
Do sada smo sve vreme opisivali kako se radi sa ovim programom, a još ni
jednom nismo spomenuli kako izgleda intro koji sa njim pravi. Da li ste nekada
gledali kako se zastava na nekoj zgradi viori na vetru? Verovatno jeste. E,
pa sada ćete, koristeći ovaj program, moći da isto tako „viorite" neku svoju
sliku, ali ne na zgradi, već na svom televizoru. Efekat je veoma zanimljiv, a
u suštini prilično jednostavan. Na priloženom listingu detaljno smo opisali
kako se ovaj efekat postiže, a sada ćemo vam samo ukratko objasniti princip
rada.
U prvu trećinu ekrana potrebno je smestiti neku sliku koju želimo da viorimo.
Ta prva trećina, kao i sve ostale, imaju po 64 linije. Zatim ćemo, koristeći
podatke iz tablice, sliku iz prve trećine prebacivati u druge dve, liniju po
liniju, i to onoliko puta koliko iznosi vrednost iz tablice, znači, ako je
vrednost bila 1, onda će se ta linija samo jednom prebaciti. Ukoliko je ta
vrednost bila 2 tu ćemo liniju dva puta nacrtati. Koristeći Junju tablicu iz
listinga (tab. 3) primetićete da se od početne slike, koja ima 64 linije,
dobija slika od 122 linije. Na taj način slika je deformisana tako što je na
nekim mestima sabijena a na nekim raširena. Zatim se početak tablice poveća za
jedan, pa se opet slika po toj, novoj tablici prebaci iz prve trećine u druge
dve. Ovim je postignuto da se zbijena i raširena mesta pomeraju po slici, tako
da se ona „viori". Jednostavno, a veoma efektno.
Najzad, evo i rutine koja radi sve što je opisano. Ukoliko rutinu unosite
pomoću programa GENS3M21 potrebno je da ispred svake linije stavite redni broj,
izbacite naredbu PUT 25500, a naredbu DB pretvorite u DEFB. Ukoliko program
unosite koristeći LASER GENIUS potrebno je na početku uneti i linijski broj, a
kasnije to činite po potrebi (u ovom asembleru je, podsećamo, posle labele
obavezno otkucati dvotačku, osim ako je labela operand mašinske naredbe).
ORG 25500 ; Početak programa.
PUT 25500 ; Mesto gde se asemblira program.
; Deo programa za postavljanje boja na ekranu.
LD HL,22528 ; Adresa atributa u memoriji.
LD D,H ; D = H
LD E,L ; E = L
INC L ; U DE je vrednost za jedan veća od
; vrednosti u HL (22529).
LD E-,1 ; U registar BC sm'ešta se
LD C,0 ; broj ciklusa (256).
LD (HL),L ; Prvi bajt atributske memorije = 0.
LDIR ; Zahvaljujući ovoj instrukciji
; popunili smo prvu trećinu
; atributske memorije nulama.
LD B,l ; U registar BC smešta se
DEC C ; vrednost 511.
LD (HL),4 ; Stavljamo broj 4 (PAPER 0, INK 4)
LDIR ; u preostale dve trećine ekrana.
; Pravljenje tablice za prvu trećinu ekrana.
LD B,64 ; Brojač redova.
LD A,175 ; Početna tačka.
LD IX,20480 ; Tablica se smešta od 20480.
CALL loopl ; Poziva se potprogram za
; generisanje tablice.
LD HL,20480 ; Tablica se prilagođava za
LD1 DE.23296 ; drugu i
LD IX,23424 ; treću trećinu ekrana.
LD B,64 ; Vrši se prilagođenje tablice
peti LD A,(HL) ; tako što se uzimaju vrednosti
LD (DE),A ; iz tablice za prvu trećinu
LD (IX+ 0),A ; i višem bajtu dodaje 8,
INC HL ; jer je razlika između
INC DE ; prve i druge trećine
INC IX ; 2048 (#0800).
LD A,(HL) ;
ADD 8 ; Ovo isto vrši se i za treću
LD .(DE),A ; trećinu, s tom razlikom
ADD 8 ; što se sada dodaje 16,
LD (IX-t-0),A ; jer je razlika između prve i
INC HL ; treće trećine 4096 (# 1000).
INC DE
INC IX ; Ovo se ponavlja za svaki
DJNZ peti ; podatak iz tablice.
; Pamte se stare vrednosti HL' i DE' zbog povratka u BASIC.
EXX ; Prelazak u drugi set registara.
PUSH HL ; Na stek se smešta vrednost HL'-a.
PUSH DE ; Na stek se smešta vrednost DE'-a.
EXX ; Povratak u prvi set registara.
; Glavna petlja programa, postavljanje početnih vrednosti.
start EXX ; Drugi set registara.
LD HL,23296 ; HL = 23296
LD D,H ; DE' =HL'
LD E,L ;
EXX ; Prvi set registara.
tabpoc LD IX,tabl3 ; IX ima vrednost početka tablice
; po kojoj se vrši prebacivanje
; slike.
; Najvažnija petlja u programu.
LD B,64 ; Tablica ima 64 elementa.
HALT ; Čeka se da elektronski mlaz
; dođe u gornji levi ugao ekrana.
lopl PUSH BC ; Brojač petlje smešta se na stek.
LD B,(IX+0) ; Iz tablice se uzima jedan podatak,
; koji sada predstavlja novi brojač.
INC IX ; Početak tablice pomera se za jedno
; mesto.
LD HL,end ; HL = kraj tablice.
DB # DD ; Ilegalna instrukcija.
LD A,L ; LD, A,XL (u akumulator se smešta
; niži bajt indeksnog registra IX)
CP L ; Da li je tablica došla do kraja?
CALL Z,prov ; Pozovi labelu „prov" ukoliko je
; HL = L
EXX ; Ukoliko nije, pređi u drugi set
; registara.
LD A,(HL) ; Uzima podatak iz lokacije na
; koju pokazuje HL.
INC HL ; HL' = HL' + 1
EXX ; Prvi set registara.
LD L,A ; L = (HL)
; U HL se sada nalazi adresa odakle je
; potrebno prebaciti jednu liniju
; slike.
EXX ; Ponovo drugi set registara.
LD A,(HL) ; Uzima podatak iz lokacije na
; koju pokazuje HL'.
INC HL ; HL' = HL' + 1.
EXX ; Ponovo prvi set registara.
SUB 8 ; A = (HL')-8
LD H,A ; H = A
lop2 PUSH BC ; Brojač na stek.
PUSH HL ; HL na stek.
EXX ; Ponovo drugi set registara.
LD A,(DE) ; Uzima podatak iz lokacije na
; koju pokazuje DE'.
INC DE ; DE' = DE' + 1
EXX ; Ponovo prvi set registara.
LD E,A ; E = (HL')
EXX ; Ponovo drugi set registara.
LD A,(DE) ; Uzima podatak iz lokacije na
; koju pokazuje DE'.
INC DE ; DE' = DE' + 1
EXX ; Ponovo prvi set registara.
LD D,A ; D = A
; U DE se sada nalazi adresa gde je
; potrebno prebaciti jednu liniju
; slike.
LDI ; Prebacivanje jedne linije
LDI ; ekrana.
; To se vrši instrukcijom LDI
; zbog toga što se ona
LDI ; izvršava brže od LDIR, ali zato
LDI ; traži više memorije. U našem slučaju
; potrebno ju je napisati 32 puta.
POP HL ; Uzima vrednost za HL sa steka.
POP BC ; Uzima vrednost za brojač sa steka.
DJNZ lop2 ; To ponavlja onoliko puta koliko je
; iznosio podatak iz tablice.
POP BC ; Obnavlja brojač.
DJNZ lopl ; Sledeći podatak iz tablice.
LD A, # 7F ; Da li je pritisnut taster BREAK?
IN A,(# FE) ; Ukoliko jeste onda skoči na
BIT 0,A ; labelu „kraj", tj. povratak
JR Z,kraj ; iz ovog programa.
LD HL,(tabpoc + 2) ; Uzima se vrednost za početak tablice.
INC HL ; Zatim se povećava za jedanr
LD (tabpoc + 2), HL ; Vraća se na staro mesto, direktno
; u program (vrši se modifikovanje
; programa).
LD DE,end ; Da li je kraj tablice?
LD A,L ; Prvo se upoređuju niži bajtovi,
CP E ; i ukoliko nisu isti
JP NZ.start ; ide se na početak glavne petlje.
LD A,H ; Ukoliko jesu upoređuju se i viši bajtovi
CP D ; i ukoliko oni nisu isti skače se na
JP NZ.start ; početak glavne petlje.
LD HL,tabl3 ; Ukoliko je HL = DE pokazivač tablice se
LD (tabpoc + 2), HL ; postavlja na početnu vrednost
JP start ; Skače se na glavnu petlju.
loopl PUSH BC ; Pravi se tablica korišćenjem
LD B,A ; Spectrumove ROM rutine za
PUSH AF ; izračunavanja apsolutne adrese tačke
CALL #22AA ; zadate koordinatama X i Y (u B i C).
POP AF ; Po povratku, u HL će se nalaziti adresa
LD (IX + 0),L ; te tačke u video memoriji.
INC IX ; To se zatim smešta u tablicu, i to prvo
LD (IX + 0),H ; niži (L), a zatim i viši (H) bajt.
INC IX
POP BC ; Obnavlja se brojač. '
DEC A ; A se umanjuje za 1.
DJNZ loopl ; Petlja se ponavlja sve dok brojač
; ne dođe do nule.
RET ; Povratak iz potprograma.
prov DB # DD ; Ilegalna instrukcija LD A,XH (u A se
LD A,H ; se smešta vrednost višeg bajta IX).
CP H ; DalijeA = H?
RET NZ ; Povratak ukoliko nije.
LD IX,tabl3 ; Obnavlja se početak tablice
; ukoliko jeste.
RET ; Povratak.
kraj EXX ; Drugi set registara.
POP DE ; Uzima se DE' sa steka.
POP HL ; Uzima se HL' sa steka.
EXX ; Ponovo prvi set registra.
RET ; Povratak iz programa.
tabl3 DB 1,1,1,1,2 ; Tablica po kojoj se vrši prebacivanje
DB 1,1,1,2,1 ; slike iz prve trećine u druge dve.
DB 2,1,2,1,2
DB 1,2,2,2,2
DB 2,2,3,2,3
DB 2,3,2,3,3
DB 4,3,3,4,3
DB 3,2,3,2,3
DB 2,3,2,2,2
DB 2,2,2,1,2
DB 1,2,1,2,1
DB 2,1,1,1,2
DB 1,1,1,1
end ; Marker za kraj tablice.
Sada sledi i najvažniji deo.Da biste CRAZY INTRO MAKER imali na svojoj kaseti
potrebno je da tačno ukucate priloženi BASIC, a zatim da ga startujete.
Ukoliko vam kompjuter ispiše ERROR pokušajte da pronađete grešku, a nakon toga
ponovo startujte program. Ako ste sve pravilno otkucali kompjuter će sačekati
da promenite kasetu i da, pritiskom na neki taster, snimite mašinski kod.
Naravno, ispred toga moguće je snimiti i BASIC, koji bi sam učitavao i
startovao program:
10 CLEAR 65535:LOAD"" CODE 27000
20 RANDOMIZE USR 27000: RANDOMIZE USR 4535
Ovo bi bilo sve što smo vam pripremili za ovo izdanje Spectrum intro servisa.
Za ovaj broj smo vam obećali rutinu za BIG SCROLL teksta po ekranu. Rutina je
gotova, napravljen je i odgovarajući Intro Maker, ali će biti objavljena tek u
sledećem broju, zbog toga što je autor smatrao da je bolje objaviti rutinu koja
još nije viđena na C-64. Kadaje već reč o Commodoreu, da budemo malčice zlobni:
ovu rutinu je na Commodoreu pokušao da napravi jedan @zaluđeni" haker i,
zamislite, uspeo je, ali, kako kaže, da bi postigao brzinu približnu Spectrumu
morao je da ekran smanji na devetinu!
|