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



