Tajemnice ATARI

PISZEMY DEMO

Kolory - co wiemy, a czego jeszcze nie wiemy

    W trzeciej części naszego cyklu wspomnieliśmy o istnieniu dziewięciu rejestrów kolorów. Nie będziemy dokładnie omawiać struktury tych rejestrów, gdyż dokładne informacje na ten temat ukazały się w "Mapie Pamięci" (TA 6-7/92). Wnikliwy czytelnik "map pamięci" różnych autorów zauważy, że rejestry te mają różne etykiety. My preferujemy następujące:

Colpm0 - Colpm3 ($D012-$D015)
Colpf0 - Colpf3 ($D016-$D019)
Colbak ($D01A)

oraz odpowiadające im cienie:

Colpm0s - Colpm3s ($2C0-$2C3)
Colpf0s - Colpf3s ($2C4-$2C7)
Colbaks ($2C8)

    Nazwy te są o tyle logiczne, że kojarzą się z pełnymi angielskimi nazwami rejestrów, np. Colbaks (COLor BAcKground Shadow register).

    Rejestr Colbak we wszystkich trybach ANTICa określa kolor tła. W trybach $02, $03, $OF ANTIC-a punkt "zgaszony" przyjmuje kolor z rejestru Colpf2, natomiast punkt "zapalony" kolor z Colpf2 a jasność z Colpf1. W innych trybach dwukolorowych, czyli w trybach $09, $0B i $0C punkt "zgaszony" przyjmuje kolor z Colbak, a punkt "zapalony" z rejestru Colpf0. W czterokolorowych trybach $08, $0A, $0D i $0E ANTICa kolory "zapalonych" punktów wybierane są z rejestrów Colpf0-Colpf2 a punkty zgaszone (czyli tło) przyjmują kolor Colbak. W trybach tekstowych $06 i $07 ANTIC'a kolor wszystkich pixeli znaku jest wybierany według dwóch najstarszych bitów znaku z rejestrów Colpf0-Colpf3. W pozostałych tekstowych trybach $04 i $05 znaki są wielokolorowe. Kolory poszczególnych pixeli ustalane są według rejestrów Colbak i Colpf0-Colpf2. Ustawiony bit 7 numeru znaku spowoduje ustalenie kolorów pixeli według rejestrów Colbak, Colpf0, Colpf1 i Colpf3. Jak widać w trybach tych można osiągnąć pięcio-kolorowe znaki, lub po przedefiniowaniu zestawu znaków - dokładną pięciokolorową grafikę. Dlatego też tryby te wykorzystywane są w grach, np. we Fredzie i Misji.

Dodatkowe tryby graficzne

    Zerknijmy do numeru 4/92 TA, do pierwszego odcinka naszego cyklu "Piszemy Demo". Zamieściliśmy tam tabelę zestawiającą tryby ANTIC'a z trybami OS. Jak wynika z tej tabeli tryby OS od $09 do $0B nie są możliwe do uzyskania przy pomocy samego ANTIC'a. Aby wyświetlić linię obrazu w trybach $09-$0B OS należy umieścić w Display List wartość $0F oznaczającą tryb $08 OS oraz odpowiednio ustawić bity 6-7 w rejestrze Gtiactl ($D01B) czyli w rejestrze kontroli układu GTIA. Rejestr ten posiada również swój cień Gtictls ($26F). Bity należy ustawić według poniższej tabeli:

bity 6-7 tryb OS
00 $08
01 $09
10 $0A
11 $0B

    Tryby $09-$0B OS są jedynymi trybami wielokolorowymi. W trybie $09 OS kolor pixeli pobierany jest z rejestru Colbak. Tylko w tym trybie możliwe jest uzyskanie 16 odcieni tego samego koloru w jednej linii ekranu. Przy umiejętnym połączeniu tego trybu z przerwaniem Display List możliwe jest osiągnięcie 256 kolorów na raz na ekranie, co prezentuje poniższy program:
Program  Equ $8800

List_mem Equ %00000ll0 
List_err Equ %00000l01 
Code_mem Equ %00010000 
Code_dsk Equ %00100000

Colbak   Equ $D01A 
Dliv     Equ $0200 
Dlptrs   Equ $0230 
Gtictls  Equ $026F 
Nmien    Equ $D40E
Wsync    Equ $D40A

Pomoc    Equ $F0
Pomoc2   Equ $F2

       Opt List_err+Code_mem
       Org Program

         Ldx Przep 
         Stx Pomoc 
         Sty Pomoc+$01
         Ldx Wpisz
         Stx Pomoc2
         Sty Pomoc2+$01

         Ldx #$0E
L1       Ldy #$22
L2       Lda (Pomoc),y
         Sta (Pomoc2),y
         Dey
         Bpl L2
         Lda Pomoc2+$01
         Sta Pomoc+$01
         Clc
         Lda Pomoc2
         Sta Pomoc
         Adc #$20
         Sta Pomoc2
         Bcc L3
         Inc Pomoc2+$01
L3       Dex
         Bpl L1

         Ldx Dlist
         Stx Dlptrs
         Sty Dlptrs+$01
         Lda #$40 
         Sta Gtictls
         Lda #$00 
         Sta Pomoc
         Ldx Przerw
         Lda #$C0
         Stx Dliv 
         Sty Dliv+$0l
         Sta Nmien
         Rts

Przerw   Pha
         Lda Pomoc
         Clc
         Adc #$10
         Sta Pomoc
         Sta Wsync
         Sta Colbak
         Pla
         Rti

Dane_o   Dta B($00),B($00)
         Dta B($01),B($ll)
         Dta B($10),B($22)
         Dta B($22),B($03)
         Dta B($33),B($30)
         Dta B($44),B($44)
         Dta B($05),B($55)
         Dta B($50),B($66)
         Dta B($66),B($07)
         Dta B($77),B($70)
         Dta B($88),B($88)
         Dta B($09),B($99)
         Dta B($90),B($AA)
         Dta B($AA),B($0B)
         Dta B($BB),B($B0)
         Dta B($CC),B($CC)
         Dta B($0D),B($DD)
         Dta B($D0),B($EE)
         Dta B($EE),B($0F)
         Dta B($FF),B($F0)

Dlist    Dta B($70),B($70)
Przep    Dta B($80),B($00)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
         Dta B($4F),A(Dane_o)
Wpisz    Dta B($41),A(Dlist)

         End of File
    Od etykiety DList znajduje się Display List. Bajty między etykietami Przep i Wpisz tworzą rząd prostokątów w tym samym kolorze o różnych odcieniach. Dane pamięci obrazu umieszczone są od etykiety Dane_o. Po uruchomieniu program powiela część Display List tak, aby ANTIC mógł wyświetlić 16 rzędów prostokątów. W każdym rzędzie prostokątów wywoływane jest przerwanie Display List (etykieta Przerw) modyfikujące rejestr Colbak.

    W trybie $0A OS maksymalnie można osiągnąć dziewięć różnych barw o różnych jasnościach i kolorach wykorzystując wszystkie rejestry kolorów. Natomiast w trybie $0B jasność pixeli pobierana jest z rejestru Colbak. Tylko w tym trybie możliwe jest więc uzyskanie 16 kolorów w tych samych jasnościach.

Gracze i pociski

Układ GTIA zajmuje się nie tylko kolorami. Innym ważnym zadaniem GTIA jest obsługa PMG (Player-Missile Graphics - grafika graczy i pocisków). Grafika ta umożliwia umieszczenie na ekranie czterech obiektów o szerokości 8 punktów (gracze) i czterech obiektów o szerokości 2 punktów (pociski). Obiekty te mogą pojawić się na ekranie we wszystkich trybach graficznych oprócz $09-$0B OS. Można je z łatwością poruszać i kontrolować zderzenia między nimi oraz elementami grafiki.

Dmactl a PMG

    Podobnie jak normalna grafika posiada wydzielone miejsce pamięci na dane tak i PMG wykorzystuje odpowiednio zorganizowaną część pamięci kompute ra. PMG może wykorzystywać jedno- lub dwukilobajtowy obszar pamięci w zależności od rozdzielczości wyświetlanych obiektów. Mówi się o rozdzielczości jednoliniowej i dwuliniowęj. Przy rozdzielczości jednoliniowei GTIA korzysta z 2 kilobajtów pamięci i każdy pixel obiektu ma wysokość jednej fizycznej linii ekranu. Przy rozdzielczości dwuliniowej wykorzystywany jest obszar o rozmiarze jednego kilobajta i pojedynczy pixel obiektu wysoki jest na dwie linie ekranu. W rejestrze Dmactl bit 4 odpowiada za rozdzielczość graczy i pocisków. Ustawiony włącza rozdzielczość jednoliniową. Bity 2 i 3 Dmactl nie opisane dotąd przez nas kontrolują bezpośredni dostęp do pamięci przez PMG. Bit 2 określa DMA dla pocisków (bit ustawiony - DMA włączony), natomiast bit 3 - DMA dla graczy. Przy korzystaniu z PMG należy odpowiednie bity ustawić.

Organizacja pamięci


    Powyższy rysunek przedstawia organizację pamięci PMG (rysunek wykonano przy pomocy Panthera).

    Pmbase na rysunku oznacza numer strony, od początku które) znajduje się pamięć dla graczy i pocisków. Wartość ta musi być podzielna przez 4 dla rozdzielczości dwuliniowej i podzielna przez 8 dla rozdzielczości jednoliniowej. Otrzymaną liczbę należy wpisać do rejestru Pmbase ($D407) aby poinformować GTIA skąd ma pobierać dane. W rozdzielczości jednoliniowej gracz zajmuje $100 bajtów pamięci, w rozdzielczości dwuliniowej - 880 bajtów. Pojedynczy bajt w tym obszarze odpowiada ośmiu poziomym punktom gracza. Każdy ustawiony bit w tym bajcie spowoduje wyświetlenie punktu. Aby gracz pojawił się na dole ekranu należy dane wpisywać pod koniec obszaru pamięci wydzielonego dla gracza. Analogicznie gracz pojawi się na górze ekranu, gdy dane wpisywane będą na początek tego obszaru. W praktyce nie można zobaczyć wszystkich danych dla gracza, gdyż część z nich nie mieści się na ekranie. Dla czterech pocisków przeznaczony jest taki sam obszar pamięci co dla jednego gracza. Kolejne pary bitów pojedynczego bajtu danych definiują wygląd jednej linii kolejnych pocisków.

Pierwszy gracz na ekranie

    Po ustaleniu rozdzielczości PMG i obszaru pamięci oraz po wpisaniu danych graczy w ustalone obszary pamięci należy zaktywizować grafikę PMG. W tym celu należy ustawić odpowiednie bity w rejestrze Pmcntl ($D01D). Ustawiony bit 0 spowoduje zainicjowanie pocisków, natomiast bit 1 pełni tę samą funkcję dla graczy.

    Po wykonaniu tych czynności należy ustalić pozycję poziomą graczy i pocisków. Każdy gracz i każdy pocisk posiada odrębny rejestr, do którego wpisywane są wartości pozycji poziomej. W rejestrach tych nie można przechowywać wartości pozycji, ponieważ przy odczycie rejestry pełnią inne funkcje. Dlatego też wartości pozycji należy przechowywać w innych komórkach pamięci. Rejestry te umieszczone są od adresu $D000-$D007:

Hposp0-Hposp3 ($D000-$D003) - pozioma pozycja gracza 0-3
Hposm0-Hposm3 ($D004-$D007) - pozioma pozycja pocisku 0-3

    Pojedynczego gracza można rozszerzyć dwukrotnie lub czterokrotnie. Dotyczy to również pocisków. Aby to uczynić konieczne jest wpisanie do odpowiednich rejestrów następujących wartości:

0 - dla normalnej szerokości
1 - dla podwójnej szerokości
3 - dla poczwórnej szerokości

    Rejestry kontroli szerokości:

Sizep0-Sizep3 ($D008-$D00B) - szerokość gracza 0-3
Sizem ($D00C) - szerokość pocisków

    Kolejnym krokiem powinno być ustalenie kolorów obiektów.

Poniższy program pokazuje gracza 0 na środku ekranu:
Program  Equ $8800

List_mem Equ %00000110
List_err Equ %00000101
Code_mem Equ %00010000
Code_dsk Equ %00100000

Colpm0s  Equ $02C0
Dmactls  Equ $022F
Hposp0   Equ $D000
Pmbase   Equ $D407
Pmcntl   Equ $D01D
Sizep0   Equ $D008

Players  Equ $A000

       Opt List err+Code_mem
         Org Program

         Ldx #$00
         Txa L1
L1       Sta Players+$400,x
         Inx
         Bne L1
         Ldx #$0B 
L2       Lda Dane,x
         Sta Players+$478,x
         Dex
         Bpl L2
         Lda #$3E
         Sta Dmactls
         Lda >Players
         Sta Pmbase
         Lda #$02
         Sta Pmcntl
         Lda #$78
         Sta Hposp0
         Lda #$00
         Sta Sizep0
         Lda #$0E
         Sta Colpm0s
         Rts

Dane     Dta B($18),B($24)
         Dta B($42),B($81)
         Dta B($A5),B($A5)
         Dta B($81),B($81) 
         Dta B($99),B($42)
         Dta B($24),B($18)

         End of File
    W kolejnym artykule będziemy kontynuować rozważania nad PMG.

Tomasz Bielak
Rafał Bielecki




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

Pixel 2002