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!