aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortwinaphex2013-06-07 21:22:31 +0200
committertwinaphex2013-06-07 21:22:31 +0200
commitc0adc1d662ed933b8d3369746fc7cf25736b1219 (patch)
tree919084d5dd0190d423f02721598d5f0961811e33
parent9b56b10a186877d32c47be051250ffb307404e78 (diff)
parentd848b60a3da875fca0b1f2ddf8a4ae9d487d685b (diff)
downloadpcsx_rearmed-c0adc1d662ed933b8d3369746fc7cf25736b1219.tar.gz
pcsx_rearmed-c0adc1d662ed933b8d3369746fc7cf25736b1219.tar.bz2
pcsx_rearmed-c0adc1d662ed933b8d3369746fc7cf25736b1219.zip
Merge git://github.com/notaz/pcsx_rearmed
-rw-r--r--frontend/libretro.c85
-rw-r--r--libpcsxcore/cdriso.c3
-rw-r--r--libpcsxcore/new_dynarec/new_dynarec.c32
-rw-r--r--libpcsxcore/psxmem.c14
4 files changed, 110 insertions, 24 deletions
diff --git a/frontend/libretro.c b/frontend/libretro.c
index ec034c2..103ee8e 100644
--- a/frontend/libretro.c
+++ b/frontend/libretro.c
@@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <strings.h>
#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 <sys/types.h>
+#include <dirent.h>
+
+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 bfa7d76..d6672f9 100644
--- a/libpcsxcore/cdriso.c
+++ b/libpcsxcore/cdriso.c
@@ -34,6 +34,7 @@
#include <sys/time.h>
#include <unistd.h>
#endif
+#include <errno.h>
#include <zlib.h>
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 8437008..d8d8991 100644
--- a/libpcsxcore/new_dynarec/new_dynarec.c
+++ b/libpcsxcore/new_dynarec/new_dynarec.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <stdint.h> //include for uint64_t
#include <assert.h>
+#include <errno.h>
#include <sys/mman.h>
#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<<TARGET_SIZE_2,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0) <= 0) {SysPrintf("mmap() failed\n");}
+ -1, 0) <= 0) {
+ SysPrintf("mmap() failed: %s\n", strerror(errno));
+ }
#else
// not all systems allow execute in data segment by default
if (mprotect(out, 1<<TARGET_SIZE_2, PROT_READ | PROT_WRITE | PROT_EXEC) != 0)
- SysPrintf("mprotect() failed\n");
+ SysPrintf("mprotect() failed: %s\n", strerror(errno));
#endif
#ifdef MUPEN64
rdword=&readmem_dword;
@@ -8104,6 +8129,7 @@ void new_dynarec_init()
#endif
tlb_hacks();
arch_init();
+ new_dynarec_test();
#ifndef RAM_FIXED
ram_offset=(u_int)rdram-0x80000000;
#endif
diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c
index 4da0cf4..2ca5dd5 100644
--- a/libpcsxcore/psxmem.c
+++ b/libpcsxcore/psxmem.c
@@ -95,7 +95,8 @@ void psxUnmap(void *ptr, size_t size, enum psxMapTag tag)
return;
}
- munmap(ptr, size);
+ if (ptr)
+ munmap(ptr, size);
}
s8 *psxM = NULL; // Kernel & User Memory (2 Meg)
@@ -155,6 +156,7 @@ int psxMemInit() {
if (psxMemRLUT == NULL || psxMemWLUT == NULL ||
psxR == NULL || psxP == NULL || psxH != (void *)0x1f800000) {
SysMessage(_("Error allocating memory!"));
+ psxMemShutdown();
return -1;
}
@@ -208,12 +210,12 @@ void psxMemReset() {
}
void psxMemShutdown() {
- psxUnmap(psxM, 0x00210000, MAP_TAG_RAM);
- psxUnmap(psxH, 0x10000, MAP_TAG_OTHER);
- psxUnmap(psxR, 0x80000, MAP_TAG_OTHER);
+ psxUnmap(psxM, 0x00210000, MAP_TAG_RAM); psxM = NULL;
+ psxUnmap(psxH, 0x10000, MAP_TAG_OTHER); psxH = NULL;
+ psxUnmap(psxR, 0x80000, MAP_TAG_OTHER); psxR = NULL;
- free(psxMemRLUT);
- free(psxMemWLUT);
+ free(psxMemRLUT); psxMemRLUT = NULL;
+ free(psxMemWLUT); psxMemWLUT = NULL;
}
static int writeok = 1;