mappers updated to 0.98.16
[fceu.git] / boards / datalatch.c
CommitLineData
d97315ac 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
e2d0dd92 23static uint8 latche, latcheinit;
24static uint16 addrreg0, addrreg1;
25static void(*WSync)(void);
d97315ac 26
e2d0dd92 27static DECLFW(LatchWrite)
d97315ac 28{
e2d0dd92 29 latche=V;
30 WSync();
d97315ac 31}
32
e2d0dd92 33static void LatchPower(void)
d97315ac 34{
e2d0dd92 35 latche=latcheinit;
36 WSync();
d97315ac 37 SetReadHandler(0x8000,0xFFFF,CartBR);
e2d0dd92 38 SetWriteHandler(addrreg0,addrreg1,LatchWrite);
d97315ac 39}
40
e2d0dd92 41static void StateRestore(int version)
d97315ac 42{
e2d0dd92 43 WSync();
d97315ac 44}
45
e2d0dd92 46void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1)
d97315ac 47{
e2d0dd92 48 latcheinit=init;
49 addrreg0=adr0;
50 addrreg1=adr1;
51 WSync=proc;
52 info->Power=LatchPower;
53 GameStateRestore=StateRestore;
d97315ac 54 AddExState(&latche, 1, 0, "LATC");
55}
56
e2d0dd92 57//------------------ CPROM ---------------------------
d97315ac 58
e2d0dd92 59static void CPROMSync(void)
d97315ac 60{
e2d0dd92 61 setchr4(0x0000,0);
62 setchr4(0x1000,latche&3);
63 setprg16(0x8000,0);
64 setprg16(0xC000,1);
d97315ac 65}
66
e2d0dd92 67void CPROM_Init(CartInfo *info)
d97315ac 68{
e2d0dd92 69 Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF);
d97315ac 70}
71
e2d0dd92 72//------------------ CNROM ---------------------------
73
74static void CNROMSync(void)
d97315ac 75{
e2d0dd92 76 setchr8(latche&3);
77 setprg16(0x8000,0);
78 setprg16(0xC000,1);
d97315ac 79}
80
81void CNROM_Init(CartInfo *info)
82{
e2d0dd92 83 Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF);
d97315ac 84}
85
e2d0dd92 86//------------------ ANROM ---------------------------
d97315ac 87
e2d0dd92 88static void ANROMSync()
d97315ac 89{
e2d0dd92 90 setprg32(0x8000,latche&0xf);
91 setmirror(MI_0+((latche>>4)&1));
d97315ac 92 setchr8(0);
d97315ac 93}
94
e2d0dd92 95void ANROM_Init(CartInfo *info)
d97315ac 96{
e2d0dd92 97 Latch_Init(info, ANROMSync, 0, 0x8000, 0xFFFF);
d97315ac 98}
99
e2d0dd92 100//------------------ Map 70 ---------------------------
d97315ac 101
e2d0dd92 102static void M70Sync()
d97315ac 103{
e2d0dd92 104 setprg16(0x8000,latche>>4);
105 setprg16(0xc000,~0);
106 setchr8(latche&0xf);
d97315ac 107}
108
e2d0dd92 109void Mapper70_Init(CartInfo *info)
d97315ac 110{
e2d0dd92 111 Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF);
d97315ac 112}
113
e2d0dd92 114//------------------ Map 152 ---------------------------
d97315ac 115
e2d0dd92 116static void M152Sync()
d97315ac 117{
e2d0dd92 118 setprg16(0x8000,(latche>>4)&7);
119 setprg16(0xc000,~0);
120 setchr8(latche&0xf);
121 setmirror(MI_0+((latche>>7)&1)); /* Saint Seiya...hmm. */
d97315ac 122}
123
e2d0dd92 124void Mapper152_Init(CartInfo *info)
d97315ac 125{
e2d0dd92 126 Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF);
d97315ac 127}
128
e2d0dd92 129//------------------ Map 78 ---------------------------
130/* Should be two separate emulation functions for this "mapper". Sigh. URGE TO KILL RISING. */
131static void M78Sync()
d97315ac 132{
e2d0dd92 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);
d97315ac 150}
151
152void MHROM_Init(CartInfo *info)
153{
e2d0dd92 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);
d97315ac 192}
193
194//------------------ UNROM ---------------------------
195
e2d0dd92 196static void UNROMSync(void)
d97315ac 197{
198 setprg16(0x8000,latche);
e2d0dd92 199 setprg16(0xc000,~0);
200 setchr8(0);
d97315ac 201}
202
e2d0dd92 203void UNROM_Init(CartInfo *info)
d97315ac 204{
e2d0dd92 205 Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF);
d97315ac 206}
207
e2d0dd92 208//------------------ Map 93 ---------------------------
209
210static void SSUNROMSync(void)
d97315ac 211{
e2d0dd92 212 setprg16(0x8000,latche>>4);
d97315ac 213 setprg16(0xc000,~0);
214 setchr8(0);
d97315ac 215}
216
e2d0dd92 217void SUNSOFT_UNROM_Init(CartInfo *info)
d97315ac 218{
e2d0dd92 219 Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF);
d97315ac 220}
221
e2d0dd92 222//------------------ Map 94 ---------------------------
d97315ac 223
e2d0dd92 224static void M94Sync(void)
d97315ac 225{
e2d0dd92 226 setprg16(0x8000,latche>>2);
227 setprg16(0xc000,~0);
228 setchr8(0);
d97315ac 229}
230
e2d0dd92 231void Mapper94_Init(CartInfo *info)
d97315ac 232{
e2d0dd92 233 Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF);
d97315ac 234}
235
e2d0dd92 236//------------------ Map 107 ---------------------------
237
238static void M107Sync(void)
d97315ac 239{
e2d0dd92 240 setprg32(0x8000,(latche>>1)&3);
241 setchr8(latche&7);
d97315ac 242}
243
e2d0dd92 244void Mapper107_Init(CartInfo *info)
d97315ac 245{
e2d0dd92 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);
d97315ac 263 SetReadHandler(0x8000,0xFFFF,CartBR);
e2d0dd92 264 #ifdef DEBUG_MAPPER
265 SetWriteHandler(0x4020,0xFFFF,WriteHandler);
266 #endif
d97315ac 267}
268
e2d0dd92 269void NROM_Init(CartInfo *info)
d97315ac 270{
e2d0dd92 271 info->Power=NROMPower;
d97315ac 272}