program H_TIME;
const
PortScr = $03DA;
var
Time1, Time2 : real;
Mask : byte;
begin
TextColor (LightGray);
TextBackGround (Black);
(* маскируем все аппаратные прерывания *)
Mask := Port [$21]; (* маска аппарататных прерываний *)
Port [$21] := $FF; (* запрет всех прерываний *)
(* ждем рабочего хода луча по кадрам *)
while Port [PortScr] and $08 <> $00
do;
(* ждем начала обратного хода по кадрам *)
while Port [PortScr] and $08 = $00
do;
(* ждем рабочего хода луча по кадрам *)
while Port [PortScr] and $08 <> $00
do;
(* ждем рабочего хода луча по строкам *)
while Port [PortScr] and $01 <> $00
do;
(* ждем начала строчного обратного хода *)
while Port [PortScr] and $01 = $00
do;
(* программируем нулевой канал таймера *)
Port [$43] := $36; (* выбор нулевого канала таймера: *)
Port [$40] := $01; (* младший байт делителя *)
Port [$40] := $00; (* старший байт делителя *)
(* ждем начала рабочего хода по строкам *)
while Port [PortScr] and $01 <> $00
do;
(* останавливаем таймер и читаем результат *)
Port [$43] := $00;
Time1 := 65535.0 - (Port [$40] + Port [$40] * 256.0);
(* ждем рабочего хода луча по кадрам *)
while Port [PortScr] and $08 <> $00
do;
(* ждем начала обратного хода по кадрам *)
while Port [PortScr] and $08 = $00
do;
(* ждем рабочего хода луча по кадрам *)
while Port [PortScr] and $08 <> $00
do;
(* ждем рабочего хода луча по строкам *)
while Port [PortScr] and $01 <> $00
do;
(* ждем начала строчного обратного хода *)
while Port [PortScr] and $01 = $00
do;
(* программируем нулевой канал таймера *)
Port [$43] := $36; (* выбор нулевого канала таймера: *)
Port [$40] := $01; (* младший байт делителя *)
Port [$40] := $00; (* старший байт делителя *)
(* ждем начала рабочего хода по строкам *)
while Port [PortScr] and $01 <> $00
do;
(* ждем конца обратного хода по строкам *)
while Port [PortScr] and $01 = $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 ('Параметры строчной развертки (в тиках таймера):');
Writeln ('-----------------------------------------------');
WriteLn ('Время обратного хода луча = ', Time1 : 0 : 0);
WriteLn ('Период строчной развертки = ', Time2 : 0 : 0);
Halt (0)
end. (* H_TIME *)
Вернуться к статье