/* 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 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=(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
+ 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-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
+ { "SA-9602B", SA9602B_Init, BMCFLAG_32KCHRR},\r
\r
// /* AVE carts. */\r
// { "MB-91", MB91_Init,0}, // DeathBots\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
{ "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
+ { "SSS-NROM-256", SSSNROM_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
-\r
+ { "3D-BLOCK", UNL3DBlock_Init, 0},\r
+ { "SMB2J", UNLSMB2J_Init, 0},\r
+ { "AX5705", UNLAX5705_Init, 0},\r
{ "CC-21", UNLCC21_Init,0},\r
+ { "LE05", LE05_Init,0},\r
+ { "AC08", AC08_Init,0},\r
+ { "LH10", LH10_Init,0},\r
+ { "LH32", LH32_Init,0},\r
+ { "LH53", LH53_Init,0},\r
+ { "BB", UNLBB_Init,0},\r
\r
{ "H2288", UNLH2288_Init,0},\r
{ "KOF97", UNLKOF97_Init,0},\r
{ "SL1632", UNLSL1632_Init,0},\r
+ { "SL12", UNLSL12_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
+ { "FK23C", BMCFK23C_Init,BMCFLAG_EXPCHRR},\r
+ { "FK23CA", BMCFK23CA_Init,BMCFLAG_EXPCHRR},\r
+ { "A65AS", BMCA65AS_Init,0},\r
+ { "YOKO", UNLYOKO_Init,0},\r
+ { "FS304", UNLFS304_Init,0},\r
+ { "43272", UNL43272_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
- { "42in1ResetSwitch", BMC42in1r_Init, 0},\r
{ "64in1NoRepeat", BMC64in1nr_Init, 0},\r
+ { "42in1ResetSwitch", Mapper226_Init, 0},\r
{ "13in1JY110", BMC13in1JY110_Init, 0},\r
{ "70in1", BMC70in1_Init, 0},\r
{ "70in1B", BMC70in1B_Init, 0},\r
- { "GK-192", Mapper58_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
+ { "KS7057", UNLKS7057_Init, 0},\r
+ { "KS7037", UNLKS7037_Init, 0},\r
+ { "KS7030", UNLKS7030_Init, 0},\r
+ { "KS7031", UNLKS7031_Init, 0},\r
+ { "KS7032", UNLKS7032_Init, 0},\r
+ { "KS7017", UNLKS7017_Init, 0},\r
+ { "KS7012", UNLKS7012_Init, 0},\r
+ { "KS7013B", UNLKS7013B_Init, 0},\r
+ { "T-230", UNLT230_Init, 0},\r
+ { "CITYFIGHT", UNLCITYFIGHT_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
+ { "PEC-586",UNLPEC586Init,0},\r
+ { "12-IN-1",BMC12IN1_Init,0},\r
+ { "VRC7", UNLVRC7_Init,0},\r
+ { "810544-C-A1", BMC810544CA1_Init,0},\r
+ { "NTD-03", BMCNTD03_Init,0},\r
\r
{ "DREAMTECH01", DreamTech01_Init,0},\r
{ "KONAMI-QTAI", Mapper190_Init,0},\r
\r
+ { "DANCE", UNLOneBus_Init,0}, // redundant\r
+ { "OneBus", UNLOneBus_Init,0},\r
+ { "SC-127", UNLSC127_Init,0},\r
+ { "DANCE2000", UNLD2000_Init,0},\r
+ { "Transformer", Transformer_Init, 0},\r
+\r
{ "TEK90", Mapper90_Init,0},\r
\r
+#ifdef COPYFAMI\r
+ { "COPYFAMI_MMC3", MapperCopyFamiMMC3_Init,0},\r
+ { "COPYFAMI", MapperCopyFami_Init,0},\r
+#endif\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((char *)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)\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
+\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
+ 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
- break;\r
- }\r
+ UNIFCart.Close();\r
+ FreeUNIF();\r
+ break;\r
+ case GI_INFOSTRING:\r
+ {\r
+ char board[24];\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
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