Работа с мышей
Точнее, здесь речь пойдет о прерывании $33, которое предоставляет нам возможность работать с мышью. Вызывается прерывание с номером функции в регистре AX, которую мы хотим задействовать и входными параметрами в регистрах процессора, если нужно, после чего получаем результат в тех же регистрах. На Pascal'е это делается так.
Uses
DOS;
….
Procedure ResetMouse;
Var Rp:Register;
Begin
Rp.Ax:=0;
Intr($33,Rp);
End;
….
или так
Procedure
ResetMouse;Assembler;
Asm
mov ax,0
int $33
End;
Во втором примере модуль DOS не нужен, но это менее надежно, если вы не умеете работать на Assembler'е , хотя быстрее первого.
А теперь к функциям
Функция $0:
Сбросить мышь.
Сброс мыши желательно производить при начале работы с ней, так как, например,
при переключении видео режимов мышь может глючить если ее не сбросить.
На входе:
AX = $0
На выходе:
AX = $0000 - мышь не найдена или драйвер не установлен
$FFFF - мышь найдена
BX - Количество кнопок
0 - не 2 кнопки
2 - 2 кнопки
3 - 3 кнопки
Функция $1: Показать указатель мыши на экране
Работает в текстовом режиме и стандартных видео режимах, не дружит с VESA, хотя иногда и дружит, главная проблема с режимами где более 256 цветов.
На входе:
AX = $1;На выходе ничего
Функция $2: Убрать указатель мыши
То-же что и функция 1 но убирает указатель с экрана
На входе:
AX = $2;На выходе ничего
Функция $3: Получить состояние мыши
Данная функция позволяет узнать положение указателя мыши и состояние нажатия кнопок.
На входе:
AX = $3;На выходе:
BX - Байт состояния кнопок
Бит 0 - Левая кнопка
Бит 1 - Правая кнопка
Бит 2 - Средняя кнопка
CX - Горизонтальная координата мыши (X)
DX - Вертикальная координата мыши (Y)
В текстовом режиме значения CX и DX нужно делить на 8 или Rp.CX:=Rp.CX shr 3;
Функция $4: Задать координаты указателя
Позволяет установить координаты указателя мыши
На входе:
AX = $4;
CX,DX - X,Y соответственноНа выходе ничего
Для текстового режима координаты умножаются на 8;
Функция $5 и $6: Получить информацию о кол-ве нажатия или отпускания кнопок
Позволяет узнать количество нажатий на ту или иную кнопку, нужно для отслеживания двойного нажатия.
На входе:
AX = $5; - Количество нажатий и AX = $6; - Кол-во отпускания кнопки
BX - Индификатор кнопки (номер кнопки как в функции 3)На выходе:
BX - Количество нажатий или отпускания кнопки
CX,DX - Координаты последнего нажатия
Функция $7 и $8: Установить область перемещения указателя по горизонтали и вертикали соответственно
На входе:
AX = $7; - По горизонтали и AX = $8 по вертикали
CX - минимальная координата
DX - максимальная координатаНа выходе ничего:
При помощи этих функции можно избавится от некоторых глюков в графических режимах, особенно нестандартных. Точнее сказать, для точного перемещения указателя по экрану, желательно сразу указать как область перемещения указателя весь экран (0, 0) - (MaxX,MaxY)
Функция $9: Задать форму указателя для графического режима
На сегодняшний день мало используется, так как работает только в стандартных видео режимах и поддерживает только два цвета, черный и белый.
На входе:
AX = $9;
BX - Смещение от левого края изображения
CX - Смещение от правого края изображения
ES:DI - указатель на 64 байтовый массив, хранящий в себе форму указателя, где
первый 32 байта - маска, а вторые 32 байта сам указатель, те биты в маске которые равны 1 не рисуются.На выходе ничего
Функция $A: Задать форму указателя для текстового режима
На сегодняшний день мало используется, так как вообще по моему ни кому не надо
На входе:
AX = $A;
BX=Aлаг указателя
0-програмное управление формой
1-аппаратное управление формой
CX- маска экрана для BX =0 или верхняя строка развертки для BX=1
DX- маска указателя для ВХ=0 или нижняя строка развертки для BX=1На выходе ничего
Функция $B: Получить счетчик шагов перемещения
На входе:
AX=$BНа выходе:
DX,CX-количество шагов по вертикали(горизонтали) после последнего вызова $0B
Функция $C: Задать условия вызова программы пользователя
На входе:
AX=$C
CX=условия вызова:
0-мыш перемещается
1-нажимается левая кнопка
2-отпускается левая кнопка
3-нажимается правая кнопка
4-отпускается правая кнопка
5-нажимается средняя кнопка
6-отпускается левая кнопка
ES:DX=адрес программы пользователя вывод (вызывается процедура по адресу es:dx)На выходе или в процедуре (точно не знаю):
AX-маска условия (состояние CX при вводе)
BX-состояние кнопок
CX,DX-координаты
DI,SI-число шагов мыши по горизонтали и вертикали
DS-сегмент данных драйвера мышиЕсли вызвать эту функцию то при выполнении заданного события выполнится процедура пользователя, удобная штука, но регистр DS портиться и по этому может глючить, процедуру желательно описывать типа FAR, и при вызове драйвер мыши портит регистр DS что делает эту функцию почти бесполезной для Паскаля.
Функция $D: Включить эмуляцию светового пера
На входе:
AX=$0D ВКЛЮЧИТЬНа выходе ничего
Функция $F:Установить отношение числа шагов на единицу виртуального экрана (скорость перемещения мыши)
На входе
AX=$0F
CX,DX - количество сотых долей дюйма по горизонтали и вертикали на 8 пикселов. По умолчанию CX и DX равны 8, чем больше коэффициент тем меньше мышь по экрану катитсяНа выходе ничего
Функция $13: Установить порог удвоения скорости смещения указателя мыши
На входе
AX=$13
DX=новое значениеНа выходе ничего
Функция $14: Заменить процедуру пользователя
Если вас достала процедура пользователя установленная функцией $C то ее можно заменить.
На входе:
AX=$14
CX=условия вызова:
0-мыш перемещается
1-нажимается левая кнопка
2-отпускается левая кнопка
3-нажимается правая кнопка
4-отпускается правая кнопка
5-нажимается средняя кнопка
6-отпускается левая кнопка
ES:DX=адрес программы пользователя вывод (вызывается процедура по адресу es:dx)На выходе:
CX - условия вызова ранее установленной процедуры
ES:DX - адрес старой процедуры
Функция $15: Получить размер буфера необходимого для сохранения состояния драйвера.
На входе:
AX=$15
BX=0На выходе:
BX - размер буфера в байтах
Функция $16: Сохранить текущее состояние драйвера
На входе:
AX=$16
ES:DX - адрес буфераНа выходе ничего
Функция $17: Восстановить состояние драйвера
На входе:
AX=$17
ES:DX - адрес буфера с сохраненным состояниемНа выходе ничего
Функция $1D: Задать видеостраницу для указателя
На входе
AX=$1D
BX=Номер видео страницыНа выходе ничего
Функция $1Е: Получить видеостраницу
На входе:
AX=$1EНа выходе
BX=Номер видео страницы
Ну вот и все, успехов.