I8 mxx=grwidth>>1, myy=grheight>>1, mzz=0; BoolU4 mouse_buttons[5]; U8 last_mouse_jiffy=0; BoolU4 mouse_installed=FALSE; BoolU4 mouse_has_wheel=FALSE; BoolU4 mouse_has_ext_buttons=FALSE; BoolU4 mouse_evt=FALSE; BoolU4 mouse_irqs_working=FALSE; U8 mouse_evt_time; void MouseGetDeviceType() { U1 b; KbdMouseCmdAck(0xF2); b=KbdCmdRead; if (b==3) mouse_has_wheel=TRUE; else if (b==4) mouse_has_ext_buttons=TRUE; } void MouseReset() { KbdCmdFlush; KbdCmdSend(KEYB_CTRL,0xA8); //Enable Mouse KbdCmdFlush; KbdCmdSend(KEYB_CTRL,0xA9); //check for mouse KbdCmdFlush; KbdMouseCmdAck(0xFF); //Reset KbdCmdRead; KbdCmdRead; KbdMouseCmdAck(0xFF); //Reset KbdCmdRead; KbdCmdRead; KbdMouseCmdAck(0xF3); KbdMouseCmdAck(200); KbdMouseCmdAck(0xF3); // enable Mouse KbdMouseCmdAck(100); // Set Rate KbdMouseCmdAck(0xF3); KbdMouseCmdAck(80); //Resolution MouseGetDeviceType; // enable Mouse KbdMouseCmdAck(0xF3); KbdMouseCmdAck(10); MouseGetDeviceType; // enable Mouse KbdMouseCmdAck(0xE8); //Resolution KbdMouseCmdAck(0x03); KbdMouseCmdAck(0xE6); KbdMouseCmdAck(0xF3); // Set Rate //if your mouse doesn't work, try this // KbdMouseCmdAck(40); KbdMouseCmdAck(100); KbdMouseCmdAck(0xF4); // enable Mouse } void MouseHandler() { I8 i,j,dx,dy,dz, old_mxx=mxx,old_myy=myy,old_mzz=mzz; BoolU4 evt=FALSE,old_buttons[5]; U1 mouse_buf[4]; U8 evt_time=BootTime; try { for (i=0;i<5;i++) old_buttons[i]=mouse_buttons[i]; for (i=0;i<3;i++) { j=KbdCmdRead; if (j<0) throw; else mouse_buf[i]=j; } if (mouse_has_wheel || mouse_has_ext_buttons) { j=KbdCmdRead; if (j<0) throw; else mouse_buf[3]=j; } else mouse_buf[3]=0; Sti; mouse_buttons[0] = mouse_buf[0] & 1; mouse_buttons[1] = (mouse_buf[0] & 2) >> 1; mouse_buttons[2] = (mouse_buf[0] & 4) >> 2; mouse_buttons[3] = (mouse_buf[3] & 0x10) >> 4; mouse_buttons[4] = (mouse_buf[3] & 0x20) >> 5; if (mouse_buf[0] & 0x10) dx=mouse_buf[1]-256; else dx=mouse_buf[1]; if (mouse_buf[0] & 0x20) dy=256-mouse_buf[2]; else dy=-mouse_buf[2]; if (mouse_buf[3] & 0x08) dz=(mouse_buf[3]&7)-8; else dz=mouse_buf[3]&7; mxx+=dx; myy+=dy; mzz+=dz; if (mxx < 0) mxx=0; if (mxx>=grwidth) mxx=grwidth-1; if (myy < 0) myy=0; if (myy>=grheight) myy=grheight-1; } catch { Fs->catch_except=TRUE; KbdCmdFlush; } for (i=0;i<5;i++) if (old_buttons[i]!=mouse_buttons[i]) evt=TRUE; if (old_mxx!=mxx || old_myy!=myy || old_mzz!=mzz) evt=TRUE; if (evt) { mouse_evt_time=evt_time; last_mouse_jiffy=jiffies; mouse_evt=TRUE; } } void MouseIrqHandler() { mouse_irqs_working=TRUE; MouseHandler; } void PollMouse() { //I can't get IRQ's working on some computers U8 old_flags=GetFlags; if (mouse_irqs_working) return; // Cli; if (!Bt(&sys_irq_flags,1)) {//not in keybd IRQ if (InP(KEYB_CTRL) & 1) { KbdCmdSend(KEYB_CTRL,0x60); KbdCmdSend(KEYB_PORT,0x51); //disable kbd MouseHandler; KbdCmdSend(KEYB_CTRL,0x60); KbdCmdSend(KEYB_PORT,0x41); //enable kbd } } SetFlags(old_flags); } BoolU4 InstallMouseDriver() { BoolU4 result; I8 i; // U8 old_flags=GetFlags; // Cli; ext[EXT_IRQ0C]=NULL; mouse_evt=FALSE; for(i=0;i<5;i++) mouse_buttons[i]=0; mouse_has_wheel=FALSE; mouse_has_ext_buttons=FALSE; try { MouseReset; result=TRUE; mouse_evt=TRUE; ext[EXT_IRQ0C]=&MouseIrqHandler; } catch { Fs->catch_except=TRUE; result=FALSE; } mouse_installed=result; // SetFlags(old_flags); return result; } Spawn(&InstallMouseDriver);