+};
+
+static int dispmode_current;
+
+void pl_switch_dispmode(void)
+{
+ if (pl_rearmed_cbs.gpu_caps & GPU_CAP_OWNS_DISPLAY)
+ return;
+
+ while (1) {
+ dispmode_current++;
+ if (dispmode_current >=
+ sizeof(dispmode_switchers) / sizeof(dispmode_switchers[0]))
+ dispmode_current = 0;
+ if (dispmode_switchers[dispmode_current]())
+ break;
+ }
+}
+
+#ifndef MAEMO
+/* adjust circle-like analog inputs to better match
+ * more square-like analogs in PSX */
+static void update_analog_nub_adjust(int *x_, int *y_)
+{
+ static const int scale[] = { 0, 0, 0, 12, 30, 60, 75, 60, 60 };
+ int x = *x_;
+ int y = *y_;
+
+ x += x * scale[abs(y) / 16] >> 8;
+ y += y * scale[abs(x) / 16] >> 8;
+
+ *x_ = x;
+ *y_ = y;
+}
+
+static void update_analogs(void)
+{
+ int *nubp[2] = { in_a1, in_a2 };
+ int vals[2];
+ int i, a, v, ret;
+
+ for (i = 0; i < 2; i++)
+ {
+ if (in_adev[i] < 0)
+ continue;
+
+ for (a = 0; a < 2; a++) {
+ vals[a] = 0;
+
+ ret = in_update_analog(in_adev[i], in_adev_axis[i][a], &v);
+ if (ret == 0)
+ vals[a] = 128 * v / IN_ABS_RANGE;
+ }
+
+ if (in_adev_is_nublike[i])
+ update_analog_nub_adjust(&vals[0], &vals[1]);
+
+ for (a = 0; a < 2; a++) {
+ v = vals[a] + 127;
+ if (v < 0) v = 0;
+ else if (v > 255) v = 255;
+ nubp[i][a] = v;
+ }
+
+ }
+ //printf("%4d %4d %4d %4d\n", in_a1[0], in_a1[1], in_a2[0], in_a2[1]);