/* FCE Ultra - NES/Famicom Emulator\r
- *\r
- * Copyright notice for this file:\r
- * Copyright (C) 1998 BERO\r
- * Copyright (C) 2002 Xodnizel\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
- */\r
+*\r
+* Copyright notice for this file:\r
+* Copyright (C) 1998 BERO\r
+* Copyright (C) 2002 Xodnizel\r
+*\r
+* This program is free software; you can redistribute it and/or modify\r
+* it under the terms of the GNU General Public License as published by\r
+* the Free Software Foundation; either version 2 of the License, or\r
+* (at your option) any later version.\r
+*\r
+* This program is distributed in the hope that it will be useful,\r
+* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+* GNU General Public License for more details.\r
+*\r
+* You should have received a copy of the GNU General Public License\r
+* along with this program; if not, write to the Free Software\r
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
+*/\r
\r
#include <stdio.h>\r
#include <stdlib.h>\r
#define INESPRIV\r
#include "ines.h"\r
#include "unif.h"\r
-#include "general.h"\r
#include "state.h"\r
#include "file.h"\r
+#include "general.h"\r
#include "memory.h"\r
#include "crc32.h"\r
#include "md5.h"\r
#include "cheat.h"\r
#include "vsuni.h"\r
-\r
#include "driver.h"\r
#include "svga.h"\r
\r
extern SFORMAT FCEUVSUNI_STATEINFO[];\r
\r
-static uint8 *trainerpoo=0;\r
-static uint8 *ROM=NULL;\r
-//static\r
-uint8 *VROM=NULL;\r
+//mbg merge 6/29/06 - these need to be global\r
+uint8 *trainerpoo=0;\r
+uint8 *ROM = NULL;\r
+uint8 *VROM = NULL;\r
+struct iNES_HEADER head;\r
+\r
+\r
\r
static CartInfo iNESCart;\r
\r
\r
uint32 ROM_size=0;\r
uint32 VROM_size=0;\r
+//char LoadedRomFName[2048]; //mbg merge 7/17/06 added\r
\r
+static int CHRRAMSize = -1;\r
static void iNESPower(void);\r
static int NewiNES_Init(int num);\r
\r
\r
static int MapperNo=0;\r
\r
-static iNES_HEADER head;\r
-\r
/* MapperReset() is called when the NES is reset(with the reset button).\r
- Mapperxxx_init is called when the NES has been powered on.\r
+Mapperxxx_init is called when the NES has been powered on.\r
*/\r
\r
+\r
static DECLFR(TrainerRead)\r
{\r
- return(trainerpoo[A&0x1FF]);\r
+ return(trainerpoo[A&0x1FF]);\r
+}\r
+\r
+static void iNES_ExecPower()\r
+{\r
+ if(CHRRAMSize != -1)\r
+ FCEU_MemoryRand(VROM,CHRRAMSize);\r
+\r
+ if(iNESCart.Power)\r
+ iNESCart.Power();\r
+\r
+ if(trainerpoo)\r
+ {\r
+ int x;\r
+ for(x=0;x<512;x++)\r
+ {\r
+ //X6502_DMW(0x7000+x,trainerpoo[x]);\r
+ //if(X6502_DMR(0x7000+x)!=trainerpoo[x])\r
+ unsigned int A=0x7000+x;\r
+ BWrite[A](A,trainerpoo[x]);\r
+ if(ARead[A](A)!=trainerpoo[x])\r
+ {\r
+ SetReadHandler(0x7000,0x71FF,TrainerRead);\r
+ break;\r
+ }\r
+ }\r
+ }\r
}\r
\r
-static void iNESGI(int h)\r
+static void iNESGI(int h, void *param)\r
{\r
- switch(h)\r
- {\r
- case GI_RESETM2:\r
+ switch(h)\r
+ {\r
+ case GI_RESETSAVE:\r
+ //FCEU_ClearGameSave(&iNESCart);\r
+ break;\r
+\r
+ case GI_RESETM2:\r
if(MapperReset)\r
- MapperReset();\r
+ MapperReset();\r
if(iNESCart.Reset)\r
- iNESCart.Reset();\r
+ iNESCart.Reset();\r
+ break;\r
+ case GI_POWER:\r
+ iNES_ExecPower();\r
+ \r
break;\r
- case GI_POWER:\r
- if(iNESCart.Power)\r
- iNESCart.Power();\r
- if(trainerpoo)\r
+ case GI_CLOSE:\r
{\r
- int x;\r
- for(x=0;x<512;x++)\r
- {\r
- //X6502_DMW(0x7000+x,trainerpoo[x]);\r
- //if(X6502_DMR(0x7000+x)!=trainerpoo[x])\r
- unsigned int A=0x7000+x;\r
- BWrite[A](A,trainerpoo[x]);\r
- if(ARead[A](A)!=trainerpoo[x])\r
- {\r
- SetReadHandler(0x7000,0x71FF,TrainerRead);\r
- break;\r
- }\r
- }\r
+ FCEU_SaveGameSave(&iNESCart);\r
+\r
+ if(iNESCart.Close) iNESCart.Close();\r
+ if(ROM) {free(ROM); ROM = NULL;}\r
+ if(VROM) {free(VROM); VROM = NULL;}\r
+ if(MapClose) MapClose();\r
+ if(trainerpoo) {FCEU_gfree(trainerpoo);trainerpoo=0;}\r
}\r
break;\r
- case GI_CLOSE:\r
+ case GI_INFOSTRING:\r
{\r
- FCEU_SaveGameSave(&iNESCart);\r
-\r
- if(iNESCart.Close) iNESCart.Close();\r
- if(ROM) {free(ROM);ROM=0;}\r
- if(VROM) {free(VROM);VROM=0;}\r
- if(MapClose) MapClose();\r
- if(trainerpoo) {FCEU_gfree(trainerpoo);trainerpoo=0;}\r
- }\r
- break;\r
- }\r
+ int MapperNo;\r
+ MapperNo = (head.ROM_type>>4);\r
+ MapperNo|=(head.ROM_type2&0xF0);\r
+ sprintf(param, "iNES, %s, Mapper: %d%s%s", PAL?"PAL":"NTSC",\r
+ MapperNo, (head.ROM_type&2)?", BB":"", (head.ROM_type&4)?", T":"");\r
+ }\r
+ break;\r
+ }\r
}\r
\r
uint32 iNESGameCRC32=0;\r
int inputfc;\r
};\r
\r
-/* This is mostly for my personal use. So HA. */\r
static void SetInput(void)\r
{\r
- static struct INPSEL moo[]=\r
+ static struct INPSEL moo[]=\r
{\r
- {0x3a1694f9,SI_GAMEPAD,SI_GAMEPAD,SIFC_4PLAYER}, /* Nekketsu Kakutou Densetsu */\r
-\r
-#if 0\r
- {0xc3c0811d,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, /* The two "Oeka Kids" games */\r
- {0x9d048ea4,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, /* */\r
-\r
- {0xaf4010ea,SI_GAMEPAD,SI_POWERPADB,-1}, /* World Class Track Meet */\r
- {0xd74b2719,SI_GAMEPAD,SI_POWERPADB,-1}, /* Super Team Games */\r
- {0x61d86167,SI_GAMEPAD,SI_POWERPADB,-1}, /* Street Cop */\r
- {0x6435c095,SI_GAMEPAD,SI_POWERPADB,-1}, /* Short Order/Eggsplode */\r
-\r
-\r
- {0x47232739,SI_GAMEPAD,SI_GAMEPAD,SIFC_TOPRIDER}, /* Top Rider */\r
-\r
- {0x48ca0ee1,SI_GAMEPAD,SI_GAMEPAD,SIFC_BWORLD}, /* Barcode World */\r
- {0x9f8f200a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Super Mogura Tataki!! - Pokkun Moguraa */\r
- {0x9044550e,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Rairai Kyonshizu */\r
- {0x2f128512,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Jogging Race */\r
- {0x60ad090a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, /* Athletic World */\r
-\r
- {0x8a12a7d9,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Totsugeki Fuuun Takeshi Jou */\r
- {0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Running Stadium */\r
- {0x370ceb65,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Meiro Dai Sakusen */\r
- // Bad dump? {0x69ffb014,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Fuun Takeshi Jou 2 */\r
- {0x6cca1c1f,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Dai Undoukai */\r
- {0x29de87af,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Aerobics Studio */\r
- {0xbba58be5,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Family Trainer: Manhattan Police */\r
- {0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, /* Family Trainer: Running Stadium */\r
-\r
- {0xd9f45be9,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, /* Gimme a Break ... */\r
- {0x1545bd13,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, /* Gimme a Break ... 2 */\r
-\r
- {0x7b44fb2a,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, /* Ide Yousuke Meijin no Jissen Mahjong 2 */\r
- {0x9fae4d46,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, /* Ide Yousuke Meijin no Jissen Mahjong */\r
-\r
- {0x980be936,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, /* Hyper Olympic */\r
- {0x21f85681,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, /* Hyper Olympic (Gentei Ban) */\r
- {0x915a53a7,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, /* Hyper Sports */\r
-#endif\r
- {0xad9c63e2,SI_GAMEPAD,-1,SIFC_SHADOW}, /* Space Shadow */\r
-\r
- {0x24598791,-1,SI_ZAPPER,0}, /* Duck Hunt */\r
- {0xff24d794,-1,SI_ZAPPER,0}, /* Hogan's Alley */\r
- {0xbeb8ab01,-1,SI_ZAPPER,0}, /* Gumshoe */\r
- {0xde8fd935,-1,SI_ZAPPER,0}, /* To the Earth */\r
- {0xedc3662b,-1,SI_ZAPPER,0}, /* Operation Wolf */\r
- {0x2a6559a1,-1,SI_ZAPPER,0}, /* Operation Wolf (J) */\r
-\r
- {0x23d17f5e,SI_GAMEPAD,SI_ZAPPER,0}, /* The Lone Ranger */\r
- {0xb8b9aca3,-1,SI_ZAPPER,0}, /* Wild Gunman */\r
- {0x5112dc21,-1,SI_ZAPPER,0}, /* Wild Gunman */\r
- {0x4318a2f8,-1,SI_ZAPPER,0}, /* Barker Bill's Trick Shooting */\r
- {0x5ee6008e,-1,SI_ZAPPER,0}, /* Mechanized Attack */\r
- {0x3e58a87e,-1,SI_ZAPPER,0}, /* Freedom Force */\r
- {0x851eb9be,SI_GAMEPAD,SI_ZAPPER,0}, /* Shooting Range */\r
- {0x74bea652,SI_GAMEPAD,SI_ZAPPER,0}, /* Supergun 3-in-1 */\r
- {0x32fb0583,-1,SI_ARKANOID,0}, /* Arkanoid(NES) */\r
- {0xd89e5a67,-1,-1,SIFC_ARKANOID}, /* Arkanoid (J) */\r
- {0x0f141525,-1,-1,SIFC_ARKANOID}, /* Arkanoid 2(J) */\r
-\r
- {0x912989dc,-1,-1,SIFC_FKB}, /* Playbox BASIC */\r
- {0xf7606810,-1,-1,SIFC_FKB}, /* Family BASIC 2.0A */\r
- {0x895037bc,-1,-1,SIFC_FKB}, /* Family BASIC 2.1a */\r
- {0xb2530afc,-1,-1,SIFC_FKB}, /* Family BASIC 3.0 */\r
-#if 0\r
- {0x82f1fb96,-1,-1,SIFC_SUBORKB}, /* Subor 1.0 Russian */\r
- {0xabb2f974,-1,-1,SIFC_SUBORKB}, /* Study and Game 32-in-1 */\r
- {0xd5d6eac4,-1,-1,SIFC_SUBORKB}, /* Edu (As) */\r
- {0x589b6b0d,-1,-1,SIFC_SUBORKB}, /* SuporV20 */\r
- {0x5e073a1b,-1,-1,SIFC_SUBORKB}, /* Supor English (Chinese) */\r
- {0x8b265862,-1,-1,SIFC_SUBORKB},\r
- {0x41401c6d,-1,-1,SIFC_SUBORKB}, /* SuporV40 */\r
- {0x41ef9ac4,-1,-1,SIFC_SUBORKB},\r
- {0x368c19a8,-1,-1,SIFC_SUBORKB}, /* LIKO Study Cartridge */\r
- {0x543ab532,-1,-1,SIFC_SUBORKB}, /* LIKO Color Lines */\r
-#endif\r
- {0,-1,-1,-1}\r
+ {0x3a1694f9,SI_GAMEPAD,SI_GAMEPAD,SIFC_4PLAYER}, // Nekketsu Kakutou Densetsu\r
+\r
+ {0xc3c0811d,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, // The two "Oeka Kids" games\r
+ {0x9d048ea4,SI_GAMEPAD,SI_GAMEPAD,SIFC_OEKAKIDS}, //\r
+\r
+ {0xaf4010ea,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // World Class Track Meet\r
+ {0xd74b2719,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // Super Team Games\r
+ {0x61d86167,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // Street Cop\r
+ {0x6435c095,SI_GAMEPAD,SI_POWERPADB,SIFC_UNSET}, // Short Order/Eggsplode\r
+\r
+\r
+ {0x47232739,SI_GAMEPAD,SI_GAMEPAD,SIFC_TOPRIDER}, // Top Rider\r
+\r
+ {0x48ca0ee1,SI_GAMEPAD,SI_GAMEPAD,SIFC_BWORLD}, // Barcode World\r
+ {0x9f8f200a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Super Mogura Tataki!! - Pokkun Moguraa\r
+ {0x9044550e,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Rairai Kyonshizu\r
+ {0x2f128512,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Jogging Race\r
+ {0x60ad090a,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERA}, // Athletic World\r
+\r
+ {0x8a12a7d9,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Totsugeki Fuuun Takeshi Jou\r
+ {0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Running Stadium\r
+ {0x370ceb65,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Meiro Dai Sakusen\r
+ // Bad dump? {0x69ffb014,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Fuun Takeshi Jou 2\r
+ {0x6cca1c1f,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Dai Undoukai\r
+ {0x29de87af,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Aerobics Studio\r
+ {0xbba58be5,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Family Trainer: Manhattan Police\r
+ {0xea90f3e2,SI_GAMEPAD,SI_GAMEPAD,SIFC_FTRAINERB}, // Family Trainer: Running Stadium\r
+\r
+ {0xd9f45be9,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, // Gimme a Break ...\r
+ {0x1545bd13,SI_GAMEPAD,SI_GAMEPAD,SIFC_QUIZKING}, // Gimme a Break ... 2\r
+\r
+ {0x7b44fb2a,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, // Ide Yousuke Meijin no Jissen Mahjong 2\r
+ {0x9fae4d46,SI_GAMEPAD,SI_GAMEPAD,SIFC_MAHJONG}, // Ide Yousuke Meijin no Jissen Mahjong\r
+\r
+ {0x980be936,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, // Hyper Olympic\r
+ {0x21f85681,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, // Hyper Olympic (Gentei Ban)\r
+ {0x915a53a7,SI_GAMEPAD,SI_GAMEPAD,SIFC_HYPERSHOT}, // Hyper Sports\r
+ {0xad9c63e2,SI_GAMEPAD,SI_UNSET,SIFC_SHADOW}, // Space Shadow\r
+\r
+ {0x24598791,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Duck Hunt\r
+ {0xff24d794,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Hogan's Alley\r
+ {0xbeb8ab01,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Gumshoe\r
+ {0xde8fd935,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // To the Earth\r
+ {0xedc3662b,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Operation Wolf\r
+ {0x2a6559a1,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Operation Wolf (J)\r
+ {0x4e959173,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Gotcha! - The Sport!\r
+\r
+ {0x23d17f5e,SI_GAMEPAD,SI_ZAPPER,SIFC_NONE}, // The Lone Ranger\r
+ {0xb8b9aca3,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Wild Gunman\r
+ {0x5112dc21,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Wild Gunman\r
+ {0x4318a2f8,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Barker Bill's Trick Shooting\r
+ {0x5ee6008e,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Mechanized Attack\r
+ {0x3e58a87e,SI_UNSET,SI_ZAPPER,SIFC_NONE}, // Freedom Force\r
+ {0xe9a7fe9e,SI_UNSET,SI_MOUSE,SIFC_NONE}, // Educational Computer 2000 //mbg merge 7/17/06 added -- appears to be from newer MM build\r
+ {0x851eb9be,SI_GAMEPAD,SI_ZAPPER,SIFC_NONE}, // Shooting Range\r
+ {0x74bea652,SI_GAMEPAD,SI_ZAPPER,SIFC_NONE}, // Supergun 3-in-1\r
+ {0x32fb0583,SI_UNSET,SI_ARKANOID,SIFC_NONE}, // Arkanoid(NES)\r
+ {0xd89e5a67,SI_UNSET,SI_UNSET,SIFC_ARKANOID}, // Arkanoid (J)\r
+ {0x0f141525,SI_UNSET,SI_UNSET,SIFC_ARKANOID}, // Arkanoid 2(J)\r
+\r
+ {0x912989dc,SI_UNSET,SI_UNSET,SIFC_FKB}, // Playbox BASIC\r
+ {0xf7606810,SI_UNSET,SI_UNSET,SIFC_FKB}, // Family BASIC 2.0A\r
+ {0x895037bc,SI_UNSET,SI_UNSET,SIFC_FKB}, // Family BASIC 2.1a\r
+ {0xb2530afc,SI_UNSET,SI_UNSET,SIFC_FKB}, // Family BASIC 3.0\r
+ {0x82f1fb96,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Subor 1.0 Russian\r
+ {0xabb2f974,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Study and Game 32-in-1\r
+ {0xd5d6eac4,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Edu (As)\r
+ {0x589b6b0d,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // SuporV20\r
+ {0x5e073a1b,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // Supor English (Chinese)\r
+ {0x8b265862,SI_UNSET,SI_UNSET,SIFC_SUBORKB},\r
+ {0x41401c6d,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // SuporV40\r
+ {0x41ef9ac4,SI_UNSET,SI_UNSET,SIFC_SUBORKB},\r
+ {0x368c19a8,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // LIKO Study Cartridge\r
+ {0x543ab532,SI_UNSET,SI_UNSET,SIFC_SUBORKB}, // LIKO Color Lines\r
+ {0,SI_UNSET,SI_UNSET,SIFC_UNSET}\r
};\r
- int x=0;\r
-\r
- while(moo[x].input1>=0 || moo[x].input2>=0 || moo[x].inputfc>=0)\r
- {\r
- if(moo[x].crc32==iNESGameCRC32)\r
- {\r
- FCEUGameInfo.input[0]=moo[x].input1;\r
- FCEUGameInfo.input[1]=moo[x].input2;\r
- FCEUGameInfo.inputfc=moo[x].inputfc;\r
- break;\r
- }\r
- x++;\r
- }\r
+ int x=0;\r
+\r
+ while(moo[x].input1>=0 || moo[x].input2>=0 || moo[x].inputfc>=0)\r
+ {\r
+ if(moo[x].crc32==iNESGameCRC32)\r
+ {\r
+ GameInfo->input[0]=moo[x].input1;\r
+ GameInfo->input[1]=moo[x].input2;\r
+ GameInfo->inputfc=moo[x].inputfc;\r
+ break;\r
+ }\r
+ x++;\r
+ }\r
}\r
\r
#define INESB_INCOMPLETE 1\r
\r
static struct BADINF BadROMImages[]=\r
{\r
- #include "ines-bad.h"\r
+#include "ines-bad.h"\r
};\r
\r
void CheckBad(uint64 md5partial)\r
{\r
- int x;\r
-\r
- x=0;\r
- //printf("0x%llx\n",md5partial);\r
- while(BadROMImages[x].name)\r
- {\r
- if(BadROMImages[x].md5partial == md5partial)\r
- {\r
- FCEU_PrintError("The copy game you have loaded, \"%s\", is bad, and will not work properly on FCE Ultra.", BadROMImages[x].name);\r
- return;\r
- }\r
- x++;\r
- }\r
+ int x;\r
+\r
+ x=0;\r
+ //printf("0x%llx\n",md5partial);\r
+ while(BadROMImages[x].name)\r
+ {\r
+ if(BadROMImages[x].md5partial == md5partial)\r
+ {\r
+ FCEU_PrintError("The copy game you have loaded, \"%s\", is bad, and will not work properly in FCEUX.", BadROMImages[x].name);\r
+ return;\r
+ }\r
+ x++;\r
+ }\r
\r
}\r
\r
uint32 crc32;\r
int32 mapper;\r
int32 mirror;\r
+ const char* params;\r
};\r
\r
+void MapperInit()\r
+{\r
+ if(NewiNES_Init(MapperNo))\r
+ {\r
+\r
+ }\r
+ else\r
+ {\r
+ iNESCart.Power=iNESPower;\r
+ if(head.ROM_type&2)\r
+ {\r
+ iNESCart.SaveGame[0]=WRAM;\r
+ iNESCart.SaveGameLen[0]=8192;\r
+ }\r
+ }\r
+}\r
+\r
+#if 0\r
+static const TMasterRomInfo sMasterRomInfo[] = {\r
+ { 0x62b51b108a01d2beLL, "bonus=0" }, //4-in-1 (FK23C8021)[p1][!].nes\r
+ { 0x8bb48490d8d22711LL, "bonus=0" }, //4-in-1 (FK23C8033)[p1][!].nes\r
+ { 0xc75888d7b48cd378LL, "bonus=0" }, //4-in-1 (FK23C8043)[p1][!].nes\r
+ { 0xf81a376fa54fdd69LL, "bonus=0" }, //4-in-1 (FK23Cxxxx, S-0210A PCB)[p1][!].nes\r
+ { 0xa37eb9163e001a46LL, "bonus=0" }, //4-in-1 (FK23C8026) [p1][!].nes\r
+ { 0xde5ce25860233f7eLL, "bonus=0" }, //4-in-1 (FK23C8045) [p1][!].nes\r
+ { 0x5b3aa4cdc484a088LL, "bonus=0" }, //4-in-1 (FK23C8056) [p1][!].nes\r
+ { 0x9342bf9bae1c798aLL, "bonus=0" }, //4-in-1 (FK23C8079) [p1][!].nes\r
+ { 0x164eea6097a1e313LL, "busc=1" }, //Cybernoid - The Fighting Machine (U)[!].nes -- needs bus conflict emulation\r
+};\r
+const TMasterRomInfo* MasterRomInfo;\r
+TMasterRomInfoParams MasterRomInfoParams;\r
+#endif\r
+\r
static void CheckHInfo(void)\r
{\r
- /* ROM images that have the battery-backed bit set in the header that really\r
- don't have battery-backed RAM is not that big of a problem, so I'll\r
- treat this differently by only listing games that should have battery-backed RAM.\r
+ /* ROM images that have the battery-backed bit set in the header that really\r
+ don't have battery-backed RAM is not that big of a problem, so I'll\r
+ treat this differently by only listing games that should have battery-backed RAM.\r
\r
- Lower 64 bits of the MD5 hash.\r
- */\r
+ Lower 64 bits of the MD5 hash.\r
+ */\r
\r
- static uint64 savie[]=\r
+ static uint64 savie[]=\r
{\r
- 0x498c10dc463cfe95LL, /* Battle Fleet */\r
- 0x6917ffcaca2d8466LL, /* Famista '90 */\r
+ 0x498c10dc463cfe95LL, /* Battle Fleet */\r
+ 0x6917ffcaca2d8466LL, /* Famista '90 */\r
+\r
+ 0xd63dcc68c2b20adcLL, /* Final Fantasy J */\r
+ 0x012df596e2b31174LL, /* Final Fantasy 1+2 */\r
+ 0xf6b359a720549ecdLL, /* Final Fantasy 2 */\r
+ 0x5a30da1d9b4af35dLL, /* Final Fantasy 3 */\r
\r
- 0xd63dcc68c2b20adcLL, /* Final Fantasy J */\r
- 0x012df596e2b31174LL, /* Final Fantasy 1+2 */\r
- 0xf6b359a720549ecdLL, /* Final Fantasy 2 */\r
- 0x5a30da1d9b4af35dLL, /* Final Fantasy 3 */\r
+ 0x2ee3417ba8b69706LL, /* Hydlide 3*/\r
\r
- 0x2ee3417ba8b69706LL, /* Hydlide 3*/\r
+ 0xebbce5a54cf3ecc0LL, /* Justbreed */\r
\r
- 0xebbce5a54cf3ecc0LL, /* Justbreed */\r
+ 0x6a858da551ba239eLL, /* Kaijuu Monogatari */\r
+ 0xa40666740b7d22feLL, /* Mindseeker */\r
\r
- 0x6a858da551ba239eLL, /* Kaijuu Monogatari */\r
- 0xa40666740b7d22feLL, /* Mindseeker */\r
+ 0x77b811b2760104b9LL, /* Mouryou Senki Madara */\r
\r
- 0x77b811b2760104b9LL, /* Mouryou Senki Madara */\r
+ 0x11b69122efe86e8cLL, /* RPG Jinsei Game */\r
\r
- 0x11b69122efe86e8cLL, /* RPG Jinsei Game */\r
+ 0xa70b495314f4d075LL, /* Ys 3 */\r
\r
- 0xa70b495314f4d075LL, /* Ys 3 */\r
\r
+ 0xc04361e499748382LL, /* AD&D Heroes of the Lance */\r
+ 0xb72ee2337ced5792LL, /* AD&D Hillsfar */\r
+ 0x2b7103b7a27bd72fLL, /* AD&D Pool of Radiance */\r
\r
- 0xc04361e499748382LL, /* AD&D Heroes of the Lance */\r
- 0xb72ee2337ced5792LL, /* AD&D Hillsfar */\r
- 0x2b7103b7a27bd72fLL, /* AD&D Pool of Radiance */\r
+ 0x854d7947a3177f57LL, /* Crystalis */\r
\r
- 0x854d7947a3177f57LL, /* Crystalis */\r
+ 0xb0bcc02c843c1b79LL, /* DW */\r
+ 0x4a1f5336b86851b6LL, /* DW */\r
\r
- 0xb0bcc02c843c1b79LL, /* DW */\r
- 0x4a1f5336b86851b6LL, /* DW */\r
+ 0x2dcf3a98c7937c22LL, /* DW 2 */\r
+ 0x733026b6b72f2470LL, /* Dw 3 */\r
+ 0x98e55e09dfcc7533LL, /* DW 4*/\r
+ 0x8da46db592a1fcf4LL, /* Faria */\r
+ 0x91a6846d3202e3d6LL, /* Final Fantasy */\r
+ 0xedba17a2c4608d20LL, /* "" */\r
\r
- 0x2dcf3a98c7937c22LL, /* DW 2 */\r
- 0x733026b6b72f2470LL, /* Dw 3 */\r
- 0x98e55e09dfcc7533LL, /* DW 4*/\r
- 0x8da46db592a1fcf4LL, /* Faria */\r
- 0x91a6846d3202e3d6LL, /* Final Fantasy */\r
- 0xedba17a2c4608d20LL, /* "" */\r
+ 0x94b9484862a26cbaLL, /* Legend of Zelda */\r
+ 0x04a31647de80fdabLL, /* "" */\r
\r
- 0x94b9484862a26cbaLL, /* Legend of Zelda */\r
- 0x04a31647de80fdabLL, /* "" */\r
+ 0x9aa1dc16c05e7de5LL, /* Startropics */\r
+ 0x1b084107d0878bd0LL, /* Startropics 2*/\r
\r
- 0x9aa1dc16c05e7de5LL, /* Startropics */\r
- 0x1b084107d0878bd0LL, /* Startropics 2*/\r
+ 0x836c0ff4f3e06e45LL, /* Zelda 2 */\r
\r
- 0x836c0ff4f3e06e45LL, /* Zelda 2 */\r
+ 0x82000965f04a71bbLL, /* Mirai Shinwa Jarvas */\r
\r
- 0 /* Abandon all hope if the game has 0 in the lower 64-bits of its MD5 hash */\r
+ 0 /* Abandon all hope if the game has 0 in the lower 64-bits of its MD5 hash */\r
};\r
\r
- static struct CHINF moo[]=\r
+ static struct CHINF moo[]=\r
{\r
- #include "ines-correct.h"\r
+#include "ines-correct.h"\r
};\r
- int tofix=0;\r
- int x;\r
- uint64 partialmd5=0;\r
-\r
- for(x=0;x<8;x++)\r
- {\r
- partialmd5 |= (uint64)iNESCart.MD5[15-x] << (x*8);\r
- //printf("%16llx\n",partialmd5);\r
- }\r
- CheckBad(partialmd5);\r
-\r
- x=0;\r
-\r
- do\r
- {\r
- if(moo[x].crc32==iNESGameCRC32)\r
- {\r
- if(moo[x].mapper>=0)\r
- {\r
- if(moo[x].mapper&0x800 && VROM_size)\r
- {\r
- VROM_size=0;\r
- free(VROM);\r
- VROM=0;\r
- tofix|=8;\r
- }\r
- if(MapperNo!=(moo[x].mapper&0xFF))\r
- {\r
- tofix|=1;\r
- MapperNo=moo[x].mapper&0xFF;\r
- }\r
- }\r
- if(moo[x].mirror>=0)\r
- {\r
- if(moo[x].mirror==8)\r
- {\r
- if(Mirroring==2) /* Anything but hard-wired(four screen). */\r
- {\r
- tofix|=2;\r
- Mirroring=0;\r
- }\r
- }\r
- else if(Mirroring!=moo[x].mirror)\r
- {\r
- if(Mirroring!=(moo[x].mirror&~4))\r
- if((moo[x].mirror&~4)<=2) /* Don't complain if one-screen mirroring\r
- needs to be set(the iNES header can't\r
- hold this information).\r
- */\r
- tofix|=2;\r
- Mirroring=moo[x].mirror;\r
- }\r
- }\r
- break;\r
- }\r
- x++;\r
- } while(moo[x].mirror>=0 || moo[x].mapper>=0);\r
-\r
- x=0;\r
- while(savie[x] != 0)\r
- {\r
- if(savie[x] == partialmd5)\r
- {\r
- if(!(head.ROM_type&2))\r
- {\r
- tofix|=4;\r
- head.ROM_type|=2;\r
- }\r
- }\r
- x++;\r
- }\r
-\r
- /* Games that use these iNES mappers tend to have the four-screen bit set\r
- when it should not be.\r
- */\r
- if((MapperNo==118 || MapperNo==24 || MapperNo==26) && (Mirroring==2))\r
- {\r
- Mirroring=0;\r
- tofix|=2;\r
- }\r
-\r
- /* Four-screen mirroring implicitly set. */\r
- if(MapperNo==99)\r
- Mirroring=2;\r
-\r
- if(tofix)\r
- {\r
- char gigastr[768];\r
- strcpy(gigastr,"The iNES header contains incorrect information. For now, the information will be corrected in RAM. ");\r
- if(tofix&1)\r
- sprintf(gigastr+strlen(gigastr),"The mapper number should be set to %d. ",MapperNo);\r
- if(tofix&2)\r
- {\r
- char *mstr[3]={"Horizontal","Vertical","Four-screen"};\r
- sprintf(gigastr+strlen(gigastr),"Mirroring should be set to \"%s\". ",mstr[Mirroring&3]);\r
- }\r
- if(tofix&4)\r
- strcat(gigastr,"The battery-backed bit should be set. ");\r
- if(tofix&8)\r
- strcat(gigastr,"This game should not have any CHR ROM. ");\r
- strcat(gigastr,"\n");\r
- FCEU_printf("%s",gigastr);\r
- }\r
+ int tofix=0;\r
+ int x;\r
+ uint64 partialmd5=0;\r
+\r
+ for(x=0;x<8;x++)\r
+ {\r
+ partialmd5 |= (uint64)iNESCart.MD5[15-x] << (x*8);\r
+ //printf("%16llx\n",partialmd5);\r
+ }\r
+ CheckBad(partialmd5);\r
+\r
+#if 0\r
+ MasterRomInfo = NULL;\r
+ MasterRomInfoParams = TMasterRomInfoParams();\r
+ for(int i=0;i<ARRAY_SIZE(sMasterRomInfo);i++)\r
+ {\r
+ const TMasterRomInfo& info = sMasterRomInfo[i];\r
+ if(info.md5lower != partialmd5)\r
+ continue;\r
+ \r
+ MasterRomInfo = &info;\r
+ if(!info.params) break;\r
+ \r
+ std::vector<std::string> toks = tokenize_str(info.params,",");\r
+ for(int j=0;j<(int)toks.size();j++)\r
+ {\r
+ std::vector<std::string> parts = tokenize_str(toks[j],"=");\r
+ MasterRomInfoParams[parts[0]] = parts[1];\r
+ }\r
+ break;\r
+ }\r
+#endif\r
+\r
+ x=0;\r
+\r
+ do\r
+ {\r
+ if(moo[x].crc32==iNESGameCRC32)\r
+ {\r
+ if(moo[x].mapper>=0)\r
+ {\r
+ if(moo[x].mapper&0x800 && VROM_size)\r
+ {\r
+ VROM_size=0;\r
+ free(VROM);\r
+ VROM = NULL;\r
+ tofix|=8;\r
+ }\r
+ if(MapperNo!=(moo[x].mapper&0xFF))\r
+ {\r
+ tofix|=1;\r
+ MapperNo=moo[x].mapper&0xFF;\r
+ }\r
+ }\r
+ if(moo[x].mirror>=0)\r
+ {\r
+ if(moo[x].mirror==8)\r
+ {\r
+ if(Mirroring==2) /* Anything but hard-wired(four screen). */\r
+ {\r
+ tofix|=2;\r
+ Mirroring=0;\r
+ }\r
+ }\r
+ else if(Mirroring!=moo[x].mirror)\r
+ {\r
+ if(Mirroring!=(moo[x].mirror&~4))\r
+ if((moo[x].mirror&~4)<=2) /* Don't complain if one-screen mirroring\r
+ needs to be set(the iNES header can't\r
+ hold this information).\r
+ */\r
+ tofix|=2;\r
+ Mirroring=moo[x].mirror;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ x++;\r
+ } while(moo[x].mirror>=0 || moo[x].mapper>=0);\r
+\r
+ x=0;\r
+ while(savie[x] != 0)\r
+ {\r
+ if(savie[x] == partialmd5)\r
+ {\r
+ if(!(head.ROM_type&2))\r
+ {\r
+ tofix|=4;\r
+ head.ROM_type|=2;\r
+ }\r
+ }\r
+ x++;\r
+ }\r
+\r
+ /* Games that use these iNES mappers tend to have the four-screen bit set\r
+ when it should not be.\r
+ */\r
+ if((MapperNo==118 || MapperNo==24 || MapperNo==26) && (Mirroring==2))\r
+ {\r
+ Mirroring=0;\r
+ tofix|=2;\r
+ }\r
+\r
+ /* Four-screen mirroring implicitly set. */\r
+ if(MapperNo==99)\r
+ Mirroring=2;\r
+\r
+ if(tofix)\r
+ {\r
+ char gigastr[768];\r
+ strcpy(gigastr,"The iNES header contains incorrect information. For now, the information will be corrected in RAM. ");\r
+ if(tofix&1)\r
+ sprintf(gigastr+strlen(gigastr),"The mapper number should be set to %d. ",MapperNo);\r
+ if(tofix&2)\r
+ {\r
+ char *mstr[3]={"Horizontal","Vertical","Four-screen"};\r
+ sprintf(gigastr+strlen(gigastr),"Mirroring should be set to \"%s\". ",mstr[Mirroring&3]);\r
+ }\r
+ if(tofix&4)\r
+ strcat(gigastr,"The battery-backed bit should be set. ");\r
+ if(tofix&8)\r
+ strcat(gigastr,"This game should not have any CHR ROM. ");\r
+ strcat(gigastr,"\n");\r
+ FCEU_printf("%s",gigastr);\r
+ }\r
}\r
\r
typedef struct {\r
void (*init)(CartInfo *);\r
} NewMI;\r
\r
-int iNESLoad(const char *name, int fp)\r
+//this is for games that is not the a power of 2\r
+//mapper based for now...\r
+//not really accurate but this works since games\r
+//that are not in the power of 2 tends to come\r
+//in obscure mappers themselves which supports such\r
+//size\r
+static int not_power2[] =\r
+{\r
+ 228\r
+};\r
+typedef struct {\r
+ char* name;\r
+ int number;\r
+ void (*init)(CartInfo *);\r
+} BMAPPINGLocal;\r
+\r
+static BMAPPINGLocal bmap[] = {\r
+ {"NROM", 0, NROM_Init},\r
+ {"MMC1", 1, Mapper1_Init},\r
+ {"UNROM", 2, UNROM_Init},\r
+ {"CNROM", 3, CNROM_Init},\r
+ {"MMC3", 4, Mapper4_Init},\r
+ {"MMC5", 5, Mapper5_Init},\r
+// {6, Mapper6_Init},\r
+ {"ANROM", 7, ANROM_Init},\r
+ {"", 8, Mapper8_Init}, // Nogaems, it's worthless\r
+// {9, Mapper9_Init},\r
+// {10, Mapper10_Init},\r
+ {"Color Dreams", 11, Mapper11_Init},\r
+ {"", 12, Mapper12_Init},\r
+ {"CPROM", 13, CPROM_Init},\r
+// {14, Mapper14_Init},\r
+ {"100-in1", 15, Mapper15_Init},\r
+ {"Bandai", 16, Mapper16_Init},\r
+ {"", 17, Mapper17_Init},\r
+ {"", 18, Mapper18_Init},\r
+ {"Namcot 106", 19, Mapper19_Init},\r
+// {20, Mapper20_Init},\r
+// {21, Mapper21_Init},\r
+// {22, Mapper22_Init},\r
+ {"Konami VRC2 type B", 23, Mapper23_Init},\r
+// {24, Mapper24_Init},\r
+// {25, Mapper25_Init},\r
+// {26, Mapper26_Init},\r
+// {27, Mapper27_Init},\r
+// {28, Mapper28_Init},\r
+// {29, Mapper29_Init},\r
+// {30, Mapper30_Init},\r
+// {31, Mapper31_Init},\r
+// {32, Mapper32_Init},\r
+// {33, Mapper33_Init},\r
+ {"", 34, Mapper34_Init},\r
+ {"Wario Land 2", 35, UNLSC127_Init}, // Wario Land 2\r
+ {"TXC Policeman", 36, Mapper36_Init}, // TXC Policeman\r
+ {"", 37, Mapper37_Init},\r
+ {"Bit Corp. Crime Busters", 38, Mapper38_Init}, // Bit Corp. Crime Busters\r
+// {39, Mapper39_Init},\r
+// {40, Mapper40_Init},\r
+// {41, Mapper41_Init},\r
+// {42, Mapper42_Init},\r
+ {"", 43, Mapper43_Init},\r
+ {"", 44, Mapper44_Init},\r
+ {"", 45, Mapper45_Init},\r
+// {46, Mapper46_Init},\r
+ {"", 47, Mapper47_Init},\r
+// {48, Mapper48_Init},\r
+ {"", 49, Mapper49_Init},\r
+// {50, Mapper50_Init},\r
+// {51, Mapper51_Init},\r
+ {"", 52, Mapper52_Init},\r
+// {53, Mapper53_Init},\r
+// {54, Mapper54_Init},\r
+// {55, Mapper55_Init},\r
+// {56, Mapper56_Init},\r
+ {"", 57, Mapper57_Init},\r
+ {"", 58, BMCGK192_Init},\r
+// {59, Mapper59_Init},\r
+ {"", 60, BMCD1038_Init},\r
+// {61, Mapper61_Init},\r
+// {62, Mapper62_Init},\r
+// {63, Mapper63_Init},\r
+// {64, Mapper64_Init},\r
+// {65, Mapper65_Init},\r
+ {"MHROM", 66, MHROM_Init},\r
+// {67, Mapper67_Init},\r
+ {"Sunsoft Mapper #4", 68, Mapper68_Init},\r
+// {69, Mapper69_Init},\r
+ {"", 70, Mapper70_Init},\r
+// {71, Mapper71_Init},\r
+// {72, Mapper72_Init},\r
+// {73, Mapper73_Init},\r
+ {"", 74, Mapper74_Init},\r
+// {75, Mapper75_Init},\r
+// {76, Mapper76_Init},\r
+// {77, Mapper77_Init},\r
+ {"Irem 74HC161/32", 78, Mapper78_Init},\r
+// {79, Mapper79_Init},\r
+// {80, Mapper80_Init},\r
+// {81, Mapper81_Init},\r
+ {"", 82, Mapper82_Init},\r
+ {"", 83, Mapper83_Init},\r
+// {84, Mapper84_Init},\r
+// {85, Mapper85_Init},\r
+ {"", 86, Mapper86_Init},\r
+ {"", 87, Mapper87_Init},\r
+ {"", 88, Mapper88_Init},\r
+ {"", 89, Mapper89_Init},\r
+ {"", 90, Mapper90_Init},\r
+ {"", 91, Mapper91_Init},\r
+ {"", 92, Mapper92_Init},\r
+ {"Sunsoft UNROM", 93, SUNSOFT_UNROM_Init},\r
+ {"", 94, Mapper94_Init},\r
+ {"", 95, Mapper95_Init},\r
+ {"", 96, Mapper96_Init},\r
+ {"", 97, Mapper97_Init},\r
+// {98, Mapper98_Init},\r
+ {"", 99, Mapper99_Init},\r
+// {100, Mapper100_Init},\r
+ {"", 101, Mapper101_Init},\r
+// {102, Mapper102_Init},\r
+ {"", 103, Mapper103_Init},\r
+// {104, Mapper104_Init},\r
+ {"", 105, Mapper105_Init},\r
+ {"", 106, Mapper106_Init},\r
+ {"", 107, Mapper107_Init},\r
+ {"", 108, Mapper108_Init},\r
+// {109, Mapper109_Init},\r
+// {110, Mapper110_Init},\r
+// {111, Mapper111_Init},\r
+ {"", 112, Mapper112_Init},\r
+ {"", 113, Mapper113_Init},\r
+ {"", 114, Mapper114_Init},\r
+ {"", 115, Mapper115_Init},\r
+ {"UNLSL12", 116, UNLSL12_Init},\r
+ {"", 117, Mapper117_Init},\r
+ {"TSKROM", 118, TKSROM_Init},\r
+ {"", 119, Mapper119_Init},\r
+ {"", 120, Mapper120_Init},\r
+ {"", 121, Mapper121_Init},\r
+// {122, Mapper122_Init},\r
+ {"UNLH2288", 123, UNLH2288_Init},\r
+// {124, Mapper124_Init},\r
+// {125, Mapper125_Init},\r
+// {126, Mapper126_Init},\r
+// {127, Mapper127_Init},\r
+// {128, Mapper128_Init},\r
+// {129, Mapper129_Init},\r
+// {130, Mapper130_Init},\r
+// {131, Mapper131_Init},\r
+ {"UNL22211", 132, UNL22211_Init},\r
+ {"SA72008", 133, SA72008_Init},\r
+ {"", 134, Mapper134_Init},\r
+// {135, Mapper135_Init},\r
+ {"TCU02", 136, TCU02_Init},\r
+ {"S8259D", 137, S8259D_Init},\r
+ {"S8259B", 138, S8259B_Init},\r
+ {"S8259C", 139, S8259C_Init},\r
+ {"", 140, Mapper140_Init},\r
+ {"S8259A", 141, S8259A_Init},\r
+ {"UNLKS7032", 142, UNLKS7032_Init},\r
+ {"TCA01", 143, TCA01_Init},\r
+ {"", 144, Mapper144_Init},\r
+ {"SA72007", 145, SA72007_Init},\r
+ {"SA0161M", 146, SA0161M_Init},\r
+ {"TCU01", 147, TCU01_Init},\r
+ {"SA0037", 148, SA0037_Init},\r
+ {"SA0036", 149, SA0036_Init},\r
+ {"S74LS374N", 150, S74LS374N_Init},\r
+ {"", 151, Mapper151_Init},\r
+ {"", 152, Mapper152_Init},\r
+ {"", 153, Mapper153_Init},\r
+ {"", 154, Mapper154_Init},\r
+ {"", 155, Mapper155_Init},\r
+ {"", 156, Mapper156_Init},\r
+ {"", 157, Mapper157_Init},\r
+// {158, Mapper158_Init},\r
+// {159, Mapper159_Init},\r
+ {"SA009", 160, SA009_Init},\r
+// {161, Mapper161_Init},\r
+ {"", 162, UNLFS304_Init},\r
+ {"", 163, Mapper163_Init},\r
+ {"", 164, Mapper164_Init},\r
+ {"", 165, Mapper165_Init},\r
+// {166, Mapper166_Init},\r
+// {167, Mapper167_Init},\r
+ {"", 168, Mapper168_Init},\r
+// {169, Mapper169_Init},\r
+ {"", 171, Mapper171_Init},\r
+ {"", 172, Mapper172_Init},\r
+ {"", 173, Mapper173_Init},\r
+ {"", 175, Mapper175_Init},\r
+// {174, Mapper174_Init},\r
+ {"", 175, Mapper175_Init},\r
+ {"BMCFK23C", 176, BMCFK23C_Init},\r
+ {"", 177, Mapper177_Init},\r
+ {"", 178, Mapper178_Init},\r
+// {179, Mapper179_Init},\r
+ {"", 180, Mapper180_Init},\r
+ {"", 181, Mapper181_Init},\r
+// {"", 182, Mapper182_Init}, // identical to 114\r
+ {"", 183, Mapper183_Init},\r
+ {"", 184, Mapper184_Init},\r
+ {"", 185, Mapper185_Init},\r
+ {"", 186, Mapper186_Init},\r
+ {"", 187, Mapper187_Init},\r
+ {"", 188, Mapper188_Init},\r
+ {"", 189, Mapper189_Init},\r
+// {190, Mapper190_Init},\r
+ {"", 191, Mapper191_Init},\r
+ {"", 192, Mapper192_Init},\r
+ {"", 193, Mapper193_Init},\r
+ {"", 194, Mapper194_Init},\r
+ {"", 195, Mapper195_Init},\r
+ {"", 196, Mapper196_Init},\r
+ {"", 197, Mapper197_Init},\r
+ {"", 198, Mapper198_Init},\r
+ {"", 199, Mapper199_Init},\r
+ {"", 200, Mapper200_Init},\r
+// {201, Mapper201_Init},\r
+// {202, Mapper202_Init},\r
+// {203, Mapper203_Init},\r
+// {204, Mapper204_Init},\r
+ {"", 205, Mapper205_Init},\r
+ {"DEIROM", 206, DEIROM_Init},\r
+// {207, Mapper207_Init},\r
+ {"", 208, Mapper208_Init},\r
+ {"", 209, Mapper209_Init},\r
+ {"", 210, Mapper210_Init},\r
+ {"", 211, Mapper211_Init},\r
+// {212, Mapper212_Init},\r
+// {213, Mapper213_Init},\r
+// {214, Mapper214_Init},\r
+ {"", 215, UNL8237_Init},\r
+ {"", 216, Mapper216_Init},\r
+// {"", 217, Mapper217_Init},\r
+// {218, Mapper218_Init},\r
+ {"UNLA9746", 219, UNLA9746_Init},\r
+ {"", 220, UNLKS7057_Init}, // DEBUG mapper\r
+ {"UNLN625092", 221, UNLN625092_Init},\r
+ {"", 222, Mapper222_Init},\r
+// {223, Mapper223_Init},\r
+// {224, Mapper224_Init},\r
+ {"", 225, Mapper225_Init},\r
+ {"", 226, Mapper226_Init},\r
+// {227, Mapper227_Init},\r
+// {228, Mapper228_Init},\r
+// {229, Mapper229_Init},\r
+// {230, Mapper230_Init},\r
+// {231, Mapper231_Init},\r
+// {232, Mapper232_Init},\r
+ {"BMC42in1r", 233, BMC42in1r_Init},\r
+// {234, Mapper234_Init},\r
+ {"", 235, Mapper235_Init},\r
+// {236, Mapper236_Init},\r
+// {237, Mapper237_Init},\r
+ {"UNL6035052", 238, UNL6035052_Init},\r
+// {239, Mapper239_Init},\r
+ {"", 240, Mapper240_Init},\r
+// {241, Mapper241_Init},\r
+// {242, Mapper242_Init},\r
+ {"S74LS374NA", 243, S74LS374NA_Init},\r
+// {244, Mapper244_Init},\r
+ {"", 245, Mapper245_Init},\r
+// {246, Mapper246_Init},\r
+// {247, Mapper247_Init},\r
+// {248, Mapper248_Init},\r
+ {"", 249, Mapper249_Init},\r
+ {"", 250, Mapper250_Init},\r
+// {251, Mapper251_Init},\r
+// {252, Mapper252_Init},\r
+ {"", 253, Mapper253_Init},\r
+ {"", 254, Mapper254_Init},\r
+// {255, Mapper255_Init},\r
+ {"", 0, 0}\r
+};\r
+\r
+void cleanup(struct iNES_HEADER *this)\r
{\r
- struct md5_context md5;\r
+ if(!memcmp((char *)(this)+0x7,"DiskDude",8))\r
+ {\r
+ memset((char *)(this)+0x7,0,0x9);\r
+ }\r
+\r
+ if(!memcmp((char *)(this)+0x7,"demiforce",9))\r
+ {\r
+ memset((char *)(this)+0x7,0,0x9);\r
+ }\r
+\r
+ if(!memcmp((char *)(this)+0xA,"Ni03",4))\r
+ {\r
+ if(!memcmp((char *)(this)+0x7,"Dis",3))\r
+ memset((char *)(this)+0x7,0,0x9);\r
+ else\r
+ memset((char *)(this)+0xA,0,0x6);\r
+ }\r
+}\r
+\r
+int iNESLoad(const char *name, int fp, int OverwriteVidMode)\r
+{\r
+ struct md5_context md5;\r
\r
if(FCEU_fread(&head,1,16,fp)!=16)\r
- return 0;\r
+ return 0;\r
\r
- if(memcmp(&head,"NES\x1a",4))\r
- return 0;\r
+ if(memcmp(&head,"NES\x1a",4))\r
+ return 0;\r
\r
- memset(&iNESCart,0,sizeof(iNESCart));\r
+ cleanup(&head);\r
\r
- if(!memcmp((char *)(&head)+0x7,"DiskDude",8))\r
- {\r
- memset((char *)(&head)+0x7,0,0x9);\r
- }\r
+ memset(&iNESCart,0,sizeof(iNESCart));\r
\r
- if(!memcmp((char *)(&head)+0x7,"demiforce",9))\r
- {\r
- memset((char *)(&head)+0x7,0,0x9);\r
- }\r
+ MapperNo = (head.ROM_type>>4);\r
+ MapperNo|=(head.ROM_type2&0xF0);\r
+ Mirroring = (head.ROM_type&1);\r
\r
- if(!memcmp((char *)(&head)+0xA,"Ni03",4))\r
- {\r
- if(!memcmp((char *)(&head)+0x7,"Dis",3))\r
- memset((char *)(&head)+0x7,0,0x9);\r
- else\r
- memset((char *)(&head)+0xA,0,0x6);\r
- }\r
\r
-// int ROM_size=0;\r
- if(!head.ROM_size)\r
+ // int ROM_size=0;\r
+ if(!head.ROM_size)\r
{\r
-// FCEU_PrintError("No PRG ROM!");\r
-// return(0);\r
- ROM_size=256;\r
- //head.ROM_size++;\r
+ // FCEU_PrintError("No PRG ROM!");\r
+ // return(0);\r
+ ROM_size=256;\r
+ //head.ROM_size++;\r
}\r
- else\r
- ROM_size=head.ROM_size;\r
+ else\r
+ ROM_size=uppow2(head.ROM_size);\r
\r
-// ROM_size = head.ROM_size;\r
- VROM_size = head.VROM_size;\r
- ROM_size=uppow2(ROM_size);\r
+ // ROM_size = head.ROM_size;\r
+ VROM_size = head.VROM_size;\r
\r
- if(VROM_size)\r
- VROM_size=uppow2(VROM_size);\r
+ int round = 1;\r
+ int i;\r
+ for (i = 0; i != sizeof(not_power2)/sizeof(not_power2[0]); ++i)\r
+ {\r
+ //for games not to the power of 2, so we just read enough\r
+ //prg rom from it, but we have to keep ROM_size to the power of 2\r
+ //since PRGCartMapping wants ROM_size to be to the power of 2\r
+ //so instead if not to power of 2, we just use head.ROM_size when\r
+ //we use FCEU_read\r
+ if (not_power2[i] == MapperNo)\r
+ {\r
+ round = 0;\r
+ break;\r
+ }\r
+ }\r
\r
- MapperNo = (head.ROM_type>>4);\r
- MapperNo|=(head.ROM_type2&0xF0);\r
- Mirroring = (head.ROM_type&1);\r
+ if(VROM_size)\r
+ VROM_size=uppow2(VROM_size);\r
\r
- if(head.ROM_type&8) Mirroring=2;\r
\r
- if(!(ROM=(uint8 *)FCEU_malloc(ROM_size<<14)))\r
- return 0;\r
+ if(head.ROM_type&8) Mirroring=2;\r
\r
- if(VROM_size)\r
- if(!(VROM=(uint8 *)FCEU_malloc(VROM_size<<13)))\r
- {\r
- free(ROM);\r
- return 0;\r
- }\r
+ if((ROM = (uint8 *)FCEU_malloc(ROM_size<<14)) == NULL) return 0;\r
\r
- memset(ROM,0xFF,ROM_size<<14);\r
- if(VROM_size) memset(VROM,0xFF,VROM_size<<13);\r
- if(head.ROM_type&4) /* Trainer */\r
+ if(VROM_size)\r
+ {\r
+ if((VROM = (uint8 *)FCEU_malloc(VROM_size<<13)) == NULL)\r
+ {\r
+ free(ROM);\r
+ ROM = NULL;\r
+ return 0;\r
+ }\r
+ }\r
+ memset(ROM,0xFF,ROM_size<<14);\r
+ if(VROM_size) memset(VROM,0xFF,VROM_size<<13);\r
+ if(head.ROM_type&4) /* Trainer */\r
{\r
- trainerpoo=(uint8 *)FCEU_gmalloc(512);\r
- FCEU_fread(trainerpoo,512,1,fp);\r
+ trainerpoo=(uint8 *)FCEU_gmalloc(512);\r
+ FCEU_fread(trainerpoo,512,1,fp);\r
}\r
\r
ResetCartMapping();\r
ResetExState(0,0);\r
\r
SetupCartPRGMapping(0,ROM,ROM_size*0x4000,0);\r
- SetupCartPRGMapping(1,WRAM,8192,1);\r
+ // SetupCartPRGMapping(1,WRAM,8192,1); // ?\r
\r
- FCEU_fread(ROM,0x4000,head.ROM_size,fp);\r
+ FCEU_fread(ROM,0x4000,(round) ? ROM_size : head.ROM_size,fp);\r
\r
if(VROM_size)\r
- FCEU_fread(VROM,0x2000,head.VROM_size,fp);\r
+ FCEU_fread(VROM,0x2000,head.VROM_size,fp);\r
\r
- md5_starts(&md5);\r
- md5_update(&md5,ROM,ROM_size<<14);\r
+ md5_starts(&md5);\r
+ md5_update(&md5,ROM,ROM_size<<14);\r
\r
iNESGameCRC32=CalcCRC32(0,ROM,ROM_size<<14);\r
\r
if(VROM_size)\r
{\r
- iNESGameCRC32=CalcCRC32(iNESGameCRC32,VROM,VROM_size<<13);\r
- md5_update(&md5,VROM,VROM_size<<13);\r
+ iNESGameCRC32=CalcCRC32(iNESGameCRC32,VROM,VROM_size<<13);\r
+ md5_update(&md5,VROM,VROM_size<<13);\r
}\r
md5_finish(&md5,iNESCart.MD5);\r
- memcpy(FCEUGameInfo.MD5,iNESCart.MD5,sizeof(iNESCart.MD5));\r
+ memcpy(&GameInfo->MD5,&iNESCart.MD5,sizeof(iNESCart.MD5));\r
\r
iNESCart.CRC32=iNESGameCRC32;\r
\r
- FCEU_printf(" PRG ROM: %3d x 16KiB\n CHR ROM: %3d x 8KiB\n ROM CRC32: 0x%08lx\n",\r
- head.ROM_size,head.VROM_size,iNESGameCRC32);\r
+ FCEU_printf(" PRG ROM: %3d x 16KiB\n CHR ROM: %3d x 8KiB\n ROM CRC32: 0x%08lx\n",\r
+ (round) ? ROM_size : head.ROM_size, head.VROM_size,\r
+ (unsigned long)iNESGameCRC32);\r
\r
- {\r
- int x;\r
- FCEU_printf(" ROM MD5: 0x");\r
- for(x=0;x<16;x++)\r
- FCEU_printf("%02x",iNESCart.MD5[x]);\r
- FCEU_printf("\n");\r
- }\r
- FCEU_printf(" Mapper: %d\n Mirroring: %s\n", MapperNo,Mirroring==2?"None(Four-screen)":Mirroring?"Vertical":"Horizontal");\r
- if(head.ROM_type&2) FCEU_printf(" Battery-backed.\n");\r
- if(head.ROM_type&4) FCEU_printf(" Trained.\n");\r
+ {\r
+ int x;\r
+ FCEU_printf(" ROM MD5: 0x");\r
+ for(x=0;x<16;x++)\r
+ FCEU_printf("%02x",iNESCart.MD5[x]);\r
+ FCEU_printf("\n");\r
+ }\r
+\r
+ char* mappername = "Not Listed";\r
+ int mappertest;\r
+\r
+ for(mappertest=0;mappertest< (sizeof bmap / sizeof bmap[0]) - 1;mappertest++)\r
+ {\r
+ if (bmap[mappertest].number == MapperNo) {\r
+ mappername = bmap[mappertest].name;\r
+ break;\r
+ }\r
+ }\r
+\r
+ FCEU_printf(" Mapper #: %d\n Mapper name: %s\n Mirroring: %s\n",\r
+ MapperNo, mappername, Mirroring==2?"None (Four-screen)":Mirroring?"Vertical":"Horizontal");\r
+\r
+ FCEU_printf(" Battery-backed: %s\n", (head.ROM_type&2)?"Yes":"No");\r
+ FCEU_printf(" Trained: %s\n", (head.ROM_type&4)?"Yes":"No");\r
+ // (head.ROM_type&8) = Mirroring: None(Four-screen)\r
\r
SetInput();\r
CheckHInfo();\r
{\r
- int x;\r
- uint64 partialmd5=0;\r
+ int x;\r
+ uint64 partialmd5=0;\r
\r
- for(x=0;x<8;x++)\r
- {\r
- partialmd5 |= (uint64)iNESCart.MD5[7-x] << (x*8);\r
- }\r
+ for(x=0;x<8;x++)\r
+ {\r
+ partialmd5 |= (uint64)iNESCart.MD5[7-x] << (x*8);\r
+ }\r
\r
- FCEU_VSUniCheck(partialmd5, &MapperNo, &Mirroring);\r
+ FCEU_VSUniCheck(partialmd5, &MapperNo, &Mirroring);\r
}\r
/* Must remain here because above functions might change value of\r
- VROM_size and free(VROM).\r
+ VROM_size and free(VROM).\r
*/\r
if(VROM_size)\r
- SetupCartCHRMapping(0,VROM,VROM_size*0x2000,0);\r
+ SetupCartCHRMapping(0,VROM,VROM_size*0x2000,0);\r
\r
- if(Mirroring==2)\r
- SetupCartMirroring(4,1,ExtraNTARAM);\r
- else if(Mirroring>=0x10)\r
- SetupCartMirroring(2+(Mirroring&1),1,0);\r
+ if(Mirroring==2)\r
+ SetupCartMirroring(4,1,ExtraNTARAM);\r
+ else if(Mirroring>=0x10)\r
+ SetupCartMirroring(2+(Mirroring&1),1,0);\r
else\r
- SetupCartMirroring(Mirroring&1,(Mirroring&4)>>2,0);\r
+ SetupCartMirroring(Mirroring&1,(Mirroring&4)>>2,0);\r
\r
iNESCart.battery=(head.ROM_type&2)?1:0;\r
iNESCart.mirror=Mirroring;\r
\r
//if(MapperNo != 18) {\r
- // if(ROM) free(ROM);\r
- // if(VROM) free(VROM);\r
- // ROM=VROM=0;\r
- // return(0);\r
+ // if(ROM) free(ROM);\r
+ // if(VROM) free(VROM);\r
+ // ROM=VROM=0;\r
+ // return(0);\r
// }\r
\r
- if(NewiNES_Init(MapperNo))\r
- {\r
\r
- }\r
- else\r
- {\r
- iNESCart.Power=iNESPower;\r
- if(head.ROM_type&2)\r
- {\r
- iNESCart.SaveGame[0]=WRAM;\r
- iNESCart.SaveGameLen[0]=8192;\r
- }\r
- }\r
+ GameInfo->mappernum = MapperNo;\r
+ MapperInit();\r
FCEU_LoadGameSave(&iNESCart);\r
\r
+ //strcpy(LoadedRomFName,name); //bbit edited: line added\r
+\r
+ // Extract Filename only. Should account for Windows/Unix this way.\r
+ if (strrchr(name, '/')) {\r
+ name = strrchr(name, '/') + 1;\r
+ } else if(strrchr(name, '\\')) {\r
+ name = strrchr(name, '\\') + 1;\r
+ }\r
+\r
GameInterface=iNESGI;\r
FCEU_printf("\n");\r
\r
// since apparently the iNES format doesn't store this information,\r
// guess if the settings should be PAL or NTSC from the ROM name\r
// TODO: MD5 check against a list of all known PAL games instead?\r
- if(strstr(name,"(E)") || strstr(name,"(e)")\r
- || strstr(name,"(F)") || strstr(name,"(f)")\r
- || strstr(name,"(G)") || strstr(name,"(g)")\r
- || strstr(name,"(I)") || strstr(name,"(i)"))\r
- FCEUI_SetVidSystem(1);\r
- else\r
- FCEUI_SetVidSystem(0);\r
+ if(OverwriteVidMode)\r
+ {\r
+ if(strstr(name,"(E)") || strstr(name,"(e)")\r
+ || strstr(name,"(F)") || strstr(name,"(f)")\r
+ || strstr(name,"(G)") || strstr(name,"(g)")\r
+ || strstr(name,"(I)") || strstr(name,"(i)"))\r
+ FCEUI_SetVidSystem(1);\r
+ else\r
+ FCEUI_SetVidSystem(0);\r
+ }\r
+ return 1;\r
+}\r
+\r
+\r
+//bbit edited: the whole function below was added\r
+int iNesSave(){\r
+ FILE *fp;\r
+ char name[2048];\r
+\r
+ if(GameInfo->type != GIT_CART)return 0;\r
+ if(GameInterface!=iNESGI)return 0;\r
+\r
+ //strcpy(name,LoadedRomFName);\r
+ if (strcmp(name+strlen(name)-4,".nes") != 0) { //para edit\r
+ strcat(name,".nes");\r
+ }\r
+\r
+ fp = fopen(name,"wb");\r
+\r
+ if(fwrite(&head,1,16,fp)!=16)\r
+ {\r
+ fclose(fp);\r
+ return 0;\r
+ }\r
+\r
+ if(head.ROM_type&4) /* Trainer */\r
+ {\r
+ fwrite(trainerpoo,512,1,fp);\r
+ }\r
+\r
+ fwrite(ROM,0x4000,ROM_size,fp);\r
+\r
+ if(head.VROM_size)fwrite(VROM,0x2000,head.VROM_size,fp);\r
+ fclose(fp);\r
\r
return 1;\r
}\r
\r
-void FASTAPASS(2) VRAM_BANK1(uint32 A, uint8 V)\r
+int iNesSaveAs(char* name)\r
{\r
- V&=7;\r
- PPUCHRRAM|=(1<<(A>>10));\r
- CHRBankList[(A)>>10]=V;\r
- VPage[(A)>>10]=&CHRRAM[V<<10]-(A);\r
+ //adelikat: TODO: iNesSave() and this have pretty much the same code, outsource the common code to a single function\r
+ FILE *fp;\r
+\r
+ if(GameInfo->type != GIT_CART)return 0;\r
+ if(GameInterface != iNESGI)return 0;\r
+\r
+ fp = fopen(name,"wb");\r
+\r
+ if(fwrite(&head,1,16,fp)!=16)\r
+ {\r
+ fclose(fp);\r
+ return 0;\r
+ }\r
+\r
+ if(head.ROM_type&4) /* Trainer */\r
+ {\r
+ fwrite(trainerpoo,512,1,fp);\r
+ }\r
+\r
+ fwrite(ROM,0x4000,ROM_size,fp);\r
+\r
+ if(head.VROM_size)fwrite(VROM,0x2000,head.VROM_size,fp);\r
+ fclose(fp);\r
+\r
+ return 1;\r
+}\r
+\r
+//para edit: added function below\r
+#if 0\r
+char *iNesShortFName() {\r
+ char *ret;\r
+\r
+ if (!(ret = strrchr(LoadedRomFName,'\\'))) {\r
+ if (!(ret = strrchr(LoadedRomFName,'/'))) return 0;\r
+ }\r
+ return ret+1;\r
+}\r
+#endif\r
+\r
+void VRAM_BANK1(uint32 A, uint8 V)\r
+{\r
+ V&=7;\r
+ PPUCHRRAM|=(1<<(A>>10));\r
+ CHRBankList[(A)>>10]=V;\r
+ VPage[(A)>>10]=&CHRRAM[V<<10]-(A);\r
}\r
\r
-void FASTAPASS(2) VRAM_BANK4(uint32 A, uint32 V)\r
+void VRAM_BANK4(uint32 A, uint32 V)\r
{\r
- V&=1;\r
- PPUCHRRAM|=(0xF<<(A>>10));\r
- CHRBankList[(A)>>10]=(V<<2);\r
- CHRBankList[((A)>>10)+1]=(V<<2)+1;\r
- CHRBankList[((A)>>10)+2]=(V<<2)+2;\r
- CHRBankList[((A)>>10)+3]=(V<<2)+3;\r
- VPage[(A)>>10]=&CHRRAM[V<<10]-(A);\r
+ V&=1;\r
+ PPUCHRRAM|=(0xF<<(A>>10));\r
+ CHRBankList[(A)>>10]=(V<<2);\r
+ CHRBankList[((A)>>10)+1]=(V<<2)+1;\r
+ CHRBankList[((A)>>10)+2]=(V<<2)+2;\r
+ CHRBankList[((A)>>10)+3]=(V<<2)+3;\r
+ VPage[(A)>>10]=&CHRRAM[V<<10]-(A);\r
}\r
-void FASTAPASS(2) VROM_BANK1(uint32 A,uint32 V)\r
+void VROM_BANK1(uint32 A,uint32 V)\r
{\r
- setchr1(A,V);\r
- CHRBankList[(A)>>10]=V;\r
+ setchr1(A,V);\r
+ CHRBankList[(A)>>10]=V;\r
}\r
\r
-void FASTAPASS(2) VROM_BANK2(uint32 A,uint32 V)\r
+void VROM_BANK2(uint32 A,uint32 V)\r
{\r
- setchr2(A,V);\r
- CHRBankList[(A)>>10]=(V<<1);\r
- CHRBankList[((A)>>10)+1]=(V<<1)+1;\r
+ setchr2(A,V);\r
+ CHRBankList[(A)>>10]=(V<<1);\r
+ CHRBankList[((A)>>10)+1]=(V<<1)+1;\r
}\r
\r
-void FASTAPASS(2) VROM_BANK4(uint32 A, uint32 V)\r
+void VROM_BANK4(uint32 A, uint32 V)\r
{\r
- setchr4(A,V);\r
- CHRBankList[(A)>>10]=(V<<2);\r
- CHRBankList[((A)>>10)+1]=(V<<2)+1;\r
- CHRBankList[((A)>>10)+2]=(V<<2)+2;\r
- CHRBankList[((A)>>10)+3]=(V<<2)+3;\r
+ setchr4(A,V);\r
+ CHRBankList[(A)>>10]=(V<<2);\r
+ CHRBankList[((A)>>10)+1]=(V<<2)+1;\r
+ CHRBankList[((A)>>10)+2]=(V<<2)+2;\r
+ CHRBankList[((A)>>10)+3]=(V<<2)+3;\r
}\r
\r
-void FASTAPASS(1) VROM_BANK8(uint32 V)\r
+void VROM_BANK8(uint32 V)\r
{\r
- setchr8(V);\r
- CHRBankList[0]=(V<<3);\r
- CHRBankList[1]=(V<<3)+1;\r
- CHRBankList[2]=(V<<3)+2;\r
- CHRBankList[3]=(V<<3)+3;\r
- CHRBankList[4]=(V<<3)+4;\r
- CHRBankList[5]=(V<<3)+5;\r
- CHRBankList[6]=(V<<3)+6;\r
- CHRBankList[7]=(V<<3)+7;\r
+ setchr8(V);\r
+ CHRBankList[0]=(V<<3);\r
+ CHRBankList[1]=(V<<3)+1;\r
+ CHRBankList[2]=(V<<3)+2;\r
+ CHRBankList[3]=(V<<3)+3;\r
+ CHRBankList[4]=(V<<3)+4;\r
+ CHRBankList[5]=(V<<3)+5;\r
+ CHRBankList[6]=(V<<3)+6;\r
+ CHRBankList[7]=(V<<3)+7;\r
}\r
\r
-void FASTAPASS(2) ROM_BANK8(uint32 A, uint32 V)\r
+void ROM_BANK8(uint32 A, uint32 V)\r
{\r
- setprg8(A,V);\r
- if(A>=0x8000)\r
- PRGBankList[((A-0x8000)>>13)]=V;\r
+ setprg8(A,V);\r
+ if(A>=0x8000)\r
+ PRGBankList[((A-0x8000)>>13)]=V;\r
}\r
\r
-void FASTAPASS(2) ROM_BANK16(uint32 A, uint32 V)\r
+void ROM_BANK16(uint32 A, uint32 V)\r
{\r
- setprg16(A,V);\r
- if(A>=0x8000)\r
- {\r
- PRGBankList[((A-0x8000)>>13)]=V<<1;\r
- PRGBankList[((A-0x8000)>>13)+1]=(V<<1)+1;\r
- }\r
+ setprg16(A,V);\r
+ if(A>=0x8000)\r
+ {\r
+ PRGBankList[((A-0x8000)>>13)]=V<<1;\r
+ PRGBankList[((A-0x8000)>>13)+1]=(V<<1)+1;\r
+ }\r
}\r
\r
-void FASTAPASS(1) ROM_BANK32(uint32 V)\r
+void ROM_BANK32(uint32 V)\r
{\r
- setprg32(0x8000,V);\r
- PRGBankList[0]=V<<2;\r
- PRGBankList[1]=(V<<2)+1;\r
- PRGBankList[2]=(V<<2)+2;\r
- PRGBankList[3]=(V<<2)+3;\r
+ setprg32(0x8000,V);\r
+ PRGBankList[0]=V<<2;\r
+ PRGBankList[1]=(V<<2)+1;\r
+ PRGBankList[2]=(V<<2)+2;\r
+ PRGBankList[3]=(V<<2)+3;\r
}\r
\r
-void FASTAPASS(1) onemir(uint8 V)\r
+void onemir(uint8 V)\r
{\r
if(Mirroring==2) return;\r
- if(V>1)\r
- V=1;\r
+ if(V>1)\r
+ V=1;\r
Mirroring=0x10|V;\r
setmirror(MI_0+V);\r
}\r
\r
-void FASTAPASS(1) MIRROR_SET2(uint8 V)\r
+void MIRROR_SET2(uint8 V)\r
{\r
if(Mirroring==2) return;\r
Mirroring=V;\r
setmirror(V);\r
}\r
\r
-void FASTAPASS(1) MIRROR_SET(uint8 V)\r
+void MIRROR_SET(uint8 V)\r
{\r
if(Mirroring==2) return;\r
V^=1;\r
\r
static void NONE_init(void)\r
{\r
- ROM_BANK16(0x8000,0);\r
- ROM_BANK16(0xC000,~0);\r
+ ROM_BANK16(0x8000,0);\r
+ ROM_BANK16(0xC000,~0);\r
\r
- if(VROM_size)\r
- VROM_BANK8(0);\r
- else\r
- setvram8(CHRRAM);\r
+ if(VROM_size)\r
+ VROM_BANK8(0);\r
+ else\r
+ setvram8(CHRRAM);\r
}\r
\r
void (*MapInitTab[256])(void)=\r
{\r
- 0,0,\r
-// Mapper2_init,Mapper3_init,\r
- 0,0,\r
- 0,0,\r
- Mapper6_init,Mapper7_init,Mapper8_init,Mapper9_init,\r
- Mapper10_init,Mapper11_init,\r
- 0,\r
-// Mapper13_init,\r
- 0,\r
- 0,\r
- Mapper15_init,Mapper16_init,Mapper17_init,Mapper18_init,\r
- 0,0,\r
- Mapper21_init,Mapper22_init,Mapper23_init,Mapper24_init,\r
- Mapper25_init,Mapper26_init,Mapper27_init,\r
- 0,0,0,0,\r
- Mapper32_init,Mapper33_init,Mapper34_init,\r
- 0,0,0,0,0,\r
- Mapper40_init,Mapper41_init,Mapper42_init,Mapper43_init,\r
- 0,0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper2_init,\r
+ 0, //Mapper3_init,\r
+ 0,\r
+ 0,\r
+ Mapper6_init,\r
+ 0, //Mapper7_init,\r
+ 0, //Mapper8_init,\r
+ Mapper9_init,\r
+ Mapper10_init,\r
+ 0, //Mapper11_init,\r
+ 0, \r
+ 0, //Mapper13_init,\r
+ 0,\r
+ 0, //Mapper15_init,\r
+ 0, //Mapper16_init,\r
+ 0, //Mapper17_init,\r
+ 0, //Mapper18_init,\r
+ 0,\r
+ 0,\r
+ Mapper21_init,\r
+ Mapper22_init,\r
+ 0, //Mapper23_init,\r
+ Mapper24_init,\r
+ Mapper25_init,\r
+ Mapper26_init,\r
+ Mapper27_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ Mapper32_init,\r
+ Mapper33_init,\r
+ 0, //Mapper34_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ Mapper40_init,\r
+ Mapper41_init,\r
+ Mapper42_init,\r
+ 0, //Mapper43_init,\r
+ 0,\r
+ 0,\r
Mapper46_init,\r
0,\r
Mapper48_init,\r
0,\r
- Mapper50_init,Mapper51_init,\r
- 0,0,0,0,0,\r
- Mapper57_init,Mapper58_init,Mapper59_init,Mapper60_init,\r
- Mapper61_init,Mapper62_init,\r
- 0,\r
- Mapper64_init,Mapper65_init,Mapper66_init,Mapper67_init,\r
- Mapper68_init,Mapper69_init,Mapper70_init,Mapper71_init,\r
- Mapper72_init,Mapper73_init,\r
- 0,\r
- Mapper75_init,Mapper76_init,Mapper77_init,Mapper78_init,\r
- Mapper79_init,Mapper80_init,\r
- 0,\r
- Mapper82_init,Mapper83_init,\r
- 0,\r
- Mapper85_init,Mapper86_init,Mapper87_init,Mapper88_init,\r
- Mapper89_init,\r
- 0,\r
- Mapper91_init,Mapper92_init,Mapper93_init,Mapper94_init,\r
- 0,\r
- Mapper96_init,Mapper97_init,\r
- 0,\r
- Mapper99_init,\r
- 0,0,0,0,0,0,0,\r
- Mapper107_init,\r
- 0,0,0,0,\r
- 0,Mapper113_init,\r
- 0,0,0,\r
- Mapper117_init,\r
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r
- Mapper140_init,\r
- 0,0,0,\r
- Mapper144_init,\r
- 0,0,0,0,0,0,\r
- Mapper151_init,Mapper152_init,Mapper153_init,Mapper154_init,\r
- 0,\r
- Mapper156_init,Mapper157_init,Mapper158_init,0,\r
- 0,0,0,0,0,0,\r
- Mapper166_init,Mapper167_init,\r
- 0,0,0,0,0,0,0,0,0,0,0,0,\r
- Mapper180_init,\r
- 0,0,0,\r
- Mapper184_init,Mapper185_init,\r
- 0,0,0,\r
- Mapper189_init,\r
- 0,\r
-// Mapper191_init,\r
- 0,\r
- 0,\r
- Mapper193_init,\r
- 0,0,0,0,0,0,\r
- Mapper200_init,Mapper201_init,Mapper202_init,Mapper203_init,\r
+ Mapper50_init,\r
+ Mapper51_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper57_init,\r
+ 0, //Mapper58_init,\r
+ Mapper59_init,\r
+ 0, //Mapper60_init,\r
+ Mapper61_init,\r
+ Mapper62_init,\r
+ 0,\r
+ Mapper64_init,\r
+ Mapper65_init,\r
+ 0, //Mapper66_init,\r
+ Mapper67_init,\r
+ 0, //Mapper68_init,\r
+ Mapper69_init,\r
+ 0, //Mapper70_init,\r
+ Mapper71_init,\r
+ Mapper72_init,\r
+ Mapper73_init,\r
+ 0,\r
+ Mapper75_init,\r
+ Mapper76_init,\r
+ Mapper77_init,\r
+ 0, //Mapper78_init,\r
+ Mapper79_init,\r
+ Mapper80_init,\r
+ 0,\r
+ 0, //Mapper82_init,\r
+ 0, //Mapper83_init,\r
+ 0,\r
+ Mapper85_init,\r
+ 0, //Mapper86_init,\r
+ 0, //Mapper87_init,\r
+ 0, //Mapper88_init,\r
+ 0, //Mapper89_init,\r
+ 0,\r
+ 0, //Mapper91_init,\r
+ 0, //Mapper92_init,\r
+ 0, //Mapper93_init,\r
+ 0, //Mapper94_init,\r
+ 0,\r
+ 0, //Mapper96_init,\r
+ 0, //Mapper97_init,\r
+ 0,\r
+ 0, //Mapper99_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper107_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper113_init,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper116_init,\r
+ 0, //Mapper117_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper140_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper144_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper151_init,\r
+ 0, //Mapper152_init,\r
+ 0, //Mapper153_init,\r
+ 0, //Mapper154_init,\r
+ 0,\r
+ 0, //Mapper156_init,\r
+ 0, //Mapper157_init,\r
+ 0, //Mapper158_init, removed\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ Mapper166_init,\r
+ Mapper167_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper180_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper184_init,\r
+ 0, //Mapper185_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper189_init,\r
+ 0,\r
+ 0, //Mapper191_init,\r
+ 0,\r
+ 0, //Mapper193_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper200_init,\r
+ Mapper201_init,\r
+ Mapper202_init,\r
+ Mapper203_init,\r
Mapper204_init,\r
- 0,0,\r
+ 0,\r
+ 0,\r
Mapper207_init,\r
- 0,0,0,\r
- Mapper211_init,Mapper212_init,Mapper213_init,Mapper214_init,\r
- 0,0,0,0,0,0,0,0,0,0,\r
- Mapper225_init,Mapper226_init,Mapper227_init,Mapper228_init,\r
- Mapper229_init,Mapper230_init,Mapper231_init,Mapper232_init,\r
- 0,\r
- Mapper234_init,Mapper235_init,\r
- 0,0,0,0,\r
- Mapper240_init,Mapper241_init,Mapper242_init,0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper211_init,\r
+ Mapper212_init,\r
+ Mapper213_init,\r
+ Mapper214_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper225_init,\r
+ 0, //Mapper226_init,\r
+ Mapper227_init,\r
+ Mapper228_init,\r
+ Mapper229_init,\r
+ Mapper230_init,\r
+ Mapper231_init,\r
+ Mapper232_init,\r
+ 0,\r
+ Mapper234_init,\r
+ 0, //Mapper235_init,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0, //Mapper240_init,\r
+ Mapper241_init,\r
+ Mapper242_init,\r
+ 0,\r
Mapper244_init,\r
0,\r
Mapper246_init,\r
- 0,0,0,0,0,0,0,0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
Mapper255_init\r
};\r
\r
static DECLFW(BWRAM)\r
{\r
- WRAM[A-0x6000]=V;\r
+ WRAM[A-0x6000]=V;\r
}\r
\r
static DECLFR(AWRAM)\r
{\r
- return WRAM[A-0x6000];\r
+ return WRAM[A-0x6000];\r
}\r
\r
-#ifdef DEBUG_MAPPER\r
-static DECLFW(WriteHandler)\r
-{\r
- FCEU_printf("$%04x:$%02x\n",A,V);\r
-}\r
-#endif\r
\r
void (*MapStateRestore)(int version);\r
void iNESStateRestore(int version)\r
{\r
- int x;\r
-\r
- if(!MapperNo) return;\r
-\r
- for(x=0;x<4;x++)\r
- setprg8(0x8000+x*8192,PRGBankList[x]);\r
-\r
- if(VROM_size)\r
- for(x=0;x<8;x++)\r
- setchr1(0x400*x,CHRBankList[x]);\r
-\r
-if(0) switch(Mirroring)\r
- {\r
- case 0:setmirror(MI_H);break;\r
- case 1:setmirror(MI_V);break;\r
- case 0x12:\r
- case 0x10:setmirror(MI_0);break;\r
- case 0x13:\r
- case 0x11:setmirror(MI_1);break;\r
- }\r
- if(MapStateRestore) MapStateRestore(version);\r
+ int x;\r
+\r
+ if(!MapperNo) return;\r
+\r
+ for(x=0;x<4;x++)\r
+ setprg8(0x8000+x*8192,PRGBankList[x]);\r
+\r
+ if(VROM_size)\r
+ for(x=0;x<8;x++)\r
+ setchr1(0x400*x,CHRBankList[x]);\r
+\r
+ if(0) switch(Mirroring)\r
+ {\r
+ case 0:setmirror(MI_H);break;\r
+ case 1:setmirror(MI_V);break;\r
+ case 0x12:\r
+ case 0x10:setmirror(MI_0);break;\r
+ case 0x13:\r
+ case 0x11:setmirror(MI_1);break;\r
+ }\r
+ if(MapStateRestore) MapStateRestore(version);\r
}\r
\r
static void iNESPower(void)\r
{\r
- int x;\r
+ int x;\r
int type=MapperNo;\r
\r
- SetReadHandler(0x8000,0xFFFF,CartBR);\r
- GameStateRestore=iNESStateRestore;\r
- MapClose=0;\r
+ SetReadHandler(0x8000,0xFFFF,CartBR);\r
+ GameStateRestore=iNESStateRestore;\r
+ MapClose=0;\r
MapperReset=0;\r
- MapStateRestore=0;\r
-\r
- setprg8r(1,0x6000,0);\r
+ MapStateRestore=0;\r
\r
- SetReadHandler(0x6000,0x7FFF,AWRAM);\r
- SetWriteHandler(0x6000,0x7FFF,BWRAM);\r
- FCEU_CheatAddRAM(8,0x6000,WRAM);\r
+ setprg8r(1,0x6000,0);\r
\r
- #ifdef DEBUG_MAPPER\r
- if(type==0) SetWriteHandler(0x4020,0xFFFF,WriteHandler);\r
- #endif\r
+ SetReadHandler(0x6000,0x7FFF,AWRAM);\r
+#ifdef ASM_6502\r
+ // asm code needs pages to be set again..\r
+ Page[12]=Page[13]=Page[14]=Page[15]=WRAM-0x6000;\r
+#endif\r
+ SetWriteHandler(0x6000,0x7FFF,BWRAM);\r
+ FCEU_CheatAddRAM(8,0x6000,WRAM);\r
\r
/* This statement represents atrocious code. I need to rewrite\r
- all of the iNES mapper code... */\r
+ all of the iNES mapper code... */\r
IRQCount=IRQLatch=IRQa=0;\r
- if(head.ROM_type&2)\r
- memset(GameMemBlock+8192,0,sizeof(GameMemBlock)-8192);\r
+ if(head.ROM_type&2)\r
+ memset(GameMemBlock+8192,0,GAME_MEM_BLOCK_SIZE-8192);\r
else\r
- memset(GameMemBlock,0,sizeof(GameMemBlock));\r
+ memset(GameMemBlock,0,GAME_MEM_BLOCK_SIZE);\r
\r
- NONE_init();\r
+ NONE_init();\r
+ ResetExState(0,0);\r
\r
- ResetExState(0,0);\r
- if(FCEUGameInfo.type == GIT_VSUNI)\r
- AddExState(FCEUVSUNI_STATEINFO, ~0, 0, 0);\r
+ if(GameInfo->type == GIT_VSUNI)\r
+ AddExState(FCEUVSUNI_STATEINFO, ~0, 0, 0);\r
\r
- AddExState(WRAM, 8192, 0, "WRAM");\r
- if(type==19 || type==6 || type==69 || type==85 || type==96)\r
- AddExState(MapperExRAM, 32768, 0, "MEXR");\r
- if((!VROM_size || type==6 || type==19) && (type!=13 && type!=96))\r
- AddExState(CHRRAM, 8192, 0, "CHRR");\r
- if(head.ROM_type&8)\r
- AddExState(ExtraNTARAM, 2048, 0, "EXNR");\r
+ AddExState(WRAM, 8192, 0, "WRAM");\r
+ if(type==19 || type==6 || type==69 || type==85 || type==96)\r
+ AddExState(MapperExRAM, 32768, 0, "MEXR");\r
+ if((!VROM_size || type==6 || type==19) && (type!=13 && type!=96))\r
+ AddExState(CHRRAM, 8192, 0, "CHRR");\r
+ if(head.ROM_type&8)\r
+ AddExState(ExtraNTARAM, 2048, 0, "EXNR");\r
\r
/* Exclude some mappers whose emulation code handle save state stuff\r
- themselves. */\r
+ themselves. */\r
if(type && type!=13 && type!=96)\r
{\r
- AddExState(mapbyte1, 32, 0, "MPBY");\r
- AddExState(&Mirroring, 1, 0, "MIRR");\r
- AddExState(&IRQCount, 4, 1, "IRQC");\r
- AddExState(&IRQLatch, 4, 1, "IQL1");\r
- AddExState(&IRQa, 1, 0, "IRQA");\r
- AddExState(PRGBankList, 4, 0, "PBL");\r
- for(x=0;x<8;x++)\r
- {\r
- char tak[8];\r
- sprintf(tak,"CBL%d",x);\r
- AddExState(&CHRBankList[x], 2, 1,tak);\r
- }\r
+ AddExState(mapbyte1, 32, 0, "MPBY");\r
+ AddExState(&Mirroring, 1, 0, "MIRR");\r
+ AddExState(&IRQCount, 4, 1, "IRQC");\r
+ AddExState(&IRQLatch, 4, 1, "IQL1");\r
+ AddExState(&IRQa, 1, 0, "IRQA");\r
+ AddExState(PRGBankList, 4, 0, "PBL");\r
+ for(x=0;x<8;x++)\r
+ {\r
+ char tak[8];\r
+ sprintf(tak,"CBL%d",x);\r
+ AddExState(&CHRBankList[x], 2, 1,tak);\r
+ }\r
}\r
\r
- if(MapInitTab[type]) MapInitTab[type]();\r
- else if(type)\r
- {\r
- FCEU_PrintError("iNES mapper #%d is not supported at all.",type);\r
- }\r
+ if(MapInitTab[type]) MapInitTab[type]();\r
+ else if(type)\r
+ {\r
+ FCEU_PrintError("iNES mapper #%d is not supported at all.",type);\r
+ }\r
}\r
\r
-\r
-typedef struct {\r
- int number;\r
- void (*init)(CartInfo *);\r
-} BMAPPING;\r
-\r
-static BMAPPING bmap[] = {\r
- {1, Mapper1_Init},\r
- {2, UNROM_Init},\r
- {3, CNROM_Init},\r
- {4, Mapper4_Init},\r
- {5, Mapper5_Init},\r
- {12, Mapper12_Init},\r
- {13, CPROM_Init},\r
- {19, Mapper19_Init},\r
- {44, Mapper44_Init},\r
- {45, Mapper45_Init},\r
- {47, Mapper47_Init},\r
- {49, Mapper49_Init},\r
- {52, Mapper52_Init},\r
- {74, Mapper74_Init},\r
- {90, Mapper90_Init},\r
- {95, Mapper95_Init},\r
- {105, Mapper105_Init},\r
- {112, Mapper112_Init},\r
- {114, Mapper114_Init},\r
- {115, Mapper115_Init},\r
- {116, Mapper116_Init},\r
- {118, Mapper118_Init},\r
- {119, Mapper119_Init},\r
- {133, SA72008_Init},\r
- {137, S8259D_Init},\r
- {138, S8259B_Init},\r
- {139, S8259C_Init},\r
- {141, S8259A_Init},\r
- {143, TCA01_Init},\r
- {145, SA72007_Init},\r
- {146, SA0161M_Init},\r
- {147, TCU01_Init},\r
- {148, SA0037_Init},\r
- {149, SA0036_Init},\r
- {150, S74LS374N_Init},\r
- {155, Mapper155_Init},\r
- {160, Mapper90_Init},\r
- {163, Mapper163_Init},\r
- {164, Mapper164_Init},\r
- {165, Mapper165_Init},\r
- {182, Mapper182_Init},\r
- {183, Mapper183_Init},\r
- {186, Mapper186_Init},\r
- {187, Mapper187_Init},\r
- {188, Mapper188_Init},\r
- {191, Mapper191_Init},\r
- {205, Mapper205_Init},\r
- {206, DEIROM_Init},\r
- {208, Mapper208_Init},\r
- {209, Mapper209_Init},\r
- {210, Mapper210_Init},\r
- {215, Mapper215_Init},\r
- {216, Mapper216_Init},\r
- {217, Mapper217_Init},\r
- {243, S74LS374NA_Init},\r
- {245, Mapper245_Init},\r
- {249, Mapper249_Init},\r
- {250, Mapper250_Init},\r
- {254, Mapper254_Init},\r
- { 0, 0}\r
-};\r
-\r
static int NewiNES_Init(int num)\r
{\r
- BMAPPING *tmp=bmap;\r
-\r
- if(FCEUGameInfo.type == GIT_VSUNI)\r
- AddExState(FCEUVSUNI_STATEINFO, ~0, 0, 0);\r
-\r
- while(tmp->init)\r
- {\r
- if(num==tmp->number)\r
- {\r
- UNIFchrrama=0; // need here for compatibility with UNIF mapper code\r
- if(!VROM_size)\r
- {\r
- int CHRRAMSize;\r
- if(num==13)\r
- CHRRAMSize=16384;\r
- else\r
- CHRRAMSize=8192;\r
- VROM=(uint8 *)malloc(CHRRAMSize);\r
- UNIFchrrama=VROM;\r
- SetupCartCHRMapping(0,VROM,CHRRAMSize,1);\r
- AddExState(VROM,CHRRAMSize, 0, "CHRR");\r
- }\r
- if(head.ROM_type&8)\r
- AddExState(ExtraNTARAM, 2048, 0, "EXNR");\r
- tmp->init(&iNESCart);\r
- return(1);\r
- }\r
- tmp++;\r
- }\r
- return(0);\r
+ BMAPPINGLocal *tmp=bmap;\r
+\r
+ CHRRAMSize = -1;\r
+\r
+ if(GameInfo->type == GIT_VSUNI)\r
+ AddExState(FCEUVSUNI_STATEINFO, ~0, 0, 0);\r
+\r
+ while(tmp->init)\r
+ {\r
+ if(num==tmp->number)\r
+ {\r
+ UNIFchrrama=0; // need here for compatibility with UNIF mapper code\r
+ if(!VROM_size)\r
+ {\r
+ if(num==13)\r
+ {\r
+ CHRRAMSize=16384;\r
+ }\r
+ else\r
+ {\r
+ CHRRAMSize=8192;\r
+ }\r
+ if((VROM = (uint8 *)FCEU_malloc(CHRRAMSize)) == NULL) return 0;\r
+ FCEU_MemoryRand(VROM,CHRRAMSize);\r
+\r
+ UNIFchrrama=VROM;\r
+ SetupCartCHRMapping(0,VROM,CHRRAMSize,1);\r
+ AddExState(VROM,CHRRAMSize, 0, "CHRR");\r
+ }\r
+ if(head.ROM_type&8)\r
+ AddExState(ExtraNTARAM, 2048, 0, "EXNR");\r
+ tmp->init(&iNESCart);\r
+ return 1;\r
+ }\r
+ tmp++;\r
+ }\r
+ return 0;\r
}\r
+\r
+// vim:ts=4\r