Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

Do strony głównej I LO w Tarnowie

Materiały dla uczniów liceum

Zoptymalizowane dla
  
1280 x 1024

  Wyjście       Spis treści       Poprzedni       Następny  

©2019 mgr Jerzy Wałaszek
I LO w Tarnowie

https://images.fineartamerica.com/images/artworkimages/mediumlarge/1/atari-logo-marjan-mencin.jpg

Autor artykułu: mgr Jerzy Wałaszek

 

Rozdział 2

ANTIC i lista wyświetlania

Spis treści Zawartość
Obraz telewizyjny
Komputery i telewizory
ANTIC, mikroprocesor wideo
Tworzenie list wyświetlania
Zapis na ekran własnej listy wyświetlania
Zastosowania dla list wyświetlania
x

 

Obraz telewizyjny

Podane tutaj informacje dotyczą głównie telewizji analogowej, która odeszła już do lamusa oddając miejsce telewizji cyfrowej. Odbiorniki z lampą kineskopową zostały zastąpione przez telewizory LCD o dużo większych możliwościach i lepszej jakości obrazu. Jednak w przypadku komputerów retro musimy pamiętać o ich środowisku, zatem w latach 80-tych typowy telewizor wyglądał tak:

Aby zrozumieć możliwości graficzne komputera domowego ATARI, najpierw należy zrozumieć zasady działania telewizora. Odbiorniki telewizyjne używają systemu wyświetlania za pomocą skanowania rastrowego. Wewnątrz obudowy telewizora znajduje się duża lampa obrazowa, zwana kineskopem, która wyświetla obraz:

 

Z tyłu lampy kineskopowej generowany jest strumień elektronów, który zostaje następnie wyrzucony w kierunku przodu lampy, gdzie znajduje się powierzchnia ekranowa pokryta luminoforem, substancją świecącą pod wpływem bombardowania elektronami. W trakcie swojego lotu ku ekranowi elektrony przechodzą przez zespół cewek wytwarzających pola magnetyczne, które zakrzywiają strumień elektronów w kierunku pionowym i poziomym (cewki odchylania poziomego i pionowego). W ten sposób strumień elektronów może uderzać w dowolny punkt na powierzchni ekranu. Układy elektroniczne wewnątrz telewizora sterują strumieniem elektronów w ten sposób, iż omiata on systematycznie powierzchnię ekranu:

Plamka przebiega po ekranie liniami poziomymi począwszy od góry ekranu w dół. W trakcie tego ruchu zmienia się jej intensywność świecenia i tak powstaje obraz. Gdy plamka osiągnie koniec linii obrazowej z prawej strony ekranu, zostaje wyłączona i przeniesiona z powrotem na lewą stronę, lecz nieco niżej, aby nowa linia znalazła się pod linią narysowaną poprzednio. Następnie plamka zostaje znów włączona i rysuje kolejną linię obrazu. Proces ten jest powtarzany dla 262 linii obrazu (w rzeczywistości tych linii jest dwa razy więcej, ponieważ jeden obraz składa się z dwóch półobrazów, których linie przeplatają się nawzajem, co zmniejsza migotanie ekranu i mniej meczy oczy. Zignorujemy przeplot i potraktujemy obraz telewizyjny tak, jakby składał się tylko z 262 linii). Te 256 linii wypełnia ekran z góry na dół.  Na spodzie ekranu (po narysowaniu 256-tej linii) strumień elektronów jest wyłączany i z powrotem umieszczany w lewym górnym narożniku ekranu. Wtedy cykl rozpoczyna się od początku z następnym obrazem. Całość powtarza się 60 razy na sekundę.

Teraz krótki opis żargonu technicznego: pojedyncze przejście strumienia przez ekran nazywa się "poziomą linią skanowania" (ang. horizontal scan line). Pozioma linia skanowania jest podstawową jednostką pomiaru odległości w pionie na ekranie. Wysokość obrazu podaje się przez określenie liczby poziomych linii skanowania, na których się on rozpościera. Okres, podczas którego strumień wraca z prawej krawędzi ekranu na lewą krawędź nazywa się okresem wygaszania poziomego (ang. horizontal blank). Okres powrotu strumienia ze spodu na górę ekranu nazywa się okresem wygaszania pionowego (ang. vertical blank). Cały proces rysowania pojedynczego obrazu zajmuje 16,684 mikrosekund. Okres wygaszania pionowego trwa około 1400 mikrosekund. Okres wygaszania poziomego zajmuje 14 mikrosekund. pojedyncza linia pozioma jest rysowana przez 64 mikrosekundy.

Większość odbiorników telewizyjnych projektowanych jest z nadmiarowością obrazu (ang. overscan), co oznacza, iż część obrazu znajduje się poza fizycznymi krawędziami ekranu kineskopu. Gwarantuje to, iż nie są widoczne czarne brzegi obrazu. Jest to jednak bardzo niewygodne dla komputerów, ponieważ informacja obrazowa znajdująca się poza krawędziami ekranu jest zupełnie nieprzydatna. Z tego powodu obraz wytwarzany przez komputer musi być nieco mniejszy od obrazu, który telewizor może teoretycznie wyświetlać.  Dlatego obraz z komputerów ATARI posiada ograniczenie do 192 poziomych linii skanowania. I tak normalnym ograniczeniem rozdzielczości telewizora używanego z tym komputerem jest 192 piksele pionowo.

Standardową jednostką odległości w poziomie jest piksel koloru (ang. color clock). Szerokość obrazu określa się przez podanie na ile pikseli koloru jest szeroki. W pojedynczej poziomej linii skanowania zawartych jest 228 pikseli koloru, z których maksymalnie widocznych jest jedynie 176. Dlatego ostateczną granicą rozdzielczości kolorowej w poziomie dla standardowego telewizora jest 176 pikseli. Za pomocą komputera Atari można pójść jeszcze dalej i kontrolować indywidualne pół-piksele koloru. Daje to rozdzielczość poziomą 352 pikseli. Jednakże użycie tej cechy wiąże się z powstawaniem ciekawych efektów koloru znanych jako artefakty koloru (ang. color artifacts). Mogą one być kłopotliwe, jeśli są niepożądane; z kolei dla programisty pragnącego dodatkowego koloru i nie zrażonego ich ograniczeniami są one skarbem.

 

Komputery i telewizory

Podstawowym problemem każdego komputera przy wykorzystywaniu telewizyjnej techniki skanowania rastrowego do celów wyświetlania obrazu jest to, iż wyświetlanie w telewizji to proces dynamiczny, z tego powodu telewizor nie pamięta obrazu. W konsekwencji komputer musi pamiętać obraz ekranowy i ciągle wysyłać sygnał do telewizora, który mówi mu, co ma wyświetlać. Proces ten jest procesem ciągłym i wymaga uwagi przez cały czas. Z tego powodu większość mikrokomputerów posiada specjalne obwody sprzętowe, które zajmują się telewizorem. Podstawowe rozwiązanie jest właściwie takie samo we wszystkich systemach:

mikroprocesor → pamięć ekranu → układ wideo → ekran telewizora

Mikroprocesor zapisuje informację do obszaru pamięci RAM ekranu, który przechowuje dane do wyświetlenia na ekranie. Układ wideo systematycznie przegląda ten obszar RAM, pobierając dane ekranowe, które zamienia na sygnały telewizyjne. Sygnały te idą do odbiornika telewizyjnego, który następnie wyświetla tę informację. Pamięć ekranu jest odwzorowana na ekranie w tym samym porządku jak w RAM. To jest, pierwszy bajt w pamięci ekranu odwzorowuje lewy górny róg na ekranie, drugi bajt odwzorowuje o jedną pozycję na prawo, itd. aż do ostatniego bajta, który odwzorowuje prawy dolny róg ekranu.

Jakość obrazu, który trafia na ekran, zależy od dwóch czynników: jakości układu wideo oraz ilości pamięci ekranu użytej do wyświetlania. Najprostsze rozwiązanie jest takie, jakie zastosowano w komputerach TRS- 80 i PET.

 
TRS-80   Commodore PET

(TRS-80 jest znakiem handlowym firmy  Radio Shack Co; PET jest znakiem handlowym firmy Commodore Business Machines)

Oba te komputery przydzielają określony 1 KB pamięci RAM na pamięć ekranu. Układy sprzętowe wideo pobierają dane z tego obszaru, interpretują je jako znaki (korzystając z zestawu znaków w pamięci ROM), i umieszczają wynikowe znaki na ekranie. Każdy bajt reprezentuje jeden znak, co pozwala na 256 różnych znaków w zestawie. Przy 1KB pamięci RAM ekranu  można jednocześnie wyświetlić na ekranie tysiąc znaków. Z tym rozwiązaniem niewiele można zrobić. Firma Apple stosuje bardziej zaawansowane układy wideo (Apple jest znakiem handlowym firmy Apple Computers) w swoim komputerze Apple II.

Apple II

Udostępnione są trzy tryby graficzne: tekstowy, graficzny o niskiej rozdzielczości i graficzny o wysokiej rozdzielczości. Tryb tekstowy działa bardzo podobnie jak w komputerach PET i TRS-80. W trybie graficznym o niskiej rozdzielczości układ wideo sięga do pamięci ekranu  i interpretuje jej zawartość w inny sposób. Zamiast interpretowania każdego bajtu jako znaku, każdy bajt jest interpretowana jako para czterobitowych kodów kolorów. Wartość tych kodów określa kolor pojedynczego piksela, co daje 16 różnych kolorów. W trybie graficznym o wysokiej rozdzielczości każdy bit w pamięci ekranu jest odwzorowany w pojedynczy piksel. Jeśli bit jest ustawiony na 1, to odpowiadający mu piksel ekranu zawiera kolor, jeśli bit ma stan 0, to jego piksel pozostaje czarny. Cała sprawa komplikuje się wraz z różnymi niuansami projektowymi w komputerach Apple, lecz taka jest podstawowa idea. Ważne jest to, iż Apple posiada trzy tryby wyświetlania, trzy kompletnie różne sposoby interpretowania danych w pamięci ekranu. Układy sprzętowe wideo w Apple są wystarczająco mądre, aby interpretować bajt pamięci ekranu albo jako 8-bitowy znak (tryb tekstowy), albo jako dwa 4-bitowe kody koloru (tryb o niskiej rozdzielczości), albo jako 7 osobnych bitów dla mapy bitowej (tryb o wysokiej rozdzielczości).

 

ANTIC, mikroprocesor wideo

Układ ANTIC komputera ATARI

Lista wyświetlania komputera ATARI 400/800 reprezentuje uogólnienie opisanych wyżej systemów. Tam, gdzie komputery PET i TRS-80 posiadają tylko jeden tryb, a Apple ma trzy tryby, tam komputer ATARI 400/800 ma aż 14 trybów. Drugą ważną różnicą jest to, iż tryby wyświetlania mogą być mieszane ze sobą na ekranie. Oznacza to, iż użytkownik nie jest ograniczony do wyboru pomiędzy ekranem pełnym tekstu a ekranem pełnym grafiki. Każdy zbiór tych 14 trybów graficznych może być wyświetlany jednocześnie na ekranie. Trzecia istotna różnica polega na tym, iż pamięć ekranu może być umieszczona gdziekolwiek w przestrzeni adresowej tego komputera i przesuwana w czasie pracy programu, podczas gdy w innych komputerach posiada ona stałe położenie. To uogólnienie stało się możliwe dzięki mikroprocesorowi wideo, zwanemu ANTIC. Tam, gdzie wspomniane systemy używają raczej prostych obwodów wideo, Atari zaprojektowało w pełni funkcjonalny mikroprocesor przeznaczony tylko do obsługi zawiłości wyświetlania telewizyjnego. ANTIC jest prawdziwym mikroprocesorem, posiada zestaw instrukcji, program i dane. Program dla ANTIC'a jest zwany listą wyświetlania (ang. display list). Lista wyświetlania określa trzy rzeczy: gdzie można znaleźć dane ekranowe, jakie tryby wyświetlania użyć do zinterpretowania tych danych ekranowych oraz jakich specjalnych opcji (jeśli takie są) należy użyć. Gdy używana jest lista wyświetlania, ważne jest, aby nie traktować widoku ekranu jako jednolitego obrazu w pojedynczym trybie, lecz jako ciągu "linii różnych trybów".  Linia trybu jest zbiorem poziomych linii skanowania. Rozciąga się poziomo na całą szerokość ekranu. Linia trybu graficznego 2 jest wysoka na 16 poziomych linii skanowania, natomiast linia trybu graficznego 7 jest wysoka tylko na dwie linie skanowania. Wiele trybów graficznych dostępnych z poziomu języka BASIC jest jednorodne; ustawiony zostaje cały ekran w pojedynczym trybie. Nie ograniczaj swojej wyobraźni do tego przykładu; za pomocą listy wyświetlania możesz utworzyć dowolny ciąg linii trybu biegnących w dół ekranu. Lista wyświetlania jest zbiorem kodów bajtowych, które określają ten ciąg.

Zbiór instrukcji ANTIC'a jest raczej prosty. Istnieją cztery klasy instrukcji: tryb mapowania, tryb znakowy, tryb pustej linii i skok. Instrukcje trybu mapowania powodują, iż ANTIC wyświetla linię trybu z prostymi pikselami kolorowymi (bez znaków). Instrukcje trybu znakowego powodują, iż ANTIC wyświetla linię trybu z umieszczonymi w niej znakami. Instrukcje pustych linii powodują, iż ANTIC wyświetla zadaną liczbę linii o kolorze tła. Instrukcje skoku są analogiczne do instrukcji JMP mikroprocesora 6502; przeładowują one licznik programu ANTIC'a.

Istnieją również cztery specjalne opcje, które czasami można określić przez ustawienie przypisanego im bitu w instrukcji ANTIC'a. Opcje te to: przerwanie z listy wyświetlania (ang. display list Interrupt, DLI), ładowanie linii skanowania z pamięci (ang. load memory scan, LMS), przesuwanie w pionie (ang. vertical scroll) i przesuwanie w poziomie (ang. horizontal scroll).

Instrukcje trybu mapowania powodują, iż ANTIC wyświetla linię trybu zawierającą piksele o pełnym kolorze. Wyświetlany kolor pochodzi z rejestru koloru. Wybór rejestru koloru jest określany przez wartość danych ekranowych. W trybie mapowania czterokolorowego (tryby BASIC 3, 5, 7 i tryby ANTIC'a 8, A, D i E) para bitów jest potrzebna do określenia koloru:

Wartość pary bitów Używany rejestr koloru
00 0 COLBAK
01 1 COLPF0
10 2 COLPF1
11 3 COLPF2

Ponieważ tylko dwa bity są potrzebne do określenia jednego piksela, 4 piksele są zakodowane w każdym bajcie danych ekranowych. Na przykład, bajt danych ekranu zawierający wartość $1B wyświetli 4 piksele; pierwszy będzie w kolorze tła, drugi w kolorze z rejestru koloru 0, trzeci przyjmie kolor z rejestru koloru 1, a czwarty będzie miał kolor z rejestru koloru 2:

COLBAK  
COLPF0  
COLPF1  
COLPF2  
  $1B = 00011011
00 01 10 11
       

W trybach mapowania dwukolorowego (tryby BASIC 4, 6, 8, tryb ANTIC 9, B. C, F) każdy bit określa jeden z dwóch rejestrów koloru. Bit o wartości 0 wybiera dla piksela kolor tła, a bit o wartości 1 wybiera rejestr koloru 0. W jednym bajcie danych ekranowych można umieścić 8 pikseli:

COLBAK  
COLPF0  
  $1B = 00011011
0 0 0 1 1 0 1 1
               

Istnieje osiem różnych trybów mapowania. Różnią się one liczbą wyświetlanych kolorów (2 lub 4), rozmiarem pionowym jednej linii trybu (1 linia skanowania, 2, 4 lub 8) oraz liczbą pikseli, które mieszczą się w poziomie w jednej linii trybu (40, 80, 160 lub 320).  Dlatego niektóre tryby mapowania dają lepszą rozdzielczość, co oczywiście wymaga więcej pamięci RAM ekranu. Poniższa tabelka przedstawia tę informację dla wszystkich trybów:

Tabela 2-1

Tryb
ANTIC
Tryb
BASIC
Liczba
kolorów
Linie
skanowania
na
linię trybu
Piksele
na
linię
trybu
Bajty
na linię
Bajty
na ekran
2 0 2 8 40 40 960
3 brak 2 10 40 40 760
4 brak 4 8 40 40 960
5 brak 4 16 40 40 480
6 1 5 8 20 20 480
7 2 5 16 20 20 240
8 3 4 8 40 10 240
9 4 2 4 80 10 480
A 5 4 4 80 20 960
B 6 2 2 160 20 1920
C brak 2 1 160 20 3840
D 7 4 2 160 40 3840
E brak 4 1 160 40 7680
F 8 2 1 320 40 7680

Instrukcje trybu znakowego powodują, iż ANTIC wyświetla linię trybu z umieszczonymi w niej znakami. Każdy bajt w pamięci RAM ekranu określa jeden znak. Istnieje sześć trybów wyświetlania znaków.  Zostało to dokładnie omówione w następnym rozdziale.

Instrukcje pustych linii tworzą puste linie o stałym kolorze tła. Istnieje osiem instrukcji pustych linii, które określają ilość pustych linii w pojedynczej linii trybu (od 1 do 8).

Jest dwie instrukcje skoku. Pierwsza (ang. Jump, JMP) jest skokiem bezpośrednim; przeładowuje ona licznik programu ANTIC'a nowym adresem, który występuje za instrukcją JMP jako jej argument. Jej jedynym zadaniem jest rozwiązanie kłopotliwego problemu: licznik programu ANTIC'a posiada tylko 10 bitów licznika oraz sześć bitów zatrzaskowych (które nie zmieniają wartości wraz z wykonywaniem kolejnych instrukcji), zatem lista wyświetlania nie może przekraczać granicy bloku 1KB. Jeśli jednak musi to zrobić, to należy zastosować instrukcję JMP do przeskoczenia granicy bloku. Zauważ, iż oznacza to brak pełnej przemieszczalności list wyświetlania w pamięci komputera.

Druga instrukcja skoku (ang. Jump on Vertical Blank, JVB) jest częściej używana. Przeładowuje ona licznik programu wartością w argumencie i czeka, aż generacja obrazu telewizyjnego wejdzie w fazę wygaszania pionowego. Instrukcję tę zwykle stosuje się na końcu listy wyświetlania w celu wykonania skoku na początek listy. W ten sposób otrzymujemy pętlę nieskończoną, a oczekiwanie na wygaszanie pionowe zapewnia, że ta pętla nieskończona będzie zsynchronizowana z cyklem wyświetlania telewizora. Obie instrukcje JMP i JBV są instrukcjami trzybajtowymi, w których pierwszy bajt jest kodem operacyjnym instrukcji, a drugi i trzeci bajt zawierają adres skoku (w kolejności bajt dolny/górny).

Cztery specjalne opcje zostaną omówione w rozdziałach 5 i 6. Opcja ładowania skanu z pamięci (ang. Load Memory Scan, LMS) musi zostać wstępnie wyjaśniona. Opcja ta jest wybierana przez ustawienie bitu nr 6 trybu mapowania lub trybu znakowego w bajcie instrukcji. Gdy ANTIC napotka taką instrukcję, to z dwóch kolejnych bajtów załaduje adres dla licznika skanowania pamięci. Licznik ten informuje ANTIC o miejscu, gdzie znajduje się pamięć RAM ekranu. Z tego obszaru rozpocznie pobieranie danych do wyświetlenia. Instrukcja LMS jest instrukcją trzybajtową: jednobajtowy kod operacyjny, za którym następują 2 bajty argumentu. W prostych listach wyświetlania instrukcja LMS jest używana tylko jeden raz, na początku listy wyświetlania. Czasami może być konieczne użycie drugiej instrukcji LMS. Potrzeba ta pojawia się wtedy, gdy obszar RAM ekranu wykracza poza granicę bloku 4KB. Licznik skanu pamięci posiada tylko 12 bitów, a pozostałe 4 to bity zatrzaskowe, stąd dane wyświetlania nie mogą przekraczać granicy 4KB. W takim wypadku instrukcja LMS musi zostać zastosowana do przeskoczenia licznikiem skanu ponad granicą. Zwróć uwagę, iż oznacza to, że dane wyświetlania nie są w pełni relokowalne. Instrukcje LMS posiadają szersze zastosowania, które zostaną omówione później.

 

Tworzenie list wyświetlania

Każda lista wyświetlania powinna rozpoczynać się od trzech instrukcji "8 pustych linii". Mają one za zadanie pokonanie nadmiarowości obrazu w pionie przez umieszczenie początku ekranu 24 linie skanowania niżej. Po wykonaniu tego powinna zostać określona pierwsza linia ekranu, w której ustawiona została opcja ładowania skanu z pamięci, LMS, aby poinformować ANTIC, gdzie znajdzie pamięć RAM ekranu. Następnie pojawiają się instrukcje odpowiednich trybów, które będą używane na ekranie. Całkowita liczba poziomych linii skanowania tworzonych przez listę wyświetlania powinna zawsze wynosić 192 lub mniej; ANTIC nie zachowuje wymagań czasowych ekranu telewizora. Jeśli każesz mu wyświetlić zbyt wiele linii, zrobi to, lecz obraz telewizyjny prawdopodobnie zacznie sie przewijać. Wyświetlenie mniej niż 192 linii skanowania nie spowoduje problemów, w rzeczywistości zmniejszy to czas wykonywania programu przez 6502 przez zmniejszenie liczby cykli kradzionych przez ANTIC. Programista musi wyliczyć sobie sumę poziomych linii skanowania tworzonych przez daną listę wyświetlania i sprawdzić ją. Lista wyświetlania kończy się instrukcją JVB, która ustawia licznik rozkazów ANTIC'a na początek listy i czeka na wygaszanie pionowe, aby wyświetlić kolejną ramkę obrazu. Oto typowa lista wyświetlania dla standardowego trybu graficznego 0 w języku BASIC (wszystkie wartości są w systemie szesnastkowym):
70   8 pustych linii
70   8 pustych linii
70   8 pustych linii
42   Tryb ANTIC'a nr 2 (w BASIC'u tryb 0) wraz z LMS
20   Adres pamięci RAM ekranu $7C20
7C
02   Tryb ANTIC'a nr 2 dla kolejnej linii trybu
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
41   Instrukcja JVB skoku na początek listy wyświetlania
E0   Adres początku listy wyświetlania #7BE0
7B  

Jak widzisz, ta lista wyświetlania jest krótka – tylko 32 bajty. Większość list wyświetlania jest krótsza niż 100 bajtów. Co więcej są one dosyć proste i łatwe do zbudowania.

Aby zaimplementować swoją własną listę wyświetlania, musisz najpierw zaprojektować format ekranu. Najlepiej zrobić to na kartce papieru. Umieść na niej obraz ekranu i zamień go w ciąg linii trybu. Sprawdzaj liczbę linii skanowania swojego obrazu przez przeglądanie tabelki 2-1. Zamień następnie ciąg linii trybu na ciąg bajtów z trybami ANTIC'a. Umieść trzy bajty "8 pustych linii" ($70) na początku listy. Ustaw bit nr 6 pierwszego bajtu trybu (w górnych 4 bitach będzie wartość 4). Utworzy to instrukcję z ładowaniem skanu pamięci, LMS. Umieść za nią 2 bajty, które określają adres pamięci RAM ekranu (dolny bajt adresu, później górny). Następnie kontynuuj z resztą bajtów trybu. Na końcu swojej listy wyświetlania wstaw instrukcję JVB ($41) z adresem początku listy wyświetlania. Teraz umieść te wszystkie bajty w pamięci RAM. Mogą być gdziekolwiek chcesz, upewnij się tylko, iż nie nadpiszą nic innego i że JVB wskazuje na szczyt listy wyświetlania. Lista wyświetlania nie może przekraczać adresów na granicy bloków 1KB. Jeśli bezwzględnie musisz mieć listę przekraczającą taką granicę, wstaw instrukcję JMP tuż przed granicą bloku. Argument instrukcji JMP jest adresem pierwszego bajtu po drugiej stronie granicy. Następnie musisz wyłączyć ANTIC na ułamek sekundy, gdy wpisujesz do niego wskaźnik listy wyświetlania. Zrób to przez wpisanie 0 do SDMCTL pod adresem $22F. Następnie umieść adres nowej listy wyświetlania w komórkach $230 i $231 (najpierw dolny bajt, później górny). Na koniec włącz z powrotem ANTIC wpisaniem wartości $22 do SDMCTL. Podczas wygaszania pionowego, gdy ANTIC odpoczywa, system operacyjny (OS) przeładuje licznik programu ANTIC'a tymi wartościami.

 

Zapis na ekran własnej listy wyświetlania

Pamięć ekranu może znajdować się gdziekolwiek w przestrzeni adresowej komputera. Zwykle lista wyświetlania określa początek pamięci programu w swojej pierwszej instrukcji wyświetlania – w początkowej instrukcji LMS. Jednakże ANTIC może wykonywać nową instrukcję LMS w każdej linii trybu na liście wyświetlania, jeśli jest to pożądane. W ten sposób informacja z całej przestrzeni adresowej komputera może zostać wyświetlona na pojedynczym ekranie. To może być cenne przy tworzeniu niezależnych okien tekstowych.

Istnieje kilka ograniczeń w umieszczaniu pamięci ekranu. Po pierwsze pamięć ekranu nie może przekraczać granicy adresowej 4 KB. Jeśli nie możesz uniknąć przekraczania granicy 4 KB (jak w przypadku trybu 8 w BASIC'u, który wykorzystuje 8 KB RAM), musisz przeładować licznik skanowania pamięci nową instrukcją LMS. Po drugie, jeśli zamierzasz wykorzystywać jakiekolwiek procedury ekranowe systemu operacyjnego, to musisz się zastosować do konwencji używanych przez ten system. Może to być szczególnie trudne, gdy używasz zmodyfikowanej listy wyświetlania w programie w języku BASIC. Jeśli zmienisz standardową listę wyświetlania z programu BASIC'a, a następnie będziesz próbował drukować lub rysować po ekranie, to system operacyjny wykona to przy założeniu, iż lista wyświetlania jest niezmieniona. W wyniku prawdopodobnie dostaniesz zaśmiecony obraz.

Istnieją trzy sytuację, gdy obraz może ulec awarii, gdy próbujesz zmieniać listę wyświetlania. Po pierwsze BASIC może odmówić wykonania operacji na ekranie, ponieważ jest ona niemożliwa do wykonania w trybie graficznym, który system operacyjny traktuje jako obecnie ustawiony. Zapisuje on numer używanego trybu graficznego ekranu pod adresem $57. Możesz go oszukać i zmusić do współpracy przez wstawienie tam innej wartości. Wstawiaj numer trybu BASIC'a, nie ANTIC'a.

Druga awaria, którą możesz spowodować, powstaje gdy mieszasz linie trybu o różnej długości w bajtach. Niektóre linie trybu wymagają 40 bajtów na linię, inne wymagają 20, a jeszcze inne wymagają tylko 10. Powiedzmy, że wstawisz jedną 20-bajtową linię trybu na listę wyświetlania z 40-bajtowymi liniami trybu. Następnie wyświetlasz tekst na ekranie instrukcją PRINT. Wszystko ponad wstawioną linią będzie w porządku, lecz poniżej znaki zostaną przesunięte o 20 spacji w prawo. Dzieje się tak, ponieważ system załozył, iż każda linia wymaga 40 bajtów i umieścił znaki zgodnie z tym założeniem. Lecz ANTIC po napotkaniu wstawionej linii trybu pobierze z pamięci tylko 20 bajtów z tego, co system sądzi, że powinno być 40 bajtami. ANTIC zinterpretuje pozostałe 20 bajtów jako należące do następnej linii i wyświetli je tam. To spowoduje, że w następnej linii i w dalszych wiersze zostaną przesunięte o 20 spacji w prawo.

Jedynym pewnym sposobem obejścia tego problemu jest powstrzymanie się od używania poleceń BASIC'a PRINT i PLOT do przesyłania informacji na ekran z niestandardową listą wyświetlania. Szybkim, lecz topornym sposobem jest zorganizowanie ekranu w grupy linii, które zawierają całkowite wielokrotności standardowego rozmiaru w bajtach. Tj. nie wstawiaj 20 bajtowej linii trybu do listy wyświetlania z liniami 40 bajtowymi, zamiast tego wstaw dwie linie 20 bajtowe lub jedną 20 bajtową i dwie 10 bajtowe. Tak długo jak zachowasz właściwe wielokrotności całkowite, unikniesz przesunięcia w poziomie.

To rozwiązanie akcentuje trzeci problem z indeksowanymi listami wyświetlania i BASIC'iem: przesunięcia pionowe. System operacyjny umieszcza treść ekranu przez wyliczanie liczby bajtów do pominięcia w dół od góry ekranu. W standardowej liście wyświetlania zbudowanej z 40 bajtowych linii trybu BASIC umieści znaki w linii dziesiątej przez pominięcie 360 bajtów od początku pamięci ekranu (9 x 40). Jeśli wstawiłeś cztery 10-bajtowe linie trybu, to BASIC umieści te znaki o trzy wiersze dalej w dół ekranu, niż mógłbyś się spodziewać. Co więcej różne linie trybów zawierają różną liczbę linii skanowania, zatem pozycja na ekranie nie będzie się dokładnie zgadzała z twoimi oczekiwaniami, jeśli nie weźmiesz tego pod uwagę.

Jak widzisz, ekrany z mieszanymi trybami graficznymi mogą być trudne w użyciu w połączeniu z systemem operacyjnym. Często będziesz zmuszony go oszukiwać, aby taka lista wyświetlania działała prawidłowo. Aby użyć rozkazów PRINT lub PLOT dla okna w danym trybie, wstaw numer trybu BASIC tego okna pod adres $57, a następnie wstaw adres lewego górnego piksela do komórek $58 i $59 (dolny, później górny bajt). W trybach znakowych wykonaj rozkaz POSITION 0,0, aby umieścić kursor w lewym górnym rogu okna trybu. W trybach mapowania wszystkie rozkazy PLOT i DRAWTO będą używały lewego górnego rogu okna trybu jako początku układu współrzędnych.

System list wyświetlania można wykorzystać do tworzenia ciekawie wyglądających ekranów. Najbardziej oczywistym zastosowaniem jest mieszanie tekstu i grafiki. Na przykład możesz przygotować ekran z grubym tytułem w trybie BASIC 2, ze średniej wielkości podtytułem w trybie BASIC 1 i resztą tekstu w małym trybie BASIC 0. Następnie na środku możesz wrzucić obraz w trybie BASIC 8 z dodatkowym tekstem na spodzie. Dobrym przykładem tej techniki jest ekran w programie ATARI States and Capitals.

Wspomniane powyżej problemy zniechęcają do intensywnego używania takich technik w języku BASIC. W języku asemblera zmodyfikowanych list wyświetlania najlepiej używa się przez zorganizowanie ekranu w ciąg okien, w którym każde okno posiada swoją własną instrukcję LMS i własny niezależny obszar pamięci RAM.

 

Zastosowania dla list wyświetlania

Jednym z prostych zastosowań modyfikacji listy wyświetlania jest pionowe rozmieszczenie linii na ekranie przez wstawienie bajtów pustych linii. Dodaje to odstępu pionowego, który wyróżni ważne wiadomości i zwiększy czytelność niektórych obrazów.

Innym ważnym zastosowaniem modyfikacji listy wyświetlania jest uzyskanie dostępu do własności niedostępnych z poziomu języka BASIC. Istnieje trzy tryby tekstowe obsługiwane przez ANTIC, których BASIC nie wspiera. Tylko manipulacje na liście wyświetlania dają użytkownikowi dostęp do tych trybów. Istnieją również przerwania z listy wyświetlania oraz możliwości płynnego przewijania, które stają się dostępne dopiero po modyfikacji listy. Opisujemy to w rozdziałach 5 i 6.

Manipulowanie instrukcją LMS i jej argumentem oferuje wiele możliwości kreatywnemu programiście. Na przykład, zmieniając LMS podczas wygaszania pionowego, programista może przełączać obrazy na ekranie. Można to wykonywać z wolną prędkością, aby zmieniać narysowane wcześniej obrazy bez konieczności ich przerysowywania. Każdy z obrazów ciągle przebywałby (i zajmowałby miejsce) w pamięci RAM, nawet jeśli nie jest używany, lecz byłby dostępny prawie natychmiast. Tę technikę można również wykorzystywać do animacji. Przez przełączanie kolejnych obrazów w ciągu można otrzymać cykliczną animację. Program wykonujący to zadanie manipulowałby jedynie dwoma bajtami adresu w celu wyświetlenia wielu tysięcy bajtów z RAM.

Możliwe jest również nakładanie na siebie obrazów przez przełączanie ekranów z dużą prędkością. Oko ludzkie posiada rozdzielczość czasową około 1/16 sekundy, zatem program może cyklicznie przełączać pomiędzy czterema obrazami, z których każdy wyświetlany byłby przez 1/60 sekundy (amerykański PAL, w Europie byłoby to 1/50 sekundy), zatem każdy z nich powtarzałby się co 1/15 sekundy. W ten sposób można jednocześnie pokazać na ekranie do 4 obrazków.  Oczywiście są pewne wady tej metody. Po pierwsze cztery oddzielne obrazy mogą kosztować dużo pamięci RAM. Po drugie każdy obraz będzie wyblakły, ponieważ pokazuje się tylko przez ćwierć czasu. Oznacza to, iż tło wszystkich obrazów musi być czarne, a każdy obraz musi być jasny. Co więcej, pojawią się pewne nieprzyjemne efekty migotania ekranu, gdy ta technika zostanie użyta. Konserwatywny programista może rozważyć przełączanie pomiędzy jedynie trzema obrazami, a nawet pomiędzy dwoma. Technika ta może również zostać zastosowana do zwiększenia rozdzielczości koloru i jasności. Przez cykliczne przełączanie pomiędzy czterema wersjami tego samego obrazu, w których każda wersja podkreśla jeden z kolorów lub jasność możliwy jest szerszy zakres kolorów i jasności pikseli. Na przykład, załóżmy, że chcesz wyświetlić pasek o wielu różnych jasnościach. Najpierw ustaw cztery rejestry koloru na wartości:

Background:  00
Playfield 1: 02
Playfield 2: 0A
Playfield 3: 0C

Następnie umieść następujące obrazki w każdym z obszarów pamięci RAM ekranu:

  Zawartości pikseli (wg numerów rejestrów koloru)
Pierwsza ramka   1   1   1   1   2   3   2   3   2   3   2   3
Druga ramka   0   1   1   1   0   0   2   3   2   3   2   3
Trzecia ramka   0   0   1   1   0   0   0   0   2   3   2   3
Czwarta ramka   0   0   0   1   0   0   0   0   0   0   2   3
Wynikowa jasność x 4   2   4   6   8 10 12 20 24 30 36 40 48
Odbierana jasność                        

W ten sposób możliwa jest do uzyskania dużo płynniejsza rozdzielczość jasności.

Ostatnia sugestia dotyczy tematu, który daje mnóstwo możliwości, lecz jest jak dotąd mało rozumiany: dynamiczna lista wyświetlania. Jest to lista wyświetlania, którą zmienia mikroprocesor 6502 podczas okresów wygaszania pionowego. Za pomocą takich list powinno być możliwe utworzenie interesujących efektów. Na przykład, program edycji tekstów dynamicznie wstawia puste linie powyżej i poniżej wiersza ekranu, który jest edytowany, co oddzieli go od pozostałych wierszy tekstu. Gdy kursor porusza się pionowo, lista wyświetlania jest zmieniana. Ta technika jest dziwna, lecz bardzo efektywna.

 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2019 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.