home *** CD-ROM | disk | FTP | other *** search
/ Mega Top 1 / os2_top1.zip / os2_top1 / APPS / PROG / PASCAL / SPEED2 / SRC / LIB / DOS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-09-29  |  28.1 KB  |  1,127 lines

  1. UNIT Dos;
  2.  
  3. {**************************************************************************
  4.  *                 General Unit for Speed-386                             *
  5.  *                                                                        *
  6.  *                                                                        *
  7.  * Copyright (C) 1993,94 R.Nürnberger, Franz-Mehring-Str.2 09112 Chemnitz *
  8.  *                                                                        *
  9.  *                                                                        *
  10.  **************************************************************************}
  11.  
  12.  
  13. interface
  14.  
  15.  
  16. const
  17.  
  18. { Flags bit masks }
  19.  
  20.   FCarry     = 1;
  21.   FParity    = 4;
  22.   FAuxiliary = 16;
  23.   FZero      = 64;
  24.   FSign      = 128;
  25.   FOverflow  = 2048;
  26.  
  27. { File mode numbers }
  28.  
  29.   fmClosed = 0;
  30.   fmInput  = $40;   {Read only}
  31.   fmOutput = $41;   {Write only}
  32.   fmInOut  = $42;   {allow both read and write access}
  33.  
  34. { File attribute constants }
  35.  
  36.   ReadOnly  = 1;
  37.   Hidden    = 2;
  38.   SysFile   = 4;
  39.   Directory = 16;
  40.   Archive   = 32;
  41.   AnyFile   = 55;
  42.  
  43. {Compare File times result codes}
  44.   F_EQUAL          =0;
  45.   F_FIRST_GREATER  =1;
  46.   F_SECOND_GREATER =2;
  47.   F_ERROR          =255;
  48.  
  49. type
  50.       CmdStr  = string;        { Command line string }
  51.       PathStr = string[79];    { File pathname string }
  52.       DirStr  = string[128];   { Drive and directory string }
  53.       NameStr = string[8];     { File name string }
  54.       ExtStr  = string[4];     { File extension string }
  55.  
  56.  
  57.       Registers =
  58.          record
  59.            case of
  60.              0: (EAX,EBX,ECX,EDX,EBP,ESI,EDI,DS_ES,EFlags:LongWord);
  61.              1: (AX,X_AX,BX,X_BX,CX,X_CX,DX,X_DX,BP,X_BP,SI,X_SI,
  62.                  DI,X_DI,DS,ES,Flags,X_FLAGS: Word);
  63.              2: (AL,AH,X_AL,X_AH,BL,BH,X_BL,X_BH,CL,CH,X_CL,X_CH,
  64.                  DL,DH,X_DL,X_DH: Byte);
  65.            end;
  66.  
  67.  
  68.       FileRec = record
  69.                       Handle   : LongWord;
  70.                       RecSize  : LongWord;
  71.                       Name     : array[0..79] of Char;
  72.                       Private1 : POINTER;  {extended attributes}
  73.                       Mode     : LONGWORD; {Current file mode}
  74.                       Reserved : POINTER;  {for further extensions}
  75.                 end;
  76.  
  77.  
  78.       TextRec = record
  79.                       Handle    : LongWord;
  80.                       RecSize  : LongWord; {not used yet}
  81.                       Name      : array[0..79] of Char;
  82.                       Private1 : POINTER;  {extended attributes}
  83.                       Mode     : LONGWORD; {Current file mode}
  84.                       Reserved : POINTER;  {for further extensions}
  85.                 end;
  86.  
  87. { Search record used by FindFirst and FindNext }
  88.  
  89. TYPE
  90.   TSearchRec = record
  91.                      oNextEntryOffset:LONGWORD;
  92.                      fdateCreation:WORD;
  93.                      Time:WORD;
  94.                      fdateLastAccess:WORD;
  95.                      ftimeLastAccess:WORD;
  96.                      fdateLastWrite:WORD;
  97.                      ftimeLastWrite:WORD;
  98.                      Size:LONGWORD;
  99.                      cbFileAlloc:LONGWORD;
  100.                      Attr:LONGWORD;
  101.                      cchName:BYTE;
  102.                      Name:STRING;
  103.                      {private}
  104.                      HDir:LONGINT;
  105.                end;
  106.  
  107.   _PFSALLOCATE=^_FSALLOCATE;
  108.   _FSALLOCATE=RECORD
  109.                     idFileSystem:LONGWORD;
  110.                     cSectorUnit:LONGWORD;
  111.                     cUnit:LONGWORD;
  112.                     cUnitAvail:LONGWORD;
  113.                     cbSector:WORD;
  114.                END;
  115.  
  116.   _PFILESTATUS3=^_FILESTATUS3;
  117.   _FILESTATUS3=RECORD
  118.                     fdateCreation:WORD;
  119.                     ftimeCreation:WORD;
  120.                     fdateLastAccess:WORD;
  121.                     ftimeLastAccess:WORD;
  122.                     fdateLastWrite:WORD;
  123.                     ftimeLastWrite:WORD;
  124.                     cbFile:LONGWORD;
  125.                     cbFileAlloc:LONGWORD;
  126.                     attrFile:LONGWORD;
  127.                 END;
  128.  
  129.   {Type for GetEnvStr}
  130.   PEnvString=^TEnvString;
  131.   TEnvString=array[0..65500] of Char; {terminated with 0-character}
  132.  
  133.   ExecResultCode=record
  134.                      codeTerminate:LONGWORD;
  135.                      codeResult:LONGWORD;
  136.                  end;
  137.  
  138. VAR DosError:LongWord;   {DOS unit error status}
  139.  
  140. {Time/Date functions}
  141. PROCEDURE GetDate(var Year,Month,Day,DayOfWeek: Word);
  142. PROCEDURE SetDate(Year,Month,Day,DayOfWeek: Word);
  143. PROCEDURE GetTime(var Hour,Minute,Second,Sec100: Word);
  144. PROCEDURE SetTime(Hour,Minute,Second,Sec100: Word);
  145. PROCEDURE GetFAttr(var F; var Attr: LongWord);
  146. PROCEDURE SetFAttr(var F; Attr: LongWord);
  147. PROCEDURE GetFTime(var F; var year,month,day,hours,minutes,twosecs:Word);
  148. PROCEDURE SetFTime(var F; year,month,day,hours,minutes,twosecs:Word);
  149. FUNCTION  PackTime(hour,minute,twosec:Word):Word;
  150. FUNCTION  PackDate(year,month,day:Word):Word;
  151. PROCEDURE UnPackTime(pack:Word;var hour,minute,twosec:Word);
  152. PROCEDURE UnPackDate(pack:Word;var year,month,day:Word);
  153.  
  154. {File find functions}
  155. PROCEDURE FindFirst(Path: PathStr; Attr: LongWord; var F: TSearchRec);
  156. PROCEDURE FindNext(var F: TSearchRec);
  157. FUNCTION FSearch(Path: PathStr; DirList: String): PathStr;
  158.  
  159.  
  160. {Common functions}
  161. PROCEDURE Delay(ms:LONGWORD);
  162. {FUNCTION FExpand(Path: PathStr): PathStr;}
  163. PROCEDURE FSplit(Path: PathStr; var Dir: DirStr;
  164.                  var Name: NameStr; var Ext: ExtStr);
  165. FUNCTION CompareFileTimes(First,Second:STRING):BYTE;
  166. FUNCTION  DosVersion:Word;
  167. PROCEDURE GetVerify(var Verify: Boolean);
  168. PROCEDURE SetVerify(Verify: Boolean);
  169. FUNCTION  EnvStr(Env:String): PEnvString;
  170. FUNCTION  DiskFree(Drive: Byte): LongWord;
  171. FUNCTION  DiskSize(Drive: Byte): LongWord;
  172.  
  173. {Process functions}
  174. PROCEDURE Exec(Path: PathStr; CmdLine: CmdStr;VAR return:ExecResultCode);
  175. FUNCTION ProcessActive(pid:LONGWORD):BOOLEAN;
  176. PROCEDURE KillProcess(pid:LONGWORD);
  177.  
  178. {Thread functions}
  179. PROCEDURE StartThread(ThreadAddr:POINTER;StackSize:LONGWORD;
  180.                       Params:POINTER;VAR Tid:LONGWORD);
  181. PROCEDURE SuspendThread(Tid:LONGWORD);
  182. PROCEDURE ResumeThread(Tid:LONGWORD);
  183. PROCEDURE KillThread(Tid:LONGWORD);
  184.  
  185. IMPLEMENTATION
  186.  
  187. TYPE
  188.  TSearchRecIntern = record
  189.                      oNextEntryOffset:LONGWORD;
  190.                      fdateCreation:WORD;
  191.                      Time:WORD;
  192.                      fdateLastAccess:WORD;
  193.                      ftimeLastAccess:WORD;
  194.                      fdateLastWrite:WORD;
  195.                      ftimeLastWrite:WORD;
  196.                      Size:LONGWORD;
  197.                      cbFileAlloc:LONGWORD;
  198.                      Attr:LONGWORD;
  199.                      cchName:BYTE;
  200.                      Name:ARRAY[0..255] OF CHAR;
  201.                      {private}
  202.                      HDir:LONGINT;
  203.                end;
  204.  
  205. VAR
  206.    TempCmdLine:STRING;
  207.  
  208. IMPORTS {private}
  209.        FUNCTION DosWaitChild(pid:LONGWORD;VAR rpid:LONGWORD;
  210.                              VAR res:ExecResultCode;option:LONGWORD;
  211.                              action:LONGWORD):LONGWORD: DOSCALLS index 280;
  212.        PROCEDURE DosKillProcess(pid:LONGWORD;
  213.                                 action:LONGWORD):       DOSCALLS index 235;
  214.        FUNCTION DosCreateThread(Stack,Flags:LONGWORD;Para:POINTER;
  215.                                 Adr:POINTER;VAR tid:LONGWORD):
  216.                                 LONGWORD:               DOSCALLS index 311;
  217.        FUNCTION DosResumeThread(_tid:LONGWORD):LONGWORD:DOSCALLS index 237;
  218.  
  219.        FUNCTION DosSuspendThread(_tid:LONGWORD):LONGWORD:DOSCALLS index 238;
  220.        FUNCTION DosKillThread(_tid:LONGWORD):LONGWORD:  DOSCALLS index 111;
  221. END;
  222.  
  223.  
  224. PROCEDURE KillThread(Tid:LONGWORD);
  225. BEGIN
  226.      DosKillThread(Tid);
  227. END;
  228.  
  229. PROCEDURE SuspendThread(Tid:LONGWORD);
  230. BEGIN
  231.      DosSuspendThread(Tid);
  232. END;
  233.  
  234. PROCEDURE ResumeThread(Tid:LONGWORD);
  235. BEGIN
  236.      DosResumeThread(Tid);
  237. END;
  238.  
  239. PROCEDURE StartThread(ThreadAddr:POINTER;StackSize:LONGWORD;
  240.                       Params:POINTER;VAR Tid:LONGWORD);
  241. BEGIN
  242.      DosCreateThread(StackSize,2,Params,@ThreadAddr,Tid);
  243. END;
  244.  
  245.  
  246. PROCEDURE KillProcess(pid:LONGWORD);
  247. BEGIN
  248.      DosKillProcess(pid,0);
  249. END;
  250.  
  251. FUNCTION ProcessActive(pid:LONGWORD):BOOLEAN;
  252. VAR r,rpid:LONGWORD;
  253.     res:Execresultcode;
  254. BEGIN
  255.      r:=DosWaitChild(pid,rpid,res,1{DCWW_NOWAIT},0{DCWA_PROCESS});
  256.      IF r=129 {child not complete} THEN ProcessActive:=TRUE;
  257.      ELSE ProcessActive:=FALSE; {Child complete or illegal pid}
  258. END;
  259.  
  260. PROCEDURE FSplit(Path: PathStr; var Dir: DirStr;
  261.                  var Name: NameStr; var Ext: ExtStr);
  262. BEGIN
  263.      ASM
  264.         LEA ESI,$Path
  265.         MOV AL,[ESI+0]
  266.         INC ESI
  267.         XOR EDX,EDX
  268.         XOR EBX,EBX
  269.         MOV DL,AL
  270.         XOR DH,DH
  271.         MOV BX,DX
  272.         PUSH ESI
  273.         POP  EDI
  274.         ADD  EDI,EBX
  275.         DEC  EDI
  276.         OR   EBX,EBX  ;String length 0 ?
  277.         JE   !L_2
  278. !L_1:
  279.         CMPB [EDI+0],'\'
  280.         JE   !L_2
  281.         CMPB [EDI+0],':'
  282.         JE   !L_2
  283.         DEC  EDI
  284.         DEC  EBX
  285.         JNE  !L_1   ;until string begin
  286. !L_2:
  287.         MOV  EAX,67
  288.         MOV EDI,$Dir
  289.         CALLN32 System.!CopyString
  290.  
  291.         XOR EBX,EBX
  292.         PUSH ESI
  293.         POP EDI
  294.         JMP !L_4
  295. !L_3:
  296.         CMPB [EDI+0],46
  297.         JE !L_5
  298.         INC EBX
  299.         INC EDI
  300. !L_4:
  301.         CMP EBX,EDX
  302.         JNE !L_3
  303. !L_5:
  304.         MOV EAX,8
  305.         MOV EDI,$Name
  306.         CALLN32 System.!CopyString
  307.  
  308.         MOV EAX,4
  309.         PUSH EDX
  310.         POP EBX
  311.         MOV EDI,$Ext
  312.         CALLN32 System.!CopyString
  313.     END;
  314. END;
  315.  
  316. FUNCTION FSearch(Path: PathStr; DirList: String): PathStr;
  317. var r:PATHSTR;
  318. BEGIN
  319.      ASM
  320.         PUSHL 79  ;result buf len
  321.         LEA EAX,$r
  322.         INC EAX
  323.         PUSH EAX
  324.         LEA EAX,$Path
  325.         INC EAX
  326.         PUSh EAX
  327.         LEA EAX,$DirList
  328.         INC EAX
  329.         PUSH EAX
  330.         PUSHL 0   ;Flags
  331.         MOV AL,5
  332.         CALLDLL DosCalls,228    ;DosSearchPath
  333.         ADD ESP,20
  334.         MOV _DosError,EAX
  335.     END;
  336.     IF DosError=0 THEN
  337.     BEGIN
  338.          ASM
  339.             LEA ESI,$r
  340.             INC ESI
  341.             MOV CL,255
  342.             CLD
  343. !nef:
  344.             INC CL
  345.             LODSB
  346.             CMP AL,0
  347.             JNE !nef
  348.  
  349.             LEA EDI,$r
  350.             MOV [EDI+0],CL  ;Set string len
  351.         END;
  352.     END
  353.     ELSE r:='';
  354.     FSearch:=r;
  355. END;
  356.  
  357. FUNCTION PackTime(hour,minute,twosec:Word):Word;
  358. VAR time:Word;
  359. BEGIN
  360.      ASM
  361.         MOV BL,$Hour
  362.         SHL BL,3    ;multiply with 8
  363.         MOV AL,$minute
  364.         SHR AL,3    ;divide by 8
  365.         ADD AL,BL
  366.         SHL AX,8    ;Shift
  367.         MOV $time,AX
  368.  
  369.         MOV BL,$minute
  370.         AND BL,7
  371.         SHL BL,5    ;multiply with 2 and shift
  372.         ADD BL,$TwoSec
  373.         MOV $time,BL
  374.      END;
  375.      PackTime:=Time;
  376. END;
  377.  
  378. FUNCTION Packdate(year,month,day:Word):Word;
  379. VAR Date:Word;
  380. BEGIN
  381.      ASM
  382.         MOV AL,$month
  383.         MOV BL,0
  384.         CMP AL,7
  385.         JNA !mo1
  386.         MOV BL,1
  387.         SUB AL,8
  388. !mo1:
  389.         MOV CX,$year
  390.         SUB CX,1980
  391.         SHL CX,1    ;multiply with 2
  392.         MOVZX BX,BL
  393.         ADD CX,BX
  394.         SHL CX,8    ;Shift
  395.         MOV $Date,CX
  396.  
  397.         SHL AL,5    ;multiply month with 2 and shift
  398.         ADD AL,$Day
  399.         MOV $Date,AL
  400.      END;
  401.      PackDate:=Date;
  402. END;
  403.  
  404. PROCEDURE UnPackTime(pack:Word;var hour,minute,twosec:Word);
  405. VAR h,min,sec:WORD;
  406. BEGIN
  407.     ASM
  408.        MOV DX,$pack
  409.  
  410.        MOV AL,DH    ;Hour/Minute
  411.        AND AL,248   ;Mask Hour
  412.        SHR AL,3     ;divide by 8
  413.        MOVZX AX,AL
  414.        MOV $h,AX
  415.  
  416.        MOV AL,DH    ;Hour/Minute
  417.        AND AL,7     ;Mask Minute
  418.        SHL AL,3     ;multiply with 8
  419.        MOV BL,AL
  420.  
  421.        MOV AL,DL    ;Minute/sec
  422.        AND AL,224   ;Mask minute
  423.        SHR AL,5     ;divide by 2 and shift
  424.        ADD AL,BL
  425.        MOVZX AX,AL
  426.        MOV $min,AX
  427.  
  428.        MOV AL,DL    ;Minute/sec
  429.        AND AL,31    ;Mask twoseconds
  430.        MOVZX AX,AL
  431.        MOV $sec,AX
  432.      END;
  433.      Hour:=h;
  434.      minute:=min;
  435.      twosec:=sec;
  436. END;
  437.  
  438. PROCEDURE UnPackDate(pack:Word;var year,month,day:Word);
  439. VAR y,m,d:Word;
  440. BEGIN
  441.      ASM
  442.         MOV DX,$pack
  443.  
  444.         MOV AL,DH    ;Year/Month
  445.         AND AL,254   ;Clear Bit 1
  446.         SHR AL,1     ;Divide by 2
  447.         MOVZX AX,AL
  448.         ADD AX,1980
  449.         MOV $y,AX    ;Year
  450.         MOV BL,0
  451.         MOV AL,DH    ;Year/Month
  452.         AND AL,1     ;Mask HSB month
  453.         CMP AL,1
  454.         JNE !ml7
  455.         MOV BL,8
  456. !ml7:
  457.         MOV AL,DL    ;month/Day
  458.         AND AL,224   ;mask month (upper 3 bits)
  459.         SHR AL,5     ;divide by 2 and shift
  460.         ADD AL,BL
  461.         MOVZX AX,AL
  462.         MOV $m,AX    ;Month
  463.  
  464.         MOV AL,DL    ;Month/day
  465.         AND AL,31    ;Mask day
  466.         MOVZX AX,AL
  467.         MOV $d,AX    ;day
  468.      END;
  469.      year:=y;
  470.      month:=m;
  471.      day:=d;
  472. END;
  473.  
  474. PROCEDURE FindFirst(Path: PathStr; Attr: LongWord; var F: TSearchRec);
  475. VAR hDir:LONGINT;
  476.     count,size:LONGWORD;
  477.     i:TSearchRecIntern;
  478.     t:BYTE;
  479.     s:STRING;
  480. Label l;
  481. BEGIN
  482.      hDir:=-1;  {HDIR_CREATE}
  483.      count:=1;
  484.      size:=sizeof(TSearchRecIntern)-4;
  485.      ASM
  486.         PUSHL 1  ;FIL_STANDARD
  487.         LEA EAX,$count
  488.         PUSH EAX
  489.         PUSHL $size
  490.         LEA EAX,$i
  491.         PUSH EAX
  492.         PUSHL $Attr
  493.         LEA EAX,$hDir
  494.         PUSH EAX
  495.         LEA EAX,$Path
  496.         INC EAX
  497.         PUSH EAX
  498.         MOV AL,7
  499.         CALLDLL DosCalls,264   ;DosFindFirst
  500.         ADD ESP,28
  501.         MOV _DosError,EAX
  502.      END;
  503.      f.HDir:=HDir;
  504.      IF ((DosError<>0)or(Count=0)) THEN
  505.      BEGIN
  506.           IF DosError=0 THEN DosError:=18;
  507.           ASM
  508.              PUSHL $HDir
  509.              MOV AL,1
  510.              CALLDLL DosCalls,263  ;DosFindClose
  511.              ADD ESP,4
  512.           END;
  513.           exit;
  514.      END;
  515.      f.oNextEntryOffset:=i.oNextEntryOffset;
  516.      f.fdateCreation:=i.fdateCreation;
  517.      f.Time:=i.time;
  518.      f.fdateLastAccess:=i.fdateLastAccess;
  519.      f.ftimeLastAccess:=i.fTimeLastAccess;
  520.      f.fdateLastWrite:=i.fdateLastWrite;
  521.      f.ftimeLastWrite:=i.fTimeLastWrite;
  522.      f.Size:=i.size;
  523.      f.cbFileAlloc:=i.cbFileAlloc;
  524.      f.Attr:=i.Attr;
  525.      f.cchName:=i.cchName;
  526.      s:='';
  527.      FOR t:=0 TO 255 DO
  528.      BEGIN
  529.           s[t+1]:=i.Name[t];
  530.           IF s[t+1]=#0 THEN
  531.           BEGIN
  532.                s[0]:=chr(t);
  533.                goto l;
  534.           END;
  535.      END;
  536. l:
  537.      f.Name:=s;
  538. END;
  539.  
  540. PROCEDURE FindNext(var F: TSearchRec);
  541. VAR HDir:LONGINT;
  542.     Count,size:LONGWORD;
  543.     t:BYTE;
  544.     s:STRING;
  545.     i:TSearchRecIntern;
  546. Label l;
  547. BEGIN
  548.      Count:=1;
  549.      size:=sizeof(TSearchRec)-4;
  550.      HDir:=f.HDir;
  551.      i.oNextEntryOffset:=f.oNextEntryOffset;
  552.      i.fdateCreation:=f.fdateCreation;
  553.      i.Time:=f.time;
  554.      i.fdateLastAccess:=f.fdateLastAccess;
  555.      i.ftimeLastAccess:=f.fTimeLastAccess;
  556.      i.fdateLastWrite:=f.fdateLastWrite;
  557.      i.ftimeLastWrite:=f.fTimeLastWrite;
  558.      i.Size:=f.size;
  559.      i.cbFileAlloc:=f.cbFileAlloc;
  560.      i.Attr:=f.Attr;
  561.      i.cchName:=f.cchName;
  562.      i.HDir:=f.HDir;
  563.      ASM
  564.         LEA EAX,$Count
  565.         PUSH EAX
  566.         PUSHL $size
  567.         LEA EAX,$i
  568.         PUSH EAX
  569.         PUSHL $HDir
  570.         MOV AL,4
  571.         CALLDLL DosCalls,265     ;DosFindNext
  572.         ADD ESP,16
  573.         MOV _DosError,EAX
  574.      END;
  575.      IF ((DosError<>0)or(Count=0)) THEN
  576.      BEGIN
  577.           IF DosError=0 THEN DosError:=18;
  578.           ASM
  579.              PUSHL $HDir
  580.              MOV AL,1
  581.              CALLDLL DosCalls,263  ;DosFindClose
  582.              ADD ESP,4
  583.           END;
  584.           exit;
  585.      END;
  586.      f.oNextEntryOffset:=i.oNextEntryOffset;
  587.      f.fdateCreation:=i.fdateCreation;
  588.      f.Time:=i.time;
  589.      f.fdateLastAccess:=i.fdateLastAccess;
  590.      f.ftimeLastAccess:=i.fTimeLastAccess;
  591.      f.fdateLastWrite:=i.fdateLastWrite;
  592.      f.ftimeLastWrite:=i.fTimeLastWrite;
  593.      f.Size:=i.size;
  594.      f.cbFileAlloc:=i.cbFileAlloc;
  595.      f.Attr:=i.Attr;
  596.      f.cchName:=i.cchName;
  597.      f.HDir:=i.HDir;
  598.      s:='';
  599.      FOR t:=0 TO 255 DO
  600.      BEGIN
  601.           s[t+1]:=i.Name[t];
  602.           IF s[t+1]=#0 THEN
  603.           BEGIN
  604.                s[0]:=chr(t);
  605.                goto l;
  606.           END;
  607.      END;
  608. l:
  609.      f.Name:=s;
  610. END;
  611.  
  612. PROCEDURE Exec(Path: PathStr; CmdLine: CmdStr;VAR return:ExecResultCode);
  613. VAR
  614.     error:string[128];
  615. BEGIN
  616.      TempCmdLine:=Path+#0+CmdLine+#0;  {Store it cause it may be used later by exec pgm}
  617.      ASM
  618.         LEA EAX,$Path
  619.         INC EAX
  620.         PUSH EAX
  621.         PUSHL $return
  622.         PUSHL 0      ;Environment of parent
  623.         MOV EAX,OFFSET(_TempCmdLine);
  624.         INC EAX
  625.         PUSH EAX    ;Command line parameters
  626.         PUSHL 1     ;EXEC_ASYNC
  627.         PUSHL 127   ;Length of error buffer
  628.         LEA EAX,$error
  629.         INC EAX
  630.         PUSH EAX
  631.         MOV AL,7
  632.         CALLDLL DosCalls,283    ;DosExecPgm
  633.         ADD ESP,28
  634.         MOV _DosError,EAX
  635.      END;
  636.      IF DosError=0 THEN Doserror:=return.CodeResult;
  637. END;
  638.  
  639.  
  640. PROCEDURE Delay(ms:LONGWORD);
  641. BEGIN
  642.      ASM
  643.         PUSHL $ms
  644.         MOV AL,1
  645.         CALLDLL DosCalls,229  ;DosSleep
  646.         ADD ESP,4
  647.      END;
  648. END;
  649.  
  650. PROCEDURE GetFAttr(var F; var Attr: LongWord);
  651. VAR s:_FILESTATUS3;
  652.     size:LONGWORD;
  653. BEGIN
  654.      size:=sizeof(_FILESTATUS3);
  655.      ASM
  656.         PUSHL $size
  657.         LEA EAX,$s
  658.         PUSH EAX
  659.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  660.         MOV EDI,$f
  661.         MOV EAX,[EDI+0]  ;Handle of file
  662.         PUSH EAX
  663.         MOV AL,4
  664.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  665.         ADD ESP,16
  666.         MOV _DosError,EAX
  667.      END;
  668.      IF DosError=0 THEN
  669.      BEGIN
  670.           Attr:=s.attrFile;
  671.      END
  672.      ELSE Attr:=0; {invalid}
  673.  
  674. END;
  675.  
  676. PROCEDURE SetFAttr(var F; Attr: LongWord);
  677. VAR s:_FILESTATUS3;
  678.     size:LONGWORD;
  679. BEGIN
  680.      size:=sizeof(_FILESTATUS3);
  681.      ASM
  682.         PUSHL $size
  683.         LEA EAX,$s
  684.         PUSH EAX
  685.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  686.         MOV EDI,$f
  687.         MOV EAX,[EDI+0]  ;Handle of file
  688.         PUSH EAX
  689.         MOV AL,4
  690.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  691.         ADD ESP,16
  692.         MOV _DosError,EAX
  693.      END;
  694.      IF DosError=0 THEN
  695.      BEGIN
  696.           s.attrFile:=Attr;
  697.           ASM
  698.              PUSHL $size
  699.              LEA EAX,$s
  700.              PUSH EAX
  701.              PUSHL 1   ;File Information level 1 FIL_STANDARD
  702.              MOV EDI,$f
  703.              MOV EAX,[EDI+0]  ;Handle of file
  704.              PUSH EAX
  705.              MOV AL,4
  706.              CALLDLL DosCalls,218    ;DosSetFileInfo
  707.              ADD ESP,16
  708.              MOV _DosError,EAX
  709.           END;
  710.      END;
  711. END;
  712.  
  713.  
  714. PROCEDURE GetFTime(var F; var year,month,day,Hours,Minutes,TwoSecs:WORD);
  715. VAR s:_FILESTATUS3;
  716.     size:LONGWORD;
  717.     y,m,d,h,min,sec:Word;
  718.     date,time:WORD;
  719. BEGIN
  720.      size:=sizeof(_FILESTATUS3);
  721.      ASM
  722.         PUSHL $size
  723.         LEA EAX,$s
  724.         PUSH EAX
  725.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  726.         MOV EDI,$f
  727.         MOV EAX,[EDI+0]  ;Handle of file
  728.         PUSH EAX
  729.         MOV AL,4
  730.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  731.         ADD ESP,16
  732.         MOV _DosError,EAX
  733.      END;
  734.      IF DosError=0 THEN
  735.      BEGIN
  736.           date:=s.fdateLastWrite;
  737.           time:=s.ftimelastwrite;
  738.           ASM
  739.              PUSHL $date
  740.              PUSHL $year
  741.              PUSHL $month
  742.              PUSHL $day
  743.              CALLN32 _UnPackDate
  744.  
  745.              PUSHL $time
  746.              PUSHL $hours
  747.              PUSHL $minutes
  748.              PUSHL $TwoSecs
  749.              CALLN32 _UnPackTime
  750.           END;
  751.      END
  752.      ELSE
  753.      BEGIN
  754.           day:=0;
  755.           month:=0;
  756.           year:=0;
  757.           Hours:=0;
  758.           Minutes:=0;
  759.           TwoSecs:=0;
  760.      END;
  761. END;
  762.  
  763.  
  764. PROCEDURE SetFTime(var F; year,month,day,Hours,Minutes,TwoSecs:Word);
  765. VAR s:_FILESTATUS3;
  766.     size:LONGWORD;
  767.     time,date:Word;
  768. label l;
  769. BEGIN
  770.      IF ((Month>12)or(Month=0)) THEN
  771.      BEGIN
  772. l:
  773.           DosError:=1;
  774.           exit;
  775.      END;
  776.      IF ((Day>32)or(day=0)) THEN goto l;
  777.      IF Hours>24 THEN goto l;
  778.      IF Minutes>60 THEN goto l;
  779.      IF TwoSecs>30 THEN goto l;
  780.      size:=sizeof(_FILESTATUS3);
  781.      ASM
  782.         PUSHL $size
  783.         LEA EAX,$s
  784.         PUSH EAX
  785.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  786.         MOV EDI,$f
  787.         MOV EAX,[EDI+0]  ;Handle of file
  788.         PUSH EAX
  789.         MOV AL,4
  790.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  791.         ADD ESP,16
  792.         MOV _DosError,EAX
  793.      END;
  794.      IF DosError=0 THEN
  795.      BEGIN
  796.           ASM
  797.              PUSHL $year
  798.              PUSHL $month
  799.              PUSHL $day
  800.              CALLN32 _PackDate
  801.              MOV $Date,AX
  802.  
  803.              PUSHL $Hours
  804.              PUSHL $Minutes
  805.              PUSHL $twosecs
  806.              CALLN32 _PackTime
  807.              MOV $Time,AX
  808.           END;
  809.           s.fdatelastwrite:=date;
  810.           s.ftimeLastWrite:=time;
  811.           ASM
  812.              PUSHL $size
  813.              LEA EAX,$s
  814.              PUSH EAX
  815.              PUSHL 1   ;File Information level 1 FIL_STANDARD
  816.              MOV EDI,$f
  817.              MOV EAX,[EDI+0]  ;Handle of file
  818.              PUSH EAX
  819.              MOV AL,4
  820.              CALLDLL DosCalls,218    ;DosSetFileInfo
  821.              ADD ESP,16
  822.              MOV _DosError,EAX
  823.           END;
  824.      END;
  825. END;
  826.  
  827. FUNCTION DiskFree(Drive: Byte): LongWord;
  828. VAR a:_FSALLOCATE;
  829.     s,d:LONGWORD;
  830.     sec:LONGWORD;
  831. BEGIN
  832.      s:=sizeof(_FSALLOCATE);
  833.      d:=Drive;
  834.      ASM
  835.         PUSHL $s
  836.         LEA EAX,$a
  837.         PUSH EAX
  838.         PUSHL 1    ;FSIL_ALLOC -->Query allocation status
  839.         PUSHL $d
  840.         MOV AL,4
  841.         CALLDLL DosCalls,278 ;DosQueryFSInfo
  842.         ADD ESP,16
  843.         MOV _DosError,EAX
  844.      END;
  845.      IF DosError=0 THEN
  846.      BEGIN
  847.           s:=a.cSectorUnit*a.cUnitAvail*a.cbSector;
  848.      END
  849.      ELSE s:=0;
  850.      DiskFree:=s;
  851. END;
  852.  
  853. FUNCTION DiskSize(Drive: Byte): LongWord;
  854. VAR a:_FSALLOCATE;
  855.     s,d:LONGWORD;
  856. BEGIN
  857.      s:=sizeof(_FSALLOCATE);
  858.      d:=Drive;
  859.      ASM
  860.         PUSHL $s
  861.         LEA EAX,$a
  862.         PUSH EAX
  863.         PUSHL 1    ;FSIL_ALLOC -->Query allocation status
  864.         PUSHL $d
  865.         MOV AL,4
  866.         CALLDLL DosCalls,278 ;DosQueryFSInfo
  867.         ADD ESP,16
  868.         MOV _DosError,EAX
  869.      END;
  870.      IF DosError=0 THEN
  871.      BEGIN
  872.           s:=a.cSectorUnit*a.cUnit*a.cbSector;
  873.      END
  874.      ELSE s:=0;
  875.      DiskSize:=s;
  876. END;
  877.  
  878. FUNCTION EnvStr(Env:String): PEnvString;
  879. VAR
  880.    e:POINTER;
  881. BEGIN
  882.      ASM
  883.         LEA EAX,$e
  884.         PUSH EAX
  885.         LEA EAX,$Env
  886.         INC EAX
  887.         PUSH EAX
  888.         MOV AL,2
  889.         CALLDLL DosCalls,227    ;DosScanEnv
  890.         ADD ESP,8
  891.         MOV ECX,0
  892.         MOV _DosError,EAX
  893.         CMP EAX,0
  894.         JNE !scloope             ;EnvVar not found
  895.         MOV ECX,$e
  896. !scloope:
  897.         MOV $e,ECX  ;Set string length
  898.      END;
  899.      EnvStr:=e;
  900. END;
  901.  
  902. PROCEDURE GetVerify(var Verify: Boolean);ASM;
  903. BEGIN
  904.      ASM
  905.         PUSH EBP
  906.         MOV EBP,ESP
  907.         SUB ESP,4   ;Return value
  908.         LEA EAX,[EBP-4]
  909.         PUSH EAX
  910.         MOV AL,1
  911.         CALLDLL DosCalls,225    ;DosQueryverify
  912.         ADD ESP,4
  913.         MOV AL,[EBP-4]
  914.         MOV EDI,$Verify
  915.         MOV [EDI+0],AL
  916.         LEAVE
  917.         RETN32
  918.      END;
  919. END;
  920.  
  921. PROCEDURE SetVerify(Verify: Boolean);ASM;
  922. BEGIN
  923.      ASM
  924.         PUSH EBP
  925.         MOV EBP,ESP
  926.         MOV AL,$verify
  927.         MOVZX EAX,AL
  928.         PUSH EAX
  929.         MOV AL,1
  930.         CALLDLL DosCalls,210   ;DosSetVerify
  931.         ADD ESP,4
  932.         LEAVE
  933.         RETN32
  934.      END;
  935. END;
  936.  
  937. FUNCTION DosVersion:Word;ASM;
  938. BEGIN
  939.      ASM
  940.         PUSH EBP
  941.         MOV EBP,ESP
  942.         SUB ESP,8               ;for result values
  943.         PUSHL 4                 ;size of buffer
  944.         LEA EAX,[EBP-8]
  945.         PUSH EAX                ;Buffer
  946.         PUSHL 11                ;last:QSV_VERSION_MAJOR
  947.         PUSHL 11                ;first:QSV_VERSION_MAJOR
  948.         MOV AL,4
  949.         CALLDLL DosCalls,348    ;DosQuerySysInfo
  950.         ADD ESP,16
  951.         PUSHL 4                 ;size of buffer
  952.         LEA EAX,[EBP-4]
  953.         PUSH EAX                ;Buffer
  954.         PUSHL 12                ;last:QSV_VERSION_MINOR
  955.         PUSHL 12                ;first:QSV_VERSION_MINOR
  956.         MOV AL,4
  957.         CALLDLL DosCalls,348    ;DosQuerySysInfo
  958.         ADD ESP,16
  959.         MOV AL,[EBP-8]          ;Major version number
  960.         MOV AH,[EBP-4]          ;Minor version number
  961.         LEAVE
  962.         RETN32
  963.      END;
  964. END;
  965.  
  966. PROCEDURE GetDate(var Year,Month,Day,DayOfWeek: Word);
  967. VAR d:_DateTime;
  968. BEGIN
  969.      ASM
  970.         LEA EAX,$d
  971.         PUSH EAX
  972.         MOV AL,1
  973.         CALLDLL DosCalls,230  ;DosGetDateTime
  974.         ADD ESP,4
  975.      END;
  976.      Year:=d.year;
  977.      Month:=d.month;
  978.      Day:=d.Day;
  979.      DayofWeek:=d.Weekday;
  980. END;
  981.  
  982. PROCEDURE SetDate(Year,Month,Day,DayOfWeek: Word);
  983. VAR d:_DateTime;
  984. BEGIN
  985.      ASM
  986.         LEA EAX,$d
  987.         PUSH EAX
  988.         MOV AL,1
  989.         CALLDLL DosCalls,230  ;DosGetDateTime
  990.         ADD ESP,4
  991.      END;
  992.      d.year:=Year;
  993.      d.month:=Month;
  994.      d.day:=day;
  995.      d.Weekday:=DayOfWeek;
  996.      ASM
  997.         LEA EAX,$d
  998.         PUSH EAX
  999.         MOV AL,1
  1000.         CALLDLL DosCalls,292 ;DosSetDateTime
  1001.         ADD ESP,4
  1002.      END;
  1003. END;
  1004.  
  1005. PROCEDURE GetTime(var Hour,Minute,Second,Sec100: Word);
  1006. VAR d:_DateTime;
  1007. BEGIN
  1008.      ASM
  1009.         LEA EAX,$d
  1010.         PUSH EAX
  1011.         MOV AL,1
  1012.         CALLDLL DosCalls,230  ;DosGetDateTime
  1013.         ADD ESP,4
  1014.      END;
  1015.      Hour:=d.hours;
  1016.      Minute:=d.minutes;
  1017.      Second:=d.Seconds;
  1018.      Sec100:=d.Hundredths;
  1019. END;
  1020.  
  1021. PROCEDURE SetTime(Hour,Minute,Second,Sec100: Word);ASM;
  1022. VAR d:_DateTime;
  1023. BEGIN
  1024.      ASM
  1025.         LEA EAX,$d
  1026.         PUSH EAX
  1027.         MOV AL,1
  1028.         CALLDLL DosCalls,230  ;DosGetDateTime
  1029.         ADD ESP,4
  1030.      END;
  1031.      d.Hours:=Hour;
  1032.      d.Minutes:=Minute;
  1033.      d.Seconds:=Second;
  1034.      d.Hundredths:=Sec100;
  1035.      ASM
  1036.         LEA EAX,$d
  1037.         PUSH EAX
  1038.         MOV AL,1
  1039.         CALLDLL DosCalls,292 ;DosSetDateTime
  1040.         ADD ESP,4
  1041.      END;
  1042. END;
  1043.  
  1044. FUNCTION CompareFileTimes(First,Second:STRING):BYTE;
  1045. VAR f1,f2:FILE;
  1046.     result:BYTE;
  1047.     year1,month1,day1,Hours1,Minutes1,TwoSecs1:WORD;
  1048.     year2,month2,day2,Hours2,Minutes2,TwoSecs2:WORD;
  1049. Label l;
  1050. BEGIN
  1051.      result:=F_ERROR;
  1052.      assign(f1,first);
  1053.      reset(f1,1);
  1054.      IF ioresult<>0 THEN goto l;
  1055.      GetFTime(f1,year1,month1,day1,Hours1,Minutes1,TwoSecs1);
  1056.      IF DosError<>0 THEN
  1057.      BEGIN
  1058.           Close(f1);
  1059.           goto l;
  1060.      END;
  1061.      Close(f1);
  1062.  
  1063.      assign(f2,second);
  1064.      reset(f2,1);
  1065.      IF ioresult<>0 THEN goto l;
  1066.      GetFTime(f2,year2,month2,day2,Hours2,Minutes2,TwoSecs2);
  1067.      IF DosError<>0 THEN
  1068.      BEGIN
  1069.           Close(f2);
  1070.           goto l;
  1071.      END;
  1072.      Close(f2);
  1073.  
  1074.      IF year1=year2 THEN
  1075.      BEGIN
  1076.           IF month1=month2 THEN
  1077.           BEGIN
  1078.                IF Day1=Day2 THEN
  1079.                BEGIN
  1080.                     IF Hours1=Hours2 THEN
  1081.                     BEGIN
  1082.                          IF Minutes1=Minutes2 THEN
  1083.                          BEGIN
  1084.                               IF TwoSecs1=TwoSecs2 THEN result:=F_EQUAL
  1085.                               ELSE
  1086.                               BEGIN
  1087.                                    IF TwoSecs1>TwoSecs2 THEN Result:=F_FIRST_GREATER
  1088.                                    ELSE Result:=F_SECOND_GREATER;
  1089.                               END;
  1090.                          END
  1091.                          ELSE
  1092.                          BEGIN
  1093.                               IF Minutes1>Minutes2 THEN Result:=F_FIRST_GREATER
  1094.                               ELSE Result:=F_SECOND_GREATER;
  1095.                          END;
  1096.                     END
  1097.                     ELSE
  1098.                     BEGIN
  1099.                          IF Hours1>Hours2 THEN Result:=F_FIRST_GREATER
  1100.                          ELSE Result:=F_SECOND_GREATER;
  1101.                     END;
  1102.                END
  1103.                ELSE
  1104.                BEGIN
  1105.                     IF day1>day2 THEN Result:=F_FIRST_GREATER
  1106.                     ELSE Result:=F_SECOND_GREATER;
  1107.                END;
  1108.           END
  1109.           ELSE
  1110.           BEGIN
  1111.                IF month1>month2 THEN Result:=F_FIRST_GREATER
  1112.                ELSE Result:=F_SECOND_GREATER;
  1113.           END;
  1114.      END
  1115.      ELSE
  1116.      BEGIN
  1117.           IF year1>year2 THEN Result:=F_FIRST_GREATER
  1118.           ELSE Result:=F_SECOND_GREATER;
  1119.      END;
  1120.  
  1121. l:
  1122.      CompareFileTimes:=Result;
  1123. END;
  1124.  
  1125. BEGIN
  1126. END.
  1127.