DOS MYSZ TUT


Obsluga myszy w assemblerze
Autor: Bogdan Drozdowski, bogdandr (at) op.pl


W tej czesci dowiemy sie, jak dodac w naszych programach obsluge myszy.
Do naszych celow potrzebne nam beda zaladowane sterowniki myszy w pamieci
oraz przerwanie int 33h.

Zapoznajmy sie z kilkoma podstawowymi funkcjami tegoz przerwania
(patrzymy oczywiscie w liste przerwan Ralfa Browna - RBIL):

==========================================
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 wystarczyc. Sa tez funkcje, ktore np. definiuja zasieg
poziomy i pionowy kursora (mozna ustawic tak, ze kursor bedzie sie mogl
poruszac tylko w wyznaczonym "oknie"), ale tymi nie bedziemy sie zajmowac.


Na dobry poczatek resetujemy sterownik i sprawdzamy, czy w ogole jest jakas
mysz zainstalowana (jeszcze wczesniej mozna byloby sprawdzic, czy sam
sterownik nie jest procedura, ktora nic nie robi, ale pomine to). Kod jest
wyjatkowo krotki:

==========================================
xor ax, ax
int 33h ; sprawdzamy, czy jest mysz
or ax, ax
jz brak_myszy
==========================================

Jak bylo widac wczesniej, pokazanie kursora nie jest trudne i
sprowadza sie do:

mov ax, 1
int 33h ; pokaz kursor

Do szczescia brakuje nam juz tylko sprawdzenie, czy i gdzie nacisnieto
jakis przycisk. Do tego posluzy nam funkcja numer 6. Wystarczy w BX podac
interesujacy nas przycisk, a w CX i DX powinnismy otrzymac wspolrzedne
(dobrze jest przed rozpoczeciem pracy wywolac raz ta funkcje dla wszystkich
przyciskow, aby wyzerowac liczniki nacisniec). Przyklad:

==========================================
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 duzo wysilku, na szczescie. Wszystko za nas robi sterownik,
a my tylko potem sprawdzamy rejestry.

Dlatego tez od razu przejde do finalu tego artykulu i zaprezentuje program,
w ktorym zawarlem wszystko to, o czym mowilem. Zadaniem programu jest
nic innego, jak tylko wyswietlenie odpowiedniego napisu, gdy uzytkownik
nacisnie jakis klawisz myszki (nacisniecie czegos na klawiaturze spowoduje
wyjscie z programu). Napis zostanie wyswietlony w miejscu, gdzie
nacisnieto przycisk.

Oto kod:


==========================================
; Program wyswietlajacy napis w miejscu, gdzie zostal nacisniety
; klawisz myszki.
;
; POD WINDOWSEM URUCHAMIAC W TRYBIE PELNOEKRANOWYM
;
;
; 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 errorlevel=1
int 21h


mysz_ok:
mov ax, 3
int 10h ; czyscimy ekran

mov ax, 1
int 33h ; pokazujemy kursor myszki

; zerujemy liczniki nacisniec:
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 nacisnieto klawisz na
; klawiaturze?
jnz koniec ; jesli tak, to wychodzimy z
; programu

mov ax, 6
xor bx, bx ; sprawdzamy lewy przycisk
int 33h

or bx, bx ; jesli nacisnieto, to idziemy
; cos wyswietlic
jnz pokaz_l

mov ax, 6
mov bx, 1 ; sprawdzamy prawy przycisk
int 33h

or bx, bx ; jesli nacisnieto, to idziemy
; cos wyswietlic
jnz pokaz_p

jmp short petla

pokaz_l:
; wiemy, ze CX=kolumna,
; DX=wiersz, gdzie
; nacisnieto klawisz, ale to
; sa numery pikseli.
; Aby otrzymac kolumne i
; wiersz, dzielimy je przez 8
; (jest 8 pikseli/znak):
shr dx, 3
shr cx, 3

mov ah, 2 ; funkcja ustawiania kursora
mov dh, dl ; DH = wiersz
mov dl, cl ; DL = kolumna
int 10h ; ustaw nasz kursor tam

mov dx, lewy_p
mov ah, 9
int 21h

jmp short petla

pokaz_p:
; wiemy, ze CX=kolumna,
; DX=wiersz, gdzie
; nacisnieto klawisz, ale to
; sa numery pikseli.
; Aby otrzymac kolumne i
; wiersz, dzielimy je przez 8
; (jest 8 pikseli/znak):
shr dx, 3
shr cx, 3

mov ah, 2 ; funkcja ustawiania kursora
mov dh, dl ; DH = wiersz
mov dl, cl ; DL = kolumna
int 10h ; ustaw nasz kursor tam

mov dx, prawy_p
mov ah, 9
int 21h

jmp short petla


koniec:
mov ax, 4c00h
int 21h

nie_ma_myszy db 'Sterowniki myszy nie sa zainstalowane.$'
lewy_p db 'Lewy$'
prawy_p db 'Prawy$'
==========================================


Jak widac, korzystanie z myszy niekoniecznie musi byc tak trudne, jak to sie
moglo wydawac. Po bardziej zaawansowane funkcje radze siegnac do RBIL, gdzie
zawsze znajdziecie wiecej informacji o danym przerwaniu niz w moim kursie,
ktory skupia sie przeciez na przedstawianiu algorytmow a nie na
zapamietywaniu kazdego szczegoliku.


Milego ekperymentowania.



Wyszukiwarka

Podobne podstrony:
DOS DIOD TUT
MYSZ TUT
DOS PWR TUT
DOS GRAF TUT
DOS SPKR TUT
DOS CPU TUT
DOS BOOT TUT
DOS SYS TUT
DOS BIBL TUT
MYSZ TUT
MYSZ TUT
DOS TSR TUT
DOS BMP TUT
FUNFACE DOS OPIS
ART121 tut 2
compilar dos
phys tut 08

więcej podobnych podstron