Функции драйвера мыши

Вызов функций управления мышью происходит с помощью программного прерывания 0x33. Номер вызываемой функции должен быть предварительно помещён в регистр AX. Следущая таблица описывает основные функции драйвера мыши, а также входные и выходные параметры.

Номер функции Входные параметры Выходные параметры Описание
0x00 AX=0x0000 Если мышь присутствует, то AX=0xFFFF, BX=число клавиш мыши. Если мышь отсутствует, то AX=0x0000 Инициализирует драйвер мыши и возвращает его состояние. Если указатель мыши был виден на экране, он удаляется с экрана, и все предварительно установленные пользовательские обработчики событий мыши блокируются.
0x01 AX=0x0001   Выводит на экран указатель мыши и отменяет любую область подавления указателя, установленную ранее функцией 0x10.
0x02 AX=0x0002   Гасит изображение указателя мыши на экране. Но драйвер продолжает отрабатывать положение мыши. Система поддерживает счётчик, над которым эта функция выполняет операцию декремента, а функция 0x01 - операцию инкремента (если в счётчике не 0). Если в счётчике 0 или становится 0, указатель мыши изображается на экране. При сбросе драйвера мыши (функция 0x00) в счётчик заносится -1 (минус 1).
0x03 AX=0x0003 BX - состояние клавиш мыши. Значение бит: 0 - установлен, если левая клавиша нажата, 1 - если правая клавиша нажата, 2 - если центральная клавиша нажата. CX - X координата, DX - Y координата. Возвращает текущее состояние клавиш мыши и положение указателя. Значения координат возвращаются в пикселях независимо от текущего видеорежима. Положение X=0, Y=0 соответствует левому верхнему углу экрана.
0x04 AX=0x0004, CX - X координата, DX - Y координата.   Устанавливает положение указателя мыши. Изображение указателя появляется на экране в указанной позиции, если он не погашен (функция 0x02) и не попал в область подавления (функция 0x10). Значения координат указываются в пикселях.
0x05 AX=0x0005, BX - идентификатор клавиши: 0 - левая, 1 - правая, 2 - средняя. AX - состояние клавиши: 0 - левая клавиша нажата, 1 - правая клавиша нажата, 2 - средняя клавиша нажата. BX - счётчик нажатий указанной клавиши. CX - X координата последнего нажатия клавиши, DX - Y координата последнего нажатия. Возвращает текущее состояние всех клавиш мыши, а также число нажатий и координаты последнего нажатия заданной клавиши мыши с момента последнего вызова данной функции применительно к заданной клавише. После вызова функции счётчик нажатий укзанной клавиши сбрасывается в 0.
0x06 AX=0x0006, BX - идентификатор клавиши: 0 - левая, 1 - правая, 2 - средняя. AX - состояние клавиши: 0 - левая клавиша нажата, 1 - правая клавиша нажата, 2 - средняя клавиша нажата. BX - счётчик отпусканий указанной клавиши. CX - X координата последнего отпускания клавиши, DX - Y координата последнего отпускания. Возвращает текущее состояние всех клавиш мыши, а также число отпусканий и координаты последнего отпускания заданной клавиши мыши с момента последнего вызова данной функции применительно к заданной клавише. После вызова функции счётчик отпусканий укзанной клавиши сбрасывается в 0.
0x07 AX=0x0007, CX - минимальная X координата, DX - максимальная X координата.   Ограничивает область изображения на экране указателя, назначением минимальной и максимальной X координат указателя мыши. Если минимальное значение больше максимального, эти значения меняются местами. Положение указателя мыши будет при необходимости изменено так, чтобы оно лежало в указанной области.
0x08 AX=0x0008, CX - минимальная Y координата, DX - максимальная Y координата.   Ограничивает область изображения на экране указателя, назначением минимальной и максимальной Y координат указателя мыши. Если минимальное значение больше максимального, эти значения меняются местами. Положение указателя мыши будет при необходимости изменено так, чтобы оно лежало в указанной области.
0x09 AX=0x0009, BX - смещение "горячей точки" от левого края, CX смещение "горячей точки" от верхнего края. ES:DX - адрес буфера образа указателя.   Определяет форму указателя мыши и "горячую точку", которая определяет смещение относительно левого и верхнего края указателя мыши. В этой точке определяются координаты указателя. Буфер образа имеет длину 64 байта. Первые 32 байта содержат битовую маску, выполняющую с изображением на экране операцию логического "И", а вторые 32 байта содержат битовую маску, выполняющую с изображением на экране операцию логического "ИСКЛЮЧАЮЩЕЕ ИЛИ". Размер изображения указателя - 16x16 пикселей. Логические операции производятся с цветом пикселя на экране в текущей позиции указателя и значением бит в байтах буфера образа.
0x10 AX=0x0010, CX - верхняя левая X координата, DX - верхняя левая Y координата, SI - нижняя правая X координата, DI - нижняя правая Y координата.   Определяет область подавления указателя мыши. Если указатель мыши лежит в указанной области, он не отображается на экране. Заданная область подавления может быть заменена новой при следующем вызове данной функции.
0x1A AX=0x001A, BX - число микки по горизонтали, CX - число микки по вертикали. DX - порог удвоения скорости в единицах микки/с.   Устанавливает чувствительность мыши - число микки на 8 пикселей для горизонтального и вертикального перемещений мыши, а также пороговое значение удвоения скорости перемещения указателя на экране. 1 микки примерно равен 1/200 дюйма перемещения мыши.
0x1B AX=0x001B BX - число микки по горизонтали, CX - число микки по вертикали. DX - порог удвоения скорости в единицах микки/с. Получение чувствительности мыши - возвращает текущее значение микки на 8 пикселей для вертикального и горизонтального перемещений мыши, а также пороговое значение удвоения скорости перемещения указателя на экране.
0x24 AX=0x0024 BH - главный номер версии (1 для версии 1.02 и т.д.), BL - дополнительный номер версии (2 для версии 1.02 и т.д.). CH - тип мыши: 1 - мышь на магистрали, 2 - последовательная мышь, 3 - мышь InPort, 4 - мышь PS/2, 5 - мышь HP. CL - 0 если мышь PS/2, если нет, то номер IRQ. Получение информации о мыши. Возвращает номер версии драйвера мыши, а также номер запроса прерывания (IRQ), используемого адаптером мыши.

Следующий пример демонстрирует работу с драйвером мыши и получает значения X и Y координаты указателя мыши, а также состояние клавиш.

C/C++ Pascal Assembler

#include <dos.h>

void GetMouseState(int &x, int &y, int &buttons)
{
struct REGPACK regs;
regs.r_ax = 0x03;
intr(0x33, &regs);
x = regs.r_cx;
y = regs.r_dx;
buttons = regs.r_bx;
}

Uses Dos;

procedure GetMouseState(var X, Y, Buttons: Integer);
var regs: Registers;
begin
regs.AX := $03;
Intr($33, regs);
X := regs.CX;
Y := regs.DX;
Buttons := regs.BX;
end;

code segment
assume cs:code,ds:code
org 100h
start:
mov ax, 3
int 33h
mov x, cx
mov y, dx
mov buttons, bx
int 20h
x dw ?
y dw ?
buttons dw ?
code ends
end start

Ниже приведён исходный текст библиотеки, в которую включены все функции, описанные выше.

#ifndef _MOUSE_H_
#define _MOUSE_H_

#include <dos.h>

int InitializeMouseDriver(int&);                  // функция 0x00
void ShowMouseCursor();                           // функция 0x01
void HideMouseCursor();                           // функция 0x02
void GetMouseState(int&, int&, int&);             // функция 0x03
void SetMousePos(int, int);                       // функция 0x04
void GetPressed(int, int&, int&, int&, int&);     // функция 0x05
void GetReleased(int, int&, int&, int&, int&);    // функция 0x06
void SetXRange(int, int);                         // функция 0x07
void SetYRange(int, int);                         // функция 0x08
void SetCursorShape(int, int, void far *);        // функция 0x09 
void SetHideRegion(int, int, int, int);           // функция 0x10
void SetMouseSensity(int, int, int);              // функция 0x1A
void GetMouseSensity(int&, int&, int&);           // функция 0x1B
void GetMouseInfo(int&, int&, int&, int&);        // функция 0x24

// num_buttons - число клавиш мыши
int InitializeMouseDriver(int& num_buttons)
{
  struct REGPACK regs;
  regs.r_ax = 0x00;
  intr(0x33, &regs);
  num_buttons = regs.r_bx;
  return regs.r_ax;
}

void ShowMouseCursor()
{
  struct REGPACK regs;
  regs.r_ax = 0x01;
  intr(0x33, &regs);
}

void HideMouseCursor()
{
  struct REGPACK regs;
  regs.r_ax = 0x02;
  intr(0x33, &regs);
}

// x - X координата мыши
// y - Y координата мыши
// buttons - состояние клавиш мыши
void GetMouseState(int& x, int& y, int& buttons)
{
  struct REGPACK regs;
  regs.r_ax = 0x03;
  intr(0x33, &regs);
  x = regs.r_cx;
  y = regs.r_dx;
  buttons = regs.r_bx;
}

// x - X координата мыши
// y - Y координата мыши
void SetMousePos(int x, int y)
{
  struct REGPACK regs;
  regs.r_ax = 0x04;
  regs.r_cx = x;
  regs.r_dx = y;
  intr(0x33, &regs);
}

// button - клавиша, для которой определяется число нажатий
// buttons - состояние клавиш мыши
// count - число нажатий
// x - X координата последнего нажатия
// y - Y координата последнего нажатия
void GetPressed(int button, int& buttons, int& count, int& x, int& y)
{
  struct REGPACK regs;
  regs.r_ax = 0x05;
  regs.r_bx = button;
  intr(0x33, &regs);
  buttons = regs.r_ax;
  count = regs.r_bx;
  x = regs.r_cx;
  y = regs.r_dx;
}

// button - клавиша, для которой определяется число отпусканий
// buttons - состояние клавиш мыши
// count - число отпусканий
// x - X координата последнего отпускания
// y - Y координата последнего отпускания
void GetReleased(int button, int& buttons, int& count, int& x, int& y)
{
  struct REGPACK regs;
  regs.r_ax = 0x05;
  regs.r_bx = button;
  intr(0x33, &regs);
  buttons = regs.r_ax;
  count = regs.r_bx;
  x = regs.r_cx;
  y = regs.r_dx;
}

// min - минимальная X координата
// max - максимальная X координата
void SetXRange(int min, int max)
{
  struct REGPACK regs;
  regs.r_ax = 0x07;
  regs.r_cx = min;
  regs.r_dx = max;
  intr(0x33, &regs);
}

// min - минимальная Y координата
// max - максимальная Y координата
void SetYRange(int min, int max)
{
  struct REGPACK regs;
  regs.r_ax = 0x08;
  regs.r_cx = min;
  regs.r_dx = max;
  intr(0x33, &regs);
}

// x - смещение горячей точки от левого края
// y - смещение горячей точки от верхнего края
// buf - указатель на буфер образа указателя
void SetCursorShape(int x, int y, void far *buf)
{
  struct REGPACK regs;
  regs.r_ax = 0x09;
  regs.r_bx = x;
  regs.r_cx = y;
  regs.r_es = FP_SEG(buf);
  regs.r_dx = FP_OFF(buf);
  intr(0x33, &regs);
}

// x1 - X координата левого верхнего угла
// y1 - Y координата левого верхнего угла
// x2 - X координата правого нижнего угла
// y2 - Y координата правого нижнего угла
void SetHideRegion(int x1, int y1, int x2, int y1)
{
  struct REGPACK regs;
  regs.r_ax = 0x10;
  regs.r_cx = x1;
  regs.r_dx = y1;
  regs.r_si = x2;
  regs.r_di = y2;
  intr(0x33, &regs);
}

// mx - число микки на 8 пикселей по горизонтали
// my - число микки на 8 пикселей по вертикали
// ds - порог удвоения скорости (микки/с)
void SetMouseSensity(int mx, int my, int ds)
{
  struct REGPACK regs;
  regs.r_ax = 0x1A;
  regs.r_bx = mx;
  regs.r_cx = my;
  regs.r_dx = ds;
  intr(0x33, &regs); 
}

// mx - число микки на 8 пикселей по горизонтали
// my - число микки на 8 пикселей по вертикали
// ds - порог удвоения скорости (микки/с)
void GetMouseSensity(int& mx, int& my, int& ds)
{
  struct REGPACK regs;
  regs.r_ax = 0x1B;
  intr(0x33, &regs); 
  mx = regs.r_bx;
  my = regs.r_cx;
  ds = regs.r_dx;
}

// major - главной номер версии
// minor - дополнительный номер версии
// type - тип мыши
// irq - номер IRQ
void GetMouseInfo(int& major, int& minor, int& type, int& irq)
{
  struct REGPACK regs;
  regs.r_ax = 0x24;
  intr(0x33, &regs); 
  major = regs.r_bx >> 8;
  minor = regs.r_bx & 0xFF;
  type = regs.r_cx >> 8;
  irq = regs.r_cx & 0xFF;
}

#endif

 

Возврат в раздел "Писанина"Возврат на Главную Страницу

Hosted by uCoz