Programowanie w języku Assembler

Krótki opis przerwań obsługi klawiatury i dysków IBM PC

  • 2008-05-09 12:52
  • 0 komentarzy
  • 4662 odsłony
  • Oceń ten tekst jako pierwszy

1. Omówienie przerwań obsługi klawiatury.

 Klawiatura w IBM PC obsługiwana jest przez BIOS. Mikroprocesor
wbudowany w klawiaturę przesyła do karty głównej informacje o wciśnięciu, zwolnieniu i przekroczeniu kolejnego interwału
przytrzymywania każdego klawisza. Nadchodzenie tych informacji sygnalizowane jest przerwaniem o numerze 9 (sprzętowe
 klawiatury). Rejestry wejścia klawiatury mieszczą się w przestrzeni wejścia/wyjścia od adresu 0060H poczynając.
Nie wydaje się rozsądne przejmowanie obsługi tego przerwania, chociażby z tego powodu, że protokoły komunikacji klawiatur
XT i AT są mocno skomplikowane. Na potrzeby DOS'u i programów użytkowych BIOS udostępnia przerwanie o numerze
 22(16H), a w jego ramach trzy podstawowe funkcje:
- gdy AH=0 po wywołaniu rozkazem INT 22 podprogram obsługi udostępnia kolejny znak oczekujący w buforze klawiatury lub,
  gdy bufor jest pusty, oczekuje na przyciśnięcie klawisza generującego znak i po jego nadejściu umieszcza kod podstawowy
  (ASCII) znaku w AL, zaś kod pomocniczy w AH;
- gdy AH=1 po wywołaniu rozkazem INT 22 podprogram obsługi sprawdza, czy w buforze klawiatury oczekuje znak .
   Jeśli znak oczekuje, jego kod podstawowy zostaje umieszczony w AL, zaś pomocniczy w AH, ustawiany jest wskaźnik ZF=0;
   jeśli brak znaku, następuje tylko ustawienie wskaźnika ZF=1; nie występuje oczekiwanie na naciśnięcie klawisza;
- gdy AH=2 po wywołaniu rozkazem  INT 22 podprogram obsługi umieszcza w rejestrze AL stan bajtu klawiszy specjalnych
   "shift", w którym poszczególne bity są interpretowane jako:
    7 - stan Insert(związany z klawiszem Ins)  
    6 - stan CapsLock
    5 - stan NumLock
    4 - stan ScrollLock
    3 - Alt
    2 - Ctrl
    1 - lewy klawisz Shift
    0 - prawy Shift  
 bity 3..0 odpowiadają bieżącemu stanowi(wciśnięty- 1, zwolniony- 0) odpowiednich klawiszy, zaś bity 4..7 zachowują się jak
 przerzutniki: każde naciśnięcie odpowiedniego klawisza  powoduje zmianę stanu bitu na przeciwny.
Wersje BIOS'u (z datą generacji po 11/15/85) dla AT udostępniają dodatkowo funkcję 16,17 i 18(10H,11H i 12H) przeznaczone
głównie do obsługi klawiatur 102- znakowych. Wymienione tu funkcje  przerwania 22(16H) nie dają odbicia znaku na  
ekran- tzw. echa:
- AH=12h-funkcja ta działa podobnie jak funkcja AH=02h , lecz jest od niej nieco lepsza. Zapisuje w rejestrze AX stan klawiszy
  dodatkowych(ustawienie poszczególnych bitów oznacza , że klawisz jest aktywny):
   AL :
   7 - stan Insert(związany z klawiszem Ins)    
   6 - stan CapsLock
   5 - stan NumLock
   4 - stan ScrollLock
   3 - Alt
   2 - Ctrl
   1 - lewy klawisz Shift
   0 - prawy Shift  

AH- dodatkowe informacje:
   bit 0 (8)   - lewy Ctrl
   bit 1 (9)   - lewy Alt
   bit 2 (10) - prawy Ctrl
   bit 3 (11) - prawy Alt
   bit 4 (12) - Scroll Lock
   bit 5 (13) - Num Lock
   bit 6 (14) - Caps Lock
   bit 7 (15) - SysReq

Przerwanie 21:
        AH=1 - wczytanie z klawiatury z echem
            przerwanie zwraca:
        AL = Znak z standardowego urządzenia wejścia
        - czeka na dane z STDIN i wyświetla na STDOUT
        - zwraca 0 dla rozszerzonych klawiszy, później funkcja musi być
          wywołana ponownie by odczytać skankod
          - jeżeli wciśnięto ~Ctrl-Break~, uruchamiane jest ~INT 23~

       AH=0CH - Czyść bufor klawiatury, uruchom funkcję wczytania
       AL = 01, 06, 07, 08 lub 0A   (funkcje wczytania INT 21)
        przerwanie zwraca:
        - główną funkcją jest wyczyszczenie bufora klawiatury i wywołanie
          INT 21 z określoną (w AL) funkcją

2. Przerwania obsługi dysków.

Przerwanie 13H- obsługa dyskietki/dysku
AH=0- inicjacja systemu dyskowego

AH=1- odczyt statusu ostatnio wykonanej operacji dyskowej
Wyniki : AL=0      - operacja wykonana prawidłowo,
              AL=1      - nielegalny rozkaz dla sterowników dysków,
              AL=2      - nie znaleziono znacznika,
              AL=3      - próba zapisu na zabezpieczoną dyskietkę,
              AL=4      - nie znaleziono sektora,
              AL=6      - nie ma dyskietki w mechanizmie,
              AL=8      - błąd w kanale DMA,
              AL=9      - przekroczenie granicy adresowej dla kanału DMA,
              AL=16    - błąd sumy kontrolnej CRC,
              AL=32    - błąd sprzętowy sterownika dysków NEC 765,
              AL=64    - błąd pozycjonowania głowicy,
              AL=128  - przekroczony czas operacji,

AH=2- odczyt sektorów
Wejście: DL - numer stacji dysków(0 - pierwszy dla dysków elastycznych, 80H - pierwszy dla dysków stałych),
              DH- numer głowicy,
              CL- numer sektora,
              CH- numer ścieżki,
              AL- liczba sektorów,
              ES:BX- adres początkowy bufora operacji,
Wyjście: AH- kod statusu,
              AL-  liczba rzeczywiście przeczytanych sektorów,
              Znacznik C=0 - operacja wykonana prawidłowo,
             
AH=3 -  zapis sektorów
AH=4 -  weryfikacja sektorów
Wejście: DL- numer stacji dysków(0 - pierwszy dla dysków elastycznych, 80H - pierwszy dla  dysków  stałych),
              DH- numer głowicy,
              CH- numer ścieżki,
              CL- numer pierwszego sektora,
              AL- liczba sektorów,
              ES:BX- adres bufora,
Wyjście: AH- wynik operacji,
              AL- liczba sektorów, na których wykonano operację,
              Bit znacznika C=1, gdy wystąpi błąd.

AH=5 - formatowanie sektorów
Wejście: DL- numer stacji dysków(0 - pierwszy dla dysków elastycznych, 80H - pierwszy dla  dysków  stałych),
              DH- numer głowicy,
              CH- numer ścieżki,
              ES:BX- adres tabeli 4- bitowych pól adresowych

Przerwanie 1EH- parametry napędu dyskietek

Przerwanie  25H- odczytanie sektorów z dysku. Przerwanie to pozwala na fizyczny odczyt kolejnych sektorów. Odczyt następuje do PAO.
Wejście:  DX- numer pierwszego odczytywanego sektora,
               CX- liczba sektorów do odczytu,
               AL- numer stacji dysków, 0=A(stacja A), 1=B, itd.
               DS:BX- adres bufora odczytu,
Wyjście:  flaga C=0 operacja odczytu przebiegła pomyślnie,
               flaga C=1 błędna operacja odczytu, błędy zakodowane w rejestrach AL i AH.

Przerwanie  26H- zapisanie sektorów na dysku. Przerwanie to pozwala na fizyczny zapis kolejnych sektorów.
Wejście:  DX- numer pierwszego zapisanego sektora logicznego,
               CX- liczba sektorów,
               AL- numer stacji,
               DS:BX- adres bufora PAO zapisu
Wyjście: flaga C=0 operacja zapisu przebiegła pomyślnie,
               flaga C=1 błędna operacja zapisu,

Przerwanie  40H- obsługa dyskietek( gdy jest twardy dysk)

Przerwanie  41H- parametry dysku stałego 1 (tablica)

Przerwanie  46H- parametry dysku stałego 2 (tablica)