Справочник программиста на персональном компьютере фирмы IBM. Таймеры и звук
Страница 6. Задержка программных операций


     2.1.5 Задержка программных операций.


   Если Вы осуществляете задержку в программе посредством пустого
цикла, то Вам может  потребоваться  много времени для того, чтобы
добиться  нужного времени задержки.  Даже если Вы определите тре-
буемую длительность, то нельзя быть уверенным, что Ваша программа
будет  давать нужное время задержки при всех условиях.   Длитель-
ность цикла может меняться в  зависимости от используемого компи-
лятора  (или,  для Бейсика, от того, компилируется программа  или
нет). А в наше время, когда имеется большой набор машин совмести-
мых  с  IBM PC - имеющих широкий диапазон скорости  процессора  -
даже цикл на языке ассемблера может  приводить к различным време-
нам  задержки.  Поэтому разумно определять время программной  за-
держки непосредственно  по  часам.   Частота  отсчета 18.2 раза в
секунду,  используемая  для модификации счетчика  времени  суток,
должна вполне удовлетворять  большинство потребностей (как увели-
чить частоту отсчетов см. [2.1.1]).
   Чтобы  обеспечить задержку данной продолжительности, программа
должна подсчитать  требуемое  число  импульсов  счетчика  времени
суток.   Это значение добавляется к считанному текущему  значению
счетчика. Затем программа постоянно считывает значение счетчика и
сравнивает  его  с запомненным.  Когда достигается равенство,  то
требуемая задержка прошла и можно  продолжать выполнение програм-
мы.   Четыре байта, в которых хранится значение счетчика  времени
суток хранятся, начиная с адреса 0040:006C (как обычно, начиная с
младшего байта). Для задержек меньших 14 секунд можно пользовать-
ся только младшим байтом. Два младших байта позволяют задержки до
одного часа (точнее, на пол-секунды меньше, чем час).

   Высокий уровень.


   В  Бейсике можно использовать оператор SOUND [2.2.2] со значе-
нием частоты, равным 32767. В этом случае звук не будет генериро-
ваться вообще.  Это отсутствие звука будет длиться столько отсче-
тов времени суток, сколько Вы укажете.   Для 5-секундной задержки
нужен 91 отсчет (5 * 18.2). Поэтому

100 SOUND 32767,91  'останавливает программу на 5 секунд

Для прямого чтения счетчика времени суток нужно:

100 DEF SEG = 0            'установка сегмента на начало памяти
110 LOWBYTE = PEEK(&H46C)  'получение младшего байта
120 NEXTBYTE = PEEK(&H46D) 'получение следующего байта
130 LOWCOUNT = NEXTBYTE*256 + LOWBYTE  'значение двух байтов

   Средний уровень.


   Прочитайте  значение  счетчика времени суток  BIOS,  используя
функцию 0 прерывания 1AH  и  добавьте  к  нему  необходимое число
импульсов по 1/18 секунды.  После этого считывайте текущие значе-
ния счетчика времени суток, постоянно сравнивая с требуемой вели-
чиной. При достижении равенства надо кончать задержку. Прерывание
1AH возвращает два младших байта в DX (большинство задержек укла-

дываются  в этих пределах), поэтому два старших байта, возвращае-
мые  в  CX,  могут  игнорироваться,  что  позволит  Вам  избежать
32-байтных операций.  В данном примере установлена задержка на  5
секунд, что соответствует 91 отсчету.

;---получение значения счетчика и установка задержки
            MOV   AH,0   ;номер функции для "чтения"
            INT   1AH    ;получаем значение счетчика
            ADD   DX,91  ;добавляем 5 сек. к младшему слову
            MOV   BX,DX  ;запоминаем требуемое значение в BX
;---постоянная проверка значения счетчика времени суток BIOS
REPEAT:     INT   1AH    ;получаем значение счетчика
            CMP   DX,BX  ;сравниваем с искомым
            JNE   REPEAT ;если неравен, то повторяем снова
                         ;иначе, задержка окончена

AT имеет добавочную  функцию  прерывания  15H,  которая позволяет
осуществить  задержку на указанное время.  Поместите 86H в AH,  а
число микросекунд задержки в CX:DX.  После этого выполните преры-
вание.

 
« Предыдущая статья   Следующая статья »