[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]