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