Страница 6 из 19
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. После этого выполните преры- вание.
|