Programová jednotka Dos obsahuje příkazy, které usnadňují spolupráci s operačním systémem (Dnes je ovšem aktuálnější jednotka WinDos, která umožňuje spolupráci s operačním systémem Windows). Jednotka Overlay umožňuje využívat překryvné moduly a maximálně tak šetřit pamětí (v dnešní době se již nepoužívá, pár kilobytů nehraje dneska tak zásadní roli).
type FileRec = record {Držadlo pro soubory, obsahuje potřebné informace} Handle : word; {Držadlo} Mode : word; {Mód, ve kterém je soubor otevřen, viz módy přístupu} RecSize : word; {Velikost položky v bytech} Private : array[1..26] of byte; {Vnitřní data} UserData: array[1..16] of byte; {Data přístupná uživateli} Name : array[0..79] of char; {Jméno (celá cesta) k souboru} end;
TexBuf = array[0..127] of char; {Tyto typy slouží pro práci s textovými soubory} TextRec = record Handle : word; {Držadlo} Mode : word; {Mód přístupu, viz módy přístupu} BufSize : word; {Velikost textového bufferu} Private : word; {??} BufPos : word; {Aktuální pozice v bufferu} BufEnd : word; {Konec bufferu} BufPtr : ^TextBuf; {Ukazatel na buffer} OpenProc :pointer; {Procedura pro otevření souboru} InOutProc:pointer; {Procedura pro čtení/zápis} FlushProc:pointer; {Procedura pro vyprázdnění bufferu} CloseProc:pointer; {Procedura pro uzavření} UserData :array[1..16] of byte; {Uživatelská data} Name : array[0..79] of char; {Jméno souboru - celá cesta} Buffer : TextBuf; {Buffer} end;
Proměnná typu soubor musí obsahovat veškeré výše uvedené položky. Ty však nejsou "veřejně" přístupné, chceme-li se k nim dostat, musíme provést přetypování. Je tedy možná následující konstrukce :
if FileRec(fout).Mode=fmClosed then Writeln('Soubor zatím není otevřen');
FileRec(fout) zde tedy neznamená funkci, ale pouhou typovou změnu (type-casting) proměnné.
Tyto řetězcové typy se používají především při práci s procedurou FSplit.
type PathStr = string[79]; {Celé jméno, včetně cesty a přípony} DirStr = string[67]; {Cesta} NameStr = string[8]; {Jméno bez přípony} ExtStr = string[4]; {Přípona}
type SearchRec = record Fill : array[1..21] of byte; {Data operačního systému, neměnit} Attr : byte; {Atribut souboru - viz konstanty atributů} Time : longint;{Zhuštěný údaj o datu vytvoření souboru, "zčitelnit" lze pomocí procedury UnPackTime} Size : longint;{Velikost souboru v bytech} Name : string[12];{Jméno souboru} end;
type DateTime = record Year, Month, Day, Hour, Min, Sec : word; end;
Anglicky snad umíte, že... Povolené hodnoty pro rok jsou 1980 až 2099, pro měsíce a dny jsou jasné...
Povolené časové hodnoty
Tento typ slouží pro potřeby procedur Intr a MsDos. Přistupovat lze buď k šestnáctibitovým registrům, či k osmibitovým. (Architekturu procesoru doufám znáte).
type 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;
Jednotka Dos vlastně definuje jedinou svou proměnnou :
var DosError : integer;
Tato proměnná obsahuje číslo chybového stavu (či nulu, nenastala-li chyba.) Kódy chyb jsou shodné s kódy v systému MS-DOS :
Kód | Popis | Anglicky |
---|---|---|
0 | Bez chyby | No error |
2 | Soubor nenalezen | File not found |
3 | Cesta nenalezena | Path not found |
5 | Přístup odepřen | Access denied |
6 | Špatné manipulační číslo ( = držadlo z FileRec) | Invalid handle |
8 | Nedostatek paměti | Not enough memory |
10 | Špatné prostředí procesu | Invalid environment |
11 | Špatný formát | Invalid format |
18 | Více souborů není | No more files |
Číslo 18 se používá v souvislosti s FindFirst a FindNext.
Předpokládám, že znáte význam význam registru příznaků (Flags) a jeho
jednotlivých složek.
Uvedené konstanty zjednodušují zjištění nastavených příznaků. Např. R.Flags
and FCarry <> 0 je true, pokud je nastaven příznak Carry (při poslední operaci
došlo k přenosu ...).
const FCarry = $0001; FParity = $0004; FAuxiliary = $0010; FZero = $0040; FSign = $0080; FOverflow = $0800;
const fmClosed = $D7B0; {Soubor je uzavřen} fmInput = $D7B1; {Soubor je otevřen pro zápis} fmOutput = $D7B2; {Soubor je otevřen pro čtení} fmInOut = $D7B3; {Soubor je otevřen pro čtení i zápis}
const ReadOnly = $01; Hidden = $02; SysFile = $03; VolumeID = $04; Directory = $10; Archive = $20; AnyFile = $3F;
Raději si to ukážeme na příkladu :
SwapVectors; {Prohodíme vektory přerušení na původní systémové hodnoty} Exec(...); {Spouštíme nějaký externí proces, ten nebude mít ponětí, že je spuštěn z našeho programu} SwapVectors; {Prohodíme vektory zpět, na naše "programové" hodnoty}
Jednotka Overlay se dá použít pouze v reálném režimu procesoru (dnes skoro vše běhá v režimu chráněném). Chceme-li ji použít, je nutné, aby jednotky, které chceme použít jako překryvné byly přeloženy s direktivami překladače {$F+} a {$O+}. Hlavní program pak musí být přeložen s direktivou {$F+}. Dále je nutné, aby překryvné jednotky byly v uses uvedeny až za jednotkou Overlay. Pokud mají nějakou inicializační část, je nutné, aby před zavoláním této inicializační části byla zavolána procedura OvrInit; (ta musí být tedy uvedena v inicializační části nějaké jednotky, která následuje za Overlay a je přitom je před překryvnými jednotkami, nejčastěji se tedy vytvoří samostatná jednotka MyInit, která pouze zavolá ve své inicializační části OvrInit a jinak nic nedělá).
Ze standardních programových jednotek lze jako překryvnou použít pouze jednotku Dos. Dále nelze jako překryvné použít ty jednotky, které do paměti nahrávají grafický driver či obsahují interrupt funkce či procedury.
Pro svou práci definuje jednotka Overlay jediný speciální typ proměnné.
type OvrReadFunc = function(OvrSeg : word) : integer;
Tyto konstanty slouží ke zjištění výsledku dané operace (výsledná hodnota je uložena v OvrResult)
const ovrOK = 0; {Operace proběhla bez chyby} ovrError =-1; {Chyba správce překryvných jednotek} ovrNotFound =-2; {Překryvný soubor nenalezen} ovrNoMemory =-3; {Nedostatek paměti} ovrIOError =-4; {I/O chyba} ovrNoEMSDriver=-5; {EMS není k dispozice} ovrNOEMSMemory=-6; {Nedostatek paměti pro EMS}
Inicializované proměnné obsahují informace o nastavení manažeru překryvných jednotek. Jejich změnou lze dosáhnout změny nastavení. Většina těchto proměnných je definována již v jednotce System, pouze pět zde uvedených je definováno přímo v jednotce Overlay. Většinu z těchto proměnných není důvod měnit, programátor s nimi prakticky nepřijde do styku, k nastavení parametrů se totiž používá spíše uvedených procedur a funkcí.