středa 5. ledna 2000

A-Mouse III

autor: Zbyněk Vanžura

Již je to trošku delší doba, co jsem dostal od jednoho čtenáře pěkný ovladač pro myš (omlouvám se mu, ale při hardwarové poruše mého pevného disku jsem přišel o jeho jméno). Je opravdu pěkný, rychlý, malý - dokonce se mi jej podařilo vtěsnat do kalkulačky, jež napsal Universum jako utilitu pro Desktop. Takže teď už nechci od nikoho slyšet, že ovládání myši je moc paměťově náročné. Ale teď už k tomu ovladači:
AMouse
in
a,(31)
;vezme původní stav clonek

ld
d,a

ld
b,0
;počet průchodů smyčkou
AMouseC
in
a,(31)
;vezme nový stav myši

ld
e,d

ld
d,a

rra

;zjisti zda clonky patřící

rra

;k jednomu směru mají stejnou úroveň

xor
d

and
3

ld
c,a
;když jsou, tak se bity odpovídající

rlca

;oběma clonkám nastaví na jedničky

rlca

;a při operaci xor e dojde k negaci

or
c

xor
e
;starý stav clonek

xor
d
;nový stav clonek

ld
c,a
;výsledek: 001 směr vpravo

and
5
;100 směr vlevo

jp
pe,AMouse1
;0101 a 0000 myš stojí skok

inc
h
;zvýší se X

dec
a
;směr vpravo ?

jr
z,AMouse3
;ano, skok

dec
h
;zruší se zvýšení X

jr
AMouse1
;X=0, snížení nemožné, skok

dec
h
;X=X-1

jr
AMouse1
AMouse3
ld
a,h
;test přetečení z 255 na 0

and
a
;je X=0 ?

jr
nz,AMouse1
;ne, k přetečení nedošlo

dec
h
;sníží se zpět na 255
AMouse1
ld
a,c
;stejný test v ose Y

rrca

and
5
;při 0000 a 0101 skok

jp
pe,AMouse2

inc
l
;zvýší se Y

dec
a
;směr dolů ?

jr
z,AMouse4
;ano, skok

dec
l
;když Y=0, tak by došlo

jr
z,AMouse2
;k přetečení a proto skok

dec
l
;Y=Y-1
AMouse4
ld
a,l
;ošetření přetečení přes 192

cp
192

jr
c,AMouse2

dec
l
;když Y>=192 tak Y=Y-1
AMouse2
djnz
AMouseC
;počítadlo průchodů

ret

.end
Pokud jste nebyli nedočkaví a ještě ovladač myši nevyzkoušeli, napíši vám také jeho nevýhody. Nevýhodou je to, že je rychlý, ano nespletl jsem se, je rychlý a z toho důvodu myš testuje jen chvilku za kterou sice neprošvihne téměř žádný impuls clonek, ale přesto je myš pomalejší než z předchozím ovladačem (ZX Magazín 1/95), neboť myš testuje jen nepatrnou chvilku. Ale nebojte se, nechci vám vnucovat svůj původní ovladač, jen se vám pokusím ukázat, jak to vyřešit jinak a lépe.
Představte si, že si vykreslíte obrazovku, pokud chcete program ovládat šipkou, tak se toho až tak moc v programu nevykresluje (většinou jen ta šipka) a poté si otestujete joystick, klávesnici nebo myš a čekáte na další přerušení, abyste mohli opět překreslovat obrazovku. Ale co ten nevyužitý čas co se čeká na přerušení, proč jej zmařit instrukcí HALT, proč netestovat myš až do poslední chvíle. Jistě, nedokážeme uhodnout, kdy k přerušení dojde a vzhledem k počítačům Didaktik M a jim podobným to nepoznáme ani podle toho zda se vykresluje PAPER, nebo uz BORDER. Když ale nemůžeme přerušení rozpoznat, proč si nenadefinovat vlastní - třeba následujícím postupem:
Inicializovat přerušení IM 2 například následující rutinkou:
InicIM2
di

;zakaž přerušení

ld
a,$3b
;nastav do registru

ld
i,a
;číslo $3b adresa bude na $3bff (15359)

ld
a,$18
;na adresu 65535 (což je ona adresa)

ld
(65535),a
;ulož kód instrukce jr (provede se skok na adresu 65422)

im
2

ei

ret
Na adresu 65422 uložit rutinku pro obsloužení přerušení, nebo spíše hlavní program, který nakonec spustí dokola již zmiňovaný test myši. Takže opět příklad:

.org
65422
;adresa kam skočí instrukce jr na adrese 65535

ld
sp,Zasobnik
;nutno nastavit zásobník, neboť se stále posouvá

call
SmazSipk
;rutina pro smazání šipky

call
TestTlac
;rutina pro test tlačítek

ld
hl,(Sourad)
;do HL nové souřadnice šipky

call
KresSipk
;rutinka pro nakreslení šipky

ei

;nesmíme zapomenout povolit přerušení
AMouse
in
a,(31)
;vezme původní stav clonek

ld
d,a
AMouseC
. . .

;pokračování je shodné jako předtím


. . .

;jen konec poupravíme
AMouse2
ld
(Sourad),hl
;ulož nové souřadnice šipky

jr
AMouseC
;a znova dokud nás přerušení nepřeruší

Sourad
.dw
0
;X a Y souřadnice šipky

.end
Podprogramy pro kreslení a mazání šipky a test tlačítek si doufám již naprogramujete sami.
Na závěr popřeji co nejcitlivější šipku.

Žádné komentáře:

Okomentovat