From ef132c44e474190f5f44cbaaded3ee7ae970e6f0 Mon Sep 17 00:00:00 2001 From: ansstuff Date: Sun, 4 Aug 2013 13:05:48 +0000 Subject: [PATCH] Auto-disable "Game Genie ROM" feature when no "gg.rom" file is found. --- trunk/src/cart.cpp | 33 ++++++++++++++++++++++----------- trunk/src/cart.h | 2 +- trunk/src/fceu.cpp | 12 +++++++++++- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/trunk/src/cart.cpp b/trunk/src/cart.cpp index 6b58bcf7..baeaba65 100644 --- a/trunk/src/cart.cpp +++ b/trunk/src/cart.cpp @@ -340,40 +340,48 @@ static uint8 *GENIEROM = 0; void FixGenieMap(void); -// Called when a game(file) is opened successfully. -void FCEU_OpenGenie(void) { +// Called when a game(file) is opened successfully. Returns TRUE on error. +bool FCEU_OpenGenie(void) +{ FILE *fp; int x; - if (!GENIEROM) { + if (!GENIEROM) + { 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()); fp = FCEUD_UTF8fopen(fn, "rb"); - if (!fp) { - FCEU_PrintError("Error opening Game Genie ROM image!"); + if (!fp) + { + FCEU_PrintError("Error opening Game Genie ROM image!\nIt should be named \"gg.rom\"!"); free(GENIEROM); GENIEROM = 0; - return; + return true; } - if (fread(GENIEROM, 1, 16, fp) != 16) { + if (fread(GENIEROM, 1, 16, fp) != 16) + { grerr: FCEU_PrintError("Error reading from Game Genie ROM image!"); free(GENIEROM); GENIEROM = 0; 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) goto grerr; if (fseek(fp, 16384 - 4096, SEEK_CUR)) goto grerr; if (fread(GENIEROM + 4096, 1, 256, fp) != 256) goto grerr; - } else { + } else + { if (fread(GENIEROM + 16, 1, 4352 - 16, fp) != (4352 - 16)) goto grerr; } @@ -381,10 +389,13 @@ void FCEU_OpenGenie(void) { /* Workaround for the FCE Ultra CHR page size only being 1KB */ for (x = 0; x < 4; x++) + { memcpy(GENIEROM + 4096 + (x << 8), GENIEROM + 4096, 256); + } } geniestage = 1; + return false; } /* Called when a game is closed. */ diff --git a/trunk/src/cart.h b/trunk/src/cart.h index b6b5c73a..e5670c54 100644 --- a/trunk/src/cart.h +++ b/trunk/src/cart.h @@ -89,6 +89,6 @@ extern int geniestage; void FCEU_GeniePower(void); -void FCEU_OpenGenie(void); +bool FCEU_OpenGenie(void); void FCEU_CloseGenie(void); void FCEU_KillGenie(void); diff --git a/trunk/src/fceu.cpp b/trunk/src/fceu.cpp index 4b38d435..da418b92 100644 --- a/trunk/src/fceu.cpp +++ b/trunk/src/fceu.cpp @@ -486,8 +486,18 @@ FCEUGI *FCEUI_LoadGameVirtual(const char *name, int OverwriteVidMode, bool silen FCEU_ResetVidSys(); if (GameInfo->type != GIT_NSF) + { if (FSettings.GameGenie) - FCEU_OpenGenie(); + { + if (FCEU_OpenGenie()) + { + FCEUI_SetGameGenie(false); +#ifdef WIN32 + genie = 0; +#endif + } + } + } PowerNES(); if (GameInfo->type != GIT_NSF)