Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Gestiunea tastaturii

calculatoare



+ Font mai mare | - Font mai mic



Gestiunea tastaturii

Considerente generale



Exista patru posibilitatii de accesare a tastaturii:

folosind serviciile DOS ale intreruperii INT 21h

folosind serviciile BIOS ale intreruperii INT 16h

folosind intreruperea generata de tastatura INT 09h

prin citirea si scrierea direct in portul de tastatura

Serviciile intreruperi INT 21h sunt cele mai simple pentru accesarea tastaturii, dar si cele mai incete. Serviciile BIOS constituie modul de baza de accesare a tastaturii oferind posibilitatea procesarii diferitelor taste speciale cum ar fi tastele functionale si tastele de control al cursorului.

Intreruperea hard 09h nu este destinata folosirii de catre utilizator, ea este generata de catre controlorul de tastatura la fiecare apasare sau eliberare a unei taste.

Accesarea directa a portului de tastatura constituie modul cel mai rapid dar si cel mai dificil mod.

La fiecare apasare a unei taste, actiunea este anuntata BIOS-ului prin intermediul intreruperii 09h. Intreruperea 09h apeleaza o rutina de tratare a intreruperii care citeste portul de tastatura (60h) pentru a prelua codul tastei apasate. Codul (scancodul) este transferat BIOS-ului care il translateaza intr-un cod de doi octeti. Octetul mai putin semnificativ contine valoarea ASCII a caracterului, iar octetul mai semnificativ contine codul scan. Tastele speciale (cele numerice si cele functionale) contin 0 in octetul mai putin semnificativ si codul scan al tastei in octetul mai semnificativ. Codurile astfel translatate sunt memorate la adresa data de valoarea din locatia 0000:041Eh (in zona tampon a tastaturii), unde sunt pastrate pana cand sunt citite de un anumit program.

O facilitate a tastaturii este cea de a repeta automat codul emis la mentinerea unei taste apasate, daca acest timp depaseste o jumatate de secunda se genereaza automat codul tastei de zece ori pe secunda.

Controlul operarii cu tastatura este realizat de BIOS, prin utilizarea zonelor de memorie rezervate in acest scop. Aceste zone pot fi utilizate pentru a citi starea tastaturii sau pentru a modifica modul de operare al acesteia. Octetii rezervati standard pentru starea tastaturii se afla la adresa 417h si 418h, semnificatia bitilor fiind urmatoarea:

Octetul de stare de la adresa 417h:

Bit

Semnificatie

X

Starea tastei Insert: 1- activa, 0- inactiva

X

Starea tastei Caps Lock: 1-activa, 0- inactiva

X

Starea tastei Num Lock: 1-activa, 0- inactiva

X

Starea tastei Scroll Lock: 1-activa, 0- inactiva

X



Starea tastei Alt: 1-activa, 0- inactiva

X

Starea tastei Ctrl: 1-activa, 0- inactiva

X

Starea tastei Shift stanga: 1-activa, 0- inactiva

X

Starea tastei Shift dreapta: 1-activa, 0- inactiva

Octetul de stare de la adresa 418h:

Bit

Semnificatie

X

Tasta Ins apasata=1

X

Tasta Caps Lock apasata=1

X



Tasta Num Lock apasata=1

X

Tasta Scroll Lock apasata=1

X

Tastele Ctrl-Num Lock apasate=1

X

1=activ semnalul de la tastatura de PcJr

Nefolosit

Nefolosit

Codurile ASCII si codurile de scanare

Tastatura trimite un singur cod spre calculator numit codul de scanare (scancodul) al tastei respective si starea tastei respective (o tasta poate avea doua stari - apasata sau libera ). BIOS-ul realizeaza conversia din codul de scanare in cod ASCII. Codurile de scanare reprezinta un numar de ordine al tastei respective si anume un intreg pe 8 biti avand valoarea cuprinsa intre 1 si numarul total de taste. La apasarea unei taste, controlul este preluat de handler-ul intreruperii 09h, aceasta citeste codul de scanare din portul de tastatura de la adresa 60h. Daca o tasta este apasata un timp mai indelungat, acelasi cod de scanare este generat in mod repetat pana la eliberarea tastei. Codul de scanare generat la eliberarea unei taste este acelasi cu cel de la apasarea tastei cu exceptia bitului 7 care este pe Astfel tasta 1 produce codul 1h la apasare si codul 81h la eliberare.

Bufferul de tastatura

Este o portiune din zona de date BIOS folosita pentru memorarea temporara a informatiei introduse de la tastatura. La apasarea unei taste, handler-ul intreruperii hard 09h plaseaza codul de scanare si codul ASCII corespunzator tastei apasate in acest buffer.

Buffer- ul de tastatura este caracterizat de urmatorii parametrii:

buffer start - reprezinta adresa de inceput a buffer- ului in zona de date BIOS

buffer end - reprezinta adresa de sfarsit a buffer- ului in zona de date BIOS

buffer head - reprezinta adresa primului caracter care trebuie citit de catre sistem

buffer tail - reprezinta adresa ultimului caracter introdus in buffer de catre handler-ul intreruperii 09

Sistemul de operare DOS seteaza valorile pentru buffer start si buffer end la incarcare si nu le modifica in timpul lucrului.

Imediat dupa incarcarea sistemului de operare parametrii pentru buffer start, buffer end si buffer tail au aceeasi valoare initiala.

La tastarea unei comenzi caracterele care compun comanda vor fi depuse pe cate 2 octeti (unul pentru codul ASCII si unul pentru codul SCAN) in buffer, inclusiv Enter-ul (terminatorul de comanda). La apasarea tastei Enter, textul este citit din buffer si procesorul de comenzi (sistemul de operare) il interpreteaza si executa. Dupa executia comenzii, procesorul de comenzi reinitializeaza buffer- ul prin setarea parametrilor buffer head si buffer tail la aceeasi valoare care pointeaza la octetul imediat urmator ultimului caracter din comanda.



In zona de date BIOS se gasesc adresele parametrilor buffer- ului de tastatura sunt:

buffer start la adresa: 0040:0080h - de obicei 01Eh

buffer stop la adresa: 0040:0082 - de obicei 03Eh

buffer head la adresa: 0040:001Ah- adresa "capului" zonei tampon a tastaturii (de unde incepe comanda)

buffer tail la adresa: 0040:001Ch- adresa "cozii" zonei tampon a tastaturii (unde se termina comanda)

Buffer- ul functioneaza ca o structura de tip QFIFO (coada ciclic), aceasta insemnand ca dupa ce ultima locatie a fost ocupata se va inscrie automat in primul octet al buffer- ului si ca atare parametrul buffer tail va fi initializat cu valoarea de start a buffer- ului.

Handlerul intreruperii 09h citeste codurile scan de la tastatura si le converteste in actiuni sau in coduri de caractere dupa cum urmeaza:

Pentru tastele ASCII cand este intalnit un "scan code" codul ASCII si codul SCAN al tastei sunt plasate in zona tampon a tastaturii care se afla la adresa 0000:041Eh si are o dimensiune de 32 octeti. Codurile sunt plasate in zona tampon la locatia adresata de pointerul cozii zonei tampon. In urma acestei operatii pointerul cozii de asteptare este incrementat cu 2.

Daca au fost apasate tastele ALT, CTRL, sau SHIFT se actualizeaza octetii de stare de la adresa 0000:0417h si 0000:0418h

Daca a fost apasata combinatia CTRL+ALT+DEL, octetii de la adresa 0000:0472h sunt

initializati cu valoarea 1234h si se preda controlul rutinei de initializare.

Serviciile BIOS ale intreruperii INT 16h:

AH=00h Citirea (asteptarea) codului unei taste apasate.

Intoarce:

AL codul ASCII al caracterului (daca AL este zero, AH este codul ASCII extins)

AH codul scan sau un cod ASCII extins

AH=01h Verificarea disponibilitatii codului unei taste apasate

Intoarce:

ZF=1 codul nu este disponibil

ZF=0 codul este disponibil

AX pozitionat la fel ca functia 00h

AH=02h Citirea starii tastei Shift. Verificarea tastelor speciale apasate

Intoarce: AL valorile corespunzatoare ale tastei Shift si starea lock ca in switch- urile tastaturii.

AH=05h Scrie un caracter in buffer- ul de tastatura

CL = codul ASCII al caracterului

CH = codul SCAN pentru tastele speciale (0 pentru tastele normale)

Intoarce: AL = starea (0- a reusit scrierea, 1- buffer- ul este plin)

AH=10h citeste ( asteapta) codul unei taste apasate - specifica pentru tastatura cu 101 taste

Intoarce: AL = codul ASCII al caracterului ( daca AL=0, AH se gaseste codul ASCII extins)

AH = codul SCAN sau codul ASCII extins

AH=11h verifica disponibilitatea codului unei taste, doar pentru tastatura cu 101 taste

Intoarce: ZF = 1 codul nu este disponibil

ZF = 0 codul este disponibil

AX este pozitionat ca la functia 10H

AH = 12h citirea starii tastei SHIFT. Verificarea tastelor speciale apasate

- doar pentru tastatura cu 101 taste

Intoarce: AL - valorile corespunzatoare ale tastei Shift si starea lock ca in switch-urile tastaturii.

Folosirea asamblarii direct din programul C

Limbajul C ofera posibilitatea programarii mixte atat in limbajul C cat si in asamblare, astfel beneficiind atat de structurile de date puternice ale limbajului de nivel inalt cat si de viteza de executie a programelor scrise in asamblare.

Accesul fizic la registrele microprocesorului

Se poate face folosind variabilele puse la dispozitie de mediul C: _AX, _AH, _AL, _BX, _BH, _BL, _CX, _CH, _CL, _DX, _DH, _DL, _SI, _DI, _BP, _SP, _CS, _ES, _DS, _SS, _FLAGS.

Exemplu: _AX=0x1122;

Inserarea de instructiuni scrise in asamblare direct in sursa C

Se face folosind prefixul asm.

Exemplu:

asm mov ax,1122h

Pentru scrierea mai multor instructiuni succesive in asamblare se pot folosi acoladele, la fel ca pentru orice instructiuni compusa.

Utilizarea sistemului de intreruperi al microprocesorului 8086

Ofera posibilitatea unui apel indirect la o subrutina a carei adresa este inscrisa intr-un camp din tabloul vectorilor de intreruperi al microprocesorului .

Functiile pentru utilizarea intreruperilor software sunt:

int86(int nr_intr, union REGS *inregs, union REGS *outregs);

int86x(int nr_intr, union REGS *inregs, union REGS *outregs, struct SREGS *segregs);

Diferenta consta in faptul ca int86x() poate modifica si registrele de segment. Functiile incarca registrele microprocesorului cu valorile din inregs, executa instructiunea 8086 specificata, si intorc in outregs valorile registrelor.

Transferul de parametrii prin registrele microprocesorului catre subrutina de servire a intreruperii se poate face prin urmatoarele structuri de date declarate in dos.h

struct BYTEREGS     ;

struct WORDREGS ;

struct REGS     ;

struct SREGS     ;

Programele care contin linii asm trebuie sa anunte acest lucru compilatorului prin directiva

#Pragma inline

Instalarea handlerelor utilizator

In ceea ce priveste instalarea handlerelor utilizator, limbajul C pune la dispozitie urmatoarele functii, echivalente celor din asamblare:

void interrupt(*getvect(int interruptno))();

Aceasta functie reprezinta echivalentul C al functiei 35h a intreruperii 21h. Functia va fi apelata cu un intreg reprezentand indexul intreruperii si va returna adresa rutinei de tratare a intreruperii respective, vazuta ca o functie de tip interrupt.

Exemplu: pentru a citi adresa rutinei de tratare a intreruperii 21h, se vor folosi urmatoarele linii de program:

void interrupt(*old_21h)(.) //declaratie - pointer la o functie de tip intrerupt

old_21h = getvect(0x21); // citirea vectorului de intrerupea

Aceasta functie este folosita de obicei pentru salvarea adresei rutinei de tratare a unei intreruperi inainte de indirectarea intreruperii respective catre rutina proprie. Salvarea permite apelul vechii rutine din rutina proprie si restaurarea vechiului vector daca este cazul si daca restaurarea mai poate fi posibila.

void setvect(int intinterrupt, void interrupt(* isr)())

Aceasta functie este echivalenta functiei 35h a intreruperii 21h. Functia este apelata cu un parametru intreg ce reprezinta indexul intreruperii ce se doreste indirectata si cu un al doilea parametru reprezentand adresa noii rutine de tratare a intreruperii respective, vazuta ca o functie de tip interrupt.

Exemplu: pentru a indirecta intreruperea 21h se pot folosi urmatoarele linii de program:

void interrupt new_21h(.)

setvect(0x1c,new_21h);

Functii de tip "interrupt"

Definirea unei functii ca fiind de tip interrupt are ca efect urmatoarele:

la intrare in functie se vor executa automat urmatoarele instructiuni de asamblare:

push ax, bx, cx, dx, es, ds, si, di, bp

mov bp,DGROUP

mov ds,bp ;pozitioneaza de pe zona de date a programului

mov bp,sp ;permite accesarea ulterioara a registrilor salvati

Obs. Ultima linie apare doar daca programul este compilat cu optiunea "Standard Stake Frame" activa.

la iesire din functie se vor executa urmatoarele instructiuni:

pop bp, di, si, ds, es, dx, cx, bx, ax

iret

Obs: Datorita restaurarii din stiva a tuturor registrilor implicati in returnarea de parametrii de catre anumite intreruperi, in forma prezentata nu se pot returna valori valide folosind functii de tip interrupt. Ca urmare, se poate deduce ca folosirea functiilor de tip interrupt este utila la indirectarea intreruperilor harware sau a intreruperilor software care nu returneaza parametri. Intr-o astfel de situatie,(relativ des intalnita), continutul unei functii de tip interrupt poate arata la fel ca in exemplul urmator:

Void interrupt new_21(.)

probleme propuse

Problema 1: Sa se scrie un program care sa permita introducerea in buffer-ul de tastatura a unei comenzi DOS standard utilizand serviciile oferite de intreruperea BIOS INT16h.

Problema 2: Sa se scrie un program care permite introducerea unui sir de maxim 16 caractere in buffer-ul de tastatura folosind serviciile BIOS (fara sa le afiseze pe ecran) si afisarea acestora prin citirea direct din bufferul de tastatura.

Problema 3. Sa se scrie un program care prin indirectarea intreruperii INT 09h sa afiseze pe ecran "scan codul" tastei apasate. (Se va realiza citirea din portul de tastatura 60H).

Obs. Intreruperea 09h pe langa citirea din portul tastaturii (60h), realizeaza si comunicarea cu controlorului de intreruperi 8259A (transmite codul EOI - End of interrupt), de aceea la interceptarea lui INT 09h trebuie apelata si vechea rutina a intreruperii INT 09h.





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2170
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved