Programátorský servisMichal 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
|