Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

ROZDZIAŁ 3

Pośredniość grafiki

Podrozdziały

Pośredniość (ang. indirection) jest potężną koncepcją w programowaniu. W języku asemblera mikroprocesora 6502 istnieją trzy poziomy pośredniości w odwoływaniu się do liczb. Pierwszym i najbardziej bezpośrednim poziomem jest tryb adresowania natychmiastowego (ang. immediate addressing mode), w którym liczba we własnej osobie podana jest bezpośrednio:

LDA #$F4

Drugi poziom pośredniości osiąga się wtedy, gdy program odwołuje sie do komórki pamięci, która zawiera liczbę:

LDA $0602

Trzeci i najwyższy poziom pośredniości osiąga się w 6502 wtedy, gdy program odwołuje się do pary komórek w pamięci, które razem zawierają adres komórki pamięci przechowującej liczbę. W mikroprocesorze 6502 ta pośredniość jest dodatkowo skomplikowana przez dodanie indeksu:

LDA ($D0),Y

Pośredniość udostępnia programiście wyższy stopień swobody (a stąd i elastyczności). Zamiast dostarczać ciągle tych samych liczb za każdym razem, gdy chcesz coś wykonać, możesz po prostu je wskazać. Zmieniając ten wskaźnik, możesz zmienić zachowanie programu. Pośredniość jest w oczywisty sposób ważną możliwością w programowaniu.

Na początek:  podrozdziału   strony 

Rejestry koloru

Pośredniość grafiki jest wbudowana w komputer ATARI na dwa sposoby: za pomocą rejestrów koloru oraz za pomocą zestawów znaków. Programiści rozpoczynający pracę z tym komputerem po programowaniu innych systemów często myślą w kategoriach kolorów bezpośrednich. Rejestr koloru jest bardziej skomplikowaną bestią od pojedynczego koloru. Kolor określa stałą wartość. Rejestr koloru jest pośredni, zawiera dowolną wartość koloru. Różnica pomiędzy tymi dwoma jest podobna do różnicy pomiędzy kluczem o określonym rozmiarze a kluczem nasadkowym:

obrazek
obrazek

Zwykły klucz posiada ustalony rozmiar, lecz klucz nasadkowy można dopasować do dowolnego rozmiaru przez zmianę nasadki. Klucz nasadkowy jest bardziej uniwersalny, lecz prawidłowe posługiwanie się nim wymaga nieco więcej wprawy. Podobnie rejestr koloru jest bardziej elastyczny od pojedynczego koloru, lecz jego efektywne użycie wymaga więcej umiejętności.

W komputerze ATARI 400/800 jest dziewięć rejestrów kolorów; cztery są przeznaczone dla grafiki player-missile (gracz-pocisk) i zostaną omówione w rozdziale 4. Pozostałe pięć nie zawsze jest używane; zależnie od wybranego trybu graficznego na ekranie pojawi się od dwóch do pięciu kolorów. W trybie graficznym 0 BASIC'a używane jest tylko dwa i pół rejestru, ponieważ kolor znaków jest ignorowany; znaki przyjmują taki sam kolor jak rejestr koloru 2, lecz ich jasność jest pobierana z rejestru 1. Rejestry kolorów znajdują się w CTIA pod adresami od $D016 do $D01A. Podczas wygaszania pionowego system operacyjny kopiuje ich wartości do CTIA z kopii w pamięci RAM. Tabelka 3-1 podaje adresy sprzętowych rejestrów kolorów oraz adresy ich kopii w RAM.

Kontrola
obrazu
Rejestr sprzętowy Kopia w RAM
Etykieta Adres Etykieta Adres
Gracz 0 COLPM0 D012 PCOLR0 2C0
Gracz 1 COLPM1 D013 PCOLR1 2C1
Gracz 2 COLPM2 D014 PCOLR2 2C2
Gracz 3 COLPM3 D015 PCOLR3 2C3
Pole gry 0 COLPF0 D016 COLOR0 2C4
Pole gry 1 COLPF1 D017 COLOR1 2C5
Pole gry 2 COLPF2 D018 COLOR2 2C6
Pole gry 3 COLPF3 D019 COLOR3 2C7
Tło COLBK D01A COLOR4 2C8

Tabela 3-1: Etykiety i adresy rejestrów kolorów

W większości zastosowań użytkownik kontroluje rejestry kolorów przez zapisywanie do ich kopii w RAM. Istnieją tylko dwa przypadki, w których programista może potrzebować zapisywać bezpośrednio do adresów CTIA. Pierwszy i najbardziej powszechny dotyczy przerwania z listy wyświetlania, które omówimy w rozdziale 5. Drugi występuje, gdy użytkownik zablokuje procedury systemowego przerwania przy wygaszaniu pionowym, które przenoszą dane z kopii w RAM do CTIA. Przerwania od wygaszania pionowego są omawiane w rozdziale 8.

Kolory są zakodowane w rejestrze koloru  za pomocą prostej formuły. Cztery górne bity dają wartość barwy, która jest identyczna z drugim argumentem instrukcji SETCOLOR w języku BASIC. Wartości znajdziesz w tabeli 9-3 instrukcji języka BASIC.

Dolne cztery bity w rejestrze koloru dają jasność koloru. Jest ona taka sama jak trzeci argument w instrukcji BASIC'a SETCOLOR. Najniższy bit tej czwórki jest ignorowany. Dlatego istnieje osiem jasności dla każdej barwy. Dostajemy do wyboru 128 kolorów (8 jasności razy 16 barw). W tej książce pojęcie "kolor" oznacza parę barwa-jasność.

Gdy kolor zostanie zakodowany w rejestrze koloru, jest odwzorowywany na ekranie przez odwołanie do zawierającego go rejestru koloru. W trybach mapowania, które wspierają cztery rejestry kolorów, dane ekranowe określają rejestr koloru, który zostanie odwzorowany na ekranie. Ponieważ jest cztery rejestry koloru, to zakodowanie pojedynczego piksela wymaga dwóch bitów. W ten sposób każdy bajt danych ekranowych zawiera informację o czterech pikselach. Wartość bitów w każdej parze określa, który z rejestrów koloru dostarczy koloru dla danego piksela.

W trybach tekstowych (tryby graficzne 1 i 2 języka BASIC) wybór rejestru koloru dokonywany jest przez dwa górne bity kodu znaku. To pozostawia tylko sześć bitów na zdefiniowanie znaku, co wyjaśnia, dlaczego w tych trybach dostępne jest jedynie 64 znaki.

Pośredniość rejestru koloru daje ci cztery specjalne możliwości. Po pierwsze możesz wybrać ze 128 różnych kolorów do wyświetlenia na ekranie. Pozwala to na dobranie koloru, który najlepiej odpowiada twoim potrzebom.

Po drugie możesz manipulować rejestrami koloru w czasie rzeczywistym, aby wytworzyć ładne efekty. Najprostszą demonstracją tej możliwości jest następujący wiersz języka BASIC, który po prostu przebiega przez wszystkie możliwe kolory brzegu ekranu.

FOR I=0 TO 254 STEP 2:POKE 712,I:NEXT I

Efekt jest całkiem przyjemny i z pewnością przyciąga uwagę. Ta podstawowa technika może zostać rozszerzona w celu utworzenia prostej animacji cyklicznej przez narysowanie figury w czterech kolorach, a następnie cyklicznego zmieniania rejestrów koloru zamiast przerysowywania figury. Pomysł ten ilustruje poniższy program:

10 GRAPHICS 23
20 FOR X=0 TO 39
30 FOR I=0 TO 3
40 COLOR I
50 PLOT 4*X+I,0
60 DRAWTO 4*X+I,95
70 NEXT I
80 NEXT X
90 A=PEEK(712)
100 POKE 712,PEEK(710)
110 POKE 710,PEEK(709)
120 POKE 709,PEEK(708)
130 POKE 708,A
140 GOTO 90

Trzecim zastosowaniem rejestrów koloru jest logiczne przypisanie kolorów do sytuacji. Na przykład, stronicowane menu może być uczynione bardziej zrozumiałym poprzez zmianę koloru tła lub brzegu dla każdej strony w tym menu. Być może ekran mógłby mrugnąć na czerwono w przypadku naciśnięcia niedozwolonego klawisza. Użycie kolorowych znaków dostępnych w trybach 1 i 2 grafiki języka BASIC potrafi znacząco zwiększyć oddziaływanie materiału tekstowego. Suma konta może być pokazana na czerwono lub czarno w zależności od jego stanu. Ważne słowa lub frazy można pokazać w specjalnych kolorach, aby wyróżniały się w tekście. Używanie kolorów w trybach mapowania (bez tekstu) również może poprawić użyteczność takich grafik. Pojedynczy obraz graficzny (potwór, łódź lub cokolwiek) mógłby być prezentowany w kilku różnych kolorach przedstawiających kilka różnych wersji tej samej rzeczy. Przechowywanie obrazka wymaga dużo pamięci RAM, lecz zmiana jego koloru jest praktycznie darmowa. Na przykład, byłoby dużo łatwiejsze pokazanie trzech różnych łodzi przez zaprezentowanie jednego kształtu łodzi w trzech różnych kolorach niż trzech oddzielnych kształtów łodzi.

Czwartym i najważniejszym zastosowaniem rejestrów koloru jest użycie ich w przerwaniach od listy wyświetlania. Pojedynczy rejestr koloru może zostać wykorzystany do umieszczenia do 128 kolorów na pojedynczym ekranie. Tę bardzo ważną własność omawiamy w rozdziale 5.

Na początek:  podrozdziału   strony 

Zestawy znaków

Pośredniość grafiki jest również osiągana poprzez stosowanie redefiniowalnego zestawu znaków. Standardowy zestaw znaków jest umieszczony w ROM, lecz nie ma powodu, aby używać tylko tego szczególnego zestawu. Użytkownik może utworzyć i wyświetlić dowolny zestaw znaków. Potrzeba trzech kroków, aby użyć przedefiniowanego zestawu znaków. Po pierwsze, programista musi zdefiniować zestaw znaków. Ten krok zajmuje najwięcej czasu. Każdy znak jest wyświetlany na ekranie w matrycy 8x8, a w pamięci jest zakodowany jako 8-bajtowa tablica, co pokazuje rys.3-2.:

Obraz znaku dwójkowo szesnastkowo
                                       
               
               
               
               
               
               
               
00000000
00011000
00111100
01100110
01100110
01111110
01100110
00000000
00
18
3C
66
66
7E
66
00

Rys.3-2. Kodowanie znaku

Pełny zestaw znaków zawiera w sobie 128 znaków, każdy może być w pozytywie lub negatywie. Taki zestaw znaków wymaga 1024 bajty przestrzeni i musi rozpoczynać się w pamięci na granicy 1KB. Zestawy znaków dla trybów 1 i 2 BASIC'a posiadają tylko 64 różne znaki i dlatego wymagają jedynie 512 bajtów i muszą rozpoczynać się na granicy 1/2KB. Pierwsze 8 bajtów definiuje znak zerowy, następne 8 bajtów definiuje znak pierwszy itd. Bez wątpienia zdefiniowanie nowego zestawu znaków to dużo pracy. Na szczęście na rynku znajduje się wiele programów, które ułatwiają tę pracę.

obrazek  

Gdy zestaw znaków zostanie zdefiniowany i umieszczony w RAM, musisz poinformować ANTIC'a, gdzie może znaleźć ten zestaw znaków. Wykonuje się to umieszczając numer strony początku tablicy znaków w rejestrze pod adresem $D409 (dziesiętnie 54281). Kopia w RAM, którą będziesz zwykle używał, nazywa się CHBAS i znajduje się pod adresem $2F4 (dziesiętnie 756). W trzecim kroku używania zestawów znaków jest wyświetlenie pożądanego znaku na ekranie. Można to zrobić bezpośrednio w języku BASIC przy pomocy prostej instrukcji PRINT lub przez zapis kodu znaku bezpośrednio do pamięci ekranu.

Specjalną możliwością systemu nie wspieraną przez BASIC jest opcja czterokolorowego zestawu znaków. Tryby 1 i 2 BASIC'a obsługują pięć kolorów, lecz każdy znak w tych trybach jest w rzeczywistości znakiem dwukolorowym, każdy posiada kolor tuszu i kolor tła. Kolor tuszu może być dowolnym z czterech pojedynczych kolorów, lecz tylko jeden kolor naraz pojawia się z pojedynczym znakiem. Może to być poważnym utrudnieniem, gdy używa się grafiki znakowej.

Istnieją dwa inne tryby tekstowe zaprojektowane specjalnie dla grafiki znakowej. Są to tryby 4 i 5 ANTIC'a. Każdy znak w tych trybach ma szerokość tylko 4 piksele, lecz każdy piksel może być w jednym z 4 kolorów (wliczając w to tło). Znaki są definiowane podobnie jak znaki trybu graficznego 0 BASIC'a, z tym wyjątkiem, iż każdy piksel ma dwa razy większą szerokość i definiują go dwa bity w matrycy znaku, które określają używany rejestr koloru. W przeciwieństwie do trybów 6 i 7 ANTIC'a (tryby 1 i 2 BASIC'a) wybór rejestru koloru nie jest dokonywany przez bajt kodu znaku, lecz jest zdefiniowany w zestawie znaków. Każdy bajt w tablicy znaków jest rozbijany na cztery pary pikseli, z których każda wybiera kolor piksela. (Z tego powodu są tylko 4 piksele w poziomie na znak.) Najwyższy bit (D7) kodu znaku modyfikuje używany rejestr koloru. Wybór rejestrów kolorów dokonywany jest zgodnie z rys.3-3:

Para bitów
w definicji znaku
D7 = 0 D7 = 1
00
01
10
11
COLBAK
PF0
PF1
PF2
COLBAK
PF0
PF1
PF3

Rys.3-3. Wybór rejestrów koloru dla znaków

Przy użyciu tych trybów na ekranie może zostać umieszczona wielokolorowa grafika znakowa.

obrazek

Innym ciekawym trybem ANTIC'a jest tryb rozszerzający małe litery (tryb 3 ANTIC'a). Tryb ten wyświetla 10 linii skanowania na jedną linię trybu, lecz ponieważ znaki używają w pionie tylko osiem bajtów, dwie dolne linie są normalnie pozostawione puste. Jeśli zostanie wyświetlony znak w ostatniej ćwiartce zestawu znaków, to dwie górne linie znaku będą puste, a dane, które powinny być tam wyświetlone, zostaną wyświetlone w dwóch dolnych liniach. Pozwala to użytkownikowi stworzyć lepiej wyglądające małe znaki ze stopkami.

                                       
               
               
               
               
               
               
               
                                       
               
               
               
               
               
               
               
               
               
Na początek:  podrozdziału   strony 

Zastosowania zestawów znaków

Wiele interesujących i użytecznych możliwości zastosowań jest wynikiem pośredniości zestawu znaków. Oczywistym zastosowaniem jest zmodyfikowany krój znaków. Inny krój może nadać programowi unikalny wygląd. Można stworzyć zestaw znaków greckich, cyrylicę lub dowolny inny. Idąc o krok dalej, możesz stworzyć graficzne kroje znaków. Program komputerowy ENERGY CZAR™ wykorzystuje zmodyfikowany zestaw znaków do tworzenia wykresów słupkowych. Znak zajmuje 8 pikseli; oznacza to, iż wykresy słupkowe zaimplementowane za pomocą standardowych znaków posiadają rozdzielczość osiem pikseli, co jest raczej słabą rozdzielczością. ENERGY CZAR używa specjalnego zestawu znaków, w którym mniej popularne symbole tekstowe (etka, znak funta itp.) zostały zastąpione przez specjalne znaki dla wykresów słupkowych. Jeden znak jest słupkiem o rozmiarze 1 piksela, inny o rozmiarze 2 pikseli itd. aż do osiągnięcia wysokości 8 pikseli. Program wykorzystujący te znaki może następnie rysować szczegółowe wykresy słupkowe z rozdzielczością pojedynczego piksela. Rys.3-4 pokazuje typowy ekran w tym programie. Wymieszanie tekstu z grafiką jest tylko pozorne, cały obraz zbudowany jest ze znaków.

obrazek
Rys.3-4. Wykresy słupkowe w programie ENERGY CZAR.

W wielu aplikacjach zestawy znaków mogą być tworzone do pokazywania specjalnych obrazów. Na przykład, zdefiniowawszy zestaw znaków z grafiką terenu ze znakami rzek, lasów, gór, itd., możliwe jest utworzenie mapy terenowej dowolnego kraju. Dzięki wyobraźni można równie łatwo stworzyć mapę terenu innej planety. Robiąc to, najlepiej zdefiniować od pięciu do ośmiu znaków dla każdego rodzaju terenu. Każda odmiana pojedynczego typu powinna być inaczej umieszczona w obrębie pikseli znaku. Przez wymieszanie razem różnych znaków możliwe staje się uniknięcie monotonnego wyglądu, który jest tak charakterystyczny dla prymitywnych grafik znakowych. Większość ludzi nie zauważy, że wynikowa mapa używa grafiki znakowej, chyba że zaczną się dokładnie przyglądać tej mapie. Rys.3-5 pokazuje obraz mapy terenu utworzonej za pomocą grafiki znakowej.

 obrazek
Rys.3-5. Mapa terenu w grafice znakowej

Mógłbyś stworzyć elektroniczny zestaw znaków z symbolami tranzystorów, diod, przewodów, itd. w celu wyprodukowania programu do schematów elektronicznych. Albo mógłbyś stworzyć zestaw znaków budowlanych z symbolami bram, ścian, narożników itd. w celu zrobienia programu do rysunków budowlanych. Możliwości graficzne oferowane przez grafikę znakową na komputerach osobistych nie zostały jeszcze w pełni przebadane.

Znaki można wyświetlać do góry nogami przez wpisanie wartości 4 pod adres 744. Jednym z możliwych zastosowań tej właściwości może być wyświetlanie kart (jak w grze Blackjack).

obrazek

Górna połowa karty może zostać wyświetlona normalnie, natomiast dolna połowa może być odwrócona do góry nogami za pomocą przerwania z listy wyświetlania. Właściwość ta mogłaby znaleźć pewne zastosowanie przy wyświetlaniu obrazów z lustrzanymi odbiciami (kałuże, jeziora, itp.).

Jeszcze bardziej ekscytujące możliwości przychodzą na myśl, gdy zdasz sobie sprawę, iż można w całkiem praktyczny sposób zmieniać zestawy znaków podczas pracy programu. Zestaw znaków zajmuje w pamięci 512 lub 1024 bajty; w obu przypadkach nie jest to specjalnie wiele i można w pamięci przechowywać wiele takich zestawów, które mogą być przełączane podczas wykonywania programu. Istnieją trzy tryby takiego przełączania zestawów znaków: wolne dla człowieka (więcej niż 1 sekunda), szybkie dla człowieka (od 1/60 do 1 sekundy) i maszynowo szybkie (szybsze niż 1/60 sekundy).

Przełączanie znaków wolne dla człowieka jest użyteczne do zmiany scenerii pracy. Na przykład program podróży kosmicznych może używać jednego zestawu znaków dla jednej planety, innego dla scenerii w kosmosie, a trzeciego dla innej planety. Gdy podróżnik zmienia swoje położenia, program zmienia zestaw znaków, aby utworzyć nową, egzotyczną scenerię. Program przygodowy mógłby zmieniać zestawy znaków, gdy gracz zmienia miejsca akcji.

Przełączanie znaków szybkie dla człowieka jest wartościowe głównie w animacjach. Można tego dokonać na dwa sposoby: Zmieniając znaki w pojedynczym zestawie znaków lub zmieniając całe zestawy znaków. Program SPACE INVADERS (znak handlowy Taito America Corp.) na komputer domowy ATARI wykorzystuje tę technikę. Najeźdźcy są w rzeczywistości znakami. Przez szybką wymianę znaków program był w stanie animować ich. To było łatwe, ponieważ jest tylko sześć różnych potworów; każdy posiada cztery różne wcielenia.

obrazek

Szybka, cykliczna animacja całego ekranu jest możliwa przez ustawienie pewnej liczby zestawów znaków, narysowanie obrazu ekranowego, a następnie po prostu cykliczne przełączanie tych zestawów znaków. Jeśli każdy znak posiada nieco inne wcielenie w każdym z zestawów znaków, to znak ten będzie animowany, gdy zestawy znaków są zmieniane. W ten sposób ekranem pełnym obiektów można cyklicznie poruszać za pomocą bardzo prostej pętli. Gdy dane zestawów znaków zostaną ustawione we właściwym miejscu i ekran zostanie narysowany, kod do animacji tego ekranu mógłby być tak prosty, jak ten przykład:

1000 FOR I=1 TO 10
1010 POKE 756,CHARBASE(I)
1020 NEXT I
1030 GOTO 1000

Szybka, komputerowa animacja zestawu znaków jest stosowana, aby umieścić na jednym ekranie wiele zestawów znakowych. Wykorzystuje ona możliwości komputera w generacji przerwań od listy wyświetlania. Przerwania te są omawiane w rozdziale 5.

Używanie zestawów znaków do grafiki i animacji posiada wiele zalet i kilka ograniczeń. Największą ich zaletą jest niska zajętość pamięci przy tworzeniu szczegółowych ekranów. Ekran graficzny przy użyciu znaków z trybu 2 języka BASIC może dać dużo szczegółów i jeden kolor więcej niż w trybie 7 BASIC'a. Mimo to obraz znakowy zajmuje jedynie 200 bajtów, podczas gdy obraz bitmapowy zająłby 4000 bajtów. Zajętość pamięci RAM przy wielu zestawach znakowych wynosi tylko 512 bajtów na zestaw, więc niedrogo można mieć wiele zestawów znakowych. Operacje ekranowe na grafice znakowej są znacznie szybsze, ponieważ jest mniej danych do przetworzenia. Jednakże grafiki znakowe nie są tak elastyczne jak grafiki bitmapowe. Nie można umieścić dowolnej rzeczy w dowolnym miejscu ekranu. To ograniczenie uniemożliwia użycie grafiki znakowej w niektórych aplikacjach. Jednakże pozostaje mnóstwo aplikacji graficznych, w których program potrzebuje wyświetlać jedynie ograniczoną liczbę zdefiniowanych wcześniej kształtów w ustalonych miejscach ekranu. W takich przypadkach grafika znakowa jest wspaniałym rozwiązaniem.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2023 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.