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