Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Drivere pentru dispozitive de I/O - Sisteme de operare
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 
t5v10vk



Un sistem de operare este o colectie de programe care utilizeaza disponibilitatile hardware fara sa-l intereseze detaliile. De asemenea , un sistem de operare ce se executa pe un calculator trebuie sa se execute si pe un altul compatibil cu el (portabilitate). Totusi, sistemele de operare nu pot fi facute sa mearga pe absolut toate calculatoarele dintr-o anumita clasa. De aceea este nevoie pentru dispozitivele periferice de un anumit software specific pentru a efectua operatii cu ele - drivere de I/O. Exista o mare diversitate de dispozitive periferice datorita numarului mare de producatori. Sistemul de operare se interfateaza cu acest software specific dispozitivelor periferice inglobindu-l. Un sistem de operare trebuie sa asigure o interfata standard
(environment) astfel ca programele ce se executa pe un calculator sa se poata executa pe un altul cu acelasi sistem de operare. Trebuie sa existe un API prin care sa se gestioneze fisierele si dispozitivele (device) din sistem. Avind aceasta, se redirecteaza pur si simplu intrarea sau iesirea in diverse programe. De exemplu, daca avem un program ce lucreaza cu fisiere si device-uri prin handlere, modificind numarul handlerului putem schimba preluarea caracterelor de la tastatura la interfata seriala sau fisier. Un driver pentru un dispozitiv de I/O este o suma de functiuni, un program care controleaza transferul din si inspre dispozitivul de I/O, fiind hardware dependent (instructiuni de I/O), facind legatura intre dispozitiv si sistemul de operare, fiind integrat sau nu in API sistem. Driverele de I/O pot fi :
-de sistem (standard)
-de aplicatie
Driverele de sistem (standard) respecta o anumita structura pe cind cele de aplicatii sunt pur si simplu o suma a functiilor pentru gestiunea perifericului.
De exemplu se pot scrie drivere pentru : imprimante noi, plottere, mouse-uri, canale A/D,D/A etc. De asemenea se poate inlocui driverul standard de tastatura cu unul propriu etc. MS-DOS permite inlocuirea sau adaugarea unor drivere urmatoarelor dispozitive standard de I/O :

CON : Console input -Keyboard
Console output -Monitor
AUX : auxiliary I/O (COM1, comunicatii)
PRN : standard printer output (LPT1)
NUL : dispozitiv fictiv

Driverele standard sint scrise pentru a pune la dispozitie servicii prin API.
Se pot scrie drivere care sa inglobeze mecanisme ca :




-software de comunicatii folosind intreruperile
-interfata ceas/calendar
-spooler de printare in background
-generator de numere aleatoare
-ram-disk
-handlere pentru protocoale de comunicatii

Driverele standard incarcate de DOS implicit sint cele pentru ecran, tastatura, imprimanta, disc si ceas.
Gestiunea unui periferic cuprinde scrierea unui driver continind :
-antet
-colectie de subrutine pentru functii specifice
-formarea unui sir al operatiilor ce urmeaza sa le efectueze driverul cu dispozitivul de I/O.
Elementele care trebuie puse in evidenta in scrierea unui driver sint:
-antetul driverului
-cererea pachet facuta de DOS
-pointerul local pentru cerere
-rutina strategie
-rutina intrerupere
Driverele standard se incarca in memoria calculatorului (se instaleaza la initializare - boot-time) prin CONFIG.SYS cu directiva DEVICE= . Driverele instalate in boot-time formeaza la rindul lor o coada sau sir sau lista inlantuita, antetul fiecarui driver continind un pointer DWORD (o adresa) la urmatorul. Ultimul driver din sir are un martor de sfirsit de sir cu toti bitii din antet pe -1.

Antetul driverului contine deci :
-pointer la urmatorul driver
-un atribut de driver
-o adresa a unei subrutine din interiorul driverului care se numeste cod de strategie
-o adresa a unei subrutine din interiorul driverului care se numeste cod de intrerupere
-numele driverului

Offset Marime Continut
ßßßßßß ßßßßßß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
ÚAAAAAAAAAAAAAAA¿ Urmatorul driver in sir are adresa FAR
+0 4 ³offset segment³ (offset=0ffffH daca este singurul/ultimul driver)
AAAAAAAAAAAAAAAAÙ
+4 2 ³ Atrib ³ cimpul atribut
AAAAAAAAa
+6 2 ³ Strat ³ offsetul rutinei STRATEGIE
AAAAAAAAa
+8 2 ³Intrupt³ offset rutinei INTRERUPERE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
+0aH 8 ³'L' 'P' 'T' '1' 20H 20H 20H 20H³ numele driverului urmat de blancuri
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÙ sau numarul subunit pt driver bloc
(numai primul octet este completat de functia de initializare a driverului, dupa cite unit gest)


Cimpul atribut se refera la proprietatile unui dispozitiv.

1 1 1 1 1 1
Ö5A4A3A2A1A0A9A8Ò7A6A5A4A3A2A1A0·
º ³ ³ ³0³ ³0 0 0 0³ ³0 0³ ³ ³ ³ º
ÓÒAÒAÒAAAÒAAAAAAÐAAÒAAAAAÒAÒAÒAÒ½ bit# masca val
º º º º º º º º ÈI 0: 1=standard input device (a & 0001H)
º º º º º º º ÈIII 1: 1=standard output device (a & 0002H)
º º º º º º º block device: 1= >32M partition
º º º º º º ÈIIIII 2: 1=standard NUL device (a & 0004H)
º º º º º ÈIIIIIII 3: 1=clock device (a & 0008H)
º º º º ÈIIIIIIIIIIIII 6: 1=supports logical devices (a & 0040H)
º º º ÈIIIIIIIIIIIIIIIIIIIIIII 11: 1=supports open/close/RM (a & 0800H)
º º ÈIIIIIIIIIIIIIIIIIIIIIIIIIII 13: 1=non-IBM block device (a & 2000H)
º ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIII 14: 1=supports IOCTL (a & 4000H)
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 15: 1=character device; 0=block (a & 8000H)

Observatii:
þ Se seteaza bitii 0 si 1 cind se inlocuieste driverul CON.

þ Cind se seteaza bitul 15 (disp bloc), bitul 1 indica o partitie a acestui periferic mai mare de 32M (DOS 4.0+). Vezi INT 25H/26H.

þ Dispozitivul NUL nu poate fi reasignat.

þ Bitul 6 (DOS 3.2+) indica posibilitatea unor cereri prin comenzile
17H and 18H (Get/Set Logical Device) folosite in DRIVER.SYS, functia de
"phantom floppy". ³
þ Bitul 11 (DOS 3.0+) indica posibilitatea unor cereri adresate unor disp
Removable Media (0dH to 0fH) astfel ca se face o optimizare bufferari locale pentru un driver bloc sau un driver caracter poate trimite secvente de initializare.

þ Bitul non-IBM afecteaza actiunea cererii 'Build BPB' (02H)

þ Bitul IOCTL indica posibilitatea ca sa se foloseasca functii DOS Fn 44H.

þ Bitul 15 afecteaza cererile de intrare/iesire si determina semnificatia cimpului 'nume disp' din antetul driverului. Daca bitul este 0, disp este de tip bloc (de obicei disk).

þ Bitul 3 poate determina o schimbare a driverului pt disp CLOCK$. CLOCK$ este un disp tip caracter care face un input si output de cereri de exact
6 bytes. O cerere input (cod 4) returneaza 6 bytes ce semnifica timpul curent (timp/data) iar o cerere de output (cod 8) accepta 6 bytes pt a seta ceasul/calendarul. Formatul pentru disp I/O CLOCK$ este :

Offset Marime Continut
ßßßßßß ßßßßßß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
ÚAAAAAAA¿
+0 2 ³ data ³ zilele incepind cu 1 ianuarie 1980
AAAAAAAAÙ
+2 1 ³min³ min curent (0-59)
AAAAa
+3 1 ³ora³ ora curenta (0-24)
AAAAa
+4 1 ³sec³ sec curenta (0-59)
AAAAa
+5 1 ³sut³ sutimea de sec curenta (0-99)
AAAAÙ

Cele doua adrese (cod de strategie si intrerupere) sint prevazute pentru viitoare versiuni multitasking ale MS-DOS-ului, deoarece este evident ca operatiile de I/O cu dispozitvele periferice trebuie sa fie asincrone fata de cereri. Astfel subrutina cod de strategie va fi executata dind nastere la un sir al cererilor pentru operatiile de I/O cu dispozitivul periferic respectiv astfel ca driverul nu asteapta pina se efectueaza operatia respectiva dind controlul sistemului de operare. Este sarcina subrutinei cod de intrerupere, lansata imediat dupa de DOS, de a rezolva cererile din acest sir una cite una cind dispozitivul de I/O este pregatit. Cind o cerere este rezolvata subrutina cod de intrerupere semnalizeaza aceasta printr-un fanion de "Done". MS-DOS scaneaza periodic cererile lansate pentru dispozitivul respectiv si cind sesizeaza una din ele cu fanionul "Done" rezolva toata functia care solicita cererea respectiva. Deoarece aceste cereri apar aleatoriu este clar ca ele nu se pot transmite ca niste informatii in citeva registre sau variabile de memorie si trebuie transmise sub forma unei structuri standard de cerere numita cerere-pachet care este introdusa in sirul operatiilor ce urmeaza sa le efectueze driverul cu dispozitivul de I/O. Cererea pachet are doua parti :

-un antet al cererii care este acelasi pentru toate cererile (13 octeti)

-o zona specifica cererilor.
Cererea pachet este transmisa driverului prin ES:BX

Offset Marime Continut
ßßßßßß ßßßßßß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
ÚAAA¿
+0 1 ³lun³ lung cererii pachet (header si data)
AAAAa
+1 1 ³nru³ numar unitate (numai pt disp bloc)
AAAAa
+2 1 ³cmd³ comanda de exec (00-18H) specifica funct in driver
AAAAAAAA¿
+3 2 ³Stare ³ cuvint de stare al disp completat la iesirea din driver
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA¿
+5H 8 ³ (rezervat) ³ 5,6,7,8 adresa de legatura DOS
AAAAA A A A AAAAAAAAAAAAAAAAAAAAÙ 9,10,11,12 adresa de legatura pt device
+0dH ? ³ infor de lung var ³ infor in concord cu comanda
AAAAA A A A AAAAAAAAÙ

Cuvintul de stare returnat are structura :

1 1 1 1 1 1
Ö5A4A3A2A1A0A9A8Ò7A6A5A4A3A2A1A0·
ºe³rezervat ³b³dº cod eroare º s = cuv pe 16 biti la offsetu 3 al cererii
ÓÒAAAAAAAAAAAÒAÒÐAAAAAAAAAAAAAAA½ bit masca val
º º º ÈIIIIIIIIIIIIIÊI 0-7: Cod eroare disp (s & 00ffH)
º º ÈIIIIIIIIIIIIIIIII 8: 1=Done (totd setat la ies) (s & 0100H)
º ÈIIIIIIIIIIIIIIIIIII 9: 1=Busy (numai czi 6 si 0fH) (s & 0200H)
ÈIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 15: 1=eroare prezenta (s & 8000H)

La terminarea normala a unui driver, bitul "Done" este setat si se iese printr-un
FAR RET. Bitul "Busy" este setat cind nu se poate satisface o cerere deoarece disp de I/O este ocupat cu satisfacerea unei alte cereri. Bitul mai foloseste pentru a returna informatii diverse ca : "coada tast nevida" sau "media este removable". Bitul "eroare prezenta" este setat cind un driver primeste o cerere pe care nu o poate rezolva sau se genereaza o eroare cind se executa o cerere. Daca bitul este setat, bitii 0-7 (octetul de la offsetul 3 din cerere) se completeaza cu un cod de eroare.

Eroare Descriere Û Eroare Descriere
ßßßßßß ßßßßßßßßßßßßßßßßßßßßßßßßßß Û ßßßßßß ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
0 violare prot scriere Û 9 printer fara hirtie
1 unitate necunoscuta Û 0aH eroare scriere
2 disp neoperational Û 0bH eroare citire
3 cod comanda necunoscut Û 0cH eroare generala
4 eroare CRC Û 0dH (rezervat)
5 lung incorecta struct cerere Û 0eH (rezervat)
6 eroare de cautare Û 0fH schimbare invalida de disc (DOS 3.0+)
7 media necunoscuta Û
8 sector negasit Û

Un driver standard este apelat in momentul in care sistemul de operare are introdus cel putin o cerere-pachet intr-un sir de operatii atasat unui dispozitiv de I/O. Este evident ca gestiunea sirurilor de cereri-pachet introduse si care sint "Done" o tine sistemul de operare. MS-DOS nu implementeaza mecanismul sirurilor. Cind apare o cerere se asteapta pina cind ea se rezolva. Codul de strategie retine adresa cererii-pachet la o anumita adresa intr-un sir si codul de intrerupere care se executa imediat dupa, rezolva cererea. Cind se termina codul de intrerupere de executat MS-DOS stie ca cererea este "Done". Antetul driverului ocupa primii 18 octeti din corpul sau. Pentru aceasta trebuie ca fisierul executabil .COM sau .EXE care se obtine din sursa scrisa pentru driverul respectiv sa aiba originea zero (sau ORG 0 sau deloc, in nici un caz ORG 1OOh pentru a avea PSP-program segment prefix).
Exista doua tipuri de drivere standard pentru dispozitive periferice :

-drivere caracter
-drivere bloc

care difera intre ele prin informatiile ce le contin.Driverele caracter sint cele care transfera octet cu octet informatia cu un dispozitiv de I/O. Driverele bloc transfera o informatie egala cu un bloc de octeti, de exemplu discurile
(FD,HDD) deoarece se poate transfera la nivelul unui sector (512 octeti).
Vom considera driverele caracter : canale de comunicatie, imprimanta, mouse-uri ,dispozitive analogice etc.
MS-DOS-ul intotdeauna proceseaza mai intii driverele definite in CONFIG.SYS inaintea celor deja incluse in el. Aceasta ne permite sa inlocuim de exemplu driverul MS-DOS-ului de tastatura sau imprimanta cu unul propriu; daca driverul nostru va avea numele CON sau PRN in zona de nume.
Deci :
1. MS-DOS pregateste cererea-pachet
2. MS-DOS lanseaza codul de strategie
3. MS-DOS lanseaza codul de intrerupere
Aceasta se preteaza in viitor foarte usor la un mecanism multitasking.
Pointerul la urmatorul driver este format din patru octeti (offset + segment).
Cind driverele se incarca in memoria calculatorului de pe HDD la boot-time adresele driverelor unde se gasesc in memorie formeaza un sir (o lista). Astfel fiecare antet de driver va contine in zona de pointer adresa driverului urmator daca exista sau -1(FFFF FFFF) daca este ultimul incarcat. Daca este necesara o operatie cu un periferic definit prin nume simbolic, MS-DOS cauta in acest sir pina cind numele simbolic se potriveste cu un nume din zona de nume al unui driver. Daca nu se gaseste apare mesajul "acces denied". Daca un singur fisier contine mai multe drivere, atunci zona de pointer a fiecaruia in faza de programare (scrierea sursei program) trebuie sa contina adresa urmatorului driver din fisierul sursa respectiv, ultimul avind aceasta zona egala cu -1.

Exemplu 1 : driver pentru consola

;*********************************************************************;

;* C O N D R V *;
;*-------------------------------------------------------------------*;
;* Task : Programul este un driver de consola *;
;* (Keyboard and Display Monitor). *;
;* Poate inlocui ANSI.SYS *;
;* *;
;*-------------------------------------------------------------------*;
;* tasm condrv; *;
;* tlink condrv; *;
;* exe2bin condrv condrv.sys *;
;*-------------------------------------------------------------------*;
;* Apel : DEVICE=CONDRV.SYS in CONFIG.SYS *;
;* *;
;*********************************************************************;

code segment

assume cs:code,ds:code,es:code,ss:code

org 0 ;no PSP
;offset 0

;== Constants =========================================================

cmd_fld equ 2 ;Offset command field in data block status equ 3 ;Offset status field in data block end_adr equ 14 ;Offset driver end-adr. in data block num_db equ 18 ;Offset number in data block b_adr equ 14 ;Offset buffer address in data block

KEY_SZ equ 20 ;Size of key board buffer num_cmd equ 16 ;Subfunctions 0-16 are supported

;== Data ==============================================================

;-- Header of Device Driver -------------------------------------------

dw -1,-1 ;Connection to next driver dw 1010100000000011b ;Driver attribute dw offset strat ;Pointer to strategy routine dw offset intr ;Pointer to interrupt routine db "CONDRV " ;new Console driver

;-- Jump Table for functions -------------------------

fct_tab dw offset init ;Function 0: Initialization dw offset dummy ;Function 1: Media Check dw offset dummy ;Function 2: Create BPB dw offset no_sup ;Function 3: I/O control read dw offset read ;Function 4: Read dw offset read_b ;Function 5: Non-dest. Read dw offset dummy ;Function 6: Input-Status dw offset del_in_b ;Function 7: Erase Input-Buffer dw offset write ;Function 8: Write dw offset write ;Function 9: Write & Verify dw offset dummy ;Function 10: Output-Status dw offset dummy ;Function 11: Erase Output-Buffer dw offset no_sup ;Function 12: I/O control write dw offset dummy ;Function 13: Open (starting at 3.0) dw offset dummy ;Function 14: Close dw offset dummy ;Function 15: changeable Medium dw offset write ;Function 16: Output until Busy

db_ptr dw (?),(?) ;Address of data block passed

key_a dw 0 ;Pointer to next character in KEY_SZ key_e dw 0 ;Pointer to last character in KEY_SZ key_bu db KEY_SZ dup (?) ;internal Keyboard Buffer

;== Routines and functions of driver ===============================

strat proc far ;Strategy routine

mov cs:db_ptr,bx ;Store address of data block in the mov cs:db_ptr+2,es ;Variable DB_PTR

ret ;back to caller

strat endp

;----------------------------------------------------------------------

intr proc far ;Interrupt routine

push ax ;Store registers on the stack push bx push cx push dx push di push si push bp push ds push es pushf ;store also the flag register

push cs ;Set data segment register pop ds ;Code is identical here with data

les di,dword ptr db_ptr;Address of data block to ES:DI mov bl,es:adi+cmd_fldi ;Get command-code cmp bl,num_cmd ;is command-code permitted? jle bc_ok ;YES --> bc_ok

mov ax,8003h ;Code for "unknown Command" jmp short intr_end ;back to caller

;-- Command-Code was o.k. --> Execute command ----------------

bc_ok: shl bl,1 ;Calculate pointer in jump table xor bh,bh ;erase BH call afct_tab+bxi ;Call function les di,dword ptr db_ptr;Address of the data block to ES:DI

;-- Execution of the function completed --------------------

intr_end label near or ax,0100h ;Set finished-bit mov es:adi+statusi,ax ;store everything in the status field

popf ;Restore flag register pop es ;Restore other registers pop ds pop bp pop si pop di pop dx pop cx pop bx pop ax

ret ;back to caller

intr endp

;----------------------------------------------------------------------

dummy proc near ;This routine does nothing

xor ax,ax ;Erase busy-bit ret ;back to caller

dummy endp

;----------------------------------------------------------------------

no_sup proc near ;This routine called for all functions
;which should really not be called mov ax,8003h ;Error: Command not recognized ret ;back to caller

no_sup endp

;----------------------------------------------------------------------

store_c proc near ;stores a character in the internal
;keyboard buffer
;Input: AL = character
; BX = Position of the character

mov abx+key_bui,al ;store character in internal buffer inc bl ;increment pointer to End cmp bl,KEY_SZ ;End of buffer reached ? jne store_e ;NO --> STORE_E

xor bl,bl ;new end is the beginning of buffer

store_e: ret ;back to caller

store_c endp

;----------------------------------------------------------------------

read proc near ;read a certain number of characters
;from the keyboard to a buffer

mov cx,es:adi+num_dbi ;read number of characters jcxz read_e ;test if equal to 0 les di,es:adi+b_adri ;Address of character buffer to ES:DI cld ;on STOSB count up mov si,key_a ;Pointer to next character in KEY_SZ mov bx,key_e ;Pointer to last character in KEY_SZ

read_1: cmp si,bx ;other characters in keyboard buffer? jne read_3 ;YES --> READ_3

read_2: xor ah,ah ;Function number for reading is 0 int 16h ;Call BIOS Keyboard-interrupt call store_c ;Store characters in internal buffer cmp al,0 ;test if extended code jne read_3 ;no --> READ_3

mov al,ah ;Extended Code is in AH call store_c ;store read_3: mov al,asi+key_bui ;read character from keyboard buffer stosb ;transmit to buffer of calling funct. inc si ;Increment pointer to next character cmp si,KEY_SZ ;End of buffer reached? jne read_4 ;NO --> READ_4

xor si,si ;next character is the first character
;in the keyboard buffer

read_4: loop read_1 ;repeat until all characters read mov key_a,si ;Store position of the next character
;in the key board buffer mov byte ptr key_e,bl ;Store position of the last character
;in the key board buffer

read_e: xor ax,ax ;everything o.k. ret ;back to caller

read endp

;----------------------------------------------------------------------

read_b proc near ;read the next character from the
;key board but leave in the buffer

mov ah,1 ;Function number for BIOS-interrupt int 16h ;call BIOS Keyboard-interrupt je read_p1 ;no character present --> READ_P1

mov es:adi+13i,al ;store character in data block xor ax,ax ;everything o.k. ret ;back to caller

read_p1 label near

mov ax,0100h ;Set busy-bit (no character) ret ;back to caller

read_b endp

;----------------------------------------------------------------------

del_in_b proc near ;erase input buffer

mov ah,1 ;Still characters in the buffer? int 16h ;Call BIOS key board interrupt je del_e ;no character in the buffer --> END

xor ah,ah ;Remove character from buffer int 16h ;Call BIOS key board interrupt jmp short del_in_b ;Test for additional characters

del_e: xor ax,ax ;everything o.k. ret ;back to caller

del_in_b endp

;----------------------------------------------------------------------

write proc near ;write a specified number of

;characters on the display screen

mov cx,es:adi+num_dbi ;Number of characters read jcxz write_e ;test if equal to 0 lds si,es:adi+b_adri ;Address of character-buffer to DS:SI cld ;on LODSB increment count

mov ah,3 ;read current display page int 16h ;Call BIOS Video-interrupt

mov ah,14 ;Function number for BIOS interrupt

write_1: lodsb ;read character to be output to AL int 10h ;call BIOS Video-interrupt loop write_1 ;repeat until all characters output

write_e: xor ax,ax ;everything o.k. ret ;back to caller

write endp

;----------------------------------------------------------------------

init proc near ;Initialization routine

mov word ptr es:adi+end_adri,offset init ;Set End-Address of mov es:adi+end_adr+2i,cs ;the driver

xor ax,ax ;everything o.k. ret ;back to caller

init endp

;======================================================================

code ends end

Exemplul 2: driver pentru seriala

code segment assume cs:code,ds:code,es:code,ss:code
; device = comm

org 0 commhdr: dw -1,-1 dw 8000h dw offset strategy dw offset intr db "comm " request equ 0 ;originea cererii pachet unit equ request+1 cmd equ unit+1 status equ cmd+1 doslink equ status+2 ;se depune de DOS adresa urmatoarei cereri
;posibil la alt device mylink equ doslink+4 ;lista de cereri pt acelasi device
;ce poate fi gestionata de driver (background+int) breaker equ mylink+4 media equ mylink+5 dta equ media+1 ;adresa de transfer cu DOS-ul count equ dta+4 char equ mylink+4

queue db 2048 dup(?) ;zona buffer pt intr quein dw 0 ;index pt urmatorul caract receptionat queout dw 0 ;index al urmat caract trimis DOS-ului

handler proc far interrupt: push ax ;salvare context push bx push cx push dx push si push di push ds push es push bp in al,status_port ;test stare seriala test al,2 jz intout

in al,comm_port ;preluare caract push ax ;calculeaza urmat adresa unde vine depus caract mov ax,cs:quein inc ax and ax,2047 ;modulo 2048 mov cs:quein,ax mov bx,ax pop ax mov cs:queueabxi,al ;depune caract

intout: mov al,20h ;clear interrupt out 20h,al sti ;rearmeaza intreruperile pop bp pop es pop ds pop di pop si pop dx pop cx pop bx pop ax iret

handler endp

jmptbl: dw comminit dw exit dw exit dw exit dw getchar dw lookchar dw getstat dw flusher dw exit dw exit dw exit dw exit dw exit

savptr dd 0 ;se salveaza pointer trimis de DOS in ES:BX stratp proc far strategy: mov cs:word ptr savptr,bx mov cs:word ptr savptr+2,es ret stratp endp

ops proc far intr: ;incep tratarea functiilor incluse in driver push si push ax push cx push dx push di push bp push ds push es push bx lds bx,cs:dword ptr savptr ;preia pointerul pasat de DOS assume ds : nothing xor ax,ax mov al,ds:byte ptr cmdabxi ;preia comanda mov si,offset jmptbl ;baza tabelei de functii add si,ax ;aduna offset add si,ax cmp al,11 ;am doar 11 functii din 24 ja exit mov cx,ds:word ptr countabxi ;preia nr de octeti de transferat les di,ds:dword ptr dtaabxi ;adresa bufferului push cs pop ds assume ds:code jmp asii

exit: assume ds:nothing or ah,01h ;seteaza Done lds bx,cs:dword ptr savptr ;preia adresa cererii pachet din nou mov ds:word ptr statusabxi,ax ;retine starea pop bx pop es pop ds pop bp pop di pop dx pop cx pop ax pop si ret getchar: mov ax,cs:queout ;preia indexul de trimis cmp ax,cs:quein ;compara cu indexul de receptie je getchar ;asteapta daca nu am caract mov dx,0 getone: inc dx ;tine socoteala transferului de octeti inc ax ;incr indexul de trimis DOS-ului and ax,2047 ;modulo 2048 mov bx,ax ;salveaza indexul mov al,cs:queueabxi ;preia caract din bufferul driverului stosb ;depune caract in bufferul aplicatiei mov ax,bx ;refa cmp ax,cs:quein ;test cu indexul de receptie loopne getone gotlast: mov cs:queout,ax lds bx,cs:dword ptr savptr mov ds:word ptr countabxi,dx ;salveaza contorul final xor ax,ax ;sterge erorile jmp exit ;se termina transferul lookchar: ;citire fara preluare din buffer mov ax,queout inc ax and ax,2047 mov si,ax mov al,queueasii push ds lds bx,dword ptr savptr ;preia adresa cererii DOS mov ds:abxi.char,al ;salveaza caract intr-un loc anume pop ds xor ax,ax jmp exit getstat: ;seteaza Busy daca ambii indexi sint egali mov ax,queout cmp ax,quein je setbusy xor ax,ax ;am caract de preluat jmp exit setbusy: mov ax,0200h ;seteaza Busy jmp exit flusher: ;goleste continutul bufferului driverului xor ax,ax mov quein,ax mov queout,ax jmp exit
;urmeza handlerul de intrerupere pt receptie mes db 13,10,"Driver comunicatie seriala incarcat",13,10,"$" comminit: mov dx,0 ;folosim primul port serial mov ah,0 mov al,10011010b ;1200 bauds, paritate para,
;1 bit de stop, 7 biti pe caract int 14h ;functia Bios pt seriala push ds push dx mov ax,seg interrupt ;adresa vect de intrerupere mov ds,ax mov dx,offset interrupt mov al,0ch ;intreruperea pozitionata pe vect 0Ch mov ah,025h ;seteaza vect de intrerupere int 21h pop dx lds bx,dword ptr savptr ;adresa cererii mov ds:abxi.breaker,offset comminit mov ds:abxi.breaker+2,cs pop ds mov dx,offset mes ;anunt incarcarea driverului mov ax,9 int 21h xor ax,ax jmp exit ops endp code ends end

In continuare dam un exemplu simplu de folosire a driverului comm, utilizat ca un fisier. Driverul este deschis si se citesc caractere. O tratare mai complexa ar include deschiderea, citirea, scrierea, iesirea din cicluri de citire/scriere, inchiderea.

.
. mov dx,offset comm ;adresa device-ului mov al,0 ;citire mov ax,3dh ;deschidere device int 21h jc error ;eroare mov handl1,ax ;salvez handlerul device-ului mov bx,handl1 mov cx,aplsize ;nr octeti de transferat mov dx,offset aplbuf ;buffer aplicatie mov ah,3fh ;citire de la comm int 21h ;apel DOS care face cererea pachet catre driver jc error
.
.
. datax segment data comm db "COMM",0 ;sir ASCIIZ al device-ului handl1 dw 0 aplsize equ 256 aplbuf db aplsize dup(?) datax ends

Exercitii :
1. Care sint structurile de control implicate in descrierea unui driver standard
2. Ce completeaza programatorul si ce completeaza DOS-ul
3. Cum se produce efectiv trasferul dinspre si de la un periferic, avind in etapele DOS-driver-periferic si retur.
4. Analizati programele condrv.asm si comm.asm
5. Modificati programul comm.asm pentru a putea deveni un driver de seriala de transmisie-receptie, a putea controla initializarea parametrilor de comunicatie si a putea folosi ambele interfete seriale



Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta