Index: /trunk/src/VBox/Devices/Input/DevPS2.cpp
===================================================================
--- /trunk/src/VBox/Devices/Input/DevPS2.cpp	(revision 30415)
+++ /trunk/src/VBox/Devices/Input/DevPS2.cpp	(revision 30416)
@@ -681,6 +681,5 @@
 
 /**
- * Send a single relative packet in 3-byte PS/2 format, optionally with our
- * packed button protocol extension, to the PS/2 controller.
+ * Send a single relative packet in 3-byte PS/2 format to the PS/2 controller.
  * @param  s               keyboard state object
  * @param  dx              relative X value, must be between -256 and +255
@@ -727,32 +726,34 @@
 {
     int aux = fToCmdQueue ? 1 : 2;
-
-    if (s->mouse_dw)
-    {
-        int dw1 = s->mouse_dw < 0 ? RT_MAX(s->mouse_dw, -31)
-                                  : RT_MIN(s->mouse_dw, 32);
+    int dz1 = 0, dw1 = 0;
+    unsigned fButtonsHigh = s->mouse_buttons & 0x18;
+
+    if (s->mouse_dw > 0)
+        dw1 = 1;
+    else if (s->mouse_dw < 0)
+        dw1 = -1;
+    else if (s->mouse_dz > 0)
+        dz1 = 1;
+    else if (s->mouse_dz < 0)
+        dz1 = -1;
+    if (s->mouse_dw && s->mouse_flags & MOUSE_REPORT_HORIZONTAL)
+    {
         LogRel3(("%s: dw1=%d\n", __PRETTY_FUNCTION__, dw1));
-        s->mouse_dw -= dw1;
         kbd_queue(s, 0x40 | (dw1 & 0x3f), aux);
     }
-    else if (s->mouse_flags & MOUSE_REPORT_HORIZONTAL && s->mouse_dz)
-    {
-        int dz1 = s->mouse_dz < 0 ? RT_MAX(s->mouse_dz, -31)
-                                  : RT_MIN(s->mouse_dz, 32);
-        LogRel3(("%s: dz1=%d\n", __PRETTY_FUNCTION__, dz1));
-        s->mouse_dz -= dz1;
-        kbd_queue(s, 0x80 | (dz1 & 0x3f), aux);
-    }
     else
     {
-        int dz1 = s->mouse_dz < 0 ? RT_MAX(s->mouse_dz, -7)
-                                  : RT_MIN(s->mouse_dz, 8);
-        unsigned fButtonsHigh = s->mouse_buttons & 0x18;
-        LogRel3(("%s: dz1=%d fButtonsHigh=0x%x\n",
-                 __PRETTY_FUNCTION__, dz1, fButtonsHigh));
-        s->mouse_dz -= dz1;
+        LogRel3(("%s: dz1=%d, dw1=%d, fButtonsHigh=0x%x\n",
+                 __PRETTY_FUNCTION__, dz1, dw1, fButtonsHigh));
+        unsigned u4Low =   dw1 > 0 ? 9 /* -7 & 0xf */
+                         : dw1 < 0 ? 7
+                         : dz1 > 0 ? 1
+                         : dz1 < 0 ? 0xf /* -1 & 0xf */
+                         : 0;
         kbd_mouse_set_reported_buttons(s, fButtonsHigh, 0x18);
-        kbd_queue(s, (dz1 & 0x0f) | (fButtonsHigh << 1), aux);
-    }
+        kbd_queue(s, (fButtonsHigh << 1) | u4Low, aux);
+    }
+    s->mouse_dz -= dz1;
+    s->mouse_dw -= dw1;
 }
 
@@ -806,6 +807,5 @@
         || (s->mouse_type == MOUSE_PROT_IMEX))
         s->mouse_dz += dz;
-    if (   (   (s->mouse_type == MOUSE_PROT_IMEX)
-            && s->mouse_flags & MOUSE_REPORT_HORIZONTAL))
+    if (s->mouse_type == MOUSE_PROT_IMEX)
         s->mouse_dw += dw;
     s->mouse_buttons = buttons_state;
