Для работы с таймером (точнее говоря, для работы с каналом 0 таймера) BIOS содержит две функции прерывания INT1Ah. Они позволяют прочитать текущее содержимое счетчика и изменить его.
Функция 00h предназначена для чтения содержимого счетчика таймера:
На входе: AH = 00h.
На выходе: CX = старший байт счетчика;
DX = младший байт счетчика;
AL = 0, если с момента перезапуска таймера прошло более 24-х часов.
Изменить содержимое счетчика таймера можно с помощью следующей функции:
На входе: AH = 01h;
CX = старший байт счетчика;
DX = младший байт счетчика.
На выходе: не используются.
Функцию чтения таймера можно использовать для организации программной задержки. Так как работа таймера не зависит от производительности процессора, быстродействие системы не будет влиять на формируемую задержку.
Однако следует учитывать, что точность формирования задержки определяется частотой обновления счетчика таймера (18.2 Гц), и может оказаться недостаточной для некоторых приложений.
Мы подготовили функцию для формирования задержек с помощью таймера:
/** *.Name tm_delay *.Title Формирование задержки по таймеру * *.Descr Эта функция формирует задержку, используя * системный таймер. * *.Proto void tm_delay(int ticks) * *.Params int ticks - величина задержки в тиках * таймера (за одну секунду таймер * тикает 18.2 раза). * *.Return Ничего * *.Sample tm_samp1.c **/
#include <dos.h> #include <conio.h>
void tm_delay(int ticks) {
_asm {
push si
mov si, ticks mov ah, 0 int 1ah
mov bx, dx add bx, si
delay_loop:
int 1ah cmp dx, bx jne delay_loop
pop si } }
Функция использует только одно слово регистра таймера, что позволяет формировать задержки длительностью до 65536 тиков таймера. Приведенная ниже программа демонстрирует использование функции для генерации примерно десятисекундной задержки :
#include <stdio.h> #include "sysp.h"
main() {
printf("\nДля выполнения программной задержки примерно" "\nна 10 секунд нажмите любую клавишу."); getch();