Главная » Ассемблер, Железо » Функции DOS, предназначенные для работы с мышью

0

Универсальный драйвер мыши был предложен фирмой Microsoft. Он обеспечивает унифицированный интерфейс для работы с манипуляторами «мышь» или «трекбол» любого типа. Драйвер позволяет выполнять свыше 40 различных функций. Все фирмы- из готовите л и манипуляторов делают драйверы для своих устройств совместимыми с драйвером Microsoft, но каждая фирма вносит в них усовершенствования, создавая программистам множество ненужных проблем. Кроме того, стандартные функции мыши в MS-DOS рассчитаны только на текстовые и устаревшие 16-цветные графические режимы: попытка обращения к ним при использовании видеорежимов SVGA, HiColor и TrueColor приводит в лучшем случае к «глюкам» на экране монитора, в худшем — к зависанию системы.

В отличие от устройств других типов, аппаратный интерфейс мыши стандартизирован гораздо лучше, чем программный, и работать с мышью желательно через аппаратуру. Использовать прерывания DOS необходимо только для устройств, не имеющих простого общепринятого интерфейса (например, подключенных через инфракрасный порт или шину USB). Мы не будем подробно рассматривать все функции MS-DOS, предназначенные для обслуживания мыши (см. [3, 10]), поскольку большая часть из них не работает должным образом в современных видеорежимах. Ниже перечислены только те функции, которые не взаимодействуют напрямую с видеоконтроллером и потому особых проблем не вызывают. При этом программист должен сам написать подпрограммы, обеспечивающие отображение курсора мыши и перемещение его по экрану в конкретном видеорежиме.

Прерывание 33h, функция OOOOh: проверить наличие драйвера мыши и произвести сброс

Функция проверяет, загружен ли драйвер мыши в память компьютера, и, если драйвер загружен, выполняет общий сброс аппаратного и программного обеспечения мыши.

При вызове функции в регистр АХ должен быть помещен код 0.

После выполнения функции в случае отсутствия драйвера в регистре АХ будет возвращено значение 0. При наличии драйвера мыши в регистрах будет размещена следующая информация:

•           в АХ — код FFFFh;

•       в ВХ — код типа мыши (FFFFh — стандартная мышь Microsoft с двумя клавишами, любое другое значение — мышь нестандартная).

Параметры драйвера после сброса следующие:

•            координаты курсора установлены на центр экрана;

•           для отображения назначена видеостраница 0;

•       курсор находится в невидимом состоянии, то есть не отображается на экране;

•       курсору придана форма, действующая по умолчанию (в текстовых режимах — форма негативного прямоугольника, в графических режимах — форма стрелки);

•       работа пользовательского обработчика сообщений мыши заблокирована;

•           эмуляция светового пера разрешена;

•       установлена чувствительность мыши к перемещению по горизонтали 8:8 микки на пиксел, по вертикали — 16:8 микки на пиксел;

•            порог удвоения скорости равен 64 микки/с;

•           область отображения курсора мыши охватывает весь экран.

Из всего перечисленного выше наиболее важным является то, что после сброса курсор на экран не отображается. При работе в текстовом режиме нужно вызвать функцию OOOlh, чтобы курсор появился на экране. В современных графических режимах курсор средствами драйвера не отображается или отображается неправильно, поэтому с точки зрения драйвера он должен оставаться скрытым, то есть функцию OOOlh вызывать нельзя.

Прерывание 33h, функция 0001 h: отобразить курсор мыши на экране

Функция OOOlh делает курсор мыши видимым.

При вызове функции в регистр АХ должен быть помещен код OOOlh.

Никаких выходных параметров функция не имеет.

Применять данную функцию можно только в текстовых режимах.

Прерывание 33h, функция 0002h: убрать курсор мыши с экрана

Функция 0002h делает курсор мыши невидимым.

При вызове функции в регистр АХ должен быть помещен код 0002h.

Выходных параметров функция не имеет.

Как в текстовых, так и в графических режимах курсор накладывается поверх изображения, искажая его, поэтому перед выводом курсора драйвер запоминает участок изображения под ним. Функция 0002h осуществляет стирание курсора и восстановление изображения. Данную функцию необходимо использовать перед перерисовкой изображения на экране или при перемещении курсора в другую позицию. Поскольку в современных графических режимах функция OOOlh не работает, то не применяется и обратная ей функция 0002И.

Прерывание 33h, функция 0003И: получить информацию о положении курсора и состоянии кнопок мыши

Функция 0003h позволяет определить текущее состояние кнопок мыши и текущее положение курсора.

При вызове функции в регистр АХ должен быть помещен код 0003И. После выполнения функции в регистрах будет возвращена следующая информация:

•       в ВХ — текущее состояние кнопок мыши (бит 0 — состояние левой кнопки, бит 1 — состояние правой кнопки, бит 2 — состояние средней кнопки);

•            в СХ — горизонтальная координата курсора (X);

•            в ОХ — вертикальная координата курсора (Y).

Если кнопка мыши нажата, значение соответствующего бита регистра ВХ будет установлено в 1, если отпущена — в 0. Серьезный недостаток данной функции заключается в том, что невозможно определить, была ли нажата (отпущена) кнопка мыши в текущей позиции курсора, или это произошло ранее в другом месте экрана. Поэтому функция 0003h применяется только в графических видеорежимах — в подпрограмме, отвечающей за перемещение курсора по экрану. Для получения более точной информации о нажатиях и отпусканиях кнопок мыши используются функции 0005h и 0006h.

Прерывание 33h, функция 0004И: установить новое положение курсора

Функция 0004h позволяет изменить положение курсора на экране по команде из программы.

При вызове функции в регистры должна быть занесена следующая информация:

•           в АХ – код 0004h;

•           в СХ — горизонтальная координата курсора (X);

•            в DX — вертикальная координата курсора (Y). Выходных параметров функция не имеет.

Положение координаты задается в пикселах относительно левого верхнего угла экрана, причем предполагается, что ось Y направлена сверху вниз.

Прерывание 33h, функция 0005И: получить информацию о нажатиях кнопок мыши

Функция 0005h позволяет получить текущее состояние всех кнопок мыши, а также определить, была ли нажата заданная кнопка, сколько раз ее нажимали с момента последнего опроса, и в какой позиции экрана было осуществлено последнее нажатие. При вызове функции в регистры должна быть занесена следующая информация:

•           в АХ – код 0005h;

•       в BX — номер кнопки, которую требуется опросить (0 — правая кнопка, 1 — левая кнопка, 2 — средняя кнопка).

После выполнения функции в регистрах будет возвращена следующая информация:

•       в АХ — текущее состояние кнопок мыши (бит 0 — состояние левой кнопки, бит 1 — состояние правой кнопки, бит 2 — состояние средней кнопки);

•       в ВХ — число нажатий на указанную кнопку с момента последнего вызова данной функции для данной кнопки;

•       в СХ — горизонтальная координата курсора (X) в момент последнего нажатия указанной кнопки;

•       в DX — вертикальная координата курсора (Y) в момент последнего нажатия указанной кнопки.

Прерывание 33h, функция 0006h: получить информацию об отпусканиях кнопок мыши

Функция 0006И позволяет получить текущее состояние всех кнопок мыши, а также определить, имело ли место отпускание заданной кнопки, сколько раз ее отпускали с момента последнего опроса, и в какой позиции экрана было осуществлено последнее отпускание.

При вызове функции в регистры должна быть занесена следующая информация:

•            в АХ – кодОООбИ;

•       в ВХ — номер кнопки, которую требуется опросить (0 — правая кнопка, 1 — левая кнопка, 2 — средняя кнопка).

После выполнения функции в регистрах будет возвращена следующая информация:

•       в АХ — текущее состояние кнопок мыши (бит 0 — состояние левой кнопки, бит 1 — состояние правой кнопки, бит 2 — состояние средней кнопки);>

•       в ВХ — число отпусканий указанной кнопки с момента последнего вызова данной функции для данной кнопки;

•       в СХ — горизонтальная координата курсора (X) в момент последнего отпускания указанной кнопки;

•       в DX — вертикальная координата курсора (Y) в момент последнего отпускания указанной кнопки.

Прерывание 33h, функция 0007И: задать горизонтальный диапазон перемещения курсора

Функция 0007И служит для ограничения пределов горизонтального перемещения курсора.

При вызове функции в регистры должна быть занесена следующая информация:

•            в АХ — код0007И;

•            в СХ — координата левой границы перемещения курсора (Xmin);

•            в DX — координата правой границы перемещения курсора (Хтах). Выходных параметров функция не имеет.

Функция 0007И используется совместно с функцией для задания на экране рабочего окна, за пределы которого не должен выходить курсор мыши. В простейшем случае функция применяется, чтобы предотвратить уход части изображения графического курсора за границу экрана.

Прерывание 33h, функция 0008h: задать вертикальный диапазон перемещения курсора

Функция 0008h служит для ограничения пределов вертикального перемещения курсора.

При вызове функции в регистры должна быть занесена следующая информация:

•       в АХ – код 0008И;

•       в СХ — координата верхней границы перемещения курсора (Ymm);

•            в DX — координата нижней границы перемещения курсора (Y^). Выходных параметров функция не имеет.

Как и функция 0007И, данная функция чаще всего применяется, чтобы предотвратить уход части изображения курсора за границу экрана.

Прерывание 33h, функция OOOCh: задать подпрограмму пользователя обработчику прерывания мыши

Функция OOOCh позволяет пользователю установить собственный обработчик прерывания мыши.

При вызове функции в регистры должна быть занесена следующая информация:

•       в АХ – код OOOCh;

•       в СХ — маска условий вызова;

•       в ES: DI — дальний указатель на подключаемую подпрограмму пользователя.

Выходных параметров функция не имеет.

При вызове подпрограммы драйвер передает ей параметры через регистры. В регистрах будут размещены следующие значения:

•       в АХ — маска условий вызова;

•       в ВХ — текущее состояние кнопок мыши (бит 0 — состояние левой кнопки, бит 1 — состояние правой кнопки, бит 2 — состояние средней кнопки);

•       в СХ — горизонтальная координата курсора (X);

•       в DX — вертикальная координата курсора (Y);

•           в SI — горизонтальный отсчет (микки);

•           в DI — вертикальный отсчет (микки);

•           в DS — сегмент данных драйвера мыши.

Разряды маски условий вызова имеют следующее назначение (если разряд установлен в 1, то выполняется соответствующее действие):

•       бит 0 — вызывать подпрограмму пользователя в случае перемещения мыши;

•       бит 1 — вызывать подпрограмму пользователя при нажатии левой кнопки;

•       бит 2 — вызывать подпрограмму пользователя при отпускании левой кнопки;

•       бит 3 — вызывать подпрограмму пользователя при нажатии правой кнопки;

•       бит 4 — вызывать подпрограмму пользователя при отпускании правой кнопки;

•       бит 5 — вызывать подпрограмму пользователя при нажатии средней кнопки;

•       бит 6 — вызывать подпрограмму пользователя при отпускании средней кнопки;

•           биты 7-15 — зарезервированы.

Функция OOOCh очень полезна при работе в современных графических режимах — подпрограмма вывода курсора, подключенная к драйверу, может быть настроена на особенности конкретного видеорежима и даже на конкретный тип видеоконтроллера. Следовательно, при выводе курсора не будет возникать никаких побочных искажений изображения.

Прерывание 33h, функция OOOFh: изменить чувствительность мыши к перемещению

Функция OOOFh позволяет управлять чувствительностью мыши. При вызове функции в регистры должна быть занесена следующая информация:

•           в АХ — код OOOFh;

•       в СХ — число микки на 8 пикселов по горизонтали (по умолчанию 8);

•            в DX — число микки на 8 пикселов по вертикали (по умолчанию 16). Выходных параметров функция не имеет

Прерывание 33h, функция 0013h: задать порог удвоения скорости

Функция 0013h позволяет изменить порог удвоения скорости перемещения мыши. Если скорость перемещения мыши превышает заданный порог, то скорость перемещения курсора по экрану удваивается.

При вызове функции в регистры должна быть занесена следующая информация:

•           в АХ — код 0013h;

•       в DX — пороговая скорость в микки/с (по умолчанию равна 64 микки/с).

Выходных параметров функция не имеет.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии