Jednotka Dos

Vítejte v závěrečné lekci Pascalu pro pokročilé.
Jednotka Dos umožňuje spolupráci s operačním systémem (zjišťování času, data, mazání souborů a adresářů, práci s přerušeními,...)

Konstanty pro práci se soubory

Název Význam Hodnota
ReadOnly soubor pouze pro čtení $01
Hidden skrytý soubor $02
SysFile systémový soubor $04
Directory adresář $10
Archive jakýkoliv soubor $20

Tyto konstanty lze sčítat (ReadOnly + Hidden = pouze pro čtení a skrytý).
Je možné i numerické vyčíslení, ale my budeme kvůli přehlednosti používat konstanty. (Rozlišit, zda $07 znamená skrytý systémový soubor pouze pro čtení či něco jiného, je obtížné.)

Nyní se podívejme na procedury a funkce:

Čas a datum

GetDate(var Rok,Mesic,Den,DenTydne:word); - procedura zjistí datum (DenTydne - 1=pondělí, ... 6=sobota, 0=neděle)
GetTime(var Hod,Min,Sec,Sec100:word); - zjistí čas (Sec100 jsou milisekundy)
SetDate(Rok,Mesic,Den:word); - nastaví datum
SetTime(Hod,Min,Sec,Sec100:word); - nastaví čas

Stav počítače

DiskFree(x) : longint; počet volných bytů na disku (X : 0-aktuální disk, 1-A: , 2-B:, 3-C: ...) v případě, že disk nebyl nalezen, vrací -1
DiskSize(x):longint; - počet všech bytů na disku
DosVersion : word; - vrací aktuální verzi Dosu (např. 7.05) - v nižším bytu je první číslo (7) a ve vyšším číslo druhé (05). Chceme-li tato čísla zjistit, použijeme Lo(DosVersion) a Hi(DosVersion)

Správa souborů

Jednotka Dos definuje vlastní typ SearchRec:

type Search = record
               Fill:array[1..21] of byte;
               Attr:byte;
               Time:Longint;
               Size:Longint;
               Name:string[21];
              end
Nás u tohoto typu bude zajímat pouze hodnota Attr(Atributy), Size (Velikost souboru) a
Name(název souboru)

FindFirst(Jmeno, Atributy, var Vysledek : SearchRec); procedura najde první soubor, který vyhovuje zadaným kritériím. (Pro jména platí hvězdičková konvence (*.exe, ?let.* ...))
FindNext(var S:SearchRec); procedura najde další soubor vyhovující zadaným kritériím (po použití FindFirst)
FSearch(Jmeno, SeznamAdresaru):string;
najde soubor požadovaného jména v zadaných adresářích (výstupem je celé jméno souboru, včetně cesty)
GetFAttr(var f,var Atributy); Procedura vrací atributy souboru (ten musí být uzavřen, ale přiřazen)
SetFAttr(var f; Atributy); Procedura nastaví atributy souboru

Jak zjistíme, že je u daného souboru nastaven nějaký atribut? Jednoduše : využijeme Booleovského operátoru and.
Například takto : if (Atributy and Hidden)<>0 then ...
Pokud chceme změnit hodnotu jednoho atributu, musíme si nejdříve načíst atributy pomocí GetFAttr a poté je změnit (tentokrát s využitím or).
Atributy:= Atributy or Hidden;

Přerušení

Dalším typem, který jednotka Dos zavádí, je Registers;
pro naše potřeby postačí tato definice type Registers = record AL,AH,BL,BH,CL,CH,DL,DH:byte) end;
Typ Registers má ještě druhou definici: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : word), takže si můžeme vybrat, ale nesmíme to míchat. (nastavím-li AL, už se do DS nedostanu...)

Nyní již můžeme přistoupit k samotným procedurám.

Intr(CisloPreruseni, var Registry : Registers); provede požadované přerušení (a popř. změní obsah proměnné Registry);
MsDos(Registry); provede službu MS-Dosu (=zavolá přerušení 21H). Lze použít i Intr($21, Registry)
GetIntVec(CisloPreruseni, var Vektor : pointer); Každé přerušení obsluhuje jistá procedura. Tento příkaz vrací ukazatel na ní.
SetIntVec(CisloPreruseni, Vektor : pointer); Odteď se místo přerušení CisloPreruseni bude volat naše procedura. S tímto příkazem musíme zacházet velice opatrně.

Nikdy byste neměli měnit přerušení za těchto podmínek:

Pokud jste se rozhodli přerušení změnit, uvědomte si:

Máme-li přerušení, které bychom museli volat sami, pomocí Intr, popř. Int, je lepší udělat normální proceduru a zavolat přímo ji. Interrupt procedur se používá tam, kde je dané přerušení voláno nezávisle na vůli programátora (stisk klávesnice, takt počítačových hodin - voláno 18.2krát za sekundu, zborcení programu, chyba paměti,...)

Operační systém nám ale nedovolí sahat na všechna svá přerušení.

Krátká ukázka:
program Pis;
{Program způsobí, že při každém stisku klávesy se napíše písmenko 'a'}
uses Dos;
const A:integer = 0;
var Ukazatel : pointer; {Ukazatel se vždycky hodí}

procedure NewInt09;interrupt; {Naše procedůrka}
begin
 Puvodni; {Nejprve zavolat původní obsluhu}
 write('a'); {Zkuste napsat něco delšího, nestíháte to}
end;

begin
 GetIntVec($09,Ukazatel); {Zjistíme si, kde je obsluha přerušení}
     SetIntVec($09, Addr(NewInt09)); {A teď tam bodneme naši zrádnou proceduru}
 for I:=1 to maxint do
  for J:=1 to maxint do
   for K:=1 to maxint do
    A:=Abs(a)*2;

 {V této smyčce máme možnost otestovat, zda to skutečně funguje...
 Také si můžeme ověřit, zda fungují i jiné klávesy - např. Ctrl-C, Ctrl-Break}

SetIntVec($09,Ukazatel); {Na původní místo vrátíme správné přerušení.}
end.

Nyní již víte o programování v Pascalu vše potřebné. Sekci pro experty nechte sebevrahům. Teď to chce jen trochu cviku. Žádný učený z nebe nespadl, skutečnými programátory se stanete, až budete mít napsáno okolo 200 vlastních programů (které jste celé sami vymysleli).

K dalšímu zdokonalování vám můžu doporučit např. www.programmersheaven.com - naleznete tam spoustu zajímavých informací. Také si na Internetu tu a tam vyhledejte pár zajímavých algoritmů (QuickSort, Agrawal,...) a zkuste je naprogramovat, programátorem se totiž stáváte až znalostí algoritmů, ne znalostí programovacích jazyků!!!

Přeji vám hodně úspěchů ve vašem dalším programátorském životě!