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