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 *)
Вернуться к статье