Wykład 9 str. 1
Opracowała: G. Sobiczewska (WSInf Łódź) data ostatniej modyfikacji 2008-07-11
Przetwarzanie danych klawiaturowych - przerwania
Usługi przerwań BIOS i DOS (rys. 1) zapewniają obsługę zadań:
związanych z konsolą (klawiatura jako urządzenie wejściowe i ekran jako wyjściowe),
związanych z dyskiem twardym,
związanych z drukarką,
sterowania zegarem,
alokacji pamięci.
Dzięki temu programista nie musi zajmować się obsługą sprzętu na najniższym poziomie i ten sam
program może być uruchomiony na dowolnym komputerze.
program użytkownika
DOS (INT 21h)
BIOS (INT 10h i INT 16h)
Sprzęt IBM PC – karty urządzeń
(dostęp przez porty lub/i odpowiednie lokalizacje w RAM)
Rys. 1. Zasady obsługi przerwań
Przerwania dzielą się na:
sprzętowe generowane przez układ 8259 Interrupt Controler, który sygnalizuje procesorowi
konieczność przerwania wykonywanego programu i obsługi przerwania (np. wciśnięcie klawisza
powoduje zatrzymanie programu użytkownika i wykonanie procedury BIOS, która odczytuje znak
z portu we i zapisuje go w buforze pamięci); polecenie CLI (Clear Interrupt Flag) powoduje
wyłączenie, a STI (Set Interrupt Flag) włącza obsługę zewnętrznych przerwań ponownie,
programowe - z punktu widzenia technicznego nie są przerwaniami, ale narzędziem do obsługi we/wy
i są realizowane za pomocą rozkazu INT, który odwołuje się do podprocedury systemu operacyjnego
lub BIOS. Przed odwołaniem się do obsługi przerwania należy umieścić w rejestrze AH numer
funkcji, jaka ma być wykonana. Inne parametry mogą być przekazywane poprzez inne rejestry lub
stos.
Procesor obsługuje polecenie przerwania przy użyciu tablicy wektorów przerwań, która znajduje się
w początkowych 1024 bajtach pamięci. Każdy element tej tablicy jest 32-bitowym adresem typu
segment:przesunięcie, który wskazuje początek procedury obsługi przerwań. Rzeczywiste adresy
procedur zmieniają się w zależności od komputera. Procedury obsługi są wykonywane aż do napotkania
rozkazu IRET, który powoduje wznowienie pracy programu użytkownika od kolejnego polecenia.
Operandem rozkazu INT jest numer przerwania (jest to liczba z zakresu od 0 do 255 czyli 0ffh), np.:
INT 10h służy do obsługi ekranu (grafiki) i odwołuje się do BIOS,
INT 16h służy do obsługi klawiatury na poziomie BIOS,
INT 21h służy do pobierania danych wejściowych z klawiatury oraz wyświetlania wyjściowych na
ekranie, obsługi plików i zarządzania pamięcią i przekazuje sterowanie systemowi operacyjnemu MS
DOS (ok. 90 funkcji).
Zanim zostaną podane najważniejsze funkcje w/w przerwań należy przypomnieć, że typowy monitor
pracujący w trybie tekstowym o numerze 03h wyświetla 25 wierszy (od 0 do 24) i 80 kolumn (od 0 do
79), które stanowią siatkę adresowalnych lokacji i w każdej z nich można umieścić kursor. Każdy znak
wyświetlany na ekranie zajmuje w RAM 2 bajty. Pierwszy bajt przechowuje kod ASCII znaku, a drugi
informacje o jego atrybucie (kolor znaku, kolor tła, migotanie). Zatem informacja o każdym wierszu
zajmuje 160 bajtów, natomiast o całym ekranie jest przechowywana w tzw. obszarze pamięci ekranu
Wykład 9 str. 2
Opracowała: G. Sobiczewska (WSInf Łódź) data ostatniej modyfikacji 2008-07-11
(Video Display Area), czyli w buforze ekranu o pojemności 4 kB (25*80 = 2000 B na znaki i tyle samo
na ich atrybuty i 96 B wolnych).
Lokalizacja bufora w BIOSie zmienia się w zależności od trybu (tekstowy czy graficzny, kolorowy czy
monochromatyczny), np. dla 16-kolorowego trybu tekstowego 03h to segment B800h. Chociaż program
asemblerowy mógłby przekazywać dane bezpośrednio do tego obszaru, stosuje się przerwania, bo
operacje INT 21h i INT10h znają położenia bufora.
Wybrane funkcje przerwania INT 21h
Różne funkcje DOS służące do wprowadzania znaków (01h, 06h, 07h, 08h) różnią się następującymi
możliwościami:
dostęp do 15-znakowego bufora cyklicznego klawiatury używanego przez DOS do przechowywania
kodów naciskanych klawiszy; po zapełnieniu bufora kolejne znaki są ignorowane,
echo znaków, czyli wyświetlanie wprowadzanego znaku na ekranie,
rozpoznawanie kombinacji CTRL+BREAK, czyli zatrzymywanie funkcji po wciśnięciu tej
kombinacji przez użytkownika,
filtrowanie znaków sterujących (np. ENTER, TAB czy BACKSPACE).
Filtrowane wejście z echem - 01h
Wywołanie funkcji wymaga tylko umieszczenia w rejestrze AH
numeru funkcji 01h. Funkcja oczekuje na wciśnięcie klawisza (nie
korzysta z bufora), wysyła go do standardowego wyjścia (echo),
reaguje na CTRL+BREAK i filtruje znaki sterujące.
Po realizacji funkcji kod wpisanego znaku znajduje się w AL.
bufor N
echo T
CTRL+BREAK T
filtrowanie T
Wyjście znaku - 02h
Funkcja DOS o numerze 2 wysyła znak do standardowego wyjścia i przenosi kursor o jedną pozycję.
W AH umieszcza się 02h, a DL powinien zawierać kod znaku do wyświetlenia.
Wejście/wyjście bezpośrednie - 06h
Funkcja 06h może odczytywać dane ze standardowego wejścia lub zapisywać do standardowego wyjścia.
W przypadku wyświetlania znaku w AH umieszcza się 06h, DL powinien zawierać znak do
wyświetlenia.
W przypadku użycia tej funkcji znak jest pobierany z buforu. Jeżeli
żaden znak tam nie oczekuje funkcja kończy działanie, ustawiając
flagę ZF na 1. Kombinacja CTRL+BREAK nie jest aktywna i nie
działa filtrowanie. Należy ustawić AH na 06h, DL na 0FFh.
Pobrany znak jest zwracany w AL.
bufor T
echo N
CTRL+BREAK N
filtrowanie N
Przykładem użycia tej funkcji jest procedura służąca do czyszczenia bufora klawiatury:
czysc_bufor PROC
PUSH AX
;zapis zawartosci rejestrow wykorzystywanych przez procedure na stosie
PUSH
DX
powrot:
MOV AH,6 ;zapisanie do rejestru numeru funkcji DOS
MOV DL,0FFh;zapisanie do rejestru DL liczby 0FFh, aby zaden znak nie byl wyswietlony
INT
21h
JZ
powrot ;skok do etykiety powrot w przypadku, gdy ZF = 0
POP
DX
;pobranie ze stosu zawartości rejestrow
POP
AX
RET
;powrot
do
programu
wywolujacego
czysc_bufor
ENDP
Wykład 9 str. 3
Opracowała: G. Sobiczewska (WSInf Łódź) data ostatniej modyfikacji 2008-07-11
Bezpośrednie wejście z klawiatury bez echa
i bez CTRL+BREAK - 07h
Funkcja czeka na niefiltrowany znak z wejścia.
W AH wstawia się 07h, a pobrany znak zostanie
wyświetlony a AL.
bufor N
echo N
CTRL+BREAK N
filtrowanie N
Bezpośrednie wejście z klawiatury bez echa
z CTRL+BREAK - 08h
Funkcja analogiczna do 07h, ale reaguje na
kombinację CTRL+BREAK.
bufor N
echo N
CTRL+BREAK T
filtrowanie N
Wyjście ciągu - 09h
Przed wywołaniem przerwania INT 21h z funkcją 09h należy:
zdefiniować w obszarze danych ciąg do wyświetlenia i umieścić po nim ogranicznik w postaci znaku
$ lub 24h,
umieścić w rejestrze AH numer funkcji 09h,
załadować przesunięcie początkowego znaku wyświetlanego ciągu do rejestru DX, np. za pomocą
rozkazu LEA lub MOV z operatorem OFFSET.
Operacja INT wyświetla znaki od lewej do prawej aż do napotkania znaku $. Nie zmienia zawartości
rejestrów. Znaki wykraczające poza ostatnią kolumnę są automatycznie przenoszone, a ekran w razie
potrzeby przewijany.
Buforowane wejście z klawiatury - 0Ah
Funkcja DOS o numerze 0Ah umożliwia odczytanie ze
standardowego wejścia ciągu znaków o maksymalnej długości 255
znaków. Klawisz BACKSPACE może być użyty do usunięcia
znaku i cofnięcia kursora. Klawisz ENTER przerywa
wprowadzanie znaków. Rejestr AH powinien jak zawsze zawierać
numer funkcji, a DX przesunięcie obszaru, do którego będą
zapisywane znaki.
bufor T
echo T
CTRL+BREAK T
filtrowanie T
Sposób organizacji informacji tego obszaru przedstawiono na rysunku.
0 bajt
1
2
3
4
n+1
n
m
z n a k ... i
max l. znaków
(nie więcej niż 255)
l. znaków wprowa-
dzonych (bez ENTER)
obszar buforu wejścia
Sprawdzenie bufora klawiatury - 0Bh
Funkcja sprawdza obecność znaków w buforze klawiatury. Jeśli w buforze oczekuje jakiś znak, to AL =
0FFh, a jeśli nie AL = 0h.
Oczyszczenie bufora klawiatury i wywołanie funkcji wejścia - 0Ch
Funkcja DOS o numerze 0Ch czyści bufor klawiatury, a następnie wywołuje inną funkcję wejścia
konsoli. W AH należy umieścić 0Ch, a w AL numer kolejnej funkcji klawiatury (01h, 06h, 07h czy 08h).
Wyjście AL zawiera wprowadzony z klawiatury znak.
Pobranie daty - 2Ah
Wywołanie przerwania 21h dla funkcji 2Ah umieszcza w rejestrach następujące informacje: w AL numer
dnia tygodnia (niedziela = 0), w CX - rok (1980 - 2099), DH - miesiąc (01 - 12) i w DL - dzień (00 - 31).
Ustawienie daty - 2Bh
Po załadowaniu rejestrów CX, DH, DL i wywołaniu przerwania dla funkcji 2Bh zawartość rejestru AL
informuje, czy operacja się powiodła (00h), czy nie (0FFh).
Wykład 9 str. 4
Opracowała: G. Sobiczewska (WSInf Łódź) data ostatniej modyfikacji 2008-07-11
Pobranie czasu - 2Ch
Przerwanie zwraca następujące wartości: w CH - godzinę (0 - 23), w CL - minuty (00 - 59), w dH -
sekundy (00 - 59) i w DL - setne części sekundy (00 - 99).
Ustawienie czasu - 2Dh
Po załadowaniu rejestrów takich, jak przy pobieraniu czasu i wykonaniu przerwania rejestr AL informuje,
czy operacja się udała (00h), czy nie (0ffh).
Wybrane funkcje przerwania INT 16h
Przerwanie to umożliwia przeprowadzanie operacji klawiaturowych za pomocą procedur BIOS.
Ustawienie częstotliwości powtarzania klawiszy - 03h
Jeśli klawisz zostanie przytrzymany dłużej niż 0,5 s, klawiatura przejdzie w tryb powtarzania klawiszy.
Parametry powtarzania (opóźnienie i częstotliwość) można zmienić ładując do rejestru AH numer funkcji
03h, do rejestru AL numer podfunkcji 05h, do rejestru BH - opóźnienie (0 - 0,25 s; 1 - 0,5 s; 2 - 0,75 s lub
3 - 1 s), a do BL częstotliwość (od 0 - najmniejsza do 31 największa). Następnie należy wywołać
przerwanie INT 16h.
Zapisywanie danych z klawiatury w buforze - 05h
Funkcja pozwala umieścić znaki w buforze klawiatury tak, jakby to użytkownik nacisnął klawisz.
Przed wywołaniem przerwania należy załadować znak ASCII do rejestru CH, a jego kod klawisza do CL.
Znaki można ładować do czasu, aż bufor się zapełni (wówczas flaga CF i rejestr AL przybiorą wartość 1.
Odczyt znaku z klawiatury - 10h
Operacja sprawdza, czy w buforze klawiatury jest wpisany znak. Jeśli nie ma żadnego, czeka na jego
wciśnięcie. Jeżeli jest przekazuje go do rejestru AL, a kod klawisza do AH. Jeśli wciśnięty został klawisz
funkcyjny (HOME, F1), to do AH wpisywany jest jego kod, a do AL 00h lub e0h (tzw. zduplikowane
klawisze sterujące, np. HOME czy PAGEUP).
Sprawdzenie, czy znak jest w buforze - 11h
Jeśli wpisany znak jest w buforze, operacja czyści flagę ZF i przekazuje znak do rejestru Al, a kod
klawisza do AH. Znak pozostaje w buforze. Jeśli w buforze nie ma żadnego znaku operacja ustawia flagę
ZF i nie czeka.
Informacje zwrotne o stanie klawiatury - 12h
Operacja przekazuje informacje o stanie klawiatury z biosowego obszaru danych klawiatury o lokacji
40:17h do rejestru AL oraz bajt o lokacji 40:18h do rejestru AH.
Znaczenie poszczególnych bitów tych bajtów pamięci (a zatem po wywołaniu przerwania rejestrów AH
i AL) ustawionych na 1, a oznaczających aktywność lub naciśnięcie poszczególnych klawiszy ilustrują
tabele.
Tab. 1. Bajt stanu klawiatury o lokacji 40:17h (AL)
bit
7 6 5 4 3 2 1 0
klawisz aktywny
Insert
aktywny
CapsLock
aktywny
NumLock
aktywny
ScrollLock
naciśnięty
prawy
ALT
naciśnięty
prawy
Ctrl
naciśnięty
lewy Shift
naciśnięty
prawy
Shift
Tab. 2. Bajt stanu klawiatury o lokacji 40:18h (AH)
bit 7 6 5 4 3 2 1 0
klawisz naciśnięty
Insert
naciśnięty
CapsLock
naciśnięty
NumLock
naciśnięty
ScrollLock
aktywny
Ctrl/NumL
ock/Pause
naciśnięty
SysReq
naciśnięty
lewyAlt
naciśnięty
lewy Ctrl