Tajemnice ATARI

Piszemy GRĘ


    Dzień dobry ponownie. Zlitowałem się i nie będę truł. Z dwu powodów: po pierwsze: przyszły listy, a po drugie: ostatnio, podczas pracy nad nowym programem przeprowadziłem pewnego rodzaju testy czasowo-szybkościowe, a otrzymanymi wynikami postanowiłem podzielić się z Wami, gdyż są to dosyć istotne sprawy przy pisaniu gier. Testy te związane są z

migotaniem obrazu.

    Często (a właściwie zawsze) zdarza się, że przy wyświetlaniu danych na ekranie (np. odświeżaniu sprite'a) dostrzegamy niemiły efekt migania. Spowodowane jest to brakiem synchronizacji przesyłania danych z wyświetlaniem obrazu przez ANTIC. Na czym rzecz polega? Jak wiadomo, obraz komputerowy, podobnie jak telewizyjny, jest odświeżany około 50 razy na sekundę i jest kreślony linia po linii. Załóżmy, że nasz sprite jest "w koło Macieju" kasowany (wypełniany zerami), a następnie wyświetlany (wypełniany wzorem), bez żadnej synchronizacji z ANTIC'em. W takiej sytuacji może zajść następujące zjawisko: rozpoczynamy kasowanie, ANTIC w tym czasie kreśli już np. dolną połowę sprite'a na ekranie monitora. Po pewnym czasie nasz program kasujący "wyprzedza" ANTIC'a i kończy pracę. W tym momencie nasze oko odbiera następujący obraz: widać górną połówkę sprite'a, a dolna jest skasowana. Wprawdzie sprite w pamięci jest skasowany, lecz ANTIC wyświetlił jego górną połowę jeszcze zanim się to stało. Teraz, zanim zaczniemy wyświetlać nowy wzór sprite'a, ANTIC zdąży wyświetlić kilka z tych skasowanych linii, gdyż potrzebny jest czas na różnego rodzaju obliczenia, choćby na obliczenie adresu wzoru w pamięci. Zaczynamy wyświetlać sprite'a i znowu program "wyprzedza" procesor obrazu i kończy wyświetlanie. Teraz oko widzi taki obraz: górna część sprite, zawiera stary wzór, środkowa jest wyczyszczona, a dolna część zawiera nowy wzór...

    Proszę uruchomić program nr 1, aby "własnoocznie" przekonać się o tym, co przed chwilą napisałem. Oj nieładnie, nieładnie to wygląda. Dopiszmy więc po etykiecie LOOP następującą sekwencję:
lda rtclock
cmp rtclock
beq *-2
    No i co? Ładnie, płynnie i bez zakłóceń. Właśnie o to chodziło. Dopisane instrukcje powodują właśnie synchronizację programu z ANTIC'em. Dlaczego? Otóż zawartość zegara systemowego (RTCLOCK) jest zwiększana podczas każdego przerwania VBI, a to z kolei wywoływane jest podczas powrotu plamki (strumienia elektronów) kreślącej obraz na ekranie z prawego dolnego, do lewego górnego rogu ekranu. Tak więc w momencie zmiany zawartości wspomnianego zegara możemy mieć pewność, że w chwili obecnej nic nie jest malowane na ekranie. Niestety, pojawia się tutaj pewien problem. Kiedy nasz program jest bardzo rozbudowany i poza wyświetlaniem prostego sprite'a wykonuje jeszcze inne operacje na ekranie, np. animację znakową, wyświetlanie innych sprite'ów, wyświetlanie liczników, to może się zdarzyć, a zdarza się w takich przypadkach prawie zawsze, że nasz program nie wyrobi się czasowo, gdyż od zakończenia kreślenia do rozpoczęcia kreślenia nowego obrazu mija bardzo niewiele czasu i sytuacja się odwróci, ANTIC wyprzedzi program. Znowu będzie migało, a to wkurza. Mamy generalnie dwa rozwiązania. Albo synchronizować się w opisany sposób kilkakrotnie w czasie wykonywania głównej pętli, albo synchronizować się w nieco inny sposób. Praktycznie nigdy nie wykorzystuje się do końca możliwości ANTIC'a i wyświetlany obraz nie jest bardzo duży, a nad i pod nim wyświetlana jest zawsze pewna ilość pustych linii. Aby mleć więcej czasu dla programu i aby w czasie swego działania nie "wchodził" on na ekran, można spowodować jego działanie już w momencie zakończenia kreślenia zmienianej części ekranu. Do tego celu należy użyć rejestru VCOUNT ($D40B), który zawiera numer aktualnie kreślonej linii ekranu podzielony przez dwa. Tak więc wystarczy zmienić naszą sekwencję synchronizującą np. na taką:
lda #112
cmp vcount
bne *-3
gdzie 112 jest numerem linii, po narysowaniu której nasz program ma rozpocząć działanie. Liczba ta jest ściśle związana z pionowym rozmiarem ekranu i należy ją ustalić na podstawie DISPLAY LIST'y lub doświadczalnie. Analizując DISPLAY LIST'ę należy policzyć ile jest wyświetlanych linii rastra (np. takich, jak w trybach antica $0E lub $0F) i podzielić ją przez dwa. Aby dobrać ją doświadczalnie można użyć np. programu nr 2. Należy tak dobrać etykietę LINIA, aby jaśniejsza część ramki znajdowała się poniżej roboczej części ekranu. No dobrze, ktoś jednak może zapytać: "a co, jeśli dalej będzie mi brakowało czasu?". Niestety, pozostaje tylko kilkakrotna synchronizacja lub optymalizacja programu pod względem czasowym.

    Aby porównać obie metody synchronizacji, proszę użyć programów 3 i 4. Po uruchomieniu pierwszego z nich (koniecznie pod QA) naciskamy klawisz i program "przez" BRK powraca do QA. Zerkamy na zawartość rejestrów X i Y i widzimy, ile razy wykonała się pętla programu. Teraz, mnożąc ilość przebiegów przez ilość taktów pętli, otrzymujemy czas (ilość taktów), w którym musi zmieścić się nasz synchronizowany program. Program numer cztery służy tylko do sprawdzenia, ile czasu zyskujemy synchronizując się za pomocą drugiej metody, a nie pierwszej. Do etykiety TIME należy przypisać wartość licznika przebiegów pętli np. uzyskaną przy pomocy trzeciego programu.

    No to tyle.
* PROGRAM NUMER 1
* przyklad braku
* synchronizacji
* z ANTIC'em

 opt 21
 org $480

shape    equ $e100
sprites  equ $b800

rtclock  equ 20
pmbase   equ $d407
dmactl   equ 559
gtictl   equ 623
hposp0   equ 53248
pmcntl   equ 53277

begin    equ *

 ldy #0
 tya
 
bgn_1    equ *

 sta sprites+$200,y
 iny
 bpl bgn_1
 
 lda #46
 sta dmactl
 lda #1
 sta gtictl
 lda >sprites
 sta pmbase
 lda #l24
 sta hposp0
 lda #3
 sta pmcntl

loop     equ *

 jsr clr_spr
 jsr shw_spr
 jmp loop

clr_spr  equ *

 ldy #0
 tya

clsp_1   equ *

 sta sprites+$220,y
 iny
 cpy #$40
 bcc clsp_1
 rts
 
shw_spr  equ *

 ldx rtclock
 ldy #0

shsp_1   equ *

 lda shape,x
 sta sprites+$220,y
 inx
 iny
 cpy #$40
 bcc shsp_1
 rts

 opt 7
 end

* PROGRAM NUMER 2
* szukanie najniz-
* szej linii ekranu

 opt 21
 org $480

linia  equ 112

vcount equ $d40b
colbak equ $d01a
loop   equ *

 lda #linia
 cmp vcount
 bne *-3

 lda #0a
 sta colbak
 jmp loop
 
 opt 7
 end

* PROGRAM NUMER 3
* Rozpoczęcie petli
* "na dole" ekranu

 opt 21
 org $480

dmactl   equ 559
vcount   equ $d40b
colbak   equ $d01a
kbcode   equ 764

begin    equ *

 lda #33
 sta dmactl
 lda #255
 sta kbcode

loop     equ *
   
 lda #ll2
 cmp vcount
 bne *-3
 lda #10
 sta colbak

 lda #l6
 ldx #0
 ldy #0
 
loo_1    equ *

 cmp vcount
 beg loo_2
 iny
 bne loo_1
 inx
 bne loo_1

loo_2    equ *

 lda kbcode
 cmp #$ff
 beg loop
 brk
 jmp loop

 opt 7
 end
 
* PROGRAM NUMER 4
* Rozpoczęcie petli
* po zakonczeniu
* przerwania VBI

 opt 21
 org $480

time     equ $340

dmactl   equ 559 
rtclock  equ 20 
colbak   equ $d01a 
kbcode   equ 764

begin    equ *

 lda #33
 sta dmactl
 lda #255
 sta kbcode

loop     equ *

 lda rtclock
 cmp rtclock
 beq *-2

 lda #$ff
 sta colbak
 lda #$ff
 ldx >time
 inx
 ldy <time
 iny

loo_1    equ *

 cmp kbcode
 bne loo_2
 dey
 bne loo_1
 dex
 bne loo_1
 
 lda #0
 sta colbak
 jmp loop
 
loo_2    equ *

 brk
 jmp loop
 
 opt 7
 end
Uwaga, uwaga, uwaga!

    Informacja dla wszystkich, którzy chcieliby brać udział w tworzeniu gier. Pragnę skompletować zespół ludzi zajmujących się tym profesjonalnie. Proszę o kontakt grafików, muzyków, programistów. Najchętniej widziane własne prace na kasetach lub dyskietkach (grafika, muzyka, programy) lub w przypadku grafików, którzy nie posiadają odpowiedniego oprogramowania, a "czują", że mogliby (mogłyby) podołać zadaniu stworzenia graficznej strony gry (animacja, tło, obrazki tytułowe, itp.) mogą to być odręczne prace na papierze. W wypadku zakwalifikowania do grupy każdy otrzyma odpowiednie oprogramowanie i udział w zyskach ze sprzedaży gry. Zgłoszenia proszę nadsyłać na adres redakcji z dopiskiem "De Jet".

Uwaga, uwaga, uwaga! Ankieta z nagrodami.

    Zamieszczona na stronie 13 ankieta ma na celu podniesienie jakości gier trafiających na polski rynek, a tym samym spełnienie oczekiwań Graczy. Ankieta jest anonimowa, ale wśród osób, które podadzą swoje personalia rozlosowane zostanie 10 gier wyprodukowanych przez LK AVALON. Dodatkowo spośród osób, które nadeślą scenariusz gry, wybrany zostanie autor najlepszego i otrzyma on nagrodę pieniężną w wysokości 500.000 zł. Ankiety wysyłajcie na adres TA, zaznaczając na kopercie rodzaj przesyłki. A teraz, spójrzcie na następną stronę...

  • Posiadany sprzęt.
    • 1. ATARI 65XE/800XL.
    • 2. ATARI z większą pamięcią (np. 130XE).
    • 3. Stacja dysków/magnetofon.

  • Ulubiony rodzaj gier.
    • 1. Labiryntowe.
    • 2. Logiczne.
    • 3. Bijatyki.
    • 4. Strzelaniny.
    • 5. Przygodowe.
    • 6. Samochodowe.
    • 7. Edukacyjne.
    • 8. Sportowe.

  • Posiadane gry.
    • 1. Ile posiadasz gier? ......................................
    • 2. Ile z nich, to oryginalne produkty? .................
    • 3. Ile to produkty LK AVALON? ........................

  • Co najbardziej "wciąga" w czasie gry.
    • 1. Grafika.
    • 2. Muzyka.
    • 3. Oryginalny pomysł.
    • 4. Realność.
    • 5. Dopracowanie szczegółów.

  • Jakie znaczenie ma tytuł i okładka?
    • 1. Żadne.
    • 2. Małe.
    • 3. Duże.

  • Lista rankingowa.
    • Najlepsze gry to:
      • 1. .......................................................
      • 2. .......................................................
      • 3. .......................................................

    • Programiści:
      • 1. .......................................................
      • 2. .......................................................
      • 3. .......................................................

    • Graficy:
      • 1. .......................................................
      • 2. .......................................................
      • 3. .......................................................

    • Muzycy:
      • 1. .......................................................
      • 2. .......................................................
      • 3. .......................................................

  • Statystyka.
    • 1. Ile masz lat? ..............................................
    • 2. Od Ilu lat masz komputer?...........................
    • 3. Mieszkasz w mieście/na wsi?

  • Personalia (nie trzeba wypełniać).
    • 1. Imię i nazwisko ..........................................
    • 2. Ulica i numer domu ....................................
    • 3. Miejscowość i kod .....................................


    Dariusz "De JET" Żołna




Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2002