Sunteți pe pagina 1din 7

ANEXA 1

UNITATEA DOS

1. Tipuri de date
Tipul Registers
Registers =
Record
CASE INTEGER OF
0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:WORD);
1: (AL,AH,BL,BH,CL,CH,DL,DH:BYTE);
End;

Registrele AX, BX, CX şi DX sunt de uz general. Pe lângă referirea globală,


ca registre de 16 biţi, pot fi referite şi semiregistre de opt biţi (un octet), la nivelul
octetului inferior, prin AL, BL, CL, DL, respectiv al celui superior, prin AH, BH, CH,
DH. Registrul BP (base pointer) conţine valoarea deplasării curente în segmentul de
stivă. Registrele SI şi DI corespund unor deplasări ale operandului sursă şi destinaţie în
cadrul segmentului de date, iar DS şi ES reprezintă adresele de segment ale acestor
operanzi. Registrul Flags conţine indicatorii de control şi de stare (flags) ai
procesorului, asociaţi unora dintre cei 16 biţi ai săi, poziţionaţi în funcţie de rezultatele
executării fiecărei operaţii. Din perspectiva referirii prin programe Turbo Pascal,
prezintă interes următorii indicatori de control (sau de condiţie): • CF (Carry Flag):
este setat la transportul în exterior al celui mai semnificativ bit în operaţiile de calcul cu
numerele reprezentate pe 16 biţi; • PF (Parity Flag): este setat dacă octetul inferior al
rezultatului unei operaţii conţine un număr par de biţi cu valoarea unu. Este folosit cu
prioritate de programele de comunicaţie; • AF (Auxiliary carry Flag): este setat dacă
cei patru biţi de ordin inferior ai unei operaţii generează un transport în exterior (folosit
pentru aritmetica BCD (Binary Coded Decimal); • ZF (Zero Flag): este setat dacă
rezultatul unei operaţii este zero; • SF (Sign Flag): este egal cu bitul de ordin superior
al rezultatului unei operaţii de calcul ce foloseşte operanzi cu semn (0 - pozitiv, 1 -
negativ); • OF (Overflow Flag): este setat dacă o operaţie de calcul cu operanzi cu
semn produce un rezultat prea mare (sau prea mic, operaţie numită subdepăşire -
underflow) pentru a putea să fie reprezentat în zona rezultatului. Unitatea Dos conţine
mai multe constante simbolice predefinite asociate acestor indicatori.

Data şi ora
DateTime =
Record
Year : WORD; {Anul}
Programarea calculatoarelor – Tehnica programării în limbajul Pascal

Month : WORD; {Luna}


Day : WORD; {Ziua}
Hour : WORD; {Ora}
Min : WORD; {Minutul}
Sec : WORD; {Secunda}
End;

Articol pentru căutare


SearchRec =
Record
Fill : ARRAY[1..21] OF BYTE;
Attr : BYTE;
Time : LONGINT;
Size : LONGINT;
Name : STRING[12];
End;
Semnificaţia câmpurilor este următoarea: Fill - rezervat pentru sistemul de
operare; câmpul nu trebuie modificat în program. Attr - atributele fişierului (valoarea
octetului $0B din intrarea fişierului în [sub]director). Time - data şi ora ultimei scrieri
în fişier, sub formă împachetată (valoarea, ca LONGINT, a octeţilor $16-$19 din
intrarea fişierului în [sub]director). Size - lungimea în octeţi a fişierului (valoarea
câmpului $1C-$20 din intrarea fişierului în [sub]director). Name - numele fişierului
urmat de punct şi extensia lui (valoarea câmpurilor $0-$7 şi $8-$A din intrarea
fişierului în [sub]director).

Tipuri pentru caracteristicile fişierelor


PathStr = STRING[79];⇒ Specificatorul complet;
DirStr = STRING[67];⇒ Unitatea şi calea;
NameStr = STRING[8]; ⇒ Numele propriu-zis;
ExtStr = STRING[4]; ⇒ Extensia.

Structura FIB pentru fişiere cu tip şi fără tip


FileRec =
Record
Handle : WORD;
Mode : WORD;
RecSize : WORD;
Private : ARRAY[1...16] OF BYTE;
UserData : ARRAY[1...16] OF BYTE;
Name : ARRAY[0...79] OF CHAR;
End;
Unitatea DOS

Structura FIB pentru fişierele TEXT

TextRec =
RECORD
Handle : WORD;
Mode : WORD;
BufSize : WORD;
Private : WORD;
BufPos : WORD;
BufEnd : WORD;
BufPtr : ^TextBuf;
OpenFunc : Pointer;
InOutFunc : Pointer;
FlushFunc : Pointer;
UserData : ARRAY[1...16] OF BYTE;
Name : ARRAY[0...79] OF CHAR;
Buffer : TextBuf;
END;

Semnificaţia principalelor câmpuri este următoarea: • Handle este o valoare


întreagă care reprezintă identificatorul pentru fişiere deschise. Valorile 1-7 sunt
utilizate pentru dispozitivele standard de I/E (intrare, ieşire, auxiliar, imprimanta,
fişierele în curs de folosire cu comanda PRINT din DOS şi de reţea). Fişierele deschise
ale utilizatorului au valori pentru handle începând cu 8. Fişierele nedeschise au
Handle=0. O valoare handle asociată unui fişier devine disponibilă la închiderea
acestuia. Într-un program pot fi deschise simultan maxim 12 fişiere ale utilizatorului
(handle cu valori din intervalul [8, 19]). • Mode indică starea fişierului, care poate fi
exprimată şi prin constantele publice specifice. Fişierele TEXT pot avea stările
FmClosed, FmInput, FmOutput. Fişierele binare pot avea orice stare (implicit
FmClosed sau FmInOut). • RecSize indică lungimea articolului (blocului) rezultată din
descrierea internă programului. • Name este identificatorul extern al fişierului, aşa cum
este precizat de procedura Assign. • BufSize reprezintă lungimea buffer-ului fişierului
TEXT. • BufPos, BufEnd, BufPtr reprezintă pointeri folosiţi în gestiunea buffer-elor
asociate fişierului TEXT. • OpenFunc, InOutFunc, CloseFunc, FlushFunc reprezintă
adresa driver-elor pentru deschidere, citire/scriere, închidere a fişierului, golire a
buffer-ului. • Buffer reprezintă zona tampon asociată fişierului (buffer-ul fişierului).
Tipul TextBuf este definit în unit-ul Dos astfel: TextBuf = ARRAY[0...127] of CHAR.
Pentru a avea acces la informaţiile din FIB, trebuie declarată o variabilă de tip
FileRec (respectiv TextRec) care să aibă aceeaşi adresă cu FIB-ul (cu variabila de tip
fişier). De exemplu: f: TEXT; inf_f: TextRec ABSOLUTE f.
Programarea calculatoarelor – Tehnica programării în limbajul Pascal

2. Constante

Atributele fişierelor (octetul $0B din intrarea unui fişier în [sub]director)


ReadOnly = $01 ⇒ fişier numai pentru citire;
Hidden = $02 ⇒ fişier ascuns;
SysFile = $04 ⇒ fişier de sistem;
Volumid = $08 ⇒ identificator de volum;
Directory = $10 ⇒ [sub]director;
Archive = $20 ⇒ fişier arhivă;
AnyFile = $3F ⇒ orice fişier

Constante asociate indicatorilor de stare


Fcarry = $0001;
Fparity = $0004;
Fauxiliary = $0010;
Fzero = $0040;
FSign = $0080;
Foverflow = $0800;
Constantele corespund unor măşti cu care se poate testa dacă un anumit
indicator este setat, valoarea lor fiind dată de poziţia indicatorului în cadrul registrului
Flags. Astfel, indicatorul CF este plasat în bitul zero, deci masca asociată lui
corespunde lui 20=$0001, indicatorul PF este plasat în bitul doi, cu masca 22=$0004
etc. Dacă se doreşte, de exemplu, să se verifice dacă ZF este setat, folosind o variabilă
Reg de tipul Registers se va putea scrie: IF (Reg.Flags AND FZero) = 1 THEN ...

Constante pentru starea fişierului


FmClosed = $D7B0 ⇒ fişier închis;
FmInput = $D7B1 ⇒ fişier deschis pentru citire;
FmOutput = $D7B2 ⇒ fişier deschis pentru scriere;
FmInOut = $D7B3 ⇒ fişier deschis pentru citire/scriere;

3. Variabile

DosError: INTEGER;
Este iniţializată de funcţiile şi procedurile din acest unit, cu următoarele valori
principale:0 - fără eroare; 2 - fişier negăsit; 3 - cale negăsită; 4 - prea multe
fişiere deschise; 5 - acces interzis etc. Variabila DosError are valoarea zero
când execuţia funcţiilor şi a procedurilor definite în unit-ul Dos se termină
normal.
Unitatea DOS

4. Proceduri şi funcţii
Prelucrarea fişierelor
Procedure GetFAttr(VAR f; VAR attr:WORD);
Returnează atributele unui fişier.
Procedure SetFAttr(VAR f; VAR attr:WORD);
Poziţionează (setează) atributele unui fişier.
Procedure GetFTime(VAR f; VAR Dl:LONGINT);
Returnează data şi ora ultimei scrieri într-un fişier. Dl este variabila în care se
recepţionează data şi ora, sub formă "împachetată".
Procedure SetFTime(VAR f; Dl:LONGINT);
Înscrie data şi ora în eticheta fişierului. Dl este variabila ce conţine data şi ora
sub formă împachetată, care se înscriu în intrarea fişierului în [sub]director.
Procedure FindFirst(F_extern:PathStr; Attr:WORD; VAR zona:SearchRec);
Caută într-un [sub]director prima intrare a unui fişier care are specificatorul şi
atributul precizate în lista de parametri. F_extern este specificatorul extern al
fişierului căutat. Specificatorul este format din cale, nume fişier şi, eventual,
extensie. Când calea lipseşte se presupune [sub]directorul curent. Numele şi
extensia fişierului pot fi generice (formate cu caracterele * sau ?). Attr
reprezintă valoarea atributelor fişierului care se caută. Zona este o variabilă de
tipul SearchRec, care va conţine informaţii despre fişierul f_extern în cazul
când a fost găsit. Dacă f_extern nu este găsit, variabila zona rămâne
nemodificată. Când f_extern este găsit, variabila DosError va avea valoarea
zero. În caz contrar, DosError are valoare diferită de zero.
Procedure FindNext(VAR zona:SearchRec);
Caută într-un [sub]director următoarea intrare a unui fişier care are
specificatorul şi atributul precizate la apelul anterior al procedurii FindFirst.
Rezultă că procedura FindNext poate fi utilizată numai dacă, anterior, a fost
apelată procedura FindFirst. Zona are aceeaşi semnificaţie ca la procedura
FindFirst. Dacă următoarea intrare este găsită, variabila DosError va avea
valoarea zero. În caz contrar, DosError are valoare diferită de zero.
Function FSearch(Nume:PathStr; Lista:STRING):PathStr;
Caută un fişier într-o listă de [sub]directori. Ea este asemănătoare comenzii
PATH din MSDOS. Nume este variabilă de tip PathStr, care conţine numele
fişierului de căutat. Lista conţine lista directoarelor în care se continuă
căutarea, dacă fişierul nu a fost găsit în directorul curent. Căile specificate în
listă trebuie separate prin caracterul ;. Funcţia returnează specificatorul extern
al fişierului, în cazul în care îl găseşte. Când fişierul este în directorul curent,
specificatorul extern furnizat este format din nume şi, eventual, extensie, iar
când fişierul este în alt director, specificatorul este complet (cale+nume [+
extensie]). Când fişierul nu este găsit, funcţia returnează şirul vid. Funcţia nu
verifică existenţa căilor. Când căile nu există, se returnează şirul vid.
Programarea calculatoarelor – Tehnica programării în limbajul Pascal

Function FExpand(Nume:PathStr):PathStr;
Expandează (completează) numele cu calea. Nume este variabilă de tip
PathStr ce conţine numele care urmează să fie expandat cu calea. În procesul
prelucrării fişierelor, funcţia are sens când este utilizată pentru extinderea cu
componente (unitate, cale) furnizate implicit.
Procedure FSplit(specificator:PathStr;VAR unit_dir:DirStr;VAR name:NumeStr;VAR
ext:ExtStr);
Descompune specificatorul extern (unitate, cale, nume, extensie) în trei
componente: unitate+cale, nume, .extensie. Specificator este şirul care se
analizează şi se descompune în componente. Unit_dir, nume şi ext sunt
variabile în care se depun cele trei componente extrase din specificator. Când
unitatea şi calea nu sunt prezente în specificator, se returnează valorile
implicite. Când numele şi extensia nu sunt prezente în specificator, se
returnează şiruri vide.
Procedure SetVerify(v:BOOLEAN);
Poziţionează comutatorul verify din DOS. Comutatorul are două valori: ON
(valoare TRUE) sau OFF (valoare FALSE). Când comutatorul are valoarea
ON, sistemul de operare face verificare după fiecare operaţie de scriere în
fişiere (se verifică dacă datele scrise pot fi citite fără eroare). Poziţia ON a
comutatorului verify măreşte timpul de execuţie a programelor. Când
comutatorul are valoarea OFF, sistemul de operare nu face verificarea scrierii.
Valoarea implicită a comutatorului este OFF. Valoarea comutatorului rămâne
activă până la o nouă setare. V este o variabilă de tip BOOLEAN. Când v are
valoarea TRUE, comutatorul verify primeşte valoarea ON; în caz contrar pri-
meşte valoarea OFF. Procedura are efect similar cu comanda VERIFY din
DOS. Dacă comutatorul verify este ON, rezultatul verificării scrierii este
memorat în variabila DosError.

Ocuparea discului
Function DiskSize(Drive:BYTE):LONGINT;
Returnează capacitatea, în octeţi, a discului montat în unitatea specificată.
Drive specifică unitatea de disc, astfel: 0 - unitatea de disc curentă; 1 - unitatea
de disc A; 2 - unitatea de disc B; 3 - unitatea de disc C etc. Funcţia returnează
valoarea -1 dacă unitatea de disc nu există, dacă nu este montat disc în unitate
sau dacă unitatea este defectă.
Function DiskFree(Drive:BYTE):LONGINT;
Returnează numărul de octeţi liberi de pe un disc montat într-o unitate. Drive
are aceeaşi semnificaţie ca la funcţia DiskSize. Funcţia returnează valoarea -1
dacă unitatea de disc nu există, dacă nu este montat disc în unitate sau dacă
unitatea este defectă.
Unitatea DOS

Execuţia programelor
Procedure Exec(specif,parametru:STRING);
Încărcarea în memorie şi lansarea în execuţie a programului aflat în fişierul
specif. Parametrii de pe linia de comandă sunt specificaţi în parametru.
Function DosExitCode:WORD;
Codul de retur al unui proces (program).

Întreruperi
Procedure Intr(ni:BYTE; VAR reg:Registers);
Lansarea întreruperii ni. În variabila reg se pregătesc argumentele.
Procedure MsDos(VAR reg:Registers);
Lansarea întreruperii $21. În variabila reg se pregătesc argumentele.
Procedure GetIntVec(int:BYTE; VAR adrint:POINTER);
Obţinerea, în adrint, a adresei întreruperii cu numărul int.
Procedure SwapVectors;
Salvarea vectorilor de întrerupere.

Data şi timpul
Procedure GetDate(VAR an, luna, ziua_luna, ziua_sapt:WORD);
Obţinerea datei din sistem.
Procedure SetDate(VAR an, luna, ziua:WORD);
Poziţionarea datei în sistem.
Procedure GetTime(VAR ora, minut, sec, sec100:WORD);
Obţinerea timpului din sistem.
Procedure SetTime(VAR ora, minut, sec, sec100:WORD);
Poziţionarea timpului în sistem.
Procedure PackTime(VAR Dc:DateTime; VAR Dl:LONGINT);
"Împachetarea" unui articol de tip DateTime într-o dată de tip LONGINT. Dc
este data şi ora, exprimate pe componente, care urmează să fie "împachetate"
sub formă LONGINT în zona Dl.
Procedure UnpackTime(Dl:LONGINT, VAR Dc:DateTime);
"Despachetarea" unei valori de tip DateTime. Dl este expresie de tip
LONGINT care va fi "despachetată" pe componentele datei şi orei în zona Dc.

Alte funcţii
Function DosVersion:WORD;
Returnează un cuvânt ai cărui octeţi conţin numărul principal al versiunii
curente a sistemului de operare (octetul inferior), respectiv numărul secundar
(octetul superior).