- •3.1. Как устроена мышь? Оптико-механические мыши
- •Оптические мыши
- •3.2. Драйверы мыши в ms-dos
- •3.3. Прерывание для обслуживания мыши
- •3.3.1. Инициализация мыши
- •3.3.2. Включить курсор мыши
- •3.3.3. Выключить курсор мыши
- •3.3.4. Определить положение курсора
- •3.3.5. Установить курсор
- •3.3.6. Определить положение курсора при нажатии клавиши
- •3.3.7. Определить положение курсора при отпускании клавиши
- •3.3.8. Задать диапазон движения курсора по горизонтали
- •3.3.9. Задать диапазон движения курсора по вертикали
- •3.3.10. Задать форму курсора в графическом режиме
- •3.3.11. Задать форму курсора в текстовом режиме
- •3.3.12. Определить содержимое счетчиков перемещения
- •3.3.13. Установить драйвер событий
- •3.3.14. Включить эмуляцию светового пера
- •3.3.15. Выключить эмуляцию светового пера
- •3.3.16. Задать скорость перемещения курсора мыши
- •3.3.17. Установить область исключения для курсора
- •3.3.18. Задать увеличенный графический курсор (pc mouse)
- •3.3.19. Определить порог удвоения скорости
- •3.3.20. Заменить драйвер событий
- •3.3.21. Определить размер буфера состояния драйвера
- •3.3.22. Сохранить состояние драйвера
- •3.3.23. Восстановить состояние драйвера
- •3.3.24. Установить альтернативный драйвер событий
- •3.3.25. Получить адрес альтернативного драйвера событий
- •3.3.26. Установить чувствительность мыши
- •3.3.27. Определить чувствительность мыши
- •3.3.28. Установить частоту прерываний для Inport Mouse
- •3.3.29. Установить номер видеостраницы
- •3.3.30. Определить номер видеостраницы
- •3.3.31. Отключить драйвер мыши
- •3.3.32. Восстановить драйвер мыши
- •3.3.33. Сбросить драйвер мыши
- •3.3.34. Определить тип мыши
3.3.1. Инициализация мыши
На входе: AX = 0000h.
На выходе: AX = состояние мыши:
0000h - драйвер мыши или мышь не
установлены;
FFFFh - драйвер и мышь установлены;
BX = количество клавиш у мыши:
2 - две клавиши;
0 - больше или меньше, чем две;
3 - мышь системы Mouse Systems
(имеет три клавиши).
Эта функция выполняет аппаратный сброс оборудования мыши и программную установку драйвера мыши в начальное состояние. С помощью функции 21h можно выполнить установку драйвера в исходное состояние, не выполняя аппаратного сброса мыши.
При установке в исходное состояние для программ, работающих в текстовом режиме, выполняются следующие действия:
курсор перемещается в центр экрана и гасится;
разрешается перемещение курсора по всей поверхности экрана, причем на экране отсутствуют зоны, в которых курсор является невидимым;
устанавливается режим отображения курсора - инвертирование атрибута символа, на который указывает курсор;
для изображения курсора выбирается нулевая страница видеопамяти;
разрешается эмуляция светового пера (хотя это вам едва ли понадобится);
устанавливается начальная скорость перемещения курсора.
Мы подготовили функцию для инициализации мыши из программы, составленной на языке Си:
/**
*.Name ms_init
*.Title Инициализация мыши
*
*.Descr Эта функция выполняет аппаратный сброс мыши,
* устанавливает в начальные значения внутренние
* переменные ее драйвера. Дополнительно определяется
* количество клавиш мыши.
*
*.Proto int ms_init(int *nbottoms)
*
*.Params int *nbottoms - указатель на переменную
* типа int, в которую будет записано количество
* клавиш, имеющихся в мыши.
*
*.Return 0 - плата или драйвер не установлены;
* -1 - плата установлена, инициализация
* выполнена успешно;
*
* В переменную nbottoms записывается количество
* клавиш мыши:
*
* 2 - две клавиши;
* 0 - больше или меньше, чем две;
* 3 - мышь системы Mouse Systems, три клавиши.
*
*.Sample ms_sampl1.c
**/
#include <dos.h>
#include <conio.h>
union REGS reg;
int ms_init(int *nbottoms) {
reg.x.ax = 0;
int86(0x33,®,®);
*nbottoms = reg.x.bx;
return reg.x.ax;
}
3.3.2. Включить курсор мыши
На входе: AX = 0001h.
На выходе: регистры не используются.
Для управления видимостью курсора драйвер мыши использует внутренний счетчик. Этот счетчик можно увеличивать, вызывая функцию 01h прерывания INT 33h, или уменьшать при помощи функции 02h этого же прерывания.
После инициализации драйвера функцией 00h счетчик устанавливается равным -1. После первого вызова функции 01h счетчик становится равным 0. При этом курсор мыши становится видимым, его можно перемещать по экрану.
Если счетчик равен 0, то следующие вызовы функции 01h игнорируются драйвером. Для того, чтобы погасить курсор, используйте функцию 02h, которая при вызове уменьшает каждый раз содержимое счетчика на единицу.
Функция 01h сбрасывает область, в которой курсор не отображается (если такая область была ранее установлена функцией 10h).
Вызов функции из Си:
/**
*.Name ms_on
*.Title Включение курсора мыши
*
*.Descr Эта функция увеличивает на 1 индикатор
* уровня видимости курсора. Если индикатор
* равен нулю, курсор появляется на экране.
* Значение индикатора не превышает
* нуля даже при многократных вызовах этой функции.
*
*.Proto void ms_on(void)
*
*.Params Не используются
*
*.Return Ничего
*
*.Sample ms_sampl1.c
**/
#include <dos.h>
#include <conio.h>
union REGS reg;
void ms_on(void) {
reg.x.ax = 1;
int86(0x33,®,®);
}