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:
| 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