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