Справочник программиста на персональном компьютере фирмы IBM. Таймеры и звук - Задержка программных операций
ОГЛАВЛЕНИЕ
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. После этого выполните преры-
вание.