sobota 22. července 1995

Nový ovladač pro A-Mouse

autor: Zbyněk Vanžura

V článku "Vy šílíte, my šílíme - myš" (ZX Magazín 3-4/94) a na Samconu '94 byl publikován ovladač pro A-Mouse. Nejednalo se o žádný programátorský výkon, šlo o jeden z prvních pokusů myš zprovoznit. Smyslem bylo jen ukázat, jak na to. Řada programátorů se ovšem nesnažila jakkoli program pro ovládání myši upravit a používá onu "spitvořeninu" přesně tak jak byla zveřejněna. Proto jsem se rozhodl uveřejnit prozatím nejlepší ovladač, který znám a který jsem sám vytvořil. Tentokrát se nebudeme zabývat žádnou šipkou, a popíšeme si rovnou ovladač myši.
Takže nejprve assembler:

DartAM
ld
a,l
;z HL zapiš do ovladače

ld
(DartAX1+1),a
;počáteční pozici myši

ld
a,h

ld
(DartAX2+1),a

ld
b,0
;B=256 - počet průchodů smyčkou

ld
d,b
;vyšší byte pro výpočet adresy
DartAML
push
bc
;uschovej počítadlo průchodů
DartAMX
ld
c,0
;do C starý stav clonek myši

in
a,(31)
;do A nový stav clonek myši

and
#0f
;ponech pouze spodní 4 bity

ld
(DartAMX+1),a
;nový stav na místo starého

ld
b,a
;do B nový stav clonek myši

ld
a,c
;do A starý stav clonek myši

rla

rla

xor
b
;nějaké úpravy které již ani já

ld
b,a
;sám nejsem schopen vysvětlit

ld
a,c

rra

rra

xor
b
;v A pozice instrukce v tabulce

ld
b,a
;do B schovej pozici v tabulce

and
5
;ponech pozici pro souřadnici X

ld
hl,DartAMT
;do HL adresa tabulky

ld
e,a
;do E číslo položky v tabulce

add
hl,de
;do HL adresu položky v tabulce

ld
a,(hl)
;načti hodnotu z tabulky

ld
(DartAZ1),a
;změň instrukci
DartAX1
ld
a,0
;do A hodnota souřadnice X
DartAZ1
cp
1
;mění se instrukce (cp, sub, add)

jr
c,DartAM1
;při pře/podtečení odskoč

ld
(DartAX1+1),a
;zapiš novou souřadnici X
DartAM1
ld
a,b
;do A obnov pozici v tabulce

rra

;odrotuj o bit vpravo

and
5
;ponech pozici pro souřadnici Y

ld
hl,DartAMT
;do HL adresa tabulky

ld
e,a
;do E číslo položky v tabulce

add
hl,de
;do HL adresu položky v tabulce

ld
a,(hl)
;načti hodnotu z tabulky

ld
(DartAZ2),a
;změň instrukci
DartAX2
ld
a,0
;do A hodnota souřadnice Y
DartAZ2
cp
1
;mění se instrukce (cp, sub, add)

jr
c,DartAM2
;při podtečení odskoč

cp
192
;porovnej hodnotu s 192

jr
z,DartAM2
;mimo obraz - odskoč

ld
(DartAX2+1),a
;zapiš novou souřadnici Y
DartAM2
pop
bc
;obnov počítadlo průchodů

djnz
DartAML
;opakuj podle hodnoty B


ld
a,(DartAX1+1)
;do HL načti pozici myši

ld
l,a

ld
a,(DartAX2+1)

ld
h,a

ret

;konec ovladače
DartAMT
db
#fe,#d6,0,0,#c6,#fe
;tabulka pro určení směru pohybu

end

;konec překladu
Teď něco k ovladači. Tento ovladač vychází z onoho původního pouze se oba směry (jak vertikální tak horizontální) zpracovávají současně. Proto, aby se v ovladači nenatáhla tabulka na neskutečných 2 x 256 bajtů, byla optimalizována pomocí Karnaughovy mapy a podařilo se nám ji zkrátit na 2 x 8 bytů.
Tak a teď již konkrétně k jednotlivým řádkům programu. Čtyři řádky za návěstím DartAM pouze zapíší do ovladače počáteční pozici myši. Pomocí těchto řádků je možné měnit pozici myši (například přemístění myši do středu obrazovky, nebo nad defaultové tlačítko), používat ji ovšem nedoporučujeme, neboť uživatel pak ztrácí o myši přehled a na rychlosti ovládání to téměř nepřidá (na rozdíl od joysticku nebo myši Kempston). Tudíž je lepší přímo do instrukcí za návěstím DartAX1 a DartAX2 dosadit počáteční hodnoty pozice myši a těmito řádky se vůbec nezatěžovat.
Řádky mezi návěstím DartAML a návěstím DartAM2 se provedou 256 krát. Počet průběhů se určuje instrukcí LD B,N na pátém řádku (já osobně používám 256 průchodů z toho důvodu, že ovladač více průchodů neumožňuje a mé programy zabírají spoustu času a nestíhají otestovat myš, vše nakreslit (nejen šipku, ale i inverzi pod šipkou a podobné věci) a vše zase smazat a to vše za jedno přerušení). V případě změny počtu průchodů nezapomeňte upravit následující řádek na LD D,0. Smyčka načte jak aktuální tak původní stav clonek. Tyto dvě hodnoty se nějakým záhadným způsobem upraví (nějak se mi to podařilo vypočítat pomocí Karnuaghových map, ale dokumentaci k tomu už žádnou nemám) a vyjde z toho pozice hodnoty v tabulce. Tato hodnota se potom rozloží na dvě (pro horizontální a vertikální směr) a načtou se z tabulky instrukce pro jednotlivé směry pomocí níž se upraví hodnoty jednotlivých směrů, přičemž se ještě otestuje zda myš někde neopustila obrazovku. Úpravy hodnot směrů se provádí už samostatně nejprve pro směr horizontální a poté i pro vertikální. Na závěr se ještě otestuje počet průchodů a případně se pokračuje dalším průchodem smyčkou. Poslední čtyři instrukce zajišťují načtení nových hodnot pozice myši do dvojregistru HL.
Tak a to je vše k popisu tohoto ovladače. Ovladač by šel ještě zrychlit prodloužením tabulky a vypuštěním oné "záhadné" úpravy. Ovšem pokud by někdo přišel na nějaký odlišný a lepší způsob, ať jej zašle do redakce ZXM, rádi s ním seznámíme i ostatní čtenáře.

Žádné komentáře:

Okomentovat