// =====================================================
// Работа с драйвером событий
//
// (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, &reg, &reg);
  
  if(reg.x.bx == 0)
  {   
    printf("Mouse not found\n");
    return -1;
  }

  // Подключаем драйвер событий, устанавливаем маску таким образом,
  // чтобы драйвер вызывался при нажатии на левую или правую
  // клавиши мыши
  ms_seth(2 | 8, MS_HANDL);

  // Включаем курсор
  reg.x.ax = 1;
  int86(0x33, &reg, &reg);

  // Ожидаем вызова драйвера событий.
  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,&reg,&reg,&segregs);
}
