Pozdravljeni na straneh programov iz prejšnje Jugoslavije za 8 in 16 bitne mlinčke.



        Sinclair ZX SPECTRUM


News
ZX Spectrum
Commodore 64
Amiga
Amstrad CPC
Commodore +4
Atari ST
Galaksija
Orao
Orao
ReCracks
Misc
Misc
Forum
  
News
 
Crazy Intro Maker
Predrag Bećirić


       Jezik: Angleški
    Povzetek: Valovanje Slike.
     Skupina: Intro Kreatorji 
    Komentar: Pretipkano iz "Svet Kompjutera"
              številka 11, November 1988.
  Leto Izida: 1988
      Format: TZX
CrazyIntroMaker   Download


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!