Report git version with library_version
[picodrive.git] / platform / libretro / libretro.c
index 581702c..9588bc8 100644 (file)
@@ -1,6 +1,8 @@
 /*
  * libretro core glue for PicoDrive
  * (C) notaz, 2013
+ * (C) aliaspider, 2016
+ * (C) Daniel De Matteis, 2013
  *
  * This work is licensed under the terms of MAME license.
  * See COPYING file in the top-level directory.
@@ -38,6 +40,15 @@ void* linearMemAlign(size_t size, size_t alignment);
 void linearFree(void* mem);
 
 static int ctr_svchack_successful = 0;
+
+#elif defined(VITA)
+#define TARGET_SIZE_2 24 // 2^24 = 16 megabytes
+
+#include <psp2/kernel/sysmem.h>
+static int sceBlock;
+int getVMBlock();
+int _newlib_vm_size_user = 1 << TARGET_SIZE_2;
+
 #endif
 
 #include <pico/pico_int.h>
@@ -83,14 +94,16 @@ static void snd_write(int len);
 void cache_flush_d_inval_i(void *start, void *end)
 {
 #ifdef __arm__
+   size_t len = (char *)end - (char *)start;
 #if defined(__BLACKBERRY_QNX__)
    msync(start, end - start, MS_SYNC | MS_CACHE_ONLY | MS_INVALIDATE_ICACHE);
 #elif defined(__MACH__)
-   size_t len = (char *)end - (char *)start;
    sys_dcache_flush(start, len);
    sys_icache_invalidate(start, len);
 #elif defined(_3DS)
    ctr_flush_invalidate_cache();
+#elif defined(VITA)
+   sceKernelSyncVMDomain(sceBlock, start, len);
 #else
    __clear_cache(start, end);
 #endif
@@ -444,7 +457,8 @@ int plat_mem_set_exec(void *ptr, size_t size)
       exit(1);
    }
 
-
+#elif defined(VITA)
+   int ret = sceKernelOpenVMDomain();
 #else
    int ret = mprotect(ptr, size, PROT_READ | PROT_WRITE | PROT_EXEC);
    if (ret != 0 && log_cb)
@@ -525,7 +539,10 @@ void retro_get_system_info(struct retro_system_info *info)
 {
    memset(info, 0, sizeof(*info));
    info->library_name = "PicoDrive";
-   info->library_version = VERSION;
+#ifndef GIT_VERSION
+#define GIT_VERSION ""
+#endif
+   info->library_version = VERSION GIT_VERSION;
    info->valid_extensions = "bin|gen|smd|md|32x|cue|iso|sms";
    info->need_fullpath = true;
 }
@@ -865,6 +882,22 @@ static const char *find_bios(int *region, const char *cd_fname)
    return NULL;
 }
 
+static void sram_reset()
+{
+   SRam.data = NULL;
+   SRam.start = 0;
+   SRam.end = 0;
+   SRam.flags = '\0';
+   SRam.unused2 = '\0';
+   SRam.changed = '\0' ;
+   SRam.eeprom_type = '\0';
+   SRam.unused3 = '\0';
+   SRam.eeprom_bit_cl = '\0';
+   SRam.eeprom_bit_in = '\0';
+   SRam.eeprom_bit_out = '\0';
+   SRam.size = 0;
+}
+
 bool retro_load_game(const struct retro_game_info *info)
 {
    enum media_type_e media_type;
@@ -921,6 +954,8 @@ bool retro_load_game(const struct retro_game_info *info)
       { 0 },
    };
 
+   sram_reset();
+
    enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565;
    if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) {
       if (log_cb)
@@ -1251,6 +1286,8 @@ void retro_init(void)
 
 #ifdef _3DS
    ctr_svchack_successful = ctr_svchack_init();
+#elif defined(VITA)
+   sceBlock = getVMBlock();
 #endif
 
    PicoOpt = POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80