merge mapper code from FCEUX
[fceu.git] / unif.c
diff --git a/unif.c b/unif.c
index 03430f5..6354131 100644 (file)
--- a/unif.c
+++ b/unif.c
@@ -1,22 +1,22 @@
 /* FCE Ultra - NES/Famicom Emulator\r
- *\r
- * Copyright notice for this file:\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) 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
 /* TODO:  Battery backup file saving, mirror force    */\r
 /* **INCOMPLETE**             */\r
 #include <string.h>\r
 \r
 \r
-#include  "types.h"\r
-#include  "fce.h"\r
-#include  "cart.h"\r
-#include  "unif.h"\r
-#include  "ines.h"\r
-#include  "general.h"\r
-#include  "state.h"\r
-#include  "endian.h"\r
-#include  "file.h"\r
-#include  "memory.h"\r
-#include  "input.h"\r
-#include  "md5.h"\r
-\r
-#include  "svga.h"\r
+#include "types.h"\r
+#include "fce.h"\r
+#include "cart.h"\r
+#include "unif.h"\r
+#include "ines.h"\r
+#include "endian.h"\r
+#include "memory.h"\r
+#include "md5.h"\r
+#include "state.h"\r
+#include "file.h"\r
+#include "input.h"\r
+#include "driver.h"\r
+#include "svga.h"\r
 \r
 typedef struct {\r
-           char ID[4];\r
-           uint32 info;\r
+       char ID[4];\r
+       uint32 info;\r
 } UNIF_HEADER;\r
 \r
 typedef struct {\r
-           char *name;\r
-           void (*init)(CartInfo *);\r
-          int flags;\r
+       char *name;\r
+       void (*init)(CartInfo *);\r
+       int flags;\r
 } BMAPPING;\r
 \r
 typedef struct {\r
-           char *name;\r
-           int (*init)(int fp);\r
+       char *name;\r
+       int (*init)(int fp);\r
 } BFMAPPING;\r
 \r
 static CartInfo UNIFCart;\r
 \r
 static int vramo;\r
 static int mirrortodo;\r
-static char *boardname;\r
-static char *sboardname;\r
+static uint8 *boardname;\r
+static uint8 *sboardname;\r
 \r
 static uint32 CHRRAMSize;\r
 uint8 *UNIFchrrama=0;\r
@@ -77,502 +76,544 @@ static uint32 mallocedsizes[32];
 \r
 static int FixRomSize(uint32 size, uint32 minimum)\r
 {\r
-  int x=1;\r
+       uint32 x=1; //mbg merge 7/17/06 made uint\r
 \r
-  if(size<minimum)\r
-   return minimum;\r
-  while(x<size)\r
-   x<<=1;\r
-  return x;\r
+       if(size<minimum)\r
+               return minimum;\r
+       while(x<size)\r
+               x<<=1;\r
+       return x;\r
 }\r
 \r
 static void FreeUNIF(void)\r
 {\r
- int x;\r
- if(UNIFchrrama)\r
-  {free(UNIFchrrama);UNIFchrrama=0;}\r
- if(boardname)\r
-  {free(boardname);boardname=0;}\r
- for(x=0;x<32;x++)\r
- {\r
-  if(malloced[x])\r
-   {free(malloced[x]);malloced[x]=0;}\r
- }\r
      int x;\r
      if(UNIFchrrama)\r
+       {free(UNIFchrrama);UNIFchrrama=0;}\r
      if(boardname)\r
+       {free(boardname);boardname=0;}\r
      for(x=0;x<32;x++)\r
      {\r
+               if(malloced[x])\r
+               {free(malloced[x]);malloced[x]=0;}\r
      }\r
 }\r
 \r
 static void ResetUNIF(void)\r
 {\r
- int x;\r
- for(x=0;x<32;x++)\r
-  malloced[x]=0;\r
- vramo=0;\r
- boardname=0;\r
- mirrortodo=0;\r
- memset(&UNIFCart,0,sizeof(UNIFCart));\r
- UNIFchrrama=0;\r
      int x;\r
      for(x=0;x<32;x++)\r
+               malloced[x]=0;\r
      vramo=0;\r
      boardname=0;\r
      mirrortodo=0;\r
      memset(&UNIFCart,0,sizeof(UNIFCart));\r
      UNIFchrrama=0;\r
 }\r
 \r
 static uint8 exntar[2048];\r
 \r
 static void MooMirroring(void)\r
 {\r
- if(mirrortodo<0x4)\r
-  SetupCartMirroring(mirrortodo,1,0);\r
- else if(mirrortodo==0x4)\r
- {\r
-  SetupCartMirroring(4,1,exntar);\r
-  AddExState(exntar, 2048, 0,"EXNR");\r
- }\r
- else\r
-  SetupCartMirroring(0,0,0);\r
      if(mirrortodo<0x4)\r
+               SetupCartMirroring(mirrortodo,1,0);\r
      else if(mirrortodo==0x4)\r
      {\r
+               SetupCartMirroring(4,1,exntar);\r
+               AddExState(exntar, 2048, 0,"EXNR");\r
      }\r
      else\r
+               SetupCartMirroring(0,0,0);\r
 }\r
 \r
 static int DoMirroring(int fp)\r
 {\r
- uint8 t;\r
- t=FCEU_fgetc(fp);\r
- mirrortodo=t;\r
-\r
- {\r
-  static char *stuffo[6]={"Horizontal","Vertical","$2000","$2400","\"Four-screen\"","Controlled by Mapper Hardware"};\r
-  if(t<6)\r
-   FCEU_printf(" Name/Attribute Table Mirroring: %s\n",stuffo[t]);\r
- }\r
- return(1);\r
      uint8 t;\r
      t=FCEU_fgetc(fp);\r
      mirrortodo=t;\r
+\r
      {\r
+               static char *stuffo[6]={"Horizontal","Vertical","$2000","$2400","\"Four-screen\"","Controlled by Mapper Hardware"};\r
+               if(t<6)\r
+                       FCEU_printf(" Name/Attribute Table Mirroring: %s\n",stuffo[t]);\r
      }\r
      return(1);\r
 }\r
 \r
 static int NAME(int fp)\r
 {\r
- char namebuf[100];\r
- int index;\r
- int t;\r
-\r
- FCEU_printf(" Name: ");\r
- index=0;\r
-\r
- while((t=FCEU_fgetc(fp))>0)\r
-  if(index<99)\r
-   namebuf[index++]=t;\r
-\r
- namebuf[index]=0;\r
- FCEU_printf("%s\n",namebuf);\r
-\r
if(!FCEUGameInfo.name)\r
- {\r
-  FCEUGameInfo.name=malloc(strlen(namebuf)+1);\r
-  strcpy((char *)FCEUGameInfo.name,namebuf);\r
- }\r
- return(1);\r
      char namebuf[100];\r
      int index;\r
      int t;\r
+\r
      FCEU_printf(" Name: ");\r
      index=0;\r
+\r
      while((t=FCEU_fgetc(fp))>0)\r
+               if(index<99)\r
+                       namebuf[index++]=t;\r
+\r
      namebuf[index]=0;\r
      FCEU_printf("%s\n",namebuf);\r
+\r
      if(!GameInfo->name)\r
      {\r
+               GameInfo->name=(uint8*)malloc(strlen(namebuf)+1); //mbg merge 7/17/06 added cast\r
+               strcpy((char*)GameInfo->name,namebuf); //mbg merge 7/17/06 added cast\r
      }\r
      return(1);\r
 }\r
 static int DINF(int fp)\r
 {\r
- char name[100], method[100];\r
- uint8 d, m;\r
- uint16 y;\r
- int t;\r
-\r
- if(FCEU_fread(name,1,100,fp)!=100)\r
-  return(0);\r
- if((t=FCEU_fgetc(fp))==EOF) return(0);\r
- d=t;\r
- if((t=FCEU_fgetc(fp))==EOF) return(0);\r
- m=t;\r
- if((t=FCEU_fgetc(fp))==EOF) return(0);\r
- y=t;\r
- if((t=FCEU_fgetc(fp))==EOF) return(0);\r
- y|=t<<8;\r
- if(FCEU_fread(method,1,100,fp)!=100)\r
-  return(0);\r
- name[99]=method[99]=0;\r
- FCEU_printf(" Dumped by: %s\n",name);\r
- FCEU_printf(" Dumped with: %s\n",method);\r
- {\r
-  char *months[12]={"January","February","March","April","May","June","July",\r
-                   "August","September","October","November","December"};\r
-  FCEU_printf(" Dumped on: %s %d, %d\n",months[(m-1)%12],d,y);\r
- }\r
- return(1);\r
      char name[100], method[100];\r
      uint8 d, m;\r
      uint16 y;\r
      int t;\r
+\r
      if(FCEU_fread(name,1,100,fp)!=100)\r
+               return(0);\r
      if((t=FCEU_fgetc(fp))==EOF) return(0);\r
      d=t;\r
      if((t=FCEU_fgetc(fp))==EOF) return(0);\r
      m=t;\r
      if((t=FCEU_fgetc(fp))==EOF) return(0);\r
      y=t;\r
      if((t=FCEU_fgetc(fp))==EOF) return(0);\r
      y|=t<<8;\r
      if(FCEU_fread(method,1,100,fp)!=100)\r
+               return(0);\r
      name[99]=method[99]=0;\r
      FCEU_printf(" Dumped by: %s\n",name);\r
      FCEU_printf(" Dumped with: %s\n",method);\r
      {\r
+               char *months[12]={"January","February","March","April","May","June","July",\r
+                       "August","September","October","November","December"};\r
+               FCEU_printf(" Dumped on: %s %d, %d\n",months[(m-1)%12],d,y);\r
      }\r
      return(1);\r
 }\r
 \r
 static int CTRL(int fp)\r
 {\r
- int t;\r
      int t;\r
 \r
- if((t=FCEU_fgetc(fp))==EOF)\r
-  return(0);\r
- /* The information stored in this byte isn't very helpful, but it's\r
-    better than nothing...maybe.\r
- */\r
      if((t=FCEU_fgetc(fp))==EOF)\r
+               return(0);\r
      /* The information stored in this byte isn't very helpful, but it's\r
+       better than nothing...maybe.\r
      */\r
 \r
if(t&1) FCEUGameInfo.input[0]=FCEUGameInfo.input[1]=SI_GAMEPAD;\r
else FCEUGameInfo.input[0]=FCEUGameInfo.input[1]=SI_NONE;\r
      if(t&1) GameInfo->input[0]=GameInfo->input[1]=SI_GAMEPAD;\r
      else GameInfo->input[0]=GameInfo->input[1]=SI_NONE;\r
 \r
if(t&2) FCEUGameInfo.input[1]=SI_ZAPPER;\r
//else if(t&0x10) FCEUGameInfo->input[1]=SI_POWERPAD;\r
      if(t&2) GameInfo->input[1]=SI_ZAPPER;\r
      //else if(t&0x10) GameInfo->input[1]=SI_POWERPAD;\r
 \r
- return(1);\r
      return(1);\r
 }\r
 \r
 static int TVCI(int fp)\r
 {\r
- int t;\r
- if( (t=FCEU_fgetc(fp)) ==EOF)\r
-  return(0);\r
- if(t<=2)\r
- {\r
-  char *stuffo[3]={"NTSC","PAL","NTSC and PAL"};\r
-  if(t==0)\r
-  {\r
-   FCEUGameInfo.vidsys=GIV_NTSC;\r
-   FCEUI_SetVidSystem(0);\r
-  }\r
-  else if(t==1)\r
-  {\r
-   FCEUGameInfo.vidsys=GIV_PAL;\r
-   FCEUI_SetVidSystem(1);\r
-  }\r
-  FCEU_printf(" TV Standard Compatibility: %s\n",stuffo[t]);\r
- }\r
- return(1);\r
      int t;\r
      if( (t=FCEU_fgetc(fp)) ==EOF)\r
+               return(0);\r
      if(t<=2)\r
      {\r
+               char *stuffo[3]={"NTSC","PAL","NTSC and PAL"};\r
+               if(t==0)\r
+               {\r
+                       GameInfo->vidsys=GIV_NTSC;\r
+                       FCEUI_SetVidSystem(0);\r
+               }\r
+               else if(t==1)\r
+               {\r
+                       GameInfo->vidsys=GIV_PAL;\r
+                       FCEUI_SetVidSystem(1);\r
+               }\r
+               FCEU_printf(" TV Standard Compatibility: %s\n",stuffo[t]);\r
      }\r
      return(1);\r
 }\r
 \r
 static int EnableBattery(int fp)\r
 {\r
- FCEU_printf(" Battery-backed.\n");\r
- if(FCEU_fgetc(fp)==EOF)\r
-  return(0);\r
- UNIFCart.battery=1;\r
- return(1);\r
      FCEU_printf(" Battery-backed.\n");\r
      if(FCEU_fgetc(fp)==EOF)\r
+               return(0);\r
      UNIFCart.battery=1;\r
      return(1);\r
 }\r
 \r
 static int LoadPRG(int fp)\r
 {\r
- int z,t;\r
- z=uchead.ID[3]-'0';\r
-\r
- if(z<0 || z>15)\r
-  return(0);\r
- FCEU_printf(" PRG ROM %d size: %d",z,(int) uchead.info);\r
- if(malloced[z])\r
-  free(malloced[z]);\r
- t=FixRomSize(uchead.info,2048);\r
- if(!(malloced[z]=(uint8 *)FCEU_malloc(t)))\r
-  return(0);\r
- mallocedsizes[z]=t;\r
- memset(malloced[z]+uchead.info,0xFF,t-uchead.info);\r
- if(FCEU_fread(malloced[z],1,uchead.info,fp)!=uchead.info)\r
- {\r
-  FCEU_printf("Read Error!\n");\r
-  return(0);\r
- }\r
- else\r
-  FCEU_printf("\n");\r
-\r
- SetupCartPRGMapping(z,malloced[z],t,0);\r
- return(1);\r
      int z,t;\r
      z=uchead.ID[3]-'0';\r
+\r
      if(z<0 || z>15)\r
+               return(0);\r
      FCEU_printf(" PRG ROM %d size: %d",z,(int) uchead.info);\r
      if(malloced[z])\r
+               free(malloced[z]);\r
      t=FixRomSize(uchead.info,2048);\r
      if(!(malloced[z]=(uint8 *)FCEU_malloc(t)))\r
+               return(0);\r
      mallocedsizes[z]=t;\r
      memset(malloced[z]+uchead.info,0xFF,t-uchead.info);\r
      if(FCEU_fread(malloced[z],1,uchead.info,fp)!=uchead.info)\r
      {\r
+               FCEU_printf("Read Error!\n");\r
+               return(0);\r
      }\r
      else\r
+               FCEU_printf("\n");\r
+\r
      SetupCartPRGMapping(z,malloced[z],t,0);\r
      return(1);\r
 }\r
 \r
 static int SetBoardName(int fp)\r
 {\r
if(!(boardname=FCEU_malloc(uchead.info+1)))\r
-  return(0);\r
- FCEU_fread(boardname,1,uchead.info,fp);\r
- boardname[uchead.info]=0;\r
- FCEU_printf(" Board name: %s\n",boardname);\r
- sboardname=boardname;\r
- if(!memcmp(boardname,"NES-",4) || !memcmp(boardname,"UNL-",4) || !memcmp(boardname,"HVC-",4) || !memcmp(boardname,"BTL-",4) || !memcmp(boardname,"BMC-",4))\r
-  sboardname+=4;\r
- return(1);\r
      if(!(boardname=(uint8 *)FCEU_malloc(uchead.info+1)))\r
+               return(0);\r
      FCEU_fread(boardname,1,uchead.info,fp);\r
      boardname[uchead.info]=0;\r
      FCEU_printf(" Board name: %s\n",boardname);\r
      sboardname=boardname;\r
      if(!memcmp(boardname,"NES-",4) || !memcmp(boardname,"UNL-",4) || !memcmp(boardname,"HVC-",4) || !memcmp(boardname,"BTL-",4) || !memcmp(boardname,"BMC-",4))\r
+               sboardname+=4;\r
      return(1);\r
 }\r
 \r
 static int LoadCHR(int fp)\r
 {\r
- int z,t;\r
- z=uchead.ID[3]-'0';\r
- if(z<0 || z>15)\r
-  return(0);\r
- FCEU_printf(" CHR ROM %d size: %d",z,(int) uchead.info);\r
- if(malloced[16+z])\r
-  free(malloced[16+z]);\r
- t=FixRomSize(uchead.info,8192);\r
- if(!(malloced[16+z]=(uint8 *)FCEU_malloc(t)))\r
-  return(0);\r
- mallocedsizes[16+z]=t;\r
- memset(malloced[16+z]+uchead.info,0xFF,t-uchead.info);\r
- if(FCEU_fread(malloced[16+z],1,uchead.info,fp)!=uchead.info)\r
- {\r
-  FCEU_printf("Read Error!\n");\r
-  return(0);\r
- }\r
- else\r
-  FCEU_printf("\n");\r
-\r
- SetupCartCHRMapping(z,malloced[16+z],t,0);\r
- return(1);\r
      int z,t;\r
      z=uchead.ID[3]-'0';\r
      if(z<0 || z>15)\r
+               return(0);\r
      FCEU_printf(" CHR ROM %d size: %d",z,(int) uchead.info);\r
      if(malloced[16+z])\r
+               free(malloced[16+z]);\r
      t=FixRomSize(uchead.info,8192);\r
      if(!(malloced[16+z]=(uint8 *)FCEU_malloc(t)))\r
+               return(0);\r
      mallocedsizes[16+z]=t;\r
      memset(malloced[16+z]+uchead.info,0xFF,t-uchead.info);\r
      if(FCEU_fread(malloced[16+z],1,uchead.info,fp)!=uchead.info)\r
      {\r
+               FCEU_printf("Read Error!\n");\r
+               return(0);\r
      }\r
      else\r
+               FCEU_printf("\n");\r
+\r
      SetupCartCHRMapping(z,malloced[16+z],t,0);\r
      return(1);\r
 }\r
 \r
 \r
 #define BMCFLAG_FORCE4 1\r
 #define BMCFLAG_16KCHRR  2\r
 #define BMCFLAG_32KCHRR  4\r
+#define BMCFLAG_EXPCHRR 8\r
 \r
 static BMAPPING bmap[] = {\r
 \r
-/* Sachen Carts */\r
- { "TC-U01-1.5M", TCU01_Init,0},\r
- { "Sachen-8259A", S8259A_Init,0},\r
- { "Sachen-8259B", S8259B_Init,0},\r
- { "Sachen-8259C", S8259C_Init,0},\r
- { "Sachen-8259D", S8259D_Init,0},\r
- { "Sachen-74LS374N", S74LS374N_Init,0},\r
- { "Sachen-74LS374NA", S74LS374NA_Init,0}, //seems to be custom mapper\r
- { "SA-016-1M", SA0161M_Init,0},\r
- { "SA-72007", SA72007_Init,0},\r
- { "SA-72008", SA72008_Init,0},\r
- { "SA-0036", SA0036_Init,0},\r
- { "SA-0037", SA0037_Init,0},\r
- { "SA-NROM", TCA01_Init,0},\r
-\r
-// /* AVE carts. */\r
-// { "MB-91", MB91_Init,0},  // DeathBots\r
-// { "NINA-06", NINA06_Init,0},  // F-15 City War\r
-// { "NINA-03", NINA03_Init,0},  // Tiles of Fate\r
-// { "NINA-001", NINA001_Init,0}, // Impossible Mission 2\r
-\r
- { "ANROM", ANROM_Init,0},\r
-\r
- { "HKROM", HKROM_Init,0},\r
-\r
- { "EWROM", EWROM_Init,0},\r
- { "EKROM", EKROM_Init,0},\r
- { "ELROM", ELROM_Init,0},\r
- { "ETROM", ETROM_Init,0},\r
-\r
- { "SAROM", SAROM_Init,0},\r
- { "SBROM", SBROM_Init,0},\r
- { "SCROM", SCROM_Init,0},\r
- { "SEROM", SEROM_Init,0},\r
- { "SGROM", SGROM_Init,0},\r
- { "SKROM", SKROM_Init,0},\r
- { "SLROM", SLROM_Init,0},\r
- { "SL1ROM", SL1ROM_Init,0},\r
- { "SNROM", SNROM_Init,0},\r
- { "SOROM", SOROM_Init,0},\r
-\r
- { "TGROM", TGROM_Init,0},\r
- { "TR1ROM", TFROM_Init,BMCFLAG_FORCE4},\r
-\r
- { "TEROM", TEROM_Init,0},\r
- { "TFROM", TFROM_Init,0},\r
- { "TLROM", TLROM_Init,0},\r
- { "TKROM", TKROM_Init,0},\r
- { "TSROM", TSROM_Init,0},\r
-\r
- { "TLSROM", TLSROM_Init,0},\r
- { "TKSROM", TKSROM_Init,0},\r
- { "TQROM", TQROM_Init,0},\r
- { "TVROM", TLROM_Init,BMCFLAG_FORCE4},\r
-\r
- { "CPROM", CPROM_Init,BMCFLAG_16KCHRR},\r
- { "CNROM", CNROM_Init,0},\r
- { "NROM", NROM_Init,0 }, //NROM256_Init,0 },\r
- { "NROM-128", NROM_Init,0 }, //NROM128_Init,0 },\r
- { "NROM-256", NROM_Init,0 }, //NROM256_Init,0 },\r
- { "RROM", NROM_Init,0 }, //NROM128_Init,0 },\r
- { "RROM-128", NROM_Init,0 }, //NROM128_Init,0 },\r
- { "MHROM", MHROM_Init,0},\r
- { "UNROM", UNROM_Init,0},\r
- { "SUNSOFT_UNROM", SUNSOFT_UNROM_Init,0},\r
- { "MARIO1-MALEE2", MALEE_Init,0},\r
-\r
- { "CC-21", UNLCC21_Init,0},\r
-\r
- { "H2288", UNLH2288_Init,0},\r
- { "KOF97", UNLKOF97_Init,0},\r
- { "SL1632", UNLSL1632_Init,0},\r
- { "SHERO", UNLSHeroes_Init,0},\r
- { "8237", UNL8237_Init,0},\r
- { "8157", UNL8157_Init,0},\r
- { "T-262", BMCT262_Init,0},\r
- { "FK23C", BMCFK23C_Init,0},\r
- { "Supervision16in1", Supervision16_Init,0},\r
- { "NovelDiamond9999999in1", Novel_Init,0},\r
- { "Super24in1SC03", Super24_Init,0},\r
- { "42in1ResetSwitch", BMC42in1r_Init, 0},\r
- { "64in1NoRepeat", BMC64in1nr_Init, 0},\r
- { "13in1JY110", BMC13in1JY110_Init, 0},\r
- { "70in1", BMC70in1_Init, 0},\r
- { "70in1B", BMC70in1B_Init, 0},\r
- { "GK-192", Mapper58_Init, 0},\r
- { "SuperHIK8in1", Mapper45_Init,0},\r
-\r
- { "DREAMTECH01", DreamTech01_Init,0},\r
- { "KONAMI-QTAI", Mapper190_Init,0},\r
-\r
- { "TEK90", Mapper90_Init,0},\r
-\r
- {0,0,0}\r
+       /* Sachen Carts */\r
+       { "TC-U01-1.5M", TCU01_Init,0},\r
+       { "Sachen-8259A", S8259A_Init,0},\r
+       { "Sachen-8259B", S8259B_Init,0},\r
+       { "Sachen-8259C", S8259C_Init,0},\r
+       { "Sachen-8259D", S8259D_Init,0},\r
+       { "Sachen-74LS374N", S74LS374N_Init,0},\r
+       { "Sachen-74LS374NA", S74LS374NA_Init,0}, //seems to be custom mapper\r
+       { "SA-002", TCU02_Init, 0},\r
+       { "SA-016-1M", SA0161M_Init,0},\r
+       { "SA-72007", SA72007_Init,0},\r
+       { "SA-72008", SA72008_Init,0},\r
+       { "SA-009", SA009_Init,0},\r
+       { "SA-0036", SA0036_Init,0},\r
+       { "SA-0037", SA0037_Init,0},\r
+       { "SA-NROM", TCA01_Init,0},\r
+\r
+       // /* AVE carts. */\r
+       // { "MB-91", MB91_Init,0},  // DeathBots\r
+       // { "NINA-06", NINA06_Init,0},  // F-15 City War\r
+       // { "NINA-03", NINA03_Init,0},  // Tiles of Fate\r
+       // { "NINA-001", NINA001_Init,0}, // Impossible Mission 2\r
+\r
+       { "ANROM", ANROM_Init,0},\r
+\r
+       { "HKROM", HKROM_Init,0},\r
+\r
+       { "EWROM", EWROM_Init,0},\r
+       { "EKROM", EKROM_Init,0},\r
+       { "ELROM", ELROM_Init,0},\r
+       { "ETROM", ETROM_Init,0},\r
+\r
+       { "SAROM", SAROM_Init,0},\r
+       { "SBROM", SBROM_Init,0},\r
+       { "SCROM", SCROM_Init,0},\r
+       { "SEROM", SEROM_Init,0},\r
+       { "SGROM", SGROM_Init,0},\r
+       { "SKROM", SKROM_Init,0},\r
+       { "SLROM", SLROM_Init,0},\r
+       { "SL1ROM", SL1ROM_Init,0},\r
+       { "SNROM", SNROM_Init,0},\r
+       { "SOROM", SOROM_Init,0},\r
+\r
+       { "TGROM", TGROM_Init,0},\r
+       { "TR1ROM", TFROM_Init,BMCFLAG_FORCE4},\r
+\r
+       { "TBROM", TBROM_Init,0},\r
+       { "TEROM", TEROM_Init,0},\r
+       { "TFROM", TFROM_Init,0},\r
+       { "TLROM", TLROM_Init,0},\r
+       { "TKROM", TKROM_Init,0},\r
+       { "TSROM", TSROM_Init,0},\r
+\r
+       { "TLSROM", TLSROM_Init,0},\r
+       { "TKSROM", TKSROM_Init,0},\r
+       { "TQROM", TQROM_Init,0},\r
+       { "TVROM", TLROM_Init,BMCFLAG_FORCE4},\r
+\r
+       { "NTBROM", Mapper68_Init,0},\r
+\r
+       { "CPROM", CPROM_Init,BMCFLAG_16KCHRR},\r
+       { "CNROM", CNROM_Init,0},\r
+       { "NROM", NROM_Init,0 }, //NROM256_Init,0 },\r
+       { "NROM-128", NROM_Init,0 }, //NROM128_Init,0 },\r
+       { "NROM-256", NROM_Init,0 }, //NROM256_Init,0 },\r
+       { "RROM", NROM_Init,0 }, //NROM128_Init,0 },\r
+       { "RROM-128", NROM_Init,0 }, //NROM128_Init,0 },\r
+       { "MHROM", MHROM_Init,0},\r
+       { "UNROM", UNROM_Init,0},\r
+       { "UOROM", UNROM_Init,0},\r
+       { "SUNSOFT_UNROM", SUNSOFT_UNROM_Init,0},\r
+       { "MARIO1-MALEE2", MALEE_Init,0},\r
+       { "3D-BLOCK", UNL3DBlock_Init, 0},\r
+       { "SMB2J", UNLSMB2J_Init, 0},\r
+       { "AX5705", UNLAX5705_Init, 0},\r
+       { "CC-21", UNLCC21_Init,0},\r
+       { "H2288", UNLH2288_Init,0},\r
+       { "KOF97", UNLKOF97_Init,0},\r
+       { "SL1632", UNLSL1632_Init,0},\r
+       { "SHERO", UNLSHeroes_Init,0},\r
+       { "8237", UNL8237_Init,0},\r
+       { "8237A", UNL8237A_Init,0},\r
+       { "8157", UNL8157_Init,0},\r
+       { "T-262", BMCT262_Init,0},\r
+       { "FK23C", BMCFK23C_Init,0},\r
+       { "A65AS", BMCA65AS_Init,0},\r
+       { "C-N22M", UNLCN22M_Init,0},\r
+       { "EDU2000", UNLEDU2000_Init,0},\r
+       { "603-5052", UNL6035052_Init,0},\r
+       { "N625092", UNLN625092_Init,0},\r
+       { "Supervision16in1", Supervision16_Init,0},\r
+       { "NovelDiamond9999999in1", Novel_Init,0},\r
+       { "Super24in1SC03", Super24_Init,0},\r
+       { "64in1NoRepeat", BMC64in1nr_Init, 0},\r
+       { "13in1JY110", BMC13in1JY110_Init, 0},\r
+       { "70in1", BMC70in1_Init, 0},\r
+       { "70in1B", BMC70in1B_Init, 0},\r
+       { "D1038", BMCD1038_Init, 0},\r
+       { "GK-192", BMCGK192_Init, 0},\r
+       { "SuperHIK8in1", Mapper45_Init,0},\r
+       { "22211", UNL22211_Init,0},\r
+       { "TF1201", UNLTF1201_Init, 0},\r
+       { "GS-2004", BMCGS2004_Init, 0},\r
+       { "GS-2013", BMCGS2013_Init, 0},\r
+       { "KS7032", UNLKS7032_Init, 0},\r
+       { "T-230", UNLT230_Init, 0},\r
+       { "190in1", BMC190in1_Init, 0},\r
+       { "Ghostbusters63in1", BMCGhostbusters63in1_Init, 0},\r
+       { "BS-5",BMCBS5_Init, 0},\r
+       { "411120-C",BMC411120C_Init, 0},\r
+       { "830118C",BMC830118C_Init, 0},\r
+       { "T-227-1",BMCT2271_Init,0},\r
+\r
+       { "DREAMTECH01", DreamTech01_Init,0},\r
+       { "KONAMI-QTAI", Mapper190_Init,0},\r
+\r
+       { "DANCE", UNLDANCE_Init,0},\r
+       { "OneBus", UNLOneBus_Init,0},\r
+       { "SC-127", UNLSC127_Init,0},\r
+\r
+       { "TEK90", Mapper90_Init,0},\r
+\r
+ { "FK23C", BMCFK23C_Init,BMCFLAG_EXPCHRR},\r
+ { "FK23CA", BMCFK23CA_Init,BMCFLAG_EXPCHRR},\r
+\r
+       {0,0,0}\r
 };\r
 \r
 static BFMAPPING bfunc[] = {\r
- { "CTRL", CTRL },\r
- { "TVCI", TVCI },\r
- { "BATR", EnableBattery },\r
- { "MIRR", DoMirroring },\r
- { "PRG",  LoadPRG },\r
- { "CHR",  LoadCHR },\r
- { "NAME", NAME  },\r
- { "MAPR", SetBoardName },\r
- { "DINF", DINF },\r
- { 0, 0 }\r
      { "CTRL", CTRL },\r
      { "TVCI", TVCI },\r
      { "BATR", EnableBattery },\r
      { "MIRR", DoMirroring },\r
      { "PRG",  LoadPRG },\r
      { "CHR",  LoadCHR },\r
      { "NAME", NAME  },\r
      { "MAPR", SetBoardName },\r
      { "DINF", DINF },\r
      { 0, 0 }\r
 };\r
 \r
 int LoadUNIFChunks(int fp)\r
 {\r
-   int x;\r
-   int t;\r
-   for(;;)\r
-   {\r
-    t=FCEU_fread(&uchead,1,4,fp);\r
-    if(t<4)\r
-    {\r
-     if(t>0)\r
-      return 0;\r
-     return 1;\r
-    }\r
-    if(!(FCEU_read32(&uchead.info,fp)))\r
-     return 0;\r
-    t=0;\r
-    x=0;\r
-       //printf("Funky: %s\n",((uint8 *)&uchead));\r
-    while(bfunc[x].name)\r
-    {\r
-     if(!memcmp(&uchead,bfunc[x].name,strlen(bfunc[x].name)))\r
-     {\r
-      if(!bfunc[x].init(fp))\r
-       return 0;\r
-      t=1;\r
-      break;\r
-     }\r
-     x++;\r
-    }\r
-    if(!t)\r
-     if(FCEU_fseek(fp,uchead.info,SEEK_CUR))\r
-      return(0);\r
-   }\r
+       int x;\r
+       int t;\r
+       for(;;)\r
+       {\r
+               t=FCEU_fread(&uchead,1,4,fp);\r
+               if(t<4)\r
+               {\r
+                       if(t>0)\r
+                               return 0;\r
+                       return 1;\r
+               }\r
+               if(!(FCEU_read32le(&uchead.info,fp)))\r
+                       return 0;\r
+               t=0;\r
+               x=0;\r
+               //printf("Funky: %s\n",((uint8 *)&uchead));\r
+               while(bfunc[x].name)\r
+               {\r
+                       if(!memcmp(&uchead,bfunc[x].name,strlen(bfunc[x].name)))\r
+                       {\r
+                               if(!bfunc[x].init(fp))\r
+                                       return 0;\r
+                               t=1;\r
+                               break;\r
+                       }\r
+                       x++;\r
+               }\r
+               if(!t)\r
+                       if(FCEU_fseek(fp,uchead.info,SEEK_CUR)<0)\r
+                               return(0);\r
+       }\r
 }\r
 \r
 static int InitializeBoard(void)\r
 {\r
-   int x=0;\r
+       int x=0;\r
 \r
-   if(!sboardname) return(0);\r
+       if(!sboardname) return(0);\r
 \r
-   while(bmap[x].name)\r
-   {\r
-    if(!strcmp(sboardname,(char *)bmap[x].name))\r
-    {\r
-     if(!malloced[16])\r
-     {\r
+       while(bmap[x].name)\r
+       {\r
+               if(!strcmp((char *)sboardname,(char *)bmap[x].name))\r
+               {\r
+                       if(!malloced[16])\r
+                       {\r
       if(bmap[x].flags & BMCFLAG_16KCHRR)\r
         CHRRAMSize = 16384;\r
+      else if(bmap[x].flags & BMCFLAG_32KCHRR)\r
+        CHRRAMSize = 32768;\r
+      else if(bmap[x].flags & BMCFLAG_EXPCHRR)\r
+        CHRRAMSize = 128 * 1024;\r
       else\r
-  CHRRAMSize = 8192;\r
-      if((UNIFchrrama=(uint8 *)FCEU_malloc(CHRRAMSize)))\r
-      {\r
-       SetupCartCHRMapping(0,UNIFchrrama,CHRRAMSize,1);\r
-       AddExState(UNIFchrrama, CHRRAMSize, 0,"CHRR");\r
-      }\r
-      else\r
-       return(-1);\r
-     }\r
-     if(bmap[x].flags&BMCFLAG_FORCE4)\r
-      mirrortodo=4;\r
-     MooMirroring();\r
-     bmap[x].init(&UNIFCart);\r
-     return(1);\r
-    }\r
-    x++;\r
-   }\r
-   FCEU_PrintError("Board type not supported.");\r
-   return(0);\r
+        CHRRAMSize = 8192;\r
+                               if((UNIFchrrama=(uint8 *)FCEU_malloc(CHRRAMSize)))\r
+                               {\r
+                                       SetupCartCHRMapping(0,UNIFchrrama,CHRRAMSize,1);\r
+                                       AddExState(UNIFchrrama, CHRRAMSize, 0,"CHRR");\r
+                               }\r
+                               else\r
+                                       return(-1);\r
+                       }\r
+                       if(bmap[x].flags&BMCFLAG_FORCE4)\r
+                               mirrortodo=4;\r
+                       MooMirroring();\r
+                       bmap[x].init(&UNIFCart);\r
+                       return(1);\r
+               }\r
+               x++;\r
+       }\r
+       FCEU_PrintError("Board type not supported.");\r
+       return(0);\r
 }\r
 \r
 static void UNIFGI(int h, void *param)\r
 {\r
- switch(h)\r
- {\r
-  case GI_RESETM2:\r
-                if(UNIFCart.Reset)\r
-                 UNIFCart.Reset();\r
+       switch(h)\r
+       {\r
+       case GI_RESETSAVE:\r
+               //FCEU_ClearGameSave(&UNIFCart);\r
                break;\r
-  case GI_POWER:\r
-                if(UNIFCart.Power)\r
-                 UNIFCart.Power();\r
+\r
+       case GI_RESETM2:\r
+               if(UNIFCart.Reset)\r
+                       UNIFCart.Reset();\r
+               break;\r
+       case GI_POWER:\r
+               if(UNIFCart.Power)\r
+                       UNIFCart.Power();\r
                if(UNIFchrrama) memset(UNIFchrrama,0,8192);\r
                break;\r
-  case GI_CLOSE:\r
-                FCEU_SaveGameSave(&UNIFCart);\r
+       case GI_CLOSE:\r
+               FCEU_SaveGameSave(&UNIFCart);\r
                if(UNIFCart.Close)\r
-                UNIFCart.Close();\r
-                FreeUNIF();\r
-               ResetExState(0,0);\r
-                break;\r
-  case GI_INFOSTRING:\r
+                       UNIFCart.Close();\r
+               FreeUNIF();\r
+               break;\r
+       case GI_INFOSTRING:\r
                {\r
                 char board[24];\r
-                strncpy(board, sboardname, 20);\r
+                strncpy(board, (char *)sboardname, 20);\r
                 board[20] = 0;\r
                 sprintf(param, "UNIF, %s, %s%s", board, PAL?"PAL":"NTSC", UNIFCart.battery?", BB":"");\r
                }\r
                break;\r
- }\r
      }\r
 }\r
 \r
 int UNIFLoad(const char *name, int fp)\r
 {\r
-        FCEU_fseek(fp,0,SEEK_SET);\r
-        FCEU_fread(&unhead,1,4,fp);\r
-        if(memcmp(&unhead,"UNIF",4))\r
-         return 0;\r
+       FCEU_fseek(fp,0,SEEK_SET);\r
+       FCEU_fread(&unhead,1,4,fp);\r
+       if(memcmp(&unhead,"UNIF",4))\r
+               return 0;\r
 \r
        ResetCartMapping();\r
 \r
-        ResetExState(0,0);\r
-        ResetUNIF();\r
-        if(!FCEU_read32(&unhead.info,fp))\r
-        goto aborto;\r
-        if(FCEU_fseek(fp,0x20,SEEK_SET)<0)\r
-        goto aborto;\r
-        if(!LoadUNIFChunks(fp))\r
-        goto aborto;\r
+       ResetExState(0,0);\r
+       ResetUNIF();\r
+       if(!FCEU_read32le(&unhead.info,fp))\r
+               goto aborto;\r
+       if(FCEU_fseek(fp,0x20,SEEK_SET)<0)\r
+               goto aborto;\r
+       if(!LoadUNIFChunks(fp))\r
+               goto aborto;\r
        {\r
-        int x;\r
-        struct md5_context md5;\r
-\r
-        md5_starts(&md5);\r
-\r
-        for(x=0;x<32;x++)\r
-         if(malloced[x])\r
-         {\r
-          md5_update(&md5,malloced[x],mallocedsizes[x]);\r
-         }\r
-         md5_finish(&md5,UNIFCart.MD5);\r
-          FCEU_printf(" ROM MD5:  0x");\r
-          for(x=0;x<16;x++)\r
-           FCEU_printf("%02x",UNIFCart.MD5[x]);\r
-          FCEU_printf("\n");\r
-         memcpy(FCEUGameInfo.MD5,UNIFCart.MD5,sizeof(UNIFCart.MD5));\r
+               int x;\r
+               struct md5_context md5;\r
+\r
+               md5_starts(&md5);\r
+\r
+               for(x=0;x<32;x++)\r
+                       if(malloced[x])\r
+                       {\r
+                               md5_update(&md5,malloced[x],mallocedsizes[x]);\r
+                       }\r
+                       md5_finish(&md5,UNIFCart.MD5);\r
+                       FCEU_printf(" ROM MD5:  0x");\r
+                       for(x=0;x<16;x++)\r
+                               FCEU_printf("%02x",UNIFCart.MD5[x]);\r
+                       FCEU_printf("\n");\r
+                       memcpy(&GameInfo->MD5,&UNIFCart.MD5,sizeof(UNIFCart.MD5));\r
        }\r
 \r
-        if(!InitializeBoard())\r
-        goto aborto;\r
+       if(!InitializeBoard())\r
+               goto aborto;\r
 \r
        FCEU_LoadGameSave(&UNIFCart);\r
-        GameInterface=UNIFGI;\r
-        return 1;\r
 \r
-       aborto:\r
+       //strcpy(LoadedRomFName,name); //For the debugger list\r
+       GameInterface=UNIFGI;\r
+       return 1;\r
+\r
+aborto:\r
 \r
        FreeUNIF();\r
        ResetUNIF();\r