X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fplugin_lib.c;h=9cbfe597b31dae5d72b7190465c94df3c00891de;hp=79f41fed29207913e5309c475a873dd86b05d498;hb=e4c83ca67cf7ad13db3995909605ce01ff915824;hpb=cc56203b76e1fcef2c7e55b460daf07e654a1547 diff --git a/frontend/plugin_lib.c b/frontend/plugin_lib.c index 79f41fed..9cbfe597 100644 --- a/frontend/plugin_lib.c +++ b/frontend/plugin_lib.c @@ -31,10 +31,12 @@ #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../libpcsxcore/psemu_plugin_defs.h" #include "../plugins/gpulib/cspace.h" +#include "../plugins/dfinput/externals.h" int in_type1, in_type2; int in_a1[2] = { 127, 127 }, in_a2[2] = { 127, 127 }; int in_adev[2] = { -1, -1 }, in_adev_axis[2][2] = {{ 0, 1 }, { 0, 1 }}; +int in_adev_is_nublike[2]; int in_keystate, in_state_gun; int in_enable_vibration; void *tsdev; @@ -71,20 +73,24 @@ static __attribute__((noinline)) int get_cpu_ticks(void) static void print_msg(int h, int border) { if (pl_vout_bpp == 16) - pl_text_out16(border + 2, h - 10, "%s", hud_msg); + basic_text_out16_nf(pl_vout_buf, pl_vout_w, + border + 2, h - 10, hud_msg); } static void print_fps(int h, int border) { if (pl_vout_bpp == 16) - pl_text_out16(border + 2, h - 10, "%2d %4.1f", + basic_text_out16(pl_vout_buf, pl_vout_w, + border + 2, h - 10, "%2d %4.1f", pl_rearmed_cbs.flips_per_sec, pl_rearmed_cbs.vsps_cur); } static void print_cpu_usage(int w, int h, int border) { if (pl_vout_bpp == 16) - pl_text_out16(w - border - 28, h - 10, "%3d", pl_rearmed_cbs.cpu_usage); + basic_text_out16(pl_vout_buf, pl_vout_w, + pl_vout_w - border - 28, h - 10, + "%3d", pl_rearmed_cbs.cpu_usage); } // draw 192x8 status of 24 sound channels @@ -122,6 +128,8 @@ void pl_print_hud(int w, int h, int xborder) if (h < 16) return; + xborder += (pl_vout_w - w) / 2; + if (g_opts & OPT_SHOWSPU) draw_active_chans(w, h); @@ -192,7 +200,7 @@ static int resolution_ok(int w, int h) return w <= 1024 && h <= 512; } -static void pl_vout_set_mode(int w, int h, int bpp) +static void pl_vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) { int vout_w, vout_h, vout_bpp; @@ -202,8 +210,10 @@ static void pl_vout_set_mode(int w, int h, int bpp) h = (h + 7) & ~7; vsync_cnt_ms_prev = vsync_cnt; - vout_w = psx_w = w; - vout_h = psx_h = h; + psx_w = raw_w; + psx_h = raw_h; + vout_w = w; + vout_h = h; vout_bpp = psx_bpp = bpp; pl_vout_scale = 1; @@ -230,7 +240,7 @@ static void pl_vout_set_mode(int w, int h, int bpp) pl_vout_buf = plat_gvideo_set_mode(&vout_w, &vout_h, &vout_bpp); if (pl_vout_buf == NULL) fprintf(stderr, "failed to set mode %dx%d@%d\n", - psx_w, psx_h, psx_bpp); + vout_w, vout_h, psx_bpp); else { pl_vout_w = vout_w; pl_vout_h = vout_h; @@ -383,7 +393,7 @@ int dispmode_doubleres(void) int dispmode_scale2x(void) { - if (psx_bpp != 16) + if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16) return 0; dispmode_default(); @@ -394,7 +404,7 @@ int dispmode_scale2x(void) int dispmode_eagle2x(void) { - if (psx_bpp != 16) + if (!resolution_ok(psx_w * 2, psx_h * 2) || psx_bpp != 16) return 0; dispmode_default(); @@ -430,9 +440,39 @@ void pl_switch_dispmode(void) } #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_) +{ + #define d 16 + static const int scale[] = + { 0 - d*2, 0 - d*2, 0 - d*2, 12 - d*2, + 30 - d*2, 60 - d*2, 75 - d*2, 60 - d*2, 60 - d*2 }; + int x = abs(*x_); + int y = abs(*y_); + int scale_x = scale[y / 16]; + int scale_y = scale[x / 16]; + + if (x) { + x += d + (x * scale_x >> 8); + if (*x_ < 0) + x = -x; + } + if (y) { + y += d + (y * scale_y >> 8); + if (*y_ < 0) + y = -y; + } + + *x_ = x; + *y_ = y; + #undef d +} + 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++) @@ -441,14 +481,23 @@ static void update_analogs(void) continue; for (a = 0; a < 2; a++) { - nubp[i][a] = 127; + vals[a] = 0; ret = in_update_analog(in_adev[i], in_adev_axis[i][a], &v); - if (ret == 0) { - v = v / (IN_ABS_RANGE / 128) + 127; - nubp[i][a] = v < 0 ? 0 : 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]); } @@ -474,11 +523,6 @@ static void update_input(void) emu_set_action(emu_act); in_keystate = actions[IN_BINDTYPE_PLAYER12]; -#ifdef X11 - extern int x11_update_keys(unsigned int *action); - in_keystate |= x11_update_keys(&emu_act); - emu_set_action(emu_act); -#endif } #else /* MAEMO */ static void update_input(void) @@ -486,13 +530,13 @@ static void update_input(void) } #endif -void pl_update_gun(int *xn, int *xres, int *y, int *in) +void pl_update_gun(int *xn, int *yn, int *xres, int *yres, int *in) { if (tsdev) - pl_gun_ts_update(tsdev, xn, y, in); + pl_gun_ts_update(tsdev, xn, yn, in); - *xres = pl_vout_w; - *y = *y * pl_vout_h >> 10; + *xres = psx_w; + *yres = psx_h; } #define MAX_LAG_FRAMES 3 @@ -607,57 +651,6 @@ void pl_timing_prepare(int is_pal_) (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100)); } -static void pl_text_out16_(int x, int y, const char *text) -{ - int i, l, w = pl_vout_w; - unsigned short *screen; - unsigned short val = 0xffff; - - x &= ~1; - screen = (unsigned short *)pl_vout_buf + x + y * w; - for (i = 0; ; i++, screen += 8) - { - char c = text[i]; - if (c == 0) - break; - if (c == ' ') - continue; - - for (l = 0; l < 8; l++) - { - unsigned char fd = fontdata8x8[c * 8 + l]; - unsigned short *s = screen + l * w; - unsigned int *s32 = (void *)s; - - s32[0] = (s32[0] >> 1) & 0x7bef7bef; - s32[1] = (s32[1] >> 1) & 0x7bef7bef; - s32[2] = (s32[2] >> 1) & 0x7bef7bef; - s32[3] = (s32[3] >> 1) & 0x7bef7bef; - - if (fd&0x80) s[0] = val; - if (fd&0x40) s[1] = val; - if (fd&0x20) s[2] = val; - if (fd&0x10) s[3] = val; - if (fd&0x08) s[4] = val; - if (fd&0x04) s[5] = val; - if (fd&0x02) s[6] = val; - if (fd&0x01) s[7] = val; - } - } -} - -void pl_text_out16(int x, int y, const char *texto, ...) -{ - va_list args; - char buffer[256]; - - va_start(args, texto); - vsnprintf(buffer, sizeof(buffer), texto, args); - va_end(args); - - pl_text_out16_(x, y, buffer); -} - static void pl_get_layer_pos(int *x, int *y, int *w, int *h) { *x = g_layer_x;