---------------Proszë zîoûyê dwuszpaltowo---------------


Krtótki kurs asemblera -- Intuition
-----------------------------------

EKRANY

<lead>Na dzisiejszej lekcji zajmiemy sië omówieniem gîównych
poleceï biblioteki INTUITION, ale zanim do tego przejdziemy,
kilka sîów o samej bibliotece.

<a>Bartek Pampuch

<txt>"intuition.library" tworzy interfejs graficzny uûytkownika
(Graphical User Interface). Biblioteka ta odpowiada za wyglâd
otwieranych okienek, menu górnego, gadûetów (przycisków w oknie)
itd.

Na poczâtek zapoznam Was z nastëpujâcymi rozkazami (naleûy
pamiëtaê, ûe przed ich uûyciem w rejestrze A6 powinien sië
znaleúê adres otwartej biblioteki intuition.library, zwrócony
przez polecenie OpenLibrary):


Nazwa:	_LVOOpenScreen (-198)

Funkcja:	Polecenie to tworzy i "otwiera" nowy ekran w oparciu o
podanâ strukturë NewScreen

Wejôcie:	A0 -- Adres wskazujâcy na strukturë typu NewScreen

Wyjôcie:	D0 = 0 Jeûeli próba otwarcia ekranu sië nie powiodîa

	D0 = adres wskazujâcy na strukturë typu Screen (nowo otwartego
ekranu), jeûeli ekran zostaî pomyôlnie otwarty 

Uwagi: Struktura typu NewScreen ma nastëpujâcâ postaê:

<l>STRUCTURE NewScreen,0

  WORD ns_LeftEdge ; lewa pozycja ekranu

  WORD ns_TopEdge  ; górna pozycja ekranu

  WORD ns_Width    ; szerokoôê ekranu

  WORD ns_Height   ; wysokoôê ekranu

  WORD ns_Depth    ; (opisane poniûej)

  BYTE ns_DetailPen ; kolor 1 uûywany do rysowania

   ; szczegóîów takich jak tekst w pasku tytuîowym

  BYTE ns_BlockPen ; kolor 2 uûywany do rysowania

   ; wypeînieï -- miëdzy innymi kolor paska tytuîowego

  WORD ns_ViewModes ; (opisane poniûej)

  WORD ns_Type ; opisane poniûej

  APTR ns_Font ; opisane poniûej

  APTR ns_DefaultTitle ; tytuî okna

  APTR ns_Gadgets ; nie uûywane -- musi byê 0

  APTR ns_CustomBitMap ; opisane poniûej

LABEL ns_SIZEOF

<txt>ns_Depth to tak zwana "gîëbia" ekranu lub, jak kto woli,
liczba bitplane'ów (opis bitplane'ów juû za miesiâc).

Aby obliczyê rzeczywistâ liczbë kolorów, jakâ moûna bëdzie
uzyskaê na otwartym przez nas ekranie, naleûy podnieôê "2" do
potëgi ns_Depth (pomijam tryby HAM i HAM8). Przykîadowo: jeûeli w
polu ns_Depth wpiszemy: 3, bëdziemy mogli na naszym ekranie
wyôwietliê osiem kolorów (2*2*2=8);

UWAGA! Musimy pamiëtaê o ograniczeniach sprzëtowych. Na Amidze
500 nasz program nie otworzy ekranu, jeûeli jako ns_Depth podamy
8 (odpowiadajâce 256 kolorom).

ns_ViewModes opisuje graficzny tryb naszego ekranu. Moûemy tutaj
uûyê kombinacji nastëpujâcych wartoôci: HIRES (duûa rozdzielczoôê
pozioma = 640) LACE (duûa rozdzielczoôê pionowa = 512) SUPERHIRES
(bardzo duûa rozdzielczoôê pozioma = 1280) EXTRA_HALFBRITE (ekran
ma tryb EHB -- zwiëksza to liczbë kolorów) HAM (ekran ma tryb HAM
-- jeszcze bardziej zwiëksza to liczbë kolorów: na Amigach bez
kart graficznych ani koôci AGA -- liczba dostëpnych kolorów w
trybie HAM wynosi 4096; natomiast na Amigach wyposaûonych w koôci
AGA liczba ta wynosi: 262144) SPRITES (ekran uûywa SPRITE'ów --
na razie nieistotne) DUALPF (ekran ma tryb DUAL PLAYFIELD MODE --
na razie nieistotne);

Niektóre parametry moûemy îâczyê. Dla przykîadu: jeûeli chcemy
otworzyê ekran o duûej rozdzielczoôci pionowej i poziomej, pod
ns_ViewModes podstawiamy: HIRES+LACE lub HIRES|LACE; absurdalne
jednak jest îâczenie takich wartoôci, jak: HIRES+SUPERHIRES;

Oczywiôcie powyûsze nazwy sâ nazwami umownymi i ûaden program
asemblujâcy ich nie zrozumie (wyôwietli komunikat o bîëdzie),
jeûeli ich uprzednio nie zdefiniujemy. Moûemy zamiast tych nazw
bezpoôrednio podawaê liczby albo zdefiniowaê je na poczâtku kodu
úródîowego:

<r>
LACE = 4

SUPERHIRES = $20

EXTRA_HALFBRITE = $80

DUALPF = $400

HAM = $800

SPRITES = $4000

HIRES = $8000

<txt>
UWAGA! Posiadacze systemowych INCLUDE'ów mogâ nie definiowaê tych
wartoôci, a w zamian na poczâtku kodu úródîowego doîâczyê plik
"graphics/view.i".

ns_Type opisuje typ ekranu. Moûemy tutaj podaê: CUSTOMSCREEN
(nasz ekran jest naszym wîasnym ekranem i okna innych aplikacji
nie mogâ byê na nim otwierane), CUSTOMBITMAP (nasz ekran ma
zdefiniowane bitplane'y -- to w wypadku, gdy chcemy na tym
ekranie wyôwietliê jakiô rysunek -- zajmiemy sië tym na nastëpnej
lekcji), SCREENBEHIND (ekran otwierany jest pod innymi ekranami),
SCREENQUIET (na naszym ekranie nie bëdzie podstawowych
systemowych gadûetów, takich jak przycisk gîëbi, sîuûâcy do
przechodzenia na inne ekrany, ani nawet paska tytuîowego itd.),
PUBLICSCREEN (nasz ekran widziany jest przez inne aplikacje i
mogâ one otwieraê na nim swoje okna).

Tak samo jak w powyûszym wypadku podawane wartoôci muszâ byê
uprzednio zdefiniowane (lub przyîâczone z pliku:
"intuition/screens.i"):

<r>
CUSTOMSCREEN = $F

CUSTOMBITMAP = $40

SCREENBEHIND = $80

SCREENQUIET = $100

PUBLICSCREEN = 2

<txt>
ns_Font to adres struktury opisujâcej krój pisma, uûywany przez
nasz ekran. Moûemy wpisaê tu 0, a wtedy uûyty zostanie domyôlny
krój pisma (czyli topaz lub topazpl, chyba ûe jako domyôlne macie
ustawione inne czcionki).

ms_DefaultTitle wskazuje na adres, pod którym znajduje sië nazwa
ekranu. W kodzie úródîowym naleûy tu podaê nazwë etykiety, pod
którâ zapiszemy nazwë ekranu.

ns_CustomBitmap wskazuje na adres struktury BitMap (opisujâcej
grafikë wyôwietlanâ na Twoim ekranie). Zawartoôê tego pola jest
brana pod uwagë tylko wtedy, jeôli ns_Type jest CUSTOMBITMAP.
Najlepiej na razie (do przyszîego miesiâca) podawajcie tutaj 0.

Jak juû powiedziaîem, polecenie OpenScreen zwraca do rejestru D0
adres struktury typu Screen (chwilowo nie bëdë jej opisywaî). Na
razie wystarczy, aby poczâtkujâcy programista zapamiëtaî, ûe
zwracana (przez _LVOOpenScreen) wartoôê jest "adresem otwartego
ekranu" (w skrócie OSA -- Opened Screen Address). Osobom chëtnie
chîonâcym wiedzë polecam artykuî "Asembler i grafika" Duddie'go z
MA 5/93 (strona 61).

UFF! Skoïczyliômy opis pierwszego rozkazu INTUITION. Skoro
istnieje polecenie otwierajâce ekrany, musi teû istnieê rozkaz
zamykajâcy:

Nazwa:	_LVOCloseScreen (-66)

Funkcja:	Zamyka otwarty uprzednio ekran i usuwa strukturë Screen z pamiëci

Wejôcie:	A0 - OSA otwartego ekranu (adres zwrócony przez polecenie OpenScreen)

Wyjôcie:	Od systemu V2.00:

	D0 = 0 jeôli próba zamkniëcia ekranu sië nie powiodîa

	D1 = 1 jeôli ekran zostaî zamkniëty

W niûszych wersjach systemu funkcja nie zwraca ûadnej wartoôci (a
przynajmniej tak twierdzi dokumenctacja, którâ dysponujë).

Skoro umiemy juû otwieraê ekran, spróbujmy go przesunâê:

Nazwa:	_LVOMoveScreen (-162)

Funkcja:	Zmienia aktualnâ pozycjë ekranu

Wejôcie:	A0 - OSA otwartego ekranu

	D0 -- przesuniëcie poziome ekranu (poniûej systemu v2.00 musi
byê ustawione na 0, gdyû nie jest tam moûliwe poziome przesuwanie
ekranów)

	D1 -- przesuniëcie pionowe ekranu (moûe byê dodatnie lub ujemne
zaleûnie od kierunku przesuwania ekranu)

Wyjôcie: BRAK

A oto dwa polecenia zwiâzane nieco z ekranem Workbencha:

Nazwa:	_LVOWBenchToFront (-342)

Funkcja:	Ustawia ekran WorkBencha jako pierwszy -- wysuwa go przed
                inne ekrany (jeûeli ekran WorkBencha jest juû pierwszy, funkcja
                nie daje rezultatu)

Wejôcie:	BRAK

Wyjôcie:	Jeûeli ekran Workbencha byî otwarty, funkcja ta ZAWSZE dziaîa
                poprawnie i zwraca do rejestru D0=1

                Jeûeli ekran Workbencha byî zamkniëty, czyli
                próba przeniesienia go przed inne ekrany sië nie powiodîa, do
                rejestru D0 zwracane jest 0

Analogicznie funkcja _LVOWBenchToBack (-336) ustawia ekran
Workbencha jako ostatni. Wejôcie i wyjôcie _LVOWBenchToBack jest
takie samo, jak w wypadku rozkazu _LVOWBenchToFront.

To juû wszystkie DZISIEJSZE rozkazy "intuition.library". Moûe ich
liczba nie jest zadowalajâca, ale musimy jeszcze przygotowaê plik
"moj_intui_1.i"

Aby moûliwe byîo korzystanie z rozkazów biblioteki INTUITION,
naleûy kilka rzeczy zdefiniowaê. Aby nie robiê tego za kaûdym
razem, kiedy piszemy program, utworzymy plik "moj_intui_1.i"
(podobny do moj_dos.i, ale dotyczâcy innej biblioteki). Nazwaîem
go "moj_intui_1.i", poniewaû podczas poznawania INTUITION liczba
takich definicji bëdzie sië zwiëkszaê, a my zakîadaê bëdziemy
kolejne pliki: "moj_intui_2.i", "moj_intui_3.i" itd.

A oto zawartoôê "DF0:moj_intui_1.i":

<l>

; definicje rozkazów

_LVOOpenScreen = -198

_LVOCloseScreen = -66

_LVOMoveScreen = -162

_LVOWBenchToBack = -336

_LVOWBenchToFront = -342

; struktury

; w to miejsce przepisz strukturë zamieszczonâ na poczâtku

; tego artykuîu zaczynajâc liniami

STRUCTURE NewScreen,0

  WORD ns_LeftEdge 

  ...

; a koïczâc na

  APTR ns_CustomBitMap

LABEL ns_SIZEOF

<txt>
Teraz, skoro mamy plik "moj_intui_1.i", moûemy przystâpiê do napisania
prostego programu.

<l>
	INCDIR DF0:

	INCLUDE moj_dos.i

	INCLUDE moj_intui_1.i

_LVOOpenLibrary = -552

_LVOCloseLibrary = -414

	; tu kod otwierajâcy bibliotekë DOS

	; i zapisujâcy jâ pod DosBase

	...

	move.l  D0,DosBase

	; tu kod otwierajâcy bibliotekë INTUITION, zapisujâcy

	; jâ pod IntBase i przesyîajâcy jej adres do A6

	...

	move.l  D0,IntBase

	move.l  IntBase,A6

	lea   MojEkran,A0

	jsr  _LVOOpenScreen(A6)

	tst.l D0 ; sprawdzamy czy sië udaîo

	beq.s NieMaEkranu ; jeôli nie ma -- skok do NieMaEkranu

	; jeûeli natomiast sië udaîo

	move.l D0,OSA ; zapisz adres otwartego ekranu

	; teraz bëdziemy korzystaê z polecenia biblioteki DOS

	move.l DosBase,a6

	; polecenie odczekujâce 2 sekundy

	move.l #100,d1

	jsr _LVODelay(A6)

	; znowu korzystamy z biblioteki INTUITION

	move.l IntBase,A6

	; przesuwamy ekran o 50 pikseli w dóî

	move.l OSA,a0

	move.l #0,d0

	move.l #50,d1

	jsr _LVOMoveScreen(a6)

	; tu procedura odczekujâca 2 sekundy (przypominam

	; o uprzednim przesîaniu DosBase do a6, a nastëpnie

	; po wykonaniu rozkazu Delaz ponownym przesîaniu

	; IntBase do a6)

	; teraz przywracamy ekranowi poprzedniâ pozycjë

	move.l OSA,a0

	move.l #0,d0

	move.l #-50,d1

	jsr _LVOMoveScreen(a6)

	; tu procedura odczekujâca 2 sekundy

	jsr _LVOWBenchToFront(a6)

	; procedura odczekujâca 2 sekundy

	jsr _LVOWBenchToBack(a6)

NieMaEkranu:

	; zamkniëcie bibliotek DOS i INTUITION

	rts

DosBase: ds.l 1

IntBase: ds.l 1

OSA: ds.l 1

IntName: dc.b "intuition.library",0

DosName: dc.b "dos.library",0

<txt> To juû wszystko na dzisiaj! Jeszcze tylko jedna uwaga: w
cyklu "Kurs asemblera" czësto wkradajâ sië drobne bîëdy, z
którymi nie wszyscy potrafiâ sobie poradziê. Wszelkie pytania
proszë przesyîaê pod adresem redakcji lub pod e-mail:
m.pampuch@lupus.waw.pl.
