Вернуться к статье
Листинг 12. Определение частоты вращения жесткого диска
program HDD_TIME;

const
      PortHDD = $01F7;                 (* $0177   для  2-го  НЖМД *)
var
      Time1, Time2 : real;
      Mask         : byte;
      I            : integer;
begin
      TextColor (LightGray);
      TextBackGround (Black);
      Mask := Port [$21];              (* маска аппаратных прерываний *)
      Port [$21] := $FF;               (* запрет всех  прерываний *)
(* ожидание сигнала  индекса жесткого диска*)
      I := -1;
      while (I <> 0) and (Port [PortHDD] and $02 = $00)
      do I := Pred (I);
      if Port [PortHDD] and $02 = $00
      then                             (* нет индексного  сигнала *)
           begin
                 Port [$21] := Mask;
                 WriteLn ('Нет индексного сигнала...');
                 Halt (-1)
           end;
(* ожидание начала нового  оборота  диска *)
      while Port [PortHDD] and $02 <> $00
      do;
      while Port [PortHDD] and $02  = $00
      do;
(* инициализация  нулевого  канала  таймера *)
      Port [$43] := $36;               (* выбор нулевого канала таймера: *)
      Port [$40] := $01;               (* младший  байт  делителя *)
      Port [$40] := $00;               (* старший  байт  делителя *)
      while Port [PortHDD] and $02 <> $00
      do;
      while Port [PortHDD] and $02  = $00
      do;
(* остановка таймера и чтение  результата *)
      Port [$43] := $00;
      Time1 := 65535.0 - (Port [$40] + Port [$40] * 256.0);
(* ожидание начала нового  оборота  диска *)
      while Port [PortHDD] and $02 <> $00
      do;
      while Port [PortHDD] and $02  = $00
      do;
(* инициализация  нулевого  канала  таймера *)
      Port [$43] := $36;               (* выбор нулевого канала таймера: *)
      Port [$40] := $01;               (* младший  байт  делителя *)
      Port [$40] := $00;               (* старший  байт  делителя *)
      while Port [PortHDD] and $02 <> $00
      do;
(* остановка счетчика и чтение результата *)
      Port [$43] := $00;
      Time2 := 65535.0 - (Port [$40] + Port [$40] * 256.0);
(* восстановление нулевого  канала  таймера *)
      Port [$43] := $36;               (* восстановление   канала *)
      Port [$40] := $00;               (* 0 таймера: делитель = 0 *)
      Port [$40] := $00;
(* размаскирование аппаратных  прерываний *)
      Port [$21] := Mask;              (* восстановление  прерываний *)
(* вывод полученных результатов измерений *)
      WriteLn ('Параметры жесткого диска AT:');
      WriteLn ('------------------------');
      WriteLn ('Период оборота (тиков таймера) =', Time1 : 6 : 0);
      WriteLn ('Проход индекса (тиков таймера) =', Time2 : 6 : 0);
      Halt (0)
end. (* HDD_TIME *)


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