[ Pobierz całość w formacie PDF ]

xor ax, ax
mov es, ax
les di, [es:33h
; sterownika myszy nie jest zerem
mov ax, es
or ax, di
jz brak_myszy
mov al, [es:di]
cmp al, 0cfh ; sprawdz, czy procedura obsługi
; przerwania myszy nie składa się
; wyłącznie z instrukcji iret
je brak_myszy
xor ax, ax
int 33h ; sprawdz, czy sterownik zgłasza mysz
test ax, ax
jz brak_myszy
Spis treści off-line (Alt+1)
Spis treści on-line (Alt+2)
Ułatwienia dla niepełnosprawnych (Alt+0)
Bogdan Drozdowski 213
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
214 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
Obsługa myszy w asemblerze
W tej części dowiemy się, jak dodać w naszych programach obsługę myszy.
Do naszych celów potrzebne nam będą załadowane sterowniki myszy w pamięci oraz przerwanie int 33h.
Zapoznajmy się z kilkoma podstawowymi funkcjami tegoż przerwania (patrzymy oczywiście w listę przerwań
Ralfa Brown'a - RBIL):
(przeskocz opis funkcji int 33h)
INT 33 - MS MOUSE - RESET DRIVER AND READ STATUS
AX = 0000h
Return: AX = status
0000h hardware/driver not installed
FFFFh hardware/driver installed
BX = number of buttons
0000h other than two
0002h two buttons (many drivers)
0003h Mouse Systems/Logitech three-button mouse
FFFFh two buttons
INT 33 - MS MOUSE v1.0+ - SHOW MOUSE CURSOR
AX = 0001h
INT 33 - MS MOUSE v1.0+ - HIDE MOUSE CURSOR
AX = 0002h
INT 33 - MS MOUSE v1.0+ - POSITION MOUSE CURSOR
AX = 0004h
CX = column
DX = row
INT 33 - MS MOUSE v1.0+ - RETURN BUTTON RELEASE DATA
AX = 0006h
BX = button number (see #03169)
Return: AX = button states (see #03168)
BX = number of times specified button has been released since
last call
CX = column at time specified button was last released
DX = row at time specified button was last released
(Table 03169)
Values for mouse button number:
0000h left
0001h right
0002h middle
Tyle powinno nam wystarczyć. Są też funkcje, które np. definiują zasięg poziomy i pionowy kursora (można
ustawić tak, że kursor będzie się mógł poruszać tylko w wyznaczonym oknie), ale tymi nie będziemy się
zajmować.
Na dobry początek resetujemy sterownik i sprawdzamy, czy w ogóle jest jakaś mysz zainstalowana (jeszcze
wcześniej można byłoby sprawdzić, czy sam sterownik nie jest procedurą, która nic nie robi, ale pominę to).
Kod jest wyjątkowo krótki:
xor ax, ax
int 33h ; sprawdzamy, czy jest mysz
or ax, ax
jz brak_myszy
Bogdan Drozdowski 215
Bogdan Drozdowski Język asembler dla każdego 2009-02-25
Jak było widać wcześniej, pokazanie kursora nie jest trudne i sprowadza się do:
mov ax, 1
int 33h ; pokaż kursor
Do szczęścia brakuje nam już tylko sprawdzenie, czy i gdzie naciśnięto jakiś przycisk. Do tego posłuży nam
funkcja numer 6. Wystarczy w BX podać interesujący nas przycisk, a w CX i DX powinniśmy otrzymać
współrzędne (dobrze jest przed rozpoczęciem pracy wywołać raz tą funkcję dla wszystkich przycisków, aby
wyzerować liczniki naciśnięć). Przykład:
mov ax, 6
xor bx, bx
int 33h
or bx, bx
jz nie_wcisnieto_lewego
mov [kolumna], cx
mov [wiersz], dx
Nie ma w tym dużo wysiłku, na szczęście. Wszystko za nas robi sterownik, a my tylko potem sprawdzamy
rejestry.
Dlatego też od razu przejdę do finału tego artykułu i zaprezentuję program, w którym zawarłem wszystko to,
o czym mówiłem. Zadaniem programu jest nic innego, jak tylko wyświetlenie odpowiedniego napisu, gdy
użytkownik naciśnie jakiś klawisz myszki (naciśnięcie czegoś na klawiaturze spowoduje wyjście z programu).
Napis zostanie wyświetlony w miejscu, gdzie naciśnięto przycisk.
Oto kod:
(przeskocz kod programu)
; Program wyświetlający napis w miejscu, gdzie został naciśnięty
; klawisz myszki.
;
; POD WINDOWS URUCHAMIA W TRYBIE PEANOEKRANOWYM
;
;
; Autor: Bogdan D.
; kontakt: bogdandr (at) op (dot) pl
;
; nasm -O999 -o mysz.com -f bin mysz.asm
org 100h
xor ax, ax ; AX = 0
int 33h ; sprawdzamy, czy jest mysz
or ax, ax
jnz mysz_ok
mov dx, nie_ma_myszy
mov ah, 9
int 21h
mov ax, 4c01h ; zwracamy kod błędu=1
int 21h
216 Bogdan Drozdowski
2009-02-25 Język asembler dla każdego Bogdan Drozdowski
mysz_ok:
mov ax, 3
int 10h ; czyścimy ekran
mov ax, 1
int 33h ; pokazujemy kursor myszki
; zerujemy liczniki naciśnięć:
mov ax, 6
xor bx, bx ; lewy przycisk
int 33h
mov ax, 6
mov bx, 1 ; prawy przycisk
int 33h
petla:
mov ah, 1
int 16h ; czy naciśnięto klawisz na klawiaturze?
jnz koniec ; jeśli tak, to wychodzimy z programu
mov ax, 6 [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • domowewypieki.keep.pl