Аппаратное обеспечение персонального компьютера© Александр Фролов, Григорий ФроловТом 33, М.: Диалог-МИФИ, 1997, 304 стр. Прерывание для обслуживания мышиДрайвер мыши, независимо от того, реализован он через устанавливаемый драйвер или резидентную программу, устанавливает в операционной системе MS-DOS обработчик прерывания INT 33h. Этот обработчик выполняет все операции, связанные с обслуживанием мыши: · сброс мыши и установка драйвера в исходное состояние; · включение и выключение курсора мыши; · установка курсора в определенное место экрана; · определение текущих координат курсора и текущего состояния клавиш; · определение координат курсора и состояния клавиш в момент нажатия на клавишу и в момент отпускания клавиши; · определение области на экране, в пределах которой может перемещаться курсор; · определение области на экране, в пределах которой курсор не будет виден; · определение формы графического и текстового курсоров; · определение величины перемещения мыши в сотых долях дюйма; · подключение к драйверу процедуры, определенной в программе, получающей управление при нажатии на заданную клавишу или при перемещении мыши; · запоминание и восстановление состояния драйвера; · управление эмуляцией светового пера; · управление скоростью движения курсора; · указание или определение используемой страницы видеопамяти; · управление драйвером мыши Приведем подробное описание всех функций прерывния INT 33h, используемых при работе с мышью. Инициализация мышиЭта функция с кодом 00h выполняет аппаратный сброс мыши и программную установку драйвера мыши в начальное состояние. Заметим, что с помощью функции 21h можно выполнить установку драйвера в исходное состояние, не выполняя аппаратного сброса мыши.
Если на выходе из прерывания регистр AX содержит значение 0000h, значит драйвер мыши не установлен. Если же содержимое этого регистра равно 0FFFFh, драйвер имеется и вы можете использовать другие функции для работы с мышью. В регистре BX возвращается количество клавиш мыши:
При установке драйвера мыши в исходное состояние для программ, работающих в текстовом режиме, выполняются следующие действия: · курсор перемещается в центр экрана и гасится; · разрешается перемещение курсора по всей поверхности экрана, причем на экране отсутствуют зоны, в которых курсор является невидимым; · устанавливается режим отображения курсора - инвертирование атрибута символа, на который указывает курсор; · для изображения курсора выбирается нулевая страница видеопамяти; · разрешается эмуляция светового пера (хотя это вам едва ли пригодится); · устанавливается начальная скорость перемещения курсора Включить курсор мышиФункция 01h позволяет включать или выключать курсор мыши:
Для управления видимостью курсора драйвер мыши использует внутренний счетчик. Этот счетчик можно увеличивать, вызывая функцию 01h прерывания INT 33h, или уменьшать при помощи функции 02h этого же прерывания. После инициализации драйвера функцией 00h счетчик устанавливается равным -1. После первого вызова функции 01h счетчик становится равным 0. При этом курсор мыши становится видимым, его можно перемещать по экрану. Если счетчик равен 0, то следующие вызовы функции 01h игнорируются драйвером. Для того, чтобы погасить курсор, используйте функцию 02h, которая при вызове уменьшает каждый раз содержимое счетчика на единицу. Функция 01h сбрасывает область, в которой курсор не отображается (если такая область была ранее установлена функцией 10h). Выключить курсор мышиФункция 02h уменьшает на единицу счетчик видимости курсора. Если содержимое счетчика становится равным -1, изображение курсора пропадает с экрана.
Если ваша программа применяет для вывода на экран метод прямой записи в видеопамять, перед обновлением содержимого экрана необходимо погасить курсор, а после завершения обновления - высветить его опять. Это связано с тем, что драйвер мыши запоминает старое значение атрибута символа, на который указывал курсор до обновления содержимого видеопамяти. Вы изменили атрибут, записав новое значение непосредственно в экранную память. Теперь, если установить курсор мыши на другой символ, изображение старого символа будет испорчено - появится прямоугольник (как бы еще одно изображение курсора мыши). Программа MSCURSORПриведем исходный текст программы MSCURSOR (листинг 3.1), демонстрирующую применение описанных выше функций. Программа инициализирует мышь, делает видимым курсор мыши и прячет курсор после того как пользователь нажмет любую клавишу. Листинг 3.1. Файл mscursor\mscursor.c // ===================================================== // Включение и выключение курсора мыши // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <dos.h> #include <stdio.h> #include <conio.h> int main(void) { int nButtons; union REGS rg; printf("MSCURSOR, (c) A. Frolov, 1997\n"); // Инициализируем мышь rg.x.ax = 0; int86(0x33, &rg, &rg); if(rg.x.bx == 0) { printf("Mouse not found"); return -1; } // Сохраняем количество клавиш nButtons = rg.x.bx; printf("Mouse type: "); switch (nButtons) { case 2: { printf("2-button mouse\n"); break; } case 3: { printf("2-button Mouse Systems\n"); break; } case 0: { printf("Unknown type %d\n", nButtons); break; } default: { printf("Unknown type %d\n", nButtons); break; } } // Включаем курсор и ожидаем, пока пользователь // нажмет на клавишу rg.x.ax = 1; int86(0x33, &rg, &rg); printf("Mouse cursor on. Press any key\n"); getch(); // Выключаем курсор rg.x.ax = 2; int86(0x33, &rg, &rg); printf("Mouse cursor off. Press any key\n"); getch(); return 0; } Определить положение курсораФункция 03h возвращает текущие координаты курсора мыши и состояние клавиш.
В зависимости от того, была ли нажата какая-либо клавиша мыши в момент вызова функции, в регистре BX могут быть установлены следующие флаги:
Для графических режимов координаты располагаются в различных диапазонах, в зависимости от текущего режима видеоадаптера:
Программы, работающие в текстовом режиме, должны разделить полученные координаты на 8 (как координату X, так и координату Y). Программа MSGCURSПриведем исходный текст программы MSGCURS (листинг 3.2), которая запрашивает номер режима видеоадаптера, устанавливает его и динамически отображает координаты курсора, а также состояние клавиш мыши. После завершения работы программа восстанавливает первоначальный режим видеоадаптера. Листинг 3.2. Файл msgcurs\msgcurs.c // ===================================================== // Включение и выключение курсора мыши // в разных видеорежимах // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <dos.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> union REGS rg; int main(void) { int i; unsigned old_videomode, new_videomode; char buf[20], *bufptr; int nButtons; // Определяем текущий видеорежим rg.x.ax = 0x0f00; int86(0x10, &rg, &rg); old_videomode = rg.h.al; // Устанавливаем новый видеорежим buf[0] = 10; printf("Enter new video mode: "); bufptr = cgets(buf); // Преобразуем введенное число к формату int new_videomode = atoi(bufptr); rg.h.ah = 0; rg.h.al = new_videomode; int86(0x10, &rg, &rg); // Инициализируем мышь rg.x.ax = 0; int86(0x33, &rg, &rg); if(rg.x.bx == 0) { printf("Mouse not found\n"); return -1; } // Сохраняем количество клавиш nButtons = rg.x.bx; printf("Mouse type: %d\n", nButtons); // Включаем курсор rg.x.ax = 1; int86(0x33, &rg, &rg); printf("Mouse cursor on. Press any key\n"); getch(); while(!kbhit()) { rg.x.ax = 3; int86(0x33, &rg, &rg); printf("%2d x:%5d y:%5d", rg.x.bx, rg.x.cx, rg.x.dx); for(i=0; i<18; i++) printf("\b"); } getch(); // Выключаем курсор rg.x.ax = 2; int86(0x33, &rg, &rg); // Восстанавливаем режим видеоадаптера rg.h.ah = 0; rg.h.al = old_videomode; int86(0x10, &rg, &rg); return 0; } Заметим, что использование функции 03h - не самый лучший способ работы с мышью. Программа должна постоянно следить за координатами курсора или за состоянием клавиш. Это может привести к непроизводительным затратам процессорного времени на опрос состояния. Позже мы рассмотрим другие способы определения состояния мыши. Установить курсорОбычно курсор мыши устанавливает не программа, а пользователь. Однако с помощью функции 04h программа тоже может установить курсор в заданную позицию.
Для текстового режима устанавливаемые номера строки и столбца должны быть умножены на 8. В том случае, когда программа пытается установить курсор в область, где курсор невидим (эта область задается функцией 10h), то она сможет это сделать. Курсор при этом исчезнет с экрана, что не всегда желательно. Если область для перемещения курсора была ограничена при помощи функций 07h или 08h, то курсор будет вести себя следущим образом. При попытке установить курсор за границу области ограничения, он будет установлен в точку, которая находится внутри границы на минимальном расстоянии от точки, заданной при вызове функции. Определить положение курсора при нажатии клавиши
В зависимости от того, была ли нажата какая-либо клавиша мыши в момент вызова функции, в регистре AX могут быть установлены следующие флаги:
В отличие от функции 03h эта функция возвращает программе не текущее состояние мыши, а запомненное в момент последнего нажатия на клавишу, заранее определенную при вызове функции. Она также возвращает количество нажатий на заданную клавишу, которое вы можете использовать для обнаружения двойных щелчков. Определить положение курсора при отпускании клавишиФункция 06h возвращает программе состояние мыши, запомненное в момент отпускания клавиши, которая была заранее определена при вызове функции. Она также возвращает количество отпусканий заданной клавиши.
Формат регистра AX, определяющий состояние клавиш мыши, такой же как и для функции 05h. Задать диапазон движения курсора по горизонталиФункция 07h позволяет ограничить диапазон перемещений курсора мыши по горизонтали:
Задать диапазон движения курсора по вертикалиФункция 08h позволяет ограничить диапазон перемещений курсора мыши по вертикали.
Задать форму курсора в графическом режимеС помощью функции 09h программа, работающая в графическом режиме, может изменить форму курсора мыши и положение точки внутри изображения курсора, координаты которой используются в качестве координат курсора остальными функциями.
Регистры ES:DX указывают на область памяти размером 64 байт. Эта область состоит из двух массивов длиной по 32 байт. Первый массив представляет собой логическую маску размером 16х16 бит, которая накладывается на участок видеопамяти с использованием логической операции “И”. Второй массив - тоже маска размером 16х16 бит, но она накладывается с использованием логической операции “Исключающее ИЛИ”, инвертируя отдельные точки изображения. Номера позиции и строки точки-указателя, устанавливаемые по умолчанию, равны 0 (BX=CX=0). Это соответствует верхней левой точке в изображении курсора. Значения BX=CX=15 соответствуют нижней правой точке. Программа MSGFORMМы подготовили исходный текст программы MSGFORM, изменяющий форму курсора в графическом режиме (листинг 3.3). Листинг 3.3. Файл msgform\msgform.c // ===================================================== // Изменение формы курсора в графическом режиме // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <dos.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> union REGS reg; void ms_gform(int xt, int yt, char _far *form); unsigned char form[64] = { // Массив маски по "И" 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, // Массив маски по "Исключающее ИЛИ" 127, 254, 127, 254, 127, 254, 127, 254, 127, 254, 127, 254, 127, 254, 0, 0, 0, 0, 127, 254, 127, 254, 127, 254, 127, 254, 127, 254, 127, 254, 127, 254 }; int main(void) { unsigned old_videomode, new_videomode; char buf[20], *bufptr; // Определяем текущий видеорежим reg.x.ax = 0x0f00; int86(0x10, ®, ®); old_videomode = reg.h.al; // Устанавливаем новый видеорежим buf[0] = 10; printf("Enter new video mode: "); bufptr = cgets(buf); new_videomode = atoi(bufptr); reg.h.ah = 0; reg.h.al = new_videomode; int86(0x10, ®, ®); // Инициализируем мышь reg.x.ax = 0; int86(0x33, ®, ®); if(reg.x.bx == 0) { printf("Mouse not found\n"); return -1; } // Задаем новую форму для курсора мыши ms_gform(0,0, &form[0]); // Включаем курсор reg.x.ax = 1; int86(0x33, ®, ®); getch(); reg.h.ah = 0; reg.h.al = old_videomode; int86(0x10, ®, ®); return 0; } void ms_gform(int xt, int yt, char _far *form) { struct SREGS segregs; reg.x.ax = 9; reg.x.bx = xt; reg.x.cx = yt; reg.x.dx = FP_OFF(form); segregs.es = FP_SEG(form); int86x(0x33,®,®,&segregs); } Задать форму курсора в текстовом режимеС помощью функции 0Ah программа может изменять форму курсора мыши в текстовом режиме.
В зависимости от содержимого регистра BX драйвер мыши использует курсор, определяемый аппаратными средствами, либо курсор, определяемый программно. По умолчанию используется “программный курсор”, который отображается в виде символа с инвертированным значением атрибута. Курсор, сформированный аппаратными средствами, выглядит аналогично обычному текстовому курсору, его форма - прямоугольник. Размер этого прямоугольника можно задавать при помощи регистров CX и DX. Для курсора, определяемого программно, вначале выполняется операция логического “И” над содержимым видеопамяти в том месте, куда указывает курсор, и маской экрана. Затем выполняется операция “Исключающее ИЛИ” с маской курсора. Младший байт масок соответствует коду ASCII символа, старший - это байт атрибута символа. Значения, используемые по умолчанию - BX=7700h, CX=FFFFh. Если вам надо изменить цвет курсора, не меняя его форму, задайте CX=00FFh, BX=xx00h, где xx определяет цвет (смотри описание формата байта атрибутов в 21 томе «Библиотеки системного программиста», который называется «Программирование видеоадаптеров»). Программа MSTFORMПриведем исходный текст программы MSTFORM (листинг 3.4), создающую курсор в виде вертикальной стрелки, направленной вверх, на синем фоне. Листинг 3.4. Файл mstform\mstform.c // ===================================================== // Изменение формы курсора в текстовом режиме // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <dos.h> #include <stdio.h> #include <conio.h> union REGS reg; void ms_tform(int type, int mask1, int mask2); int main(void) { // Инициализируем мышь reg.x.ax = 0; int86(0x33, ®, ®); if(reg.x.bx == 0) { printf("Mouse not found\n"); return -1; } // Задаем новую форму для курсора мыши ms_tform(0, 0, 0x1418); // Включаем курсор reg.x.ax = 1; int86(0x33, ®, ®); getch(); return 0; } void ms_tform(int type, int mask1, int mask2) { reg.x.ax = 0xA; reg.x.bx = type; reg.x.cx = mask1; reg.x.dx = mask2; int86(0x33,®,®); } Определить содержимое счетчиков перемещенияФункция 0Bh позволяет определить относительное перемещение мыши с момента последнего вызова этой функции. Результат возвращается в указанных выше регистрах. Для измерения перемещения используется единица mickey - “мики”. Один мик соответствует 0.005 дюйма (то есть 1/200 дюйма).
Отрицательные значения перемещения означают движение влево и вверх, положительные - вправо и вниз. Для преобразования миков в пикселы, соответствующие точкам экрана, можно использовать функцию 1Bh, которая будет описана позже. Установить драйвер событийФункция 0Ch позволяет программе создать свой собственный драйвер (обработчик) событий, связанных с перемещением мыши, а также с нажатием или отпусканием клавиш мыши.
Биты маски вызова, передаваемой функции в регистре CX, определяют условие вызова драйвера событий:
Если записать в регистр CX значение 7Fh, драйвер будет вызываться при возникновении любого события, а если 00h – драйвер будет отключен. Адрес процедуры драйвера передается при вызове функции в регистровой паре ES:DX. Драйвер должен быть оформлен в виде процедуры типа FAR, завершающейся командой дальнего возврата RETF. Когда драйвер получает управление, в регистрах процессора содержатся следующие значения:
Так как регистр DS при вызове драйвера событий содержит сегмент данных драйвера мыши, ваш драйвер событий должен позаботиться о правильной установке этого регистра. Однако драйвер событий не обязан сохранять и восстанавливать содержимое регистра DS и других регистров процессора. Отметим, что если вам необходимо отключить драйвер, выполните повторный вызов функции 0Ch, записав в регистр CX нулевое значение. Если ваша программа, устанавливающая собственный драйвер событий, завершает свою работу и передает управление MS-DOS, предварительно она обязательно должна отключить драйвер событий. Составление программы драйвера событий имеет некоторые особенности. Драйвер событий вызывается не из программы пользователя, а из драйвера мыши. При этом сегментный регистр DS будет указывать на сегмент данных драйвера мыши, а не на сегмент данных вашей программы. Драйвер событий может также организовать очередь событий, записывая в эту очередь состояние мыши на момент появления события и время появления события. Прикладная программа будет затем извлекать события из очереди и анализировать их. Программа MSDRIVERПрограмма MSDRIVER иллюстрирует способ работы с драйвером событий. Исходный текст драйвера событий, составленный на языке ассемблера, представлен в листинге 3.5. Листинг 3.5. Файл msdriver\handler.asm ;** ;.Name ms_handl ;.Title Драйвер событий ; ;.Descr Драйвер событий вызывается драйвером мыши, ; когда происходит какое-нибудь событие из числа ; заданных при установке драйвера событий. ; Функция не должна вызываться из программы ; пользователя, ее вызывает только драйвер мыши. ; ;.Proto void far ms_handl(void); ; ;.Params Не используются ;** DOSSEG DGROUP GROUP _DATA _DATA SEGMENT WORD PUBLIC 'DATA' _DATA ENDS _TEXT SEGMENT WORD PUBLIC 'CODE' ASSUME cs:_TEXT, ds:DGROUP, ss:DGROUP ; Флаг вызова драйвера событий extrn _ms_flag:word ; Внешние переменные для записи содержимого регистров extrn _ms_bx:word extrn _ms_cx:word extrn _ms_dx:word extrn _ms_si:word extrn _ms_di:word extrn _ms_ds:word public _ms_handl _ms_handl proc far mov _ms_ds, ds ; Так как на входе в драйвер событий регистр DS указывает на ; сегмент данных драйвера мыши, устанавливаем его на сегмент ; данных программы; push ax mov ax, DGROUP mov ds, ax pop ax mov _ms_bx, bx mov _ms_cx, cx mov _ms_dx, dx mov _ms_si, si mov _ms_di, di ; Устанавливаем флаг вызова драйвера в 1, сигнализируя ; программе о том, что произошло событие. mov _ms_flag, 1 ret _ms_handl endp _TEXT ENDS END При вызове этот драйвер вызове устанавливает глобальную переменную _ms_flag в единицу, затем переписывает содержимое всех нужных регистров в соответствующие глобальные переменные. Программа, установив драйвер событий и сбросив флаг _ms_flag, может выполнять какие-либо действия (например, вывод на экран движущегося изображения), постоянно проверяя флаг _ms_flag. Как только произойдет какое-либо событие (нажатие или отпускание клавиши мыши, перемещение мыши) драйвер событий установит флаг в единицу. Программа при этом может узнать состояние мыши, прочитав содержимое глобальных переменных _ms_bx, _ms_dx, и т.д. Исходный текст программы MSDRIVER представлен в листинге 3.6. Листинг 3.6. Файл msdriver\msdriver.с // ===================================================== // Работа с драйвером событий // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ===================================================== #include <dos.h> #include <stdio.h> #include <conio.h> union REGS reg; struct SREGS segregs; extern void far MS_HANDL(void); void ms_seth(int mask, void (far *hand)()); // Флаг драйвера событий. При вызове драйвер событий // запишет в эту переменную значение 1 unsigned MS_FLAG; // Область для содержимого регистров на входе // в драйвер событий. unsigned MS_BX; unsigned MS_CX; unsigned MS_DX; unsigned MS_SI; unsigned MS_DI; unsigned MS_DS; int main (void) { MS_FLAG=0; // Инициализируем мышь reg.x.ax = 0; int86(0x33, ®, ®); if(reg.x.bx == 0) { printf("Mouse not found\n"); return -1; } // Подключаем драйвер событий, устанавливаем маску таким // образом, чтобы драйвер вызывался при нажатии на левую // или правую клавиши мыши ms_seth(2 | 8, MS_HANDL); // Включаем курсор reg.x.ax = 1; int86(0x33, ®, ®); // Ожидаем вызова драйвера событий. for(;;) { if(MS_FLAG) { printf("\nRegisters on driver entry:" "\nms_bx: %0X" "\nms_cx: %0X" "\nms_dx: %0X" "\nms_si: %0X" "\nms_di: %0X" "\nms_ds: %0X", MS_BX, MS_CX, MS_DX, MS_SI, MS_DI, MS_DS); printf("\nPress any key..."); getch(); return 0; } } } void ms_seth(int mask, void (far *hand)()) { reg.x.ax = 0x14; reg.x.cx = mask; reg.x.dx = FP_OFF(hand); segregs.es = FP_SEG(hand); int86x(0x33,®,®,&segregs); } Включить эмуляцию светового пераСветовое перо теперь можно увидеть разве лишь в музее. Однако вы можете заменить световое перо на мышь, если ваша программа использует световое перо (например, она написана на языке Бейсик и вызывает функцию PEN). Для включения эмуляции светового пера вы можете воспользоваться функцией 0Dh:
После включения режима эмуляции драйвер запоминает координаты курсора в момент, когда пользователь нажимает на клавиши мыши. Эти координаты могут быть впоследствии считаны функцией PEN или функцией 04h прерывания INT 10h, предназначенной для работы со световым пером. Выключить эмуляцию светового пераФункция 0Eh выключает режим эмуляции светового пера.
Задать скорость перемещения курсора мышиФункция 0Fh определяет чуствительность мыши к перемещению по поверхности стола, то есть устанавливает соответствие между величиной перемещения мыши по столу и величиной перемещения курсора мыши по экрану.
При инициализации драйвера мыши используются следующие значения: CX=8, DX=16. Установить область исключения для курсораФункция позволяет задать на экране прямоугольную область, в которой автоматически выключается изображение курсора мыши - область исключения. Эта область отменяется функциями 01h (включить курсор мыши) и 00h (инициализация).
Оператор может поместить курсор мыши в область исключения, при этом изображение курсора пропадет. Основное назначение этой функции - предоставить программе возможность изменять содержимое области экрана, не выключая изображение курсора. Недостаток наличия области исключения – пользователь может потерять курсор мыши, если он случайно окажется в такой области. Задать увеличенный графический курсорФункция 12h позволяет задать увеличенный по размеру курсор мыши, но она определена только для мыши системы PC MOUSE.
Определить порог удвоения скоростиЕсли вы перемещаете мышь со скоростью, превышающей порог удвоения, заданный функцией 13h, аппаратура мыши удваивает величину перемещения. Таким образом, используя медленное перемещение мыши, вы можете точно устанавливать курсор на требуемый элемент изображения. Если вам необходимо переместить курсор на значительное расстояние по экрану, вы можете увеличить скорость перемещения мыши. Формат вызова функции 13h приведен ниже:
При инициализации устанавливается значение порога, равное 64 микам в секунду (1/3 дюйма в секунду). Если вам надо установить это значение, вы можете при вызове функции 13h задать DX=0. Заменить драйвер событийФункция 14h аналогична функции 0Ch, однако ее основное назначение - временная замена драйвера событий. Например, подпрограмма в начале своей работы может установить свой драйвер событий, а перед завершением - активизировать драйвер, использовавшийся ранее.
Определить размер буфера состояния драйвераЕсли вам требуется временно сохранить состояние драйвера мыши, а затем восстановить его, вы можете воспользоваться специально предназначенными для этого функциями 16h и 17h. Для этих функций требуется буфер, в котором будет храниться состояние драйвера. Размер буфера можно определить с помощью функции 15h.
Когда может потребоваться запоминание и восстановление состояния драйвера? Например, при использовании мыши резидентными (TSR) программами желательно сохранить состояние драйвера перед началом работы TSR-программы и восстановить его перед завершением работы TSR-программы. Сохранить состояние драйвераФункция 16h позволяет записать состояние драйвера в буфер, размер которого должен быть определен с помощью функции 15h.
Восстановить состояние драйвераФункция 17h позволяет восстановить состояние драйвера из буфера, в который оно было записано при помощи функции 16h.
Установить альтернативный драйвер событийФункция 18h предназначена для установки альтернативного драйвера событий:
По сравнению с функцией 0Ch эта функция обеспечивает дополнительные возможности: · проверка состояния клавиш <Shift>, <Control>, <Alt> во время нажатия на клавиши мыши; · возможность одновременной установки до трех драйверов событий, каждый из которых использует свою маску событий, задаваемых в регистре CX. При попытке установить два драйвера с одной и той же маской событий функция возвращает в регистре AX код ошибки FFFFh. В этом случае вы можете использовать функцию 19h для получения адреса предыдущего установленного драйвера событий, отключить его и повторить попытку подключения своего драйвера. Функция 18h может применяться для отключения драйвера событий, если в регистрах ES:DX указать его адрес и при этом задать в регистре CX значение маски, равное 0. Получить адрес альтернативного драйвера событийФункция 19h предназначена для получения адреса драйвера событий с заданной маской событий. Получив адрес, вы можете установить новый драйвер, использующий эту же маску.
Установить чувствительность мышиФункция 1Ah является комбинацией функций 0Fh и 13h. Она позволяет одновременно устанавливать чувствительность мыши и порог удвоения скорости.
Определить чувствительность мышиФункция 1Bh позволяет определить текущие значения для чувствительности мыши и порога удвоения.
Установить частоту прерываний для Inport MouseМышь периодически вырабатывает сигнал прерывания, по которому драйвер считывает текущее состояние мыши. С помощью функции 1Ch вы можете изменять частоту появления прерываний, но только для мыши системы Inport Mouse (тип мыши нетрудно определить с помощью функции 24h).
Чем больше частота прерываний, тем больше точность определения состояния мыши. Установить номер страницы видеопамятиФункция 1Dh задает номер страницы видеопамяти, на которой будет отображаться курсор мыши. По умолчанию для отображения используется страница 0.
Определить номер страницы видеопамятиФункция 1Eh возвращает номер страницы видеопамяти, на которой в настоящее время отображается курсор мыши.
Отключить драйвер мышиПосле вызова функции 1Fh драйвер мыши полностью отключается. Вектор прерывания INT 33h остается определенным, однако теперь выполняется только одна функция прерывания INT 33h - функция 21h (программный сброс мыши).
Функцию 1Fh удобно использовать для временной замены драйвера на собственную систему обслуживания мыши. Сначала вы отключаете драйвер функцией 1Fh, запоминая адрес предыдущего драйвера, возвращаемого в регистрах ES:DX. Затем устанавливаете собственную систему обслуживания мыши, а после ее использования - восстанавливаете значение этого адреса. Восстановить драйвер мышиФункция 20h восстанавливает связь между мышью и драйвером, отключенную вызовом функции 1Fh.
Сбросить драйвер мышиФункция 21h аналогична функции 00h, но она не выполняет аппаратный сброс оборудования мыши.
Определить тип мышиФункция 24h дает информацию о типе используемой мыши, версии драйвера мыши и об используемом номере прерывания.
|