merge x6502 code FCEUX
[fceu.git] / ines.c
diff --git a/ines.c b/ines.c
index ad1e926..a3a23f6 100644 (file)
--- a/ines.c
+++ b/ines.c
@@ -1,23 +1,23 @@
 /* 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
@@ -60,7 +62,9 @@ uint8 iNESIRQa=0;
 \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
@@ -69,59 +73,72 @@ void (*MapperReset)(void);
 \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, 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
-               {\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
-  case GI_INFOSTRING:\r
+       case GI_INFOSTRING:\r
                {\r
                 int MapperNo;\r
                 MapperNo = (head.ROM_type>>4);\r
@@ -130,7 +147,7 @@ static void iNESGI(int h, void *param)
                        MapperNo, (head.ROM_type&2)?", BB":"", (head.ROM_type&4)?", T":"");\r
                }\r
                break;\r
- }\r
      }\r
 }\r
 \r
 uint32 iNESGameCRC32=0;\r
@@ -147,102 +164,99 @@ struct INPSEL {
        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
@@ -258,24 +272,24 @@ struct BADINF {
 \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
@@ -284,175 +298,233 @@ struct CHINF {
        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
+               0xd63dcc68c2b20adcLL,    /* Final Fantasy J */\r
+               0x012df596e2b31174LL,    /* Final Fantasy 1+2 */\r
+               0xf6b359a720549ecdLL,    /* Final Fantasy 2 */\r
+               0x5a30da1d9b4af35dLL,    /* Final Fantasy 3 */\r
 \r
-   0x2ee3417ba8b69706LL,  /* Hydlide 3*/\r
+               0x2ee3417ba8b69706LL,  /* Hydlide 3*/\r
 \r
-   0xebbce5a54cf3ecc0LL,  /* Justbreed */\r
+               0xebbce5a54cf3ecc0LL,  /* Justbreed */\r
 \r
-   0x6a858da551ba239eLL,  /* Kaijuu Monogatari */\r
-   0xa40666740b7d22feLL,  /* Mindseeker */\r
+               0x6a858da551ba239eLL,  /* Kaijuu Monogatari */\r
+               0xa40666740b7d22feLL,  /* Mindseeker */\r
 \r
-         0x77b811b2760104b9LL,    /* Mouryou Senki Madara */\r
+               0x77b811b2760104b9LL,    /* Mouryou Senki Madara */\r
 \r
-   0x11b69122efe86e8cLL,  /* RPG Jinsei Game */\r
+               0x11b69122efe86e8cLL,  /* RPG Jinsei Game */\r
 \r
-   0xa70b495314f4d075LL,  /* Ys 3 */\r
+               0xa70b495314f4d075LL,  /* Ys 3 */\r
 \r
 \r
-   0xc04361e499748382LL,  /* AD&D Heroes of the Lance */\r
-   0xb72ee2337ced5792LL,  /* AD&D Hillsfar */\r
-   0x2b7103b7a27bd72fLL,  /* AD&D Pool of Radiance */\r
+               0xc04361e499748382LL,  /* AD&D Heroes of the Lance */\r
+               0xb72ee2337ced5792LL,  /* AD&D Hillsfar */\r
+               0x2b7103b7a27bd72fLL,  /* AD&D Pool of Radiance */\r
 \r
-        0x854d7947a3177f57LL,    /* Crystalis */\r
+               0x854d7947a3177f57LL,    /* Crystalis */\r
 \r
-   0xb0bcc02c843c1b79LL,  /* DW */\r
-   0x4a1f5336b86851b6LL,  /* DW */\r
+               0xb0bcc02c843c1b79LL,  /* DW */\r
+               0x4a1f5336b86851b6LL,  /* DW */\r
 \r
-   0x2dcf3a98c7937c22LL,  /* DW 2 */\r
-   0x733026b6b72f2470LL,  /* Dw 3 */\r
-   0x98e55e09dfcc7533LL,  /* DW 4*/\r
-   0x8da46db592a1fcf4LL,  /* Faria */\r
-   0x91a6846d3202e3d6LL,  /* Final Fantasy */\r
-   0xedba17a2c4608d20LL,  /* ""    */\r
+               0x2dcf3a98c7937c22LL,  /* DW 2 */\r
+               0x733026b6b72f2470LL,  /* Dw 3 */\r
+               0x98e55e09dfcc7533LL,  /* DW 4*/\r
+               0x8da46db592a1fcf4LL,  /* Faria */\r
+               0x91a6846d3202e3d6LL,  /* Final Fantasy */\r
+               0xedba17a2c4608d20LL,  /* ""    */\r
 \r
-         0x94b9484862a26cbaLL,    /* Legend of Zelda */\r
-         0x04a31647de80fdabLL,    /*      ""      */\r
+               0x94b9484862a26cbaLL,    /* Legend of Zelda */\r
+               0x04a31647de80fdabLL,    /*      ""      */\r
 \r
-         0x9aa1dc16c05e7de5LL,    /* Startropics */\r
-         0x1b084107d0878bd0LL,    /* Startropics 2*/\r
+               0x9aa1dc16c05e7de5LL,    /* Startropics */\r
+               0x1b084107d0878bd0LL,    /* Startropics 2*/\r
 \r
-         0x836c0ff4f3e06e45LL,    /* Zelda 2 */\r
+               0x836c0ff4f3e06e45LL,    /* Zelda 2 */\r
 \r
-   0      /* Abandon all hope if the game has 0 in the lower 64-bits of its MD5 hash */\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
        };\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
@@ -460,282 +532,674 @@ typedef struct {
        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
-        struct md5_context md5;\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
+       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%08x\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
-void FASTAPASS(2) VRAM_BANK4(uint32 A, uint32 V)\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&=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&=7;\r
+       PPUCHRRAM|=(1<<(A>>10));\r
+       CHRBankList[(A)>>10]=V;\r
+       VPage[(A)>>10]=&CHRRAM[V<<10]-(A);\r
 }\r
-void FASTAPASS(2) VROM_BANK1(uint32 A,uint32 V)\r
+\r
+void VRAM_BANK4(uint32 A, uint32 V)\r
 {\r
- setchr1(A,V);\r
- CHRBankList[(A)>>10]=V;\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 VROM_BANK1(uint32 A,uint32 V)\r
+{\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
@@ -745,377 +1209,419 @@ void FASTAPASS(1) MIRROR_SET(uint8 V)
 \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, //Mapper2_init,Mapper3_init,\r
-    0,0,\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
-    Mapper8_init,Mapper9_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
-    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
     Mapper46_init,\r
     0,\r
     Mapper48_init,\r
     0,\r
-    Mapper50_init,Mapper51_init,\r
-    0,0,0,0,0,\r
-    0,//    Mapper57_init,\r
-    0,//    Mapper58_init,\r
-    Mapper59_init,Mapper60_init,\r
-    Mapper61_init,Mapper62_init,\r
+    Mapper50_init,\r
+    Mapper51_init,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
     0,\r
-    Mapper64_init,Mapper65_init,\r
-    0,//Mapper66_init,\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
-    Mapper68_init,Mapper69_init,\r
-    0,//Mapper70_init,\r
+    0, //Mapper68_init,\r
+    Mapper69_init,\r
+    0, //Mapper70_init,\r
     Mapper71_init,\r
-    Mapper72_init,Mapper73_init,\r
+    Mapper72_init,\r
+    Mapper73_init,\r
     0,\r
-    Mapper75_init,Mapper76_init,Mapper77_init,\r
+    Mapper75_init,\r
+    Mapper76_init,\r
+    Mapper77_init,\r
     0, //Mapper78_init,\r
-    Mapper79_init,Mapper80_init,\r
+    Mapper79_init,\r
+    Mapper80_init,\r
     0,\r
-    Mapper82_init,Mapper83_init,\r
+    0, //Mapper82_init,\r
+    0, //Mapper83_init,\r
     0,\r
-    Mapper85_init,Mapper86_init,\r
+    Mapper85_init,\r
+    0, //Mapper86_init,\r
     0, //Mapper87_init,\r
     0, //Mapper88_init,\r
-    Mapper89_init,\r
+    0, //Mapper89_init,\r
     0,\r
-    Mapper91_init,Mapper92_init,\r
+    0, //Mapper91_init,\r
+    0, //Mapper92_init,\r
     0, //Mapper93_init,\r
     0, //Mapper94_init,\r
     0,\r
-    Mapper96_init,Mapper97_init,\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
-    Mapper99_init,\r
-    0,0,0,0,0,0,0,\r
     0, //Mapper107_init,\r
-    0,0,0,0,\r
-    0,Mapper113_init,\r
-    0,0,0,\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,0,0,0,0,0,0,0,0,0,0,0,0,0,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
+    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,0,0,\r
+    0,\r
+    0,\r
+    0,\r
     0, //Mapper144_init,\r
-    0,0,0,0,0,0,\r
-    Mapper151_init,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0, //Mapper151_init,\r
     0, //Mapper152_init,\r
-    Mapper153_init,\r
+    0, //Mapper153_init,\r
     0, //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,\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,0,0,\r
+    0,\r
+    0,\r
+    0,\r
     0, //Mapper189_init,\r
     0,\r
     0, //Mapper191_init,\r
     0,\r
-    Mapper193_init,\r
-    0,0,0,0,0,0,\r
-    Mapper200_init,Mapper201_init,Mapper202_init,Mapper203_init,\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
+    0,\r
+    0,\r
+    0,\r
     0, //Mapper211_init,\r
-    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
+    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,0,0,0,\r
-    Mapper240_init,Mapper241_init,Mapper242_init,0,\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
-\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
+       MapStateRestore=0;\r
 \r
-        setprg8r(1,0x6000,0);\r
+       setprg8r(1,0x6000,0);\r
 \r
-        SetReadHandler(0x6000,0x7FFF,AWRAM);\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
+       // 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
-    #ifdef DEBUG_MAPPER\r
-    if(type==0) SetWriteHandler(0x4020,0xFFFF,WriteHandler);\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
+static int NewiNES_Init(int num)\r
+{\r
+       BMAPPINGLocal *tmp=bmap;\r
 \r
-typedef struct {\r
-           int number;\r
-           void (*init)(CartInfo *);\r
-} BMAPPING;\r
-\r
-static BMAPPING bmap[] = {\r
-    {0,   NROM_Init},\r
-    {1,   Mapper1_Init},\r
-    {2,   UNROM_Init},\r
-    {3,   CNROM_Init},\r
-    {4,   Mapper4_Init},\r
-    {5,   Mapper5_Init},\r
-    {7,   ANROM_Init},\r
-    {11,  Mapper11_Init},\r
-    {12,  Mapper12_Init},\r
-    {13,  CPROM_Init},\r
-    {19,  Mapper19_Init},\r
-    {37,  Mapper37_Init},\r
-    {44,  Mapper44_Init},\r
-    {45,  Mapper45_Init},\r
-    {47,  Mapper47_Init},\r
-    {49,  Mapper49_Init},\r
-    {52,  Mapper52_Init},\r
-    {57,  Mapper57_Init},\r
-    {58,  Mapper58_Init},\r
-    {66,  MHROM_Init},\r
-    {70,  Mapper70_Init},\r
-    {74,  Mapper74_Init},\r
-    {78,  Mapper78_Init},\r
-    {87,  Mapper87_Init},\r
-    {88,  Mapper88_Init},\r
-    {90,  Mapper90_Init},\r
-    {93,  SUNSOFT_UNROM_Init},\r
-    {94,  Mapper94_Init},\r
-    {95,  Mapper95_Init},\r
-    {105, Mapper105_Init},\r
-    {107, Mapper107_Init},\r
-    {112, Mapper112_Init},\r
-    {114, Mapper114_Init},\r
-    {115, Mapper115_Init},\r
-    {116, Mapper116_Init},\r
-    {117, Mapper117_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
-    {140, Mapper140_Init},\r
-    {141, S8259A_Init},\r
-    {143, TCA01_Init},\r
-    {144, Mapper144_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
-    {152, Mapper152_Init},\r
-    {154, Mapper154_Init},\r
-    {155, Mapper155_Init},\r
-    {160, Mapper90_Init},\r
-    {163, Mapper163_Init},\r
-    {164, Mapper164_Init},\r
-    {165, Mapper165_Init},\r
-    {181, Mapper181_Init},\r
-    {182, Mapper182_Init},\r
-    {183, Mapper183_Init},\r
-    {185, Mapper185_Init},\r
-    {186, Mapper186_Init},\r
-    {187, Mapper187_Init},\r
-    {188, Mapper188_Init},\r
-    {189, Mapper189_Init},\r
-    {191, Mapper191_Init},\r
-    {192, Mapper192_Init},\r
-    {194, Mapper194_Init},\r
-    {198, Mapper198_Init},\r
-    {199, Mapper199_Init},\r
-    {205, Mapper205_Init},\r
-    {206, DEIROM_Init},\r
-    {208, Mapper208_Init},\r
-    {209, Mapper209_Init},\r
-    {210, Mapper210_Init},\r
-    {211, Mapper211_Init},\r
-    {215, Mapper215_Init},\r
-    {216, Mapper216_Init},\r
-    {217, Mapper217_Init},\r
-    {218, UNLSonic_Init},\r
-    {219, UNLSL1632_Init},\r
-//    {220, Mapper220_Init},\r
-    {222, Mapper222_Init},\r
-    {235, Mapper235_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
+       CHRRAMSize = -1;\r
 \r
+       if(GameInfo->type == GIT_VSUNI)\r
+               AddExState(FCEUVSUNI_STATEINFO, ~0, 0, 0);\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
+       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