Работа в режиме прерываний. Функции драйвера.
Вызов подпрограммы драйвером
Если произошло событие, код которого указан в маске, то драйвер вызывает установленную подпрограмму. При входе в нее в регистрах bx, сх и dx находятся данные о состоянии кнопок и значениях координат, представленные в том виде, в котором они получаются после выполнения функции 3.
Три младших разряда регистра bх указывают состояние кнопок. Если разряд установлен, то соответствующая ему кнопка нажата, а если очищен, то не нажата. Разряды 0, 1, 2 соответствуют левой, правой и средней кнопкам.
Дополнительно в регистре ах находится код события, явившегося причиной вызова подпрограммы. В этом регистре может быть установлен только один из указанных в коде маски разрядов (см. описание функции ос). Например если подпрограмма вызывается при любом изменении состояния мыши (код маски 7Fh), то будет установлен один из 7 младших разрядов регистра ах.
Предположим, что оператор перемещает мышь при нажатой левой кнопке. В момент начала перемещения произойдут два вызова подпрограммы. В одном случае в регистре ах будет находиться код 1, а во втором 2. Какой из двух вызовов произойдет первым, зависит от того, что раньше сделал оператор – нажал левую кнопку или начал двигать мышь. В дальнейшем состояние левой кнопки не меняется до того момента, пока она не будет отпущена, поэтому при вызовах подпрограммы в регистре ах будет находиться код 1. При отпускании левой кнопки в регистре ах окажется код 4.
Если подпрограмма реагирует только на перемещение курсора (код маски 1), то состояние кнопок указывает код, находящийся в регистре bх.
В конце раздела говорилось о том, что драйвер поддерживает счетчики перемещений курсора (СП К) и мыши (СПМ), причем значения СПК он вычисляет по значениям СПМ. Обычно в прикладных задачах используется СП К, его значения возвращает функция Mouse з в регистрах сх и dx. В отличие от этой функции, при входе в прерывающую подпрограмму доступны оба типа счетчиков.
Значения СПК находятся в регистрах сх и dx, первый из них содержит текущее значение номера столбца, а второй – номера строки.
Значения СПМ находятся в регистрах si и di, первый из них содержит количество перемещений мыши по горизонтали, а второй – по вертикали. Оба счетчика очищаются при инициализации драйвера (функции 0 и 21) и при выполнении специальной функции ов. Текущие значения счетчиков могут быть отрицательными или положительными числами. Положительные значения соответствуют перемещениям мыши вправо и вниз, а отрицательные – влево и вверх. Обычно в прикладных задачах значения СПМ не используются.
Общие требования к подпрограммам
При входе в подпрограмму регистр ds содержит сегмент оперативной памяти, в котором расположен драйвер. Поэтому выполнение подпрограммы должно начинаться с записи в регистр ds значения сегмента данных задачи. Кроме того, драйвер использует регистр es для доступа к области данных BIOS, поэтому при входе в подпрограмму он может оказаться очищенным. Если подпрограмма использует регистр es при обращениях к видеопамяти, то в него надо записать код сегмента видеобуфера. Перед возвратом из подпрограммы в драйвер восстанавливать исходные значения регистров ds и es не требуется.
При разработке подпрограммы вы можете использовать регистры общего назначения по своему усмотрению, не заботясь о сохранении их исходных значений. После возврата в драйвер он восстановит содержимое тех регистров, которые нужны для продолжения работы.
Последней выполняемой командой подпрограммы должна быть retf. Если подпрограмма использует стек для своих нужд, то к моменту выполнения retf должно быть восстановлено исходное (на момент входа в подпрограмму) состояние стека. Последнее слово стека содержит сегмент оперативной памяти, в котором расположен драйвер, а предпоследнее – адрес возврата, относящийся к этому сегменту.
Замечание
Повторный вызов подпрограммы будет возможен только после того, как она выполнит команду retf и драйвер завершит обработку предыдущего события. Это упрощает структуру подпрограммы, но ограничивает время, в течение которого она может выполняться.