AMIGA REVIEW obsah časopisu online!
  Domov     Software     Hry     Obaly     Download  

Programátorský servis

Michal Kára

Testování tlačítek na myši
Levé tlačítko na myši má přímo svůj bit. Je to bit číslo šest na adrese $BFE001. Tento bit je 1, pokud je tlačítko uvolněné a 9 pokud je stištěné. Jeho test by tedy mohl vypadat nějak takto:

LMBLoop: btst #6,$BFE001
bne loop

S pravým a popřípadě prostředním tlačítkem je to složitější. Při držení pravého tlačítka se mění bajt na adrese $DFF012, při držení prostředního na adrese $DFF013. Test pro pravé tlačítko (pro prostřední jen změnit 012 na 013):

lea $DFF012,a0
move.b (a0),d0
RMBLoop: cmp.b (a0),d0
beq.s RMBLoop
rts

Nutno ovšem podotknout, že tento způsob se hodí pouze u dem nebo nesystémových her. Pokud programujete systémový program, obloukem se mu vyhněte a raději použijte služeb intuition.library (viz dále).

Zobrazení reálných čísel v počítači a matematické knihovny
Následující popis bude založen na desítkové soustavě ale stejné principy se používají i pro dvojková čísla. Reálná čísla (t.j. ne celá) se v počítači zobrazují pomocí tzv. exponentu a mantisy. O co jde? Každé číslo v desítkové soustavě je možno napsat jako A krát 10 na B kde A je v rozsahu od -1 do 1. Například 102.5 by se zapíše jako 0.1025*102, -0,03 jako -0.3*10-1 a tak dále. Číslo v počítači má ale nějakou délku. Vyjděme z Amigy, která je schopná pracovat se čtyřbajtovymi slovy. Řekněme, že první tři bajty využijeme pro mantisu a poslední pro exponent.
Ještě však potřebujeme nějak rozpoznávat kladná a záporná čísla a také kladný a záporný exponent. Proto vždy první bit mantisy a první bit exponentu vyhradíme pro informaci o znaménku. Nyní ale máme dvě možnosti, jak zapsat záporné číslo. První, logická možnost, je zapsat jeho absolutní hodnotu do spodních sedmi bitů a nastavit nejvyšší bit jako znamení, že se jedná o záporné číslo. Existuje ale i způsob druhý, který je výhodnější z hlediska vnitřní logiky a rychlosti procesoru. Do spodních sedmi bitů nezapsat přímo absolutní hodnotu, ale její doplněk do maximální hodnoty plus jedna.
Vezměme si náš příklad. Maximální zapsatelné sedmibitové číslo je $7F (hex) neboli 1111111 bin. Pokud budeme chtít zapsat -3, zapíšeme do spodních sedmi bitů $7F-$3+$1 = $7D. Podobně pro -16 zapíšeme $7F$10+$1 = $70. Dále ještě musíme nastavit znaménkovy bit, tedy skutečné hodnoty v bajtu budou $FD popřípadě $F0.
Tímto způsobem ze zapíše jak mantisa tak i exponent. Formát založený na tomto principu je používán při všech operacích matematickými knihovnami. Proto ani pokud je výsledkem funkce malé celé číslo jako například dvojka, nedostanete ho v registru jako dvojku ale zakódované. Pro konverzi "normálních" čísel z a do tohoto zakódovaného formátu je nutno použít funkce příslušné knihovny. Například u mathffp.library to jsou SPFix a SPFit.

Gadtools ano nebo ne?
Gadtools.library se objevila v systému 2.0 jako nadstavba standardní intuition.library a umožňovala vytvořit další standardní typy gadgetů. Bohužel, ji vytvořené gadgety nedokáží měnit svoji velikost vzhledem k použitému fontu a navíc je její používání zvláště v některých aspektech poměrně složité. Proto se také objevily různé jiné nadstavby jako MUI nebo Triton. Pokud chcete dělat své vlastní hezky vypadající GUI a máte těmto knihovnám přístup, vřele je doporučuji. MUI je větší a pomalejší než Triton, který je však bohužel méně známější.

Copak se to stalo v mém okně aneb komunikace s intuition.library
Ve struktuře okna je položka wd_UserPort, která ukazuje na message port, na který vám intuition posílá zprávy o tom co se stalo ve vašem okně. Nejprve použijte funkci WaitPort(), jako argument jí zadejte právě tento message port. Tato funkce počká, až bude na portu nějaká zpráva. Poté co se vám vrátí, čili přímo za ni, dejte volání GetMsg(). To vám vrátí již samu zprávu. Tuto si zpracujte a poté použijte funkci ReplyMsg() na vrácení zprávy zpět intuition.library. Jinak by totiž zůstala v paměti.
Zpráva má několik položek. Celou její strukturu najdete v "include:intuition/intuition.h" popřípadě "intuition.i". Nejdůležitějšími jsou:
im_Class - Typ zprávy. Viz dole
im_Code - Přídavná data jako kód klávesy, kód položky v menu apod.
im_Qualifier - Které z kláves SHIFT, ALT, AMIGA a CTRL byly drženy. Hodnoty viz soubor "include:devices/inputevent.h" popř. "inputevent.i". Jsou to ty, které začínají "IEQUALIFIER". Tato položka je platná pro všechny druhy zpráv.
im IAddress - Pokud přišla zpráva o kliknutí na gadget, tato položka na něj ukazuje.

Nejdůležitější druhy zpráv:
IDCMP_MOUSEBUTTONS - Slouží pro tlačítka na myši. Používané hodnoty jsou IECODE_LBUTTON, IECODE_RBUTTON a IECODE_MBUTTON. Jestliže bylo tlačítko uvolněno je hodnota o 0x80 vyšší. Tyto hodnoty lze opět nalézt v souboru "include:devices/inputevent.h" či "inputevent. i".
IDCMP_GADGETDOWN - Bylo kliknuto na gadget. V položce im_IAddress je ukazatel na tento gadget.
IDCMP_GADGETUP - Byl puštěn gadget. V položce im_IAddress je ukazatel na tento gadget.
IDCMP_MENUPICK - Byl proveden výběr z menu. V položce im_Code je kód položky v menu. Ten je vhodné pomocí služby intuition.library ItemAddress() převést na ukazatel na příslušný menuitem.
IDCMP_CLOSEWINDOW - Tento druh zprávy dostanete pokud někdo kliknut na zavírací gadget vašeho okna.
IDCMP_RAWKEY - V položce im_Code je kód klávesy, ovšem ne ASCII kód Pokud je klávesa puštěna je tento kód zvětšen o 0x80. Tyto kódy je nejlépe si zjistit třeba pomocí zde uvedeného příkladu. Já si je napsal do manuálu od Amigy, do příkladů klávesnic. Pokud chcete získat ASCII kód klávesy, musíte si kód zkonvertovat pomocí služby RawKeyConvert z console.device. To je ale nutné pouze u programů typu textového editoru. Většinou stačí orientovat se podle kódů kláves.
IDCMP_VANILLAKEY - V položce im_Code je ASCII kód klávesy. To je jednodušší než používat IDCMP_RAWKEY. Ovšem tímto způsobem nelze testovat klávesy jako šipky nebo F1-F10.

K čemu je layers.library?
Služby layers.library zřejmě nikdy nepoužijete přímo. Je používána knihovnou intuition.library pro správu oken. Stará se o "vrstvy" (layer=vrstva) oken, jejich vzájemné překrývání a o obnovu zakrytých oblastí při jejich přesouvání či zavírání.

Kde sehnat Rom Kernel Manuál (RKM) ?
Bohužel originální RKM se ani mně ani mým kamarádům sehnat nepodařilo. Pouze jeho okopírované části, zato však i na disketě. Je však k dispozici systémová dokumentace od knihoven (Od kickstartu V40, cca 1.8 MB), která plně dostačuje.

Mohli byste mi doporučit nějakou "Ass" příručku ?
Já sám jsem se učil assembler Amigy z knížky "Postavte si virus". O systému tam toho ale příliš nebylo. Poté vyšly ještě dvě další, jedna od Grady a druhá od někoho jiného. Bohužel jejich úroveň nebyla valná. Jednak v nich bylo poměrně dost chyb a navíc byly zaměřeny na procesor a ne na Amigu. O žádné opravdu vhodné knížce o assembleru na Amigu bohužel nevím.

Vytlačiť článok



Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.

Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing



none

AMIGA REVIEW

57 ( 11-12 / 2000 )
56 ( 9-10 / 2000 )
55 ( 7-8 / 2000 )
54 ( 5-6 / 2000 )
53 ( 3-4 / 2000 )
52 ( 1-2 / 2000 )
 
51 ( 12 / 1999 )
50 ( 11 / 1999 )
49 ( 10 / 1999 )
48 ( 9 / 1999 )
46-47 ( 7-8 / 1999 )
45 ( 6 / 1999 )
44 ( 5 / 1999 )
43 ( 4 / 1999 )
42 ( 3 / 1999 )
41 ( 2 / 1999 )
40 ( 1 / 1999 )
 
39 ( 12 / 1998 )
38 ( 11 / 1998 )
37 ( 10 / 1998 )
36 ( 9 / 1998 )
35 ( x / 1998 )
34 ( x / 1998 )
33 ( 1-2 / 1998 )
 
32 ( 11-12 / 1997 )
31 ( 9-10 / 1997 )
30 ( 7-8 / 1997 )
29 ( 6 / 1997 )
28 ( 5 / 1997 )
27 ( 4 / 1997 )
26 ( 3 / 1997 )
25 ( 2 / 1997 )
24 ( 1 / 1997 )
 
23 ( 12 / 1996 )
22 ( 11 / 1996 )
21 ( 10 / 1996 )
20 ( 9 / 1996 )
18-19 ( 7-8 / 1996 )
17 ( 6 / 1996 )
16 ( 5 / 1996 )
15 ( 4 / 1996 )
14 ( 3 / 1996 )
13 ( 2 / 1996 )
12 ( 1 / 1996 )
 
11 ( 12 / 1995 )
10 ( 11 / 1995 )
9 ( 10 / 1995 )
8 ( 9 / 1995 )
7 ( 7 / 1995 )
6 ( 5 / 1995 )

ATLANTIDA NEWS

5 ( 3 / 1995 )
4 ( 1 / 1995 )
 
3 ( 11 / 1994 )
2 ( 9 / 1994 )
1 ( 7 / 1994 )
0 ( 5 / 1994 )