From 59d9dbdd98982109a701e0ba44d8e87c922130e7 Mon Sep 17 00:00:00 2001 From: Gregory Alexander Date: Fri, 24 Aug 2001 13:48:05 +0000 Subject: [PATCH] Another mouse fix. This one changes the model a bit to act more like a real system. It has some problems, but is MUCH better than it was. Modified Files: keyboard.cc keyboard.h --- bochs/iodev/keyboard.cc | 155 ++++++++++++++++++++++++++++------------ bochs/iodev/keyboard.h | 3 + 2 files changed, 111 insertions(+), 47 deletions(-) diff --git a/bochs/iodev/keyboard.cc b/bochs/iodev/keyboard.cc index 025500e71..a035a300f 100644 --- a/bochs/iodev/keyboard.cc +++ b/bochs/iodev/keyboard.cc @@ -57,7 +57,7 @@ bx_keyb_c::bx_keyb_c(void) memset( &s, 0, sizeof(s) ); BX_KEY_THIS put("KBD"); BX_KEY_THIS settype(KBDLOG); - BX_DEBUG(("Init $Id: keyboard.cc,v 1.28 2001-08-23 13:04:14 yakovlev Exp $")); + BX_DEBUG(("Init $Id: keyboard.cc,v 1.29 2001-08-24 13:48:05 yakovlev Exp $")); } bx_keyb_c::~bx_keyb_c(void) @@ -92,7 +92,7 @@ bx_keyb_c::resetinternals(Boolean powerup) void bx_keyb_c::init(bx_devices_c *d, bx_cmos_c *cmos) { - BX_DEBUG(("Init $Id: keyboard.cc,v 1.28 2001-08-23 13:04:14 yakovlev Exp $")); + BX_DEBUG(("Init $Id: keyboard.cc,v 1.29 2001-08-24 13:48:05 yakovlev Exp $")); Bit32u i; BX_KEY_THIS devices = d; @@ -150,6 +150,8 @@ bx_keyb_c::init(bx_devices_c *d, bx_cmos_c *cmos) BX_KEY_THIS s.mouse.scaling = 1; /* 1:1 (default) */ BX_KEY_THIS s.mouse.mode = MOUSE_MODE_RESET; BX_KEY_THIS s.mouse.enable = 0; + BX_KEY_THIS s.mouse.delayed_dx = 0; + BX_KEY_THIS s.mouse.delayed_dy = 0; for (i=0; i254) delta_x=254; + if(delta_x<-254) delta_x=-254; + if(delta_y>254) delta_y=254; + if(delta_y<-254) delta_y=-254; + + b1 = (button_state & 0x0f) | 0x08; // bit3 always set + + if ( (delta_x>=0) && (delta_x<=255) ) { + b2 = delta_x; + BX_KEY_THIS s.mouse.delayed_dx-=delta_x; + } + else if ( delta_x > 255 ) { + b2 = 0xff; + BX_KEY_THIS s.mouse.delayed_dx-=255; + } + else if ( delta_x >= -256 ) { + b2 = delta_x; + b1 |= 0x10; + BX_KEY_THIS s.mouse.delayed_dx-=delta_x; + } + else { + b2 = 0x00; + b1 |= 0x10; + BX_KEY_THIS s.mouse.delayed_dx+=256; + } + + if ( (delta_y>=0) && (delta_y<=255) ) { + b3 = delta_y; + BX_KEY_THIS s.mouse.delayed_dy-=delta_y; + } + else if ( delta_y > 255 ) { + b3 = 0xff; + BX_KEY_THIS s.mouse.delayed_dy-=255; + } + else if ( delta_y >= -256 ) { + b3 = delta_y; + b1 |= 0x20; + BX_KEY_THIS s.mouse.delayed_dy-=delta_y; + } + else { + b3 = 0x00; + b1 |= 0x20; + BX_KEY_THIS s.mouse.delayed_dy+=256; + } + mouse_enQ_packet(b1, b2, b3); +} + void bx_keyb_c::mouse_motion(int delta_x, int delta_y, unsigned button_state) { - Bit8u b1, b2, b3; + bool force_enq=0; // If mouse events are disabled on the GUI headerbar, don't // generate any mouse data @@ -1354,46 +1427,34 @@ bx_keyb_c::mouse_motion(int delta_x, int delta_y, unsigned button_state) BX_DEBUG(("[mouse] Dx=%d Dy=%d", delta_x, delta_y)); #endif /* ifdef VERBOSE_KBD_DEBUG */ - b1 = (button_state & 0x0f) | 0x08; // bit3 always set - if( (delta_x==0) && (delta_y==0) && (BX_KEY_THIS s.mouse.button_status == button_state & 0x3) ) { BX_DEBUG(("Ignoring useless mouse_motion call:\n")); BX_DEBUG(("This should be fixed in the gui code.\n")); return; } + if(BX_KEY_THIS s.mouse.button_status != (button_state & 0x3)) { + force_enq=1; + } + BX_KEY_THIS s.mouse.button_status = button_state & 0x3; - if ( (delta_x>=0) && (delta_x<=255) ) { - b2 = delta_x; - } - else if ( delta_x > 255 ) { - b2 = 0xff; - } - else if ( delta_x >= -256 ) { - b2 = delta_x; - b1 |= 0x10; - } - else { - b2 = 0x00; - b1 |= 0x10; - } + if(delta_x>255) delta_x=255; + if(delta_y>255) delta_y=255; + if(delta_x<-256) delta_x=-256; + if(delta_y<-256) delta_y=-256; - if ( (delta_y>=0) && (delta_y<=255) ) { - b3 = delta_y; - } - else if ( delta_y > 255 ) { - b3 = 0xff; - } - else if ( delta_y >= -256 ) { - b3 = delta_y; - b1 |= 0x20; - } - else { - b3 = 0x00; - b1 |= 0x20; - } - mouse_enQ_packet(b1, b2, b3); + BX_KEY_THIS s.mouse.delayed_dx+=delta_x; + BX_KEY_THIS s.mouse.delayed_dy+=delta_y; + + if((BX_KEY_THIS s.mouse.delayed_dx>255)|| + (BX_KEY_THIS s.mouse.delayed_dx<-256)|| + (BX_KEY_THIS s.mouse.delayed_dy>255)|| + (BX_KEY_THIS s.mouse.delayed_dy<-256)) { + force_enq=1; + } + + create_mouse_packet(force_enq); } diff --git a/bochs/iodev/keyboard.h b/bochs/iodev/keyboard.h index 50f2952fe..7170ce27c 100644 --- a/bochs/iodev/keyboard.h +++ b/bochs/iodev/keyboard.h @@ -51,6 +51,7 @@ public: BX_KEY_SMF void gen_scancode(Bit32u scancode); BX_KEY_SMF Bit8u get_kbd_enable(void); BX_KEY_SMF void mouse_motion(int delta_x, int delta_y, unsigned button_state); + BX_KEY_SMF void create_mouse_packet(bool force_enq); BX_KEY_SMF void mouse_button(unsigned mouse_state); BX_KEY_SMF int SaveState( class state_file *fd ); BX_KEY_SMF int LoadState( class state_file *fd ); @@ -146,6 +147,8 @@ private: } Bit8u button_status; + Bit16s delayed_dx; + Bit16s delayed_dy; } mouse; struct {