From: "Matthew Reiferson" Newsgroups: comp.os.msdos.djgpp,rec.games.programmer Subject: DJGPP Mouse Routines Date: Wed, 31 Dec 1997 00:33:00 -0500 Lines: 161 Organization: DSoft NNTP-Posting-Host: 38.26.89.200 Message-ID: <34a9da82.0@news.usinternet.com> To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk I wrote some mouse routines in C with DJGPP. The problem I came across is that I must divide the x value returned into REGS from a call to the position of the mouse (to determine the x,y location of the cursor), but not the y value. I have an interrupt routine which keeps the 2 location variables updated......here is the code.....maybe you can tell me what I am doing wrong, oh it's in Mode13h so SCREEN_W and SCREEN_H are 320,200 respectively. static _go32_dpmi_seginfo mouse_seginfo; static _go32_dpmi_registers mouse_regs; volatile int mouse_x = 0; volatile int mouse_y = 0; volatile int mouse_b = 0; int mouse_installed = 0; static void mouseint(_go32_dpmi_registers *r) { mouse_b = r->x.bx; mouse_x = r->x.cx/2; mouse_y = r->x.dx; } END_OF_FUNCTION(mouseint); int mouse_init(void) { __dpmi_regs r; if(mouse_installed) return FAIL; if(mouse_detect()) LOCK_VARIABLE(mouse_x); LOCK_VARIABLE(mouse_y); LOCK_VARIABLE(mouse_b); LOCK_FUNCTION(mouseint); mouse_seginfo.pm_offset = (int)mouseint; mouse_seginfo.pm_selector = _my_cs(); _go32_dpmi_allocate_real_mode_callback_retf(&mouse_seginfo, &mouse_regs); r.x.ax = 0x0C; r.x.cx = 0x7f; r.x.dx = mouse_seginfo.rm_offset; r.x.es = mouse_seginfo.rm_segment; __dpmi_int(0x33, &r); set_mouse_range(0, 0, SCREEN_W-1, SCREEN_H-1); set_mouse_speed(2, 2); position_mouse(SCREEN_W/2, SCREEN_H/2); mouse_installed = 1; add_exit_func(mouse_exit); return SUCCESS; } else { return FAIL; } } void mouse_exit(void) { __dpmi_regs r; r.x.ax = 0x0C; r.x.cx = 0; r.x.dx = 0; r.x.es = 0; __dpmi_int(0x33, &r); r.x.ax = 15; r.x.cx = 8; r.x.dx = 16; __dpmi_int(0x33, &r); mouse_x = mouse_y = mouse_b = 0; _go32_dpmi_free_real_mode_callback(&mouse_seginfo); mouse_installed = 0; remove_exit_func(mouse_exit); } int mouse_detect(void) { union REGS regs; regs.x.ax = 0x0; int86(0x33, ®s, ®s); return regs.x.ax; } void mouse_show(void) { __dpmi_regs r; if(!mouse_installed) return; r.x.ax = 0x01; __dpmi_int(0x33, &r); } void mouse_hide(void) { __dpmi_regs r; if(!mouse_installed) return; r.x.ax = 0x02; __dpmi_int(0x33, &r); } void position_mouse(int x, int y) { __dpmi_regs r; if(!mouse_installed) return; r.x.ax = 4; r.x.cx = x; r.x.dx = y; __dpmi_int(0x33, &r); mouse_x = x; mouse_y = y; } void set_mouse_range(int x1, int y1, int x2, int y2) { __dpmi_regs r; if (!mouse_installed) return; r.x.ax = 7; r.x.cx = x1; r.x.dx = x2; __dpmi_int(0x33, &r); /* set horizontal range */ r.x.ax = 8; r.x.cx = y1; r.x.dx = y2; __dpmi_int(0x33, &r); /* set vertical range */ r.x.ax = 3; __dpmi_int(0x33, &r); /* check the position */ mouse_x = r.x.cx; mouse_y = r.x.dx; } void set_mouse_speed(int xspeed, int yspeed) { __dpmi_regs r; if (!mouse_installed) return; r.x.ax = 15; r.x.cx = xspeed; r.x.dx = yspeed; __dpmi_int(0x33, &r); }