Type
  PasFile = Object
              NameOfFile : String;
              Buffer     : Pointer;
              Size       : Word; {размер прочитанного в буффере}
              CurrentP   : Word; {текущая позиция в буффере}
              FileP      : File;
              EndOfFile  : Boolean;
              Procedure Home;
              Function ReadNextByte:Byte;
              Constructor Init(S:String);
              Destructor Done;
            End;
{--------------------------------------}
Constructor PasFile.Init(S:String);
Begin
  NameOfFile:=S;  
  WriteLn('Открываем файл :',S);
  Assign(FileP,S);
  {$I-}
  Reset(FileP,1);
  {$I+}
  If IOResult<>0 Then Begin
    WriteLn('Файл ',S,' не найден.');
    WriteLn('Программа остановлена');
    Halt;
  End;
  GetMem(Buffer,10*1024);
  BlockRead(FileP,Buffer^,10*1024,Size);
  If Size>0 Then EndOfFile:=False Else EndOfFile:=True;
  CurrentP:=0;
  New(Main);
  Main^.BlN:=1;
  Main^.BeginN:=0;
  Main^.EndN:=0;
  Main^.NextLevel:=Nil;
  Main^.Next:=Nil;
  Main^.Prev:=Nil;
  Main^.IdentL:=Nil;
  Main^.ProcName:='MainProgram';
  Main^.LevelNum:=0;
End;
Procedure PasFile.Home;
Begin
  Seek(FileP,0);
  BlockRead(FileP,Buffer^,10*1024,Size);
  If Size>0 Then EndOfFile:=False Else EndOfFile:=True;
  CurrentP:=0;
End;

Function PasFile.ReadNextByte:Byte;
Var
  B : Byte;
Begin
  If EndOfFile Then Begin WriteLn('Чтение после конца файла...');Halt;End;
  If CurrentP=Size Then Begin BlockRead(FileP,Buffer^,10*1024,Size);
    CurrentP:=0;
  End;
  If Size=0 Then Begin WriteLn('Чтение после конца файла...');Halt;End;
  B:=Mem[Seg(Buffer^):Ofs(Buffer^)+CurrentP];
  Inc(CurrentP);
  EndOfFile:=EOF(FileP) And (CurrentP=Size);
  ReadNextByte:=B;
End;

Destructor PasFile.Done;
Begin
  FreeMem(Buffer,10*1024);
  Close(FileP);
  ListDone(IsB);
  ListDone(CsB);
  LinDone(Lin);
End;
{--------------------------------------------------}