   #Start Contents

         Opis najczesciej uzywanych funkcji podstawowych przerwan

   Najlepszy opis wszystkich funkcji wszystkich przerwan mozna znalezc w
   Ralf Brown's Interrupt List (RBIL). Po sciagnieciu RBIL nalezy
   rozpakowac wszystkie archiwa i uruchomic
                COMBINE .

   aby zbudowac liste przerwan, oraz
                COMBINE -p .

   aby zbudowac liste portow. Lista przerwan znajduje sie w pliku
   INTERRUP.LST, a mozna ja przegladac programem INTERHLP.EXE lub
   dowolnym edytorem. Lista portow znajduje sie w pliku PORTS.LST, a
   mozna ja przegladac programem II.EXE lub dowolnym edytorem.

   UWAGA: Niektore debugery moga wplywac na wartosci widziane w
   rejestrach. Moze sie tak stac na przyklad wtedy, gdy przerwanie, ktore
   wywolujemy, jest wewnetrznie wykorzystywane przez debuger. W
   szczegolnosci, moze to miec miejsce w przypadku Turbo Debuggera i
   funkcji 3Fh i 40h przerwania DOS-a (int 21h).

   Spis tresci tej strony:
     * int 10h (funkcje 0, 2, 3, E, F i 13h)
     * int 13h (funkcje 2 i 3)
     * int 15h (funkcja 86h)
     * int 16h (funkcje 0, 1, 2 i 4)
     * int 21h (funkcje 1, 2, 9, 2a+2b, 2c+2d, 3c, 3d, 3e, 3f, 40h, 41h,
       42h, 4b i 4c)
     _________________________________________________________________

int 10h (przerwanie karty graficznej)

     * funkcja 0 - ustaw tryb graficzny:
       Argumenty:
          + AH = 0
          + AL = zadany tryb graficzny (patrz nizej)
       Podstawowe tryby graficzne i ich "rozdzielczosci":
          + 0 - tekstowy, 40x25, segment 0B800
          + 1 - tekstowy, 40x25, segment 0B800
          + 2 - tekstowy, 80x25, segment 0B800
          + 3 - tekstowy (tradycyjny), 80x25, segment 0B800
          + 12h - graficzny, 640x480 w 16/256tys. kolorach, segment 0A000
          + 13h - graficzny, 320x200 w 256 kolorach, segment 0A000
     * funkcja 2 - ustaw pozycje kursora tekstowego:
       Argumenty:
          + AH = 2
          + BH = numer strony, zazwyczaj 0
          + DH = wiersz (0 oznacza gorny)
          + DL = kolumna (0 oznacza lewa)
     * funkcja 3 - pobierz pozycje kursora tekstowego i jego rozmiar:
       Argumenty:
          + AH = 3
          + BH = numer strony, zazwyczaj 0
       Zwraca:
          + CH = poczatkowa linia skanowania (gorna granica kursora)
          + CL = koncowa linia skanowania (dolna granica kursora)
          + DH = wiersz (0 oznacza gorny)
          + DL = kolumna (0 oznacza lewa)
     * funkcja 0Eh - wypisz znak na ekran:
       Argumenty:
          + AH = 0Eh
          + AL = kod ASCII znaku do wypisania
          + BH = numer strony, zazwyczaj 0
          + BL = kolor (tylko w trybach graficznych)
     * funkcja 0Fh - pobierz tryb graficzny:
       Argumenty:
          + AH = 0Fh
       Zwraca:
          + AH = liczba kolumn znakowych
          + AL = biezacy tryb graficzny
          + BH = aktywna strona
     * funkcja 13h - wyswietl napis:
       Argumenty:
          + AH = 13h
          + AL = tryb:
               o bit 0 ustawiony = przesuwaj kursor po zapisie
               o bit 1 ustawiony = dane zawieraja naprzemienne znaki i
                 atrybuty (bit nieustawiony oznacza, ze dane zawieraja
                 tylko znaki)
               o bit 2-7 sa zarezerwowane i musza byc rowne 0
          + BH = numer strony graficznej
          + BL = atrybut znakow, gdy dane zawieraja tylko znaki
          + CX = dlugosc danych
          + DH = numer wiersza na ekranie, gdzie wyswietlic napis
          + DL = numer kolumny na ekranie, gdzie wyswietlic napis
          + ES:BP = adres danych
     _________________________________________________________________

int 13h (obsluga dyskow)

     * funkcja 2 - czytaj sektory dysku do pamieci:
       Argumenty:
          + AH = 2
          + AL = liczba sektorow do odczytania (musi byc niezerowa)
          + CH = najmlodsze 8 bitow numeru cylindra
          + CL =
            bity 0-5: numer sektora (1-63)
            bity 6-7: najstarsze 2 bity numeru cylindra (tylko dla
            twardych dyskow)
          + DH = numer glowicy
          + DL = numer dysku, dla dyskow twardych bit7=1 (0=dysk A:,
            1=B:, 80h=C:, 81h=D:, ...)
          + ES:BX = adres miejsca, gdzie beda zapisane dane odczytane z
            dysku
       Zwraca:
          + flaga CF=1, jesli wystapil blad; CF=0, gdy nie bylo bledu
          + AH=status (patrz nizej)
          + AL=liczba przeczytanych sektorow (nie zawsze prawidlowy)
       Podstawowe wartosci statusu:
          + 0 - operacja zakonczyla sie bez bledow
          + 3 - dysk jest chroniony przed zapisem
          + 4 - sektor nie znaleziony / blad odczytu
          + 6 - zmiana dyskietki. Najczesciej spowodowany tym, ze naped
            nie zdazyl sie rozpedzic. Ponowic probe.
          + 80h - przekroczony limit czasu operacji. Dysk nie jest
            gotowy.
       Przyklad (czytanie bootsektora):
                mov     ax, 0201h       ; funkcja czytania sektorow
                xor     dx, dx          ; glowica 0, dysk 0 = A:
                mov     cx, 1           ; numer sektora
                mov     bx, bufor       ; dokad czytac
                int     13h             ; czytaj
                jnc     czyt_ok         ; sprawdz, czy blad
     * funkcja 3 - zapisz dane z pamieci na sektorach dysku:
       Argumenty:
          + AH = 3
          + AL = liczba sektorow do zapisania (musi byc niezerowa)
          + CH = najmlodsze 8 bitow numeru cylindra
          + CL =
            bity 0-5: numer sektora (1-63)
            bity 6-7: najstarsze 2 bity numeru cylindra (tylko dla
            twardych dyskow)
          + DH = numer glowicy
          + DL = numer dysku, dla dyskow twardych bit7=1 (0=dysk A:,
            1=B:, 80h=C:, 81h=D:, ...)
          + ES:BX = adres miejsca, skad beda pobierane dane do zapisania
            na dysk
       Zwraca:
          + flaga CF=1, jesli wystapil blad; CF=0, gdy nie bylo bledu
          + AH=status (patrz wyzej)
          + AL=liczba zapisanych sektorow (nie zawsze prawidlowy)
       Przyklad (zapisywanie bootsektora):
                mov     ax, 0301h       ; funkcja zapisu sektorow
                xor     dx, dx          ; glowica 0, dysk 0 = A:
                mov     cx, 1           ; numer sektora
                mov     bx, bufor       ; skad brac dane do zapisu
                int     13h             ; zapisz
                jnc     blad            ; sprawdz, czy blad
     _________________________________________________________________

int 15h (czesc BIOS-u)

     * funkcja 86h - czekaj okreslona liczbe milisekund:
       Argumenty:
          + AH = 86h
          + CX:DX = czas w milisekundach
       Zwraca:
          + flaga CF=0, gdy nie wystapil blad; CF=1 po bledzie
          + AH = status:
            80h nieprawidlowa komenda (PC,PCjr)
            83h funkcja juz trwa
            86h funkcja nie jest obslugiwana (XT)
     _________________________________________________________________

int 16h (obsluga klawiatury)

     * funkcja 0 - pobierz kod nacisnietego klawisza (lub czekaj na
       nacisniecie):
       Argumenty:
          + AH = 0
       Zwraca:
          + AH = BIOSowy kod klawisza (skankod)
          + AL = kod klawisza ASCII
     * funkcja 1 - sprawdz, czy nacisnieto klawisz:
       Argumenty:
          + AH = 1
       Zwraca:
          + gdy nie nacisnieto klawisza:
               o flaga ZF=1
          + gdy nacisnieto klawisz:
               o flaga ZF=0
               o AH = BIOSowy kod klawisza (skankod)
               o AL = kod klawisza ASCII
     * funkcja 2 - pobierz stan klawiszow przelaczajacych:
       Argumenty:
          + AH = 2
       Zwraca:
          + AL = flagi:
            bit7 = klawisz Insert jest aktywny
            bit6 = Caps Lock aktywny
            bit5 = Num Lock aktywny
            bit4 = Scroll Lock aktywny
            bit3 = nacisniety klawisz ALT
            bit2 = nacisniety klawisz CTRL
            bit1 = nacisniety lewy klawisz SHIFT
            bit0 = nacisniety prawy klawisz SHIFT
     * funkcja 4 (Tandy 2000, ale chyba nie tylko) - oproznij bufor
       klawiatury:
       Argumenty:
          + AH = 4
     _________________________________________________________________

int 21h (DOS)

     * funkcja 1 - czytaj klawisz:
       Argumenty:
          + AH = 1
       Zwraca:
          + AL = kod klawisza ASCII
     * funkcja 2 - wyswietl znak:
       Argumenty:
          + AH = 2
          + DL = kod ASCII znaku do wypisania
     * funkcja 9 - wyswietl napis:
       Argumenty:
          + AH = 9
          + DS:DX = adres lancucha znakow zakonczonego znakiem dolara "$"
     * funkcja 2A - pobierz date systemowa:
       Argumenty:
          + AH = 2Ah
       Zwraca:
          + CX = rok (1980-2099)
          + DH = miesiac
          + DL = dzien
          + podobno AL = dzien tygodnia (0=niedziela)
     * funkcja 2B - ustaw date systemowa:
       Argumenty:
          + AH = 2Ah
          + CX = rok (1980-2099)
          + DH = miesiac (1-12)
          + DL = dzien (1-31)
       Zwraca:
          + AL = status (0=sukces, FF=blad)
     * funkcja 2C - pobierz czas systemowy:
       Argumenty:
          + AH = 2Ch
       Zwraca:
          + CH = godzina
          + CL = minuta
          + DH = sekunda
          + DL = setne sekundy (nie zawsze)
     * funkcja 2D - ustaw czas systemowy:
       Argumenty:
          + AH = 2Dh
          + CH = godzina
          + CL = minuta
          + DH = sekunda
          + DL = setne sekundy
       Zwraca:
          + AL = status (0=sukces, FF=blad)
     * funkcja 3C - utworz plik (jesli istnieje, skroc do zerowej
       dlugosci):
       Argumenty:
          + AH = 3Ch
          + CX = atrybuty (patrz nizej)
          + DS:DX = wskaznik na nazwe pliku, zakonczona bajtem zerowym
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
               o AX = uchwyt do pliku
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 3, 4 lub 5 (patrz nizej)
       Atrybuty pliku:
          + bit0 = plik tylko do odczytu
          + bit1 = ukryty
          + bit2 = systemowy
          + bit3 = etykieta dysku (ignorowane)
          + bit4 = zarezerwowany, musi byc rowny 0 (katalog)
          + bit5 = bit archiwalny
          + bit7 = udostepnialnosc w Novell NetWare
       Najczestsze zwracane kody:
          + 0 = brak bledu
          + 1 = nieprawidlowy numer funkcji
          + 2 / 3 = plik / sciezka nie znaleziona
          + 4 = za duzo otwartych plikow
          + 5 = brak dostepu
          + 6 = niewlasciwy uchwyt do pliku
          + 8 = za malo pamieci
          + A = nieprawidlowe srodowisko
          + B = nieprawidlowy format
          + C = nieprawidlowy kod dostepu
          + 56h = nieprawidlowe haslo
       Przyklad:
        mov     ah, 3ch                 ; utworz plik
        xor     cx, cx                  ; zadnych atrybutow
        mov     dx, plik                ; DS:DX = adres nazwy pliku
        int     21h
        jnc     plik_ok                 ; sprawdz, czy wystapil blad
     * funkcja 3D - otworz istniejacy plik:
       Argumenty:
          + AH = 3Dh
          + AL = tryb dostepu (patrz nizej)
          + DS:DX = adres nazwy pliku zakonczonej bajtem zerowym
          + CL = maska atrybutow pliku do wyszukiwania (tylko serwery)
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
               o AX = uchwyt do pliku
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 1, 2, 3, 4, 5, C, 56h (patrz wyzej)
       Tryb dostepu do pliku:
          + bit0-2 = tryb dostepu:
            000 = tylko do odczytu
            001 = tylko do zapisu
            010 = odczyt/zapis
          + bit3 = 0
          + bit4-6 = tryb wspoldzielenia:
            000 = tryb kompatybilnosci
            001 = zabron innym odczytu i zapisu
            010 = zabron innym zapisu
            011 = zabron innym odczytu
            100 = nie zabraniaj nikomu niczego
          + bit7 = prywatnosc. Plik nie bedzie dziedziczony przez procesy
            potomne
       Przyklad:
        mov     ax, 3d02h               ; otworz plik R/W, tryb zgodnosci
        mov     dx, plik                ; DS:DX = adres nazwy pliku
        int     21h
        jnc     otw_ok
     * funkcja 3E - zamknij plik:
       Argumenty:
          + AH = 3Eh
          + BX = uchwyt do pliku
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 6 (patrz wyzej)
     * funkcja 3F - czytaj z pliku:
       Argumenty:
          + AH = 3Fh
          + BX = uchwyt do pliku
          + CX = liczba bajtow do odczytania
          + DS:DX = adres bufora, ktory ma przyjac dane
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
               o AX = liczba przeczytanych bajtow
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 5, 6 (patrz wyzej)
     * funkcja 40h - zapisz do pliku:
       Argumenty:
          + AH = 40h
          + BX = uchwyt do pliku
          + CX = liczba bajtow do zapisania
          + DS:DX = adres bufora zawierajacego dane do zapisania
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
               o AX = liczba zapisanych bajtow
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 5, 6 (patrz wyzej)
     * funkcja 41h - skasuj plik:
       Argumenty:
          + AH = 41h
          + DS:DX = adres nazwy pliku, zakonczonej bajtem zerowym
          + maska atrybutow (tylko serwery)
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 2, 3, 5 (patrz wyzej)
     * funkcja 42h - ustaw biezaca pozycje w pliku:
       Argumenty:
          + AH = 42h
          + AL = skad odliczamy pozycje:
            0 = poczatek pliku
            1 = biezaca pozycja w pliku
            2 = koniec pliku
          + BX = uchwyt do pliku
          + CX:DX = liczba bajtow, o ktore chcemy sie przesunac (moze byc
            ujemna)
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
               o DX:AX = nowa pozycja, w bajtach od poczatku pliku
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 1, 6 (patrz wyzej)
     * funkcja 4B - zaladuj i/lub uruchom inny program:
       Argumenty:
          + AH = 4Bh
          + AL = rodzaj dzialania:
            0 = zaladuj i uruchom
            1 = zaladuj, ale nie uruchamiaj
            3 = zaladuj, nakladajac na aktualny program
            4 = zaladuj i uruchom w tle (tylko European MS-DOS 4.0)
          + DS:DX = adres nazwy programu, zakonczonej bajtem zerowym.
            Nazwa musi uwzgledniac rozszerzenie pliku.
          + ES:BX = adres bloku parametrow (patrz nizej)
          + CX = tryb (tylko dla AL=4):
            0 = proces potomny po zakonczeniu zostaje umieszczony w
            stanie zombie
            1 = kod zakonczenia procesu potomnego jest odrzucany
       Zwraca:
          + gdy brak bledu:
               o flaga CF=0
          + gdy blad:
               o flaga CF=1
               o AX = numer bledu: 1, 2, 5, 8, A, B (patrz wyzej)
       Blok parametrow (AL=0,1,4):
          + WORD: segment zmiennych srodowiska dla procesu potomnego (0 =
            uzyc srodowiska rodzica)
          + DWORD: wskaznik na linie polecen dla programu uruchamianego
          + DWORD: wskaznik na pierwszy FCB dla procesu potomnego
            (nieaktualne)
          + DWORD: wskaznik na drugi FCB dla procesu potomnego
            (nieaktualne)
          + (dla AL=1) DWORD: po zakonczeniu bedzie zawierac poczatkowe
            SS:SP
          + (dla AL=1) DWORD: po zakonczeniu bedzie zawierac poczatkowe
            CS:IP
       Przyklad:
        mov     [kom_ln+2], cs  ;uzupelniamy pola potrzebnych struktur
        mov     [fcb1+2], cs
        mov     [fcb2+2], cs

        mov     ax, 4b00h       ; funkcja uruchomienia programu
        mov     dx, program     ; adres nazwy programu
        mov     bx, srod        ; srodowisko i cala reszta
        int     21h             ; uruchamiamy
        ....

        fcb             db 3, " ", 0, 0, 0, 0, 0
        linia_kom       db 0
                        times 7fh db 0dh

        srod            dw      0
        kom_ln          dw      linia_kom, 0
        fcb1            dw      fcb, 0
        fcb2            dw      fcb, 0
     * funkcja 4Ch - zakoncz dzialanie biezacego programu:
       Argumenty:
          + AH = 4Ch
          + AL = kod wyjscia (errorlevel) zwracany systemowi operacyjnemu
            (przyjmuje sie, ze AL=0 oznacza zakonczenie bez bledow)

   Spis tresci off-line (klawisz dostepu 1)
   Spis tresci on-line (klawisz dostepu 2)
   Ulatwienia dla niepelnosprawnych (klawisz dostepu 0)
