mappers updated to 0.98.16
[fceu.git] / boards / datalatch.c
... / ...
CommitLineData
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
23static uint8 latche, latcheinit;
24static uint16 addrreg0, addrreg1;
25static void(*WSync)(void);
26
27static DECLFW(LatchWrite)
28{
29 latche=V;
30 WSync();
31}
32
33static void LatchPower(void)
34{
35 latche=latcheinit;
36 WSync();
37 SetReadHandler(0x8000,0xFFFF,CartBR);
38 SetWriteHandler(addrreg0,addrreg1,LatchWrite);
39}
40
41static void StateRestore(int version)
42{
43 WSync();
44}
45
46void 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
59static void CPROMSync(void)
60{
61 setchr4(0x0000,0);
62 setchr4(0x1000,latche&3);
63 setprg16(0x8000,0);
64 setprg16(0xC000,1);
65}
66
67void CPROM_Init(CartInfo *info)
68{
69 Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF);
70}
71
72//------------------ CNROM ---------------------------
73
74static void CNROMSync(void)
75{
76 setchr8(latche&3);
77 setprg16(0x8000,0);
78 setprg16(0xC000,1);
79}
80
81void CNROM_Init(CartInfo *info)
82{
83 Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF);
84}
85
86//------------------ ANROM ---------------------------
87
88static void ANROMSync()
89{
90 setprg32(0x8000,latche&0xf);
91 setmirror(MI_0+((latche>>4)&1));
92 setchr8(0);
93}
94
95void ANROM_Init(CartInfo *info)
96{
97 Latch_Init(info, ANROMSync, 0, 0x8000, 0xFFFF);
98}
99
100//------------------ Map 70 ---------------------------
101
102static void M70Sync()
103{
104 setprg16(0x8000,latche>>4);
105 setprg16(0xc000,~0);
106 setchr8(latche&0xf);
107}
108
109void Mapper70_Init(CartInfo *info)
110{
111 Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF);
112}
113
114//------------------ Map 152 ---------------------------
115
116static 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
124void 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. */
131static 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
139void Mapper78_Init(CartInfo *info)
140{
141 Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF);
142}
143
144//------------------ MHROM ---------------------------
145
146static void MHROMSync(void)
147{
148 setprg32(0x8000,latche>>4);
149 setchr8(latche&0xf);
150}
151
152void MHROM_Init(CartInfo *info)
153{
154 Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF);
155}
156
157void Mapper140_Init(CartInfo *info)
158{
159 Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF);
160}
161
162//------------------ Map 87 ---------------------------
163
164static void M87Sync(void)
165{
166 setprg16(0x8000,0);
167 setprg16(0xC000,1);
168 setchr8(latche>>1);
169}
170
171void Mapper87_Init(CartInfo *info)
172{
173 Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF);
174}
175
176//------------------ Map 11 ---------------------------
177
178static void M11Sync(void)
179{
180 setprg32(0x8000,latche&0xf);
181 setchr8(latche>>4);
182}
183
184void Mapper11_Init(CartInfo *info)
185{
186 Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF);
187}
188
189void Mapper144_Init(CartInfo *info)
190{
191 Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF);
192}
193
194//------------------ UNROM ---------------------------
195
196static void UNROMSync(void)
197{
198 setprg16(0x8000,latche);
199 setprg16(0xc000,~0);
200 setchr8(0);
201}
202
203void UNROM_Init(CartInfo *info)
204{
205 Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF);
206}
207
208//------------------ Map 93 ---------------------------
209
210static void SSUNROMSync(void)
211{
212 setprg16(0x8000,latche>>4);
213 setprg16(0xc000,~0);
214 setchr8(0);
215}
216
217void SUNSOFT_UNROM_Init(CartInfo *info)
218{
219 Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF);
220}
221
222//------------------ Map 94 ---------------------------
223
224static void M94Sync(void)
225{
226 setprg16(0x8000,latche>>2);
227 setprg16(0xc000,~0);
228 setchr8(0);
229}
230
231void Mapper94_Init(CartInfo *info)
232{
233 Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF);
234}
235
236//------------------ Map 107 ---------------------------
237
238static void M107Sync(void)
239{
240 setprg32(0x8000,(latche>>1)&3);
241 setchr8(latche&7);
242}
243
244void Mapper107_Init(CartInfo *info)
245{
246 Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF);
247}
248
249//------------------ NROM ---------------------------
250
251#ifdef DEBUG_MAPPER
252static DECLFW(WriteHandler)
253{
254 FCEU_printf("$%04x:$%02x\n",A,V);
255}
256#endif
257
258static 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
269void NROM_Init(CartInfo *info)
270{
271 info->Power=NROMPower;
272}