merge mapper code from FCEUX
[fceu.git] / boards / ghostbusters63in1.c
CommitLineData
386f5371 1/* FCE Ultra - NES/Famicom Emulator\r
2 *\r
3 * Copyright notice for this file:\r
4 * Copyright (C) 2007 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 * 63in1 ghostbusters\r
20 */\r
21\r
22#include "mapinc.h"\r
23\r
24static uint8 reg[2], bank;\r
25static uint8 banks[4] = {0, 0, 1, 2};\r
26static uint8 *CHRROM=NULL;\r
27static uint32 CHRROMSIZE;\r
28\r
29static SFORMAT StateRegs[]=\r
30{\r
31 {reg, 2, "REGS"},\r
32 {&bank, 1, "BANK"},\r
33 {0}\r
34};\r
35\r
36static void Sync(void)\r
37{\r
38 if(reg[0]&0x20)\r
39 {\r
40 setprg16r(banks[bank],0x8000,reg[0]&0x1F);\r
41 setprg16r(banks[bank],0xC000,reg[0]&0x1F);\r
42 }\r
43 else\r
44 setprg32r(banks[bank],0x8000,(reg[0]>>1)&0x0F);\r
45 if(reg[1]&2)\r
46 setchr8r(0x10,0);\r
47 else\r
48 setchr8(0);\r
49 setmirror((reg[0]&0x40)>>6);\r
50}\r
51\r
52static DECLFW(BMCGhostbusters63in1Write)\r
53{\r
54 reg[A&1]=V;\r
55 bank=((reg[0]&0x80)>>7)|((reg[1]&1)<<1);\r
56// FCEU_printf("reg[0]=%02x, reg[1]=%02x, bank=%02x\n",reg[0],reg[1],bank);\r
57 Sync();\r
58}\r
59\r
60static DECLFR(BMCGhostbusters63in1Read)\r
61{\r
62 if(bank==1)\r
63 return X.DB;\r
64 else\r
65 return CartBR(A);\r
66}\r
67\r
68static void BMCGhostbusters63in1Power(void)\r
69{\r
70 reg[0]=reg[1]=0;\r
71 Sync();\r
72 SetReadHandler(0x8000,0xFFFF,BMCGhostbusters63in1Read);\r
73 SetWriteHandler(0x8000,0xFFFF,BMCGhostbusters63in1Write);\r
74}\r
75\r
76static void BMCGhostbusters63in1Reset(void)\r
77{\r
78 reg[0]=reg[1]=0;\r
79}\r
80\r
81static void StateRestore(int version)\r
82{\r
83 Sync();\r
84}\r
85\r
86static void BMCGhostbusters63in1Close(void)\r
87{\r
88 if(CHRROM)\r
89 FCEU_gfree(CHRROM);\r
90 CHRROM=NULL;\r
91}\r
92\r
93void BMCGhostbusters63in1_Init(CartInfo *info)\r
94{\r
95 info->Reset=BMCGhostbusters63in1Reset;\r
96 info->Power=BMCGhostbusters63in1Power;\r
97 info->Close=BMCGhostbusters63in1Close;\r
98\r
99 CHRROMSIZE=8192; // dummy CHRROM, VRAM disable\r
100 CHRROM=(uint8*)FCEU_gmalloc(CHRROMSIZE);\r
101 SetupCartPRGMapping(0x10,CHRROM,CHRROMSIZE,0);\r
102 AddExState(CHRROM, CHRROMSIZE, 0, "CHRROM");\r
103\r
104 GameStateRestore=StateRestore;\r
105 AddExState(&StateRegs, ~0, 0, 0);\r
106}\r