Работа в режиме прерываний. Функции драйвера.
Недостаток режима опроса заключается в том, что задача не узнает об изменении состояния мыши до тех пор, пока не обратится к драйверу. В некоторых случаях этот недостаток имеет принципиальное значение, и программист вынужден использовать режим прерываний.
В данном разделе нас будут интересовать те прерывания процесса выполнения задачи, которые вызывает драйвер при изменениях состояния манипулятора "мышь". Задача может разрешить или запретить драйверу прерывать процесс своего выполнения в указанных случаях. Если прерывания разрешены, то момент их возникновения зависит только от действий оператора, работающего с мышью, и никак не связан с действиями, выполняемыми задачей. То есть, как обычно, прерывания происходят по внешним, не зависящим от задачи, причинам.
Указанная особенность режима прерываний требует от программиста определенных навыков и тщательной разработки алгоритма задачи. Кроме внутренних факторов, влияющих на выполнение предусмотренных в задаче действий, приходится учитывать и внешние, а это может существенно изменить конкретную реализацию алгоритма. Мы обсудим этот вопрос на примере работы с курсором в режиме прерываний.
Состояние мыши изменяется не так уж часто, даже если она активно используется оператором. При программировании для режима прерываний, рано или поздно, но вам придется решать, чем занять задачу в паузах между изменениями состояния мыши. Если нет другого занятия, то организуется цикл ожидания действий оператора, а для этого предназначен управляющий алгоритм, описанный в соответствующем разделе. Таким образом, режимы прерываний и опроса не исключают, а дополняют друг друга.
Для того чтобы при изменении состояния мыши драйвер мог прервать выполнение задачи, последняя должна с помощью специальных функций установить прерывающую подпрограмму. В данном разделе описаны варианты установки и удаления прерывающих подпрограмм, требования к их оформлению, условия вызова и данные, передаваемые драйвером.
Обычно термин "прерывающая" указывает на то, что подпрограмма вызывается при возникновении событий, независящих от выполнения основной задачи полностью или частично. В нашем случае момент вызова подпрограммы зависит от действий оператора, работающего с мышью.
Особенность описываемых ниже подпрограмм заключается в том, что в случае необходимости их может вызывать основная задача, но это уже относится к области трюков или искусства программирования.
Установка основной подпрограммы
Драйвер может обслуживать только одну основную прерывающую подпрограмму. Для ее установки задаются адрес точки входа и маска события (или событий), при каждом наступлении которого (которых) будет вызываться установленная подпрограмма.
Функция 0С (set Event Handler) предназначена для установки подпрограммы, реагирующей на события, связанные с изменением состояния мыши. Перед обращением к драйверу полный адрес точки входа указывается в регистрах es:dx, а код маски помещается в младший байт регистра сх. Состояние его разрядов (0 или 1) соответствует наличию или отсутствию следующих событий:
разряд 0 – перемещение мыши; | |
разряд 1 – левая кнопка нажата; | разряд 2 – левая кнопка отпущена; |
разряд 3 – правая кнопка нажата; | разряд 4 – правая кнопка отпущена; |
разряд 5 – средняя кнопка нажата; | разряд 6 – средняя кнопка отпущена. |
Допустимо произвольное сочетание указанных признаков, в частности, при записи в регистр сх кода 7Fh подпрограмма будет вызываться при любых изменениях состояния мыши.
Особым случаем является очищенное состояние регистра сх при обращении к драйверу, оно запрещает обслуживание ранее установленной подпрограммы. При изменении состояния мыши драйвер проверяет, указан код произошедшего события в маске или нет. Ни одно из событий не имеет код 0, поэтому при очищенной маске вызов подпрограммы исключается.
Для очистки маски достаточно выполнить следующие две команды:
хоr сх, сх; очистка регистра сх Mouse ОС; запрос функции ОС