home *** CD-ROM | disk | FTP | other *** search
- { MSDOS 2.0 Functions Calls for Turbo Pascal
-
- These routines allow variable length block reads and writes from disk files
- using MSDOS 2.0 system calls. This is generally faster than using the Turbo
- I/O routines.
-
- Michael H. Hughes, 1985 }
-
-
- { The following global type definitions are required in the program }
-
- Type namestring = String[80]; { may be any convenient length }
- registers = Record
- AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAG: Integer;
- End;
-
-
- { OPEN Accepts a physical file name and a read/write mode, and returns a file
- handle for the specified file. It returns a -1 if the file cannot be
- opened. The modes are:
- 0 - read only
- 1 - write only ( Creates the file, or truncates it to zero length )
- 2 - read or write }
-
- Function open( Var filename: namestring; mode: Integer): Integer;
- Var register: registers;
- Begin
- filename[ length(filename)+1 ] := chr(0);
- register.DS := seg(filename);
- register.DX := ofs(filename)+1;
- register.CX := 0;
- If mode = 1 Then register.AX := 15360 { Call Function 3C - Create }
- Else register.AX := mode + 15616; { Call Function 3D - Open }
- MsDos(register);
- If odd(register.FLAG) Then open := -1
- Else open := register.AX
- End;
-
-
- { GET reads a block of specified length from a file. It requires a system
- file handle (from OPEN), a buffer area, and a block length in bytes.
- It returns the number of bytes read, or a negative value equal to the system
- error value if an error occurs. The return will be equal to the parameter
- 'len' unless the end-of-file was encountered during the read, in which case
- the return value will be the actual number of characters read. }
-
- Function get( handle: Integer; Var buffer; len: Integer): Integer;
- Var register: registers;
- Begin
- register.DS := seg(buffer);
- register.DX := ofs(buffer);
- register.CX := len;
- register.BX := handle;
- register.AX := 16128; { Call function 3F }
- MsDos(register);
- if odd(register.FLAG) then get := -register.AX
- Else get := register.AX;
- End;
-
-
- { PUT writes a block of specified length to a file. Parameters and returns
- are the same as for GET. This can go to the screen or printer by using
- the standard file numbers (handles). }
-
- Function put( handle: Integer; Var buffer; len: Integer): Integer;
- Var register: registers;
- Begin
- register.DS := seg(buffer);
- register.DX := ofs(buffer);
- register.CX := len;
- register.BX := handle;
- register.AX := 16384; { Call function 4F }
- MsDos(register);
- if odd(register.FLAG) then put := -register.AX
- Else put := register.AX;
- End;
-
-
- { CLOSE closes a file specified by a system file handle. It returns a
- zero if the file handle was invalid, otherwise a +1. }
-
- Function close( handle: Integer ): Integer;
- Var register: registers;
- Begin
- register.BX := handle;
- register.AX := 15872; { call function 3E }
- MsDos(register);
- If register.AX = 6 Then close := 0
- Else close := 1
- End;