diff --git a/src/driver.h b/src/driver.h index ebb7387..1d97c61 100644 --- a/src/driver.h +++ b/src/driver.h @@ -115,8 +115,12 @@ void FCEUI_DisableSpriteLimitation(int a); /* -1 = no change, 0 = show, 1 = hide, 2 = internal toggle */ void FCEUI_SetRenderDisable(int sprites, int bg); +#ifdef __LIBRETRO__ +FCEUGI *FCEUI_LoadGame(const char *name, uint8_t *buf, size_t bufsize); +#else /* name=path and file to load. returns 0 on failure, 1 on success */ FCEUGI *FCEUI_LoadGame(const char *name); +#endif #ifdef COPYFAMI /* Fake UNIF board to start new CFHI instance */ diff --git a/src/drivers/libretro/fceu/fceu.c b/src/drivers/libretro/fceu/fceu.c index 5014fba..ffabf10 100644 --- a/src/drivers/libretro/fceu/fceu.c +++ b/src/drivers/libretro/fceu/fceu.c @@ -227,7 +227,7 @@ int iNESLoad(const char *name, FCEUFILE *fp); int FDSLoad(const char *name, FCEUFILE *fp); int NSFLoad(FCEUFILE *fp); -FCEUGI *FCEUI_LoadGame(const char *name) +FCEUGI *FCEUI_LoadGame(const char *name, uint8_t *databuf, size_t databufsize) { FCEUFILE *fp; @@ -249,7 +249,7 @@ FCEUGI *FCEUI_LoadGame(const char *name) GetFileBase(name); - fp = FCEU_fopen(name, NULL, "rb", 0); + fp = FCEU_fopen(name, NULL, "rb", 0, databuf, databufsize); if (!fp) { FCEU_PrintError("Error opening \"%s\"!", name); diff --git a/src/drivers/libretro/fceu/fds.c b/src/drivers/libretro/fceu/fds.c index 5ee1b67..97a1654 100644 --- a/src/drivers/libretro/fceu/fds.c +++ b/src/drivers/libretro/fceu/fds.c @@ -669,7 +669,7 @@ int FDSLoad(const char *name, FCEUFILE *fp) { memcpy(diskdatao[x], diskdata[x], 65500); } - if ((tp = FCEU_fopen(fn, 0, "rb", 0))) { + if ((tp = FCEU_fopen(fn, 0, "rb", 0, NULL, 0))) { FCEU_printf("Disk was written. Auxillary FDS file open \"%s\".\n", fn); FreeFDSMemory(); if (!SubLoad(tp)) { diff --git a/src/drivers/libretro/fceu/file.c b/src/drivers/libretro/fceu/file.c index a2c0977..1331c3b 100644 --- a/src/drivers/libretro/fceu/file.c +++ b/src/drivers/libretro/fceu/file.c @@ -63,7 +63,22 @@ doret: return tmp; } -FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext) +static MEMWRAP *MakeMemWrapBuffer(void *tz, int type, uint8 *buffer, size_t bufsize) +{ + MEMWRAP *tmp = (MEMWRAP*)FCEU_malloc(sizeof(MEMWRAP)); + + if (!tmp) + return NULL; + + tmp->location = 0; + tmp->size = bufsize; + tmp->data = buffer; + + return tmp; +} + +FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, + char *mode, char *ext, uint8 *buffer, size_t bufsize) { FCEUFILE *fceufp = (FCEUFILE*)malloc(sizeof(FCEUFILE)); void *t = fopen(path, mode); @@ -76,7 +91,10 @@ FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext fseek((FILE*)t, 0, SEEK_SET); fceufp->type = 0; - fceufp->fp = MakeMemWrap(t, 0); + if (buffer) + fceufp->fp = MakeMemWrapBuffer(t, 0, buffer, bufsize); + else + fceufp->fp = MakeMemWrap(t, 0); return fceufp; } diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 1c89e55..7ed205c 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -475,7 +475,7 @@ void retro_set_environment(retro_environment_t cb) void retro_get_system_info(struct retro_system_info *info) { - info->need_fullpath = true; + info->need_fullpath = false; info->valid_extensions = "fds|nes|unif"; info->library_version = "(SVN)"; info->library_name = "FCEUmm"; @@ -561,7 +561,7 @@ static bool fceu_init(const struct retro_game_info *game) FCEUI_SetSoundVolume(256); FCEUI_Sound(32050); - GameInfo = (FCEUGI*)FCEUI_LoadGame(game->path); + GameInfo = (FCEUGI*)FCEUI_LoadGame(game->path, (uint8_t*)game->data, game->size); if (!GameInfo) return false; diff --git a/src/file.h b/src/file.h index 8f01eea..a17cfac 100644 --- a/src/file.h +++ b/src/file.h @@ -18,7 +18,11 @@ typedef struct { uint32 type; // 0=normal file, 1=gzip, 2=zip } FCEUFILE; +#ifdef __LIBRETRO__ +FCEUFILE *FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext, uint8 *buffer, size_t bufsize); +#else FCEUFILE *FCEU_fopen(const char *path, const char *ipsfn, char *mode, char *ext); +#endif int FCEU_fclose(FCEUFILE*); uint64 FCEU_fread(void *ptr, size_t size, size_t nmemb, FCEUFILE*); uint64 FCEU_fwrite(void *ptr, size_t size, size_t nmemb, FCEUFILE*);