diff --git a/src/keyboard_at.c b/src/keyboard_at.c index ae124a2c6..cefe39b0d 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -8,7 +8,7 @@ * * Intel 8042 (AT keyboard controller) emulation. * - * Version: @(#)keyboard_at.c 1.0.37 2018/08/20 + * Version: @(#)keyboard_at.c 1.0.38 2018/09/12 * * Authors: Sarah Walker, * Miran Grca, @@ -2133,7 +2133,8 @@ kbd_read(uint16_t port, void *priv) case 0x60: ret = kbd->out; kbd->status &= ~(STAT_OFULL); - picintc(kbd->last_irq); + if (kbd->last_irq) + picintc(kbd->last_irq); kbd->last_irq = 0; break; diff --git a/src/mouse_ps2.c b/src/mouse_ps2.c index 16ec68b5e..9775a2cc6 100644 --- a/src/mouse_ps2.c +++ b/src/mouse_ps2.c @@ -8,7 +8,7 @@ * * Implementation of PS/2 series Mouse devices. * - * Version: @(#)mouse_ps2.c 1.0.9 2018/05/12 + * Version: @(#)mouse_ps2.c 1.0.10 2018/09/13 * * Authors: Fred N. van Kempen, */ @@ -132,7 +132,7 @@ ps2_write(uint8_t val, void *priv) case 0xe9: /* status request */ keyboard_at_adddata_mouse(0xfa); - temp = (dev->flags & 0x3f); + temp = (dev->flags & 0x30); if (mouse_buttons & 0x01) temp |= 0x01; if (mouse_buttons & 0x02) @@ -169,7 +169,7 @@ ps2_write(uint8_t val, void *priv) case 0xff: /* reset */ dev->mode = MODE_STREAM; - dev->flags &= 0x80; + dev->flags &= 0x88; keyboard_at_adddata_mouse(0xfa); keyboard_at_adddata_mouse(0xaa); keyboard_at_adddata_mouse(0x00); @@ -181,8 +181,9 @@ ps2_write(uint8_t val, void *priv) } if (dev->flags & FLAG_INTELLI) { - for (temp=0; temp<5; temp++) - dev->last_data[temp] = dev->last_data[temp+1]; + for (temp = 0; temp < 5; temp++) + dev->last_data[temp] = dev->last_data[temp + 1]; + dev->last_data[5] = val; if (dev->last_data[0] == 0xf3 && dev->last_data[1] == 0xc8 && @@ -197,19 +198,24 @@ static int ps2_poll(int x, int y, int z, int b, void *priv) { mouse_t *dev = (mouse_t *)priv; - uint8_t buff[3]; + uint8_t buff[3] = { 0x08, 0x00, 0x00 }; - if (!x && !y && !z && b == dev->b) return(0xff); + if (!x && !y && !z && (b == dev->b)) + return(0xff); - if (! (dev->flags & FLAG_ENABLED)) return(0xff); +#if 0 + if (!(dev->flags & FLAG_ENABLED)) + return(0xff); +#endif - if (! mouse_scan) return(0xff); + if (!mouse_scan) + return(0xff); dev->x += x; dev->y -= y; dev->z -= z; - if ((dev->mode == MODE_STREAM) && - ((mouse_queue_end-mouse_queue_start) & 0x0f) < 13) { + if ((dev->mode == MODE_STREAM) && (dev->flags & FLAG_ENABLED) && + (((mouse_queue_end - mouse_queue_start) & 0x0f) < 13)) { dev->b = b; if (dev->x > 255) dev->x = 255; @@ -219,8 +225,6 @@ ps2_poll(int x, int y, int z, int b, void *priv) if (dev->z < -8) dev->z = -8; if (dev->z > 7) dev->z = 7; - memset(buff, 0x00, sizeof(buff)); - buff[0] = 0x08; if (dev->x < 0) buff[0] |= 0x10; if (dev->y < 0) @@ -239,7 +243,7 @@ ps2_poll(int x, int y, int z, int b, void *priv) keyboard_at_adddata_mouse(buff[0]); keyboard_at_adddata_mouse(buff[1]); keyboard_at_adddata_mouse(buff[2]); - if (dev->flags & FLAG_INTELLI) + if (dev->flags & FLAG_INTMODE) keyboard_at_adddata_mouse(dev->z); dev->x = dev->y = dev->z = 0; @@ -273,7 +277,7 @@ mouse_ps2_init(const device_t *info) /* Hook into the general AT Keyboard driver. */ keyboard_at_set_mouse(ps2_write, dev); - mouse_ps2_log("%s: buttons=%d\n", dev->name, (dev->flags & FLAG_INTELLI)? 3 : 2); + mouse_ps2_log("%s: buttons=%d\n", dev->name, (dev->flags & FLAG_INTELLI) ? 3 : 2); /* Tell them how many buttons we have. */ mouse_set_buttons((dev->flags & FLAG_INTELLI) ? 3 : 2);