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