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 |
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 |
.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 |
Na závěr popřeji co nejcitlivější šipku.
Žádné komentáře:
Okomentovat