GED, czyli jak ulepszyć grafikę (1)

dracon
autor: dracon

Wyobraź sobie, drogi Czytelniku, program graficzny, umożliwiający uzyskanie w piętnastym trybie graficznym do 14 kolorów w jednej (!) linii ekranowej ...
BEZ żadnego migania... Z możliwością zmiany dziewięciu kolorów co każdą linię... Z pełną możliwością zmian wszystkich komórek koloru trybu piętnastego oraz z (prawie) pełną kontrolą nad wszystkimi obiektami PMG w Atari (np. zmienianie, co każdą linię, ich koloru, szerokości, itd.)...

A teraz... sprawdź, czy w Twojej kolekcji programów przypadkiem nie pałęta się program "GED". To właśnie on jest edytorem graficznym, który umożliwia wszystkie wyżej wymienione przeze mnie operacje graficzne.

GED'a z pewnością posiada wiele osób, jednak niewielu doceniło jego możliwości, a jeszcze mniej potrafi z niego korzystać.

Znam powód takiego stanu - mimo dość dobrej, oryginalnej angielskiej instrukcji do niego, sam program nie prezentuje się ciekawie - pusty ekran, tylko na górze jest mały prostokąt, oznaczający tryb pracy GED'a. Duże potencjalne możliwości ulepszenia grafiki "piętnastki", jakie istnieją w GED'zie, są niestety jakby "ukryte" przed użytkownikiem z powodu jego nieciekawej obsługi - mało funkcji, itp. sprawy.

Mam nadzieję, że po tym opisie GED'em zainteresuje się więcej osób... Zapewniam, że efekty pracy GED mogą być naprawdę zadziwiające, a wszystko zależy od chęci użytkownika oraz samego obrazka (jedne obrazki można "podkolorować" na GED'zie lepiej, inne gorzej... :)) ).

GED nie jest typowym programem graficznym. Jego autor stworzył go przede wszystkim z myślą o uzyskaniu najlepszego możliwego trybu graficznego bez migania, jaki potrafi wyświetlić małe Atari. Ten tryb wyświetlania zużywa prawie 10 kB kodu DLI do zmiany rejestrów kolorów w każdej linii. Pozwala także umieszczczać obiekty PMG w dowolnym miejscu na ekranie, dzięki czemu uzyskuje się dodatkowe kolory.

GED i kod, który on zawiera, nie jest "public domain". Można go jednak rozpowszechniać bez żadnych opłat. Prawa autorskie należą do Johna Harrisa [ (c) 1993 by John Harris ].

Autor programu prosi o skontaktowanie się z nim w wypadku użycia formatu grafiki GED'a w jakimkolwiek programie komercyjnym. Oczekuje też na wszelkie sugestie i pytania na temat GED.

Oto jego adres:

 John Harris
 45346 Graceway Dr.
 Ahwahnee, CA 93601, USA

Internet:
 jharris@cup.portal.com

Po tak upierdliwym wstępie czas na konkrety... :-)

Podstawowa obsługa programu :

*,+,-,= poruszanie kursorem
joystick poruszanie kursorem
Control *,+,-,= ruch co 8 pikseli
Shift Ctrl - skok na górę ekranu
0-3 wybór aktualnego rejestru koloru (0=kolor tła)
G pobiera kolor na pozycji kursora i ustawia na aktualny kolor
(tylko dla "normalnych" kolorów, tzn. nie dotyczy to kolorów obiektów PMG)
X wymienia dwa rejestry koloru. Aktualny kolor będzie wymieniony
na kolor na pozycji kursora
Shift *,+,-,= zmienia kolor oraz jasność bieżącej "komórki koloru"
C kopiuje pojedynczą "komórkę koloru" do następnej (niższej) linii obrazu.
Jeśli zmieniasz większą ilość linii, np. z góry na sam dół, to przytrzymaj ten
klawisz aby sobie ułatwić pracę
W kopiuje całą linię "komórek koloru" do następnej linii obrazu
, . przesuwają granice "komórki koloru" w lewo lub w prawo
T wyświetla 'paletę testową' (widać tam np. gdzie są umieszczone duszki)
SPACE przełącza tryb pracy GED'a : rysowanie lub wypełnianie
U (undo) przywraca stan rysunku przed użyciem funkcji Fill (wypełniania)
D przełącza tryb Fill'u: normalny (pełny) i 'dither' (kratka). Podaj liczbę 0-3,
co uformuje "kratkę" między tym wybranym, a aktywnym kolorem
B przełącza tryb Brush'a (pędzla). Umożliwia powielanie fragmentu grafiki
(jednokolorowego) na ekranie. Kursor powinien być na obiekcie PMG,
który utworzy kształt pędzla
P przełącza między trybem edycji 'normalnych' kolorów (playfield),
a kolorami duszków (PMG)

Dalsze, poniższe funkcje można uruchomić po uaktywnieniu opcji "P" (włączenie części GED do obiektów PMG)

A włącza automatyczne wybieranie obiektu PMG pod kursorem
1-4 wybór duszka 1-4
5-8 wybór pocisku 1-4
5-8 wybór pocisku 1-4
Shift 1-8 zaznacza aktualną pozycję kursora jako poziomą początkową pozycję obiektu PMG
< > zmienia bieżącą szerokość obiektu PMG : normalna/podwójna/poczwórna
M przełącza bit pierszeństwa dla pocisków używanych jako 5-ty duszek
O przełącza bit pierszeństwa (priorytet) dla nakładania kolorów PMG
(tzn. który duszek ma się pojawić nad /przed którym)
F przełącza cztery tryby priorytetów playfield ("normalnych" kolorów) i PMG.
To zmienia który obiekt ukaże się przed innymi obiektami na ekranie,
"z przodu" (pierwszy tryb priorytetu GED'a to rysowanie na kolorze tła - kolor #0,
pozostałe zezwalają także na rysowanie duszkami na innych kolorach - #1, #2, #3...)

ESC a następnie numer 1-9 - pokazuje katalog dyskietki z wybranej stacji dysków.
Ta funkcja pozwala dodatkowo ustalić bieżącą (standardową) stację,
z której będą odczytywane dane. Dzięki temu po odczycie katalogu z np.
ramdysku (D8:) można przy ładowaniu pliku pominąć nazwę urządzenia,
a program przyjmie w tym przypadku, że tą bieżącą stacją jest D8:
i wszystkie dane będzie próbował ładować z D8:
L ładowanie rysunku. Uwaga: nie musisz podawać nazwy urządzenia - program
odczyta wtedy dane ze stacji D1: lub (po zmianie, opisanej wyżej) z innej,
ustawionej jako standardowa, stacji
S zapis rysunku. Jeśli już coś nagrywałeś, to pojawi się nazwa tego
ostatnio nagrywanego pliku wraz z urządzeniem (np. D1: PICTURE.GED),
teraz możesz potwierdzić tą nazwę, lub ją zmienić i zatwierdzić Return'em
Shift X wyjście do DOS'u
Shift Ctrl Tab czyści cały ekran

Rysowanie w GED :

Do poruszania kursorem można używać joystick w porcie #1 lub strzałek kursora. Zamiast poruszania kursorem z klawiatury co 1 piksel, można to zrobić z wciśniętym klawiszem "Control -" ruch będzie co 8 pikseli.

Kombinacja "Shift Control -" (minus) przeniesie kursor na samą górę ekranu.
Jest to przydatne do zmiany rejestrów PMG. Opiszę to przy okazji omawiania części GED do obiektów PMG.

Fire' em w joysticku możesz rysować używając aktywny (aktualny) kolor. Jeśli na pozycji kursora był już piksel w tym samym kolorze co aktualny, to zostanie on wymazany i będzie tam wstawiony kolor tła (#0). Dzięki temu można prosto rysować i kasować danym kolorem bez konieczności wybierania koloru z klawiatury.

Klawiszami 0-3 wybierasz pożądany kolor (rejestr koloru), kolor #0 oznacza tło. Możesz też najechać kursorem na kolor na obrazku, którym chciałbyś rysować i wcisnąć "G", by "pobrać" ten kolor. Kasowanie (czyszczenie) całego obrazu następuje po wciśnięciu "Shift Control Tab". "Shift X" spowoduje wyjście do DOS'a.

Tryb wypełniania :

Wciśnij SPACE aby wybrać między trybem rysowania i wypełniania. U góry ekranu znajduje się mała ikona informująca, który tryb aktualnie używasz. Jest ona linią w trybie rysowania, natomiast podczas wypełniania zmienia się w wypełniony prostokąt. Dodatkowym sygnałem używania trybu wypełniania jest przyspieszone miganie kursora.

Wypełnianie można uzyskać także w trybie "kratki" (dither). Wciśnij klawisz "D", a następnie numer 0-3. "Kratkowany" wzór będzie uformowany między tym numerem a aktywnym rejestrem koloru. Ikona pokaże kratkowany prostokąt gdy opcja "kratkowania" będzie włączona.

Ponowne wciśnięcie "D" przywraca 'pełne' wypełnianie.

Tryb wypełniania w GED to proste wypełnianie w dół, wewnątrz obszaru, gdzie ta funkcja się rozpoczęła.

Wciśnięcie U (undo) cofnie skutki działania wypełniania.

Tryb Fill (wypełnianie) bieżąco wypełnia tylko jeden rejestr koloru. Wszelkie zmiany kolorów w linii nie są uwzględniane przy tej operacji, dlatego może być konieczne "ręczne" kopiowanie tych zmian przy użyciu komendy "C".

GED można podzielić na dwie części: edycja standardowych kolorów (tzw. playfield) i edycja obiektów PMG (tzn. duszki lub gracze oraz pociski).

W celu uzyskania dodatkowych kolorów w obrazku można użyć jednego z tych dwóch trybów lub też (co jest lepsze ale i bardziej skomplikowane) obu metod.

Zajmę się teraz częścią GED'a dotyczącą kolorów "playfield". Na marginesie, w pierwszej wersji GED'a była tylko ta możliwość, a dopiero później w kolejnej wersji autor dodał 'obróbkę' PMG.

PLAYFIELD:

Ponieważ rejestry kolorów są mnożone wiele razy na jedną linię, zmiana w palecie kolorów da efekt tylko w porcji (fragmencie) linii, który autor GED' a nazywa "komórką koloru".

Aby zobaczyć, jak wygląda "komórka koloru", zrób następujący eksperyment:
wyczyść ekran w GED ("Shift + Ctrl + Tab") i wypełnij go pierwszym rejestrem koloru ("1", spacja i Fire).

Wtedy porusz kursorem kilka linii w dół i wypełnij go kolorem #2. Powtórz to samo z kolorem #3. Teraz wciśnij "T" by włączyć 'paletę testową' i patrz na obraz. Rejestry kolorów w danych "playfielda" nie były zmieniane, lecz 'wielokrotne' kolory są "napchane" w nich, tworząc pionowe pasy koloru. Każda różna kolorowa część linii jest tą tzw. "komórką koloru".

Na ekranie widać wyraźnie, że w jednej linii jest kilka 'pasków' o różnym odcieniu, różnie są one ułożone - raz jest to pół linii ekranowej, raz ćwierć i to właśnie jest charakterystyczne dla "komórek koloru".

"Komórkę koloru" można zdefiniować jako rejestr koloru, który jest wyświetlany tylko dla CZʦCI pojedyńczej linii obrazu.

Istnieje osiem "komórek koloru" na każdą jedną linię ekranową, ale musiałbyś rysować wszystkimi rejestrami koloru na tej samej linii, ażeby zobaczyć wszystkie 8 "komórek koloru" w tej linii. Być może to wszystko wydaje się skomplikowane, ale jak zwykle potrzeba treningu aby to rozczaić...

Kolor tła (#0) nie jest zmieniany, lecz pozostałe trzy rejestry kolorów mogą być wielokrotnie "faszerowane" różnymi wartościami. To stwarza te 8 kolorów "playfield" w jednej, całej linii obrazu (tzw. scan line= linia skanowa).

Wartość rejestru koloru istnieje tylko dla fragmentu linii skanowej i tworzy to, jak już wyżej wspomniałem, "komórkę koloru". W ten sposób ekran jest podzielony na kolumny, tak jak pokazano niżej.

Działanie procedury DLI : linia skanowa rozpoczyna się z początkowymi wartościami kolorów dla wszystkich trzech rejestrów koloru. Następnie procedura DLI wstępnie ładuje pierwsze zmiany trzech rejestrów do rejestrów A, X i Y procesora. Zaczyna się to faktycznie od 31-go piksela (poziomo, bo wysokość nie jest akurat ważna), gdyż tam jest ustawiana nowa wartość dla pierwszego rejestru koloru.

(współrzędne dotyczą pozycji X kursora, wartość Y [wysokość] nie jest tu ważna;
Uwaga: położenie piksela trzeba liczyć od pozycji 0)

- instrukcje DLI -
                                       LDA#      LDA#
        STA        STX       STY       STA       STA
       $D016      $D017     $D018     $D016     $D017
         |          |         |         |         |
X:      31         63        83        107       131
pierwszy | nowy     |  drugi  |  drugi  | 3.      | 3.
zestaw   | (drugi)  |  kolor  |  kolor  | wart.   | wart.
kolorów  | kolor #1 |  1-2,   |  #1-#3  | dla     | 1-2
#0-#3    | i oryg.  |         |         | kol. #1 | 2.
istnieje | #2-#3    |  oryg.  |         | 2.      | wart.
tutaj    | kolory   |  #3     |         | wart.   | dla
         |          |         |         | dla 2-3 | #3

To jest rozkład dla przerwania DLI, lecz wzrokowo, ważniejsze jest, aby widzieć gdzie są "komórki koloru", ponieważ to jest to, z czym rysujesz.

"komórki koloru":

0         31             107
Pierwsza  | Druga wartość | Trzecia
wartość   | koloru #1     | wartość
koloru #1 |               | koloru #1

0         63             131
Pierwsza  | Druga wartość | Trzecia
wartość   | koloru #2     | wartość
koloru #2 |               | kol. #2

0         83
Pierwsza  | Druga
wartość   | wartość
koloru #3 | koloru #3

Nie ma żadnej trzeciej wartości dla koloru #3 (dla $D018). Spowodowane jest to tym, że nie starcza już czasu na jego zmianę.

Pozycje piksela na powyższym planie są dla standardowego ustawienia. GED pozwala również na przesuwanie całej "procedury" (tzn. granicy "komórek koloru") w lewo lub w prawo, za pomocą klawiszy "," i "."
- dobrze widać to po włączeniu 'palety testowej' (klawiszem "T").

Oczywiście wszelkie zmiany w lewo lub w prawo będą zmieniać wszystkie współrzędne pikseli z powyższej tabeli.

Myślę, że teraz już wiesz na czym polegają "komórki koloru". Oznaczają one, że zależnie od położenia kursora (na której jest on linii), zmienianie wartości rejestru koloru (z użyciem "Shift strzałek") zmienia TYLKO lokalną (miejscową) "komórkę koloru" Zmieni się kolor w części linii. Kolory "playfield" są "upychane "automatycznie w każdej linii i takie zmienianie "komórki koloru" działa tylko w tej linii skanowej, która jest zmieniana.

Do zmiany kolorów używaj : "Shift +,*" zmieni kolor, a "Shift -, =" jasność tego koloru.

Zmiana koloru obrazu daje efekt tylko w jednej linii, dlatego autor dołożył dodatkowe funkcje: wciśnięcie "C" skopiuje bieżącą "komórkę koloru" do tej samej, o 1 linię niższej komórki. Możesz trzymać "C" aby powtarzać tą operację. Używaj funkcji "C" gdy zmieniłeś właśnie jeden kolor i nie chcesz zmieniać pozostałych "komórek koloru".

Z kolei klawisz "W" skopiuje całą linię "komórek koloru" do następnej linii na dole. Użyj tej funkcji, gdy zmieniłeś wszystkie rejestry koloru (#1,#2,#3) i chcesz skopiować całą paletę.

Komenda "X" pozwala na wymianę dwóch rejestrów koloru obrazu. Jeden rejestr powinien być wybrany z klawiatury: 0-3 (lub przez komendę "G"). Wtedy umieść kursor na 'szczycie' koloru, który chcesz zmienić i i wciśnij "X". Komenda ta zadziała wszędzie poniżej aktualnej pozycji kursora na ekranie oraz na prawo od pozycji kursora. Wymieniony będzie także aktywny rejestr koloru. Ponieważ punkt na pozycji kursora był wymieniany, mając aktywny kolor możesz wcisnąć "X" drugi raz aby przywrócić stan sprzed zamiany.

Granice komórek koloru

GED pozwala na przemieszczenie położenia granic "komórek koloru" w lewo lub w prawo jako grupy. Normalnie jest to pierwszy krok, aby podczas kolorowania obrazka osiągnąć najlepsze dopasowanie granic "komórek koloru" do obiektów na obrazku.

Jest to zmienianie granic na całym obrazie i nie może być zmieniane w połowie ekranu. Jak już wyżej wspomniałem, do przesuwania granic "komórek" należy użyć "," i "." .
Komenda "T" zmienia obraz na 'paletę testową', co powoduje łatwiejsze zobaczenie granic między "komórkami koloru". Ponowne wciśnięcie "T" przywraca normalną paletę obrazu.

KOLOROWANIE

Kolorowanie obrazka trzeba przeprowadzić etapami. Po załadowaniu grafiki trzeba ją najpierw podkolorować "globalnie", czyli ustawić jakie kolory mają być jako podstawowe na całym ekranie. Jest to konieczne, bo GED ignoruje informację o kolorach z pliku .MIC i zawsze po wgraniu obrazka ustawia kolor szary.
Najlepiej zacząć kolorować od prawej górnej strony rysunku (użyj kombinację Shift & Ctrl & - aby przenieść kursor na pierwszą górną linię ekranu lub ustaw tam kursor joystickiem). Ustawiłeś już kursor w prawym górnym rogu ekranu ??? OK, teraz najedź na piksel z danym rejestrem koloru (którymś z trzech podstawowych rejestrów trybu gfx #15 OS : #0=$2C8, #1=$2C4, #2=$2C5, #3 =$2C6) i kombinacją "Shift strzałki" ustaw jego pożądany kolor i jasność. Następnie ustaw kolor i jasność pozostałych rejestrów koloru w tej linii. Używając funkcji "W" i "C" przekopiuj już odpowiednio ustawione kolory na wszystkie dolne linie, aż do samego dołu obrazu. Po tym przenieś kursor znowu na sam szczyt obrazu, tyle, że ustaw go na "komórce koloru" obok właśnie zmienionej (czyli z prawej strony, ale już bliżej środka ekranu). Powtórz numer z ustawieniem odpowiedniego koloru dla wszystkich trzech rejestrów koloru i skopiuj to aż na sam dół ekranu, wtedy znów zacznij od samej góry ekranu na kolejnej "komórce koloru" itd. aż dojdziesz do dolnego lewego rogu ekranu, czyli będziesz mieć podkolorowany (wstępnie) cały rysunek. Dopiero teraz możesz dokonać poszczególnych zmian kolorów, np. na środku ekranu lub nałożyć duszki , itd.

Kolorowanie w GED jest dosyć denerwujące, gdyż często się zdarza, że zmieniając kolor aktualnej "komórki koloru" np. na środku ekranu (przede wszystkim z użyciem funkcji "W"), zmienia się także niepotrzebnie już ustawiony rejestr koloru w sąsiedniej "komórce koloru" w tej samej linii obrazu (np. z prawej strony).

Dlatego podczas kolorowania należy na to uważać. Jeśli coś takiego wystąpi, to potrzeba nieraz kilkukrotnych poprawek, używania zamiennie funkcji "W" i "C". Wymagana jest cierpliwość, bo możliwe jest uzyskanie pożądanego koloru na całym ekranie, trzeba "tylko" trochę pokombinować !

Format zapisu w GED

GED nagrywa jeden duży plik binarny (dosowy - z nagłówkiem $FFFF) o długości 11302 bajty (licząc z nagłówkiem), o adresie $5330-$7F4F.

Plik taki zawiera wszystkie potrzebne programowi dane, a więc sam obrazek, ustawienie palety kolorów dla niego oraz dane obiektów PMG.

Obrazek w GED zajmuje dużo miejsca na dysku (45 sektorów w podwójnej gęstości) ponieważ autor nie zastosował w obecnej wersji GED żadnej metody kompresji pliku. Zapowiada jednak zrobić to w kolejnych, przyszłych wersjach tego programu.

Oto rozkład dla poszczególnych elementów GED'a, które są w pamięci (i zapisanym przez GED pliku) podczas edycji rysunku:

 $5330-$5AFF - dane palety koloru
 $5B00-$5FFF - dane obiektów PMG
 $6000-$600F - nagłówek obrazka
 $6010-$7F4F - dane obrazu

 (dla rozdzielczości 160x200)

Teraz czas na...

Informacje dodatkowe

GED pracuje w piętnastym trybie graficznym OS (czyli w trybie #$0E Antica) w rozdzielczości 160x200 pikseli. Jako że wszystkie inne programy graficzne dla trybu #15. używają rozdzielczości 160x192, GED oferuje dodatkowe osiem linii ekranowych. Można to olać, zostawiając po prostu wolne miejsce, albo też dorysować coś do rysunku w tych wolnych ośmiu liniach (po wcześniejszym wgraniu jakiejś /swojej/ grafiki w standardowej rozdzielczości 160x192), lub też, ewentualnie, narysować te osiem linii na swoim ulubionym programie graficznym ("XL- ART" ??), następnie dodać do tego nagłówek binarny : $7E10-$7F4F i taki plik wgrać podczas pracy w GED'zie komendą "L".

Tu ujawnia się wielka, moim zdaniem, zaleta GED'a - pozwala on ładować pliki binarne z różnymi danymi. Możliwe jest to podczas działania programu, za pomocą wyżej wymienionej komendy. Dzięki temu można ładować różne "palety koloru", czy też obiekty PMG w trakcie edycji jednego obrazka (w celu np. dobrania odpowiedniego ustawienia kolorów spośród kilku 'palet' nagranych na dysku), a program sam umieści dane w odpowienim miejscu pamięci (o ile w nagłóweku był dobry adres). Takie posunięcie autora zlikwidowało konieczność istnienia specjalnych, oddzielnych funkcji LOAD i SAVE dla obrazka, PMG itd.

Bardzo ważne są dwie sprawy:

1. Dane dla GED'a muszą mieć odpowiednie adresy, np. dane kolorów powinny mieć nagłówek binarny $5330-$5AFF. Adresy poszczególnych danych do ładowania znajdują się powyżej (patrz : "Format zapisu w GED"). Ogólnie nie radzę ładować do GED czegoś, co nie ma nagłówka dosowego z przedziału adresów $5330-$7F4F.

2. Próba załadowania funkcją "L" jakiegoś pliku, który w ogóle nie ma nagłówka binarnego (dosowego) na ogół zawiesi program, tak więc z góry to odradzam.

Aktualna, posiadana przeze mnie wersja GED (v2) nie ma możliwości nagrywania poszczególnych danych (danych PMG, palety kolorów, danych samego obrazka) jako pojedynczych plików binarnych (w celu późniejszego ładowania ich do GED'a, jak to opisałem wyżej). Możliwe jest to dopiero po wyjściu z tego programu (kombinacją "Shift X"), w DOS. Funkcja "SAV" lub "K", w zależności od używanego DOS'a (ja używam najczęściej DOS II+/D, więc do zapisu danych wykorzystam polecenie "SAV") umożliwi zgranie na dysk wybranego elementu z GED. Np. w moim ulubionym DOS II+/D w celu nagrania 'PMG' na dysk wykonam komendę :

 "SAV PMG . OBJ, 5B00, 5FFF"

Pozostał jeszcze jeden problem, mianowicie:

Import grafiki

Jakkolwiek nic nie stoi na przeszkodzie aby od początku do końca narysować swoje arcydzieło pod samym GED'em, myślę jednak, że jest to zajęcie dla ludzi cierpiących na nadmiar czasu i cierpliwości... :)

Znacznie lepszym pomysłem jest wykorzystanie już narysowanego obrazka (na innym programie graficznym, ze względu na dostępność wielu "narzędzi malarskich") i następnie załadowanie go do GED'a celem podkolorowania.

Istnieją dwie metody przeniesienia rysunku Pierwsza, to dodanie do obrazka nagłówka binarnego (dosowego) o adresie zaczynającym się od $6010. Standardowy plik .MIC ma długość 7684 bajty (7680 bajtów samych danych obrazu plus cztery bajty informujące o kolorach obrazka). Zatem jego nagłówek będzie następujący :
$6010-$7E13.

Tu mała uwaga: właściwe dane są od $6010 - $7E0F, reszta (4 bajty) to zbędne (dla GED) info o kolorze. Teraz można już wczytać do GED swój obrazek, ale należy pamiętać o tym, że po wczytaniu, na samym dole ekranu pojawią się dodatkowe, małe "śmieci" (pozostałość z danych kolorów w pliku .MIC, które GED zinterpretował jako dalsze dane dla obrazka). Musisz to wymazać, rysując kolorem #0 (tła).

Możliwa jest też jeszcze dodatkowa trudność - po wgraniu może pojawić się dziwne ustawienie jasności na obrazku, jeśli dany obrazek nie ma "ustawień jasności" wg standardu XL-ART 'a :
#0=$x0 #1=$x4, #2=$x8, #3=$xC rej. kol. rej.kol. rej.kol. rej.kol.
(x, czyli dane o kolorze, GED ignoruje i wstawia tu zawsze kolor szary).

Aby sobie z tym poradzić, trzeba albo użyć programu Bartmana - "Bit converer" (do zamiany kodów kolorów na odpowiadające powyższemu ustawieniu), albo po prostu spojrzeć kilka (dziesiąt) linijek wyżej na punkt pt. "KOLOROWANIE" i ustalić pożądane jasność i kolor, zaczynając od samej góry ekranu w GED.

OK, po tych zabiegach można jeszcze ewentualnie dograć z dysku dodatkowe osiem linii obrazu (powinny one mieć nagłówek : $7E10-$7F4F, tak, jak to wcześniej opisywałem ; pomijając 6-bajtowy nagłówek, te 8 linii ma długość 320 bajtów).

Drugą, zdecydowanie bardziej polecaną przeze mnie metodą 'importu' obrazka jest użycie programu "MICGED", autorstwa Peta z Bit Busters.

"MICGED" konwertuje pliki .MIC na format pliku .GED. Program ten jest bardzo wygodny użyciu, nie wymaga żadnego kombinowania poza wgraniem normalnego pliku .MIC (nawet z niestandardowym ustawieniem jasności rysunku) i nagraniem gotowego obrazka w formacie GED'a, który można wczytać funkcją "L" tego ostatniego. Konwerter ten "obcina" również zbędne bajty z końca pliku .MIC. Przekonwertowany w ten sposób obrazek można dalej "obrabiać" w GED, dodając mu odpowiednie kolory, itd.

OK, myślę, że jak na pierwszy raz, tyle informacji o GED wystarczy...

Następnym razem napiszę co nieco o wykorzystaniu obiektów PMG w tym programie, o pewnych problemach z tym związanych oraz o używaniu "pędzli" (z ang. "brushes") . . . Przewiduję też jakiś bonus dla (przyszłych ???) użytkowników GED, w postaci dodatkowych danych dla tego edytora... :)

Tym razem, jako uzupełnienie tego artykułu pozwoliłem sobie dodać zarchiwizowany plik "GEDSTUFF.ARC"... ARChiwum to zawiera główny przedmiot niniejszego tekstu, czyli sam program - GED v2. Jest tam też "ściągawka" z funkcji do niego, konwerter "MIC-GED", parę przykładowych obrazków i.... ale to już trzeba sprawdzić samemu... :)) Do rozkompresowania tego pliku należy użyć programu "Super UnArc v2.4"... Jak to zrobić było dobrze opisane w "BARYMAGU #1", ale powinno być też gdzieś w "ENERGY".

Podsumowując moją opowieść o GED: jeśli zajmujesz się tworzeniem grafiki na Atari XL/XE, potrzebujesz dużo kolorów w swoich obrazkach i nie lubisz tzw. trybu 'interlace', to zostaje Ci GED, który, moim zdaniem, pozwala uzyskać dużą ilość kolorów "naraz" na ekranie, dzięki użyciu DLI i PMG. Po prostu: GED albo interlace - wybór należy do Ciebie...

Do zobaczenia (przeczytania) w kolejnym odcinku o GED...

Specjalnie dla magazynu >> ENERGY << opis do GED przygotował Dracon/USG/TQA


GED, czyli jak ulepszyć grafikę (2)

dracon
autor: dracon

Serdecznie witam wszystkich zainteresowanych tytułowym edytorem graficznym i zapraszam na dokończenie jego szczegółowego opisu. Tak więc niniejszym ogłaszam ciąg dalszy tra-GED-ii... ;-)))


W poprzednim odcinku opisałem wszystkie polecenia GED oraz podałem szczegółowy sposób postępowania w jednym z dwóch trybów pracy tego programu, to jest w trybie "playfield". Ten tryb edycji, oferujący możliwość kilkukrotnego zmieniania 3 rejestrów koloru w jednej linii ekranowej (niektórzy określają to mianem tzw. "ścigania plamki" ), jest już zdecydowanym krokiem naprzód w porównaniu z innymi, starszymi rozwiązaniami. Mam tu na myśli RAMbrandta, Color Enhancer, Colors i parę inych, które używając przerwania DLI umożliwiały co prawda uzyskanie na obrazku do 128 kolorów, ale w jednej linii mogły być naraz tylko 4 różne kolory. Nie twierdzę, że nie można mimo wszystko tworzyć tam wspaniałych, wielokolorowych grafik (dowodem na to są bardzo ładne obrazki Ravena/Quasimodos w demie "Drunk Tank", gdzie po mistrzowsku zostały wykorzystane możliwości standardowego przerwania DLI), ale naprawdę są duże ograniczenia dla grafika chcącego wielu kolorów w różnych miejscach ekranu. Możliwości GED w trybie "playfield" są już nieco lepsze, choć "nigdy nie jest tak dobrze, żeby nie mogło być lepiej"... Myślę, że dodanie przez autora edycji i użycia PMG znakomicie dopełniło tryb "playfielda" i rzeczywiście J. Harrisowi udało się uzyskać najlepszy możliwy tryb graficzny bez żadnego migania, jaki potrafi wyświetlić Atari XL/XE. Zresztą pojawił się już nowszy edytor graficzny - "POWER GRAPHICS", który wykorzystuje właściwie identyczne założenia, tyle, że może on pracować w kilku trybach graficznych ( nie tylko w trybie gfx #15, jak GED ).


Małe info...

GED ma pełną kontrolę nad wszystkimi rejestrami grafiki PMG, lecz w znacznie bardziej ograniczonym zakresie, w porównaniu z edycją standardowych ("playfield") kolorów.


Warto byłoby najpierw przypomnieć sobie podstawowe wiadomości o grafice PMG, gdyż będzie to przydatne podczas używania GED'a...


Duszek ( sprajt, z ang. sprite ) jest definiowanym przez użytkownika obiektem, który można umieszczać w dowolnym miejscu ekranu i płynnie przesuwać (oraz animować). W Atari możliwe jest uzyskanie dwóch rodzajów duszków: większych - graczy i mniejszych nazwanych pociskami. Dlatego noszą one oficjalną nazwę grafiki graczy i pocisków (Player/Missile Graphics, w skrócie PMG). Duszków jest osiem: czterech graczy i cztery pociski. Tworzone są one przez układ GTIA, który "miesza" je z normalnymi danymi ( z "playfield" ) wyświetlanego obrazu. Dzięki temu duszki są niezależne od pozostałych parametrów obrazu i mogą być używane we wszystkich trybach graficznych (szczególnie nadają się, moim zdaniem, do trybu piętnastego OS, ze względu na to, iż mają takie same piksele w standardowej ich rozdzielczości). Duszki są połączone parami gracz-pocisk i ponumerowane od 0 do 3 (uwaga: w GED, dla wygody używania, autor zmienił numerację i jest to 1-4 ! )... Liczbę duszków można zwiększyć przez zastosowanie DLI, lecz akurat nie ma tej możliwości w GED...


Wyróżnić można następujące cechy duszków:

- szerokość gracza 8 punktów (pikseli), a pocisku 2 punkty (piskelki takie jak w trybie gfx #15 OS);


- dowolna wysokość wszystkich duszków


- możliwość dwukrotnego lub czterokrotnego zwiększenia szerokości (dwukrotna - piksele duszka takie jak piksele w trybie gfx #9 OS, czterokrotna - cztery razy 'grubsze' piksle duszka w porównaniu z standardowa szerokością; Jeśliby na maxa rozszerzyć wszystkie obiekty PMG, to można nimi zasłonić cały ekran... co możę być szczególnie przydatne, tu - w programie GED, ale o tym później...)


- jedno - albo dwuliniowa rozdzielczość pionowa (chodzi tu o wysokość każdego punktu duszka - jednoliniowa to wysokość piksla taka jak w "piętnastce", a dwuliniowa to rozdzielczość pionowa "siódemki");


- kolor ustalany oddzielnie dla każdej pary gracz-pocisk;


- możliwość tworzenia duszków wielokolorowych (poprzez ich nakładanie na siebie i operację ORA);


- ustalony priorytet wyświetlania między duszkami (który na/za którym ma się pokazać);


- wybierany priorytet wyświetlania duszków i tła (czyli co się ma pojawić "na wierzchu");


- możliwość łączenia pocisków w piątego gracza (mającego niezależny od pozostałych graczy kolor);


- wykrywanie kolizji pomiędzy duszkami (szczególnie użyteczne w grach...);


- wykrywanie kolizji duszków z tłem (uwaga jak wyżej...);


Ufff... Trochę tego było, ale to chyba wszystko, co trzeba wiedzieć o PMG przy używaniu GED - resztę doczytacie sobie podczas dalszej części tego wykładu...


Chyba za daleko odszedłem od głównego tematu... :-)) ... Pora zatem przedstawić jak wygląda w GED...


Edycja PMG:

Przechodzimy do niej po naciśnięciu klawisza "P" (przełącza on między edycją PMG a "playfield"). Po przejściu do trybu PMG obok ikonki Draw/Fill pojawi się (z lewej) drugi mały prostokąt - symbol auto-wybierania dowolnego obiektu PMG, który jest poniżej bieżącej pozycji kursora. Możesz teraz wprowadzić komendy dla PMG, które automatycznie użyją obiektu PMG na pozycji kursora, jeśli takowy tam istnieje (tzn. jest tam umieszczony). Nic się nie stanie (nie zadziała), jeżeli PMG na tamtej pozycji nie będzie.


Poszczególne obiekty PMG mogą być wybierane ręcznie (osobno) przez wciśnięcie klawiszy 1-4, aby wybrać graczy 1-4, albo 5-8, by wybrać pociski 1-4. Ręczna selekcja może stać się konieczna, jeśli dwa obiekty PMG nachodzą na siebie, bo procedura auto-wybierania zawsze wybierze niższy numer (obiekt) PMG. W razie czego, zawsze można powrócić do auto-selekcji PMG klawiszem "A" (który ją włącza i wyłącza).


Teraz podam uproszczony (aczkolwiek skuteczny !) sposób tworzenia obiektów PMG w GED:


1. Wciśnij "P" (włączenie edycji PMG);


2. Klawiszem "F" ustaw pożądany priorytet PMG (oznacza to, na którym kolorze mają się pojawić duszki, najlepiej jednak tego nie zmieniać, wtedy duszki będą widoczne na kolorze tła - #0. Dlaczego nie zmieniać ?! O tym na koniec opisu... );


3. Ewentualnie przełącz klawiszem "O" priorytet między samymi obiektami PMG (tzn. jak mają się między sobą "zachowywać" duszki... Jednak na początek lepiej niczego tutaj nie zmieniaj... );


4. Wybierz konkretny obiekt PMG, naciskając odpowiednią dlań cyfrę (1-4 = duszki, 5-8 = pociski). Zauważysz u góry kilka kropek (ilość ich zależna jest od nr wybranego obiektu PMG, np. cztery, to czwarty gracz lub pocisk... );


5. Ustaw kursor tam, gdzie ma być 'początek' (góra) duszka na ekranie i wciśnij Shift + nr obiektu PMG, który wybrałeś (np. Shift + 4);


6. Teraz postaw parę piksli na ekranie "w ciemno" (Fire'm), na prawo i poniżej pozycji kursora, gdzie ustawiłeś początek obiektu PMG. Duszka jeszcze nie widać, ale wciśnij kilkukrotnie Shift + "-" (strzałka w górę) - duszek wyłoni się z obłoków ciemności ekranowej i łaskawie pozwoli Ci przeprowadzać dalsze operacje na nim... :-)


7. Widząc duszka, możesz już spokojnie i dokładnie utworzyć go w/g pożądanego kształtu... Użyj przycisku Fire, aby kasować/dodawać piksele tworzące obiekt PMG. Pamiętaj, że na razie maksymalna szerokość PMG, z jaką możesz narysować duszka, to 8 pikseli dla graczy, zaś dwa dla pocisków...

Gdy już narysowałeś parę pikselków obiektu PMG, otwierają się nowe możliwości:


- Shift + "-", "=" zmienia jasność obiektu PMG;


- Shift + "+", "*" zmienia kolor obiektu PMG; Tu uwaga do tych dwóch czynności: zmieniany będzie tylko kolor bieżącego, wybranego obiektu PMG. Zmienianie kolorów PMG działa trochę inaczej, niż w przypadku kolorów "playfield". Ponieważ nowe kolory (PMG) nie są automatycznie umieszczane w każdej linii, zmiany w kolorach PMG będą we wszystkich liniach od pozycji kursora do dołu ekranu lub do innego miejsca, gdzie kolor PMG był poprzednio zmieniany nieco niżej na ekranie. Pewnie wygląda to nieco zagmatwanie, ale ( jak zwykle) praktyka w GED wszystko rozjaśni...


- Przesunięcie kursora na nową pozycję i wciśnięcie Shift + nr obiektu PMG, który edytujesz, spowoduje przesunięcie aktualnego duszka na nowe, wybrane przez Ciebie miejsce. Możesz przytrzymać Shift wraz z nr duszka i przesuwać kursor - jest to przydatne przy dopasowywaniu PMG do gotowego obrazka...


- Klawisz ">" rozciąga duszka dwukrotnie, albo czterokrotnie (zależnie od wciskania tegoż), zaś "<" powoduje jego skurczenie się aż do standardowych rozmiarów włącznie...


- rozmiary, położenie, kolor duszka można zmieniać co 1 linię ( o ile nie ma w danym miejscu większej ilości zmian rejestrów PMG; wówczas te zmiany mogą nastąpić dopiero co drugą, albo nawet co więcej linii... );


- wciśnięcie "T" (oznaczającego pokazanie tzw. palety testowej obrazu) da możliwość zobaczenia, gdzie na ekranie są obiekty PMG (będą one jednak w tym trybie nieco przesunięte w stosunku do normalnego ustawienia, ale to nic nie szkodzi !).


OK, tak więc wiesz już, jak utworzyć obiekt PMG... Teraz wszystko powinno pójść gładko.....


Wypełnianie PMG:

Chodzi tu oczywiście o odmianę komendy "Fill" dla duszków. Podobnie jak dla trybu "playfield", PMG także może być wypełniane na dwa sposoby - pełnym kolorem (tzw. solid fill) i 'kratką' (tzw. dithered fill). Obydwa sposoby działają jednak nieco inaczej w trybie "PMG" ( w porównaniu z "playfieldem"). Nie ma tu funkcji wypełniania zaznaczonego ramką obszaru w obiekcie PMG. Tryb wypełniania w wersji PMG po prostu kopiuje bieżące linie obiektu PMG do następnej linii ekranowej. Jak to zrobić:


- dla trybu 'pełnego' (solid) wypełniania:


1. Wciśnij "P", cyfrę z wybranym obiektem, umieść kursor w odpowiednim miejscu i naciśnij Shift + nr obiektu, który używasz, aby ustalić jego (duszka) początkową pozycję na ekranie;


2. Narysuj tym obiektem PMG linię, wciśnij spację, umieść kursor na narysowanej linii, wciśnij Fire i pociągnij joystick w dół (do siebie) - powinno zacząć się wypełnianie obiektu PMG od narysowanej pierwotnie linii aż na dół. Gdy skończysz, naciśnij spację, aby wyjść z trybu Fill.


- aby stworzyć 'kratkowane' wypełnienie w PMG:


1. Postępuj tak jak w punkcie 1. dla 'pełnego' wypełniania, tzn. ustaw duszka...


2. Narysuj obiektem PMG linię, w której widoczny będzie tylko co drugi piksel - będzie to coś na kształt ". . . ." (dla gracza z maksymalną szerokością będą widoczne 4 piksele);


3. Będąc w tej linii wciśnij spację i D oraz podaj z klawiatury numer 0-3 (nie przejmuj się tym, że chwilowo zmieni się położenie linii, którą narysowałeś). U góry ekranu pojawi się kratkowany prostokąt - symbol, że można już przystąpić do wypełniania... Ustaw kursor na narysowanej uprzednio linii, wciśnij Fire i pociągnij joystick do siebie - kratkowany wzór PMG zacznie się pojawiać... Po zakończeniu tego wypełniania wciśnij "D" (przywraca 'pełne' wypełnianie) oraz spację (wyjście z trybu Fill).


A teraz "czas na Colgate"... Sorry, to zgubny wpływ reklam... ;-) ... Oczywiście czas na...


Brushes:

...czyli po polsku, czas na pędzle, tudzież szczoteczki... Nas jednak nie interesują tutaj przedmioty do mycia zębów, lecz pomocne przybory malarskie... ;-))

GED pozwala na używanie (w ograniczonej formie) pędzli, których dane może kopiować z obiektów PMG na standardowy obraz ("playfield"). To narzędzie proste, lecz całkiem przydatne. Oto jak je używać:


- tradycyjnie zacznij od wciśnięcia "P", wybierz i ustaw duszka;


- narysuj nim dowolny kształt, ustaw kursor na jego szczycie (początku obiektu PMG), wciśnij "P"... Mała uwaga: pędzel może mieć dowolny kształt i wysokość, z tym, że pierwszą wolną (czystą) linię (od szczytu obiektu) GED uzna za koniec pędzla...;


- Wciśnij "B" - utworzony kształt z obiektu PMG zostanie zapamiętany w pamięci jako brush (pędzel). U góry ekranu pojawi się mały krzyżyk. Jest to oznaczenie trybu "pędzla". Teraz możesz, poruszając kursorem i naciskając Fire, powielać wielokrotnie kształt z "brusha" na ekran, używając aktualny kolor ("brushe" mogą być, niestety, tylko jednokolorowe);


- Wciśnij ponownie "B" lub spację, aby powrócić do normalnego trybu rysowania (wtedy utworzony kształt jest automatycznie kasowany z pamięci).


Inną, z interesujących rzeczy w GED, stanowi...


Piąty gracz:

Uzyskuje się go banalnie prosto - poprzez wspólne zgrupowanie wszystkich pocisków w jednym miejscu ekranu i skorzystanie z komendy "M"...

Sposób (z)użycia:

"P", po kolei ustawiamy obok siebie pociski (Shift + 5,6,7,8)... Bardzo ważne jest, by były one rzeczywiście jeden obok drugiego !!! Gdy już tak jest, najeżdżamy kursorem na tzw. "szczyt" (punkt początkowy), gdzie ma powstać piąty player i wciskamy "M" - pojawi się toto, mające niezależny od pozostałych czterech graczy kolor i pozostałe jak oni możliwości... Można też tak kombinować, że 5-ty graczy może być widoczny (włączony) tylko w paru liniach ekranu, natomiast nad nim, albo pod nim pociski mogą być rozdzielone (tak jak standardowo ). Jeśli zajdzie potrzeba przesunięcia piątego gracza w inne miejsce, a jesteś w 1. górnej linii ekranowej, to wystarczy przenieść kursor w inne miejsce tej linii i wcisnąć Shift+5 (normalnie odpowiada on za umieszczenie 1. pocisku, lecz gdy włączysz 5. gracza, to Shift+5 będzie sterował położeniem tego nowego duszka!) - wtedy zostanie ustawiona nowa pozycja piątego gracza. Dotyczy to tylko tej pierwszej linii ekranowej !!! Jeśli zechcesz ustawić piątego gracza gdzieś indziej, np. w środku ekranu, każdy pocisk musi być przesunięty indywidualnie - nawet wtedy, gdy opcja piątego gracza jest włączona !


Na razie jednak warto omówić...


Priorytety (uporądkowanie) PMG:

Najpierw przedstawię, co można zmieniać klawiszem "F" (priorytet PMG - "Playfield", czyli co [grafika "playfield", czy obiekt PMG] ma się pokazać "z przodu", jako widzialne, a co ma pozostać w ukryciu... :-)

W GED są możliwe do wyboru 4 tryby tego rodzaju priorytetu. Ponumerowałem je w kolejności wciskania klawisza "F" (pierwszy tryb jest automatycznie uruchomiony po załadowaniu GED'a), który to przełącza je po kolei...


1. PMG widoczne jest tylko na kolorze tła (kolor #0) i jest za kolorami "playfield" (#1,#2,#3), tzn. duszki są tam wtedy przysłonięte. Ten tryb jest włączonu i aktywny po uruchomieniu GED'a... Nie bez przyczyny akurat ten, gdyż jest chyba najlepszym do "uzupełniania" standardowej grafiki obiektami PMG. Wyjaśnię to szczegółowo na koniec tego artykułu. Czyli tutaj 1. priorytet = kolory "playfield" (wszystkie), a 2. priorytet = PMG 1-4.


- Info dla koderów: tu ustawiony jest bit drugi (dec #04) w komórce GTIACTL ($d01b).


2. PMG widać na kolorze tła i #3 kolorze "playfield". Na pozostałych kolorach PMG jest przysłonięte. Zatem 1. priorytet = kolory #0 i #1 "playfield", 2. priorytet = PMG 1-4 i 3. priorytet = kolory #2 i #3 "playfield".


- ustawiony jest bit 3. (dec #08) w GTIACTL


3. PMG można zauważyć na wszystkich kolorach "playfield" (#0, #1, #2, #3). Dlatego: 1. priorytet = PMG 1-4, 2. priorytet = kolory "playfield" #0-#3.


- ustawiony jest bit 0. (dec #01) w GTIACTL


4. Widoczne są najpierw duszki #0 i #1, następnie wszystkie kolory "playfield", a po nich duszki #2 i #3 (przysłonięte). Stąd: 1. priorytet = PMG 1-2, 2. priorytet = kolory "playfield" #0-#3, zaś 3. priorytet = PMG 3-4.


- ustawiony jest bit 1. (dec #02) w GTIACTL


Teraz czas na drugi rodzaj ustawialnych w GED priorytetów, uruchamianych klawiszem "O" (z ang. "Overlapping", czyli przesłanianie). Steruje to tym, jak mają się duszki "zachowywać" wobec siebie...


Są dwa typy tego priorytetu:


A. Przesłanianie (początkowo włączone w GED ). W tej "naukowej" tabelce pokazane jest, który PMG jest widoczny na którym...

----------------------------------
\widocz-|PMG 1|PMG 2|PMG 3|PMG 4|
  ność  |     |     |     |     |
nr  \   |     |     |     |     |
----------------------------------
 PMG 1  |  X  |  +  |  +  |  +  |
----------------------------------
 PMG 2  |  -  |  X  |  +  |  +  |
----------------------------------
 PMG 3  |  -  |  -  |  X  |  +  |
----------------------------------
 PMG 4  |  -  |  -  |  -  |  X  |
----------------------------------

Oznaczenia:

"+" - PMG jest widoczny na tym obiekcie,

"-" - PMG nie jest widoczny na tym obiekcie (jest przysłonięty przez inne PMG),

"X" - a to po prostu nic nie oznacza... 8-))


B. Nakładanie

Znacznie mniej rozbudowane od poprzedniego trybu priorytetu...


Polega na tym, że w miejscu gdzie nałożą się na siebie (częściowo lub całkowicie) duszki, odpowiednio 0 i 1 oraz 2 i 3, kolor ich części wspólnej będzie równywartości OR ich kolorów. Mówiąc trochę prościej, gdy nastąpi nałożenie dwóch graczy, to ich część wspólna otrzyma kolor powstały w wyniku operacji logicznej ORA na dwóch kolorach tych graczy. Normalnie duszek może mieć tylko jeden własny kolor. Jeśli jednak "skrzyżuje się" go z innym duszkiem, to wykonując odpowiednią instrukcję ORA, otrzyma się 3-kolorowego duszka (ten dodatkowy, trzeci kolor jest efektem nakładania się dwóch pozostałych...). Ten priorytet (bit 5. w GTIACTL) nazywany jest czasem graczem wielokolorowym. Teraz chyba już wszyscy wiedzą o co chodzi... (?).


Tutaj dwie uwagi do wprowadzania zmian w priorytetach (klawiszami "O" i "F"):


- po każdorazowym załadowaniu grafiki albo czyszczeniu obrazu (Shft+Ctrl+Tab) GED przywraca początkowe wartości w priorytetach (włączony zostaje 1. priorytet PMG-"Playfield", itd. );


- Zmiany w priorytetach działają linię niżej (co NAJMNIEJ, jeśli nie ma dużej ilości zmian rejestrów w tym miejscu) od miejsca ustawienia !


Umieszczanie PMG:

Wciśnięcie klawisza Shift+1-8 ustawia poziomą początkową pozycję obiektu PMG, odpowiadającą aktualnej pozycji kursora. To działa trochę odmiennie w zależności od tego, czy kursor jest umieszczony na 1. linii u góry ekranu, czy też gdziekolwiek indziej poniżej. W pamięci istnieje tabela, która przechowuje początkowe atrybuty (właściwości) dla wszystkich rejestrów PMG. Są w niej dane kolorów, priorytetów, szerokości i pozycja 1. duszka. Pozycja drugiego duszka otrzymywana jest przez dodanie do pierwszego jego szerokości. Podobnie jest z trzecim i czwartym duszkiem. Następne w kolejności są pociski. Przed wyświetleniem obrazka wartości z tej tablicy są przepisywane do rejestrów sterujących PMG. W każdej linii ekranowej można zmienić jedną z wartości sterujących PMG. Jeśli zrobisz się to stojąc w 1. linii (gdzie znajduje się tablica atrybutów), to wartość ta będzie wpisana do tablicy. Oznacza to, że w 1. linii można zmienić wszystkie wartości, natomiast w pozostałych, niższych liniach tylko jedną. Jeśli więc najpierw w jakiejś linii zmienisz kolor duszka, a następnie w tej samej linii jego szerokość, to ta zmiana koloru nie zostanie w tej linii uwzględniona. Inaczej będzie w 1. linii ekranowej, gdzie obydwie zmiany będą uwzględnione. Praktycznie rzecz biorąc, to, że 1. linia obrazu ma takie korzyści, dużo nie daje, skoro reszta linii ma dużo mniejsze możliwości... Ale warto wiedzieć o tej różnicy... Acha, pisząc "1. linia obrazu", mam na myśli pierwszą linię na górze ekranu, gdzie można rysować, umieszczać obiekty PMG, itd. (a nie sam szczyt ekranu, powyżej ikon informacyjnych GED'a !)...


Jeśli nie zrozumiałeś dobrze powyższego tekstu o tabeli wartości PMG w GED i ograniczeniach w modyfikacji rejestrów duszków, to... spróbuję to przedstawić trochę inaczej, jeszcze raz, poniżej.


Zmiany w rejestrach PMG nie są automatycznie umieszczane w każdej linii obrazu i taka zmiana rejestru PMG będzie działać (będzie widoczna) w każdej linii, od pozycji kursora, aż do samego dołu ekranu, lub do miejsca poniżej, gdzie ten rejestr był później zmieniany. Dlatego zmiany w PMG działają nieco inaczej w porównaniu z trybem "playfield".

Wszystkie atrybuty PMG mają swe wartości początkowe w specjalnej tablicy, która mieści się na szczycie ekranu (tzn. w 1. linii ekranowej). Kiedy kursor jest na samej górze, gdy podajesz programowi jakąś komendę sterującą PMG, ta zmiana zajdzie w tejże tablicy i możesz zmieniać wszystkie wartości atrybutów (właściwości) PMG w ten sposób (Shft + Ctrl + "-" przydaje się, aby przejść na samą górę ekranu). Zatem można tu zmieniać kilka parametrów PMG naraz.

Jeśli jednak kursor jest częściowo na dole ekranu, każda komenda dla PMG będzie musiała używać procedury przerwania DLI, która może zmieniać tylko jeden atrybut (np. szerokość duszka) naraz. Po prostu na tylko tyle (dla PMG) pozwala czas w procedurze DLI. Jeśli wprowadzisz jeszcze jedną (inną) komendę dla PMG w tej samej linii, GED będzie szukał najbliższą NIEUŻYWANĄ (jest to linia, która nie zawiera zmiany rejestru PMG; linia ta może zawierać dane koloru "playfield" lub dane obiektu PMG) linię obrazu POWYŻEJ pozycji, którą edytujesz. Kursor zostanie przeniesiony na tę znalezioną, wolną linię, aby dać Ci znać, gdzie została umieszczona komenda. Jeżeli GED natrafi na szczyt ekranu (1. linię ekranową) albo będą sprzeczne (konfliktowe) komendy przed znalezieniem nieużywanej linii, obraz mrugnie krótko, aby poinformować Cię, że ta komenda nie mogła być wykonana. Kursor zostanie umieszczony na konfliktowej pozycji.


Problemy:

... są nieodzownym elementem tego świata. Oczywiście nie mogło ich zabraknąć także w GED... ;-)). GED, jako chyba pierwszy program, stosujący nową technikę łączenia wielokrotnych zmian kolorów w linii ekranowej z pełnym wykorzystaniem możliwości PMG, ma także pewne ograniczenia, wynikające po prostu z ograniczeń sprzętowych...

Podczas nakładania PMG na kolory "playfield" (wraz ze zmienianiem któregoś z priorytetów) może się zdarzyć, że gdy zapragniemy coś zmienić (np. przenieść lub wykasować) w dokonanej komendzie na PMG, okaże się to (z pozoru) niemożliwe. Szczególnie dotyczy to pocisków. Po prostu mogą "nie chcieć" dać się ponownie zedytować w danym miejscu. Trzeba wtedy próbować różnych kombinacji - zmiany priorytetów, usunięcia najpierw koloru "playfield" z pozycji na której jest duszek, itd. Powinno się udać, tyle że po pewnych staraniach... ;-)

Możesz spotkać się z innym problemem, polegającym na tym, że jeśli masz dużą liczbę zmian rejestrów, do czasu gdy GED znajdzie 'nieużywaną linię' (dobrą do zmiany jednego z rejestrów PMG), może być to dość daleko powyżej Twojej pozycji kursora. Wtedy lepsze może okazać się zmienianie innego rejestru i zostawienie tego poprzedniego w "spokoju"... Np. powiedzmy, że masz dwa małe obiekty na ekranie (wypełnione jednym kolorem "playfield" kwadraty, jeden pod drugim), które próbujesz podkolorowć z użyciem PMG. Te obiekty są oddzielone jedną wolną linią skanową (ekranową) między sobą. Wciśnij "P", 2x "F" (zmiana priorytetu - aby PMG pokazało się na kolorach "playfield"), ustaw kursor na lewy górny róg niższego obiektu i wciśnij Shift + 1, by przesunąć gracza na nowe miejsce. "Wpixeluj" duszka i wtedy użyj Shft + strzałki w celu zmiany koloru tego obiektu (zrób to będąc na "szczycie" duszka). Ponieważ ta linia obrazu była już użyta do przechowania zmiany pozycji PMG, GED użyje pustą (wolną) linię między tymi dwoma obiektami. Teraz decydujesz, że drugi (niższy) obiekt musi być większy i potrzebujesz zrobić szerszego gracza, by "zakryć" niższy obiekt. Kiedy wciśniesz ">" w tym punkcie (tzn. w 1. linii drugiego obiektu, albo w pustej linii między obiektami), najbliższa wolna linia (dla zmiany rejestru PMG) jest na samym dole 1. obiektu i zmienianie tam gracza, może zmienić wygląd 1. obiektu... Gdy zachodzi coś takiego, możesz najpierw wcisnąć Shift + 0, aby skasować tą ostatnią zmianę rejestru (niekorzystną dla 1. obiektu). Powinieneś wtedy jeszcze sprawdzić obraz, aby zobaczyć, czy są inne sposoby osiągnięcia tego, czego chcesz. Może się okazać, że nie potrzebujesz dodatkowej szerokości dokładnie w tym miejscu i możesz ją wprowadzić trochę dalej, poniżej tego obiektu. Może także nie być sposobu na zrobienie tego, czego chcesz i jedynym wyjściem jest przejść do edycji innego obiektu, albo zmienić coś w aktualnie 'obrabianym' obiekcie.

Są jeszcze inne rzeczy, które możesz robić w "ciasnych" miejscach, włącznie z edytowaniem lub nieznacznym przesuwaniem obiektów w celu umożliwienia zmian rejestrów i umiejętnym 'krzyżowaniem' PMG z 'komórkami koloru' trybu "playfield".

Inną sprawą jest to, że jeśli nowa zmiana koloru jest stosunkowo blisko do poprzedniej wartości koloru i nie możesz dokonać tej zmiany dokładnie na pierwszym pikselu, gdzie potrzebujesz koloru, może być ona całkowicie niezauważalna. Ludzie mogą nawet nie zauważyć kilku pikseli w odmiennym kolorze. Ten efekt występuje raz na obrazku "MARTIAN.GED". Czy możesz tam odnaleźć to miejsce ?


Wskazówki do kolorowania:

Standardowy tryb priorytetu PMG w GED jest ustawiony tak, aby rysować obiekty PMG za standardowym ("playfield") obrazem. W tym trybie obiekty PMG będą widoczne tylko we fragmentach obrazka, które są "wyczyszczone" (tzn. tam, gdzie jest kolor tła). To jest często najlepsze rozwiązanie, bo możesz tworzyć duszki z maksymalną szerokością i 'maskować' je z przodu którymś z kolorów "playfield" na całym ekranie. Zauważ, ze gdy pociski są jako 5-ty gracz, to tenże obiekt PMG (5. gracz) pojawi się "z przodu" wszystkich kolorów "playfield", bez względu na ustawione priorytety.


Na tym pragnąłbym zakończyć ten (przydługi) opis edytora "GED"... Mam nadzieję, że zachęciłem trochę osób do jego używania i oszczędziłem im męki samodzielnego 'rozgryzania' GED'a, której to "przyjemności" osobiście doświadczyłem. Przygotowując ten opis korzystałem z oryginalnej instrukcji do GED'a autorstwa J.Harrisa oraz sporej ilości własnych spostrzeżeń odnośnie GED.


Dodatkowym plikiem do tego artykułu jest "GEDSTUF2.ARC", w którym jest parę ciekawych obrazków, demonstrujących wykorzystanie GED'a w praktyce. Zawarłem tam też dodatkowe uwagi o GED...


GED viewer

jaskier
autor: jaskier

Wielu z Was zapewne słyszało o pewnym programie graficznym, zwanym skrótowo GED. Napisany został on w 1993 roku przez Johna Harrisa. Jest to program, który pod względem możliwości graficznych znajduje się gdzieś w pierwszej piątce wszystkich programów graficznych na Atari. Również pod względem ilości wbudowanych opcji ten program znajduje się w pierwszej piątce, tyle że od tyłu.

Jednak, mimo braku nawet najbardziej elementarnych opcji, program jest szeroko używany przez grafików różnych maści. Jest to spowodowane tym, że program udostępnia chyba najwięcej (na oko jakieś 20%) możliwości graficznych Atari, spośród wszystkich innych programów graficznych.

Pomysł, aby nie tylko zmieniać kolory co linię, ale również w jej środku, a ponadto dodać pełnię możliwośći PMG, oddzielne dla każdego ghosta kolory i szerokości, priorytety i inne zabawki, jest wspaniały. Naprawdę wielkie brawa dla Johna Harrisa.

Ach gdyby nie ta zapierająca dech obsługa.

Program niestety posiada również inną wadę, ujawniającą się niestety najpóźniej, bo już po narysowaniu całego obrazka. Do programu mianowicie nie dołączono procedury, którą można by umieścić we własnym programie, aby pokazać w nim własny obrazek narysowany w GED-zie. Tą niedogodnością jakiś czas temu zaciekawił mnie Dracon/USG/Taquart. Poprosił mnie mianowicie (po tym jak odmówił mu Konop i paru innych koderów) o napisanie takiej procedury, gdyż potrzebował jej do swojego slideshowu. Po przejrzeniu GED-a za pomocą wszystkich dostępnych mi debuggerów (z których każdy niestety pokazywał to samo) zabrałem się do pracy.

Oto wynik moich poszukiwań. (Pełny tekst programu znajduje się w zarchiwizowanym pliku jako GEDVIEW.ASM.)

Dane program trzyma od adresu $5330, do adresu $7F4F. Zapisywane jest to jednym ciągiem w formacie DOS-owym to znaczy z bajtami $FFFF, $5330, $7F4F na początku.

Zmieniając adres danych można zmieniać tylko pierwszą cyfrę, gdyż Antic ma głupi zwyczaj dane obrazka pobierać tylko z czterech kilobajtów.

Kilka linii przed początkiem obrazka zaczyna się przerwanie. Jest ono docyklowane z dokładnością do 0.001 cykla, tak więc należy zwracać uwagę na to, że:

Mój program został przystosowany do umieszczenia na początku strony. Wszelkie zmiany tego położenia, a także wszelkie zmiany w programie mogą zmienić położenie pętli umieszczonych w przerwaniu. Pętla, której początek i koniec znajdują się na dwu różnych stronach może znaleźć się na jednej stronie, a tym samym rozkaz skoku na początek pętli (bpl) będzie działać o 1 cykl krócej. Należy również uważać na to, że display list musi znaleźć się cały w jednym kilobajcie. Ponadto zaraz za programem należy zostawić 10KB wolnego, gdyż umieszczany jest tam program przerwania generowany dopiero po uruchomieniu mojej procedury.

Oto skrócony opis programu, dla tych, którzy chcieliby poznać sposób, w jaki pokazuje się obrazki z GED-a.

Najpierw opis danych:

Osiem tablic po 200 bajtów zawiera dane zmian kolorów itp. robionych co linię:
- tb2, tb3, tb4, tb5, tb6, tb7, tb8, tb9 dane ośmiu zmian kolorów w linii, kolejno: kolor 1, 2, 3, 1, 2, 3, 1, 2.

Oprócz tych zmian można dokonywać również co linię jednej ze zmian w ghostach (kolor, szerokość itp.) lub koloru tła. Wartości tych zmian zawiera tablica tb0, zaś komórki, które trzeba zmieniać tablica tb1.

-dane- szesnaście komórek:

0,1,2,3
4
5
6
7
8
9,10,11,12
13

14

15
kolory wpisywane do $d012-$d015
szerokości playerów (po dwa bity od najstarszych wpisywane do $d008-$d00b)
szerokości missilów ($d00c)
priorytety ($d01b)
kolor missilów (do $d019)
kolor tła ($2c8 lub $d01a)
położenia poziome graczy (komórki od $d000 do $d003)
położenie poziome pierwszego missila, do pozycji następnych dodawana jest szerokość poprzedników
numer opóźnienia przerwania i tym samym miejsca zmiany kolorów. W GED-dzie ustawia się to klawiszami [,] i [.])
nieużywane.

-obr1,obr2- dane obrazka podzielone na dwie części z powodu pewnej wady Antica.

A teraz opis kilku części programu:
   lda >pmg-$300 pierwsze 3 strony nie są
   sta $D407     używane, więc stąd ten adres.

   lda <end      Generuje początkowe
   sta addr      bajty umieszczane za
   lda >end      etykietą END. Najpierw
   sta addr+1    na podstawie dane+14
   lda dane+14   umieszczane są 4 bajty,
   asl @         które nic nie robią, ale
   asl @         dają różne opóźnienie.
   adc #3        Owe czwórki bajtów
   tax           umieszczone są pod
   ldy #3        etykietą proc3.
s1 lda proc3,x
   sta (addr),y
   dex
   dey
   bpl s1

Teraz adres jest zwiększany o 4:

   lda <end+4
   sta addr
   lda >end+4
   sta addr+1

i dalej będzie procedura generująca 200 razy prog. zmieniający kolory w każdej linii. (Jest za długa aby ją tu umieszczać.) Składa się ona ze zwykłego przepisania wartości z tablic, tak aby przerwanie nie marnowało czasu na długie rozkazy typu:

   lda tb4+175

ale zadowalało się rozkazami typu:

   lda #$16

(wartość $16 została wcześniej pobrana z tablicy tb4+175). Zysk: 1 cykl.

Każdy fragment przerwania kończy się rozkazem inc 0, które nie ma niczego robić, ale tylko zająć 5 cykli, tak aby czas tworzenia 1 linii przez Antic był równy czasowi wykonywania tego fragmentu przerwania przez procesor. Jednakże, pamięć obrazka została podzielona na dwie części i kiedy Anticowi podaje się do żarcia tę drugą część (w dliście wygląda to jak: dta b($4e),a(obr2)), to procesor ma o 2

   pla              cykle mniej czasu.
   clc              Należy więc zmienić ten
   adc #1           rozkaz na lda 0, który
   cmp #$66         zajmuje 3 cykle.
   bne s4           Ten program rozpoznaje
   pha              właściwy wiersz i
   dec addr+1       dokonuje drobnej zmiany
   ldy #$fe         (bajt $a5) w już wygene-
   lda #$a5         rowanym fregmencie
   sta (addr),y     programu.
   inc addr+1
   pla
s4 cmp #$c8         a tu sprawdza, czy to już
   bne s2           wszystkie linie.
   ldy <proc3-proc2 z kolei tutaj
s5 lda proc2,y      generowana jest
   sta (addr),y     procedura
   dey              wyjścia z
   bpl s5           przerwania.

   lda dane+5       Ten fragment programu
   ldx #0           jest o tyle ciekawy, że
   ldy #$ff         wykorzystany jest tutaj
s6 iny              nic nie robiący rozkaz
s7 lsr @            bit $4a. Kiedy jednak
   bcc s9+1         wykonamy skok w bajt
   lsr @            stanowiący operand $4a
   bcc s8           to wykona się rozkaz
   inx              lsr @. Pozwala to znacznie
   inx              skrócić program. Polecam
   inx              tę sztuczkę każdemu.
   inx              Ten fragment akurat
s8 inx              dokonuje ustawienia
   inx              położeń pocisków na
s9 bit $4a          podstawie dane+5 oraz
   inx              ich szerokości. Ponieważ
   inx              to nieistotne część
   pha              programu wyrzuciłem:
   ...
   ...
   pla              (akurat tę zapisującą
   cpy #3           już wartości) i zostawiłem
   bne s6           wyjście z pętli.

Teraz rzecz najgorsza, czyli programy pracujące w przerwaniach. Na początek procedury przepisywane. (Patrz wyżej.)

-PROC1 to procedura wygenerowywana 200 razy. Była już o niej mowa wcześniej.
-PROC2 to procedura kończąca przerwanie.
-PROC3 zawiera kilka 4-bajtowych procedur służących ustawieniu (z dokładnością do 1 cyklu) miejsca zmian kolorów. Kazda 4-ka bajtów różni się czasem wykonywania.
-DL tu się zaczyna przerwanie. Zwykłe ustawianie wartości itp. Jedyny ciekawy fragment to:

   ldx #11          ciekawy dlatego, że nic nie
   dex              robi. Chodzi tutaj jedynie o
   bne *-1          przeczekanie trochę cykli
   lda (0,x)        aż sprawa nie przycichnie...
   lda 0            tfu... co ja mówię!!!

end equ *

od tego miejsca wpisywane są poszczególne procedury: 4 bajty wzięte z PROC3, następnie 200*PROC1, a w końcu PROC2.

Jak widziecie metoda pokazywania obrazków stworzonych GED-em (gadem?) jest dość prosta.

JASKIER/TAQUART