Компьютер - электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться шуткам начальника и сваливать свои собственные ошибки на соседний компьютер.




я с младшего байта). Для задержек меньших 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. После этого выполните преры- вание.


2.1.6 Операции запрограммированные во времени.



      Программа определяет время для выполнения определенной опера- ции в точности так же, как и человек: берется начальное показание счетчика времени суток и затем сравнивается с последующими пока- заниями. Можно получать значения в формате часы-минуты-секунды, но слишком хлопотно вычислять разницу между такими показаниями, поскольку система счета не десятичная. Лучше прямо читать счетчик времени суток BIOS, измерять продолжительность в 1/18 секунды, а затем уже переводить ее в обычный формат чч:мм:сс.
100 GOSUB 500 'получаем значение счетчика 110 START = TOTAL 'сохраняем начальное значение в START
      .
      (далее идет процесс, длительность которого измеряется)
      . 300 GOSUB 500 'получаем финальное значение 310 TOTAL = TOTAL - START 'подсчитываем число импульсов 320 HOURS = FIX(TOTAL/65520) 'вычисляем число часов 330 TOTAL = TOTAL - HOURS*65520 'вычитаем часы из TOTAL 340 MINUTES = FIX(TOTAL/1092) 'вычисляем число минут 350 TOTAL = TOTAL - MINUTES*1092 'вычитаем минуты из TOTAL 360 SECONDS = FIX(TOTAL/18.2) 'вычисляем число секунд 370 PRINT HOURS,MINUTES,SECONDS 'печатаем результат 380 END
      .
      . 500 DEF SEG = 0 'подпрограмма чтения времени суток 510 A = PEEK(&H46C) 'получаем младший байт 520 A = PEEK(&H46D) 'получаем следующий байт 530 A = PEEK(&H46E) 'и еще один 540 TOTAL = A + B*256 + C*65535 'подсчитываем результат в TOTAL 550 RETURN 'все сделано

      Функция TIMER в Бейсике возвращает число секунд, прошедших с момента, когда счетчик времени суток был последний раз установлен в 0. Обычно это число секунд, прошедших со времени последнего включения компьютера. Если при старте системы правильно было установлено системное время, то TIMER возвращает число секунд, прошедших с полуночи. Просто напишите N = TIMER.

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

      Прерывание 1AH имеет две функции для установки (AH = 1) и получения (AH = 0) счетчика времени суток. Для чтения счетчика надо просто выполнить прерывание с AH = 0. При возврате значение счетчика содержится в CX:DX, причем младшее слово в CX. AL содер- жит 0, если счетчик не переходил через границу 24 часов с момента последней установки. Для установки счетчика поместите два слова в те же регистры, а в AH - 1. В приведенном примере измеряются промежутки времени в пределах часа. При этом нужны только два младших байта счетчика. Но в этом случае необходимо проверять, что не было перехода через границу, когда начальное значение было больше, чем следующее.

;---в сегменте данных OLDCOUNT DW 0 ;храним начальное значение счетчика ;---получаем начальное значение счетчика
      MOV AH,0 ;номер функции
      INT 1AH ;получаем значение счетчика
      MOV OLDCOUNT,DX ;сохраняем начальное значение
      .
      (здесь идет процесс, длительность которого измеряется)
      . ;---позднее вычисляем длительность процесса
      MOV AH,0 ;номер функции
      INT 1AH ;получаем значение счетчика
      MOV BX,OLDCOUNT ;считываем старое значение
      CMP BX,DX ;проверяем на переполнение
      JG ADJUST ;обработка переполнения
      SUB DX,BX ;иначе берем разность
      JMP SHORT FIGURE_TIME ;и переводим ее в обычный вид ;---обработка переполнения ADJUST: MOV CX,0FFFFH ;помещаем в CX максимальное число
      SUB CX,BX ;вычитаем первое значение
      ADD CX,DX ;добавляем второе значение
      MOV DX,CX ;результат храним в DX ;---процедура перевода времени в обычный формат FIGURE_TIME: ;делим на 18.2 секун