Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Прерывание для обслуживания мышиСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
(слайд №59)
Для варианта №3, Лабораторной работы №2 – Определить наличие, тип установленного манипулятора «мышь» и написать программу для считывания данных с этого устройства, например, сообщать пользователю о наличии данных.
Драйвер мыши устанавливает в операционной системе MS-DOS обработчик прерывания INT 33h. Этот обработчик выполняет все операции, связанные с обслуживанием мыши:
Приведем подробное описание всех функций прерывния INT 33h, используемых при работе с мышью.
Инициализация мыши Эта функция с кодом 00h выполняет аппаратный сброс мыши и программную установку драйвера мыши в начальное состояние.
Если на выходе из прерывания регистр AX содержит значение 0000h, значит драйвер мыши не установлен. Если же содержимое этого регистра равно 0FFFFh, драйвер имеется, и можно использовать другие функции для работы с мышью. В регистре BX возвращается количество клавиш мыши:
Включить курсор мыши Функция 01h позволяет включать или выключать курсор мыши:
Для управления видимостью курсора драйвер мыши использует внутренний счетчик. Этот счетчик можно увеличивать, вызывая функцию 01h прерывания INT 33h, или уменьшать при помощи функции 02h этого же прерывания.
Выключить курсор мыши Функция 02h уменьшает на единицу счетчик видимости курсора. Если содержимое счетчика становится равным -1, изображение курсора пропадает с экрана.
Пример:
// ================================= // Включение и выключение курсора мыши // ================================= #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 могут быть установлены следующие флаги:
Для графических режимов координаты располагаются в различных диапазонах, в зависимости от текущего режима видеоадаптера:
Пример:
// ================================= // Включение и выключение курсора мыши в // разных видеорежимах // ================================= #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;} (слайд №60) Лекция 9 Установить курсор C помощью функции 04h можно установить курсор в заданную позицию.
Определить положение курсора при нажатии клавиши
В регистре AX могут быть установлены следующие флаги:
(слайд №61) Определить положение курсора при отпускании клавиши Функция 06h возвращает программе состояние мыши, запомненное в момент отпускания клавиши, которая была заранее определена при вызове функции. Она также возвращает количество отпусканий заданной клавиши.
Задать диапазон движения курсора по горизонтали
Задать диапазон движения курсора по вертикали
(слайд №62) Задать форму курсора в графическом режиме С помощью функции 09h программа, работающая в графическом режиме, может изменить форму курсора мыши и положение точки внутри изображения курсора, координаты которой используются в качестве координат курсора остальными функциями.
Пример:
// ================================= // Изменение формы курсора в графическом // режиме // ================================= #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); } Задать форму курсора в текстовом режиме
Пример:
// ================================= // Изменение формы курсора в текстовом // режиме // ================================= #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 дюйма).
Отрицательные значения перемещения означают движение влево и вверх, положительные - вправо и вниз.
(слайд №63) Установить драйвер событий Функция 0Ch позволяет программе создать свой собственный драйвер (обработчик) событий, связанных с перемещением мыши, а также с нажатием или отпусканием клавиш мыши.
Если записать в регистр CX значение 7Fh, драйвер будет вызываться при возникновении любого события, а если 00h – драйвер будет отключен. Адрес процедуры драйвера передается при вызове функции в регистровой паре ES:DX. Драйвер должен быть оформлен в виде процедуры типа FAR, завершающейся командой дальнего возврата RETF. Когда драйвер получает управление, в регистрах процессора содержатся следующие значения:
Созданный таким образом драйвер событий должен позаботиться о правильной установке регистра DS. Однако драйвер событий не обязан сохранять и восстанавливать содержимое регистра DS и других регистров процессора. Отключение драйвера производится повторным вызовом функции 0Ch, записав в регистр CX нулевое значение. Программа, устанавливающая собственный драйвер событий, перед завершением своей работы обязательно должна отключить драйвер событий. Необходимо также помнить, что драйвер событий вызывается не из программы пользователя, а из драйвера мыши, поэтому сегментный регистр DS будет указывать на сегмент данных драйвера мыши, а не на сегмент данных программы. Драйвер событий может также организовать очередь событий, записывая в эту очередь состояние мыши на момент появления события и время появления события. Прикладная программа будет затем извлекать события из очереди и анализировать их.
Пример:
;.Title Драйвер событий ;.Descr Драйвер событий вызывается ; драйвером мыши, когда происходит ; какое-нибудь событие из числа ; заданных при установке драйвера ; событий. ; Функция не должна вызываться из ; программы пользователя, ее вызывает ; только драйвер мыши. DOSSEG DGROUP GROUP _DATA _DATASEGMENT WORD PUBLIC 'DATA' _DATA ENDS _TEXTSEGMENT 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, и т.д.
Пример:
#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)()); // Флаг драйвера событий. При вызове // драйвер событий запишет в эту // переменную значение 1unsigned 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); } (слайд №64) Включить эмуляцию светового пера
Выключить эмуляцию светового пера
Задать скорость перемещения курсора мыши Функция 0Fh определяет чуствительность мыши к перемещению по поверхности стола, то есть устанавливает соответствие между величиной перемещения мыши по столу и величиной перемещения курсора мыши по экрану.
При инициализации драйвера мыши используются следующие значения: CX=8, DX=16.
Установить область исключения для курсора Функция позволяет задать на экране прямоугольную область, в которой автоматически выключается изображение курсора мыши - область исключения. Эта область отменяется функциями 01h (включить курсор мыши) и 00h (инициализация).
Основное назначение этой функции - предоставить программе возможность изменять содержимое области экрана, не выключая изображение курсора. Недостаток – пользователь может потерять курсор мыши, если он случайно окажется в такой области.
Задать увеличенный графический курсор
(слайд №65) Определить порог удвоения скорости Если необходимо переместить курсор на значительное расстояние по экрану, то можно увеличить скорость перемещения мыши.
При инициализации устанавливается значение порога, равное 64 микам в секунду (1/3 дюйма в секунду).
Заменить драйвер событий Ее основное назначение - временная замена драйвера событий. Например, подпрограмма в начале своей работы может установить свой драйвер событий, а перед завершением - активизировать драйвер, использовавшийся ранее.
Определить размер буфера состояния драйвера Если требуется временно сохранить состояние драйвера мыши, а затем восстановить его, то можно воспользоваться специально предназначенными для этого функциями 16h и 17h. Для этих функций требуется буфер, в котором будет храниться состояние драйвера. Размер буфера можно определить с помощью функции 15h.
Сохранить состояние драйвера
Восстановить состояние драйвера
(слайд №66) Установить альтернативный драйвер событий
По сравнению с функцией 0Ch эта функция обеспечивает дополнительные возможности:
При попытке установить два драйвера с одной и той же маской событий функция возвращает в регистре AX код ошибки FFFFh. В этом случае можно воспользоваться функцией 19h для получения адреса предыдущего установленного драйвера событий, отключить его и повторить попытку подключения своего драйвера. Может применяться для отключения драйвера событий, если в регистрах ES:DX указать его адрес и при этом задать в регистре CX значение маски, равное 0. Получить адрес альтернативного драйвера событий Функция 19h предназначена для получения адреса драйвера событий с заданной маской событий. Получив адрес, вы можете установить новый драйвер, использующий эту же маску.
Установить чувствительность мыши Она позволяет одновременно устанавливать чувствительность мыши и порог удвоения скорости.
(слайд №67) Определить чувствительность мыши
Установить частоту прерываний для Inport Mouse Мышь периодически вырабатывает сигнал прерывания, по которому драйвер считывает текущее состояние мыши. С помощью функции 1Ch вы можете изменять частоту появления прерываний, но только для мыши системы Inport Mouse (тип мыши нетрудно определить с помощью функции 24h).
Установить номер страницы видеопамяти По умолчанию для отображения используется страница 0.
Определить номер страницы видеопамяти
(слайд №68) Отключить драйвер мыши После вызова функции 1Fh драйвер мыши полностью отключается. Вектор прерывания INT 33h остается определенным, однако теперь выполняется только одна функция прерывания INT 33h - функция 21h (программный сброс мыши).
Функцию 1Fh удобно использовать для временной замены драйвера на собственную систему обслуживания мыши. Сначала вы отключаете драйвер функцией 1Fh, запоминая адрес предыдущего драйвера, возвращаемого в регистрах ES:DX. Затем устанавливаете собственную систему обслуживания мыши, а после ее использования - восстанавливаете значение этого адреса.
Восстановить драйвер мыши Функция 20h восстанавливает связь между мышью и драйвером, отключенную вызовом функции 1Fh.
Сбросить драйвер мыши Функция 21h аналогична функции 00h, но она не выполняет аппаратный сброс оборудования мыши.
Определить тип мыши Функция 24h дает информацию о типе используемой мыши, версии драйвера мыши и об используемом номере прерывания.
Часы реального времени (слайд №69)
Все соверменные компьютеры оснащены часами реального времени. Эти часы работают от аккумулятора, поэтому их показания не пропадают при выключении электропитания. Доступ к часам реального времени из программы возможен либо через ячейки памяти CMOS, либо через специальные функции BIOS (что более предпочтительно с точки зрения независимости программы от особенностей аппаратуры).
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-04-26; просмотров: 508; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.76.209 (0.016 с.) |