1 /* FCE Ultra - NES/Famicom Emulator
\r
3 * Copyright notice for this file:
\r
4 * Copyright (C) 2006 CaH4e3
\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
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
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
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
25 * Mortal Kombat 2 YOKO
\r
26 * N-CXX(M), XX - ðàçìåðû PRG+CHR, 12 - 128+256, 22 - 256+256, 14 - 128+512
\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
37 static uint8 is2kbank, isnot2kbank;
\r
39 static SFORMAT StateRegs[]=
\r
43 {&IRQCount, 4, "IRQC"},
\r
47 {&is2kbank, 1, "IS2K"},
\r
48 {&isnot2kbank, 1, "NT2K"},
\r
52 static void UNLYOKOSync(void)
\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
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
70 setprg32(0x8000,bank >> 1);
\r
73 setprg16(0x8000,bank);
\r
74 setprg16(0xC000,~0);
\r
79 static void M83Sync(void)
\r
81 switch(mode & 3) // check if it is truth
\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
88 if(is2kbank&&!isnot2kbank)
\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
99 setchr1(x<<10, reg[x] | ((bank&0x30)<<4));
\r
101 setprg8r(0x10,0x6000,0);
\r
104 setprg16(0x8000,(bank&0x3F)); // DBZ Party [p1]
\r
105 setprg16(0xC000,(bank&0x30)|0xF);
\r
109 setprg8(0x8000,reg[8]);
\r
110 setprg8(0xA000,reg[9]);
\r
111 setprg8(0xC000,reg[10]);
\r
112 setprg8(0xE000,~0);
\r
116 static DECLFW(UNLYOKOWrite)
\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
134 static DECLFW(M83Write)
\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
159 static DECLFR(UNLYOKOReadDip)
\r
161 return (X.DB&0xFC)|dip;
\r
164 static DECLFR(UNLYOKOReadLow)
\r
169 static DECLFW(UNLYOKOWriteLow)
\r
174 static void UNLYOKOPower(void)
\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
186 static void M83Power(void)
\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
202 static void UNLYOKOReset(void)
\r
204 dip = (dip + 1) & 3;
\r
209 static void M83Reset(void)
\r
215 static void M83Close(void)
\r
222 static void FP_FASTAPASS(1) UNLYOKOIRQHook(int a)
\r
229 X6502_IRQBegin(FCEU_IQEXT);
\r
236 static void UNLYOKOStateRestore(int version)
\r
241 static void M83StateRestore(int version)
\r
246 void UNLYOKO_Init(CartInfo *info)
\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
255 void Mapper83_Init(CartInfo *info)
\r
257 info->Power=M83Power;
\r
258 info->Reset=M83Reset;
\r
259 info->Close=M83Close;
\r
260 MapIRQHook=UNLYOKOIRQHook;
\r
261 GameStateRestore=M83StateRestore;
\r
264 WRAM=(uint8*)FCEU_gmalloc(WRAMSIZE);
\r
265 SetupCartPRGMapping(0x10,WRAM,WRAMSIZE,1);
\r
266 AddExState(WRAM, WRAMSIZE, 0, "WRAM");
\r
268 AddExState(&StateRegs, ~0, 0, 0);
\r