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

