1 /* FCE Ultra - NES/Famicom Emulator
3 * Copyright notice for this file:
4 * Copyright (C) 2002 Xodnizel
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.
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.
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
23 static uint8 latche, latcheinit;
24 static uint16 addrreg0, addrreg1;
25 static void(*WSync)(void);
27 static DECLFW(LatchWrite)
33 static void LatchPower(void)
37 SetReadHandler(0x8000,0xFFFF,CartBR);
38 SetWriteHandler(addrreg0,addrreg1,LatchWrite);
41 static void StateRestore(int version)
46 void Latch_Init(CartInfo *info, void (*proc)(void), uint8 init, uint16 adr0, uint16 adr1)
52 info->Power=LatchPower;
53 GameStateRestore=StateRestore;
54 AddExState(&latche, 1, 0, "LATC");
57 //------------------ CPROM ---------------------------
59 static void CPROMSync(void)
62 setchr4(0x1000,latche&3);
67 void CPROM_Init(CartInfo *info)
69 Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF);
72 //------------------ CNROM ---------------------------
74 static void CNROMSync(void)
81 void CNROM_Init(CartInfo *info)
83 Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF);
86 //------------------ ANROM ---------------------------
88 static void ANROMSync()
90 setprg32(0x8000,latche&0xf);
91 setmirror(MI_0+((latche>>4)&1));
95 void ANROM_Init(CartInfo *info)
97 Latch_Init(info, ANROMSync, 0, 0x8000, 0xFFFF);
100 //------------------ Map 70 ---------------------------
102 static void M70Sync()
104 setprg16(0x8000,latche>>4);
109 void Mapper70_Init(CartInfo *info)
111 Latch_Init(info, M70Sync, 0, 0x8000, 0xFFFF);
114 //------------------ Map 152 ---------------------------
116 static void M152Sync()
118 setprg16(0x8000,(latche>>4)&7);
121 setmirror(MI_0+((latche>>7)&1)); /* Saint Seiya...hmm. */
124 void Mapper152_Init(CartInfo *info)
126 Latch_Init(info, M152Sync, 0, 0x8000, 0xFFFF);
129 //------------------ Map 78 ---------------------------
130 /* Should be two separate emulation functions for this "mapper". Sigh. URGE TO KILL RISING. */
131 static void M78Sync()
133 setprg16(0x8000,(latche&7));
136 setmirror(MI_0+((latche>>3)&1));
139 void Mapper78_Init(CartInfo *info)
141 Latch_Init(info, M78Sync, 0, 0x8000, 0xFFFF);
144 //------------------ MHROM ---------------------------
146 static void MHROMSync(void)
148 setprg32(0x8000,latche>>4);
152 void MHROM_Init(CartInfo *info)
154 Latch_Init(info, MHROMSync, 0, 0x8000, 0xFFFF);
157 void Mapper140_Init(CartInfo *info)
159 Latch_Init(info, MHROMSync, 0, 0x6000, 0x7FFF);
162 //------------------ Map 87 ---------------------------
164 static void M87Sync(void)
171 void Mapper87_Init(CartInfo *info)
173 Latch_Init(info, M87Sync, ~0, 0x6000, 0xFFFF);
176 //------------------ Map 11 ---------------------------
178 static void M11Sync(void)
180 setprg32(0x8000,latche&0xf);
184 void Mapper11_Init(CartInfo *info)
186 Latch_Init(info, M11Sync, 0, 0x8000, 0xFFFF);
189 void Mapper144_Init(CartInfo *info)
191 Latch_Init(info, M11Sync, 0, 0x8001, 0xFFFF);
194 //------------------ UNROM ---------------------------
196 static void UNROMSync(void)
198 setprg16(0x8000,latche);
203 void UNROM_Init(CartInfo *info)
205 Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF);
208 //------------------ Map 93 ---------------------------
210 static void SSUNROMSync(void)
212 setprg16(0x8000,latche>>4);
217 void SUNSOFT_UNROM_Init(CartInfo *info)
219 Latch_Init(info, SSUNROMSync, 0, 0x8000, 0xFFFF);
222 //------------------ Map 94 ---------------------------
224 static void M94Sync(void)
226 setprg16(0x8000,latche>>2);
231 void Mapper94_Init(CartInfo *info)
233 Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF);
236 //------------------ Map 107 ---------------------------
238 static void M107Sync(void)
240 setprg32(0x8000,(latche>>1)&3);
244 void Mapper107_Init(CartInfo *info)
246 Latch_Init(info, M107Sync, ~0, 0x8000, 0xFFFF);
249 //------------------ NROM ---------------------------
252 static DECLFW(WriteHandler)
254 FCEU_printf("$%04x:$%02x\n",A,V);
258 static void NROMPower(void)
263 SetReadHandler(0x8000,0xFFFF,CartBR);
265 SetWriteHandler(0x4020,0xFFFF,WriteHandler);
269 void NROM_Init(CartInfo *info)
271 info->Power=NROMPower;