Interlace Super IRG by Kaz 2010-12-18 10:04:25

Jak niektórzy może pamiętają, Robert "Synthpopalooza" Clark zaprezentował 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

adv: cały czas możesz zostać)