Иллюстрированный самоучитель по SVGA

Работа в режиме прерываний. Функции драйвера.

Недостаток режима опроса заключается в том, что задача не узнает об изменении состояния мыши до тех пор, пока не обратится к драйверу. В некоторых случаях этот недостаток имеет принципиальное значение, и программист вынужден использовать режим прерываний.

В данном разделе нас будут интересовать те прерывания процесса выполнения задачи, которые вызывает драйвер при изменениях состояния манипулятора "мышь". Задача может разрешить или запретить драйверу прерывать процесс своего выполнения в указанных случаях. Если прерывания разрешены, то момент их возникновения зависит только от действий оператора, работающего с мышью, и никак не связан с действиями, выполняемыми задачей. То есть, как обычно, прерывания происходят по внешним, не зависящим от задачи, причинам.

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

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


Для того чтобы при изменении состояния мыши драйвер мог прервать выполнение задачи, последняя должна с помощью специальных функций установить прерывающую подпрограмму. В данном разделе описаны варианты установки и удаления прерывающих подпрограмм, требования к их оформлению, условия вызова и данные, передаваемые драйвером.

Обычно термин "прерывающая" указывает на то, что подпрограмма вызывается при возникновении событий, независящих от выполнения основной задачи полностью или частично. В нашем случае момент вызова подпрограммы зависит от действий оператора, работающего с мышью.

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

Установка основной подпрограммы

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

Функция 0С (set Event Handler) предназначена для установки подпрограммы, реагирующей на события, связанные с изменением состояния мыши. Перед обращением к драйверу полный адрес точки входа указывается в регистрах es:dx, а код маски помещается в младший байт регистра сх. Состояние его разрядов (0 или 1) соответствует наличию или отсутствию следующих событий:

разряд 0 – перемещение мыши;  
разряд 1 – левая кнопка нажата; разряд 2 – левая кнопка отпущена;
разряд 3 – правая кнопка нажата; разряд 4 – правая кнопка отпущена;
разряд 5 – средняя кнопка нажата; разряд 6 – средняя кнопка отпущена.

Допустимо произвольное сочетание указанных признаков, в частности, при записи в регистр сх кода 7Fh подпрограмма будет вызываться при любых изменениях состояния мыши.

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

Для очистки маски достаточно выполнить следующие две команды:

хоr сх, сх; очистка регистра сх

Mouse ОС; запрос функции ОС
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.