středa 5. ledna 2000

A-Mouse III

autor: Zbyněk Vanžura

Již je to 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). Ovladač je opravdu pěkný, rychlý a malý – dokonce se mi jej podařilo vtěsnat do kalkulačky, kterou napsal Universum jako utilitu pro Desktop.

Takže teď už nechci od nikoho slyšet, že ovládání myši je příliš paměťově náročné.
Ale nyní už k samotnému 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č nezkusili, napíši vám i jeho nevýhody.
Tou hlavní je – překvapivě – jeho rychlost. Ano, nespletl jsem se.
Ovladač testuje myš tak krátce, že sice nezmešká téměř žádný impuls clonek, ale celkově reaguje pomaleji než předchozí ovladač (ZX Magazín 1/95), protože testuje jen po velmi krátkou dobu.

Nebojte se, nechci vám vnucovat svůj původní ovladač – jen ukázat, jak to lze udělat lépe.

Představte si, že máte vykreslenou obrazovku. Pokud chcete program ovládat šipkou, obvykle se v programu moc nemění (většinou jen poloha šipky). Poté otestujete joystick, klávesnici nebo myš a čekáte na další přerušení, abyste mohli obrazovku znovu překreslit.

Ale co s tím nevyužitým časem mezi přerušeními?
Proč ho ztrácet instrukcí HALT, když můžeme testovat myš až do poslední chvíle?

Jistě, nedokážeme přesně zjistit, kdy k přerušení dojde, a u počítačů typu Didaktik M to nepoznáme ani podle toho, zda se vykresluje PAPER nebo BORDER.
Když ale přerušení rozpoznat nemůžeme, proč si nedefinovat vlastní – například 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 pak uložíme rutinu pro obsluhu přerušení – tedy hlavní program, který opakovaně testuje myš:


.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 jistě zvládnete naprogramovat sami.

Na závěr vám přeji co nejcitlivější šipku!

Žádné komentáře:

Okomentovat