merge mapper code from FCEUX
[fceu.git] / boards / t-227-1.c
diff --git a/boards/t-227-1.c b/boards/t-227-1.c
new file mode 100644 (file)
index 0000000..25d64af
--- /dev/null
@@ -0,0 +1,116 @@
+/* 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