{ Hабор процедур, осуществляющих обмен с файлами в режиме Block }

procedure lseek(var f:file;p:longint);

{ Позиционирование указателя на указанный байт }

var fr                 : word absolute f;
    hnd,rcx,rdx        : word;
begin
  hnd:=fr;
  rcx:=p div 65536;
  rdx:=p mod 65536;
  asm
   mov ax,4200h
   mov cx,rcx
   mov dx,rdx
   mov bx,hnd
   int 21h
  end
end;

procedure lcopy(var s,d:file; var c:longint);

{ Копирование между произвольными файлами:
   S - Файл-источник;
   D - Файл-приемник;
   C - число байт, которые должны быть скопированы }

const bufsize=8192;
var buf : array[1..bufsize] of byte;
    sf  :  filerec absolute s;
    df  : filerec absolute d;
    i   : longint;
begin
  repeat
    if c>bufsize then i:=bufsize else i:=c;
    c:=c-i;
    sf.recsize:=i;
    df.recsize:=i;
    blockread(s,buf,1);
    blockwrite(d,buf,1);
  until c=0;
end;

procedure lread(var f:file;var v;c:word);

{ Чтение произвольной записи из файла.
  V - область размещения;
  C - число байт на чтение. }

var fr : filerec absolute f;
begin
 if c=0 then exit;
 fr.recsize:=c;
 blockread(f,v,1);
end;

procedure lwrite(var f:file;var v;c:word);

{ Запись произвольной записи в файл.
  V - область размещения;
  C - число байт на чтение. }

var fr : filerec absolute f;
begin
 if c=0 then exit;
 fr.recsize:=c;
 blockwrite(f,v,1);
end;

function lerase(name:string):word;
var nameseg,nameofs : word;
begin
 name:=name+#0;
 nameseg:=seg(name[1]);
 nameofs:=ofs(name[1]);
 asm
  push ds
  mov ds,nameseg
  mov dx,nameofs
  mov ah,41h
  int 21h
  mov nameseg,ax
  pop ds
 end;
 lerase:=nameseg;
end;

