--- /dev/null
+/* FCE Ultra - NES/Famicom Emulator\r
+ *\r
+ * Copyright notice for this file:\r
+ * Copyright (C) 2008 CaH4e3\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
+// T-227-1, 820632, MMC3 based, multimenu, 60000in1 (0010) dip switches\r
+\r
+#include "mapinc.h"\r
+#include "mmc3.h"\r
+\r
+static uint8 reset_flag = 0x07;\r
+\r
+static void BMCT2271CW(uint32 A, uint8 V)\r
+{\r
+ uint32 va = V; \r
+ if(EXPREGS[0]&0x20)\r
+ {\r
+ va|=0x200;\r
+ va|=(EXPREGS[0]&0x10)<<4;\r
+ }\r
+ else\r
+ {\r
+ va&=0x7F;\r
+ va|=(EXPREGS[0]&0x18)<<4;\r
+ }\r
+ setchr1(A,va);\r
+}\r
+\r
+static void BMCT2271PW(uint32 A, uint8 V)\r
+{\r
+ uint32 va = V & 0x3F; \r
+ if(EXPREGS[0]&0x20)\r
+ {\r
+ va&=0x1F;\r
+ va|=0x40;\r
+ va|=(EXPREGS[0]&0x10)<<1;\r
+ }\r
+ else\r
+ {\r
+ va&=0x0F;\r
+ va|=(EXPREGS[0]&0x18)<<1;\r
+ }\r
+ switch(EXPREGS[0]&3)\r
+ {\r
+ case 0x00: setprg8(A,va); break;\r
+ case 0x02: \r
+ {\r
+ va=(va&0xFD)|((EXPREGS[0]&4)>>1);\r
+ if(A<0xC000)\r
+ {\r
+ setprg16(0x8000,va >> 1); \r
+ setprg16(0xC000,va >> 1); \r
+ }\r
+ break;\r
+ }\r
+ case 0x01: \r
+ case 0x03: if(A<0xC000) setprg32(0x8000,va >> 2); break;\r
+ }\r
+\r
+}\r
+ \r
+static DECLFW(BMCT2271LoWrite)\r
+{\r
+ if(!(EXPREGS[0]&0x80))\r
+ EXPREGS[0] = A & 0xFF;\r
+ FixMMC3PRG(MMC3_cmd);\r
+ FixMMC3CHR(MMC3_cmd);\r
+}\r
+\r
+static DECLFR(BMCT2271HiRead)\r
+{\r
+ uint32 av = A;\r
+ if(EXPREGS[0]&0x40) av = (av & 0xFFF0)|reset_flag;\r
+ return CartBR(av);\r
+}\r
+\r
+static void BMCT2271Reset(void)\r
+{\r
+ EXPREGS[0] = 0x00;\r
+ reset_flag++;\r
+ reset_flag&=0x0F;\r
+ MMC3RegReset();\r
+}\r
+\r
+static void BMCT2271Power(void)\r
+{\r
+ EXPREGS[0] = 0x00;\r
+ GenMMC3Power();\r
+ SetWriteHandler(0x6000,0x7FFF,BMCT2271LoWrite);\r
+ SetReadHandler(0x8000,0xFFFF,BMCT2271HiRead);\r
+}\r
+\r
+void BMCT2271_Init(CartInfo *info)\r
+{\r
+ GenMMC3_Init(info, 128, 128, 8, 0);\r
+ pwrap=BMCT2271PW;\r
+ cwrap=BMCT2271CW;\r
+ info->Power=BMCT2271Power;\r
+ info->Reset=BMCT2271Reset;\r
+ AddExState(EXPREGS, 1, 0, "EXPR");\r
+}\r