From: twinaphex Date: Fri, 7 Jun 2013 19:22:31 +0000 (+0200) Subject: Merge git://github.com/notaz/pcsx_rearmed X-Git-Tag: r24l~923 X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0adc1d662ed933b8d3369746fc7cf25736b1219;hp=9b56b10a186877d32c47be051250ffb307404e78;p=pcsx_rearmed.git Merge git://github.com/notaz/pcsx_rearmed --- diff --git a/frontend/libretro.c b/frontend/libretro.c index ec034c20..103ee8e5 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "../libpcsxcore/misc.h" #include "../libpcsxcore/psxcounters.h" @@ -861,13 +862,67 @@ void retro_run(void) vout_fb_dirty = 0; } +static bool try_use_bios(const char *path) +{ + FILE *f; + long size; + const char *name; + + f = fopen(path, "rb"); + if (f == NULL) + return false; + + fseek(f, 0, SEEK_END); + size = ftell(f); + fclose(f); + + if (size != 512 * 1024) + return false; + + name = strrchr(path, SLASH); + if (name++ == NULL) + name = path; + snprintf(Config.Bios, sizeof(Config.Bios), "%s", name); + return true; +} + +#if 1 +#include +#include + +static bool find_any_bios(const char *dirpath, char *path, size_t path_size) +{ + DIR *dir; + struct dirent *ent; + bool ret = false; + + dir = opendir(dirpath); + if (dir == NULL) + return false; + + while ((ent = readdir(dir))) { + if (strncasecmp(ent->d_name, "scph", 4) != 0) + continue; + + snprintf(path, path_size, "%s/%s", dirpath, ent->d_name); + ret = try_use_bios(path); + if (ret) + break; + } + closedir(dir); + return ret; +} +#else +#define find_any_bios(...) false +#endif + void retro_init(void) { const char *bios[] = { "scph1001", "scph5501", "scph7001" }; const char *dir; char path[256]; - FILE *f = NULL; int i, ret, level; + bool found_bios = false; ret = emu_core_preinit(); ret |= emu_core_init(); @@ -884,27 +939,27 @@ void retro_init(void) for (i = 0; i < sizeof(bios) / sizeof(bios[0]); i++) { snprintf(path, sizeof(path), "%s/%s.bin", dir, bios[i]); - f = fopen(path, "r"); - if (f != NULL) { - snprintf(Config.Bios, sizeof(Config.Bios), "%s.bin", bios[i]); + found_bios = try_use_bios(path); + if (found_bios) break; - } } + + if (!found_bios) + found_bios = find_any_bios(dir, path, sizeof(path)); } - if (f != NULL) { + if (found_bios) { SysPrintf("found BIOS file: %s\n", Config.Bios); - fclose(f); } else - { + { SysPrintf("no BIOS files found.\n"); - struct retro_message msg = - { - "no BIOS found, expect bugs!", - 180 - }; - environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg); - } + struct retro_message msg = + { + "no BIOS found, expect bugs!", + 180 + }; + environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg); + } level = 1; environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level); diff --git a/libpcsxcore/cdriso.c b/libpcsxcore/cdriso.c index bfa7d763..d6672f98 100644 --- a/libpcsxcore/cdriso.c +++ b/libpcsxcore/cdriso.c @@ -34,6 +34,7 @@ #include #include #endif +#include #include unsigned int cdrIsoMultidiskCount; @@ -1222,6 +1223,8 @@ static long CALLBACK ISOopen(void) { cdHandle = fopen(GetIsoFile(), "rb"); if (cdHandle == NULL) { + SysPrintf(_("Could't open '%s' for reading: %s\n"), + GetIsoFile(), strerror(errno)); return -1; } diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c index 84370089..d8d89913 100644 --- a/libpcsxcore/new_dynarec/new_dynarec.c +++ b/libpcsxcore/new_dynarec/new_dynarec.c @@ -21,6 +21,7 @@ #include #include //include for uint64_t #include +#include #include #include "emu_if.h" //emulator interface @@ -8005,6 +8006,28 @@ void disassemble_inst(int i) static void disassemble_inst(int i) {} #endif // DISASM +#define DRC_TEST_VAL 0x74657374 + +static int new_dynarec_test(void) +{ + int (*testfunc)(void) = (void *)out; + int ret; + emit_movimm(DRC_TEST_VAL,0); // test + emit_jmpreg(14); + literal_pool(0); +#ifdef __arm__ + __clear_cache((void *)testfunc, out); +#endif + SysPrintf("testing if we can run recompiled code..\n"); + ret = testfunc(); + if (ret == DRC_TEST_VAL) + SysPrintf("test passed.\n"); + else + SysPrintf("test failed: %08x\n", ret); + out=(u_char *)BASE_ADDR; + return ret == DRC_TEST_VAL; +} + // clear the state completely, instead of just marking // things invalid like invalidate_all_pages() does void new_dynarec_clear_full() @@ -8039,17 +8062,19 @@ void new_dynarec_clear_full() void new_dynarec_init() { - printf("Init new dynarec\n"); + SysPrintf("Init new dynarec\n"); out=(u_char *)BASE_ADDR; #if BASE_ADDR_FIXED if (mmap (out, 1<