Obsługa myszki w Pascalu
Pobaw się z myszką!
W czasach, kiedy świat systemów operacyjnych (domowych coraz częściej i korporacyjnych) jest zdominowany przez systemy o graficznym obliczu, zabawa z myszką wydaje się być archaizmem. Należy jednak pamiętać, że istnieją także systemy gdzie większość roboty wykonuje się i tak w konsoli. Systemem takim jest z pewnością Linux. Kod ten może być stosowany zarówno w systemach wywodzących się z DOS'a (Windows'y) jak i Unix'a (Linux'y). Umiejętność niskopoziomowego programowania myszy może być nadal użyteczna, a z pewnością jest to ciekawe. Zatem odpal swój ulubiony edytor i zaprzęgnij swój ulubiony kompilator do roboty.
Pierwszą rzecz jaką musimy posiadać (oprócz myszy oczywiście), jest to jej sterownik. Jeżeli masz mysz masz także sterownik - systemy najczęściej mają wbudowany sterownik (biedny DOS nie miał). Myszka jest obsługiwana pod przerwaniem 33h. Najpierw więc sprawdźmy czy myszka istnieje (jest poprawnie podłączona, sterownik w pamięci, kot nakarmiony):
Jeśli w rejestrze AX pojawi się wartość różna od 0, znaczy to że wystąpił błąd w teście obecności myszy. W Windows błąd taki nie może wystąpić, chyba że faktycznie nie posiadasz myszki lub pracujesz w trybie DOS'a. Następna rzecz jaką zrobimy to wyświetlenie kursora:
Jeśli chcielibyśmy ukryć kursor, zmieńmy numer funkcji na 2:
Kolejną przydatną rzeczą (chyba najbardziej) jest umiejętność odczytania położenia kursora i stanu przycisków myszy. Nie ma problemu. Assembler wespół ze sterownikiem myszy zapewniają to jedną funkcją o nr. 3. Kodujmy więc:
Po wykonaniu powyższych instrukcji w zmiennych x oraz y otrzymamy aktualne położenie kursora (jeżeli chcemy ciągle odczytywać te wartości powinniśmy umieścić je w pętli), natomiast zmienna keys zawierać będzie informacje o klawiszach. Jak odczytać te wartości? Trzeba przeprowadzić test bitów. Jeżeli najmłodszy bit (pierwszy) jest ustawiony oznacza to, że lewy przycisk był przyciśnięty w momencie wywoływania przerwania 33h. Jeżeli drugi bit jest ustawiony oznacza to, że prawy przycisk był wciśnięty:
if keys and 1 then writeln ("Left key's pushed.");
if keys and 2 then writeln ("Right key's pushed.");
I to wszystko co potrzebne jest do poprawnej obsługi myszy. Istnieje jeszcze wiele różnych funkcji do obsługi myszy, powiedzmy sobie teraz o dwóch, limitujących obszar poruszania się kursora:
I to wszystko już, oczywiście nie jest to limit wszystkich funkcji dostępnych dla myszy, lecz te są z pewnością najbardziej użyteczne. Sam pracuję w obydwu środowiskach, więc życzę miłej zabawy w Windows i w Linux.
W czasach, kiedy świat systemów operacyjnych (domowych coraz częściej i korporacyjnych) jest zdominowany przez systemy o graficznym obliczu, zabawa z myszką wydaje się być archaizmem. Należy jednak pamiętać, że istnieją także systemy gdzie większość roboty wykonuje się i tak w konsoli. Systemem takim jest z pewnością Linux. Kod ten może być stosowany zarówno w systemach wywodzących się z DOS'a (Windows'y) jak i Unix'a (Linux'y). Umiejętność niskopoziomowego programowania myszy może być nadal użyteczna, a z pewnością jest to ciekawe. Zatem odpal swój ulubiony edytor i zaprzęgnij swój ulubiony kompilator do roboty.
Pierwszą rzecz jaką musimy posiadać (oprócz myszy oczywiście), jest to jej sterownik. Jeżeli masz mysz masz także sterownik - systemy najczęściej mają wbudowany sterownik (biedny DOS nie miał). Myszka jest obsługiwana pod przerwaniem 33h. Najpierw więc sprawdźmy czy myszka istnieje (jest poprawnie podłączona, sterownik w pamięci, kot nakarmiony):
var mouse_present: word;
asm
mov ax, 0;
int 33h;
mov mouse_present, ax;
end;
if mouse_present<>0 then writeln ('Mouse isn''t present or driver not loaded!');
asm
mov ax, 0;
int 33h;
mov mouse_present, ax;
end;
if mouse_present<>0 then writeln ('Mouse isn''t present or driver not loaded!');
Jeśli w rejestrze AX pojawi się wartość różna od 0, znaczy to że wystąpił błąd w teście obecności myszy. W Windows błąd taki nie może wystąpić, chyba że faktycznie nie posiadasz myszki lub pracujesz w trybie DOS'a. Następna rzecz jaką zrobimy to wyświetlenie kursora:
Jeśli chcielibyśmy ukryć kursor, zmieńmy numer funkcji na 2:
Kolejną przydatną rzeczą (chyba najbardziej) jest umiejętność odczytania położenia kursora i stanu przycisków myszy. Nie ma problemu. Assembler wespół ze sterownikiem myszy zapewniają to jedną funkcją o nr. 3. Kodujmy więc:
var x, y, keys: word;
asm
mov ax, 3;
int 33h;
mov x, cx; {położenie poziome kursora znajduje się w rejestrze CX}
mov y, dx; {położenie pionowe kursora znajduje się w rejestrze DX}
mov keys, bx; {w rejetrze BX zawarta jest informacja o klawiszach}
end;
asm
mov ax, 3;
int 33h;
mov x, cx; {położenie poziome kursora znajduje się w rejestrze CX}
mov y, dx; {położenie pionowe kursora znajduje się w rejestrze DX}
mov keys, bx; {w rejetrze BX zawarta jest informacja o klawiszach}
end;
Po wykonaniu powyższych instrukcji w zmiennych x oraz y otrzymamy aktualne położenie kursora (jeżeli chcemy ciągle odczytywać te wartości powinniśmy umieścić je w pętli), natomiast zmienna keys zawierać będzie informacje o klawiszach. Jak odczytać te wartości? Trzeba przeprowadzić test bitów. Jeżeli najmłodszy bit (pierwszy) jest ustawiony oznacza to, że lewy przycisk był przyciśnięty w momencie wywoływania przerwania 33h. Jeżeli drugi bit jest ustawiony oznacza to, że prawy przycisk był wciśnięty:
if keys and 1 then writeln ("Left key's pushed.");
if keys and 2 then writeln ("Right key's pushed.");
I to wszystko co potrzebne jest do poprawnej obsługi myszy. Istnieje jeszcze wiele różnych funkcji do obsługi myszy, powiedzmy sobie teraz o dwóch, limitujących obszar poruszania się kursora:
var horiz_min, horiz_max, vert_min, vert_max: word;
{limity położeń poziomych i pionowych}
begin
horiz_min:=10; horiz_max:=20;
vert_min:=10; vert_max:=20;
asm
mov ax, 7; {ustal limity poziome}
mov cx, horiz_min;
mov dx, horiz_max;
int 33h;
mov ax, 8; {ustal limity pionowe}
mov cx, vert_min;
mov dx, vert_max;
int 33h;
end;
end;
{limity położeń poziomych i pionowych}
begin
horiz_min:=10; horiz_max:=20;
vert_min:=10; vert_max:=20;
asm
mov ax, 7; {ustal limity poziome}
mov cx, horiz_min;
mov dx, horiz_max;
int 33h;
mov ax, 8; {ustal limity pionowe}
mov cx, vert_min;
mov dx, vert_max;
int 33h;
end;
end;
I to wszystko już, oczywiście nie jest to limit wszystkich funkcji dostępnych dla myszy, lecz te są z pewnością najbardziej użyteczne. Sam pracuję w obydwu środowiskach, więc życzę miłej zabawy w Windows i w Linux.



EDIT: Przetestowałem i dostaje caly czas:
"Naruszenie ochrony pamięci"
IMHO int 33h to interfejs do sterownika myszy od MS
</delphi>
Jeśli w rejestrze AX pojawi się wartość różna od 0" -ludzie widzicie błąd to poprawcie...
Jak wygląda obsługa myszy z uzyciem modułu drivers.tpu
Gdzie jest plik pomocy do modułu drivers.tpu
Pod USB.
Jeżeli wyrzuci 0 do Ax to znaczy że niepodłonczono / zainstalowano ...
natomiast jeśli FFFFh to znaczy że podłączono ... itd
(dla niekumatych : rejestry + przerwania są obsługiwane w TP bez potrzeby wpisywania wstawek asmowych, tylko że dużo wolniej...)
if mouse_present=0 then writeln ("Mouse isn't present or driver not loaded!");
czyli =0 a nie <>0. ?