Программирование игр для Windows. Советы профессионала


Установка обработчика прерывания


Регистрация (или установка) подпрограммы обработки прерываний заключается том, что мы помещаем ее начальный адрес в соответствующее поле таблицы векторов прерываний. Это можно сделать двумя способами:

 Мы можем просто изменить адрес прерывания таким образом, чтобы он Указывал на наш собственный обработчик и так все и оставить. Однако при этом, старый обработчик прерывания никогда больше вызываться не будет.

Кроме того, а что произойдет, если прерывание будет сгенерировано именно в тот момент, когда мы будем заниматься заменой адреса в таблице векторов? Р-р-раз и «зависли» — вот что случится! Именно поэтому пусть это действие за вас выполнит DOS при помощи функции _dos_setvect(). Для сохранения старого вектора прерывания следует использовать функцию _dos_getvect(). Обе функции гарантировано изменяют вектора без ущерба для операционной системы;

Очень часто нам требуется расширить функциональные возможности системы без полной замены уже работающих функций. Тогда мы используем цепочку прерываний. Под цепочкой прерывания понимается следующее: мы запоминаем старый адрес процедуры обслуживания прерывания и заменяем его на собственный, затем, по окончании нашей процедуры обработки прерывания, передаем управление старому обработчику. Таким образом, нам удается сохранить чужие обработчики прерываний или резидентные программы - если, конечно, нам это надо!

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

Листинг 12.1 демонстрирует установку нашей процедуры обслуживания прерывания timer () (которая по-прежнему ничего не делает).

Листинг 12.1. Установка процедуры обслуживания прерывания.

void (_interrupt _far old_isr) (); // Указатель для сохранения

// вектора старого

// обработчика прерываний

// Сохранить вектор старого обработчика прерывания таймера

old_isr =  _dos_getvect( 0х1C);

// Установить новую процедуру обработки прерывания

_dos_setvect(0x1C, Timer);

Ну как, трудно? Да вовсе нет! Для восстановления старого обработчика нам потребуется сделать только:




Начало  Назад  Вперед



Книжный магазин