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