home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / DOSIO.ZIP / DOSIO.PAS
Encoding:
Pascal/Delphi Source File  |  1986-10-02  |  3.1 KB  |  91 lines

  1. { MSDOS 2.0 Functions Calls for Turbo Pascal
  2.  
  3.   These routines allow variable length block reads and writes from disk files
  4.   using MSDOS 2.0 system calls.  This is generally faster than using the Turbo
  5.   I/O routines.
  6.  
  7.   Michael H. Hughes, 1985  }
  8.  
  9.  
  10. { The following global type definitions are required in the program }
  11.  
  12. Type namestring = String[80];  { may be any convenient length }
  13.      registers = Record
  14.        AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAG: Integer;
  15.      End;
  16.  
  17.  
  18. { OPEN Accepts a physical file name and a read/write mode, and returns a file
  19.   handle for the specified file.  It returns a -1 if the file cannot be
  20.   opened.  The modes are:
  21.   0 - read only
  22.   1 - write only  ( Creates the file, or truncates it to zero length )
  23.   2 - read or write     }
  24.  
  25. Function open( Var filename: namestring; mode: Integer): Integer;
  26.   Var register: registers;
  27.   Begin
  28.     filename[ length(filename)+1 ] := chr(0);
  29.     register.DS := seg(filename);
  30.     register.DX := ofs(filename)+1;
  31.     register.CX := 0;
  32.     If mode = 1 Then register.AX := 15360  { Call Function 3C - Create }
  33.     Else register.AX := mode + 15616;      { Call Function 3D - Open }
  34.     MsDos(register);
  35.     If odd(register.FLAG) Then open := -1
  36.     Else open := register.AX
  37.   End;
  38.  
  39.  
  40. { GET reads a block of specified length from a file.  It requires a system
  41.   file handle (from OPEN), a buffer area, and a block length in bytes.
  42.   It returns the number of bytes read, or a negative value equal to the system
  43.   error value if an error occurs.  The return will be equal to the parameter
  44.   'len' unless the end-of-file was encountered during the read, in which case
  45.   the return value will be the actual number of characters read. }
  46.  
  47.   Function get( handle: Integer; Var buffer; len: Integer): Integer;
  48.   Var register: registers;
  49.   Begin
  50.     register.DS := seg(buffer);
  51.     register.DX := ofs(buffer);
  52.     register.CX := len;
  53.     register.BX := handle;
  54.     register.AX := 16128;  { Call function 3F }
  55.     MsDos(register);
  56.     if odd(register.FLAG) then get := -register.AX
  57.     Else get := register.AX;
  58.   End;
  59.  
  60.  
  61. { PUT writes a block of specified length to a file.  Parameters and returns
  62.   are the same as for GET.  This can go to the screen or printer by using
  63.   the standard file numbers (handles). }
  64.  
  65.   Function put( handle: Integer; Var buffer; len: Integer): Integer;
  66.   Var register: registers;
  67.   Begin
  68.     register.DS := seg(buffer);
  69.     register.DX := ofs(buffer);
  70.     register.CX := len;
  71.     register.BX := handle;
  72.     register.AX := 16384;  { Call function 4F }
  73.     MsDos(register);
  74.     if odd(register.FLAG) then put := -register.AX
  75.     Else put := register.AX;
  76.   End;
  77.  
  78.  
  79. {  CLOSE closes a file specified by a system file handle.  It returns a
  80.    zero if the file handle was invalid, otherwise a +1.  }
  81.  
  82.   Function close( handle: Integer ): Integer;
  83.   Var register: registers;
  84.   Begin
  85.     register.BX := handle;
  86.     register.AX := 15872; { call function 3E }
  87.     MsDos(register);
  88.     If register.AX = 6 Then close := 0
  89.     Else close := 1
  90.   End;
  91.