diff -urN wine-1.9.5-orig/dlls/dinput/joystick.c wine-1.9.5/dlls/dinput/joystick.c
--- wine-1.9.5-orig/dlls/dinput/joystick.c	2016-03-05 00:46:54 +0900
+++ wine-1.9.5/dlls/dinput/joystick.c	2016-03-18 13:23:01 +0900
@@ -34,6 +34,10 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dinput);
 
+/* %/100 of axis input range to treat as full input (like lDeadZone but on the high end).
+ * Static global because I don't feel like messing with structures right now. */
+static int high_deadzone = 10000;
+
 static inline JoystickGenericImpl *impl_from_IDirectInputDevice8A(IDirectInputDevice8A *iface)
 {
     return CONTAINING_RECORD(CONTAINING_RECORD(iface, IDirectInputDeviceImpl, IDirectInputDevice8A_iface), JoystickGenericImpl, base);
@@ -880,16 +884,25 @@
 {
     LONG ret;
     LONG dead_zone = MulDiv( props->lDeadZone, props->lDevMax - props->lDevMin, 10000 );
-    LONG dev_range = props->lDevMax - props->lDevMin - dead_zone;
+    LONG high_dead_zone = MulDiv( 10000 - high_deadzone, props->lDevMax - props->lDevMin, 10000 );
+    LONG dev_range = props->lDevMax - props->lDevMin - dead_zone - high_dead_zone;
 
     /* Center input */
     val -= (props->lDevMin + props->lDevMax) / 2;
 
     /* Remove dead zone */
     if (abs( val ) <= dead_zone / 2)
+    {
         val = 0;
+    }
     else
+    {
         val = val < 0 ? val + dead_zone / 2 : val - dead_zone / 2;
+        if (abs( val ) > dev_range)
+        {
+            val = val < 0 ? -dev_range : dev_range;
+        }
+    }
 
     /* Scale and map the value from the device range into the required range */
     ret = MulDiv( val, props->lMax - props->lMin, dev_range ) +
@@ -943,8 +956,13 @@
 
     if (!get_config_key(hkey, appkey, "DefaultDeadZone", buffer, sizeof(buffer)))
     {
-        This->deadzone = atoi(buffer);
+        char *s;
+        This->deadzone = strtol(buffer, &s, 10);
         TRACE("setting default deadzone to: \"%s\" %d\n", buffer, This->deadzone);
+        if (*s == ',') {
+            high_deadzone = strtol(s+1, NULL, 10);
+            TRACE("setting high deadzone to: \"%s\" %d\n", buffer, high_deadzone);
+        }
     }
 
     This->axis_map = HeapAlloc(GetProcessHeap(), 0, This->device_axis_count * sizeof(int));
