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