Вернуться к статье
Листинг 7. Чтение данных "длинного" сектора жесткого диска
program LONG_READ;
const
      Drive = $80;                (* номер жесткого диска *)
      Cyl   = $00;                (* контрольный  цилиндр *)
      Head  = $00;                (* поверхность    диска *)
      Sect  = $03;                (* контрольный   сектор *)
type
      Registers = record
                       case boolean
                       of
                          False : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : integer);
                          True  : (AL, AH, BL, BH, CL, CH, DL, DH   : byte)
                  end;
var
      I        : integer;
      Regs     : Registers;
      LongBuff : record
                        Buff : array [1..512] of byte;
                        ECC  : record
                                      CRC   : integer;
                                      Count : integer
                               end
                 end;
begin
      TextColor (LightGray);
      TextBackGround (Black);
      FillChar (LongBuff, SizeOf (LongBuff), 0);
      Regs.AH := $0A;             (* код операции "длинного" чтения *)
      Regs.AL := $01;             (* число   читаемых    секторов *)
      Regs.CH := $00;             (* номер контрольного  цилиндра *)
      Regs.CL := $02;             (* номер  контрольного  сектора *)
      Regs.DH := $00;             (* номер поверхности жесткого диска*)
      Regs.DL := $80;             (* номер жесткого диска для  BIOS *)
      Regs.ES := Seg (LongBuff);  (* сегмент. адрес буфера чтения *)
      Regs.BX := Ofs (LongBuff);  (* смещение буфера  для  чтения *)
      Intr ($13, Regs);           (* операция  "длинного"  чтения *)
      if Regs.Flags and 1 <> 0
      then                        (* ошибка чтения *)
           begin
                 WriteLn ('Ошибка ', Regs.AH, ' "длинного" чтения...');
                 Halt (-1)
           end;
      WriteLn ('Число оставшихся пусков = ', LongBuff.ECC.Count);
      Write   ('Ключевая запись сектора = "');
      I := 0;
      while (I < 512) and (LongBuff.Buff [Succ (I)] <> 0)
      do
         begin
               I := Succ (I);
               Write (Chr (LongBuff.Buff [I]))
         end;
      WriteLn ('"');
      Halt (0)
end. (* LONG_READ *)

Вернуться к статье