www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1995/01/12/01:34:59

From: Dirk Zabel <dzabel AT cs DOT tu-berlin DOT de>
Date: Thu, 12 Jan 1995 06:58:16 +0100
To: djgpp AT sun DOT soe DOT clarkson DOT edu
Subject: _go32_dpmi_simulate_int crashes

Hi,
I am trying to use the mouse in some text-mode program.
As a first exercise, I have written a trivial program, 
which shows the mouse cursor, let me play around with
the mouse keysm, hides the mouse again and finishes.
Unfortuanetely every third time or so (not deterministic)
the program crashes ON EXIT. Maybe someone has an idea
what i'm doing wrong? My system runs on DOS 3.3 whith EMM386
(VCPI but no DPMI) and 4dos V4 as COMMAND.COM replacement.
I'm still using DJGPP 1.11m5.
As far as I know, I should use _go32_dpmi_simulate_int and
not any older interrupt-functions if I want the program to
run under DJGPP 2.x as well.

Thanks for an help!

--
        Dirk


dirk AT cs DOT tu-berlin DOT de


---------------- snip snap --------------------------------
#include <stdio.h>
#include <pc.h>
#include <dpmi.h>
#define ESC 27
#define MOUSE_LEFT   1
#define MOUSE_RIGHT  2
#define MOUSE_MIDDLE 4
/*
 * Mausetreiber initialisieren.
 * Liefert -1 wenn kein Maustreiber vorhanden, sonst Anzahl Maustasten.
 */
int init_mouse(void)
{
  _go32_dpmi_registers regs;
   regs.x.ax = 0;
  _go32_dpmi_simulate_int(0x33, &regs);
  if (regs.x.ax == 0)
    return -1;
  else
    return regs.x.bx;
}

/*
 * Mauscursor einschalten
 */
void show_mouse(void)
{
  _go32_dpmi_registers regs;
  regs.x.ax = 1;
  _go32_dpmi_simulate_int(0x33, &regs);
}

/*
 * Mauscursor ausschalten
 */
void hide_mouse(void)
{
  _go32_dpmi_registers regs;
  regs.x.ax = 2;
  _go32_dpmi_simulate_int(0x33, &regs);
}
/*
 * Mauscursor ausschalten
 */
void request_mousestat(int * xp, int * yp, int * keyp)
{
  _go32_dpmi_registers regs;
  regs.x.ax = 3;
  _go32_dpmi_simulate_int(0x33, &regs);
  *xp = regs.x.cx;
  *yp = regs.x.dx;
  *keyp=regs.x.bx;
}

int main(int argc, char ** argv)
{
  int mousekeys;
  int running;
  int keys, x, y;

  mousekeys = init_mouse();
  if (mousekeys == -1)
    printf("keine Maus gefunden\n");
  else {
    printf("Maus gefunden, %d Tasten\n", mousekeys);
    show_mouse();
    running=1;
    while (running) {
      if (kbhit() && getkey()==ESC) 
        running=0;
      else {
        request_mousestat(&x, &y, &keys);
        if (keys & (MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT)) {
          printf("x=%d, y=%d, ");
          if (keys & MOUSE_LEFT)
            printf("LEFT ");
          if (keys & MOUSE_MIDDLE)
            printf("MIDDLE ");
          if (keys & MOUSE_RIGHT)
            printf("RIGHT");
          printf("\n");
        }
        ;
      }
    }
    hide_mouse();
  }
}
------------------------- snip snap --------------------------------- 

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019