Jak niektórzy może pamiętają, Robert "Synthpopalooza" Clarkzaprezentował
na forum swój edytor fontów o nazwie "ICE - Interlace Character
Editor". Edytor nietypowy, bo obsługujący programowe tryby znakowe
w stylu Super IRG czy DIN. Wątek ten przemienił się potem w
regularne informacje o kolejnych trybach znakowych, z którymi
Synthpopalooza eksperymentował. Potem Robert zebrał prezentowane u
nas informacje, zredagował je, uzupełnił o wiadomości dla
początkujących, rozbudował o dodatkowe tryby i... będzie publikował
cykl artykułów w "Atari User" (pisałem o tym piśmie
tutaj i
tutaj). Seria artków pojawi się w ciągu trzech miesięcy, w
trzech kolejnych numerach "AU". Pierwszy odcinek będzie o Super
IRG, Super IRG 2, Super 0 i DIN. Drugi o nowych trybach znakowych
GTIA - Super 9, Super 10, APAC 0, HIP 0, CHIP 0. Trzeci i ostatni o
trybach znakowych CIN: CIN 12/13, Super CIN, MIN 12/13, Super MIN,
PCIN 12/13, Super PCIN.
przykładowe ekrany programu "ICE", w tym
ekran z fontami z gry "Mario" oraz wygląd tych fontów w
grze
Miło mi poinformować, że i czytelników AtariOnline.pl nie omie
dawka wiedzy o nowych trybach znakowych. Synthpopalooza podesłał mi
swoje artykuły i będę je publikował po polsku! Jako, że nie jestem
zawodowym tłumaczem, a i niektóre terminy z zakresu informatyki są
mi obce - to zapewne nie ustrzegę się błędów w tłumaczeniu. Należy
mi to wybaczyć, a jak ktoś nie zechce wybaczyć - to niech podsyła
swoją wersję tłumaczenia :D. Poniżej pierwsza część, traktująca o
trybie Super IRG.
Robert "Synthpopalooza" Clark napisał:
W okresie swojego powstania, w 1979 roku, 8-bitowe komputery Atari
wyprzedzały swoje czasy pod względem możliwości graficznych. Oprócz
256-kolorowej palety i 16-odcieniowych trybów graficznych Atari
udostępniało inne techniczne możliwości, które sprytni programiści
mogli wykorzystać do stworzenia rzeczy, których projektanci sprzętu
nie przewidzieli... Przez lata programiści ze sceny Atari tworzyli
coś, co dzisiaj nazywamy programowymi trybami graficznymi. Są to
tryby, które nie są przewidziane w systemie operacyjnym Atari, ale
przez wykorzystanie procedur systemowych komputera powstają na
drodze programowej.
Jak wiadomo, Atari wyświetla grafikę na dwa podstawowe sposoby –
bitmapowo (najmniejszym elementem w tym trybie jest piksel) i
znakowo (najmniejszy element - znak). O ile programiści stworzyli
sporo programowych trybów bitmapowych, jak choćby APAC 256, HIP czy
TIP, mało kto był zainteresowany tworzeniem programowych trybów
znakowych. Jedynym zauważalnym wyjątkiem był programista Bill
Kendrick. W 1998 roku napisał w języku "Action!" grę
logiczno-zręcznościową „Gem Drop”. Jednym z najciekawszych
elementów gry był specjalny tryb znakowy nazwany Super IRG. W tym
trybie mamy znaki normalnego trybu Antic 4 (Graphics 12), ale
zwiększoną liczbę kolorów do 14-stu (10-ciu w obrębie jednego
znaku). Dodatkowo Bill stworzył edytor znaków „SIFE”, który
umożliwiał edycję fontów trybu Super IRG.
Gem Drop - 14 kolorów (10 w obrębie
znaku)
Uwaga! Filmik zgrany z emulatora Atari800Win
tylko w przybliżeniu pokazuje efekt, ponieważ odświeżanie ekranu na
pececie nie jest takie jak na Atari i w efekcie kolory nie miksują
się całkowicie poprawnie. Najbliższy prawdziwemu Atari jest w tym
względzie emulator Altirra. Ponadto filmik powyżej to PAL, podczas
gdy NTSC wygląda nieco lepiej.
Kiedy oglądałem efekty użycia tego trybu Billa, naszła mnie chęć na
próby i testy, żeby się dowiedzieć jak to działa, jakie tricki są
używane. Po kilku latach eksperymentów mogę zaprezentować
przynajmniej 18 nowych trybów znakowych, a także kod, który
umożliwia ich użycie w Basicu. Jestem także w trakcie pisania
edytora pod nazwą „ICE – Interlace Character Editor”, który będzie
potrafił edytować fonty dla tych trybów. W niniejszej serii
artykułów wyjaśnię jak działa tryb Super IRG oraz opiszę inne,
podobne tryby, które stworzyłem eksperymentując z techniką
wymyśloną przez Billa Kendricka.
SUPER IRG – JAK TO DZIAŁA?
Kluczem do wyświetlenia trybu Super IRG i podobnych jest użycie
procedury systemowej VBI (Vertical Blank Interrupt). Ta procedura
to kawałek kodu w systemie operacyjnym Atari, który jest wykonywany
za każdym razem, gdy Atari kończy wyświetlanie obrazu na ekranie
telewizora czy monitora. To rysowanie (odświeżanie) ekranu odbywa
się oczywiście bardzo szybko, w systemie NTSC 60 razy na sekundę (w
PAL 50 razy na sekundę - Kaz). Na końcu każdego cyklu odświeżania
ekran zostaje wyłączony i podczas tego czasu Atari może wykonać
specjalny kod – zmieniający sposób wyświetlania, zmieniający
rejestry pamięci, a nawet mogący uruchomić w tle program, który
będzie działał podczas kolejnego odświeżania obrazu.
Drugim kluczem do uzyskania trybu Super IRG jest wskaźnik znaków
CHBAS (znajduje się w komórce pamięci 756). Wstawienie tam wartości
(na przykład komendą POKE w Basicu) powoduje wskazanie miejsca, z
którego Atari będzie czerpać dane fontów do wyświetlenia na
ekranie. Jak wielu doświadczonych programistów wie, można
modyfikować swój zestaw znaków, przechowywać go w dowolnym miejscu
RAM (zazwyczaj rezerwuje się miejsce na końcu RAM) i ustawiać
CHBAS, aby wskazywał pożądane przez nas miejsce.
ANTIC 4/5 (GRAPHICS 12/13)
Super IRG bazuje na standardowych trybach Antic 4/5 (Graphics
12/13), w których mamy 40 znaków w poziomie i 12 lub 24 wiersze w
pionie (zależnie od tego czy to Graphics 12 czy 13). Każdy znak
składa się z siatki 4 na 8 pikseli, a każdy piksel może mieć jeden
z czterech kolorów. W ten sposób możemy wyświetlać wielokolorowe
znaki.
Każda linia w znaku jest przechowywana w pamięci komputera jako
bajt (wartości od 0 do 255). W ramach tego bajtu po dwa bity są
przyporządkowane każdemu z czterech pikseli w linii. Taka dwubitowa
kombinacja określa kolor piksela w następujący sposób:
00 – kolor tła (rejestr 712, defaultowo jest tam kolor
czarny) 01 – kolor PF0 (rejestr 708, defaultowo jest to
pomarańczowy) 10 – kolor PF1 (rejestr 709, defaultowo zielony) 11 – kolor PF2 (rejestr 710, defaultowo niebieski) lub PF3
(rejestr 711 – defaultowo czerwony)
W każdym z tych rejestrów (712, 708, 709, 710, 711) można ustawić
własny kolor - jedną z 16 barw w jednym z 8 poziomów jasności.
Można to także zrobić w Basicu komendą SETCOLOR.
Użyty przez nas znak może być w czterech kolorach jednocześnie
(712, 708, 709, 710). Dodatkowo, jeżeli użyjemy znaku ATASCII o
kodzie większym niż 127 (takie znaki są powszechnie znane jako
znaki w inwersji) to będzie on wyglądał jak ten z przedziału 0-127,
ale para bitów 11 będzie wskazywać już PF3 (rejestr 711), dzięki
czemu mamy dostęp do piątego koloru (zamiast czwartego).
PRZEŁĄCZANIE ZESTAWU ZNAKÓW
Kiedy już wiemy, jak działają tryby Graphics 12/13 możemy zacząć
zabawę z magicznym Super IRG. Ten ostatni tryb pozwala wyświetlać
10 kolorów w siatce 4 na 8 pikseli, z 4-ma dodatkowymi kolorami
dostępnymi, gdy używamy znaków w inwersji. Dzieje się tak, ponieważ
przechowujemy w pamięci dwa zestawy fontów, a podczas przerwania
VBI korzystamy z procedury, która poprzez CHBAS (756) wskazuje raz
jeden, raz drugi zestaw. W efekcie kolory i kształt znaków
zmieniają się 60 razy na sekundę. Bezwładność ludzkiego oka
powoduje zlanie się tych zmian i wydaje się nam, że na ekranie jest
więcej kolorów. Tabelka poniżej pokazuje rozszerzoną w ten sposób
paletę kolorów (przykład na bazie defaultowych kolorów z rejestrów
708-712):
Oczywiście zmiana jakiegokolwiek koloru w rejestrze PF spowoduje
zmianę powiązanych kolorów. Tak więc, mamy dostępne 10 kolorów na
znak, są też dostępne przez inwersję 4 alternatywne kolory – z
powodu interakcji pary bitów 11 (PF3) z trzema innymi kolorami.
Następujący przykład pokazuje wielokolorowy znak w trybie Super
IRG:
Aby zredukować efekt mrugania znaki można poddać ditheringowi
(mieszaniu kolorów). Robimy to w ten sposób, że przeplatamy kolory
pomiędzy sąsiadujący pikselami w każdym znaku, tworząc wzór w stylu
szachownicy, na przykład tak:
To zmniejsza efekt mrugania, charakterystyczny dla takich trybów, a
więc mniej męczy oczy. W tym pliku
znajdziecie przykład w Atari Basicu, jak wyświetlać ekran w trybie
Super IRG. Najpierw należy uruchomić pierwszy program
(PROGRAM1.BAS), aby utworzyć plik fontów na dyskietce
(SUPERIRG.FNT), a potem uruchomić drugi program (SUPERIRG.BAS). Dla
wygody czytelników AtariOnline.pl została tam też umieszczona
gotowa dyskietka z wszystkimi wymienionymi plikami.
demonstracja trybu Super IRG
powiększony fragment ekranu
powyżej
OPIS POWYŻSZEGO PROGRAMU
Wiersze programu od 2030 do 2250 zawierają kody znaków uzyskiwanych
na klawiaturze klawiszem Control. Zobacz ostatni rozdział
niniejszego artka jak uzyskać te znaki. Linia 1010 rezerwuje pamięć
na szczycie pamięci RAM ekranu. Trzeba zarezerwować tam tyle
miejsca, aby zmieściły się dwa zestawy znaków. Oba zestawy fontów
zajmują 1024 bajty i przełączane są potem przez CHBAS (756) co
każde przerwanie VBI.
Po ustawieniu trybu ANTIC 4 mamy procedurę VBI w wierszu 1090.
Mimo, że w przykładzie przechowywana jest na szóstej stronie
pamięci (1536) można ją ustawić w dowolnym miejscu pamięci, a nawet
wewnątrz zmiennej tekstowej. SETVBV$ jest procedurą języka
maszynowego użytą do uruchomienia VBI. To musi być zrobione z
poziomu języka maszynowego, ponieważ wektor VBI (komórka 546 lub
547) przełączony z poziomu Basica powoduje wysypanie się systemu
operacyjnego.
Procedura VBI zagląda na stronę czwartą pamięci (1024), która
normalnie służy jako bufor magnetofonu, a gdzie znajduje się
tablica rejestrów, które mają być przełączone oraz wartości, które
mają być zmienione. Komórki od 1024 do 1039 zawierają adresy
rejestrów do przełączenia (w formacie: młodszy bajt - starszy
bajt). Pierwszym rejestrem jest zawsze 756 (CHBAS) i jest ustawiony
na komórkę 1024 i 1025. Dla innych trybów można ustawić takie
rejestry, jakie tam są potrzebne. Wszystkie miejsca w tablicy,
które nie są używane powinny mieć wartość 255 (ustaw przez POKE).
Procedura VBI może przełączyć maksymalnie 8 rejestrów podczas
przerwania VBI.
Komórki od 1040 do 1055 zawiera wartość rejestru do przełączenia
podczas VBI i co drugą komórkę jest skorelowana z adresami
rejestrów przechowywanymi w 1024-1039. 1040 i 1041 zawsze będą
zawierać adresy tych dwóch zestawów znaków, które wczytaliśmy do
pamięci z pliku i będą skorelowane z adresami 1024 i 1025 (które
zawsze wskazują CHBAS w 756). Wszystkie komórki między 1042 i 1055,
których nie używamy mogą być wyzerowanę komendą POKE.
JAK UZYSKAĆ NIETYPOWE ZNAKI
Niektóre listingi w Atari Basic zamieszczone w niniejszej serii
artykułów zawierają znaki graficzne nazywane kodami Control, kodami
Escape oraz znakami w inwersji. Załączam tabelkę pokazującą jakie
kombinacje klawiszy należy nacisnąć, aby je uzyskać. Seria XE ma te
klawisze opisane na klawiaturze.
Aby uzyskać poniższe znaki (w inwersji), najpierw należy nacisnąć
klawisz Inverse, który w XL i XE jest umieszczony w prawym, dolnym
rogu klawiatury. W starszych modelach Atari (400/800) ten klawisz
oznaczony jest logiem Atari.
Kaz 2010-12-18 10:30:17
Mam prosbe - czy moze ktos zrobic wideo z gry "Gem Drop" (i/lub) przykladowego programu - ale z prawdziwego Atari? Chetnie zamieszcze do porownania. mono 2010-12-18 12:28:32
Świetny artykuł. Śledziłem wątek z tym edytorem, ale efekty są rzeczywiście ciekawe. adv 2010-12-18 13:27:50
Super. Po przeczytaniu tekstu jak ten żałuję, że nie zostałem koderem. Kaz 2010-12-18 15:30:14
Male uzupelnienie artka - o dwa akapity w opisie programu. Wcielo mi to podczas tlumaczenia, dopiero teraz sie zorientowalem. Tdc 2010-12-19 16:35:53