mappers updated to 0.98.16
[fceu.git] / boards / datalatch.c
1 /* FCE Ultra - NES/Famicom Emulator
2  *
3  * Copyright notice for this file:
4  *  Copyright (C) 2002 Xodnizel
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "mapinc.h"
22
23 static uint8 latche, latcheinit;
24 static uint16 addrreg0, addrreg1;
25 static void(*WSync)(void);
26
27 static DECLFW(LatchWrite)
28 {
29   latche=V;
30   WSync();
31 }
32
33 static void LatchPower(void)
34 {
35   latche=latcheinit;
36   WSync();
37   SetReadHandler(0x8000,0xFFFF,CartBR);
38   SetWriteHandler(addrreg0,addrreg1,LatchWrite);
39 }
40
41 static void StateRestore(int version)
42 {
43   WSync();
44 }
45
46 void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1)
47 {
48   latcheinit=init;
49   addrreg0=adr0;
50   addrreg1=adr1;
51   WSync=proc;
52   info->Power=LatchPower;
53   GameStateRestore=StateRestore;
54   AddExState(&latche, 1, 0, "LATC");
55 }
56
57 //------------------ CPROM ---------------------------
58
59 static void CPROMSync(void)
60 {
61   setchr4(0x0000,0);
62   setchr4(0x1000,latche&3);
63   setprg16(0x8000,0);
64   setprg16(0xC000,1);
65 }
66
67 void CPROM_Init(CartInfo *info)
68 {
69   Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF);
70 }
71
72 //------------------ CNROM ---------------------------
73
74 static void CNROMSync(void)
75 {
76   setchr8(latche&3);
77   setprg16(0x8000,0);
78   setprg16(0xC000,1);
79 }
80
81 void CNROM_Init(CartInfo *info)
82 {
83   Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF);
84 }
85
86 //------------------ ANROM ---------------------------
87
88 static void ANROMSync()
89 {
90   setprg32(0x8000,latche&0xf);
91   setmirror(MI_0+((latche>>4)&1));
92   setchr8(0);
93 }
94
95 void ANROM_Init(CartInfo *info)
96 {
97   Latch_Init(info, ANROMSync, 0, 0x8000, 0xFFFF);
98 }
99
100 //------------------ Map 70 ---------------------------
101
102 static void M70Sync()
103 {
104   setprg16(0x8000,latche>>4);
105   setprg16(0xc000,~0);
106   setchr8(latche&0xf);
107 }
108
109 void Mapper70_Init(CartInfo *info)
110 {
111   Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF);
112 }
113
114 //------------------ Map 152 ---------------------------
115
116 static void M152Sync()
117 {
118   setprg16(0x8000,(latche>>4)&7);
119   setprg16(0xc000,~0);
120   setchr8(latche&0xf);
121   setmirror(MI_0+((latche>>7)&1));         /* Saint Seiya...hmm. */
122 }
123
124 void Mapper152_Init(CartInfo *info)
125 {
126   Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF);
127 }
128
129 //------------------ Map 78 ---------------------------
130 /* Should be two separate emulation functions for this "mapper".  Sigh.  URGE TO KILL RISING. */
131 static void M78Sync()
132 {
133   setprg16(0x8000,(latche&7));
134   setprg16(0xc000,~0);
135   setchr8(latche>>4);
136   setmirror(MI_0+((latche>>3)&1));
137 }
138
139 void Mapper78_Init(CartInfo *info)
140 {
141   Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF);
142 }
143
144 //------------------ MHROM ---------------------------
145
146 static void MHROMSync(void)
147 {
148   setprg32(0x8000,latche>>4);
149   setchr8(latche&0xf);
150 }
151
152 void MHROM_Init(CartInfo *info)
153
154   Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF);
155 }
156
157 void Mapper140_Init(CartInfo *info)
158
159   Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF);
160 }
161
162 //------------------ Map 87 ---------------------------
163
164 static void M87Sync(void)
165 {
166   setprg16(0x8000,0);
167   setprg16(0xC000,1);
168   setchr8(latche>>1);
169 }
170
171 void Mapper87_Init(CartInfo *info)
172
173   Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF);
174 }
175
176 //------------------ Map 11 ---------------------------
177
178 static void M11Sync(void)
179 {
180   setprg32(0x8000,latche&0xf);
181   setchr8(latche>>4);
182 }
183
184 void Mapper11_Init(CartInfo *info)
185
186   Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF);
187 }
188
189 void Mapper144_Init(CartInfo *info)
190
191   Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF);
192 }
193
194 //------------------ UNROM ---------------------------
195
196 static void UNROMSync(void)
197 {
198   setprg16(0x8000,latche);
199   setprg16(0xc000,~0);
200   setchr8(0);
201 }
202
203 void UNROM_Init(CartInfo *info)
204 {
205   Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF);
206 }
207
208 //------------------ Map 93 ---------------------------
209
210 static void SSUNROMSync(void)
211 {
212   setprg16(0x8000,latche>>4);
213   setprg16(0xc000,~0);
214   setchr8(0);
215 }
216
217 void SUNSOFT_UNROM_Init(CartInfo *info)
218 {
219   Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF);
220 }
221
222 //------------------ Map 94 ---------------------------
223
224 static void M94Sync(void)
225 {
226   setprg16(0x8000,latche>>2);
227   setprg16(0xc000,~0);
228   setchr8(0);
229 }
230
231 void Mapper94_Init(CartInfo *info)
232 {
233   Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF);
234 }
235
236 //------------------ Map 107 ---------------------------
237
238 static void M107Sync(void)
239 {
240   setprg32(0x8000,(latche>>1)&3);
241   setchr8(latche&7);
242 }
243
244 void Mapper107_Init(CartInfo *info)
245 {
246   Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF);
247 }
248
249 //------------------ NROM ---------------------------
250
251 #ifdef DEBUG_MAPPER
252 static DECLFW(WriteHandler)
253 {
254  FCEU_printf("$%04x:$%02x\n",A,V);
255 }
256 #endif
257
258 static void NROMPower(void)
259 {
260   setprg16(0x8000,0);
261   setprg16(0xC000,~0);
262   setchr8(0);
263   SetReadHandler(0x8000,0xFFFF,CartBR);
264   #ifdef DEBUG_MAPPER
265   SetWriteHandler(0x4020,0xFFFF,WriteHandler);
266   #endif
267 }
268
269 void NROM_Init(CartInfo *info)
270 {
271   info->Power=NROMPower;
272 }