8e40a19769351de1b1b82a49b6daa102ac7e1b49
[fceu.git] / mappers / 156.c
1 /* FCE Ultra - NES/Famicom Emulator\r
2  *\r
3  * Copyright notice for this file:\r
4  *  Copyright (C) 2009 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  * DIS23C01 DAOU ROM CONTROLLER, Korea\r
21  * Metal Force (K)\r
22  * Buzz and Waldog (K)\r
23  * General's Son (K)\r
24  *\r
25  */\r
26 \r
27 #include "mapinc.h"\r
28 \r
29 static uint8 chrlo[8], chrhi[8], prg, mirr, mirrisused = 0;\r
30 // uint8 *WRAM=NULL;\r
31 static uint32 WRAMSIZE;\r
32 \r
33 static SFORMAT StateRegs[]=\r
34 {\r
35   {&prg, 1, "PREG"},\r
36   {chrlo, 8, "CRLO"},\r
37   {chrhi, 8, "CRHI"},\r
38   {&mirr, 1, "MIRR"},\r
39   {0}\r
40 };\r
41 \r
42 static void Sync(void)\r
43 {\r
44   uint32 i;\r
45   for(i=0; i<8; i++)\r
46     setchr1(i<<10, chrlo[i]|(chrhi[i] << 8));\r
47   setprg8r(0x10,0x6000,0);\r
48   setprg16(0x8000,prg);\r
49   setprg16(0xC000,~0);\r
50   if(mirrisused)\r
51     setmirror(mirr ^ 1);\r
52   else\r
53     setmirror(MI_0);\r
54 }\r
55 \r
56 static DECLFW(M156Write)\r
57 {\r
58   switch(A) {\r
59    case 0xC000:\r
60    case 0xC001:\r
61    case 0xC002:\r
62    case 0xC003: chrlo[A&3] = V; Sync(); break;\r
63    case 0xC004:\r
64    case 0xC005:\r
65    case 0xC006:\r
66    case 0xC007: chrhi[A&3] = V; Sync(); break;\r
67    case 0xC008:\r
68    case 0xC009:\r
69    case 0xC00A:\r
70    case 0xC00B: chrlo[4+(A&3)] = V; Sync(); break;\r
71    case 0xC00C:\r
72    case 0xC00D:\r
73    case 0xC00E:\r
74    case 0xC00F: chrhi[4+(A&3)] = V; Sync(); break;\r
75    case 0xC010: prg = V; Sync(); break;\r
76    case 0xC014: mirr = V; mirrisused = 1; Sync(); break;\r
77   }\r
78 }\r
79 \r
80 static void M1566Reset()\r
81 {\r
82         for(int i=0;i<8;i++)\r
83         {\r
84                 chrlo[i]=0;\r
85                 chrhi[i]=0;\r
86         }\r
87         prg=0;\r
88         mirr=0;\r
89         mirrisused = 0;\r
90 }\r
91 \r
92 static void M156Power(void)\r
93 {\r
94   Sync();\r
95   SetReadHandler(0x6000,0xFFFF,CartBR);\r
96   SetWriteHandler(0x6000,0x7FFF,CartBW);\r
97   SetWriteHandler(0xC000,0xCFFF,M156Write);\r
98 \r
99         M1566Reset();\r
100 }\r
101 \r
102 static void M156Close(void)\r
103 {\r
104   if(WRAM)\r
105     FCEU_gfree(WRAM);\r
106   WRAM=NULL;\r
107 }\r
108 \r
109 static void StateRestore(int version)\r
110 {\r
111   Sync();\r
112 }\r
113 \r
114 void Mapper156_Init(CartInfo *info)\r
115 {\r
116   info->Power=M156Power;\r
117   info->Close=M156Close;\r
118 \r
119   WRAMSIZE=8192;\r
120   WRAM=(uint8*)FCEU_gmalloc(WRAMSIZE);\r
121   SetupCartPRGMapping(0x10,WRAM,WRAMSIZE,1);\r
122   AddExState(WRAM, WRAMSIZE, 0, "WRAM");\r
123 \r
124   GameStateRestore=StateRestore;\r
125   AddExState(&StateRegs, ~0, 0, 0);\r
126 }\r