WYŻSZA SZKOŁA INFORMATYKI I ZARZĄDZANIA Z SIEDZIBĄ W RZESZOWIE Projekt z przedmiotu: Języki asemblerowe Temat: Rysowanie myszką w trybie graficznym. Prowadzący: mgr inż. Jarosław Szkoła Wykonawca: Leszek Szpunar, w36292 Rzeszów 201
Spis treści: 1. Cel projektu... 3 2. Wymagania wstępne... 3 3. Charakterystyka wykorzystanych narzędzi... 3 4. Opis programu... 4 5. Omówienie kodu programu... 5 6. Działanie programu... 7 7. Wnioski... 8 2
1. Cel projektu Celem projektu jest zapoznanie się z językiem asembler i zastosowanie go w programowaniu układów x86. 2. Wymagania wstępne Program ma pozwalać na rysowanie zadanym kolorem - myszką w trybie graficznym 13h. Będzie wyświetlał piksel w miejscu naciśnięcia kursora myszki przerwanie 33h po naciśnięciu lewego przycisku. Po naciśnięciu prawego będziemy kończyć porogram. 3. Charakterystyka wykorzystanych narzędzi DOSBox to emulator klasycznego systemu operacyjnego MS DOS. Umożliwia uruchamianie aplikacji napisanych dla tej platformy, czyli większości gier i programów jakie zostały stworzone w latach 80-tych i 90-tych ubiegłego wieku. Emulator DOS. Dzięki użyciu biblioteki SDL jest bardzo prosty do adaptacji na różne systemy operacyjne. Aplikacja emuluje: procesor 286/386; system plików, karty graficzne Tandy/Hercules/CGA/EGA/VGA/VESA, karty muzyczne SoundBlaster/Gravis Ultra Sound. Na stronie producenta można pobrać stare gry, które nie uruchamiają się pod nowymi systemami operacyjnymi. 3
4. Opis programu Program został napisany w języku asembler i pozwala na rysowanie myszką w trybie graficznym 13h. 13h: Rozdzielczość trybu 13h to: 320x200, jego paleta zawiera265 kolorów. Tryb 13h (dziesiętnie 19) jest trybem graficznym VGA, a jego nazwa bierze się z numeru wśród trybów na karcie VGA. Aby uruchomić tryb 13h należy do rejsetru AH funkcję 00h, a do rejestru AL załadować numer trybu pracy karty graficznej VGA i wywołać przerwanie 10h. Rejesry AH i AL znajdują się w rejestrze AX, więc wystarczy tam załadować numer trybu pracy karty graficznej. Procedurą, która będzie to realizowała będzie Init13h. Kiedy mamy już uruchomiony tryb 13h, możemy coś narysować. Aby postawić pojedynczy piksel należy do bufora wideo składającego się z 64000 bajtów (określających kolejno ułożone piksele) zapisać liczbę określającą jego kolor. Np. zapisanie do 1 bajtu buforu wideo liczby 15 powoduje wyświetlenie na ekranie białego piksela. Black = 0 - czarny Blue = 1 - niebieski Green = 2 - zielony Cyan = 3 - turkusowy Red = 4 - czerwony Magenta = 5 - karmazynowy Brown = 6 - brązowy LightGray = 7 - jasnoszary DarkGray = 8 - ciemnoszary LightBlue = 9 - jasnoniebieski LightGreen = 10 - jasnozielony LightCyan = 11 - jasnoturkusowy LightRed = 12 - jasnoczerwony LightMagenta = 13 - jasnokarmazynowy Yellow = 14 - żółty White = 15 - biały 33h: Do obsługi myszy służy przerwanie 33h MS-DOS. Są następujące funkcje przerwania 33h: INT33/ah=00h inicjalizacja myszy, INT33/ah=01h - wyświetlenie kursora myszy, INT33/ah=02h - wyłączenie kursora myszy, INT33/ah=03h - odczytanie z ekranu położenia kursora oraz stanu przycisków myszy, INT33/ah=04h - ustawienie na ekranie położenia kursora myszy. 4
Funkcja 00h inicjalizuje mysz. Sprawdza też, czy mysz jest zainstalowana. Funkcja zwraca w rejestrze AX informację o stanie myszy, a mianowicie wartość 0FFFFh, jeżeli mysz nie jest zainstalowana, lub wartość 0, jeżeli mysz jest obecna. W przypadku obecności myszy funkcja zwraca w rejestrze BX liczbę przycisków myszy (2 lub 3). Funkcja 01h wyświetla, a funkcja 02h wyłącza kursor myszy (w trybie graficznym). Do ustawienia trybu graficznego należy wywołać funkcję 13h procedury (przerwania) INT10: mov ax,13h ; ustawienie trybu graficznego int 10h mov ax,01h ;wyświetlenie kursora myszy mov ax,02h ;wyłączenie kursora myszy Funkcja 03h odczytuje położenie na ekranie kursora oraz stan przycisków myszy. Funkcja zwraca w rejestrze CX współrzędną X położenia myszy, w rejestrze DX współrzędną Y położenia myszy, a w rejestrze BX znaczniki stanu przycisków myszy: bit 0 równa się 1, jeśli lewy przycisk jest wciśnięty, bit 1 równa się 1, jeśli prawy przycisk jest wciśnięty, bit 2 równa się 1, jeśli środkowy przycisk jest wciśnięty. Współrzędne X i Y położenia myszy należy jeszcze pomnożyć przez 2, 4 lub 8 w zależności od rodzaju trybu graficznego. Funkcja 04h ustawia położenie na ekranie kursora myszy. Należy przygotować w rejestrze CX współrzędną X położenia myszy, w rejestrze DX współrzędną Y położenia myszy. 5. Omówienie kodu programu org 100h ;inicjalizacja myszy mov ax,0000 ;kolejnym krokiem po inicjalizacji jest sprawdzenie czy jest mysz cmp ax,0ffffh ;porównanie, jeśli a ax wartość zgadza się z 0ffffh je short mouse0 ;wykonujemy skok do etykiety mause0 ;jeśli natomiast porównanie ax z 0ffffh nie powiedzie się kończymy program z bledem mov ax,4c01h ;wyjście z błędem int 21h ;wyjście mouse0: ;etykieta 5
;uruchamiamy tryb graficzny 13h mov ax,0013h int 10h ;przerwanie 10h ;wyswietlamy wskaznik myszy mov ax,0001h ;przerwanie myszy 33h mouse1: ;pobieramy informacje o naciśniętych przyciskach ;oraz o pozycji gdzie zostało wciśnięte na ekranie ;w resetrach cx - poz x, dx - poz y ekranu mov ax,0003h shr cx,01 ;dzielimy pozycje x przez 2 zeby bylo dobrze, w innym przypadku będziemy rysować z przesunięciem ;zachowujemy informacje o stanie przyciskow bo bedzie jeszcze nam potrzebna push bx ;sprawdzamy czy zostal nacisniety lewy przycisk myszy ;filtrujemy w celu wyluskania informacji o lewym przycisku myszy mov ax,bx and ax,0000000000000001b ;filtracja sprawdzamy czy został wciśnięty lewy przycisk 16bit cmp ax,0000000000000001b ;porównujemy czy wartości się zgadzają jne short mouse2 ;jeśli nie to skaczemy do etykiety mouse2 ;chowamy wskaznik myszy mov ax,0002h ;wyswietlamy piksel w pozycji (x,y) = (cx,dx) mov al,02 ;kolor zmieniając parametr, zmieniamy kolor mov ah,0ch ; wyświetlanie pixelka mov bh,0 ;strona numer 0 to tak jakby rysowanie w trybie rzeczywistym int 10h ;wyswietlamy wskaznik myszy mov ax,0001h mouse2: pop bx ;znowu mamy informacje oprzyciskach ;sprawdzamy czy prawy wcisniety ;filtrujemy w celu wyluskania informacji o prawym przycisku myszy 6
mov ax,bx ; do rejestru ax wpisujemy informację o przyciskach and ax,0000000000000010b ;filtracja - sprawdzamy czy został wciśnięty prawy przycisk 15bit cmp ax,0000000000000010b ;porównujemy wartości jne short mouse1 ;jeśli nie to skaczemy do etykiety mouse1 ;gdy wcisniety lewy przycisk to konczymy program mov ax,4c00h ; funkcja wyjścia z programu int 21h ;wychodzimy 6. Działanie programu Po uruchomieniu programu zostaje wyświetlony kursor myszy: 7
Zrzut przedstawia narysowane za pomocą myszki pikselki: 7. Wnioski Program jest optymalny, krótki oraz szybki, spełnia początkowe założenia. Pozwolił on na zdobycie nowej wiedzy praktycznej. Program może służyć do rysowania w Dos'ie. Napisanie tego programu pozwoliło mi pogłębić swoją wiedzę na temat programowania w języku asembler, zapoznałem się dokładniej z architekturą x86 oraz trybem graficznym 13h jak również z przerwaniem myszy 33h. 8