merge mapper code from FCEUX
[fceu.git] / boards / t-227-1.c
1 /* FCE Ultra - NES/Famicom Emulator\r
2  *\r
3  * Copyright notice for this file:\r
4  *  Copyright (C) 2008 CaH4e3\r
5  *\r
6  * This program is free software; you can redistribute it and/or modify\r
7  * it under the terms of the GNU General Public License as published by\r
8  * the Free Software Foundation; either version 2 of the License, or\r
9  * (at your option) any later version.\r
10  *\r
11  * This program is distributed in the hope that it will be useful,\r
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14  * GNU General Public License for more details.\r
15  *\r
16  * You should have received a copy of the GNU General Public License\r
17  * along with this program; if not, write to the Free Software\r
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
19  */\r
20 \r
21 // T-227-1, 820632, MMC3 based, multimenu, 60000in1 (0010) dip switches\r
22 \r
23 #include "mapinc.h"\r
24 #include "mmc3.h"\r
25 \r
26 static uint8 reset_flag = 0x07;\r
27 \r
28 static void BMCT2271CW(uint32 A, uint8 V)\r
29 {\r
30     uint32 va = V; \r
31     if(EXPREGS[0]&0x20)\r
32     {\r
33       va|=0x200;\r
34       va|=(EXPREGS[0]&0x10)<<4;\r
35     }\r
36     else\r
37     {\r
38       va&=0x7F;\r
39       va|=(EXPREGS[0]&0x18)<<4;\r
40     }\r
41     setchr1(A,va);\r
42 }\r
43 \r
44 static void BMCT2271PW(uint32 A, uint8 V)\r
45 {\r
46     uint32 va = V & 0x3F; \r
47     if(EXPREGS[0]&0x20)\r
48     {\r
49        va&=0x1F;\r
50        va|=0x40;\r
51        va|=(EXPREGS[0]&0x10)<<1;\r
52     }\r
53     else\r
54     {\r
55        va&=0x0F;\r
56        va|=(EXPREGS[0]&0x18)<<1;\r
57     }\r
58     switch(EXPREGS[0]&3)\r
59     {\r
60       case 0x00: setprg8(A,va); break;\r
61       case 0x02: \r
62            {\r
63              va=(va&0xFD)|((EXPREGS[0]&4)>>1);\r
64              if(A<0xC000)\r
65              {\r
66                setprg16(0x8000,va >> 1); \r
67                setprg16(0xC000,va >> 1); \r
68              }\r
69              break;\r
70            }\r
71       case 0x01: \r
72       case 0x03: if(A<0xC000) setprg32(0x8000,va >> 2); break;\r
73     }\r
74 \r
75 }\r
76        \r
77 static DECLFW(BMCT2271LoWrite)\r
78 {\r
79   if(!(EXPREGS[0]&0x80))\r
80     EXPREGS[0] = A & 0xFF;\r
81   FixMMC3PRG(MMC3_cmd);\r
82   FixMMC3CHR(MMC3_cmd);\r
83 }\r
84 \r
85 static DECLFR(BMCT2271HiRead)\r
86 {\r
87   uint32 av = A;\r
88   if(EXPREGS[0]&0x40) av = (av & 0xFFF0)|reset_flag;\r
89   return CartBR(av);\r
90 }\r
91 \r
92 static void BMCT2271Reset(void)\r
93 {\r
94   EXPREGS[0] = 0x00;\r
95   reset_flag++;\r
96   reset_flag&=0x0F;\r
97   MMC3RegReset();\r
98 }\r
99 \r
100 static void BMCT2271Power(void)\r
101 {\r
102   EXPREGS[0] = 0x00;\r
103   GenMMC3Power();\r
104   SetWriteHandler(0x6000,0x7FFF,BMCT2271LoWrite);\r
105   SetReadHandler(0x8000,0xFFFF,BMCT2271HiRead);\r
106 }\r
107 \r
108 void BMCT2271_Init(CartInfo *info)\r
109 {\r
110   GenMMC3_Init(info, 128, 128, 8, 0);\r
111   pwrap=BMCT2271PW;\r
112   cwrap=BMCT2271CW;\r
113   info->Power=BMCT2271Power;\r
114   info->Reset=BMCT2271Reset;\r
115   AddExState(EXPREGS, 1, 0, "EXPR");\r
116 }\r