W poszukiwaniu 256 kolorów czyli gąszcz przerwań, duszków i Action!

Pamiętam moje jedno z większych rozczarowań – chyba wynikające z marketingowego bełkotu producenta, ale i pewnie też z niedomówień pokutujących wśród użytkowników 8bitowego Atari.

Ile kolorów można używać na Atari jednocześnie? Używać czy wyświetlić? Używać w sprzętowych duszkach czyli sprite’ach czy na ekranie? Na ekranie, ale w jakiej rozdzielczości? Na całym ekranie czy w jednej linii?

Po serii reklam z 1979 roku reszta, promująca serię XL wydaje się bardziej enigmatyczna, chociaż to właśnie układ GTIA zastępujący CTIA ma większe możliwości palety “o jeden bit” i pozwala używać kolorów z palety nie 128 kolorów a 256.

Po latach wszystko jest jakby prostsze. W latach 80tych szczytem takiej zabawy z kolorem było wyświetlenie tęczowego cyklu kolorów.

Dzisiaj – ot, w godzinę przećwiczylem konwersję programu z Atari BASIC – takie elementy jak pętle, odwołania do rejestrów, odpalenie przerwań, modyfikację displaylisty, podkolorowanie ekranu duszkami i “pociskami” (missile) i jeszcze paroma rzeczami.

Ale po kolei. Zaczęło się od banalnej rzeczy – uporządkowania pościąganych przykładów w Action! – bo nie ma nic lepszego niż analizowanie działającego kodu.

Altirrę większość zna – ja coraz bardziej zagłębiam się w Atari800MacX. Wybieramy z górnego menu – Media -> New Image i tworzymy pustą dyskietkę. Ja nazwałem ją Action i zapisałem w folderze Disks – otwiera się on automatycznie, gdy mamy wskazać lokalizację dyskietki (ale oczywiście można to zmienić).

używam zestawu dwóch stacji i dwóch dyskietek – ta pierwsza stacja i obraz Action03.atr to dyskietka startowa, wersja 3. MyDOS, obsługa dyskietek DD, autostart do Action 3.7 czyli najnowszej wersji z poprawkami. Jakieś pliki runtime i biblioteki – ot, cała jej zawartość.

Stacja druga to projekty albo dema. Tutaj zapisuję to, nad czym pracuję, albo to, co mnie interesuje do obejrzenia/uruchomienia. Atari800MacX pozwala na transfer plików (z menu Media wybieramy Edit an .atr Disk image) na obraz dyskietki jak i na zgrywanie plików z obrazu, kasowanie ich etc. – jest to bardzo intuicyjne i wygodne.

Jedna rzecz wymaga tylko uwagi – przegrywanie plików tekstowych. Pliki źródłowe Action! do takich należą i jeżeli ściągniemy pliki źródłowe zapisane z Action! to będą one miały kodowanie jak to w Atari czyli ATASCII. Istotne jest zaznaczenie opcji zmiany końca linii (linefeed). Inaczej z całej misterii pisania kodu na współczesnym kompie i wgrywania tego na 8bitowym zabytku nici – chyba, że będziemy wszystko wklejać (Copy Paste) do emulatora bezpośrednio do edytora Action! i tam, w emulatorze zapisywać na wirtualną dyskietkę (obraz .atr). Pliki w wersji źródłowej jakie znajdziemy w internecie zwykle mają już tą konwersję końca linii zrobioną, więc pozostaje nam tylko przegranie ich do obrazu dyskietki.

W dużym uproszczeniu jak działa kombo CTIA/GTIA + ANTIC:

  • ANTIC generuje obraz – czyli tekst plus grafikę bitmapową
  • CTIA/GTIA odpowiada za wygenerowanie koloru oraz sprzętowe duszki/pociski (sprites/missiles)

Realia obrazu na Atari sprowadziłbym do tego co potrafi Antic rozdzielczościowo + z czym się wyrobi GTIA kolorystycznie. Mamy tzw. tryby Antic’a, do których przypisano określone rozdzielczości ekranu i ilości możliwych kolorów. Oczywiście – trochę trickowo, a trochę na poziomie “poza Atari BASIC” można sobie zrobić własny tryb ekranu składający się z tzw. DisplayList’y czyli listy rozkazów do wykonania przez procesor ANTIC. Nota bene każdy tryb ekranu – nawet – a zwłaszcza te w BASICu mają takie predefiniowane Displaylisty. Co to oznacza – możemy zrobić sobie własną definicję zawartości ekranu – np. z linią w trybie tekstowym na start na samej górze (by wyświetlać w niej np. ilość punktów zdobytych w grze), potem wyświetlając ileś linii graficznych by znowu na samym dole wyświetlić linię tekstową na np. status. Nie będę w tym temacie mędrkował ponad zwoją nikłą na ten moment wiedzę – zainteresowanych odeślę do jednej z lepszych pozycji na ten (i parę innych jeszcze) temat czyli De Re Atari (posiadam w oryginalne, ale na szczęście ktoś to wklepał i jest dostępne online – ja zrobiłem sobie z tego plik pod Kindle zanim zauważyłem, że ktoś na archive.org już to zrobił).

Kod wyświetlający powyższe kolorki w Atari BASIC znalazłem w necie, dla mnie była to też przymiarka do znalezienia różnic składni etc. pomiędzy BASIC’iem i Action!

O ile pętle FOR … TO … NEXT … są po prostu zamieniane na FOR … TO … DO… OD to typowo BASICowa składnia czytania danych READ … DATA … wymaga już przestawienia się na inny kod, ale po paru grzebaniach w C nie jest to odkrywanie ameryki siadając do ActioN!. Brakuje jakiejś dobrej książki do Action! Dobrego omówienia – dobrego, z przykładami, nie na szybko czyli takiego podręcznika od A do Z, mam wrażenie, że manual powstał z notatek na serwetkach – niewiele się zmieściło. To też powoduje, że nie jest to wszystko tak na tacy jak w przypadkach innych języków i daje – nie ukrywam – większą satysfakcję jak się to samemu “rozkmini”.

Odnośnie szybkości kodu Action! naczytałem się peanów i zachwytów – tutaj niestety użycie Plot Drawto z biblioteki Action! powoduje… prawie równie wolny kod jak w BASICu:

Action! 7.5 sek.

Atari BASIC 9.3 sek.

Turbo BASIC XL (skompilowany kod z Atari BASIC) prawie 7,8 sek.

Biorąc pod uwagę, że Action! skompilowany to… słabo to wypadło. (GIFa wrzuciłem jako podgląd jak to rysuje Action! @15fps – ostatnie klatki są z ditheringiem, bo inaczej nie wyświetli się 256 kolorów palety).

Sam program nie robi nic skomplikowanego – rysuje 16 pionowych gradacji o grubości 5 pikseli każda czyli seria w pętli Plot/Drawto w trybie 9 (wg nomenklatury BASICa) czyli 80×192 z 16 odcieniami koloru, na koniec na ustawiane są duszki i pociski kadrujące (maskujące brzegi ekranu). W przerwaniu co 12 linii jest generowana zmiana koloru tła (stąd widzimy na ekranie 16 kolorów i 16 odcieni).

Piętą achillesową są tutaj oczywiście biblioteki procedur graficznych, z tego co zauważyłem – większość osob korzystała z procedur własnych i odradza korzystania z tych wbudowanych. Czyli krok następny – własne szybkie Plot/Dratwo czyli de facto i własny zestaw procedur pod kompilację (kolejne limbo Action! – na tym etapie nie jestem w stanie skompilować sobie bez dyskietki Runtime – Action! tworzy mi bez niej z customowym plikiem runtime 500 bajtowe pliki).

W temacie kolorów – więcej kolorów na raz… chyba się nie da, chyba, że do “wyświetlenia na raz na ekranie” wrzucimy flickerscreen czy inne tricki z przeplotem i nakładanie kolorów. Ciekawy jestem efektu 1920 kolorów (czyli zmieszania trybów CTIA i GTIA czyli teoretycznie dwóch palet – aczkolwiek jak porównywałem to nie są to kolory na tyle odstające, żeby doliczyć się tylu odcieni czegokolwiek) o którym wspomniał TDC, ale nie doczekałem się na ten moment jakiegoś przykładu, który to wyświetla (najchętniej nie w teorii i nie w emulatorze tylko na realnym sprzęcie).

EDIT: prędkość mnie tak zirygowała, że przepisałem kod generujący pasek z gradacją luminancji na szybszy kod odwołujący się bezpośrednio do pamięci ekranu i – jest szybciej.

Program generuje teraz obraz w 3 sekundy. Zmieniłem kierunek zapisu danych i kod przyścieszył znacznie, bo z 7,5 sekundy (czyli 2,5 raza).