PowerGraphics 1.0 - instrukcja obsługi Nie wiem, czy pisanie tego tekstu ma jakikolwiek sens, bo na wstępie muszę ostrzec, że programik jest trochę trudny w obsłudze. Jeśli dla kogoś jest zbyt skomplikowany, to niech go nie używa albo się ze mną skontaktuje. No a do czego służy takie cudo? Ogólnie rzecz biorąc, do tworzenia grafiki. A tak naprawdę to program ochrzciłem jako asembler graficzny. Graficzny - wiadomo, ale dlaczego asembler? Ano dlatego, że w asemblerze można najwięcej osiągnąć. Tym programem da się zrobić prawie wszystko, na co pozwala atarowska grafika. Jak to działa? Po uruchomieniu ekran nie wygląda zbyt zachęcająco, no ale cóż... Na dole ekranu jest trochę tekstu, szczególnie należy zwrócić uwagę na napis 'LOAD'. Nie to, żeby był taki piękny, ale ponieważ oznacza, że aby cokolwiek zrobić, trzeba coś wczytać. Tym programem nie można nic narysować! Należy mieć wcześniej przygotowany rysunek w jednym z następujących formatów: *.CPR - "Trzmiel" skompresowany *.GR8 - "Trzmiel" nieskompresowany *.PIC - "Koala"/"XL-Art" *.MIC - "Microillustrator"/"Kleks" *.PGR - "PowerGraphics" Format jest utożsamiany z odpowiadającym mu rozszerzeniem nazwy. Jeżeli tak nie jest, to zostanie wyświetlony odpowiedni komunikat. Tak więc pakujemy dyskietkę do stacji 1, wpisujemy nazwę i spacją wybieramy format. Jeżeli odczyt przebiegł bezbłędnie, to znowu zobaczymy czarny ekran. W rogu powinien znajdować się napis 'LINK' oznaczający, że możemy do już wczytanego rysunku dołączyć drugi. Po co to wszystko? Ano dlatego, że niemal wszystkie programy graficzne mają rozdzielczość pionową 192 linie. Jest to pewne marnotrawstwo, ponieważ atarka bez problemu wyświetla 239 linii. Aby je wykorzystać, należy narysować dwa rysunki: jeden przedstawiający górną część obrazka, drugi dolną. Najwygodniej, aby obrazki częściowo pokrywały się. Nie stanowi to problemu, ponieważ PowerGFX automatycznie wykrywa, w którym miejscu obrazki nachodzą na siebie i prawidłowo je skleja. Należy tylko pamiętać, aby obrazki były w tym samym formacie oraz aby na pierwszym obrazku wykorzystana była ostatnia linia, a na drugim pierwsza. Nie wykorzystane fragmenty rysunku powinny pozostać puste (w kolorze tła!). Jeżeli obrazki nie zachodzą na siebie, to zostaną umieszczone jeden pod drugim. Oczywiście nie ma przymusu, aby dołączać drugi rysunek, wyboru dokonujemy spacją. 'None'-'żaden' oznacza, że wystarczy nam już wczytany rysunek. W drugim przypadku należy wpisać nazwę pliku (uwaga! w celu wymazania starej używamy BackSpace). Jeżeli po złączeniu oba obrazki będa zajmować więcej niż 239 linii, to pokaże się komunikat 'Picture too high'. A i jeszcze jedno! Jeżeli wybraliśmy format PGR, to nie będzie 'LINK'a, lecz od razu przejdziemy do edycji. Jeśli szczęśliwie przebrnęliśmy przez proces wczytywania, to naszym oczom powinien ukazać się nasz obrazek na ekranie edycyjnym ('EDIT'). Niby nic się nie stało, a jednak po wczytaniu program wykonał parę czynności nad obrazkiem. Jak już wcześniej wspomniałem, o ile wczytaliśmy dwa obrazki, to zostały sklejone. Następne zostały obcięte puste linii, to znaczy te, które nie zawierają żadnej grafiki. Ponadto jeśli to było możliwe, to został zwężony ekran (32 zamiast 40 bajtów w linii). Obrazek został automatycznie wypośrodkowany w pionie. Mając wczytany rysunek możemy przystąpić do jego obróbki. Zasadniczo pracujemy w jednym z dwóch trybów: EDIT oraz INIT, między którymi przechodzimy przy pomocy klawisza RETURN. Wciskając spację możemy obejrzeć ostateczny efekt naszej pracy. CTRL-L umożliwia wczytanie innego rysunku. CTRL-S powoduje przejście do opcji SAVE, w której wystarczy wpisać nazwę, aby cały rysunek został zapisany w formacie PGR. ESC umożliwia rezygnację z LOAD/SAVE, w pozostałych sytuacjach powoduje powrót do DOSa. Najpierw omówimy opcję INIT, do której, jak już napisałem, wchodzimy RETURNem. Jest to edycja tabeli inicjacji. Co to jest, spytasz pewnie? Aby ci to wytłumaczyć, muszę ci wyjaśnić, jak w ogóle działa ten program. Jeśli jesteś koderem, to nie powinno być to dla ciebie zbyt skomplikowane. Gdyby ktoś nie wiedział, to obraz na ekranie nie jest wyświetlany cały w jednej chwili, lecz jest tworzony linijka po linijce, a każda linia od prawej do lewej. Obraz jest tworzony przez układy ANTIC i GTIA na podstawie zawartości pamięci oraz rejestrów sprzętowych. W pamięci są dane o kształcie rysunku, duszków itp., a w rejestrach kody kolorów, pozycji duszków i takie tam. Wystarczy więc wpisać co trzeba tam gdzie trzeba i obraz zostanie wyświetlony. Zgoda, ale tym sposobem atarowska grafika byłaby zwykle czterokolorowa w rozdzielczości 160*192. A jak to wygląda, to chyba nie muszę każdemu przypominać (chociaż czasami trafi się ciekawy rysunek...). Co robić? Aby uzyskać więcej kolorów i duszków należy zatrudnić procesor. Wystarczy zmieniać zawartość odpowiednich rejestrów w czasie, gdy jest wyświetlany obraz. Po tym nieco długim i może niepotrzebnym wstępie czas na konkrety: jak już wspomniałem obraz tworzą ANTIC i GTIA. Ten pierwszy pobiera dane z pamięci i przesyła je do GTIA. Jego pracą steruje głównie program zapisany w pamięci, znany jako DL. Jest także kilka mniej lub bardziej ważnych rejestrów. Dla nas istotny jest tylko jeden: DMACTL. Aby nieco uprościć pracę, skróciłem jego nazwę do 'DC', podobne skróty mają pozostałe rejestry, należące do układu GTIA. Trzeba tylko wpisać do nich odpowiednie wartości. A jakie? Takie, jakie umieścimy w tabeli 'INIT'. Teraz wyjaśnię, co oznaczają dziwne znaczki w tabeli. Jest tam zapisane, jaka wartość ma się znaleźć w każdym z rejestrów. Np. zapis 32arrowRIGHT DC oznacza, że do rejestru DC zostanie zapisana liczba $32 szesnastkowo. Jedna z liczb jest wyróżniona kursorem, który przesuwamy strzałkami, ale tylko na boki! Przejście do innego wiersza osiąga się przez wyjechanie za koniec wiersza, w którym jesteśmy. Trochę to niewygodne, ale można się przyzwyczaić. Strzałki "góry" i "dół" służą do zmniejszania lub zwiększania o jeden. Można też zwyczajnie wpisać liczbę (dwie cyfry hex.). Tutaj pewna uwaga odnośnie rejestru DC. Jego starsza (lewa) cyfra jest na stałe równa 3. Po prostu nie ma potrzeby jej zmieniania. Drugiej cyfry też nie możemy ustawić dowolnie. Równa zero oznacza wyłączenie obrazu. Wartość 1 oznacza obraz wąski, 2 - szeroki. Szerokość jest automatycz- nie ustawiana przez program po wczytaniu rysunku. Jeśli do tej liczby dodamy 4, to oznacza to włączenie przepisywania pocisków z pamięci, 8 odnosi się do graczy. Mam nadzieję, że wszyscy wiedzą, co to gracze i pociski, bo to nie jest temat na ten artykuł. Dla przykładu: 3EarrowRIGHT DC oznacza włączony szeroki obraz, przepisywanie graczy i pocisków ($E=2+4+8). Pozostaje omówić pozostałe rejestry: P0 - pozycja pozioma gracza 0. Uwaga! Można ją ustawić w ten sposób, że duszek będzie widoczny na ekranie tylko częściowo, albo w ogóle! P1,P2,P3 - jw. dla pozostałych graczy M0,M1,M2,M3 - jw. dla pocisków S0,S1,S2,S3 - szerokość/rozmiar graczy: 00 - normalna (tak jak GR.15) 01 - podwójna (jak GR.9) 03 - poczwórna SM - szerokość pocisków. Za każdy pocisk odpowiedzialne są dwa bity. Koderzy wiedzą, o co chodzi, pozostałym proponuję poniższą metodę: SM = szerokość pocisku 0 + 4*sz.p.1 + $10*sz.p.2 + $40*sz.p.3 gdzie każda szerokość jest ustalana tak, jak dla graczy (czyli 0, 1 lub 3) G0,G1,G2,G3 - rejestry grafiki graczy Jeśli włączyłeś przepisywanie duszków w DC, to zawartość Gx nie jest ważna, w przeciwnym wypadku określają kształt duszka. Duszek ma szerokość 8 pixli, każdemu pixlowi odpowiada 1 bit. Znowu nie będę się wdawał w szczegółowe wyjaśnianie, jeśli dla kogoś jest to trudne, to niech się poradzi osoby znającej się na tym. GM - rejestr grafiki pocisków. Pociski mają szerokość 2 pixle, bity 0 i 1 odpowiadają pociskowi 0, 2 i 3 - 1 itd. R0,R1,R2,R3 - kolory duszków. GC - rejestr kontroli układu GTIA. Lewa cyfra określa włączenie dodatkowych trybów graficznych: 4-"GR.9" 8-"GR.10" C-"GR.11". Dodanie do niej 2 powoduje, że w miejscu, gdzie pokrywają się duszki 0 i 1 oraz 2 i 3 kolor części wspólnej będzie równy wartości OR ich kolorów. Możemy dodać też 1, co spowodu- je, że pociski będą miały wspólny kolor określony w K3 (normalnie pocisk 0 ma kolor taki, jak gracz 0 itd.). Prawa cyfra określa priorytet duszków, czyli to, czy duszki mają przykrywać grafikę, czy na odwrót. Można ją dobrać doświadczalnie albo zerknąć do odpowied- niej literatury. K0,K1,K2 - kolory grafiki. W rozdzielczości "ósemce" K2 oznacza kolor tła, a K1 jasność atramentu, K0 jest nieużywany. W "piętnastce" wszystkie trzy są odpowiedzialne za odpowiednie fragmenty rysunku. K3 - jego rola została omówiona przy GC K4 - kolor ramki/tła To wszystko, co możemy zmienić w 'INIT'. Efekty można od razu zaobserwować na ekranie. Teraz 'EDIT'. Tutaj wpisujemy, jakie rejestry zmienić w poszczególnych liniach. Odpowiednią linię wybieramy naciskając SHIFT oraz strzałki "góra" "dół". Po wciśnięciu SHIFT zostanie "ucięta" część rysunku poniżej linii, w której jesteśmy. Tak więc możemy zobaczyć, jak wygląda linia, nad którą pracujemy. CTRL arrowUP lub arrowDOWN pozwala na przeniesienie do pierwszej/ostatniej linii (jest ich 240, ostatnia ma numer 239=$EF). Pewna niedogodność - przy skrolowaniu rysunku obraz trochę "mruga". Numer linii jest widoczny po 'L='. Obok tego widnieje napis 'D=', który oznacza, jaki rozkaz DL dotyczy tej linii. Dalej mamy 'B=', po którym jest dwójkowy zapis liczby, na której stoi kursor. Poniżej widnieje napis w stylu '00arrowRIGHT A0 00arrowRIGHT A1 ... 00arrowRIGHT AM'. Oznacza on, jakie wartości dotyczące duszków w tej linii znajdują się w pamięci. Pamiętaj, że jeśli nie włączyłeś przepisywania duszków, to te liczby nie będą miały żadnego znaczenia. Jeśli jednak je włączyłeś, to wtedy rola Ax jest taka, jak Gx z tym, że odnosi się tylko do jednej linii. Kursorem poruszamy w sposób identyczny, jak w 'INIT', również tak samo wpisujemy liczby. Jeżeli zejdziemy do wiersza tekstu poniżej, który na razie jest pusty, to okaże się, że tam też możemy wpisywać liczby (i nie tylko). Jest to obszar, w którym wklepujemy PROGRAM w dość specyficznym języku, który jest bardzo podobny do asemblera. Ważna jest więc znajomość podstaw asemblera. Koderzy mogą pominąć następny akapit. W procesorze jest kilka rejestrów, w których można umieszczać liczby. Nas będzie interesował tylko najważniejszy, czyli tzw. akumulator. Aby wpisać liczbę do jakiegoś rejestru, to należy ją najpierw "załadować" do akumulatora i dopiero stąd zapisać ją do rejestru, przy czym raz załadowaną liczbę można wpisać po kolei do kilku rejestrów. Instrukcja odpowiedzialna za załadowanie liczby do akumulatora wygląda tak: LDA #liczba, np. LDA #$3E Instrukcja powodująca zapisanie akumula- tora brzmi tak: STA gdzie, np. STA $d400 Poznamy jeszcze jedną bardzo ciekawą instrukcję: NOP Ta instrukcja po prostu nic nie robi(!). Wbrew pozorom nie jest to bezsensowne, gdyż "wykonanie" tej instrukcji zabiera procesorowi trochę czasu. Otóż należałoby powiedzieć, że wykonanie innych instrukcji też zajmuje trochę czasu. Czas jest mierzony w cyklach. LDA # trwa 2 cykle, STA - 4 cykle, NOP - 2 cykle. To by było na tyle wykładu o asemblerze. Jak więc napisać ten program? Posługujemy się trzema typami instrukcji, dla przykładu: 00 : tak, tak, te dwa zera to jest instrukcja. Powoduje ona wpisanie liczby zero do akumulatora. Jest to po prostu LDA #$00. Możemy podać dowolną, jednobajtową liczbę szesnastkową. arrowRIGHT P0 : a ta instrukcja powoduje zapisanie zawartości akumulatora do rejestru P0. Odpowiada to instrukcji STA. Nie ma potrzeby wpisywania strzałki, należy wpisać pierwszą literę, a potem drugą (ewentualnie cyfrę). -- : instrukcja NOP, uzyskujemy ją przez wciśnięcie CLEAR. Oprócz wpisywania komend mamy pewne (prymitywne) opcje edycyjne: INSERT - działa jak CTRL-INSERT w edytorze systemowym DELETE - jak standardowy CTRL-DELETE SHIFT-INSERT - skopiwanie zapisu w tej linii do linii poniżej z jednoczesnym przejściem do tej linii / - zmiana LDA/STA, właściwie to nieprzydatna. Poprawiania dokonujemy najeżdżając w odpowiednie miejsce i wpisując nową instrukcję. Warto zauważyć, że czas trwania instrukcji jest proporcjonalny do tego, ile znaków ona zajmuje ('xx' - 2 cykle, 'arrowRIGHT xx ' - 4, '--' - 2). W każdej linii mamy pewną ilość czasu, która ogranicza ilość instrukcji, jakie możemy wpisać. Trzeba też pamiętać, że jeśli zmienimy kolor w połowie wyświetlania linii, to kolor zmieni się w środku linii. Ten sam kolor można więc zmieniać kilkukrotnie uzyskujac więcej niż 4 kolory w linii, nie mówiąc już o tym, że w każdej linii możemy ustawić inne kolory. Możliwa jest także zmiana rozdzielczości w środku linii, dwukrotne wyświetlenie tego samego duszka itp. Efektów możliwych do uzyskanie jest naprawdę sporo, chociaż wymagają one pewnego nakładu pracy. To by było na tyle o obsłudze tego skromnego programiku. Jeśli masz z nim jakieś problemy, chcesz coś więcej wiedzieć, to skontaktuj się ze mną. Zrób to także, jeśli udało ci się cokolwiek zmajstrować przy pomocy PG. Nie będę więcej pisał, bo ten tekst i tak jest za długi. Program powstał w styczniu 1996. Program i instrukcję napisał Fox 01/03/96 18:11 Adres: Piotr Fusik / Fox ul. Cicha 9 05-300 Mińsk Mazowiecki