Rozdział 7
TWORZENIE OBRAZU
Tworzeniem obrazu na monitorze zajmuje się w komputerach
Atari specjalizowany układ scalony - ANTIC (AlphaNumeric
Television Interface Controller). Jest to specjalnie
zaprojektowany dla Atari mikroprocesor, który posiada własny
zestaw rozkazów i własny program. Według tego programu ANTIC
pobiera z pamięci komputera dane umieszczone tam przez
jednostkę centralną (procesor 6502) i po odpowiedniej
interpretacji przesyła je do monitora.
Obraz telewizyjny generowany przez ANTIC jest jednak
monochromatyczny. Kolory są dodawane przez inny układ specjalny
- GTIA (Graphics Television Interface Adaptor), który także
został zaprojektowany specjalnie dla Atari. Poza kolorem GTIA
tworzy jeszcze ruchome obiekty ekranowe zwane popularnie
duszkami, a według nomenklatury Atari - grafiką graczy i
pocisków (P/MG - Player/Missile Graphics). Te funkcje GTIA są
opisane w rozdziale 8.
Spośród układów graficznych stosowanych w komputerach
domowych ANTIC wyróżnia się dwoma cechami. Przede wszystkim
może bezpośrednio korzystać z pamięci komputera poprzez tzw.
DMA (Direct Memory Access). Odciąża więc w ten sposób procesor
centralny, co pozwala znacznie przyspieszyć jego pracę. Ponadto
ANTIC posiada kompletną 16-bitową szynę adresową, dzięki czemu
ma dostęp do całych 64 KB pamięci. Umożliwia to umieszczenie
danych dla obrazu oraz programu ANTIC-a w dowolnym miejscu
pamięci.
Przed przejściem do dalszego opisu trzeba wiedzieć, jak
wygląda obraz telewizyjny tworzony przez ANTIC. Obraz ten jest
wyświetlany na ekranie przez wiązkę elektronów poruszającą się
poziomo od lewej do prawej krawędzi ekranu (patrząc od strony
użytkownika) i tworzącą jedną linię ekranu. Wiązka jest
wygaszana na czas przejścia do początku nowej linii - ten okres
nazywamy synchronizacją poziomą. Po utworzeniu całego obrazu
wiązka jest wygaszana na czas przejścia z prawego, dolnego rogu
ekranu do lewego, górnego. Nazywa się to synchronizacją
pionową. Cała operacja powtarza się co 1/50 sekundy, a więc 50
razy na sekundę.
Pozioma wielkość linii ekranu jest mierzona w specjalnych
jednostkach zwanych cyklami koloru. Jest to czas wykonywania
przez procesor 6502 połowy cyklu maszynowego. Pełna linia
ekranu ma 228 cykli koloru, co pozwala na przedstawienie 456
pojedynczych punktów, a pełny obraz zawiera 310 linii (w
systemie PAL). Jednak tak utworzony obraz nie mieściłby się w
całości na ekranie telewizora. Aby uniknąć utraty części
informacji, obraz tworzony przez ANTIC ma nieco ograniczone
wymiary.
Maksymalna wielkość obrazu generowanego przez ANTIC może
wynosić 216 linii, ponieważ na więcej nie wystarcza czasu.
Utworzenie większej liczby linii spowoduje "zerwanie"
synchronizacji czyli pionowe przesuwanie się obrazu. Aby górna
krawędź obrazu nie wychodziła poza ekran, w górnej części ANTIC
tworzy 24 linie puste. Pozostają więc 192 linie i taka właśnie
jest maksymalna rozdzielczość pionowa obrazu. Można ją nieco
zwiększyć przez zmniejszenie liczby pustych linii i zwiększenie
liczby linii obrazu, lecz suma wszystkich linii nigdy nie może
przekraczać 216.
Także w poziomie nie jest wykorzystywana cała długość
linii. W tym przypadku możliwe są jedynie trzy rozwiązania.
Wyświetlana linia obrazu może posiadać 128, 160 lub 192 cykle
koloru. Normalnie używany jest obraz o szerokości 160 cykli
koloru, co daje 320 punktów ekranu. Zmiana szerokości linii
jest dokonywana przez zmianę zawartości odpowiedniego rejestru
ANTIC-a i programista nie może jej ustalić dowolnie.
Pozostaje jeszcze wyjaśnienie różnicy między linią ekranu i
linią obrazu oraz między punktem ekranu i pixelem (punktem
obrazu). Wszystko to, co zostało napisane wyżej dotyczy linii i
punktów ekranu, ponieważ stanowią one podstawowe elementy
ekranu (niezależne od komputera). Natomiast najmniejszy element
obrazu (PICture ELement = pixel), na którego wygląd może
wpływać programista zależy od wybranego trybu graficznego.
Ogólnie można powiedzieć, że linia obrazu składa się z jednej
lub kilku linii ekranu, zaś pixel z jednego lub kilku punktów
ekranu.
ANTIC posiada kilkanaście rejestrów, które sterują jego
pracą. Poprzez zmianę ich zawartości można wpływać na wygląd
obrazu. Najważniejszym rejestrem jest DMACTL (DMA ConTroL -
$D400) kontrolujący dostęp ANTIC-a do pamięci komputera. Bity 6
i 7 tego rejestru są niewykorzystane, a znaczenie pozostałych
jest następujące:
Bit 5 włącza (gdy jest ustawiony) bezpośredni dostęp
ANTIC-a do pamięci w celu czytania programu. Skasowanie tego
bitu uniemożliwia więc wyświetlanie obrazu pomimo tego, że
znajduje się on w pamięci.
Bity 2-4 są wykorzystywane do sterowania grafiką graczy i
pocisków. Ich działanie jest szczegółowo opisane w rozdziale 8.
Bity 0 i 1 regulują dostęp ANTIC-a do pamięci w celu
odczytu danych obrazu. Gdy oba są równe zero, to ANTIC nie może
odczytywać danych i nie wyświetla obrazu. Inne kombinacje
ustalają szerokość wyświetlanego obrazu: 01 - obraz wąski (128
cykli koloru), 10 - obraz normalny (160 cykli koloru) i 11 -
obraz szeroki (192 cykle koloru).
Podczas wykonywania programu często zachodzi konieczność
przeprowadzenia jakiejś operacji (np. zmiany koloru) między
liniami ekranu, a nie w trakcie tworzenia linii. Pomocny jest w
tym rejestr WSYNC (Wait for SYNChronization - $D40A). Wpisanie
dowolnej wartości do tego rejestru powoduje zatrzymanie pracy
CPU (6502) do zakończenia tworzenia na ekranie aktualnej linii.
Także licznik linii ekranu VCOUNT (Vertical COUNT - $D40B)
jest zwykle wykorzystywany podczas przerwań DLI. Zawiera on
numer aktualnie tworzonej linii ekranu podzielony przez dwa.
Podczas tworzenia obrazu VCOUNT zlicza więc od 0 do 155.
Stosunkowo najrzadziej wykorzystywane są dwa następne
rejestry - LPENH (Light PEN Horizontal - $D40C) i LPENV (LPEN
Vertical). Wskazują one aktualną pozycję pióra świetlnego na
ekranie. Rejestr LPENH zawiera numer cyklu koloru (od 0 do
227), a LPENV numer linii podzielony przez dwa (jak VCOUNT).
7.1. Program ANTIC-a
ANTIC tworzy obraz według programu zawartego w pamięci RAM
komputera, oznaczonego skrótem DL (Display List). Adres tego
programu jest wpisywany do wektora DLPTRS (Display List PoinTeR
Shadow register), a następnie podczas przerwania synchronizacji
pionowej VBLK (w tym czasie obraz nie jest generowany)
przepisywany do DLPTR.
Program ANTIC-a jest układany przez system operacyjny i
zapisywany w pamięci podczas procedury otwarcia ekranu (SCOPN -
zob. str. 49). Dla każdego trybu program ANTIC-a jest inny, ale
jest tylko jeden. Użytkownik może ingerować w jego treść, aby
mieszać między sobą różne tryby oraz dla uzyskania innych
specjalnych efektów.
7.1.1. Rozkazy ANTIC-a
Aby zmieniać program ANTIC-a trzeba przede wszystkim znać
kody jego rozkazów i ich znaczenie. Wszystkie rozkazy, którymi
dysponuje ANTIC, można podzielić na trzy zasadnicze grupy:
rozkazy tworzenia pustych linii, rozkazy skoków i rozkazy
tworzenia linii trybu. Rodzaj rozkazu jest rozpoznawany według
czterech młodszych bitów. Cztery starsze bity służą do
modyfikacji podstawowego rozkazu.
We wszystkich rozkazach ustawienie najstarszego bitu
powoduje wywołanie przez ANTIC (po wykonaniu rozkazu)
przerwania niemaskowalnego. Przerwanie to nazywane jest
przerwaniem programu ANTIC-a (DLI - Display List Interrupt).
Nie należy przez to rozumieć, że przerywany jest program
ANTIC-a, lecz, że wywołuje on przerwanie. Po otrzymaniu żądania
przerwania DLI procesor wykonuje procedurę przerwania, której
adres znajduje się w rejestrze DLIV (DLI Vector - $0200).
Rozkazy tworzenia pustych linii mają cztery młodsze bity
skasowane, są więc postaci $x0. Pozostałe bity (4-6, bo bit 7
sygnalizuje przerwanie DLI) zawierają liczbę tworzonych pustych
linii zmniejszoną o jeden. Pełna lista rozkazów tworzących
puste linie jest następująca:
bez DLI z DLI
1 pusta linia $00 $80
2 puste linie $10 $90
3 puste linie $20 $A0
4 puste linie $30 $B0
5 pustych linii $40 $C0
6 pustych linii $50 $D0
7 pustych linii $60 $E0
8 pustych linii $70 $F0
Rozkazy skoków mają najmłodszy bit równy jeden, są więc
postaci $x1. Bity 4 i 5 są niewykorzystane, zaś bit 6 określa
rodzaj skoku. Gdy bit 6 jest skasowany, to tworzona jest jedna
pusta linia, a dwa następne bajty programu przepisywane są do
licznika programu w kolejności LSB/MSB. Powoduje to wykonywanie
dalszej części programu od wskazanego adresu, czyli po prostu
skok bezwzględny (JMP). Rozkaz ten jest podobny do rozkazu JMP
procesora 6502.
Gdy bit 6 jest ustawiony, to ANTIC wykonuje te same
czynności, lecz dalsza realizacja programu jest zatrzymywana,
aż do synchronizacji pionowej. Jest to więc skok z oczekiwaniem
na synchronizację VBLK (JVB) i musi on występować na końcu
programu ANTIC-a (i tylko tam).
Kody rozkazów skoku przedstawia poniższa tabela:
bez DLI z DLI
JMP $01 $81
JVB $41 $C1
Rozkazy tworzenia linii trybu zawierają w czterech
młodszych bitach numer trybu (od $02 do $0F), który określa
sposób interpretacji danych z pamięci obrazu. Chodzi tu
oczywiście o numery trybów ANTIC-a, które są inne niż numery
stosowane przez OS. Wszystkie numery trybów w tym rozdziale
oznaczają tryby ANTIC-a, o ile nie zostało specjalnie
zaznaczone, że chodzi o tryb OS. Pozostałe cztery bity
oznaczają modyfikacje rozkazu. Znaczenie bitu 7 (DLI) zostało
już opisane, teraz kolej na pozostałe modyfikacje.
Bit 4 (HSC - Horizontal SCrolling) oznacza, gdy jest
ustawiony, włączenie poziomego przesuwu tworzonej linii obrazu
(dalsze informacje na ten temat znajdują się w rozdziale 7.4. -
str. 180).
Bit 5 (VSC - Vertical SCrolling) oznacza, gdy jest
ustawiony, włączenie pionowego przesuwu tworzonej linii obrazu.
Bit 6 (LMS - Load Memory Scan) powoduje, gdy jest ustawiony
przepisanie dwóch następnych bajtów programu do licznika
pamięci obrazu. Licznik obrazu wskazuje ANTIC-owi miejsce w
pamięci, z którego ma on pobrać dane obrazu. Ta modyfikacja
rozkazu jest bardzo ważna i wymaga szerszego omówienia. ANTIC
po rozpoznaniu rozkazu tworzenia linii pobiera z pamięci obrazu
odpowiednią liczbę bajtów (zależną od trybu) i po
zinterpretowaniu wyświetla na ekranie. Pobieranie danych dla
następnej linii rozpoczyna się od następnego bajtu po ostatnio
odczytanym. Trzeba więc na początku programu odpowiednio
ustawić adres tych danych i to z dwóch powodów. Po pierwsze
dlatego, aby ANTIC wiedział skąd ma pobierać dane. Po drugie
dlatego, że program ANTIC-a jest wykonywany w całości 50 razy
na sekundę i po pobraniu danych dla jednego obrazu, dane dla
następnego byłyby pobierane z innego miejsca pamięci.
Licznik obrazu ma specyficzną konstrukcję, która wpływa na
sposób jego działania. Posiada on szesnaście bitów ustalanych
przez wpisanie adresu odczytanego z programu ANTIC-a. Podczas
pobierania danych z pamięci zmieniane jest jednak tylko 12
młodszych bitów. Ogranicza to zakres działania licznika do
bloku 4 KB. Jeżeli dane obrazu zajmują więcej niż 4 KB, to
licznik musi być ponownie ustawiony. W przeciwnym razie po
osiągnięciu końca bloku 4 KB następne dane będą pobierane z
początku tego samego bloku. Trzeba przy tym uważać, aby dane
żadnej linii obrazu nie przekraczały granicy bloku, gdyż nie
można zmienić stanu licznika w środku tworzonej linii. Sytuacja
taka występuje w trybach E i F. Normalnie rozkaz LMS występuje
w programie ANTIC-a razem z rozkazem tworzenia pierwszej linii
obrazu i razem z rozkazem tworzenia pierwszej linii okna
tekstowego (jeśli ono jest).
Poniższe tabele zawierają kody wszystkich rozkazów ANTIC-a
tworzących linie trybu.
Bez przerwania DLI
- HSC - HSC - HSC - HSC
modyfikacje - - VSC VSC - - VSC VSC
- - - - LMS LMS LMS LMS
tryb
2 $02 $12 $22 $32 $42 $52 $62 $72
3 $03 $13 $23 $33 $43 $53 $63 $73
4 $04 $14 $24 $34 $44 $54 $64 $74
5 $05 $15 $25 $35 $45 $55 $65 $75
6 $06 $16 $26 $36 $46 $56 $66 $76
7 $07 $17 $27 $37 $47 $57 $67 $77
8 $08 $18 $28 $38 $48 $58 $68 $78
9 $09 $19 $29 $39 $49 $59 $69 $79
A $0A $1A $2A $3A $4A $5A $6A $7A
B $0B $1B $2B $3B $4B $5B $6B $7B
C $0C $1C $2C $3C $4C $5C $6C $7C
D $0D $1D $2D $3D $4D $5D $6D $7D
E $0E $1E $2E $3E $4E $5E $6E $7E
F $0F $1F $2F $3F $4F $5F $6F $7F
Z przerwaniem DLI
- HSC - HSC - HSC - HSC
modyfikacje - - VSC VSC - - VSC VSC
- - - - LMS LMS LMS LMS
tryb
2 $82 $92 $A2 $B2 $C2 $D2 $E2 $F2
3 $83 $93 $A3 $B3 $C3 $D3 $E3 $F3
4 $84 $94 $A4 $B4 $C4 $D4 $E4 $F4
5 $85 $95 $A5 $B5 $C5 $D5 $E5 $F5
6 $86 $96 $A6 $B6 $C6 $D6 $E6 $F6
7 $87 $97 $A7 $B7 $C7 $D7 $E7 $F7
8 $88 $98 $A8 $B8 $C8 $D8 $E8 $F8
9 $89 $99 $A9 $B9 $C9 $D9 $E9 $F9
A $8A $9A $AA $BA $CA $DA $EA $FA
B $8B $9B $AB $BB $CB $DB $EB $FB
C $8C $9C $AC $BC $CC $DC $EC $FC
D $8D $9D $AD $BD $CD $DD $ED $FD
E $8E $9E $AE $BE $CE $DE $EE $FE
F $8F $9F $AF $BF $CF $DF $EF $FF
7.1.2. Struktura programu ANTIC-a
Program ANTIC-a musi spełniać kilka warunków, aby jego
wykonanie dało na ekranie pożądany efekt. Przede wszystkim musi
koniecznie zawierać rozkaz LMS na początku oraz rozkaz JVB na
końcu. Aby górna krawędź obrazu nie wychodziła poza ekran,
przed rozkazami tworzenia linii trybu powinny znaleźć się
rozkazy tworzenia pustych linii (może ich być mniej niż 24).
Typowy program ANTIC-a tworzony przez system operacyjny jest
przedstawiony na następnej stronie.
START $70 -+
$70 ¦ 3*8=24 puste linie
$70 -+
$4x linia trybu + LMS
<SCRM -+ adres pamięci obrazu
>SCRM -+ w kolejności LSB/MSB
$0x -+
$0x ¦
... : linie trybu
$0x ¦
$0x -+
$42 linia trybu 2 + LMS
<TXTM -+ adres pamięci okna
>TXTM -+ tekstowego (LSB/MSB)
$02 -+
$02 ¦ 3 linie trybu 2
$02 -+
$41 JVB
<START -+ adres początku
>START -+ programu ANTIC-a
Oczywiście fragment programu dotyczący okna tekstowego
występuje tylko wtedy, gdy to okno istnieje. Najkrótsze
programy ANTIC-a są ustalane dla trybów 5 (tryb 13 OS) i 7 (2)
bez okna tekstowego, mają one po 20 bajtów. Tryby E (15) i F
(8) bez okna mają najdłuższe programy - po 202 bajty. Jak
widać, czym większa rozdzielczość, tym dłuższy program ANTIC-a.
7.1.3. Kolory
Informacja o obrazie utworzona przez ANTIC przed wysłaniem
do monitora jest jeszcze uzupełniana informacją o kolorze. Ta
czynność jest wykonywana przez GTIA. Do realizacji tego zadania
GTIA wykorzystuje dziewięć rejestrów, w których przechowywane
są wartości kolorów. Znajdują się one w obszarze od $D012 do
$D01A, a ich rejestry-cienie od $02C0 do $02C8.
Wszystkie rejestry koloru mają jednakową strukturę. Cztery
starsze bity zawierają numer barwy, a cztery młodsze stopień
jasności. Ponieważ bit 0 nie jest odczytywany, to mamy do
dyspozycji 16 barw w 8 jasnościach. Daje to razem 128 kolorów,
a we wszystkich informacjach o Atari jest napisane, że można
wybierać z palety 256 kolorów. Skąd ta różnica? Obie podane
wyżej informacje są prawdziwe. Rzeczywiście do wyboru jest 128
kolorów. Natomiast szczególna interpretacja danych obrazu w
trybie 9 (tryb systemu operacyjnego) pozwala na uzyskanie
szesnastu zamiast ośmiu stopni jasności i teraz można wybierać
z 256 kolorów. Tak więc we wszystkich trybach mamy dostępne 128
kolorów, a tylko w trybie 9 (OS) - 256. Nie jest to całkowicie
prawdziwe, ale pozostawmy tą kwestię na później. Szczegóły są
wyjaśnione przy opisie trybów GTIA.
Teraz wypada przedstawić kolory, które odpowiadają różnym
wartościom umieszczonym w rejestrach koloru. Ze stopniami
jasności sprawa jest prosta: wartość najmniejsza ($00) oznacza
kolor najciemniejszy, a największa ($0F) - najjaśniejszy.
Znacznie trudniejsze jest przedstawienie barw. Przede wszystkim
dlatego, że barwa zależy także od jasności, np. barwa $00 z
jasnością $00 to kolor czarny, zaś z jasnością $0E - biały.
Poza tym kolory w dużym stopniu zależą od konkretnego
egzemplarza monitora, nie mówiąc już o systemie telewizyjnym
(wszyskie źródła podają barwy w systemie NTSC, a nie PAL). Po
przedstawieniu tych zastrzeżeń, czas na wykaz barw (x oznacza
jasność).
kod kolor
$0x szary
$1x złoty
$2x pomarańczowy
$3x czerwony
$4x różowy
$5x purpurowy
$6x fioletowy
$7x niebieski zimny
$8x niebieski
$9x błękitny
$Ax turkusowy
$Bx niebiesko-zielony
$Cx zielony
$Dx żółto-zielony
$Ex pomarańczowo-zielony
$Fx żółty
Na zakończenie jeszcze jedna ważna informacja. Podczas
tworzenia obrazu kolor jest określany zawsze według rejestru
sprzętowego. Ten z kolei jest zapisywany wartością z
rejestru-cienia podczas każdego przerwania VBLK, czyli 50 razy
na sekundę. Po zmianie koloru w rejestrze-cieniu kolor na
ekranie zmieni się więc najpóźniej po 1/50 sekundy. Jeśli
zmiana zostanie dokonana w rejestrze sprzętowym, to kolor
zmieni się natychmiast, lecz nie da się tego zobaczyć.
Najpóźniej bowiem po 1/50 sekundy kolor zostanie odtworzony
według starej wartości z rejestru-cienia. Gdy jednak kolor w
rejestrze sprzętowym będzie zmieniany podczas każdego tworzenia
obrazu (np. przez procedurę przerwania DLI), to zmiana będzie
trwała, ale tylko w tej części obrazu, która jest tworzona po
przerwaniu. Podczas przerwania VBLK stara wartość zostanie
odtworzona i część obrazu do ponownego wywołania procedury DLI
będzie miała stary kolor. Jest to najczęstsze zastosowanie
przerwań DLI.
7.2. Tryby bitowe
W trybach bitowych dostępny jest każdy pixel obrazu.
Poszczególne tryby różnią się między sobą liczbą dostępnych
kolorów oraz rozdzielczością, czyli wielkością pixela. Od tych
parametrów zależy też wielkość obszaru pamięci zajmowanego
przez dane obrazu. Ponieważ pixele w niektórych trybach zajmują
kilka linii ekranu (w pionie), to dla zaoszczędzenia czasu
ANTIC umieszcza dane pobrane dla jednej linii w specjalnym
rejestrze. Przy tworzeniu następnej linii ekranu należącej do
tej samej linii obrazu dane są pobierane nie z pamięci, lecz z
tego specjalnego rejestru. Pozostawia to więcej czasu jednostce
centralnej (6502) na wykonywanie właściwego programu. Trzeba
bowiem pamiętać, że ANTIC zatrzymuje pracę 6502 na czas
pobierania danych z pamięci.
ANTIC dysponuje ośmioma trybami bitowymi. Wszystkie tryby
są dostępne dla systemu operacyjnego. Ponadto OS poprzez zmianę
wartości w rejestrze GTIACTL może uzyskać trzy dodatkowe tryby
bitowe. Poniżej opisane są wszystkie tryby bitowe. Podane
wartości liczbowe odnoszą się, o ile nie określono inaczej, do
normalnej szerokości obrazu, równej 160 cykli koloru.
Tryb 8
W tym trybie pixel ma wysokość ośmiu linii ekranu i
szerokość czterech cykli koloru. W jednej linii znajduje się
więc 40 pixeli. Maksymalna liczba linii obrazu wynosi 192/8=24.
ANTIC dysponuje przy tym czteroma kolorami. Do wyboru koloru
pixela potrzebne są dwa bity. Razem dane całej linii zajmują
40*2=80 bitów, czyli 80/8=10 bajtów. Każda para bitów
umieszczona w pamięci obrazu służy do wyboru koloru według
schematu:
para bitów 00 - rejestr COLBAK
para bitów 01 - rejestr COLPF0
para bitów 10 - rejestr COLPF1
para bitów 11 - rejestr COLPF2
Tryb ten odpowiada trybowi $03 systemu operacyjnego.
Tryb 9
W tym trybie pixel ma wysokość czterech linii ekranu i
szerokość dwóch cykli koloru. W jednej linii znajduje się więc
80 pixeli. Maksymalna liczba linii obrazu wynosi 192/4=48.
ANTIC dysponuje przy tym dwoma kolorami. Do wyboru koloru
pixela potrzebny jest jeden bit. Razem dane całej linii zajmują
80*1=80 bitów, czyli 80/8=10 bajtów. Każdy skasowany bit w
pamięci obrazu powoduje wybór koloru z rejestru COLBAK, a każdy
bit ustawiony z rejestru COLPF0. Tryb ten odpowiada trybowi $04
systemu operacyjnego.
Tryb A
W tym trybie pixel ma wysokość czterech linii ekranu i
szerokość dwóch cykli koloru. W jednej linii znajduje się więc
80 pixeli. Maksymalna liczba linii obrazu wynosi 192/4=48.
ANTIC dysponuje przy tym czteroma kolorami. Do wyboru koloru
pixela potrzebne są dwa bity. Razem dane całej linii zajmują
80*2=160 bitów, czyli 160/8=20 bajtów. Każda para bitów służy
do wyboru koloru według schematu:
para bitów 00 - rejestr COLBAK
para bitów 01 - rejestr COLPF0
para bitów 10 - rejestr COLPF1
para bitów 11 - rejestr COLPF2
Tryb ten odpowiada trybowi $05 systemu operacyjnego.
Tryb B
W tym trybie pixel ma wysokość dwóch linii ekranu i
szerokość jednego cyklu koloru. W jednej linii znajduje się
więc 160 pixeli. Maksymalna liczba linii obrazu wynosi
192/2=96. ANTIC dysponuje przy tym dwoma kolorami. Do wyboru
koloru pixela potrzebny jest jeden bit. Razem dane całej linii
zajmują 160*1=160 bitów, czyli 160/8=20 bajtów. Każdy skasowany
bit w pamięci obrazu powoduje wybór koloru z rejestru COLBAK, a
każdy bit ustawiony z rejestru COLPF0. Tryb ten odpowiada
trybowi $06 systemu operacyjnego.
Tryb C
W tym trybie pixel ma wysokość jednej linii ekranu i
szerokość jednego cyklu koloru. Pixel jest więc prostokątny. W
jednej linii znajduje się 160 pixeli. Maksymalna liczba linii
obrazu wynosi 192/1=192. ANTIC dysponuje przy tym dwoma
kolorami. Do wyboru koloru pixela potrzebny jest jeden bit.
Razem dane całej linii zajmują 160/1=160 bitów, czyli 160/8=20
bajtów. Każdy skasowany bit w pamięci obrazu powoduje wybór
koloru z rejestru COLBAK, a każdy bit ustawiony z rejestru
COLPF0. Tryb ten odpowiada trybowi $0E systemu operacyjnego.
Tryb D
W tym trybie pixel ma wysokość dwóch linii ekranu i
szerokość jednego cyklu koloru. W jednej linii znajduje się
więc 160 pixeli. Maksymalna liczba linii obrazu wynosi
192/2=96. ANTIC dysponuje przy tym dwoma kolorami. Do wyboru
koloru pixela potrzebne są dwa bity. Razem dane całej linii
zajmują 160*2=320 bitów, czyli 320/8=40 bajtów. Każda para
bitów służy do wyboru koloru według schematu:
para bitów 00 - rejestr COLBAK
para bitów 01 - rejestr COLPF0
para bitów 10 - rejestr COLPF1
para bitów 11 - rejestr COLPF2
Tryb ten odpowiada trybowi $07 systemu operacyjnego.
Tryb E
W tym trybie pixel ma wysokość jednej linii ekranu i
szerokość jednego cyklu koloru. Pixel jest więc prostokątny. W
jednej linii znajduje się 160 pixeli. Maksymalna liczba linii
obrazu wynosi 192/1=192. ANTIC dysponuje przy tym czterema
kolorami. Do wyboru koloru pixela potrzebne są dwa bity. Razem
dane całej linii zajmują 160*2=320 bitów, czyli 320/8=40
bajtów. Pełna pamięć obrazu w tym trybie (192 linie) przekracza
granicę 4 KB. Każda para bitów wybiera kolor według schematu:
para bitów 00 - rejestr COLBAK
para bitów 01 - rejestr COLPF0
para bitów 10 - rejestr COLPF1
para bitów 11 - rejestr COLPF2
Tryb ten odpowiada trybowi $0F systemu operacyjnego.
Tryb F
W tym trybie pixel ma wysokość jednej linii ekranu i
szerokość pół cyklu koloru. W jednej linii znajduje się więc
320 pixeli. Maksymalna liczba linii obrazu wynosi 192/1=192.
Ponieważ nie można dokonać zmiany koloru w obrębie jednego
cyklu koloru, to pixele mogą się różnić tylko jasnością. Do
wyboru jasności pixela potrzebny jest jeden bit. Razem dane
całej linii zajmują 320*1=320 bitów, czyli 320/8=40 bajtów.
Pełna pamięć obrazu w tym trybie (192 linie) przekracza granicę
4 KB. Każdy skasowany bit w pamięci obrazu powoduje wybór
koloru z rejestru COLPF2, a każdy bit ustawiony wybiera jasność
z rejestru COLPF1, a kolor z COLPF2. Tryb ten odpowiada trybowi
$08 systemu operacyjnego.
Trzy dodatkowe tryby bitowe można uzyskać przez zmianę
dwóch najstarszych (6 i 7) bitów rejestru GTIACTL (GTIA
ConTroL). Normalnie mają one wartość 00 i obraz jest tworzony
przez ANTIC tak, jak to opisano przy poszczególnych trybach
bitowych i znakowych. System operacyjny dla uzyskania
dodatkowych trybów wybiera tryb ANTIC-a F ($08 OS) i zmienia
bity w GTIACTL. Pomimo, iż OS nie przewiduje zmiany sposobu
pracy GTIA w innych trybach ANTIC-a, to jest to możliwe i
pozwala niekiedy na uzyskanie ciekawych efektów graficznych
(także w trybach znakowych).
Ponieważ ANTIC w dodatkowych trybach OS pracuje w trybie F,
to możliwe jest uzyskanie na ekranie 192 linii po 320 punktów
ekranu w każdej. Dane każdej linii składają się więc z 40
bajtów. Sposób interpretacji tych danych jest jednak inny i
zależy od stanu bitów 6 i 7 w GTIACTL. Zawsze jednak GTIA
interpretuje każde cztery bity (pół bajtu) danych pamięci
obrazu jako dane dla jednego pixela. Można więc uzyskać w
jednej linii 80 pixeli, z których każdy ma wysokość jednej
linii ekranu i szerokość dwóch cykli koloru.
Tryb $09 (OS)
Tryb ten uzyskiwany jest przy wartości najstarszych bitów
GTIACTL równej 01. Wartość bitów każdego pixela jest
interpretowana jako stopień jasności. Kolor jest przy tym
pobierany z rejestru COLBAK. Pozwala to na uzyskanie 16 stopni
jasności jednego koloru.
Tryb $0A (OS)
Tryb ten uzyskiwany jest przy wartości najstarszych bitów
GTIACTL równej 10. Wartość bitów każdego pixela jest
interpretowana jako numer rejestru koloru. Ponieważ GTIA
posiada dziewięć rejestrów, to można uzyskać 9 różnych barw o
różnych jasnościach.
Tryb $0B (OS)
Tryb ten uzyskiwany jest przy wartości najstarszych bitów
GTIACTL równej 11. Wartość bitów każdego pixela jest
interpretowana jako numer barwy. Jasność jest przy tym
pobierana z rejestru COLBAK. Pozwala to na uzyskanie 16 różnych
barw o jednakowym stopniu jasności.
Zbiorcze zestawienie trybów bitowych zawiera poniższa
tabela. Liczba linii i rozmiar pamięci podane są w niej
dwukrotnie - pierwsza wartość dotyczy obrazu z oknem tekstowym,
a druga bez. Rozmiar pamięci określa liczbę bajtów zajmowaną
przez pamięć obrazu i program ANTIC-a.
tryb tryb liczba liczba liczba bajty rozmiar
ANTIC-a OS linii pixeli kolorów w linii pamięci
8 $03 20/24 40 4 10 434/432
9 $04 40/48 80 2 10 694/696
A $05 40/48 80 4 20 1174/1176
B $06 80/96 160 2 20 2174/2184
C $0E 160/192 160 2 20 4270/4296
D $07 80/96 160 4 40 4190/4200
E $0F 160/192 160 4 40 8112/8138
F $08 160/192 320 1,5 40 8112/8138
F $09 -/192 80 1(16 j.) 40 -/8138
F $0A -/192 80 9 40 -/8138
F $0B -/192 80 16(1 j.) 40 -/8138
7.3. Tryby znakowe
W trybach znakowych obraz jest tworzony w sposób odmienny
niż w trybach bitowych. W trybach bitowych dane z pamięci
obrazu są bezpośrednio wyświetlane na monitorze. W trybach
znakowych bajty danych są interpretowane jako numery znaków w
zestawie. ANTIC pobiera więc z pamięci obrazu numer znaku i
według tego numeru wybiera z zestawu znak do wyświetlenia. Dane
linii są przy tym umieszczane w specjalnym rejestrze, podobnie
jak w trybach bitowych.
Adres zestawu znaków (a właściwie jego starszy bajt) jest
umieszczony w rejestrze CHBASE (CHaracter BASE - $D409). Każdy
znak zajmuje w tym zestawie 8 bajtów. Przy tworzeniu linii
ekranu obliczany jest adres konkretnego bajtu pamięci, który
należy umieścić na ekranie. Odbywa się to według wzoru:
CHBASE*$0100 + numer_znaku*$08 + numer_linii_ekranu
Dla zaoszczędzenia czasu CPU numer znaku jest pobierany z
rejestru ANTIC-a, do którego zostały przepisane dane linii.
Numer znaku nie jest wykorzystywany w całości do wyboru znaku.
Jego bity 6 i 7 lub tylko 7 służą do wyboru koloru znaku. Tak
więc w trybach używających sześciu bitów można przedstawić 64
znaki, a w gdy używane jest siedem bitów, to zestaw zawiera 128
znaków. Ponieważ z rejestru CHBASE odczytuje się także tylko
część bitów (1-7 lub 2-7), to zestaw znaków powinien
rozpoczynać się odpowiednio od granicy 512 bajtów lub 1 KB.
Sposób tworzenia adresu bajtu danych dla różnych trybów jest
przedstawiony na rysunkach 12 i 13, które znajdują się na
następnej stronie.
Ponadto w trybach 2 i 3 wyglądem znaków na ekranie steruje
rejestr CHRCTL (CHaRacter ConTroL - $D401). Bity 3-7 tego
rejestru są niewykorzystane, a pozostałe mają następujące
znaczenie:
Bit 0 działa tylko na znaki, które mają ustawiony bit 7.
Gdy jest równy jeden, znaki te nie są wyświetlane na ekranie.
Przez okresowe przełączanie tego bitu można więc uzyskać
miganie znaku.
Bit 1 także działa tylko na znaki, które mają ustawiony bit
7. Gdy jest równy jeden, znaki te mają zamienione kolory
punktów i tła. Powoduje to wyświetlenie znaku w negatywie.
Bit 2 odwraca kolejność pobierania danych znaku z pamięci.
Gdy na początku wyświetlania linii obrazu jest ustawiony, to
wszystkie znaki w tej linii są odwrócone "do góry nogami".
CHBASE numer znaku licznik linii ekranu
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0| |7|6|5|4|3|2|1|0| |7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
| | | | | | |
+------+------+ +-+-+-----+-----+ +--+--+
| | | |
| v | |
| wybór koloru | |
| | |
+-----------+ +--+ +-----------+
| | |
v v v
+------+------+-----+-----+--+--+
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
adres danych linii znaku w zestawie
Rys.12. Tworzenie adresu znaku z wykorzystaniem 6 bitów
CHBASE numer znaku licznik linii ekranu
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0| |7|6|5|4|3|2|1|0| |7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
| | | | | | |
+-----+-----+ +++------+------+ +--+--+
| | | |
| v | |
| wybór koloru | |
| | |
+-----------+ +--+ +-----------+
| | |
v v v
+-----+-----+------+------+--+--+
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
adres danych linii znaku w zestawie
Rys.13. Tworzenie adresu znaku z wykorzystaniem 7 bitów
ANTIC dysponuje sześcioma trybami znakowymi. Tryb 3 jest
niedostępny dla systemu operacyjnego. Pozostałe tryby mają
swoje odpowiedniki w trybach OS. Poniżej opisane są wszystkie
tryby znakowe. Podane wartości liczbowe odnoszą się, o ile nie
określono inaczej, do normalnej szerokości obrazu, równej 160
cykli koloru.
Tryb 2
W tym trybie znak składa się z ośmiu linii po osiem pixeli,
z których każdy ma szerokość pół cyklu koloru. W jednej linii
znajduje się więc 40 znaków (czyli 40 bajtów). Maksymalna
liczba linii obrazu wynosi 192/8=24. Ponieważ nie można dokonać
zmiany koloru w obrębie jednego cyklu koloru, to pixele mogą
się różnić tylko jasnością. Każdy bit znaku określa jasność
punktu ekranu. Bit skasowany powoduje wybór koloru punktu z
rejestru COLPF2, a bit ustawiony wybiera jasność z rejestru
COLPF1, a kolor z COLPF2. Do określenia adresu znaku
wykorzystywane jest siedem bitów, więc zestaw zawiera 128
znaków. Najstarszy bit (7) steruje wyglądem znaku poprzez
rejestr CHRCTL. Tryb ten odpowiada trybowi $00 systemu
operacyjnego i jest używany przez edytor.
Tryb 3
W tym trybie znak składa się z dziesięciu linii po osiem
pixeli, z których każdy ma szerokość pół cyklu koloru. W jednej
linii znajduje się więc 40 znaków (czyli 40 bajtów). Kolory są
wybierane analogicznie, jak w trybie 2 i bit 7 także steruje
wyglądem znaku poprzez rejestr CHRCTL. W trybie 3 szczególny
jest sposób tworzenia znaków. Ponieważ dane znaku składają się
z ośmiu bajtów, to normalnie dwie ostatnie linie ekranu są
puste. Inaczej jest przy tworzeniu znaków z ostatniej ćwiartki
zestawu (o kodach $60-$7F). ANTIC pozostawia w tym przypadku
puste dwie pierwsze linie, zaś dwa pierwsze bajty danych znaku
umieszcza w dwóch ostatnich liniach (zob. rys. 14). Takie
tworzenie znaków wymaga zaprojektowania odrębnego zestawu
znaków, w którym będą przedefiniowane znaki zawarte w ostatniej
ćwiartce. Dzięki temu tryb ten jest szczególnie przydatny do
tworzenia tekstu (wykorzystuje go np. "SpeedScript"). Nie ma on
jednak odpowiednika w systemie operacyjnym.
znaki o kodach $00-$5F znaki o kodach $60-$7F
+--------+ +--------+ +--------+ +--------+
| | | | | XX |--+ | |
| XX XX | | XX XX | | XXXX |-+| | |
| XX XX | | XX XX | | | || | |
| XXXX |---->| XXXX | | XX XX | || | XX XX |
| XX | | XX | | XX XX | || | XX XX |
| XX | | XX | | XX XX | || | XX XX |
| XX | | XX | | XXXXX | || | XXXXX |
| | | | | XX | || | XX |
+--------+ ->| | +--------+ |+->| XX |
2 linie ->| | +-->| XXXX |
+--------+ +--------+
Rys.14. Tworzenie znaków w trybie 3 ANTIC-a
Tryb 4
W tym trybie znak składa się z ośmiu linii po cztery
pixele, z których każdy ma szerokość jednego cyklu koloru. W
jednej linii znajduje się więc 40 znaków (40 bajtów).
Maksymalna liczba linii obrazu wynosi 192/8=24. Do określenia
adresu znaku wykorzystywane jest siedem bitów, więc zestaw
zawiera 128 znaków. ANTIC dysponuje przy tym pięcioma kolorami.
Kolor pixela jest wybierany przez dwa bity danych znaku oraz
bit 7 numeru znaku. Każda para bitów służy do wyboru koloru
według schematu:
para bitów 00 - rejestr CLOBAK
para bitów 01 - rejestr COLPF0
para bitów 10 - rejestr COLPF1
para bitów 11 - rejestr COLPF2 (gdy bit 7 = 0)
para bitów 11 - rejestr COLPF3 (gdy bit 7 = 1)
Tryb ten odpowiada trybowi $0C systemu operacyjnego. Ponieważ w
polu o szerokości czterech pixeli trudno jest zdefiniować
literę, to tryb 4 jest wykorzystywany głównie do tworzenia
wielokolorowej grafiki (np. w grach), która zajmuje przy tym
stosunkowo niewielki obszar pamięci.
Tryb 5
W tym trybie znak składa się z szesnastu linii po cztery
pixele, w których każdy ma szerokość jednego cyklu koloru i
zajmuje dwie linie ekranu (znak jest dwukrotnie wyższy niż w
trybie 4). W jednej linii znajduje się więc 40 znaków (40
bajtów). Maksymalna liczba linii obrazu wynosi 192/16=12. Do
określenia adresu znaku wykorzystywane jest siedem bitów, więc
zestaw zawiera 128 znaków. ANTIC dysponuje przy tym pięcioma
kolorami. Kolor pixela jest wybierany przez dwa bity danych
znaku oraz bit 7 numeru znaku. Każda para bitów służy do wyboru
koloru według schematu:
para bitów 00 - rejestr CLOBAK
para bitów 01 - rejestr COLPF0
para bitów 10 - rejestr COLPF1
para bitów 11 - rejestr COLPF2 (gdy bit 7 = 0)
para bitów 11 - rejestr COLPF3 (gdy bit 7 = 1)
Tryb ten odpowiada trybowi $0D systemu operacyjnego.
Tryb 6
W tym trybie znak składa się z ośmiu linii po osiem pixeli,
z których każdy ma szerokość jednego cyklu koloru. W jednej
linii znajduje się więc 20 znaków (20 bajtów). Maksymalna
liczba linii obrazu wynosi 192/8=24. Do określenia adresu znaku
wykorzystywane jest sześć bitów, więc zestaw zawiera 64 znaki.
ANTIC dysponuje przy tym pięcioma kolorami. Kolor tła jest
zawsze ustalany przez rejestr COLBAK. Kolor wszystkich pixeli
znaku jest wybierany przez dwa najstarsze bity numeru znaku. Ta
para bitów służy do wyboru koloru według schematu:
para bitów 00 - rejestr COLPF0
para bitów 01 - rejestr COLPF1
para bitów 10 - rejestr COLPF2
para bitów 11 - rejestr COLPF3
Tryb ten odpowiada trybowi $01 systemu operacyjnego.
Tryb 7
W tym trybie znak składa się z szesnastu linii po osiem
pixeli, z których każdy ma szerokość jednego cyklu koloru i
zajmuje dwie linie ekranu. W jednej linii znajduje się więc 20
znaków (20 bajtów). Maksymalna liczba linii obrazu wynosi
192/16=12. Do określenia adresu znaku wykorzystywane jest sześć
bitów, więc zestaw zawiera 64 znaki. ANTIC dysponuje przy tym
pięcioma kolorami. Kolor tła jest zawsze ustalany przez rejestr
COLBAK. Kolor wszystkich pixeli znaku jest wybierany przez dwa
najstarsze bity numeru znaku. Ta para bitów służy do wyboru
koloru według schematu:
para bitów 00 - rejestr COLPF0
para bitów 01 - rejestr COLPF1
para bitów 10 - rejestr COLPF2
para bitów 11 - rejestr COLPF3
Tryb ten odpowiada trybowi $02 systemu operacyjnego.
Warto na koniec wskazać różnice pomiędzy poszczególnymi
trybami znakowymi. Tryby 6 i 7 mają znaki o szerokości
dwukrotnie większej, a tryby 5 i 7 o wysokości dwukrotnie
większej niż pozostałe. W trybach 4-7 dostępne jest 5 kolorów,
lecz w różny sposób. W trybach 4 i 5 kolor określają bity
znaku, a w trybach 6 i 7 bity numeru znaku. W pierwszym
przypadku można więc uzyskać znak wielokolorowy, zaś w drugim
cały znak musi mieć jednakowy kolor.
Zbiorcze zestawienie trybów znakowych zawiera poniższa
tabela. Liczba linii i rozmiar pamięci podane są w niej
dwukrotnie - pierwsza wartość dotyczy obrazu z oknem tekstowym,
a druga bez. Rozmiar pamięci określa liczbę bajtów zajmowaną
przez pamięć obrazu i program ANITC-a.
tryb tryb liczba liczba liczba bajty rozmiar
ANTIC-a OS linii znaków kolorów w linii pamięci
2 $00 -/24 40 1,5 40 -/992
3 - -/20 40 1,5 40 -/828
4 $0C 20/24 40 5 40 1154/1152
5 $0D 10/12 40 5 40 664/660
6 $01 20/24 20 5 20 674/672
7 $02 10/12 20 5 20 424/420
7.4. Przesuwanie obrazu
Często informacja, która powinna być wyświetlona na
ekranie, po prostu się na nim nie mieści. Konieczne jest więc
przemieszczenie tej informacji. Większość komputerów wymaga
przepisania całej zawartości pamięci obrazu na nowe miejsce.
Ponieważ w Atari adres pamięci obrazu jest zmienny, to
wystarczy tylko zmienić ten adres w rozkazie LMS i już cała
zawartość ekranu jest przesunięta.
Wykonanie takiego przesunięcia w pionie jest wyjątkowo
proste. Dane obrazu muszą obejmować więcej wierszy, a adres LMS
wskazuje początek odpowiedniego wiersza (rys. 15). Przesuw
obrazu uzyskuje się przez zmianę adresu LMS, czyli przez zmianę
tylko dwóch bajtów. Da to zadawalający efekt nawet w tak wolnym
języku, jak Atari Basic.
..................
..................
+------------------+
|..................|
|..................|
|..................|
|..................|
|..................|
|..................|
+------------------+
..................
..................
Rys.15. Pamięć obrazu przy przesuwaniu pionowym
Gdy ten sposób zostanie zastosowany do przesuwania obrazu w
poziomie, to uzyskany efekt będzie niezbyt interesujący. Po
zmniejszeniu adresu w rozkazie LMS wszystkie znaki z prawej
krawędzi obrazu znajdą się na lewej, a przy zwiększeniu
odwrotnie.
Aby tego uniknąć należy rozkaz LMS umieścić w każdej linii
obrazu, a dane obrazu muszą zawierać więcej informacji dla
każdej linii (rys. 16). Oczywiście szybka zmiana kilkunastu lub
kilkudziesięciu adresów wymaga już użycia języka maszynowego.
Ponadto musi to zostać wykonane w czasie, gdy obraz nie jest
tworzony, a więc podczas przerwania VBLK. Mimo to i tak jest to
dużo prostsze i szybsze niż przepisywanie całej zawartości
pamięci obrazu.
+------------------+
.....|..................|.....
.....|..................|.....
.....|..................|.....
.....|..................|.....
.....|..................|.....
.....|..................|.....
+------------------+
Rys.16. Pamięć obrazu przy przesuwaniu poziomym
Opisana wyżej metoda ma jedną zasadniczą wadę. Obraz nie
może być przesuwany poziomo po jednym punkcie ekranu, a pionowo
można to uzyskać tylko w trybach, w których linia obrazu składa
się z jednej linii ekranu. Przesuwanie ekranu odbywa się więc
skokowo, co nie wygląda zbyt ciekawie.
Konstrukcja ANTIC-a umożliwia jednak również przesuwanie
obrazu po jednym punkcie lub po jednej linii ekranu. Taki
przesuw zwany jest przesuwem delikatnym. Uzyskanie tego efektu
jest możliwe dzięki rejestrom ANTIC-a HSCROL (Horizontal
SCROLling - $D404) i VSCROL (Vertical SCROLling - $D405).
Rejestry te wpływają tylko na linie obrazu, w których
ustawiony jest odpowiednio bit 4 (HSC) lub bit 5 (VSC). Ponadto
linia nie może być jednocześnie przesuwana poziomo i pionowo.
7.4.1. Przesuw pionowy
Zanim przystąpimy do opisu delikatnego przesuwu obrazu w
pionie, musimy poznać jeszcze jeden wewnętrzny licznik ANTIC-a.
Licznik ten nazywa się DCTR (Delta CounTeR) i zlicza linie
ekranu w każdej linii obrazu. Ponieważ zliczanie rozpoczyna się
od zera, to najwyższy stan DCTR jest o jeden mniejszy od liczby
linii ekranu w linii obrazu dla danego trybu.
ANTIC przesuwa w górę te linie obrazu, które mają ustawiony
bit 5, o liczbę zawartą w rejestrze VSCROL. Jest to wykonywane
w następujący sposób. Po napotkaniu pierwszej linii obrazu,
która ma ustawiony bit 5, licznik DCTR rozpoczyna zliczanie od
wartości umieszczonej w VSCROL zamiast od zera. Powoduje to
wyświetlenie tylko dolnej części tej linii. Następne linie z
ustawionym bitem 5 są tworzone normalnie, a więc DCTR liczy od
zera do wartości maksymalnej dla danego trybu. Dopiero po
napotkaniu pierwszej linii ze skasowanym bitem 5 zmienia się
sposób liczenia. DCTR zlicza teraz linie ekranu od zera do
wartości zawartej w VSCROL, dzięki czemu na ekranie pojawia się
tylko górna część tej linii.
DCTR DCTR DCTR DCTR DCTR
+--------+ +--------+ +--------+ +--------+ +--------+
| |0 | XXXX |2 | XX XX |4 | XX XX |6 | |0
| XX |1 | XX XX |3 | XXXXXX |5 | |7 | XXXXX |1
| XXXX |2 | XX XX |4 | XX XX |6 | |0 | XX XX |2
| XX XX |3 | XXXXXX |5 | |7 | XXXXX |1 | XXXXX |3
| XX XX |4 | XX XX |6 | |0 | XX XX |2 | XX XX |4
| XXXXXX |5 | |7 | XXXXX |1 | XXXXX |3 | XX XX |5
| XX XX |6 | |0 | XX XX |2 | XX XX |4 | XXXXX |6
| |7 | XXXXX |1 | XXXXX |3 | XX XX |5 | |7
+--------+ +--------+ +--------+ +--------+ +--------+
VSCROL 0 2 4 6 0
linia 0 0 0 0 1
Rys.17. Delikatny przesuw obrazu w pionie
Przy pomocy rejestru VSCROL można przesuwać obraz tylko w
obrębie jednej linii. Aby zwiększyć zakres przesuwania obrazu
trzeba połączyć przesuwanie delikatne ze zgrubnym (na rys. 17
jest to zasygnalizowane przez numer linii).
Oczywiście zarówno zmiana stanu rejestru VSCROL, jak i
zmiana adresu pamięci obrazu musi być wykonana podczas
przerwania VBLK. Odpowiedni fragment procedury, która wykonuje
tą operację, jest przedstawiony poniżej (wartości oznaczone
$xxxx zależą od położenia w pamięci procedury, prorgamu ANTIC-a
i danych obrazu). Zostały przy tym poczynione następujące
założenia:
1. Obraz jest przesuwany tylko w pionie, a jego pamięć jest
zorganizowana w sposób pokazany na rys. 15.
2. Przesuwanie obrazu odbywa się tylko w górę, a po
osiągnięciu końca pamięci obrazu (oznaczonego przez FINISH)
przesuwanie się kończy.
3. Etykieta MSC oznacza miejsce programu ANTIC-a, w którym
znajduje się adres pamięci obrazu.
4. Obraz jest tworzony w takim trybie ANTIC-a, w którym
znak ma wysokość ośmiu linii ekranu i szerokość 8 punktów
ekranu (tryby 2 lub 4).
5. We wszystkich rozkazach tworzenia linii trybu, oprócz
ostatniego bit 5 jest ustawiony.
0100 ;Vertical Fine Scrolling
0110 ;
0120 JEXITVB = $E462
0130 VSCROL = $D405
0140 FINISH = $xxxx
0150 MSC = $xxxx
0160 ;
0170 *= $xxxx
0180 ;
0190 LDA MSC+1
0200 CMP # >FINISH
0210 BCC CONT
0220 LDA MSC
0230 CMP # <FINISH
0240 BCS EXIT
0250 CONT INC VSCROL
0260 LDA VSCROL
0270 CMP #$08
0280 BNE EXIT
0290 LDA #$00
0300 STA VSCROL
0310 CLC
0320 LDA MSC
0330 ADC #$28
0340 STA MSC
0350 BCC EXIT
0360 INC MSC+1
0370 EXIT JMP JEXITVB
Powyższa procedura ma niewielkie zastosowanie praktyczne,
gdyż po jej uruchomieniu obraz szybko przesunie się w górę i
tak już pozostanie. Aby nadać jej znaczenie praktyczne trzeba
napisać drugą procedurę, która będzie przesuwać obraz do góry
(zob. niżej) oraz uzależnić wykonanie jednej z tych procedur od
jakiegoś parametru. Może to być położenie joysticka lub
naciśnięcie klawisza.
Dla przesuwania obrazu w dół trzeba jeszcze przyjąć
dodatkowe założenie, że dane obrazu rozpoczynają się od adresu
START i po jego osiągnięciu przesuwanie zostanie przerwane.
0100 ;Vertical Fine Scrolling 2
0110 ;
0120 JEXITVB = $E462
0130 VSCROL = $D405
0140 START = $xxxx
0150 MSC = $xxxx
0160 ;
0170 *= $xxxx
0180 ;
0190 LDA # >START
0200 CMP MSC+1
0210 BCC CONT
0220 LDA # <START
0230 CMP MSC
0240 BCS EXIT
0250 CONT DEC VSCROL
0260 LDA VSCROL
0270 BPL EXIT
0280 LDA #$08
0290 STA VSCROL
0300 SEC
0310 LDA MSC
0320 SBC #$28
0330 STA MSC
0340 BCS EXIT
0350 DEC MSC+1
0360 EXIT JMP JEXITVB
7.4.2. Przesuw poziomy
Ten sam problem występuje przy przesuwaniu poziomym, gdyż
każdy bajt danych tworzy kilka pixeli lub cały znak.
Przesunięcie o cały bajt przesuwa więc obraz o kilka cykli
koloru. Rolę licznika dla przesuwu poziomego pełni w ANTIC-u
rejestr HSCROL - identycznie jak VSCROL dla przesuwu pionowego.
Między tymi rejestrami jest jednak pewna różnica. O ile VSCROL
pozwala przesunąć obraz o jedną linię, to HSCROL przesuwa o
jeden cykl koloru, a nie o jeden punkt. Przesunięcie bowiem
obrazu o jeden punkt (a więc jeden bit w danych) spowodowałoby
zmianę kolorów obrazu, gdyż kolory są zwykle ustalane przez
pary bitów.
Rejestr VSCROL ma również ograniczenie podobne do tego,
jakie wprowadza licznik DCTR. ANTIC uwzględnia jedynie cztery
młodsze bity HSCROL, co pozwala przesunąć obraz jedynie o 15
cykli koloru. Większe przesunięcie można uzyskać przez
połączenie delikatnego i zgrubnego przesuwu.
Tworzenie obrazu przesuniętego jest analogiczne, jak przy
przesuwie pionowym. Po napotkaniu rozkazu tworzenia linii
obrazu, który ma ustawiony bit 4, ANTIC opuszcza liczbę cykli
koloru odpowiadającą zawartości HSCROL, a brakujące cykle
koloru dodaje na końcu linii. Te brakujące cykle należą już do
następnego znaku, więc przy przesuwie poziomym dane linii
obrazu muszą być dłuższe conajmniej o jeden bajt. Ponadto
pamięć obrazu musi być zorganizowana w sposób pokazany na rys.
16. Dlatego każdy rozkaz tworzenia linii musi mieć ustawiony
bit 6 (LMS) w celu ponownego ustawienia licznika pamięci
obrazu.
Procedury obsługujące przesuw poziomy są zbliżone do
procedur przesuwu pionowego, więc zamieszczona zostanie tylko
jedna i już bez komentarza (założenia pozostają bez zmian).
0100 ;Horizontal Fine Scrolling
0110 ;
0120 JEXITVB = $E462
0130 HSCROL = $D404
0140 FINISH = $xxxx
0150 MSC = $xxxx
0160 ;
0170 *= $xxxx
0180 ;
0190 LDA MSC+1
0200 CMP # >FINISH
0210 BCC CONT
0220 LDA MSC
0230 CMP # <FINISH
0240 BCS EXIT
0250 CONT INC HSCROL
0260 LDA HSCROL
0270 CMP #$04
0280 BNE EXIT
0290 LDA #$00
0300 STA HSCROL
0310 LDX #$46
0320 LOOP INC MSC,X
0330 BNE NEXT
0340 INC MSC+1,X
0350 NEXT DEX
0360 DEX
0370 DEX
0380 BPL LOOP
0390 EXIT JMP JEXITVB
|