X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro.c;h=b8b11665fa2f4c1cbd2198bd4f0e7da75b3eced7;hb=b34d6a805a50ee4a897b0a53bbc0b89e3eb7f72e;hp=6a3a97c99d02f7053528044a8422ada13272b9c8;hpb=308c6e678a2f0a56a9dee35307070550354f580c;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index 6a3a97c9..b8b11665 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -29,7 +29,6 @@ #include "../libpcsxcore/r3000a.h" #include "../plugins/dfsound/out.h" #include "../plugins/dfsound/spu_config.h" -#include "../plugins/dfinput/externals.h" #include "cspace.h" #include "main.h" #include "menu.h" @@ -81,6 +80,7 @@ static void *vout_buf; static void *vout_buf_ptr; static int vout_width, vout_height; static int vout_fb_dirty; +static int psx_w, psx_h; static bool vout_can_dupe; static bool duping_enable; static bool found_bios; @@ -240,6 +240,8 @@ static void vout_set_mode(int w, int h, int raw_w, int raw_h, int bpp) { vout_width = w; vout_height = h; + psx_w = raw_w; + psx_h = raw_h; if (previous_width != vout_width || previous_height != vout_height) { @@ -514,7 +516,7 @@ void plat_trigger_vibrate(int pad, int low, int high) } } -void pl_update_gun(int *xn, int *yn, int *xres, int *yres, int *in) +void pl_gun_byte2(int port, unsigned char byte) { } @@ -991,12 +993,13 @@ void retro_cheat_reset(void) void retro_cheat_set(unsigned index, bool enabled, const char *code) { - char buf[256]; - int ret; + int ret = -1; + char *buf; - // cheat funcs are destructive, need a copy.. - strncpy(buf, code, sizeof(buf)); - buf[sizeof(buf) - 1] = 0; + // cheat funcs are destructive, need a copy... + buf = strdup(code); + if (buf == NULL) + goto finish; //Prepare buffered cheat for PCSX's AddCheat fucntion. int cursor = 0; @@ -1022,10 +1025,12 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code) else ret = AddCheat("", buf); +finish: if (ret != 0) SysPrintf("Failed to set cheat %#u\n", index); else if (index < NumCheats) Cheats[index].Enabled = enabled; + free(buf); } // just in case, maybe a win-rt port in the future? @@ -1948,18 +1953,13 @@ static void update_variables(bool in_flight) { R3000Acpu *prev_cpu = psxCpu; -#if defined(LIGHTREC) - bool can_use_dynarec = found_bios; -#else - bool can_use_dynarec = 1; -#endif #ifdef _3DS if (!__ctr_svchax) Config.Cpu = CPU_INTERPRETER; else #endif - if (strcmp(var.value, "disabled") == 0 || !can_use_dynarec) + if (strcmp(var.value, "disabled") == 0) Config.Cpu = CPU_INTERPRETER; else if (strcmp(var.value, "enabled") == 0) Config.Cpu = CPU_DYNAREC; @@ -2470,19 +2470,21 @@ static void update_input_guncon(int port, int ret) //Mouse range is -32767 -> 32767 //1% is about 655 //Use the left analog stick field to store the absolute coordinates - //Fix cursor to top-left when gun is detected as "offscreen" + + int gunx = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); + int guny = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + + //Have the Libretro API let /libpcsxcore/plugins.c know when the lightgun is pointed offscreen + //Offscreen value is chosen to be well out of range of any possible scaling done via core options if (input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN) || input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD)) { - in_analog_left[port][0] = -32767; - in_analog_left[port][1] = -32767; + in_analog_left[port][0] = 65536; + in_analog_left[port][1] = 65536; } else { - int gunx = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); - int guny = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); - - in_analog_left[port][0] = (gunx * GunconAdjustRatioX) + (GunconAdjustX * 655); - in_analog_left[port][1] = (guny * GunconAdjustRatioY) + (GunconAdjustY * 655); + in_analog_left[port][0] = ((gunx * GunconAdjustRatioX) + (GunconAdjustX * 655)) / 64 + 512; + in_analog_left[port][1] = ((guny * GunconAdjustRatioY) + (GunconAdjustY * 655)) / 64 + 512; } //GUNCON has 3 controls, Trigger,A,B which equal Circle,Start,Cross @@ -2816,7 +2818,7 @@ void retro_run(void) set_vout_fb(); } -static bool try_use_bios(const char *path) +static bool try_use_bios(const char *path, bool preferred_only) { long size; const char *name; @@ -2828,12 +2830,20 @@ static bool try_use_bios(const char *path) size = ftell(fp); fclose(fp); - if (size != 512 * 1024) - return false; - name = strrchr(path, SLASH); if (name++ == NULL) name = path; + + if (preferred_only && size != 512 * 1024) + return false; + if (size != 512 * 1024 && size != 4 * 1024 * 1024) + return false; + if (strstr(name, "unirom")) + return false; + // jp bios have an addidional region check + if (preferred_only && (strcasestr(name, "00.") || strcasestr(name, "j.bin"))) + return false; + snprintf(Config.Bios, sizeof(Config.Bios), "%s", name); return true; } @@ -2844,7 +2854,8 @@ static bool try_use_bios(const char *path) static bool find_any_bios(const char *dirpath, char *path, size_t path_size) { - static const char *substrings[] = { "scph", "ps", "openbios" }; + static const char *substr_pref[] = { "scph", "ps" }; + static const char *substr_alt[] = { "scph", "ps", "openbios" }; DIR *dir; struct dirent *ent; bool ret = false; @@ -2854,27 +2865,39 @@ static bool find_any_bios(const char *dirpath, char *path, size_t path_size) if (dir == NULL) return false; - for (i = 0; i < (sizeof(substrings) / sizeof(substrings[0])); i++) + // try to find a "better" bios + while ((ent = readdir(dir))) { - const char *substr = substrings[i]; - size_t len = strlen(substr); - rewinddir(dir); - while ((ent = readdir(dir))) + for (i = 0; i < sizeof(substr_pref) / sizeof(substr_pref[0]); i++) { - if ((strncasecmp(ent->d_name, substr, len) != 0)) - continue; - if (strstr(ent->d_name, "unirom")) + const char *substr = substr_pref[i]; + if ((strncasecmp(ent->d_name, substr, strlen(substr)) != 0)) continue; + snprintf(path, path_size, "%s%c%s", dirpath, SLASH, ent->d_name); + ret = try_use_bios(path, true); + if (ret) + goto finish; + } + } + // another pass to look for anything fitting, even ps2 bios + rewinddir(dir); + while ((ent = readdir(dir))) + { + for (i = 0; i < sizeof(substr_alt) / sizeof(substr_alt[0]); i++) + { + const char *substr = substr_alt[i]; + if ((strncasecmp(ent->d_name, substr, strlen(substr)) != 0)) + continue; snprintf(path, path_size, "%s%c%s", dirpath, SLASH, ent->d_name); - ret = try_use_bios(path); + ret = try_use_bios(path, false); if (ret) - { - closedir(dir); - return ret; - } + goto finish; } } + + +finish: closedir(dir); return ret; } @@ -2971,7 +2994,7 @@ static void loadPSXBios(void) for (i = 0; i < sizeof(bios) / sizeof(bios[0]); i++) { snprintf(path, sizeof(path), "%s%c%s.bin", dir, SLASH, bios[i]); - found_bios = try_use_bios(path); + found_bios = try_use_bios(path, true); if (found_bios) break; } @@ -3097,7 +3120,6 @@ void retro_init(void) #endif pl_rearmed_cbs.gpu_peops.iUseDither = 1; pl_rearmed_cbs.gpu_peops.dwActFixes = GPU_PEOPS_OLD_FRAME_SKIP; - spu_config.iUseFixedUpdates = 1; SaveFuncs.open = save_open; SaveFuncs.read = save_read;