Аппаратное обеспечение IBM PC


         

После установки нового обработчика прерывания


После установки нового обработчика прерывания таймера основная программа ждет нажатия на клавиатуре любой клавиши, затем она восстанавливает старое содержимое вектора прерывания.

#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);

}


Содержание  Назад  Вперед