UNIF: little bit verbose/safe chunk loading, fix some crashes

This commit is contained in:
CaH4e3 2013-01-05 18:11:31 +00:00
parent dd54482e1a
commit efed1b3dec
1 changed files with 41 additions and 20 deletions

View File

@ -122,14 +122,25 @@ static void MooMirroring(void) {
} }
static int DoMirroring(FCEUFILE *fp) { static int DoMirroring(FCEUFILE *fp) {
uint8 t; uint8 t, i;
t = FCEU_fgetc(fp); if(uchead.info == 1) {
mirrortodo = t; if ((t = FCEU_fgetc(fp)) == EOF)
return(0);
{ mirrortodo = t;
static char *stuffo[6] = { "Horizontal", "Vertical", "$2000", "$2400", "\"Four-screen\"", "Controlled by Mapper Hardware" }; {
if (t < 6) static char *stuffo[6] = { "Horizontal", "Vertical", "$2000", "$2400", "\"Four-screen\"", "Controlled by Mapper Hardware" };
FCEU_printf(" Name/Attribute Table Mirroring: %s\n", stuffo[t]); if (t < 6)
FCEU_printf(" Name/Attribute Table Mirroring: %s\n", stuffo[t]);
}
} else {
FCEU_printf(" Incorrect Mirroring Chunk Size (%d). Data is:", uchead.info);
for(i = 0; i < uchead.info; i++) {
if ((t = FCEU_fgetc(fp)) == EOF)
return(0);
FCEU_printf(" %02x", t);
}
FCEU_printf("\n Default Name/Attribute Table Mirroring: Horizontal\n", uchead.info);
mirrortodo = 0;
} }
return(1); return(1);
} }
@ -188,19 +199,29 @@ static int DINF(FCEUFILE *fp) {
} }
static int CTRL(FCEUFILE *fp) { static int CTRL(FCEUFILE *fp) {
int t; int t, i;
if(uchead.info == 1) {
if ((t = FCEU_fgetc(fp)) == EOF) if ((t = FCEU_fgetc(fp)) == EOF)
return(0); return(0);
/* The information stored in this byte isn't very helpful, but it's /* The information stored in this byte isn't very helpful, but it's
better than nothing...maybe. better than nothing...maybe.
*/ */
if (t & 1) GameInfo->input[0] = GameInfo->input[1] = SI_GAMEPAD;
else GameInfo->input[0] = GameInfo->input[1] = SI_NONE;
if (t & 2) GameInfo->input[1] = SI_ZAPPER;
if (t & 1)
GameInfo->input[0] = GameInfo->input[1] = SI_GAMEPAD;
else
GameInfo->input[0] = GameInfo->input[1] = SI_NONE;
if (t & 2)
GameInfo->input[1] = SI_ZAPPER;
} else {
FCEU_printf(" Incorrect Control Chunk Size (%d). Data is:", uchead.info);
for(i = 0; i < uchead.info; i++) {
t = FCEU_fgetc(fp);
FCEU_printf(" %02x", t);
}
FCEU_printf("\n");
GameInfo->input[0] = GameInfo->input[1] = SI_GAMEPAD;
}
return(1); return(1);
} }