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