home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / spdos2.zip / LIBSRC / PMDOS.PAS < prev    next >
Pascal/Delphi Source File  |  1994-05-12  |  22KB  |  880 lines

  1. UNIT PMDos;
  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.   VolumeID  = 8;
  40.   Directory = 16;
  41.   Archive   = 32;
  42.   AnyFile   = 63;
  43.  
  44. type
  45.       CmdStr  = string;        { Command line string }
  46.       PathStr = string[79];    { File pathname string }
  47.       DirStr  = string[128];   { Drive and directory string }
  48.       NameStr = string[8];     { File name string }
  49.       ExtStr  = string[4];     { File extension string }
  50.  
  51.  
  52.       Registers =
  53.          record
  54.            case of
  55.              0: (EAX,EBX,ECX,EDX,EBP,ESI,EDI,DS_ES,EFlags:LongWord);
  56.              1: (AX,X_AX,BX,X_BX,CX,X_CX,DX,X_DX,BP,X_BP,SI,X_SI,
  57.                  DI,X_DI,DS,ES,Flags,X_FLAGS: Word);
  58.              2: (AL,AH,X_AL,X_AH,BL,BH,X_BL,X_BH,CL,CH,X_CL,X_CH,
  59.                  DL,DH,X_DL,X_DH: Byte);
  60.            end;
  61.  
  62.  
  63.       FileRec = record
  64.                       Handle   : LongWord;
  65.                       RecSize  : LongWord;
  66.                       Name     : array[0..79] of Char;
  67.                       Private1 : POINTER;  {extended attributes}
  68.                       Mode     : LONGWORD; {Current file mode}
  69.                       Reserved : POINTER;  {for further extensions}
  70.                 end;
  71.  
  72.  
  73.       TextRec = record
  74.                       Handle    : LongWord;
  75.                       RecSize  : LongWord; {not used yet}
  76.                       Name      : array[0..79] of Char;
  77.                       Private1 : POINTER;  {extended attributes}
  78.                       Mode     : LONGWORD; {Current file mode}
  79.                       Reserved : POINTER;  {for further extensions}
  80.                 end;
  81.  
  82. { Search record used by FindFirst and FindNext }
  83.  
  84.   TSearchRec = record
  85.                      oNextEntryOffset:LONGWORD;
  86.                      fdateCreation:WORD;
  87.                      ftimeCreation:WORD;
  88.                      fdateLastAccess:WORD;
  89.                      ftimeLastAccess:WORD;
  90.                      fdateLastWrite:WORD;
  91.                      ftimeLastWrite:WORD;
  92.                      cbFile:LONGWORD;
  93.                      cbFileAlloc:LONGWORD;
  94.                      attrFile:LONGWORD;
  95.                      cchName:BYTE;
  96.                      achName:ARRAY[0..255] OF BYTE;
  97.                      {private}
  98.                      HDir:LONGINT;
  99.                end;
  100.  
  101.   _PDATETIME=^_DATETIME;
  102.   _DATETIME=RECORD
  103.                   hours:BYTE;
  104.                   minutes:BYTE;
  105.                   seconds:BYTE;
  106.                   hundredths:BYTE;
  107.                   day:BYTE;
  108.                   month:BYTE;
  109.                   year:WORD;
  110.                   timezone:INTEGER;
  111.                   weekday:BYTE;
  112.            END;
  113.  
  114.   _PFSALLOCATE=^_FSALLOCATE;
  115.   _FSALLOCATE=RECORD
  116.                     idFileSystem:LONGWORD;
  117.                     cSectorUnit:LONGWORD;
  118.                     cUnit:LONGWORD;
  119.                     cUnitAvail:LONGWORD;
  120.                     cbSector:WORD;
  121.                END;
  122.  
  123.   _PFILESTATUS3=^_FILESTATUS3;
  124.   _FILESTATUS3=RECORD
  125.                     fdateCreation:WORD;
  126.                     ftimeCreation:WORD;
  127.                     fdateLastAccess:WORD;
  128.                     ftimeLastAccess:WORD;
  129.                     fdateLastWrite:WORD;
  130.                     ftimeLastWrite:WORD;
  131.                     cbFile:LONGWORD;
  132.                     cbFileAlloc:LONGWORD;
  133.                     attrFile:LONGWORD;
  134.                 END;
  135.  
  136.   {Type for GetEnvStr}
  137.   PEnvString=^TEnvString;
  138.   TEnvString=array[0..65500] of Char; {terminated with 0-character}
  139.  
  140.   ExecResultCode=record
  141.                      codeTerminate:LONGWORD;
  142.                      codeResult:LONGWORD;
  143.                  end;
  144.  
  145. VAR DosError:LongWord;   {DOS unit error status}
  146.  
  147. FUNCTION  DosVersion:Word;
  148. PROCEDURE GetDate(var Year,Month,Day,DayOfWeek: Word);
  149. PROCEDURE SetDate(Year,Month,Day,DayOfWeek: Word);
  150. PROCEDURE GetTime(var Hour,Minute,Second,Sec100: Word);
  151. PROCEDURE SetTime(Hour,Minute,Second,Sec100: Word);
  152. PROCEDURE GetVerify(var Verify: Boolean);
  153. PROCEDURE SetVerify(Verify: Boolean);
  154. FUNCTION  EnvStr(Env:String): PEnvString;
  155. FUNCTION  DiskFree(Drive: Byte): LongWord;
  156. FUNCTION  DiskSize(Drive: Byte): LongWord;
  157. PROCEDURE GetFAttr(var F; var Attr: LongWord);
  158. PROCEDURE SetFAttr(var F; Attr: LongWord);
  159. PROCEDURE GetFTime(var F; var year,month,day,hours,minutes,twosecs:Word);
  160. PROCEDURE SetFTime(var F; year,month,day,hours,minutes,twosecs:Word);
  161. PROCEDURE Exec(Path: PathStr; CmdLine: CmdStr;VAR ExecPID:LONGWORD);
  162. PROCEDURE FindFirst(Path: PathStr; Attr: LongWord; var F: TSearchRec);
  163. PROCEDURE FindNext(var F: TSearchRec);
  164. FUNCTION  PackTime(hour,minute,twosec:Word):Word;
  165. FUNCTION  PackDate(year,month,day:Word):Word;
  166. PROCEDURE UnPackTime(pack:Word;var hour,minute,twosec:Word);
  167. PROCEDURE UnPackDate(pack:Word;var year,month,day:Word);
  168. FUNCTION FSearch(Path: PathStr; DirList: String): PathStr;
  169. {FUNCTION FExpand(Path: PathStr): PathStr;}
  170. PROCEDURE FSplit(Path: PathStr; var Dir: DirStr;
  171.                  var Name: NameStr; var Ext: ExtStr);
  172.  
  173.  
  174. IMPLEMENTATION
  175.  
  176. PROCEDURE FSplit(Path: PathStr; var Dir: DirStr;
  177.                  var Name: NameStr; var Ext: ExtStr);
  178. BEGIN
  179.      ASM
  180.         LEA ESI,$Path
  181.         MOV AL,[ESI+0]
  182.         INC ESI
  183.         XOR EDX,EDX
  184.         XOR EBX,EBX
  185.         MOV DL,AL
  186.         XOR DH,DH
  187.         MOV BX,DX
  188.         PUSH ESI
  189.         POP  EDI
  190.         ADD  EDI,EBX
  191.         DEC  EDI
  192.         OR   EBX,EBX  ;String length 0 ?
  193.         JE   !L_2
  194. !L_1:
  195.         CMPB [EDI+0],'\'
  196.         JE   !L_2
  197.         CMPB [EDI+0],':'
  198.         JE   !L_2
  199.         DEC  EDI
  200.         DEC  EBX
  201.         JNE  !L_1   ;until string begin
  202. !L_2:
  203.         MOV  EAX,67
  204.         MOV EDI,$Dir
  205.         CALLN32 System.!CopyString
  206.  
  207.         XOR EBX,EBX
  208.         PUSH ESI
  209.         POP EDI
  210.         JMP !L_4
  211. !L_3:
  212.         CMPB [EDI+0],46
  213.         JE !L_5
  214.         INC EBX
  215.         INC EDI
  216. !L_4:
  217.         CMP EBX,EDX
  218.         JNE !L_3
  219. !L_5:
  220.         MOV EAX,8
  221.         MOV EDI,$Name
  222.         CALLN32 System.!CopyString
  223.  
  224.         MOV EAX,4
  225.         PUSH EDX
  226.         POP EBX
  227.         MOV EDI,$Ext
  228.         CALLN32 System.!CopyString
  229.     END;
  230. END;
  231.  
  232. FUNCTION FSearch(Path: PathStr; DirList: String): PathStr;
  233. var r:PATHSTR;
  234. BEGIN
  235.      ASM
  236.         PUSHL 79  ;result buf len
  237.         LEA EAX,$r
  238.         INC EAX
  239.         PUSH EAX
  240.         LEA EAX,$Path
  241.         INC EAX
  242.         PUSh EAX
  243.         LEA EAX,$DirList
  244.         INC EAX
  245.         PUSH EAX
  246.         PUSHL 0   ;Flags
  247.         MOV AL,5
  248.         CALLDLL DosCalls,228    ;DosSearchPath
  249.         ADD ESP,20
  250.         MOV _DosError,EAX
  251.     END;
  252.     IF DosError=0 THEN
  253.     BEGIN
  254.          ASM
  255.             LEA ESI,$r
  256.             INC ESI
  257.             MOV CL,255
  258.             CLD
  259. !nef:
  260.             INC CL
  261.             LODSB
  262.             CMP AL,0
  263.             JNE !nef
  264.  
  265.             LEA EDI,$r
  266.             MOV [EDI+0],CL  ;Set string len
  267.         END;
  268.     END
  269.     ELSE r:='';
  270.     FSearch:=r;
  271. END;
  272.  
  273. FUNCTION PackTime(hour,minute,twosec:Word):Word;
  274. VAR time:Word;
  275. BEGIN
  276.      ASM
  277.         MOV BL,$Hour
  278.         SHL BL,3    ;multiply with 8
  279.         MOV AL,$minute
  280.         SHR AL,3    ;divide by 8
  281.         ADD AL,BL
  282.         SHL AX,8    ;Shift
  283.         MOV $time,AX
  284.  
  285.         MOV BL,$minute
  286.         AND BL,7
  287.         SHL BL,5    ;multiply with 2 and shift
  288.         ADD BL,$TwoSec
  289.         MOV $time,BL
  290.      END;
  291.      PackTime:=Time;
  292. END;
  293.  
  294. FUNCTION Packdate(year,month,day:Word):Word;
  295. VAR Date:Word;
  296. BEGIN
  297.      ASM
  298.         MOV AL,$month
  299.         MOV BL,0
  300.         CMP AL,7
  301.         JNA !mo1
  302.         MOV BL,1
  303.         SUB AL,8
  304. !mo1:
  305.         MOV CX,$year
  306.         SUB CX,1980
  307.         SHL CX,1    ;multiply with 2
  308.         MOVZX BX,BL
  309.         ADD CX,BX
  310.         SHL CX,8    ;Shift
  311.         MOV $Date,CX
  312.  
  313.         SHL AL,5    ;multiply month with 2 and shift
  314.         ADD AL,$Day
  315.         MOV $Date,AL
  316.      END;
  317.      PackDate:=Date;
  318. END;
  319.  
  320. PROCEDURE UnPackTime(pack:Word;var hour,minute,twosec:Word);
  321. VAR h,min,sec:WORD;
  322. BEGIN
  323.     ASM
  324.        MOV DX,$pack
  325.  
  326.        MOV AL,DH    ;Hour/Minute
  327.        AND AL,248   ;Mask Hour
  328.        SHR AL,3     ;divide by 8
  329.        MOVZX AX,AL
  330.        MOV $h,AX
  331.  
  332.        MOV AL,DH    ;Hour/Minute
  333.        AND AL,7     ;Mask Minute
  334.        SHL AL,3     ;multiply with 8
  335.        MOV BL,AL
  336.  
  337.        MOV AL,DL    ;Minute/sec
  338.        AND AL,224   ;Mask minute
  339.        SHR AL,5     ;divide by 2 and shift
  340.        ADD AL,BL
  341.        MOVZX AX,AL
  342.        MOV $min,AX
  343.  
  344.        MOV AL,DL    ;Minute/sec
  345.        AND AL,31    ;Mask twoseconds
  346.        MOVZX AX,AL
  347.        MOV $sec,AX
  348.      END;
  349.      Hour:=h;
  350.      minute:=min;
  351.      twosec:=sec;
  352. END;
  353.  
  354. PROCEDURE UnPackDate(pack:Word;var year,month,day:Word);
  355. VAR y,m,d:Word;
  356. BEGIN
  357.      ASM
  358.         MOV DX,$pack
  359.  
  360.         MOV AL,DH    ;Year/Month
  361.         AND AL,254   ;Clear Bit 1
  362.         SHR AL,1     ;Divide by 2
  363.         MOVZX AX,AL
  364.         ADD AX,1980
  365.         MOV $y,AX    ;Year
  366.         MOV BL,0
  367.         MOV AL,DH    ;Year/Month
  368.         AND AL,1     ;Mask HSB month
  369.         CMP AL,1
  370.         JNE !ml7
  371.         MOV BL,8
  372. !ml7:
  373.         MOV AL,DL    ;month/Day
  374.         AND AL,224   ;mask month (upper 3 bits)
  375.         SHR AL,5     ;divide by 2 and shift
  376.         ADD AL,BL
  377.         MOVZX AX,AL
  378.         MOV $m,AX    ;Month
  379.  
  380.         MOV AL,DL    ;Month/day
  381.         AND AL,31    ;Mask day
  382.         MOVZX AX,AL
  383.         MOV $d,AX    ;day
  384.      END;
  385.      year:=y;
  386.      month:=m;
  387.      day:=d;
  388. END;
  389.  
  390. PROCEDURE FindFirst(Path: PathStr; Attr: LongWord; var F: TSearchRec);
  391. VAR hDir:LONGINT;
  392.     count,size:LONGWORD;
  393. BEGIN
  394.      hDir:=-1;  {HDIR_CREATE}
  395.      count:=1;
  396.      size:=sizeof(TSearchRec);
  397.      ASM
  398.         PUSHL 1  ;FIL_STANDARD
  399.         LEA EAX,$count
  400.         PUSH EAX
  401.         PUSHL $size
  402.         PUSHL $f
  403.         PUSHL $Attr
  404.         LEA EAX,$hDir
  405.         PUSH EAX
  406.         LEA EAX,$Path
  407.         INC EAX
  408.         PUSH EAX
  409.         MOV AL,7
  410.         CALLDLL DosCalls,264   ;DosFindFirst
  411.         ADD ESP,28
  412.         MOV _DosError,EAX
  413.      END;
  414.      f.HDir:=HDir;
  415.      IF ((DosError<>0)or(Count=0)) THEN
  416.      BEGIN
  417.           ASM
  418.              PUSHL $HDir
  419.              MOV AL,1
  420.              CALLDLL DosCalls,263  ;DosFindClose
  421.              ADD ESP,4
  422.           END;
  423.      END;
  424. END;
  425.  
  426. PROCEDURE FindNext(var F: TSearchRec);
  427. VAR HDir:LONGINT;
  428.     Count,size:LONGWORD;
  429. BEGIN
  430.      Count:=1;
  431.      size:=sizeof(TSearchRec);
  432.      HDir:=f.HDir;
  433.      ASM
  434.         LEA EAX,$Count
  435.         PUSH EAX
  436.         PUSHL $size
  437.         PUSHL $F
  438.         PUSHL $HDir
  439.         MOV AL,4
  440.         CALLDLL DosCalls,265     ;DosFindNext
  441.         ADD ESP,16
  442.         MOV _DosError,EAX
  443.      END;
  444.      IF ((DosError<>0)or(Count=0)) THEN
  445.      BEGIN
  446.           ASM
  447.              PUSHL $HDir
  448.              MOV AL,1
  449.              CALLDLL DosCalls,263  ;DosFindClose
  450.              ADD ESP,4
  451.           END;
  452.      END;
  453. END;
  454.  
  455. PROCEDURE Exec(Path: PathStr; CmdLine: CmdStr;VAR ExecPID:LONGWORD);
  456. VAR rc:ExecResultCode;
  457.     error:string[128];
  458. BEGIN
  459.      ASM
  460.         LEA EAX,$Path
  461.         INC EAX
  462.         PUSH EAX
  463.         LEA EAX,$rc
  464.         PUSH EAX
  465.         PUSHL 0
  466.         LEA EAX,$CmdLine
  467.         INC EAX
  468.         ;PUSH EAX
  469.         PUSHL 0
  470.         PUSHL 1     ;EXEC_ASYNC
  471.         PUSHL 127
  472.         LEA EAX,$error
  473.         INC EAX
  474.         PUSH EAX
  475.         MOV AL,7
  476.         CALLDLL DosCalls,283    ;DosExecPgm
  477.         ADD ESP,28
  478.      END;
  479.      ExecPID:=rc.codeTerminate;
  480.      Doserror:=rc.CodeResult;
  481. END;
  482.  
  483.  
  484. PROCEDURE GetFAttr(var F; var Attr: LongWord);
  485. VAR s:_FILESTATUS3;
  486.     size:LONGWORD;
  487. BEGIN
  488.      size:=sizeof(_FILESTATUS3);
  489.      ASM
  490.         PUSHL $size
  491.         LEA EAX,$s
  492.         PUSH EAX
  493.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  494.         MOV EDI,$f
  495.         MOV EAX,[EDI+0]  ;Handle of file
  496.         PUSH EAX
  497.         MOV AL,4
  498.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  499.         ADD ESP,16
  500.         MOV _DosError,EAX
  501.      END;
  502.      IF DosError=0 THEN
  503.      BEGIN
  504.           Attr:=s.attrFile;
  505.      END
  506.      ELSE Attr:=0; {invalid}
  507.  
  508. END;
  509.  
  510. PROCEDURE SetFAttr(var F; Attr: LongWord);
  511. VAR s:_FILESTATUS3;
  512.     size:LONGWORD;
  513. BEGIN
  514.      size:=sizeof(_FILESTATUS3);
  515.      ASM
  516.         PUSHL $size
  517.         LEA EAX,$s
  518.         PUSH EAX
  519.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  520.         MOV EDI,$f
  521.         MOV EAX,[EDI+0]  ;Handle of file
  522.         PUSH EAX
  523.         MOV AL,4
  524.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  525.         ADD ESP,16
  526.         MOV _DosError,EAX
  527.      END;
  528.      IF DosError=0 THEN
  529.      BEGIN
  530.           s.attrFile:=Attr;
  531.           ASM
  532.              PUSHL $size
  533.              LEA EAX,$s
  534.              PUSH EAX
  535.              PUSHL 1   ;File Information level 1 FIL_STANDARD
  536.              MOV EDI,$f
  537.              MOV EAX,[EDI+0]  ;Handle of file
  538.              PUSH EAX
  539.              MOV AL,4
  540.              CALLDLL DosCalls,218    ;DosSetFileInfo
  541.              ADD ESP,16
  542.              MOV _DosError,EAX
  543.           END;
  544.      END;
  545. END;
  546.  
  547.  
  548. PROCEDURE GetFTime(var F; var year,month,day,Hours,Minutes,TwoSecs:WORD);
  549. VAR s:_FILESTATUS3;
  550.     size:LONGWORD;
  551.     y,m,d,h,min,sec:Word;
  552.     date,time:WORD;
  553. BEGIN
  554.      size:=sizeof(_FILESTATUS3);
  555.      ASM
  556.         PUSHL $size
  557.         LEA EAX,$s
  558.         PUSH EAX
  559.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  560.         MOV EDI,$f
  561.         MOV EAX,[EDI+0]  ;Handle of file
  562.         PUSH EAX
  563.         MOV AL,4
  564.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  565.         ADD ESP,16
  566.         MOV _DosError,EAX
  567.      END;
  568.      IF DosError=0 THEN
  569.      BEGIN
  570.           date:=s.fdateLastWrite;
  571.           time:=s.ftimelastwrite;
  572.           ASM
  573.              PUSHL $date
  574.              PUSHL $year
  575.              PUSHL $month
  576.              PUSHL $day
  577.              CALLN32 _UnPackDate
  578.  
  579.              PUSHL $time
  580.              PUSHL $hours
  581.              PUSHL $minutes
  582.              PUSHL $TwoSecs
  583.              CALLN32 _UnPackTime
  584.           END;
  585.      END
  586.      ELSE
  587.      BEGIN
  588.           day:=0;
  589.           month:=0;
  590.           year:=0;
  591.           Hours:=0;
  592.           Minutes:=0;
  593.           TwoSecs:=0;
  594.      END;
  595. END;
  596.  
  597.  
  598. PROCEDURE SetFTime(var F; year,month,day,Hours,Minutes,TwoSecs:Word);
  599. VAR s:_FILESTATUS3;
  600.     size:LONGWORD;
  601.     time,date:Word;
  602. label l;
  603. BEGIN
  604.      IF ((Month>12)or(Month=0)) THEN
  605.      BEGIN
  606. l:
  607.           DosError:=1;
  608.           exit;
  609.      END;
  610.      IF ((Day>32)or(day=0)) THEN goto l;
  611.      IF Hours>24 THEN goto l;
  612.      IF Minutes>60 THEN goto l;
  613.      IF TwoSecs>30 THEN goto l;
  614.      size:=sizeof(_FILESTATUS3);
  615.      ASM
  616.         PUSHL $size
  617.         LEA EAX,$s
  618.         PUSH EAX
  619.         PUSHL 1   ;File Information level 1 FIL_STANDARD
  620.         MOV EDI,$f
  621.         MOV EAX,[EDI+0]  ;Handle of file
  622.         PUSH EAX
  623.         MOV AL,4
  624.         CALLDLL DosCalls,279    ;DosQueryFileInfo
  625.         ADD ESP,16
  626.         MOV _DosError,EAX
  627.      END;
  628.      IF DosError=0 THEN
  629.      BEGIN
  630.           ASM
  631.              PUSHL $year
  632.              PUSHL $month
  633.              PUSHL $day
  634.              CALLN32 _PackDate
  635.              MOV $Date,AX
  636.  
  637.              PUSHL $Hours
  638.              PUSHL $Minutes
  639.              PUSHL $twosecs
  640.              CALLN32 _PackTime
  641.              MOV $Time,AX
  642.           END;
  643.           s.fdatelastwrite:=date;
  644.           s.ftimeLastWrite:=time;
  645.           ASM
  646.              PUSHL $size
  647.              LEA EAX,$s
  648.              PUSH EAX
  649.              PUSHL 1   ;File Information level 1 FIL_STANDARD
  650.              MOV EDI,$f
  651.              MOV EAX,[EDI+0]  ;Handle of file
  652.              PUSH EAX
  653.              MOV AL,4
  654.              CALLDLL DosCalls,218    ;DosSetFileInfo
  655.              ADD ESP,16
  656.              MOV _DosError,EAX
  657.           END;
  658.      END;
  659. END;
  660.  
  661. FUNCTION DiskFree(Drive: Byte): LongWord;
  662. VAR a:_FSALLOCATE;
  663.     s,d:LONGWORD;
  664.     sec:LONGWORD;
  665. BEGIN
  666.      s:=sizeof(_FSALLOCATE);
  667.      d:=Drive;
  668.      ASM
  669.         PUSHL $s
  670.         LEA EAX,$a
  671.         PUSH EAX
  672.         PUSHL 1    ;FSIL_ALLOC -->Query allocation status
  673.         PUSHL $d
  674.         MOV AL,4
  675.         CALLDLL DosCalls,278 ;DosQueryFSInfo
  676.         ADD ESP,16
  677.         MOV _DosError,EAX
  678.      END;
  679.      IF DosError=0 THEN
  680.      BEGIN
  681.           s:=a.cSectorUnit*a.cUnitAvail*a.cbSector;
  682.      END
  683.      ELSE s:=0;
  684.      DiskFree:=s;
  685. END;
  686.  
  687. FUNCTION DiskSize(Drive: Byte): LongWord;
  688. VAR a:_FSALLOCATE;
  689.     s,d:LONGWORD;
  690. BEGIN
  691.      s:=sizeof(_FSALLOCATE);
  692.      d:=Drive;
  693.      ASM
  694.         PUSHL $s
  695.         LEA EAX,$a
  696.         PUSH EAX
  697.         PUSHL 1    ;FSIL_ALLOC -->Query allocation status
  698.         PUSHL $d
  699.         MOV AL,4
  700.         CALLDLL DosCalls,278 ;DosQueryFSInfo
  701.         ADD ESP,16
  702.         MOV _DosError,EAX
  703.      END;
  704.      IF DosError=0 THEN
  705.      BEGIN
  706.           s:=a.cSectorUnit*a.cUnit*a.cbSector;
  707.      END
  708.      ELSE s:=0;
  709.      DiskSize:=s;
  710. END;
  711.  
  712. FUNCTION EnvStr(Env:String): PEnvString;
  713. VAR
  714.    e:POINTER;
  715. BEGIN
  716.      ASM
  717.         LEA EAX,$e
  718.         PUSH EAX
  719.         LEA EAX,$Env
  720.         INC EAX
  721.         PUSH EAX
  722.         MOV AL,2
  723.         CALLDLL DosCalls,227    ;DosScanEnv
  724.         ADD ESP,8
  725.         MOV ECX,0
  726.         MOV _DosError,EAX
  727.         CMP EAX,0
  728.         JNE !scloope             ;EnvVar not found
  729.         MOV ECX,$e
  730. !scloope:
  731.         MOV $e,ECX  ;Set string length
  732.      END;
  733.      EnvStr:=e;
  734. END;
  735.  
  736. PROCEDURE GetVerify(var Verify: Boolean);ASM;
  737. BEGIN
  738.      ASM
  739.         PUSH EBP
  740.         MOV EBP,ESP
  741.         SUB ESP,4   ;Return value
  742.         LEA EAX,[EBP-4]
  743.         PUSH EAX
  744.         MOV AL,1
  745.         CALLDLL DosCalls,225    ;DosQueryverify
  746.         ADD ESP,4
  747.         MOV AL,[EBP-4]
  748.         MOV EDI,$Verify
  749.         MOV [EDI+0],AL
  750.         LEAVE
  751.         RETN32
  752.      END;
  753. END;
  754.  
  755. PROCEDURE SetVerify(Verify: Boolean);ASM;
  756. BEGIN
  757.      ASM
  758.         PUSH EBP
  759.         MOV EBP,ESP
  760.         MOV AL,$verify
  761.         MOVZX EAX,AL
  762.         PUSH EAX
  763.         MOV AL,1
  764.         CALLDLL DosCalls,210   ;DosSetVerify
  765.         ADD ESP,4
  766.         LEAVE
  767.         RETN32
  768.      END;
  769. END;
  770.  
  771. FUNCTION DosVersion:Word;ASM;
  772. BEGIN
  773.      ASM
  774.         PUSH EBP
  775.         MOV EBP,ESP
  776.         SUB ESP,8               ;for result values
  777.         PUSHL 4                 ;size of buffer
  778.         LEA EAX,[EBP-8]
  779.         PUSH EAX                ;Buffer
  780.         PUSHL 11                ;last:QSV_VERSION_MAJOR
  781.         PUSHL 11                ;first:QSV_VERSION_MAJOR
  782.         MOV AL,4
  783.         CALLDLL DosCalls,348    ;DosQuerySysInfo
  784.         ADD ESP,16
  785.         PUSHL 4                 ;size of buffer
  786.         LEA EAX,[EBP-4]
  787.         PUSH EAX                ;Buffer
  788.         PUSHL 12                ;last:QSV_VERSION_MINOR
  789.         PUSHL 12                ;first:QSV_VERSION_MINOR
  790.         MOV AL,4
  791.         CALLDLL DosCalls,348    ;DosQuerySysInfo
  792.         ADD ESP,16
  793.         MOV AL,[EBP-8]          ;Major version number
  794.         MOV AH,[EBP-4]          ;Minor version number
  795.         LEAVE
  796.         RETN32
  797.      END;
  798. END;
  799.  
  800. PROCEDURE GetDate(var Year,Month,Day,DayOfWeek: Word);
  801. VAR d:_DateTime;
  802. BEGIN
  803.      ASM
  804.         LEA EAX,$d
  805.         PUSH EAX
  806.         MOV AL,1
  807.         CALLDLL DosCalls,230  ;DosGetDateTime
  808.         ADD ESP,4
  809.      END;
  810.      Year:=d.year;
  811.      Month:=d.month;
  812.      Day:=d.Day;
  813.      DayofWeek:=d.Weekday;
  814. END;
  815.  
  816. PROCEDURE SetDate(Year,Month,Day,DayOfWeek: Word);
  817. VAR d:_DateTime;
  818. BEGIN
  819.      ASM
  820.         LEA EAX,$d
  821.         PUSH EAX
  822.         MOV AL,1
  823.         CALLDLL DosCalls,230  ;DosGetDateTime
  824.         ADD ESP,4
  825.      END;
  826.      d.year:=Year;
  827.      d.month:=Month;
  828.      d.day:=day;
  829.      d.Weekday:=DayOfWeek;
  830.      ASM
  831.         LEA EAX,$d
  832.         PUSH EAX
  833.         MOV AL,1
  834.         CALLDLL DosCalls,292 ;DosSetDateTime
  835.         ADD ESP,4
  836.      END;
  837. END;
  838.  
  839. PROCEDURE GetTime(var Hour,Minute,Second,Sec100: Word);
  840. VAR d:_DateTime;
  841. BEGIN
  842.      ASM
  843.         LEA EAX,$d
  844.         PUSH EAX
  845.         MOV AL,1
  846.         CALLDLL DosCalls,230  ;DosGetDateTime
  847.         ADD ESP,4
  848.      END;
  849.      Hour:=d.hours;
  850.      Minute:=d.minutes;
  851.      Second:=d.Seconds;
  852.      Sec100:=d.Hundredths;
  853. END;
  854.  
  855. PROCEDURE SetTime(Hour,Minute,Second,Sec100: Word);ASM;
  856. VAR d:_DateTime;
  857. BEGIN
  858.      ASM
  859.         LEA EAX,$d
  860.         PUSH EAX
  861.         MOV AL,1
  862.         CALLDLL DosCalls,230  ;DosGetDateTime
  863.         ADD ESP,4
  864.      END;
  865.      d.Hours:=Hour;
  866.      d.Minutes:=Minute;
  867.      d.Seconds:=Second;
  868.      d.Hundredths:=Sec100;
  869.      ASM
  870.         LEA EAX,$d
  871.         PUSH EAX
  872.         MOV AL,1
  873.         CALLDLL DosCalls,292 ;DosSetDateTime
  874.         ADD ESP,4
  875.      END;
  876. END;
  877.  
  878. BEGIN
  879. END.