[libretro] added preliminary support for ROM files already loaded/patched in memory by frontend (still requires frontend modification to be functional)

This commit is contained in:
ekeeke 2020-04-19 19:09:15 +02:00
parent e66b7bc83d
commit 81becffb6c

View File

@ -3,7 +3,7 @@
*
* Genesis Plus GX libretro port
*
* Copyright Eke-Eke (2007-2018)
* Copyright Eke-Eke (2007-2020)
*
* Copyright Daniel De Matteis (2012-2016)
*
@ -138,6 +138,8 @@ static bool restart_eq = false;
static char g_rom_dir[256];
static char g_rom_name[256];
static void *g_rom_data;
static size_t g_rom_size;
static char *save_dir;
static retro_log_printf_t log_cb;
@ -204,9 +206,31 @@ int load_archive(char *filename, unsigned char *buffer, int maxsize, char *exten
{
int64_t left = 0;
int64_t size = 0;
RFILE *fd;
/* Get filename extension */
if (extension)
{
memcpy(extension, &filename[strlen(filename) - 3], 3);
extension[3] = 0;
}
/* Check if this was called to load ROM file from the frontend (not BOOT ROM or Lock-On ROM files from the core) */
if (maxsize >= 0x800000)
{
/* Check if loaded game is already in memory */
if ((g_rom_data != NULL) && (g_rom_size > 0))
{
size = g_rom_size;
if (size > maxsize)
size = maxsize;
memcpy(buffer, g_rom_data, size);
return size;
}
}
/* Open file */
RFILE *fd = filestream_open(filename, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
fd = filestream_open(filename, RETRO_VFS_FILE_ACCESS_READ, RETRO_VFS_FILE_ACCESS_HINT_NONE);
if (!fd)
{
@ -247,13 +271,6 @@ int load_archive(char *filename, unsigned char *buffer, int maxsize, char *exten
if (log_cb)
log_cb(RETRO_LOG_INFO, "INFORMATION - Loading %d bytes ...\n", size);
/* filename extension */
if (extension)
{
memcpy(extension, &filename[strlen(filename) - 3], 3);
extension[3] = 0;
}
/* Read into buffer */
left = size;
filestream_seek(fd, 0, SEEK_SET);
@ -2274,6 +2291,9 @@ bool retro_load_game(const struct retro_game_info *info)
if (!info)
return false;
if (!info->path)
return false;
#ifdef FRONTEND_SUPPORTS_RGB565
{
unsigned rgb565 = RETRO_PIXEL_FORMAT_RGB565;
@ -2342,6 +2362,9 @@ bool retro_load_game(const struct retro_game_info *info)
log_cb(RETRO_LOG_INFO, "Sega/Mega CD RAM CART is located at: %s\n", CART_BRAM);
}
g_rom_data = info->data;
g_rom_size = info->size;
if (!load_rom((char *)info->path))
return false;