LABORATORIMUM PROGRAMOWNIA W JĘZYKACH SYMBOLICZNYCH
SPRAWOZDANIE NR 3
OBSŁUGA MYSZY
1.
Cel ćwiczenia::
napisanie programu, który pozwala
prowadzić kursorem myszy po ekranie,
naciśnięcie klawisza lewego pisze literę np. A, naciśnięcie prawego kończy
program.
Praca w trybie tekstowym VGA.
2.
Obsługa myszy w trybie
tekstowym karty VGA.
W trybie tekstowym VGA jest 25 linii
po 80 znaków w linii.
Każdy znak zajmuje w segmencie pamięci karty 2 bajty: kod znaku ASCII i atrybut
(kolor znaku - do 16 kolorów, kolor tła znaku, migotanie, podkreślenie..).
Adres początku karty VGA = 0B800h. Tu zaczyna się znak o adresie 0, razem 4000
bajtów
(80 znaków * 25 linii * 2 bajty), w parzystych adresach kod ASCII, w
nieparzystych atrybut (0..3999).
By myszka działała musi być zainstalowany sterownik (driver).
Mysz obsługuje przerwanie 33h i oferuje wiele funkcji ale większość driver-ów
toleruje tylko niektóre z nich.
1) Sprawdzenie statusu myszy - czy zainstalowana: za pomocą funkcji 00h
przerwania 33h:
AX = 0000h czyli :
mov ax, 00h ; funkcja 0h
int 33h ; przerwania 33h
W AX otrzymuje się status myszy: AX=0000h (0)- mysz nie zainstalowana
AX=0ffffh (1) mysz
zainstalowana
w BX liczba przycisków myszy - w BX=1- 2 przyciski, 0 - inna
2) Wyświetlenie kursora myszy: funkcja 01h przerwania 33h- AX=0001h, czyli
wykonujemy:
mov ax, 01h
int 33h
Funkcja nic nie zwraca. Na ekranie wyświetli się kursor myszy (tekstowy lub
graficzny
w zależności od trybu graficznego)
3) Skasowanie (ukrycie) kursora myszy: AX=0002h
mov ax, 02h
int 33h
3) Odczyt pozycji kursora i stanu przycisków: AX=0003h
mov ax, 03h
int 33h
Po wywołaniu: BX - stan przycisków: bit 0=1 - lewy przycisk, bit1=1 - prawy
przycisk, bit2=1
- wciśnięty środkowy przycisk, w CX - kolumna z kursorem, w DX - wiersz gdzie
jest kursor.
Informacja podawana w rozdzielczości ekranu: CX - x (0..639), DX - y (0..199)
4) Ustawienie kursora w punkcie o danych współrzędnych: AX=0004h; CX=kolumna,
DX=wiersz
5) Ustalenie granic pionowych dla kursora: AX=0007h; CX=nr lewej kolumny,
DX=nr prawej kolumny
6) Ustalenie granic poziomych dla kursora: AX=0008h; CX=nr górnego wiersza
DX=nr dolnego wiersza
7) Ustawienie szybkości ruchu kursora: AX=000fh; CX=prędkość X, DX=prędkość Y.
Największa szybkość przy wartości 1.
3.
Realizacja programu i wnioski.
W programie zawarto tylko segment
kodu.
Program zaczyna się od etykiety start z linią jmp start1,
poniżej zdefiniowany jest komunikat1 ‘Brak myszy’ a następnie etykieta start1:.
Program sprawdza czy jest sterownik (funkcja 0h) i w przypadku braku następuje
skok (jz) do etykiety fin,
która wyświetla komunikat o braku myszy i kończy program.
Jeśli jest zainstalowana mysz to ładowany jest adres początku pamięci karty VGA
(0b800h)
do rejestru segmentu dodatkowego. ES, następnie ustawia się rejestr indeksowy
DI na 0,
w liczniku CX ustawia się licznik pętli 2000 - ile razy ma być wykonana pętla
(LOOP)
kasowania ekranu (4000/2=2000 kodów ASCII). W 2 wersjach programu zastosowano 2
metody kasowania:
W Mysz1.ASM stosuje się mov byte ptr es:[di], a w MYSZ 2.ASM stosuje się
rozkaz STOSW
(przesłanie słowa z akumulatora do pamięci adresowanej ES:DI.
Po wyczyszczeniu ekranu wywoływana jest funkcja 01h w celu wyświetlenia
kursora myszy
i zaczyna się proces obsługi przesuwania myszy (etykieta Rysuj) - funkcja 03h
informująca
o pozycji kursora i stanie przycisków, oraz rozkaz test bx,1 - testowanie czy w
BX
jest 1 i skok względny gdy 0 do Nie_stawiaj_pktu . Jeśli wciśnięto klawisz
lewy
to zachowywany jest stan BX (push BX), przeliczany adres położenia kursora:
X/4+Y*20,
kasowany kursor i wysyłany znak ‘A’ do pamięci ekranu pod adres ES:[DI] - mov
byte ptr es:[di]:’A’.
Wyświetlany jest kursor (01h), odtwarzany BX, testowany klawisz prawy i jeśli
nie to powrót do Rysuj.
Wnioski:
W pierwszej wersji programu (Mysz1.Asm) po wejściu ponownym do programu
pozostawały
częściowo ślady myszy z poprzednich wywołań programu.
W drugiej program działa poprawnie. Istotne było tu przeliczenie współrzędnych
na pamięć ekranu.
Załączniki: tabulogramy programów