$R-,S- Unit MyDos; Interface CONST IO_CTRL = $4000; IO_ISDEV = $80; IO_EOF = $40; IO_BINARY = $20; IO_ISCLK = 8; IO_ISNUL = 4; IO_ISCOT = 2; IO_ISCIN = 1; StdIn = 0; StdOut = 1; StdErr = 2; StdLst = 3; StdAux = 4; TYPE DiskInfo = RECORD Avail_Clu, Total_Clu, BytPrSec, SecPrClu : WORD; END; const { Flags bit masks } FCarry = $0001; FParity = $0004; FAuxiliary = $0010; FZero = $0040; FSign = $0080; FOverflow = $0800; { File attribute constants } ReadOnly = $01; Hidden = $02; SysFile = $04; VolumeID = $08; Directory = $10; Archive = $20; AnyFile = $3F; type { Search record used by FindFirst and FindNext } SearchRec = record Fill: array[1..21] of Byte; Attr: Byte; Time: Longint; Size: Longint; Name: string[12]; end; { Date and time record used by PackTime and UnpackTime } DateTime = record Year,Month,Day,Hour,Min,Sec: Word; end; String4 = String[4]; VAR DosError : WORD; procedure GetFAttr(var F; var Attr: Word); procedure SetFAttr(var F; Attr: Word); procedure UnpackTime(P: Longint; var T: DateTime); procedure PackTime(var T: DateTime; var P: Longint); PROCEDURE ExecEnv(Path,CmdLine: String; environ : Pointer); PROCEDURE GetTime(VAR hour, min, sec, s100 : WORD); PROCEDURE GetDate(VAR year, month, day, dow : WORD); PROCEDURE SetTime(hour, min, sec, s100 : WORD); PROCEDURE SetDate(year, month, day : WORD); PROCEDURE GetIntVec(nr : BYTE; VAR p : Pointer); PROCEDURE SetIntVec(nr : BYTE; p : Pointer); PROCEDURE FindFirst(path : String; attr : WORD; VAR dta : SearchRec); PROCEDURE FindNext(VAR dta: SearchRec); PROCEDURE GetFTime(VAR fil; VAR time : LongInt); PROCEDURE SetFTime(VAR fil; time : LongInt); FUNCTION GetDevStat(handle : WORD) : WORD; PROCEDURE GetDiskInfo(drive : WORD; VAR dinfo : DiskInfo); FUNCTION DosVersion: WORD; PROCEDURE Exec(Path,CmdLine: String); FUNCTION FindEnv(find : String) : String; PROCEDURE PutString(st : String); FUNCTION Hex(w : Word): String4; PROCEDURE ShrinkHeap; PROCEDURE Move(VAR fra, til; bytes : WORD); Implementation PROCEDURE Move(VAR fra, til; bytes : WORD); {Erstatter SYSTEM:MOVE} BEGIN Inline( $1E { push ds ;} /$C5/$76/HEAPPTR {mov bx,[>HeapPtr]} /$81/$C3/$0F/$00 {add bx,15} /$B1/$04 {mov cl,4} /$D3/$EB {shr bx,cl} /$03/$1E/>HEAPPTR+2 {add bx,[>HeapPtr+2]} /$89/$D8 {mov ax,bx} /$2D/$00/$10 {sub ax,$1000} /$A3/>FREEPTR+2 {mov [>FreePtr+2],ax} /$31/$C0 {xor ax,ax} /$A3/>FREEPTR {mov [>FreePtr],ax} /$B4/$4A {mov ah,$4A} /$8E/$06/>PREFIXSEG {mov es,[>PrefixSeg]} /$2B/$1E/>PREFIXSEG {sub bx,[>PrefixSeg]} /$CD/$21 {int $21} ); END; FUNCTION Hex(w : Word): String4; CONST HexCh : ARRAY [0..15] OF CHAR = '0123456789ABCDEF'; VAR h : String4; BEGIN h[0] := #4; h[1] := HexCh[Hi(w) Shr 4]; h[2] := HexCh[Hi(w) AND 15]; h[3] := HexCh[Lo(w) Shr 4]; h[4] := HexCh[Lo(w) AND 15]; Hex := h; END; PROCEDURE SetTime(hour, min, sec, s100 : WORD); BEGIN Inline( $8A/$56/ST {mov cl,[bp+>st]} /$30/$ED {xor ch,ch} /$8D/$96/>ST+1 {lea dx,[bp+>st+1]} /$1E {push ds} /$16 {push ss} /$1F {pop ds} /$CD/$21 {int $21} /$1F {pop ds} ); END; PROCEDURE UnpackTime(P: Longint; var T: DateTime); BEGIN Inline( $8B/$56/DOSERROR {mov [>DosError],ax} ); END; {SetFAttr} PROCEDURE GetFAttr(var F; var Attr: Word); BEGIN Inline( $B8/$00/$43 {mov ax,$4300} /$1E {push ds} /$C5/$56/DOSERROR {mov [>DosError],ax} /$C4/$5E/DOSERROR {mov [>DosError],ax} /$89/$56/$FE {mov [bp-2],dx} ); END; {GetDevStat} PROCEDURE GetTime(VAR hour, min, sec, s100 : WORD); BEGIN Inline( $B4/$2C {mov ah,$2C} /$CD/$21 {int $21} /$31/$C0 {xor ax,ax} /$C4/$5E/PATH {lea dx,[bp+>path]} /$89/$D3 {mov bx,dx} /$42 {inc dx} /$8A/$1F {mov bl,[bx]} /$30/$FF {xor bh,bh} /$01/$D3 {add bx,dx} /$C6/$07/$00 {mov byte ptr [bx],0} /$8B/$4E/DOSERROR {mov [>DosError],ax} ); END; {FindFirst} PROCEDURE FindNext(VAR dta: SearchRec); BEGIN Inline( $1E {push ds} /$C5/$56/DOSERROR {mov [>DosError],ax} ); END; {FindNext} PROCEDURE GetFTime(VAR fil; VAR time : LongInt); BEGIN Inline( $B8/$00/$57 {mov ax,$5700} /$C4/$5E/DOSERROR {mov [>DosError],ax} ); END; {GetFTime} PROCEDURE SetFTime(VAR fil; time : LongInt); BEGIN Inline( $B8/$01/$57 {mov ax,$5701} /$C4/$5E/DOSERROR {mov [>DosError],ax} ); END; {SetFTime} FUNCTION FindEnv(find : String) : String; VAR st : String; cp : ^CHAR; BEGIN cp := Ptr(MemW[PrefixSeg:$2C],0); WHILE cp^ <> #0 DO BEGIN st := ''; WHILE cp^ <> #0 DO BEGIN Inc(st[0]); st[Length(st)] := cp^; Inc(WORD(cp)); END; IF Copy(st,1,Length(find)) = find THEN BEGIN Delete(st,1,Length(find)); FindEnv := st; Exit; END; Inc(WORD(cp)); END; FindEnv := ''; END; END.