#include <dos.h>
#include <stdio.h>
#include <stdlib.h>


// Выключаем проверку стека и указателей

#pragma check_stack( off )
#pragma check_pointer( off )

// Это макро используется для выдачи
//   сигнала на внутренний динамик
//   компьютера. Используется вывод
//   в формате TTY символа BELL (7)
//   через прерывание BIOS 10h

#define BEEP() _asm { \
								_asm mov bx,0      \
								_asm mov ax, 0E07h \
								_asm int 10h       \
						  }


void main(void);


// Объявление программы обработки прерывания

void _interrupt _far timer(void);

// Эта переменная предназначена для хранения
//   старого значения вектора прерывания
//   таймера. Она должна быть глобальной.

void (_interrupt _far *oldvect)(void);

// Переменная для подсчета тиков таймера

volatile long ticks;


void main(void) {

	ticks=0L;  // Сбрасываем счетчик тиков таймера

	oldvect = _dos_getvect(0x1c); // Запоминаем адрес
											// старого обработчика
											// прерывания

	_dos_setvect(0x1c, timer);    // Устанавливаем свой
											// обработчик

	printf("\nТаймер установлен. Нажмите любую клавишу...\n");

	getch(); // Ожидаем нажатия на любую клавишу

	_dos_setvect(0x1c,oldvect);   // Восстанавливаем старый
											// обработчик прерывания
											// таймера
	exit(0);

}

// Функция обрабатывает прерывания таймера

void _interrupt _far timer(void) {

	ticks++; // Увеличиваем счетчик тиков таймера

	// Если значение счетчика тиков кратно 20,
	// выдаем сигнал на динамик компьютера

	if((ticks % 20) == 0) BEEP();

	// Вызываем старый обработчик прерывания

	_chain_intr(oldvect);

}
