random warning fixes
[fceu.git] / boards / yoko.c
1 /* FCE Ultra - NES/Famicom Emulator\r
2  *\r
3  * Copyright notice for this file:\r
4  *  Copyright (C) 2006 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19  *\r
20  *\r
21  * YOKO mapper, almost the same as 83, TODO: figure out difference\r
22  * Mapper 83 - 30-in-1 mapper, two modes for single game carts, one mode for \r
23  * multigame Dragon Ball Z Party\r
24  *\r
25  * Mortal Kombat 2 YOKO\r
26  * N-CXX(M), XX - ðàçìåðû PRG+CHR, 12 - 128+256, 22 - 256+256, 14 - 128+512\r
27  * \r
28  */\r
29 \r
30 #include "mapinc.h"\r
31 \r
32 static uint8 mode, bank, reg[11], low[4], dip, IRQa;\r
33 static int32 IRQCount;\r
34 static uint8 *WRAM=NULL;\r
35 static uint32 WRAMSIZE;\r
36 \r
37 static uint8 is2kbank, isnot2kbank;\r
38 \r
39 static SFORMAT StateRegs[]=\r
40 {\r
41   {&mode, 1, "MODE"},\r
42   {&bank, 1, "BANK"},\r
43   {&IRQCount, 4, "IRQC"},\r
44   {&IRQa, 1, "IRQA"},\r
45   {reg, 11, "REGS"},\r
46   {low, 4, "LOWR"},\r
47   {&is2kbank, 1, "IS2K"},\r
48   {&isnot2kbank, 1, "NT2K"},\r
49   {0}\r
50 };\r
51 \r
52 static void UNLYOKOSync(void)\r
53 {\r
54   setmirror((mode & 1)^1);\r
55   setchr2(0x0000,reg[3]);\r
56   setchr2(0x0800,reg[4]);\r
57   setchr2(0x1000,reg[5]);\r
58   setchr2(0x1800,reg[6]);\r
59   if(mode & 0x10)\r
60   {\r
61     uint32 base = (bank & 8) << 1;\r
62     setprg8(0x8000,(reg[0]&0x0f)|base);\r
63     setprg8(0xA000,(reg[1]&0x0f)|base);\r
64     setprg8(0xC000,(reg[2]&0x0f)|base);\r
65     setprg8(0xE000,0x0f|base);\r
66   }\r
67   else\r
68   {\r
69     if(mode & 8)\r
70       setprg32(0x8000,bank >> 1);\r
71     else\r
72     {\r
73       setprg16(0x8000,bank);\r
74       setprg16(0xC000,~0);\r
75     }\r
76   }\r
77 }\r
78 \r
79 static void M83Sync(void)\r
80 {\r
81   switch(mode & 3) // check if it is truth\r
82   {\r
83     case 0: setmirror(MI_V); break;\r
84     case 1: setmirror(MI_H); break;\r
85     case 2: setmirror(MI_0); break;\r
86     case 3: setmirror(MI_1); break;\r
87   }\r
88   if(is2kbank&&!isnot2kbank)\r
89   {\r
90     setchr2(0x0000,reg[0]);\r
91     setchr2(0x0800,reg[1]);\r
92     setchr2(0x1000,reg[6]);\r
93     setchr2(0x1800,reg[7]);\r
94   }\r
95   else\r
96   {\r
97     int x;\r
98     for(x=0;x<8;x++)\r
99        setchr1(x<<10, reg[x] | ((bank&0x30)<<4));\r
100   }\r
101   setprg8r(0x10,0x6000,0);\r
102   if(mode & 0x40)\r
103   {\r
104     setprg16(0x8000,(bank&0x3F));      // DBZ Party [p1]\r
105     setprg16(0xC000,(bank&0x30)|0xF);\r
106   }\r
107   else\r
108   {\r
109     setprg8(0x8000,reg[8]);\r
110     setprg8(0xA000,reg[9]);\r
111     setprg8(0xC000,reg[10]);\r
112     setprg8(0xE000,~0);\r
113   }\r
114 }\r
115 \r
116 static DECLFW(UNLYOKOWrite)\r
117 {\r
118   switch(A & 0x8C17)\r
119   {\r
120     case 0x8000: bank=V; UNLYOKOSync(); break;\r
121     case 0x8400: mode=V; UNLYOKOSync(); break;\r
122     case 0x8800: IRQCount&=0xFF00; IRQCount|=V; X6502_IRQEnd(FCEU_IQEXT); break;\r
123     case 0x8801: IRQa=mode&0x80; IRQCount&=0xFF; IRQCount|=V<<8; break;\r
124     case 0x8c00: reg[0]=V; UNLYOKOSync(); break;\r
125     case 0x8c01: reg[1]=V; UNLYOKOSync(); break;\r
126     case 0x8c02: reg[2]=V; UNLYOKOSync(); break;\r
127     case 0x8c10: reg[3]=V; UNLYOKOSync(); break;\r
128     case 0x8c11: reg[4]=V; UNLYOKOSync(); break;\r
129     case 0x8c16: reg[5]=V; UNLYOKOSync(); break;\r
130     case 0x8c17: reg[6]=V; UNLYOKOSync(); break;\r
131   }\r
132 }\r
133 \r
134 static DECLFW(M83Write)\r
135 {\r
136   switch(A)\r
137   {\r
138     case 0x8000: is2kbank = 1;\r
139     case 0xB000:                                          // Dragon Ball Z Party [p1] BMC\r
140     case 0xB0FF:                                          // Dragon Ball Z Party [p1] BMC \r
141     case 0xB1FF: bank=V; mode |= 0x40; M83Sync(); break;  // Dragon Ball Z Party [p1] BMC\r
142     case 0x8100: mode=V|(mode&0x40); M83Sync(); break;\r
143     case 0x8200: IRQCount&=0xFF00; IRQCount|=V; X6502_IRQEnd(FCEU_IQEXT); break;\r
144     case 0x8201: IRQa=mode&0x80; IRQCount&=0xFF; IRQCount|=V<<8; break;\r
145     case 0x8300: reg[8]=V; mode &= 0xBF; M83Sync(); break;\r
146     case 0x8301: reg[9]=V; mode &= 0xBF; M83Sync(); break;\r
147     case 0x8302: reg[10]=V; mode &= 0xBF; M83Sync(); break;\r
148     case 0x8310: reg[0]=V; M83Sync(); break;\r
149     case 0x8311: reg[1]=V; M83Sync(); break;\r
150     case 0x8312: reg[2]=V; isnot2kbank = 1; M83Sync(); break;\r
151     case 0x8313: reg[3]=V; isnot2kbank = 1; M83Sync(); break;\r
152     case 0x8314: reg[4]=V; isnot2kbank = 1; M83Sync(); break;\r
153     case 0x8315: reg[5]=V; isnot2kbank = 1; M83Sync(); break;\r
154     case 0x8316: reg[6]=V; M83Sync(); break;\r
155     case 0x8317: reg[7]=V; M83Sync(); break;\r
156   }\r
157 }\r
158 \r
159 static DECLFR(UNLYOKOReadDip)\r
160 {\r
161   return (X.DB&0xFC)|dip;\r
162 }\r
163 \r
164 static DECLFR(UNLYOKOReadLow)\r
165 {\r
166   return low[A & 3];\r
167 }\r
168 \r
169 static DECLFW(UNLYOKOWriteLow)\r
170 {\r
171   low[A & 3] = V;\r
172 }\r
173 \r
174 static void UNLYOKOPower(void)\r
175 {\r
176   mode = bank = 0;\r
177   dip = 3;\r
178   UNLYOKOSync();  \r
179   SetReadHandler(0x5000,0x53FF,UNLYOKOReadDip);\r
180   SetReadHandler(0x5400,0x5FFF,UNLYOKOReadLow);\r
181   SetWriteHandler(0x5400,0x5FFF,UNLYOKOWriteLow);\r
182   SetReadHandler(0x8000,0xFFFF,CartBR);\r
183   SetWriteHandler(0x8000,0xFFFF,UNLYOKOWrite);\r
184 }\r
185 \r
186 static void M83Power(void)\r
187 {\r
188   is2kbank = 0;\r
189   isnot2kbank = 0;\r
190   mode = bank = 0;\r
191   dip = 0;\r
192   M83Sync();\r
193   SetReadHandler(0x5000,0x5000,UNLYOKOReadDip);\r
194   SetReadHandler(0x5100,0x5103,UNLYOKOReadLow);\r
195   SetWriteHandler(0x5100,0x5103,UNLYOKOWriteLow);\r
196   SetReadHandler(0x6000,0x7fff,CartBR);\r
197   SetWriteHandler(0x6000,0x7fff,CartBW); // Pirate Dragon Ball Z Party [p1] used if for saves instead of seraial EEPROM\r
198   SetReadHandler(0x8000,0xffff,CartBR);\r
199   SetWriteHandler(0x8000,0xffff,M83Write);\r
200 }\r
201 \r
202 static void UNLYOKOReset(void)\r
203 {\r
204   dip = (dip + 1) & 3;\r
205   mode = bank = 0;\r
206   UNLYOKOSync();  \r
207 }\r
208 \r
209 static void M83Reset(void)\r
210 {\r
211   dip ^= 1;\r
212   M83Sync(); \r
213 }\r
214 \r
215 static void M83Close(void)\r
216 {\r
217   if(WRAM)\r
218     FCEU_gfree(WRAM);\r
219   WRAM=NULL;\r
220 }\r
221 \r
222 static void FP_FASTAPASS(1) UNLYOKOIRQHook(int a)\r
223 {\r
224   if(IRQa)\r
225   {\r
226    IRQCount-=a;\r
227    if(IRQCount<0)\r
228    {\r
229      X6502_IRQBegin(FCEU_IQEXT);\r
230      IRQa=0;\r
231      IRQCount=0xFFFF;\r
232    }\r
233   }\r
234 }\r
235 \r
236 static void UNLYOKOStateRestore(int version)\r
237 {\r
238   UNLYOKOSync();\r
239 }\r
240 \r
241 static void M83StateRestore(int version)\r
242 {\r
243   M83Sync(); \r
244 }\r
245 \r
246 void UNLYOKO_Init(CartInfo *info)\r
247 {\r
248   info->Power=UNLYOKOPower;\r
249   info->Reset=UNLYOKOReset;\r
250   MapIRQHook=UNLYOKOIRQHook;\r
251   GameStateRestore=UNLYOKOStateRestore;\r
252   AddExState(&StateRegs, ~0, 0, 0);\r
253 }\r
254 \r
255 void Mapper83_Init(CartInfo *info)\r
256 {\r
257   info->Power=M83Power;\r
258   info->Reset=M83Reset;\r
259   info->Close=M83Close;\r
260   MapIRQHook=UNLYOKOIRQHook;\r
261   GameStateRestore=M83StateRestore;\r
262 \r
263   WRAMSIZE=8192;\r
264   WRAM=(uint8*)FCEU_gmalloc(WRAMSIZE);\r
265   SetupCartPRGMapping(0x10,WRAM,WRAMSIZE,1);\r
266   AddExState(WRAM, WRAMSIZE, 0, "WRAM");\r
267 \r
268   AddExState(&StateRegs, ~0, 0, 0);\r
269 }\r