Примеры прерывающих подпрограмм
Изменение флага состояния
Для того чтобы каждый раз не вспоминать о необходимости изменить текущее значение переменной pntstat, мы рекомендуем просто включить в текст подпрограмм showpnt (см. пример 6.5), Hidepnt (см. пример 6.6) и Tgipntr (см. пример 6.4) следующие команды:
or pntstat, 01; в подпрограмму Showpnt and pntstat, OFeh; в подпрограмму Hidepnt xor pntstat, 01; в подпрограмму Tgipntr
Все три команды изменяют состояние только младшего разряда pntstat, это позволяет, в случае необходимости, использовать остальные разряды pntstat для хранения других нужных для задачи признаков.
Установка Mousm
Для установки подпрограммы Mousm после действий, описанных в примере 6.9, надо выполнить группу команд, приведенную в примере 6.15.
Пример 6.15. Установка прерывающей подпрограммы Mousm.
; Дополнение к примеру 6.9 push es; сохраняем содержимое es push cs; помещаем в стек содержимое cs pop es; и выталкиваем его в es lea dx, Mousm; пишем в dx адрес "Mousm" mov ex, 01; код события "перемещение курсора" mouse ОС; обращаемся к драйверу мыши pop es; восстанавливаем содержимое es
Подведем итог всему сказанному в данном разделе.
Перемещение курсора слабо зависит от действий основной задачи и его можно выполнять в режиме прерываний, поступающих от драйвера. Правда, в таком случае возникает вопрос о том, как задача узнает, что курсор перемещался, если для ее выполнения это необходимо знать. На этот случай мы использовали в примере 6.14 переменную curmp. Предполагается, что в нужные моменты времени задача проверяет значение этой переменной и узнает о факте перемещения курсора. Вы можете отказаться от этой переменной и ввести другой признак перемещения курсора, но в любом случае без анализа специального признака задача не узнает о факте перемещения курсора, поскольку оно выполняется без ее прямого участия.
Анализ состояния кнопок
Текущее состояние мыши, как правило, надо анализировать в тех случаях, когда это необходимо для выполнения задачи. Поэтому мы рекомендуем, по крайней мере, на первое время использовать опрос состояния. При этом вместо обращений к драйверу мыши надо проверять значения переменных LBevent и RBevent, которые формирует вызываемая драйвером подпрограмма, при наступлении соответствующих событий. Вместо 8 разных значений, перечисленных в табл. 6.2, в режиме прерываний LBevent и RBevent могут иметь только три значения 0, 1 и 2.
Переменная Mstatus имела вспомогательное значение и в данном случае она не используется. Вместо нее мы введем три новые переменные:
Noevent db 0; признак изменения (1) состояния кнопок Xasevent dw 0; координата X в момент изменения состояния кнопок Yasevent dw 0; координата Y в момент изменения состояния кнопок
При изменении состояния кнопок подпрограмма устанавливает младший разряд переменной Noevent, очищать эту переменную должна задача после обработки события. Переменные Xasevent и Yasevent введены на тот случай, когда надо знать, в каком месте находился курсор в момент нажатия или отпускания кнопок мыши.