Kolory Atari XL/XE i innych urządzeń

Tworząc Atari XL/XE w Turbo Pascal 5.5 w trybie graficznym VGA standard 320×200, 256 kolorów, trzeba jakoś przyporządkować odpowiednie kolory VGA dla obsługi kolorów Atari XL/XE.

Standardowa paleta VGA 256 color wygląda w rządkach po 16 kolorów mniej więcej tak:

VGA standard 256 color palette

Kolory Atari XL/XE są opisane w dokumentacji do układu CGIA Atari XL/XE:

Colors of Atari XL-XE - CGIA   Phase Angle Plot of Color Out Values

Teraz trzeba jakoś poukładać zależność numerów kolorów VGA i numerów kolorów Atari XL/XE, żeby łatwo można korzystać za pomocą instrukcji

SETCOLOR [what], [color], [luminance]

gdzie:

[what] – określa co kolorujemy (ramka, znaki, tło, inne jakieś)

[color] – jaki kolor z palety kolorów Atari XL/XE

[luminance] – jasność koloru

używając od razu prawidłowych numerów prawidłowych kolorów Atari XL/XE.

W efekcie pracy powinna wyjść prosta paleta barw gotowa dla Atari XL/XE podobna do poniższej, którą należy jeszcze sprawdzić dokładnie i poprawić, żeby uzyskać 100% oryginalną paletę kolorów Atari XL/XE:

Nearly Atari XL-XE VGA Palette

… no i teraz jak to zrobić? Jak uzyskać taką paletę kolorów własną, samodzielnie zdefiniowaną? Hmm… jak widać powyżej, jest to możliwe…

Zobaczymy…


Próbując zebrać kolory ze standardowej palety VGA, żeby uporządkować w paletę Atari XL/XE – praca zaczyna być ciężka, trzeba odszukiwać kolory właściwe lub przypominające właściwe (poszukiwane), potem znalezione kolory ustawiać w rządkach według jasności danego koloru. Okazuje się, że nie łatwo znaleźć wszystkie potrzebne kolory w standardowej palecie VGA, żeby uzyskać pełną paletę kolorów Atari XL/XE.

Potrzebny jest jakiś sposób, żeby uzyskać więcej odcieni różnych kolorów, niż jest ich w standardowej palecie VGA, inaczej prawdopodobnie zabraknie kolorów dostępnych w standardowej palecie VGA, żeby uzupełnić pełną paletę Atari XL/XE – takie wnioski można uzyskać, starając się szukać kolorów, które by były potrzebne i oczekiwane…

Potrzebny jest jakiś inny sposób, czyli więcej i innych kolorów, niż są dostępne w standardzie VGA… potem jakoś się zbierze te kolory i poustawia w ładne rządki jasnościami danych kolorów…

Jak zmienić standardową paletę VGA, żeby uzyskać inne kolory, niż są dostępne w standardzie?

Każdy kolor opisany jest trzema wartościami składowymi: Red (Czerwony), Green (Zielony), Blue (Niebieski) – znany, standardowy, jakiś naukowy sposób opisywania kolorów, wykorzystywany w komputerach…

Gdyby opisać sobie każdy z 256-ciu kolorów, jakie może wyświetlić karta graficzna VGA w trybie rozdzielczości 320×200, to można by mieć własny zestaw kolorów, czyli m.in. można sobie kolory samodzielnie opisane i stworzone w jakimś sensie – z tego, co dostępne do użytku, czyli składowe R, G, B każdego koloru – w wartościach od 0 do 255 każda składowa niezależnie… – na przykład ustawić samodzielnie w szereg kolorów, który odpowiadałby szeregowi kolorów Atari XL/XE i byłoby gotowe…

Teraz jak to zrobić?


Karta graficzna VGA jest programowana za pomocą rejestrów, adresów i przerwań, które trzeba znać, żeby wiedzieć których / jakich użyć w jakim celu. Potem trzeba wiedzieć jak to się robi konkretnie:

1. Jak korzystać z rejestrów, adresów, przerwań do programowania / obsługi grafiki VGA?

2. Jak konkretnie zmodyfikować paletę kolorów według swoich potrzeb?

W Turbo Pascal 5.5 uruchamianie przerwań systemowych jest proste i standardowe w pakiecie z modułem DOS – ci, co programują w Turbo Pascal 5.5 na pewno wiedzą jak się korzysta z przerwań i rejestrów asemblera, a co za tym idzie ze wszystkiego, co dostępne w systemie.

Teraz trzeba wiedzieć:

a) jak uruchomić grafikę VGA w trybie 320×200 256 color

b) jak rysować na ekranie w trybie 320×200 256 color dowolne punkty kolorowe w dowolnym miejscu ekranu

b) jak zmienić paletę na dowolną określoną samodzielnie


Po kolei…

Ci, co znają Turbo Pascal 5.5, wiedzą, jak zaprogramować asemblerowe kody, więc łatwiej w asemblerze wszystko pokazywać, zamiast od razu w TP5.5, oczywiste – przynajmniej każdy może skorzystać w dowolnym języku programowania, nie tylko w TP5.5.

Szukając sposobu na zmianę palety kolorów, można znaleźć taką stronę, z przykładem, który działa (przynajmniej fragment poszukiwany w kwestii zmiany palety RGB):

LISTING 33.1 L33-1.ASM

Fragment z powyższego przykładu istotny:

Włączenie trybu graficznego VGA 320×200, 256 color:

mov ax,0013h
int 10h

; AH=0 selects set mode function,
; AL=13h selects 320×200 256-color mode

Samodzielne ustawienie palety kolorów RGB:

; load the DAC registers with the color settings

mov ax,@data
mov es,ax ;point ES to the default data segment
mov dx,offset ColorTable

; point ES:DX to the start of the block of RGB three-byte values
; to load into the DAC registers

mov ax,1012h

; AH=10h selects set color function,
; AL=12h selects set block of DAC registers subfunction

sub bx,bx ; load the block of registers starting at DAC register #0
mov cx,100h ; set all 256 registers
int 10h ; load the DAC registers

Próbując, jak działa powyższy kod, oczekuje się uzyskać efekt dowolny, aby tylko spodziewany, czyli jakąkolwiek zmianę standardowej palety kolorów VGA.

Udało się, czyli sukces!

Działa…

VGA Palette - modif - works

Teraz można pracować dalej…


Teraz trzeba sprawdzić jak działają różne wartości podane dla ustawienia palety RGB za pomocą rejestrów, adresów i przerwań karty VGA.

Próbując wpisywać różne wartości inkrementowane i parametryzowane w pętlach i prostych funkcjach liniowych dowolnych, żeby widzieć różnicę sensowną w ‚działaniu’ wartości podawanych na rejestry… można już coś uzyskać w efekcie ciekawych kolorów uzyskiwanych…

VGA Palette - modif - gener

VGA palette - gen2 VGA palette - gen3

VGA Palette - gen4 VGA palette - gen5

VGA palette - gen6 VGA palette - gen7

… teraz jest się czym bawić w kwestii kolorów, oczywiste, jak widać…

Jednak celem jest znalezienie kolorów Atari XL/XE i ustawienie ich w szereg zgodny z kolorami Atari XL/XE, żeby łatwo móc używać instrukcji SETCOLOR w interpreterze ATARI BASIC w Turbo Pascal 5.5.

Czyli koniec zabaw, teraz konkretnie do celu…

Najpierw podstawowe kolory: Red, Green, Blue…

VGA palette - gen8

Trzy pierwsze rządki po 16 kolorów pięknie już wyglądają, jak widać: czerwony w 16-tu odcieniach, potem zielony tak samo i niebieski… reszta nieważna, sama się ustawiła jakoś, ale to nie praca własna, lub obojętne, liczą się te trzy pierwsze rządki ustawione świadomie samodzielnie, które były oczekiwane, modyfikując paletę RGB VGA…

Czyli sukces…

Teraz pozostałe kolory, inne jakieś, jakiekolwiek…

Kolory: czerwony, zielony i niebieski łatwo ustawić w takie trzy rządki w jasnościach po kolei rosnąco lub malejąco, bo składową każdego dowolnego koloru jest jakaś wartość czerwonego, zielonego i niebieskiego – które są parametrami wszystkich kolorów, jakie można uzyskać, więc najpierw wszystkie parametry wystarczy ustawić na zero (0):

Red= 0, Green=0, Blue=0

Potem w pętli zwiększać jedynie Blue, lub jedynie Green, lub jedynie Red – żeby zobaczyć, czy działa taka zabawa wartościami na tych parametrach i jak.

Jak widać działa ładnie… uzyskuje się jasności w kolejności rosnącej tych trzech kolorów w zakresie możliwych wartości R, G, B…

Czyli sukces, można próbować dalej…


… po znalezieniu kolorów poszukiwanych oraz ich gam jasności bawiąc się ‚suwakami’ trzech parametrów, tj.: (R)ed, (G)reen, (B)lue…

… można już ustawić sobie wszystkie znalezione kolory z ich jasnościami w rządkach, żeby chociaż trochę przypominały paletę kolorów Atari XL/XE…

VGA palette - nearly Atari XL-XE

… możliwe, że już prawie jest to paleta kolorów Atari XL/XE…

Trzeba sprawdzić jakoś i porównać, może z dokumentacji do układu CGIA, może sprawdzając wszystkie gamy kolorów instrukcją SETCOLOR korzystając z oryginalnego Atari XL/XE, może są inne sposoby…

To potem…

CDN.


Automatycznie wygenerowana paleta kolorów już gotowa, jak widać w przykładach – przypomina trochę paletę kolorów Atari XL/XE.

… pozostaje znalezienie jakichś ‚korekt automatycznych’ na tę paletę wygenerowaną automatycznie według prostych funkcji liniowych, które pozwoliłyby wygenerować automatycznie całą prawidłową paletę Atari XL/XE…

Trzeba to jakoś zrobić…

Hmm…

… na początek porządek z tym, co już się ma…

Procedura w Turbo Pascal 5.5 generująca prostą paletę kolorów z jasnościami kolorów, która przypomina paletę kolorów Atari XL/XE:

procedure graph_on; { włączenie trybu graficznego VGA standard 320×200, 256 kolorów i ustawienie palety kolorów RGB }
var regs: registers;
r,g,b,
i, k, l :byte;

begin
regs.ax:=$13; intr($10,regs);

k:=0;   l:=2;

  repeat

for i:=0 to 15 do
begin

case k of
0: begin r:=i*2*l;  g:=i*2*l;   b:=i*2*l    end; { gray }
16: begin r:=i*2*l;  g:=i*2*l;  b:=0;          end; { gold }
32: begin r:=i*2*l;  g:=i*l;       b:=0;          end; { orange }
48: begin r:=i*2*l;  g:=0;          b:=0;          end; { red }
64: begin r:=i*2*l;  g:=0;          b:=i*2*l;  end; { rose }
80: begin r:=i*2*l;  g:=0;          b:=i*l;       end; { purple }
96: begin r:=i*l;      g:=0;           b:=i*l;       end; { purple-blue }
112: begin r:=i*l;      g:=0;           b:=i*2*l; end; { blue }
128: begin r:=0;        g:=0;           b:=i*2*l; end; { blue }
144: begin r:=0;        g:=i*l;         b:=i*2*l; end; { light blue }
160: begin r:=0;        g:=i*2*l;    b:=i*2*l; end; { turquoise }
176: begin r:=0;        g:=i*2*l;    b:=i*l;      end; { green blue }
192: begin r:=0;        g:=i*2*l;    b:=0;        end; { green }
208: begin r:=i*l;      g:=i*2*l;    b:=0;        end; { yellow – blue }
224: begin r:=i*l;      g:=i*l;         b:=0;        end; { orange – green }
240: begin r:=i*l;      g:=0;           b:=0;        end; { light orange }
end;

{   r:=r+2; g:=g+2; b:=b+2; }

system.mem[$a000:k*3+i*3+0]:=r;
system.mem[$a000:k*3+i*3+1]:=g;
system.mem[$a000:k*3+i*3+2]:=b;
end;
k:=k+16;
until k=0;

regs.ax:=$a000;
regs.es:=regs.ax;
regs.dx:=0;
regs.ax:=$1012;
regs.bx:=0;
regs.cx:=$100;
intr($10,regs);
end;

procedure graph_off; { powrót do trybu tekstowego }
var regs :registers;
begin
regs.ax:=$3; intr($10,regs);
end;

… teraz trzeba jakoś zmodyfikować ten automat do palety kolorów, poustawiać parametry pętli generujących składowe R, G, B, żeby uzyskać paletę Atari XL/XE…

… potem skróci się kod generujący paletę kolorów do prostej jednej, lub dwóch pętli ostatecznie prostych i wyjdzie szybka krótka funkcja nieupraszczalna generująca paletę kolorów oczekiwaną w sposób najprostszy i najekonomiczniejszy i będzie można wykonać układ elektronicznie…

Zobaczymy… jakoś musi to działać automatycznie prosto, trzeba znaleźć zasadę i potem opisać ją funkcją prostą…

CDN.


… na początek jakiś mechanizm do ‚przesuwania’ wartości bazowych odcieni kolorów, żeby zmieniając wartości parametrów R, G, B dla danego szeregu 16-tu odcieni zawsze zachować proporcje wartości odcieni i prawidłową kolejność kolejnych odcieni w szeregach po 16…

Testując trzy ostatnie rządki kolorów…

Atari XL-XE nearly (1) palette  Atari XL-XE nearly(02) palette

… już coraz bliżej palety Atari XL/XE…

… nadal nie jest to paleta Atari XL/XE…

Gdzie znaleźć prawidłowe wartości składowych R, G, B dla każdego koloru palety Atari XL/XE? Z czego te wartości wynikają w sposób ‚automatyczny’ – żeby nie musieć wartości poszukiwanych pamiętać – wystarczyłoby te wartości wygenerować prawidłowo i zapomnieć, mając ustawione na karcie graficznej raz i gotowe:

- zużycie pamięci do przechowywania wartości kolorów: zero bajtów (0B)

- pozostaje jednorazowa inicjalizacja trybu graficznego VGA 320×200, 256 color zgodnie z krótkim kodem generującym paletę RGB Atari XL/XE i gotowe…

Ekonomia w informatyce to priorytet najwyższy i jedyny wymagany do spełnienia na wstępie, żeby móc pracować z czymkolwiek dalej, oczywiste…

Trzeba znaleźć zasadę generowania kolorów palety Atari XL/XE, wait…

Potem będzie można już raz ustawić paletę na wstępie, przy inicjalizacji trybu VGA 320×200, 256 i potem już zwyczajnie używać rejestrów kolorów Atari XL/XE w zwyczajnej pracy komputera.

SETCOLOR [what],[color],[luminance]

VGA_color_number:=color shl 4 + luminance;

Ustawienie koloru do rysowania na ekranie trwa:

1. shl (przesunięcie w lewo)

2. + (dodanie)

3. dwa czytania wartości 8-bitowych ze zmiennych 8-bitowych (color, luminance)

4. := (przypisanie wartości 8-bit do zmiennej 8-bit)

READY

[]

REM Powinny być maksymalnie szybkie kolory, oczywiste. Czyli super-standard max electronic version the fastest. Superb…

Teraz jak znaleźć przesunięcia wartości R, G, B dla tych bazowych 16-tu kolorów w 16-tu odcieniach z palety stworzonej automatycznie prosto na potrzeby stworzenia palety Atari XL/XE?

CDN.


… musi istnieć jakaś zależność symetryczna uporządkowana między wartościami składowych R, G, B, a kolorami uzyskiwanymi zgodnie z tym kołem w Figure II z dokumentacji do układu CGIA Atari ™.

… mając 16 kolorów, trzeba podzielić koło 360 stopni na 15 wartości, bo czarny kolor jest poza kołem, czyli nie jest wliczony w ilość 16-tu kolorów – chyba jakiegoś koloru brakuje w palecie Atari XL/XE, ze względu, że czarny zajął miejsce jako numer w liczbie 16-tu kolorów, więc jeden kolor musiał być pominięty, żeby dodać czarny, hmm… nie wiadomo na razie, trzeba sprawdzić potem, wait…

Dzieląc 360 stopni koła na 15 wychodzi 24 – czyli jakaś liczba do zrobienia proporcji wartości gotowa.

360 to dziwna liczba w architekturze 8-bit.

Dzieląc 256 na 16 kolorów (uwzględniając czarny, jako składowe R=0, G=0, B=0 wraz z odcieniami, czyli NIE poza zbiorem wartości, którymi się operuje, a jako pełnoprawnym kolorem ze swoimi numerami jak każdy inny) – wychodzi 16.

Dzieląc 256 na 15 wychodzi 17 – to dziwna liczba, nigdzie nie pasuje, ani do niczego, hmm…

Teraz każdy kolor bazowy z tych 16-tu musi mieć jakieś wartości początkowe najciemniejsze, lub najjaśniejsze R, G, B.

Potem doda się (do najciemniejszych bazowych), lub odejmie (od najjaśniejszych bazowych) wartości odpowiednie równo po wszystkich parametrach: R, G, B, żeby uzyskać jasności tego samego koloru bazowego.

Zadanie: znaleźć składowe R, G, B dla 15-tu bazowych kolorów poszukiwanych Atari XL/XE – z koła Figure II – dokumentacja CGIA Atari ™ i dodatkowo:

czarny (najciemniejszy) gotowy od razu: R=0, G=0, B=0,

lub czarny (najjaśniejszy, czyli biały): R=255, G=255, B=255,

odcienie czerwonego gotowe od razu: R=[0..255], G=0, B=0,

odcienie zielonego gotowe od razu: R=0, G=[0..255], B=0,

odcienie niebieskiego gotowe od razu: R=0, G=0, B=[0..255].

… czyli mamy gotowe trzy bazowe kolory: czerwony, zielony, niebieski, oraz dodatkowo czarny.

Teraz pozostałe kolory jakoś muszą wynikać z proporcjonalnych wartości dodawanych na składowe: R, G, B.

Trzeba to wymyślić, jak to działa, czyli znaleźć metodę naturalną, prawdziwą, naukową, która działa realnie tak, jak powinna, 100% prawidłowo zawsze i wiecznie. Wait…

CDN.


[..]

Teraz można testować generowanie palety kolorów w wartościach dostępnych dla użytkownika: od 0 do 2^32 dla kolorów bazowych o 0 do 2^32 odcieniach każdy kolor bazowy dla wartości składowych Red, Green, Blue każdego koloru z palety 2^64 kolorów z zakresu od 0 do 2^64 każda składowa niezależnie.


GTIA-64 standard 256-pin chipset.