Страница 7 из 19
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 секунды и т.д.
|