Примеры прерывающих подпрограмм
Универсальная подпрограмма
Драйвер всегда обрабатывает только одно событие, это обстоятельство и использовано в подпрограмме Eventm. Она либо перемещает курсор, либо формирует новые значения переменных Noevent, LBevent и RBevent. Текст подпрограммы приведен в примере 6.16.
Пример 6.16. Обслуживание прерываний от драйвера мыши.
Eventm: push ax; сохранение содержимого ах mov ax, data; ах = значение сегмента данных mov ds, ax установка сегмента данных pop ax восстановление содержимого ах shr ax, 01 сдвиг содержимого ах на разряд вправо jnc btnstat › курсор не перемещался ; Сюда надо вставить текст примера 6.14, начиная с третьей команды Btnstat: mov Noevent, 01 признак изменения состояния кнопок mov Xasevent, ex координата X в момент события mov Yasevent, dx координата Y в момент события mov ah, al копируем al в ah and ax, ОСОЗп выделяем нужные разряды mov LBevent, al сохраняем код события в LBevent shr ah, 02 сдвиг кода в ah на 2 разряда вправо mov RBevent, ah сохраняем код события в RBevent retf возвращение в драйвер
Текст примера 6.16 надо дополнить текстом подпрограммы Mousm, как это указано в комментарии. При этом получится универсальная прерывающая подпрограмма, перемещающая курсор вслед за мышью и формирующая коды событий, связанных с кнопками при изменении их состояния.
Первая команда примера 6.16 сохраняет в стеке содержимое регистра ах, потому, что его портит следующая команда. Перед началом основных действий надо поместить в регистр ds значение используемого в задаче сегмента данных, для того чтобы стали доступны расположенные в нем переменные, что и делают две следующие команды. После их выполнения восстанавливается исходное содержимое регистра ах.
Выполняемые подпрограммой действия зависят от причины ее вызова, т. е. от кода, находящегося в регистре ах. Его содержимое сдвигается на 1 разряд вправо, при этом в зависимости от состояния младшего разряда будет очищен или установлен признак переноса (флаг carry). Если он установлен, то надо перемещать курсор. В противном случае команда jnz btnstat выполняет переход на ветку с меткой btnstat.
В этой ветке формируются значения переменных Noevent, Xasevent, Yasevent, LBevent и RBevent. Выполняемые при этом действия не требуют особых пояснений. Если вам непонятен способ вычисления значений LBevent и RBevent, то вернитесь к разделу, в котором описано, что передает драйвер вызываемой подпрограмме.
Для установки подпрограммы Eventm в примере 6.15 надо изменить команды, формирующие адрес подпрограммы и маску событий, а именно:
lea dx, Eventm; пишем в dx адрес "Eventm" mov ex, IFh; устанавливаем код маски событий
После установки подпрограмма будет вызываться при перемещениях мыши и при изменении состояний ее левой и правой кнопок.
Таким образом, описанная подпрограмма передает задаче все данные об изменении текущего состояния мыши, и дополнительные обращения задачи к драйверу не требуются. Надо просто анализировать значения переменных, которые формирует подпрограмма Eventm. Это упрощает структуру задачи, а взаимодействие с драйвером производится только в тех случаях, когда изменяется состояние мыши.
Замечание
Если оператор перемещает мышь или нажимает на ее кнопки в тот момент, когда задачу "не интересует" состояние мыши, то его действия будут зафиксированы в значениях переменных и не окажут никакого влияния на выполнение задачи. Но, вернувшись к опросу, задача отреагирует на последнее изменение расположения мыши и состояния ее кнопок. Для исключения ложных срабатываний задача должна очищать переменные curmp и Noevent после их использования. Не забывайте также, что в процессе выполнения задачи можно запрещать вызов ранее установленной подпрограммы или устанавливать вместо нее другую подпрограмму.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Мы закончили последнюю из четырех глав, посвященных программированию для видеорежимов PPG. Об особенностях именно этих режимов речь шла только при описании работы с рисунками и палитрой цветов. При рассмотрении работы с текстом и курсором автор стремился акцентировать внимание читателя на основных вопросах, безотносительно к видеорежимам. Поэтому приемы, описанные в Главах 5 и 6, могут пригодиться вам и при программировании для видеорежимов direct color.