X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Flibretro.c;h=a6bc50f09b5910862cc282b36089f91d3501fece;hb=8c8b72847259871bc50cd796383d9eeb83970bb1;hp=40dc394e96b42e7adca43b1bcda9b253b09ccf28;hpb=2446536be520914616403876d7e49621ac6f4b95;p=picodrive.git diff --git a/platform/libretro.c b/platform/libretro.c index 40dc394..a6bc50f 100644 --- a/platform/libretro.c +++ b/platform/libretro.c @@ -11,6 +11,7 @@ #include #include #include +#include #ifdef __MACH__ #include #endif @@ -20,6 +21,10 @@ #include "common/version.h" #include "libretro.h" +#ifndef MAP_ANONYMOUS +#define MAP_ANONYMOUS MAP_ANON +#endif + static retro_video_refresh_t video_cb; static retro_input_poll_t input_poll_cb; static retro_input_state_t input_state_cb; @@ -71,8 +76,10 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed) req = (void *)addr; ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0); - if (ret == MAP_FAILED) + if (ret == MAP_FAILED) { + lprintf("mmap(%08lx, %zd) failed: %d\n", addr, size, errno); return NULL; + } if (addr != 0 && ret != (void *)addr) { lprintf("warning: wanted to map @%08lx, got %p\n", @@ -89,11 +96,35 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed) void *plat_mremap(void *ptr, size_t oldsize, size_t newsize) { +#ifdef __linux__ void *ret = mremap(ptr, oldsize, newsize, 0); if (ret == MAP_FAILED) return NULL; return ret; +#else + void *tmp, *ret; + size_t preserve_size; + + preserve_size = oldsize; + if (preserve_size > newsize) + preserve_size = newsize; + tmp = malloc(preserve_size); + if (tmp == NULL) + return NULL; + memcpy(tmp, ptr, preserve_size); + + munmap(ptr, oldsize); + ret = mmap(ptr, newsize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (ret == MAP_FAILED) { + free(tmp); + return NULL; + } + memcpy(ret, tmp, preserve_size); + free(tmp); + return ret; +#endif } void plat_munmap(void *ptr, size_t size) @@ -102,6 +133,15 @@ void plat_munmap(void *ptr, size_t size) munmap(ptr, size); } +int plat_mem_set_exec(void *ptr, size_t size) +{ + int ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC); + if (ret != 0) + lprintf("mprotect(%p, %zd) failed: %d\n", ptr, size, errno); + + return ret; +} + void emu_video_mode_change(int start_line, int line_count, int is_32cols) { memset(vout_buf, 0, 320 * 240 * 2); @@ -175,7 +215,7 @@ void retro_get_system_info(struct retro_system_info *info) memset(info, 0, sizeof(*info)); info->library_name = "PicoDrive"; info->library_version = VERSION; - info->valid_extensions = "bin|gen|smd|32x|cue|iso|sms"; + info->valid_extensions = "bin|gen|smd|md|32x|cue|iso|sms"; info->need_fullpath = true; } @@ -559,9 +599,12 @@ void retro_init(void) environ_cb(RETRO_ENVIRONMENT_SET_DISK_CONTROL_INTERFACE, &disk_control); PicoOpt = POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80 - | POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC - | POPT_ACC_SPRITES|POPT_EN_32X|POPT_EN_PWM - | POPT_DIS_32C_BORDER; + | POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_MCD_GFX + | POPT_EN_32X|POPT_EN_PWM + | POPT_ACC_SPRITES|POPT_DIS_32C_BORDER; +#ifdef __arm__ + PicoOpt |= POPT_EN_SVP_DRC; +#endif PsndRate = 44100; PicoAutoRgnOrder = 0x184; // US, EU, JP PicoCDBuffers = 0;