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 |
23 | static uint8 latche, latcheinit; |
24 | static uint16 addrreg0, addrreg1; |
25 | static void(*WSync)(void); |
d97315ac |
26 | |
e2d0dd92 |
27 | static DECLFW(LatchWrite) |
d97315ac |
28 | { |
e2d0dd92 |
29 | latche=V; |
30 | WSync(); |
d97315ac |
31 | } |
32 | |
e2d0dd92 |
33 | static 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 |
41 | static void StateRestore(int version) |
d97315ac |
42 | { |
e2d0dd92 |
43 | WSync(); |
d97315ac |
44 | } |
45 | |
e2d0dd92 |
46 | void 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 |
59 | static 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 |
67 | void CPROM_Init(CartInfo *info) |
d97315ac |
68 | { |
e2d0dd92 |
69 | Latch_Init(info, CPROMSync, 0, 0x8000, 0xFFFF); |
d97315ac |
70 | } |
71 | |
e2d0dd92 |
72 | //------------------ CNROM --------------------------- |
73 | |
74 | static void CNROMSync(void) |
d97315ac |
75 | { |
e2d0dd92 |
76 | setchr8(latche&3); |
77 | setprg16(0x8000,0); |
78 | setprg16(0xC000,1); |
d97315ac |
79 | } |
80 | |
81 | void CNROM_Init(CartInfo *info) |
82 | { |
e2d0dd92 |
83 | Latch_Init(info, CNROMSync, 0, 0x8000, 0xFFFF); |
d97315ac |
84 | } |
85 | |
e2d0dd92 |
86 | //------------------ ANROM --------------------------- |
d97315ac |
87 | |
e2d0dd92 |
88 | static 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 |
95 | void 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 |
102 | static void M70Sync() |
d97315ac |
103 | { |
e2d0dd92 |
104 | setprg16(0x8000,latche>>4); |
105 | setprg16(0xc000,~0); |
106 | setchr8(latche&0xf); |
d97315ac |
107 | } |
108 | |
e2d0dd92 |
109 | void 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 |
116 | static 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 |
124 | void 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. */ |
131 | static 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 | |
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); |
d97315ac |
150 | } |
151 | |
152 | void MHROM_Init(CartInfo *info) |
153 | { |
e2d0dd92 |
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); |
d97315ac |
192 | } |
193 | |
194 | //------------------ UNROM --------------------------- |
195 | |
e2d0dd92 |
196 | static void UNROMSync(void) |
d97315ac |
197 | { |
198 | setprg16(0x8000,latche); |
e2d0dd92 |
199 | setprg16(0xc000,~0); |
200 | setchr8(0); |
d97315ac |
201 | } |
202 | |
e2d0dd92 |
203 | void UNROM_Init(CartInfo *info) |
d97315ac |
204 | { |
e2d0dd92 |
205 | Latch_Init(info, UNROMSync, 0, 0x8000, 0xFFFF); |
d97315ac |
206 | } |
207 | |
e2d0dd92 |
208 | //------------------ Map 93 --------------------------- |
209 | |
210 | static void SSUNROMSync(void) |
d97315ac |
211 | { |
e2d0dd92 |
212 | setprg16(0x8000,latche>>4); |
d97315ac |
213 | setprg16(0xc000,~0); |
214 | setchr8(0); |
d97315ac |
215 | } |
216 | |
e2d0dd92 |
217 | void 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 |
224 | static void M94Sync(void) |
d97315ac |
225 | { |
e2d0dd92 |
226 | setprg16(0x8000,latche>>2); |
227 | setprg16(0xc000,~0); |
228 | setchr8(0); |
d97315ac |
229 | } |
230 | |
e2d0dd92 |
231 | void Mapper94_Init(CartInfo *info) |
d97315ac |
232 | { |
e2d0dd92 |
233 | Latch_Init(info, M94Sync, 0, 0x8000, 0xFFFF); |
d97315ac |
234 | } |
235 | |
e2d0dd92 |
236 | //------------------ Map 107 --------------------------- |
237 | |
238 | static void M107Sync(void) |
d97315ac |
239 | { |
e2d0dd92 |
240 | setprg32(0x8000,(latche>>1)&3); |
241 | setchr8(latche&7); |
d97315ac |
242 | } |
243 | |
e2d0dd92 |
244 | void Mapper107_Init(CartInfo *info) |
d97315ac |
245 | { |
e2d0dd92 |
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); |
d97315ac |
263 | SetReadHandler(0x8000,0xFFFF,CartBR); |
e2d0dd92 |
264 | #ifdef DEBUG_MAPPER |
265 | SetWriteHandler(0x4020,0xFFFF,WriteHandler); |
266 | #endif |
d97315ac |
267 | } |
268 | |
e2d0dd92 |
269 | void NROM_Init(CartInfo *info) |
d97315ac |
270 | { |
e2d0dd92 |
271 | info->Power=NROMPower; |
d97315ac |
272 | } |