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
24 static uint8 unromchr;
\r
25 static uint32 dipswitch = 0;
\r
26 static uint8 *CHRRAM=NULL;
\r
27 static uint32 CHRRAMSize;
\r
29 static void BMCFK23CCW(uint32 A, uint8 V)
\r
32 setchr8(EXPREGS[2]|unromchr);
\r
33 else if(EXPREGS[0]&0x20) {
\r
34 setchr1r(0x10, A, V);
\r
38 uint16 base=(EXPREGS[2]&0x7F)<<3;
\r
41 int cbase=(MMC3_cmd&0x80)<<5;
\r
43 setchr1(0x0000^cbase,DRegBuf[0]|base);
\r
44 setchr1(0x0400^cbase,EXPREGS[6]|base);
\r
45 setchr1(0x0800^cbase,DRegBuf[1]|base);
\r
46 setchr1(0x0c00^cbase,EXPREGS[7]|base);
\r
53 static void BMCFK23CPW(uint32 A, uint8 V)
\r
55 uint32 bank = (EXPREGS[1] & 0x1F);
\r
56 uint32 hiblock = ((EXPREGS[0] & 8) << 4)|((EXPREGS[0] & 0x80) << 1)|(UNIFchrrama?((EXPREGS[2] & 0x40)<<3):0);
\r
57 uint32 block = (EXPREGS[1] & 0x60) | hiblock;
\r
58 uint32 extra = (EXPREGS[3] & 2);
\r
59 switch(EXPREGS[0]&7)
\r
61 case 0: setprg8(A, (block << 1) | (V & 0x3F));
\r
64 setprg8(0xC000,EXPREGS[4]);
\r
65 setprg8(0xE000,EXPREGS[5]);
\r
68 case 1: setprg8(A, ((hiblock | (EXPREGS[1] & 0x70)) << 1) | (V & 0x1F));
\r
71 setprg8(0xC000,EXPREGS[4]);
\r
72 setprg8(0xE000,EXPREGS[5]);
\r
75 case 2: setprg8(A, ((hiblock | (EXPREGS[1] & 0x78)) << 1) | (V & 0x0F));
\r
78 setprg8(0xC000,EXPREGS[4]);
\r
79 setprg8(0xE000,EXPREGS[5]);
\r
82 case 3: setprg16(0x8000,(bank | block));
\r
83 setprg16(0xC000,(bank | block));
\r
85 case 4: setprg32(0x8000,(bank | block) >> 1);
\r
88 setprg8r(0x10,0x6000,A001B&3);
\r
91 static DECLFW(BMCFK23CHiWrite)
\r
100 FixMMC3CHR(MMC3_cmd);
\r
105 if((A==0x8001)&&(EXPREGS[3]&2)&&(MMC3_cmd&8))
\r
107 EXPREGS[4|(MMC3_cmd&3)]=V;
\r
108 FixMMC3PRG(MMC3_cmd);
\r
109 FixMMC3CHR(MMC3_cmd);
\r
113 if(UNIFchrrama) { // hacky... strange behaviour, must be bit scramble due to pcb layot restrictions
\r
114 // check if it not interfer with other dumps
\r
115 if((A==0x8000)&&(V==0x46))
\r
117 else if((A==0x8000)&&(V==0x47))
\r
120 MMC3_CMDWrite(A,V);
\r
121 FixMMC3PRG(MMC3_cmd);
\r
124 MMC3_IRQWrite(A,V);
\r
128 static DECLFW(BMCFK23CWrite)
\r
130 //FCEU_printf("lo %04x:%02x\n",A,V);
\r
131 if(dipswitch) // íóëåâîé äèï áåðåò ëþáûå çàïèñè ïî äåôîëòó, äàëüøå èäåò âûáîð
\r
133 if(A&(1<<(dipswitch+3))) {
\r
135 // FCEU_printf(" reg %d set!\n",A&3);
\r
136 FixMMC3PRG(MMC3_cmd);
\r
137 FixMMC3CHR(MMC3_cmd);
\r
143 // FCEU_printf(" reg %d set!\n",A&3);
\r
144 FixMMC3PRG(MMC3_cmd);
\r
145 FixMMC3CHR(MMC3_cmd);
\r
148 EXPREGS[0] &= ~7; // hacky hacky! if someone wants extra banking, then for sure doesn't want mode 4 for it! (allow to run A version boards on normal mapper)
\r
151 static void BMCFK23CReset(void)
\r
157 EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=0;
\r
158 EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF;
\r
160 FixMMC3PRG(MMC3_cmd);
\r
161 FixMMC3CHR(MMC3_cmd);
\r
164 static void BMCFK23CPower(void)
\r
169 EXPREGS[2]=EXPREGS[3]=0;
\r
171 EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF;
\r
172 SetWriteHandler(0x5000,0x5fff,BMCFK23CWrite);
\r
173 SetWriteHandler(0x8000,0xFFFF,BMCFK23CHiWrite);
\r
174 FixMMC3PRG(MMC3_cmd);
\r
175 FixMMC3CHR(MMC3_cmd);
\r
178 static void BMCFK23CAPower(void)
\r
182 EXPREGS[0]=EXPREGS[1]=EXPREGS[2]=EXPREGS[3]=0;
\r
183 EXPREGS[4]=EXPREGS[5]=EXPREGS[6]=EXPREGS[7]=0xFF;
\r
184 SetWriteHandler(0x5000,0x5fff,BMCFK23CWrite);
\r
185 SetWriteHandler(0x8000,0xFFFF,BMCFK23CHiWrite);
\r
186 FixMMC3PRG(MMC3_cmd);
\r
187 FixMMC3CHR(MMC3_cmd);
\r
190 static void BMCFK23CAClose(void)
\r
193 FCEU_gfree(CHRRAM);
\r
197 void BMCFK23C_Init(CartInfo *info)
\r
199 GenMMC3_Init(info, 512, 256, 128, 0);
\r
202 info->Power=BMCFK23CPower;
\r
203 info->Reset=BMCFK23CReset;
\r
204 AddExState(EXPREGS, 8, 0, "EXPR");
\r
205 AddExState(&unromchr, 1, 0, "UCHR");
\r
206 AddExState(&dipswitch, 1, 0, "DPSW");
\r
209 void BMCFK23CA_Init(CartInfo *info)
\r
211 GenMMC3_Init(info, 512, 256, 128, 0);
\r
214 info->Power=BMCFK23CAPower;
\r
215 info->Reset=BMCFK23CReset;
\r
216 info->Close=BMCFK23CAClose;
\r
219 CHRRAM=(uint8*)FCEU_gmalloc(CHRRAMSize);
\r
220 SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1);
\r
221 AddExState(CHRRAM, CHRRAMSize, 0, "CRAM");
\r
223 AddExState(EXPREGS, 8, 0, "EXPR");
\r
224 AddExState(&unromchr, 1, 0, "UCHR");
\r
225 AddExState(&dipswitch, 1, 0, "DPSW");
\r