// =====================================================
// Включение и выключение курсора мыши
// в разных видеорежимах
//
// (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>
#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);

  printf("Mouse cursor off. Press any key\n");

  // Восстанавливаем режим видеоадаптера
  rg.h.ah = 0;
  rg.h.al = old_videomode;
  int86(0x10, &rg, &rg);
  
  return 0;
}
