Вернуться к статье
Листинг 10. Определение временных параметров строчной развертки цветного видеоадаптера
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 *)

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