Вернуться к статье
Листинг 9. Определение временных параметров кадровой развертки цветного видеоадаптера
program V_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;
(* программируем  нулевой  канал  таймера *)
      Port [$43] := $36;               (* выбор нулевого канала таймера: *)
      Port [$40] := $01;               (* младший  байт  делителя *)
      Port [$40] := $00;               (* старший  байт  делителя *)
(* ждем начала  прямого  хода по кадрам *)
      while Port [PortScr] and $08 <> $00
      do;
(* останавливаем таймер и читаем  результат *)
      Port [$43] := $00;
      Time1 := 65535.0 - (Port [$40] + Port [$40] * 256.0);
(* ждем начала обратного хода по кадрам *)
      while Port [PortScr] and $08  = $00
      do;
(* программируем  нулевой  канал  таймера *)
      Port [$43] := $36;               (* выбор нулевого канала таймера: *)
      Port [$40] := $01;               (* младший  байт  делителя *)
      Port [$40] := $00;               (* старший  байт  делителя *)
(* ждем конца обратного хода по  кадрам *)
      while Port [PortScr] and $08 <> $00
      do;
(* ждем начала обратного хода по кадрам *)
      while Port [PortScr] and $08  = $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. (* V_TIME *)

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