[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
{$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.
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]