Contributor: VIKTOR OSTASHEV
{$x+}
unit dosfile;
interface
var
 ferror : word;
{
DOS error
}
function fopen(name : string; mode : char) : word;
{
name - filename (with path), mode - r - read, w - write, + - r/w,
a - append.
return: handle or $ffff if error
If file opened for write or append and don't exist, then create it
If file opened for write, truncated it to pos 0
}
function fclose(handle : word) : boolean;
{
Close file. If error then return FALSE
}
function fseek(handle : word; offset : longint; mode : byte) : boolean;
{
Seek file pointer to offset bytes
mode 0 - from begin 1 - from current 2 - from end
}
function fread(handle, count : word; dest : pointer) : boolean;
{
Read count bytes to dest buffer
}
function fwrite(handle, count : word; sourc : pointer) : boolean;
{
Write count bytes from sourc buffer
}
function fflush(handle : word) : boolean;
{
Flush file
}
implementation
 function fopen;
 var
 asciiz : array[0..255] of char;
 i, acs : byte;
 nptr : pointer;
 hnd : word;
 begin
 for i := 0 to ord(name[0]) do asciiz[i] := name[i+1];
 asciiz[ord(name[0])] := #0;
 nptr := @asciiz;
 ferror := 0;
 case mode of
 'r' : acs := 0;
 'w' : acs := 1;
 '+' : acs := 2;
 'a' : acs := 1;
 end;
 asm
 cmp mode, 'w'
 je @trunc
 push ds
 push dx
 mov ah, 3Dh
 mov al, acs
 lds dx, nptr
 int 21h
 pop dx
 pop ds
 jnc @noerr
 cmp mode, 'a'
 jne @err
 cmp ax, 0002h
 jne @err
 @trunc:
 push ds
 push dx
 push cx
 xor cx, cx
 mov ah, 3Ch
 lds dx, nptr
 int 21h
 pop cx
 pop dx
 pop ds
 jnc @noerr
 @err:
 mov ferror, ax
 mov ax, 0FFFFh
 @noerr:
 mov hnd, ax
 end;
 if (mode = 'a') and (ferror = 0) then fseek(hnd, 0, 2);
 fopen := hnd;
 end;
 function fclose; assembler;
 asm
 push bx
 mov ferror, 0
 mov bx, handle
 mov ah, 3Eh
 int 21h
 mov bx, ax
 mov ax, 01h
 jnc @noerr
 mov ferror, bx
 xor ax, ax
 @noerr:
 pop bx
 end;
 function fseek;
 type
 tlong = record
 case boolean of
 true : (long : longint);
 false : (lword, hword : word);
 end;
 var
 offs : tlong;
 begin
 offs.long := offset;
 ferror := 0;
 asm
 push bx
 push cx
 push dx
 mov ah, 42h
 mov al, mode
 mov bx, handle
 mov cx, offs.hword
 mov dx, offs.lword
 int 21h
 jnc @noerr
 mov ferror, ax
 @noerr:
 pop dx
 pop cx
 pop bx
 end;
 if ferror = 0 then fseek := true
 else fseek := false;
 end;
 function fread; assembler;
 asm
 push bx
 push cx
 push dx
 push ds
 mov ferror, 0
 mov ah, 3Fh
 mov bx, handle
 mov cx, count
 lds dx, dest
 int 21h
 pop ds
 jnc @noerr
 mov ferror, ax
 xor ax, ax
 @noerr:
 pop dx
 pop cx
 pop bx
 end;
 function fwrite; assembler;
 asm
 push bx
 push cx
 push dx
 push ds
 mov ferror, 0
 mov ah, 40h
 mov bx, handle
 mov cx, count
 lds dx, sourc
 int 21h
 pop ds
 jnc @noerr
 mov ferror, ax
 xor ax, ax
 @noerr:
 pop dx
 pop cx
 pop bx
 end;
 function fflush; assembler;
 asm
 push bx
 mov ferror, 0
 mov ah, 68h
 mov bx, handle
 int 21h
 mov bx, ax
 mov ax, 0001h
 jnc @noerr
 mov ferror, bx
 xor ax, ax
 @noerr:
 pop bx
 end;
end.


AltStyle によって変換されたページ (->オリジナル) /