From: Simon Newsgroups: comp.os.msdos.djgpp Subject: Mouse Drawing Problem in SVGA Banked Mode 0x101 Date: Mon, 11 Jan 1999 09:04:33 +0000 Organization: Customer of Planet Online Lines: 101 Message-ID: <3699BEA0.7E4@magicsoftware.freeserve.co.uk> NNTP-Posting-Host: modem-87.vaqta.dialup.pol.co.uk Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: news8.svr.pol.co.uk 916045589 31633 62.136.91.215 (11 Jan 1999 09:06:29 GMT) NNTP-Posting-Date: 11 Jan 1999 09:06:29 GMT X-Complaints-To: abuse AT theplanet DOT net X-Mailer: Mozilla 3.04Gold (Win95; I) To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hello, I am having a problem concerning drawing of the mouse pointer(in an interrupt) and drawing of normal graphics (not in an interrupt) in banked SVGA mode 0x101 (640*480*256) . What happens is that the mouse pointer sometimes is drawn to the wrong area of the screen but only when the pointer is on a bank boundry. This also only occurs when other graphics are being drawn in non interupt code, everything works fine in linear mode though. Any way here are a few pieces of code which may help diagnose my annoying problem. Thanks for any help given Simon The following are from a set of libraries I am writing so some variables and declarations may be external. /////////////////////////////////////////////////////////////////////////// void SetBank(int bank){ __dpmi_regs regs; static int first_set=TRUE; // makesure bank is set correctly on first set of bank 0 if(first_set) first_set=FALSE; else{ if (bank == System.Video.CurrentBank){ return; } } bank <<= GlobaVESAInfo.WinGranularity; regs.x.ax = 0x4F05; regs.x.bx = 0; regs.x.dx = bank; //set access window __dpmi_int(0x10, ®s); regs.x.ax = 0x4F05; regs.x.bx = 1; regs.x.dx = bank; //get access window __dpmi_int(0x10, ®s); System.Video.CurrentBank = bank; return; } /////////////////////////////////////////////////////////////////////////// //cut down version of setpixel but this is the relavant bit void SetPixel(int x, int y, int color){ int addr,count; addr=y*GlobaVESAInfo.BytesPerScanLine+x; SetBank((addr >> 16)); _farpokeb(_dos_ds,VGA_FRAME_BUFFER_ADDRESS + (addr & 0xFFFF), color); } ///////////////////////////////////////////////////////////////////////////// static void MouseInteruptHandler(_go32_dpmi_registers *reg){ __dpmi_regs registers; //get button stuff registers.x.ax=MOUSE_INFO_FUNCTION; __dpmi_int(MOUSE_DRIVER, ®isters); //store System.Mouse.MouseButtonsStates=registers.x.bx; //get x-y movement since last interrupt registers.x.ax=MOUSE_MOVEMENT_RELATIVE_FUNCTION; __dpmi_int(MOUSE_DRIVER, ®isters); disable(); System.Mouse.MouseXPos += registers.x.cx; System.Mouse.MouseYPos += registers.x.dx; System.Mouse.MouseXRelativePos = registers.x.cx; System.Mouse.MouseYRelativePos = registers.x.dx; //adjust to keep in limits if (System.Mouse.MouseXPos >= System.Mouse.MXMaxLimit) System.Mouse.MouseXPos=System.Mouse.MXMaxLimit; if (System.Mouse.MouseXPos <= System.Mouse.MXMinLimit) System.Mouse.MouseXPos=System.Mouse.MYMinLimit; if (System.Mouse.MouseYPos >= System.Mouse.MYMaxLimit) System.Mouse.MouseYPos=System.Mouse.MYMaxLimit; if (System.Mouse.MouseYPos <= System.Mouse.MYMinLimit) System.Mouse.MouseYPos=System.Mouse.MYMinLimit; if (System.Mouse.MousePointerVisible==MOUSE_ON) DrawMousePointer(); //uses setpixel and to draw a pointer enable(); System.Mouse.MouseXOldPos=System.Mouse.MouseXPos; System.Mouse.MouseYOldPos=System.Mouse.MouseYPos; //used to run any extra code when the mouse ints //not used when error occurs RunInterruptCallbacks(&mouse_interrupt_call_list); }