Unit USedoV10;
Interface
Type  T256 = array [0..255] of byte;
Const A : byte =0;
      B : byte =1;
Var   buf256    : T256;
{$F+}
      Errorproc : procedure(F,P,S:byte);
{$F-}

Procedure InitDK(drive:byte);
Procedure read256(drive,Piste, secteur, face:byte);


Implementation
Uses DOS;
Type  Tdbt = array[0..$A] of byte;
Var   reg    : registers;
      old    : pointer;
      olddbt : ^Tdbt;
      dbt    : tdbt;
      Sauvesortie :pointer;

Procedure InitDK(drive:byte);
begin
 reg.ah:=0;
 reg.dl:=Drive;
 intr($13,reg);
end;

Procedure read256(drive,Piste, secteur, face:byte);
Var essais,carry  : byte;
Begin
 Essais := 5;
 Repeat
  reg.ah:=2;
  reg.al:=1;
  reg.ch:=piste;
  reg.cl:=secteur;
  reg.dh:=face;
  reg.dl:=drive;
  reg.es:=seg(buf256);
  reg.bx:=ofs(buf256);
  intr($13,reg);
  carry:=(reg.flags and fcarry);
  if carry=1 then 
  begin
   initDK(drive);
   dec(essais);
  end;
 Until (carry=0) or (essais=0);
 if essais=0 then Errorproc(Face,Piste,secteur);
End;    {read256}

{$F+}
Procedure Erreur(F,P,S:byte); {$F-}
 begin
  Write('ProblŠme de lecture Face ',F,' Piste ',P,' Secteur ');
  Writeln(S);
  Halt;
 end;

{$F+}
Procedure Masortie; {$F-}
Begin
setintvec($1e,old);
InitDK(A);
Exitproc:=sauvesortie;
End;


Begin
getintvec($1e,old);
olddbt:=old;
dbt:=olddbt^;
dbt[3]:=1;
setintvec($1E,@dbt);
InitDK(A);
sauvesortie:=Exitproc;
Exitproc:=@Masortie;
Errorproc:=Erreur;
end.