home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* DIRMT.TUR *)
- (* (c) 1987 Michael Ceol & PASCAL INT. *)
- (* System und Compiler-spezifischer Teil der Directory-Bibliothek fuer *)
- (* MS-DOS in Turbo Pascal *)
- (* programmiert und getestet auf einem MS-DOS 3.1-System *)
-
- TYPE (* der Registersatz der Intel 80xx-CPU: *)
- Dir_Regs = RECORD CASE INTEGER OF
- 1: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : INTEGER);
- 2: (Al, Ah, Bl, Bh, Cl, Ch, Dl, Dh : BYTE);
- END;
- VAR
- DirRegs : Dir_Regs;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE FSetDTA (DTA: DTA_Ptr); (* neue DTA-Adresse setzen *)
- BEGIN
- DirRegs.AX := $1A00; DirRegs.DS := Seg(DTA^);
- DirRegs.DX := Ofs(DTA^); MsDos(DirRegs);
- END;
-
- FUNCTION FGetDTA: DTA_Ptr; (* aktuelle DTA-Adresse holen *)
- BEGIN
- DirRegs.AX := $2F00; MsDos(DirRegs);
- FGetDTA := Ptr(DirRegs.ES, DirRegs.BX);
- END;
- (* ----------------------------------------------------------------------- *)
- (* ersten Directory-Eintrag suchen: *)
- FUNCTION FSFirst (VAR search: Dir_Chr0; attr: INTEGER): INTEGER;
- BEGIN
- DirRegs.AX := $4E00; DirRegs.CX := attr;
- DirRegs.DS := Seg(search); DirRegs.DX := Ofs(search);
- MsDos(DirRegs); FSFirst := DirRegs.AX;
- IF DirRegs.AX <> DOSfnok THEN FSFirst := -31 - DirRegs.AX;
- END;
- (* ----------------------------------------------------------------------- *)
- (* naechsten Directory-Eintrag suchen: *)
- FUNCTION FSNext: INTEGER;
- BEGIN
- DirRegs.AX := $4F00; MsDos(DirRegs); FSNext := DirRegs.AX;
- IF DirRegs.AX <> DOSfnok THEN FSNext := -31 - DirRegs.AX;
- END;
- (* ----------------------------------------------------------------------- *)
- (* zwei Bit-Funktionen, die Compiler-abhaengig sind: *)
- (* Die Bits von "value" um "n" Stellen nach rechts shiften (verschieben): *)
- FUNCTION ShiftR (value, n: INTEGER): INTEGER;
- BEGIN ShiftR := value SHR n END;
- (* Die Bits von "val1" und "val2" undieren: *)
- FUNCTION AndInt (val1, val2: INTEGER): INTEGER;
- BEGIN AndInt := val1 AND val2 END;
- (* ----------------------------------------------------------------------- *)
- (* nochmal zwei eventuell anzupassende Routinen, die hier aber fuer *)
- (* Turbo Pascal und Pascal ST+ gleich sind: *)
- (* Integer-Wert zu einer 'n'-stelligen Zeichenkette mit fuehrenden Nullen: *)
- PROCEDURE IntStr (value, n: INTEGER; VAR s: Dir_Str);
- VAR i : INTEGER; Ch: CHAR;
- BEGIN
- s := '';
- FOR i := 1 TO n DO BEGIN
- s := Concat(Chr((value MOD 10)+Ord('0')),s); value := value DIV 10;
- END;
- END;
- (* wg. negativen Integer-Werten bei grossen Dateigroessen selbigen Wert zu *)
- (* einem positiven Real-Wert konvertieren: *)
- FUNCTION IntCard (i: INTEGER): REAL;
- BEGIN IF i < 0 THEN IntCard := 65536.0 + i ELSE IntCard := i; END;
- (* ----------------------------------------------------------------------- *)
- (* DIRMT.TUR *)