Auto-disable "Game Genie ROM" feature when no "gg.rom" file is found.

This commit is contained in:
ansstuff 2013-08-04 13:05:48 +00:00
parent 2f43547607
commit ef132c44e4
3 changed files with 34 additions and 13 deletions

View File

@ -340,40 +340,48 @@ static uint8 *GENIEROM = 0;
void FixGenieMap(void); void FixGenieMap(void);
// Called when a game(file) is opened successfully. // Called when a game(file) is opened successfully. Returns TRUE on error.
void FCEU_OpenGenie(void) { bool FCEU_OpenGenie(void)
{
FILE *fp; FILE *fp;
int x; int x;
if (!GENIEROM) { if (!GENIEROM)
{
char *fn; char *fn;
if (!(GENIEROM = (uint8*)FCEU_malloc(4096 + 1024))) return; if (!(GENIEROM = (uint8*)FCEU_malloc(4096 + 1024)))
return true;
fn = strdup(FCEU_MakeFName(FCEUMKF_GGROM, 0, 0).c_str()); fn = strdup(FCEU_MakeFName(FCEUMKF_GGROM, 0, 0).c_str());
fp = FCEUD_UTF8fopen(fn, "rb"); fp = FCEUD_UTF8fopen(fn, "rb");
if (!fp) { if (!fp)
FCEU_PrintError("Error opening Game Genie ROM image!"); {
FCEU_PrintError("Error opening Game Genie ROM image!\nIt should be named \"gg.rom\"!");
free(GENIEROM); free(GENIEROM);
GENIEROM = 0; GENIEROM = 0;
return; return true;
} }
if (fread(GENIEROM, 1, 16, fp) != 16) { if (fread(GENIEROM, 1, 16, fp) != 16)
{
grerr: grerr:
FCEU_PrintError("Error reading from Game Genie ROM image!"); FCEU_PrintError("Error reading from Game Genie ROM image!");
free(GENIEROM); free(GENIEROM);
GENIEROM = 0; GENIEROM = 0;
fclose(fp); fclose(fp);
return; return true;
} }
if (GENIEROM[0] == 0x4E) { /* iNES ROM image */ if (GENIEROM[0] == 0x4E)
{
/* iNES ROM image */
if (fread(GENIEROM, 1, 4096, fp) != 4096) if (fread(GENIEROM, 1, 4096, fp) != 4096)
goto grerr; goto grerr;
if (fseek(fp, 16384 - 4096, SEEK_CUR)) if (fseek(fp, 16384 - 4096, SEEK_CUR))
goto grerr; goto grerr;
if (fread(GENIEROM + 4096, 1, 256, fp) != 256) if (fread(GENIEROM + 4096, 1, 256, fp) != 256)
goto grerr; goto grerr;
} else { } else
{
if (fread(GENIEROM + 16, 1, 4352 - 16, fp) != (4352 - 16)) if (fread(GENIEROM + 16, 1, 4352 - 16, fp) != (4352 - 16))
goto grerr; goto grerr;
} }
@ -381,10 +389,13 @@ void FCEU_OpenGenie(void) {
/* Workaround for the FCE Ultra CHR page size only being 1KB */ /* Workaround for the FCE Ultra CHR page size only being 1KB */
for (x = 0; x < 4; x++) for (x = 0; x < 4; x++)
{
memcpy(GENIEROM + 4096 + (x << 8), GENIEROM + 4096, 256); memcpy(GENIEROM + 4096 + (x << 8), GENIEROM + 4096, 256);
}
} }
geniestage = 1; geniestage = 1;
return false;
} }
/* Called when a game is closed. */ /* Called when a game is closed. */

View File

@ -89,6 +89,6 @@ extern int geniestage;
void FCEU_GeniePower(void); void FCEU_GeniePower(void);
void FCEU_OpenGenie(void); bool FCEU_OpenGenie(void);
void FCEU_CloseGenie(void); void FCEU_CloseGenie(void);
void FCEU_KillGenie(void); void FCEU_KillGenie(void);

View File

@ -486,8 +486,18 @@ FCEUGI *FCEUI_LoadGameVirtual(const char *name, int OverwriteVidMode, bool silen
FCEU_ResetVidSys(); FCEU_ResetVidSys();
if (GameInfo->type != GIT_NSF) if (GameInfo->type != GIT_NSF)
{
if (FSettings.GameGenie) if (FSettings.GameGenie)
FCEU_OpenGenie(); {
if (FCEU_OpenGenie())
{
FCEUI_SetGameGenie(false);
#ifdef WIN32
genie = 0;
#endif
}
}
}
PowerNES(); PowerNES();
if (GameInfo->type != GIT_NSF) if (GameInfo->type != GIT_NSF)