Общее описание драйвера мыши
От манипулятора в компьютер поступает первичная информация, которая
не пригодна для непосредственного использования в прикладных задачах.
Предварительную обработку этой информации выполняет специальная программа
— драйвер. При перемещении мыши или при нажатии на одну из ее кнопок возникает
аппаратное прерывание, в результате которого приостанавливается выполнение
текущего процесса и происходит обращение к драйверу. Он обрабатывает поступившие
данные и сохраняет результат в своих внутренних переменных, после чего
может быть выполнена специальная прерывающая подпрограмма или завершена
работа драйвера и продолжено выполнение приостановленного процесса.
Подчеркнем, драйвер только фиксирует наступление события — нажатие на
одну из кнопок или перемещение мыши. Реагировать на само событие должна
прикладная задача или одна из компонент операционной системы. Если в данный
момент с мышью не работает ни одна задача, то событие останется не востребованным.
Поэтому наличие драйвера необходимое, но не достаточное условие для организации
взаимодействия с мышью.
Установка драйвера
Драйвер является резидентной, т. е. постоянно находящейся в памяти задачей.
В процессе загрузки DOS находит файл, содержащий эту задачу, помещает
его содержимое в оперативную память и выполняет первый запуск. При этом
драйвер настраивается на дальнейшую работу, после чего продолжается процесс
загрузки DOS.
Файл, содержащий драйвер, должен находиться в одном из каталогов жесткого
диска. Часто, но не всегда, он имеет имя mouse, а его тип может быть com
или sys. Тип влияет только на способ первоначальной установки драйвера
и не влияет на дальнейшую работу с ним. Если файл имеет тип com (например,
mouse.com), то его полная спецификация (путь поиска, имя и тип файла)
указывается в системном файле autoexec.bat. А если он имеет тип sys (например,
mouse.sys), то спецификация указывается в файле config.sys.
Обычно при продаже к мыши прилагается дискета, содержащая программу для
установки драйвера и текстовый файл (его имя readme, или нечто подобное),
с рекомендациями по установке. Чаще всего установка сводится к копированию
нужных файлов в один из каталогов жесткого диска и включения имени файла
драйвера в autoexec.bat ИЛИ config.sys.
Если по каким-то причинам у вас есть мышь без установочной дискеты,
попытайтесь использовать любой доступный драйвер, скорее всего вам это
удастся. Современные модели манипуляторов, как правило, соответствуют
стандарту Microsoft Mouse, поэтому обслуживать их могут все драйверы,
при разработке которых были учтены требования этого стандарта.
Основные функции драйвера выполняются независимо от вычислительной среды.
Поэтому Windows ЗХ может использовать установленный в DOS или свой собственный
драйвер, загружаемый вместе с системой. Windows 9X являются самостоятельными
операционными системами, не зависящими от DOS, поэтому они обязательно
загружают драйвер.
Доступ к драйверу
Если драйвер установлен, то при работе в среде DOS адрес его точки входа
хранится в векторе ззь. Поэтому для обращения к нему прикладные задачи
должны использовать командное прерывание int ззь. Предварительно в регистре
ах указывается код запрашиваемой функции, который может изменяться в пределах
от о до 24п. Если для выполнения функции нужны входные параметры, то их
значения передаются в регистрах общего назначения. В тех же регистрах
драйвер возвращает выходные параметры (запрашиваемые данные), если таковые
имеются.
Например, для приведения драйвера в первоначальное состояние (сброс или
инициализация), в задаче надо выполнить две следующие команды:
mov ах, 0 ; ах = код запроса, в данном случае 0
int 33h ; обращение к драйверу для исполнения запроса.
В результате внутренние переменные драйвера принимают те значения, которые
они имели при первоначальной загрузке. Мы еще раз вернемся к рассмотрению
данного запроса в следующем разделе.
Сводка функций драйвера. Основной набор функций, выполняемых всеми драйверами,
устоялся. Он описан, например, в разделе Mouse Support электронной справочной
системы Tech Help. Краткое описание функций, выполняемых конкретным драйвером,
как правило, находится на установочной дискете, прилагаемой к манипулятору.
В табл. 6.1 перечислены функции, входящие в основной набор. Указанные
в первом столбце таблицы коды являются шестнадцатеричными числами. Обратите
внимание на отсутствие кодов 11h, 12h, 1Ch, 22h
и 23h. Конкретный драйвер может выполнять дополнительные
функции, с этими или другими кодами. Однако они мало что добавляют к основному
набору, и дополнительные функции лучше не использовать, исходя из соображений
совместимости задачи с любыми моделями драйверов.
Таблица 6.1. Список основных функций драйвера мыши
Код |
Запрашиваемое
(исполняемое) действие |
00 |
Инициализация
драйвера (настройка на работу с мышью) |
*01* |
Включить (нарисовать
на экране) изображение курсора |
*02* |
Выключить (удалить с экрана) изображение курсора |
03 |
Опрос текущих координат курсора и состояния всех кнопок |
04 |
Установить текущие координаты курсора |
05 |
Опрос счетчика нажатий указанной кнопки и координат |
06 |
Опрос счетчика отпусканий указанной кнопки и координат |
07 |
Установить пределы перемещения курсора по горизонтали |
08 |
Установить пределы перемещения курсора по вертикали |
*09* |
Установить форму курсора в графическом режиме |
*0а* |
Установить форму курсора в текстовом режиме |
0b |
Определить расстояние последнего перемещения в mickeys |
0c |
Установить подпрограмму для обработки событий |
*0d* |
Разрешить эмуляцию светового пера |
*0е* |
Запретить эмуляцию светового пера |
0f |
Установить шаг курсора при медленном перемещении мыши |
*10* |
Установить область, в которой курсор не виден |
13 |
Установить шаг курсора при быстром перемещении мыши |
14 |
Изменить подпрограмму, установленную по коду Ос |
15 |
Получить размер внутреннего буфера состояния драйвера |
16 |
Сохранить в памяти внутренний буфер состояния драйвера |
17 |
Восстановить ранее сохраненный буфер состояния драйвера |
18 |
Установить адрес специальной подпрограммы обработки событий |
19 |
Определить адрес подпрограммы, установленной по коду 18 |
1а |
Установить чувствительность мыши в процентах (0—100) |
1Ь |
Определить чувствительность мыши в процентах (0—100) |
1d |
Установить страницу, на которой должен находиться курсор |
1е |
Определить страницу, на которой находится курсор |
1f |
Дезактивация драйвера (программное отключение от мыши) |
20 |
Восстановление работы дезактивированного драйвера |
21 |
Программный сброс драйвера (неполный аналог кода 00) |
24 |
Определить тип мыши, драйвера и используемый порт |
По назначению выполняемых действий функции, перечисленные в табл. 6.1.
можно разделить на несколько групп.
Управление курсором
При установке стандартных текстовых или графических режимов IBM драйвер
самостоятельно рисует, удаляет и перемещает указатель мыши, что существенно
упрощает структуру прикладных задач, работающих с мышью. Тем не менее,
задача должна иметь возможность влиять на выполнение драйвером указанных
действий. Для этого в базовый набор команд включено 9 функций, коды которых
в табл. 6.1 начинаются и заканчиваются символом "*".
Они позволяют задаче в нужные моменты времени включать и выключать курсор
и изменять его форму. По умолчанию драйвер выбирает изображение указателя
мыши (курсора) в зависимости от установленного видеорежима. В графических
режимах оно имеет форму наклоненной влево стрелки, а в текстовых — прямоугольника.
В текстовых режимах курсор перемещается не плавно, а скачками из одного
знакоместа в другое. Задача может задавать размер этого скачка при обычном
и быстром перемещении мыши.
Остается только сожалеть о том, что эти полезные функции нельзя использовать
при работе в графических режимах VESA. Как уже говорилось в предисловии
к разделу 6.1, драйвер не может определить характеристики этих режимов,
необходимые для построения изображения курсора.
Установочные команды
Наиболее важной функцией драйвера является увязка перемещений мыши с
позицией курсора на экране. При выполнении этой функции используются внутренние
переменные и счетчики позиций, которые должны иметь определенные значения.
Часть из них зависит от характеристик мыши и формируется при установке
или инициализации драйвера. Другая часть значений зависит от установленного
видеорежима, их должна определять задача.
Функции с кодами 00, 04, 07, 08, OFh, 13h, lAh, IBh,
21h позволяют изменять текущие настройки драйвера. С их помощью
задача может инициализировать драйвер, установить пределы и скорость перемещения
курсора, изменить чувствительность драйвера к перемещениям мыши. Подробное
описание этих функций приведено в следующем разделе.
Информационные команды
Для определения текущих координат мыши и состояния ее кнопок предназначены
функции с кодами оз, 05, об и овь. Примеры использования этих функций
мы рассмотрим при описании работы с мышью в режиме опроса ее состояния.
Обслуживание прерываний
Альтернативой режиму опроса состояния является режим прерываний, при
котором задача получает информацию от драйвера только при наступлении
конкретного события — изменения позиции мыши или состояния ее кнопок.
В теле задачи должны быть предусмотрены подпрограммы, выполняющие действия,
связанные с данным событием (или событиями), например перемещение рисунка
курсора на новое место. С помощью функций с кодами ось,
I4h, I8h и I9h задача может сообщить
драйверу адрес прерывающей подпрограммы и событие, на которое она реагирует.
Примеры использования этих функций мы рассмотрим при описании работы с
мышью в режиме прерываний.
Специальные функции
Пять команд с кодами I5h, I6h, I7h, iFh и 20h выполняют
специфические действия, которые нужны только в особых случаях. В первую
очередь к ним относится смена драйвера при выполнении задачи (как правило,
системной, а не прикладной). Простой замены содержимого вектора 33h в
этом случае недостаточно, поскольку при первоначальной установке драйвера
настраивается контроллер прерываний и изменить эти настройки можно только
с помощью специальной функции iFh, которая выполняет полную дезактивацию
драйвера и возвращает в регистрах es:bx (возможно
es:dx) содержимое вектора 33h.
Дезактивированный драйвер остается в оперативной памяти. После этого задача
может устанавливать свой драйвер или использовать вектор ззь для других
целей. Перед выходом из задачи работа драйвера восстанавливается с помощью
функции 20Ь, которая не требует задания входных
параметров.
В некоторых случаях может понадобиться сохранить текущие настройки драйвера
перед их изменением и спустя некоторое время восстановить первоначальные
значения. Все внутренние переменные и счетчики хранятся в специальном
буфере состояния драйвера. Порядок действий при сохранении и восстановлении
содержимого этого буфера следующий. С помощью функции 15Ь задача определяет
размер буфера состояния, выделяет соответствующее пространство оперативной
памяти и помещает адрес его начала в регистры es:dx. После этого она запрашивает
выполнение функции 1бb, которая сохраняет текущее состояние. Теперь можно
изменять текущие установки драйвера мыши.
Для восстановления исходного состояния адрес буфера, в котором оно записано,
надо поместить в регистры es:dx и обратиться к драйверу с запросом 17b.
Такова общая характеристика базового набора функций, выполняемых драйвером
мыши. Теперь мы переходим к рассмотрению способов программирования работы
с ним в режимах VESA.
|