1 #include "driver.h"
2 #include <time.h>
3
4 //static unsigned char *memcard;
5 unsigned char *neogeo_ram;
6 unsigned char *neogeo_sram;
7
8 static int sram_locked;
9 static int sram_protection_hack;
10
11 extern int neogeo_has_trackball;
12 extern int neogeo_irq2type;
13
14
15 /* MARTINEZ.F 990209 Calendar */
16 extern int seconds;
17 extern int minutes;
18 extern int hours;
19 extern int days;
20 extern int month;
21 extern int year;
22 extern int weekday;
23 /* MARTINEZ.F 990209 Calendar End */
24
25 /***************** MEMCARD GLOBAL VARIABLES ******************/
26 int mcd_action=0;
27 int mcd_number=0;
28 int memcard_status=0; /* 1=Inserted 0=No card */
29 int memcard_number=0; /* 000...999, -1=None */
30 int memcard_manager=0; /* 0=Normal boot 1=Call memcard manager */
31 unsigned char *neogeo_memcard; /* Pointer to 2kb RAM zone */
32
33 /*************** MEMCARD FUNCTION PROTOTYPES *****************/
34 READ_HANDLER( neogeo_memcard_r );
35 WRITE_HANDLER( neogeo_memcard_w );
36 int neogeo_memcard_load(int);
37 void neogeo_memcard_save(void);
38 void neogeo_memcard_eject(void);
39 int neogeo_memcard_create(int);
40
41
42
43 static void neogeo_custom_memory(void);
44
45
46 /* This function is called on every reset */
neogeo_init_machine(void)47 void neogeo_init_machine(void)
48 {
49 int src,res;
50 time_t ltime;
51 struct tm *today;
52
53
54 /* Reset variables & RAM */
55 memset (neogeo_ram, 0, 0x10000);
56
57 /* Set up machine country */
58 src = readinputport(5);
59 res = src&0x3;
60
61 /* Console/arcade mode */
62 if (src & 0x04) res |= 0x8000;
63
64 /* write the ID in the system BIOS ROM */
65 WRITE_WORD(&memory_region(REGION_USER1)[0x0400],res);
66
67 if (memcard_manager==1)
68 {
69 memcard_manager=0;
70 WRITE_WORD(&memory_region(REGION_USER1)[0x11b1a], 0x500a);
71 }
72 else
73 {
74 WRITE_WORD(&memory_region(REGION_USER1)[0x11b1a],0x1b6a);
75 }
76
77 time(<ime);
78 today = localtime(<ime);
79
80 seconds = ((today->tm_sec/10)<<4) + (today->tm_sec%10);
81 minutes = ((today->tm_min/10)<<4) + (today->tm_min%10);
82 hours = ((today->tm_hour/10)<<4) + (today->tm_hour%10);
83 days = ((today->tm_mday/10)<<4) + (today->tm_mday%10);
84 month = (today->tm_mon + 1);
85 year = ((today->tm_year/10)<<4) + (today->tm_year%10);
86 weekday = today->tm_wday;
87 }
88
89
90 /* This function is only called once per game. */
init_neogeo(void)91 void init_neogeo(void)
92 {
93 unsigned char *RAM = memory_region(REGION_CPU1);
94 extern struct YM2610interface neogeo_ym2610_interface;
95
96 if (memory_region(REGION_SOUND2))
97 {
98 //logerror("using memory region %d for Delta T samples\n",REGION_SOUND2);
99 neogeo_ym2610_interface.pcmromb[0] = REGION_SOUND2;
100 }
101 else
102 {
103 //logerror("using memory region %d for Delta T samples\n",REGION_SOUND1);
104 neogeo_ym2610_interface.pcmromb[0] = REGION_SOUND1;
105 }
106
107 /* Allocate ram banks */
108 neogeo_ram = (unsigned char*)malloc(0x10000);
109 cpu_setbank(1, neogeo_ram);
110
111 /* Set the biosbank */
112 cpu_setbank(3, memory_region(REGION_USER1));
113
114 /* Set the 2nd ROM bank */
115 RAM = memory_region(REGION_CPU1);
116 if (memory_region_length(REGION_CPU1) > 0x100000)
117 {
118 cpu_setbank(4, &RAM[0x100000]);
119 }
120 else
121 {
122 cpu_setbank(4, &RAM[0]);
123 }
124
125 /* Set the sound CPU ROM banks */
126 RAM = memory_region(REGION_CPU2);
127 cpu_setbank(5,&RAM[0x08000]);
128 cpu_setbank(6,&RAM[0x0c000]);
129 cpu_setbank(7,&RAM[0x0e000]);
130 cpu_setbank(8,&RAM[0x0f000]);
131
132 /* Allocate and point to the memcard - bank 5 */
133 neogeo_memcard = (unsigned char*)calloc(0x800, 1);
134 memcard_status=0;
135 memcard_number=0;
136
137
138 RAM = memory_region(REGION_USER1);
139
140 if (READ_WORD(&RAM[0x11b00]) == 0x4eba)
141 {
142 /* standard bios */
143 neogeo_has_trackball = 0;
144
145 /* Remove memory check for now */
146 WRITE_WORD(&RAM[0x11b00],0x4e71);
147 WRITE_WORD(&RAM[0x11b02],0x4e71);
148 WRITE_WORD(&RAM[0x11b16],0x4ef9);
149 WRITE_WORD(&RAM[0x11b18],0x00c1);
150 WRITE_WORD(&RAM[0x11b1a],0x1b6a);
151
152 /* Patch bios rom, for Calendar errors */
153 WRITE_WORD(&RAM[0x11c14],0x4e71);
154 WRITE_WORD(&RAM[0x11c16],0x4e71);
155 WRITE_WORD(&RAM[0x11c1c],0x4e71);
156 WRITE_WORD(&RAM[0x11c1e],0x4e71);
157
158 /* Rom internal checksum fails for now.. */
159 WRITE_WORD(&RAM[0x11c62],0x4e71);
160 WRITE_WORD(&RAM[0x11c64],0x4e71);
161 }
162 else
163 {
164 /* special bios with trackball support */
165 neogeo_has_trackball = 1;
166
167 /* TODO: check the memcard manager patch in neogeo_init_machine(), */
168 /* it probably has to be moved as well */
169
170 /* Remove memory check for now */
171 WRITE_WORD(&RAM[0x10c2a],0x4e71);
172 WRITE_WORD(&RAM[0x10c2c],0x4e71);
173 WRITE_WORD(&RAM[0x10c40],0x4ef9);
174 WRITE_WORD(&RAM[0x10c42],0x00c1);
175 WRITE_WORD(&RAM[0x10c44],0x0c94);
176
177 /* Patch bios rom, for Calendar errors */
178 WRITE_WORD(&RAM[0x10d3e],0x4e71);
179 WRITE_WORD(&RAM[0x10d40],0x4e71);
180 WRITE_WORD(&RAM[0x10d46],0x4e71);
181 WRITE_WORD(&RAM[0x10d48],0x4e71);
182
183 /* Rom internal checksum fails for now.. */
184 WRITE_WORD(&RAM[0x10d8c],0x4e71);
185 WRITE_WORD(&RAM[0x10d8e],0x4e71);
186 }
187
188 /* Install custom memory handlers */
189 neogeo_custom_memory();
190
191
192 /* Flag how to handle IRQ2 raster effect */
193 /* 0=write 0,2 1=write2,0 */
194 if (!strcmp(Machine->gamedrv->name,"neocup98") ||
195 !strcmp(Machine->gamedrv->name,"ssideki3") ||
196 !strcmp(Machine->gamedrv->name,"ssideki4"))
197 neogeo_irq2type = 1;
198 }
199
200 /******************************************************************************/
201
202 /*static READ_HANDLER( bios_cycle_skip_r )
203 {
204 cpu_spinuntil_int();
205 return 0;
206 }*/
207
208 /******************************************************************************/
209 /* Routines to speed up the main processor */
210 /******************************************************************************/
211 #define NEO_CYCLE_R(name,pc,hit,other) static READ_HANDLER( name##_cycle_r ) { if (cpu_get_pc()==pc) {cpu_spinuntil_int(); return hit;} return other;}
212 #define NEO_CYCLE_RX(name,pc,hit,other,xxx) static READ_HANDLER( name##_cycle_r ) { if (cpu_get_pc()==pc) {if(other==xxx) cpu_spinuntil_int(); return hit;} return other;}
213
214 NEO_CYCLE_R(puzzledp,0x12f2,1, READ_WORD(&neogeo_ram[0x0000]))
215 NEO_CYCLE_R(samsho4, 0xaffc,0, READ_WORD(&neogeo_ram[0x830c]))
216 NEO_CYCLE_R(karnovr, 0x5b56,0, READ_WORD(&neogeo_ram[0x3466]))
217 NEO_CYCLE_R(wjammers,0x1362e,READ_WORD(&neogeo_ram[0x5a])&0x7fff,READ_WORD(&neogeo_ram[0x005a]))
218 NEO_CYCLE_R(strhoops,0x029a,0, READ_WORD(&neogeo_ram[0x1200]))
219 //NEO_CYCLE_R(magdrop3,0xa378,READ_WORD(&neogeo_ram[0x60])&0x7fff,READ_WORD(&neogeo_ram[0x0060]))
220 NEO_CYCLE_R(neobombe,0x09f2,0xffff, READ_WORD(&neogeo_ram[0x448c]))
221 NEO_CYCLE_R(trally, 0x1295c,READ_WORD(&neogeo_ram[0x206])-1,READ_WORD(&neogeo_ram[0x0206]))
222 //NEO_CYCLE_R(joyjoy, 0x122c,0xffff, READ_WORD(&neogeo_ram[0x0554]))
223 NEO_CYCLE_RX(blazstar,0x3b62,0xffff, READ_WORD(&neogeo_ram[0x1000]),0)
224 //NEO_CYCLE_R(ridhero, 0xedb0,0, READ_WORD(&neogeo_ram[0x00ca]))
225 NEO_CYCLE_R(cyberlip,0x2218,0x0f0f, READ_WORD(&neogeo_ram[0x7bb4]))
226 NEO_CYCLE_R(lbowling,0x37b0,0, READ_WORD(&neogeo_ram[0x0098]))
227 NEO_CYCLE_R(superspy,0x07ca,0xffff, READ_WORD(&neogeo_ram[0x108c]))
228 NEO_CYCLE_R(ttbb, 0x0a58,0xffff, READ_WORD(&neogeo_ram[0x000e]))
229 NEO_CYCLE_R(alpham2,0x076e,0xffff, READ_WORD(&neogeo_ram[0xe2fe]))
230 NEO_CYCLE_R(eightman,0x12fa,0xffff, READ_WORD(&neogeo_ram[0x046e]))
231 NEO_CYCLE_R(roboarmy,0x08e8,0, READ_WORD(&neogeo_ram[0x4010]))
232 NEO_CYCLE_R(fatfury1,0x133c,0, READ_WORD(&neogeo_ram[0x4282]))
233 NEO_CYCLE_R(burningf,0x0736,0xffff, READ_WORD(&neogeo_ram[0x000e]))
234 NEO_CYCLE_R(bstars, 0x133c,0, READ_WORD(&neogeo_ram[0x000a]))
235 NEO_CYCLE_R(kotm, 0x1284,0, READ_WORD(&neogeo_ram[0x0020]))
236 NEO_CYCLE_R(gpilots, 0x0474,0, READ_WORD(&neogeo_ram[0xa682]))
237 NEO_CYCLE_R(lresort, 0x256a,0, READ_WORD(&neogeo_ram[0x4102]))
238 NEO_CYCLE_R(fbfrenzy,0x07dc,0, READ_WORD(&neogeo_ram[0x0020]))
239 NEO_CYCLE_R(socbrawl,0xa8dc,0xffff, READ_WORD(&neogeo_ram[0xb20c]))
240 NEO_CYCLE_R(mutnat, 0x1456,0, READ_WORD(&neogeo_ram[0x1042]))
241 NEO_CYCLE_R(aof, 0x6798,0, READ_WORD(&neogeo_ram[0x8100]))
242 //NEO_CYCLE_R(countb, 0x16a2,0, READ_WORD(&neogeo_ram[0x8002]))
243 NEO_CYCLE_R(ncombat, 0xcb3e,0, READ_WORD(&neogeo_ram[0x0206]))
244 NEO_CYCLE_R(sengoku, 0x12f4,0, READ_WORD(&neogeo_ram[0x0088]))
245 //NEO_CYCLE_R(ncommand,0x11b44,0, READ_WORD(&neogeo_ram[0x8206]))
246 NEO_CYCLE_R(wh1, 0xf62d4,0xffff, READ_WORD(&neogeo_ram[0x8206]))
247 NEO_CYCLE_R(androdun,0x26d6,0xffff, READ_WORD(&neogeo_ram[0x0080]))
248 NEO_CYCLE_R(bjourney,0xe8aa,READ_WORD(&neogeo_ram[0x206])+1,READ_WORD(&neogeo_ram[0x0206]))
249 NEO_CYCLE_R(maglord, 0xb16a,READ_WORD(&neogeo_ram[0x206])+1,READ_WORD(&neogeo_ram[0x0206]))
250 //NEO_CYCLE_R(janshin, 0x06a0,0, READ_WORD(&neogeo_ram[0x0026]))
251 NEO_CYCLE_RX(pulstar, 0x2052,0xffff, READ_WORD(&neogeo_ram[0x1000]),0)
252 //NEO_CYCLE_R(mslug ,0x200a,0xffff, READ_WORD(&neogeo_ram[0x6ed8]))
253 NEO_CYCLE_R(neodrift,0x0b76,0xffff, READ_WORD(&neogeo_ram[0x0424]))
254 NEO_CYCLE_R(spinmast,0x00f6,READ_WORD(&neogeo_ram[0xf0])+1, READ_WORD(&neogeo_ram[0x00f0]))
255 NEO_CYCLE_R(sonicwi2,0x1e6c8,0xffff, READ_WORD(&neogeo_ram[0xe5b6]))
256 NEO_CYCLE_R(sonicwi3,0x20bac,0xffff, READ_WORD(&neogeo_ram[0xea2e]))
257 NEO_CYCLE_R(goalx3, 0x5298,READ_WORD(&neogeo_ram[0x6])+1, READ_WORD(&neogeo_ram[0x0006]))
258 //NEO_CYCLE_R(turfmast,0xd5a8,0xffff, READ_WORD(&neogeo_ram[0x2e54]))
259 NEO_CYCLE_R(kabukikl,0x10b0,0, READ_WORD(&neogeo_ram[0x428a]))
260 NEO_CYCLE_R(panicbom,0x3ee6,0xffff, READ_WORD(&neogeo_ram[0x009c]))
261 NEO_CYCLE_R(wh2, 0x2063fc,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
262 NEO_CYCLE_R(wh2j, 0x109f4,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
263 NEO_CYCLE_R(aodk, 0xea62,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
264 NEO_CYCLE_R(whp, 0xeace,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
265 NEO_CYCLE_R(overtop, 0x1736,READ_WORD(&neogeo_ram[0x8202])+1,READ_WORD(&neogeo_ram[0x8202]))
266 NEO_CYCLE_R(twinspri,0x492e,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
267 NEO_CYCLE_R(stakwin, 0x0596,0xffff, READ_WORD(&neogeo_ram[0x0b92]))
268 NEO_CYCLE_R(shocktro,0xdd28,0, READ_WORD(&neogeo_ram[0x8344]))
269 NEO_CYCLE_R(tws96, 0x17f4,0xffff, READ_WORD(&neogeo_ram[0x010e]))
270 //static READ_HANDLER( zedblade_cycle_r )
271 //{
272 // int pc=cpu_get_pc();
273 // if (pc==0xa2fa || pc==0xa2a0 || pc==0xa2ce || pc==0xa396 || pc==0xa3fa) {cpu_spinuntil_int(); return 0;}
274 // return READ_WORD(&neogeo_ram[0x9004]);
275 //}
276 //NEO_CYCLE_R(doubledr,0x3574,0, READ_WORD(&neogeo_ram[0x1c30]))
277 NEO_CYCLE_R(galaxyfg,0x09ea,READ_WORD(&neogeo_ram[0x1858])+1,READ_WORD(&neogeo_ram[0x1858]))
278 NEO_CYCLE_R(wakuwak7,0x1a3c,READ_WORD(&neogeo_ram[0x0bd4])+1,READ_WORD(&neogeo_ram[0x0bd4]))
READ_HANDLER(mahretsu_cycle_r)279 static READ_HANDLER( mahretsu_cycle_r )
280 {
281 int pc=cpu_get_pc();
282 if (pc==0x1580 || pc==0xf3ba ) {cpu_spinuntil_int(); return 0;}
283 return READ_WORD(&neogeo_ram[0x13b2]);
284 }
285 NEO_CYCLE_R(nam1975, 0x0a1c,0xffff, READ_WORD(&neogeo_ram[0x12e0]))
286 NEO_CYCLE_R(tpgolf, 0x105c,0, READ_WORD(&neogeo_ram[0x00a4]))
287 NEO_CYCLE_R(legendos,0x1864,0xffff, READ_WORD(&neogeo_ram[0x0002]))
288 //NEO_CYCLE_R(viewpoin,0x0c16,0, READ_WORD(&neogeo_ram[0x1216]))
289 NEO_CYCLE_R(fatfury2,0x10ea,0, READ_WORD(&neogeo_ram[0x418c]))
290 NEO_CYCLE_R(bstars2, 0x7e30,0xffff, READ_WORD(&neogeo_ram[0x001c]))
291 NEO_CYCLE_R(ssideki, 0x20b0,0xffff, READ_WORD(&neogeo_ram[0x8c84]))
292 NEO_CYCLE_R(kotm2, 0x045a,0, READ_WORD(&neogeo_ram[0x1000]))
READ_HANDLER(samsho_cycle_r)293 static READ_HANDLER( samsho_cycle_r )
294 {
295 int pc=cpu_get_pc();
296 if (pc==0x3580 || pc==0x0f84 ) {cpu_spinuntil_int(); return 0xffff;}
297 return READ_WORD(&neogeo_ram[0x0a76]);
298 }
299 NEO_CYCLE_R(fatfursp,0x10da,0, READ_WORD(&neogeo_ram[0x418c]))
300 NEO_CYCLE_R(fatfury3,0x9c50,0, READ_WORD(&neogeo_ram[0x418c]))
301 NEO_CYCLE_R(tophuntr,0x0ce0,0xffff, READ_WORD(&neogeo_ram[0x008e]))
302 NEO_CYCLE_R(savagere,0x056e,0, READ_WORD(&neogeo_ram[0x8404]))
303 NEO_CYCLE_R(aof2, 0x8c74,0, READ_WORD(&neogeo_ram[0x8280]))
304 //NEO_CYCLE_R(ssideki2,0x7850,0xffff, READ_WORD(&neogeo_ram[0x4292]))
305 NEO_CYCLE_R(samsho2, 0x1432,0xffff, READ_WORD(&neogeo_ram[0x0a30]))
306 NEO_CYCLE_R(samsho3, 0x0858,0, READ_WORD(&neogeo_ram[0x8408]))
307 NEO_CYCLE_R(kof95, 0x39474,0xffff, READ_WORD(&neogeo_ram[0xa784]))
308 NEO_CYCLE_R(rbff1, 0x80a2,0, READ_WORD(&neogeo_ram[0x418c]))
309 //NEO_CYCLE_R(aof3, 0x15d6,0, READ_WORD(&neogeo_ram[0x4ee8]))
310 NEO_CYCLE_R(ninjamas,0x2436,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
311 NEO_CYCLE_R(kof96, 0x8fc4,0xffff, READ_WORD(&neogeo_ram[0xa782]))
312 NEO_CYCLE_R(rbffspec,0x8704,0, READ_WORD(&neogeo_ram[0x418c]))
313 NEO_CYCLE_R(kizuna, 0x0840,0, READ_WORD(&neogeo_ram[0x8808]))
314 NEO_CYCLE_R(kof97, 0x9c54,0xffff, READ_WORD(&neogeo_ram[0xa784]))
315 //NEO_CYCLE_R(mslug2, 0x1656,0xffff, READ_WORD(&neogeo_ram[0x008c]))
316 NEO_CYCLE_R(rbff2, 0xc5d0,0, READ_WORD(&neogeo_ram[0x418c]))
317 NEO_CYCLE_R(ragnagrd,0xc6c0,0, READ_WORD(&neogeo_ram[0x0042]))
318 NEO_CYCLE_R(lastblad,0x1868,0xffff, READ_WORD(&neogeo_ram[0x9d4e]))
319 NEO_CYCLE_R(gururin, 0x0604,0xffff, READ_WORD(&neogeo_ram[0x1002]))
320 //NEO_CYCLE_R(magdrop2,0x1cf3a,0, READ_WORD(&neogeo_ram[0x0064]))
321 //NEO_CYCLE_R(miexchng,0x,,READ_WORD(&neogeo_ram[0x]))
322
323 NEO_CYCLE_R(kof98, 0xa146,0xfff, READ_WORD(&neogeo_ram[0xa784]))
324 NEO_CYCLE_R(marukodq,0x070e,0, READ_WORD(&neogeo_ram[0x0210]))
READ_HANDLER(minasan_cycle_r)325 static READ_HANDLER( minasan_cycle_r )
326 {
327 int mem;
328 if (cpu_get_pc()==0x17766)
329 {
330 cpu_spinuntil_int();
331 mem=READ_WORD(&neogeo_ram[0x00ca]);
332 mem--;
333 WRITE_WORD(&neogeo_ram[0x00ca],mem);
334 return mem;
335 }
336 return READ_WORD(&neogeo_ram[0x00ca]);
337 }
338 NEO_CYCLE_R(stakwin2,0x0b8c,0, READ_WORD(&neogeo_ram[0x0002]))
READ_HANDLER(bakatono_cycle_r)339 static READ_HANDLER( bakatono_cycle_r )
340 {
341 int mem;
342 if (cpu_get_pc()==0x197cc)
343 {
344 cpu_spinuntil_int();
345 mem=READ_WORD(&neogeo_ram[0x00fa]);
346 mem--;
347 WRITE_WORD(&neogeo_ram[0x00fa],mem);
348 return mem;
349 }
350 return READ_WORD(&neogeo_ram[0x00fa]);
351 }
352 NEO_CYCLE_R(quizkof,0x0450,0, READ_WORD(&neogeo_ram[0x4464]))
353 NEO_CYCLE_R(quizdais, 0x0730,0, READ_WORD(&neogeo_ram[0x59f2]))
354 NEO_CYCLE_R(quizdai2, 0x1afa,0xffff, READ_WORD(&neogeo_ram[0x0960]))
355 NEO_CYCLE_R(popbounc, 0x1196,0xffff, READ_WORD(&neogeo_ram[0x1008]))
356 NEO_CYCLE_R(sdodgeb, 0xc22e,0, READ_WORD(&neogeo_ram[0x1104]))
357 NEO_CYCLE_R(shocktr2, 0xf410,0, READ_WORD(&neogeo_ram[0x8348]))
358 NEO_CYCLE_R(figfever, 0x20c60,0, READ_WORD(&neogeo_ram[0x8100]))
359 NEO_CYCLE_R(irrmaze, 0x104e,0, READ_WORD(&neogeo_ram[0x4b6e]))
360
361 /******************************************************************************/
362 /* Routines to speed up the sound processor AVDB 24-10-1998 */
363 /******************************************************************************/
364
365 /*
366 * Sound V3.0
367 *
368 * Used by puzzle de pon and Super Sidekicks 2
369 *
370 */
READ_HANDLER(cycle_v3_sr)371 static READ_HANDLER( cycle_v3_sr )
372 {
373 unsigned char *RAM = memory_region(REGION_CPU2);
374
375 if (cpu_get_pc()==0x0137) {
376 cpu_spinuntil_int();
377 return RAM[0xfeb1];
378 }
379 return RAM[0xfeb1];
380 }
381
382 /*
383 * Also sound revision no 3.0, but different types.
384 */
READ_HANDLER(ssideki_cycle_sr)385 static READ_HANDLER( ssideki_cycle_sr )
386 {
387 unsigned char *RAM = memory_region(REGION_CPU2);
388
389 if (cpu_get_pc()==0x015A) {
390 cpu_spinuntil_int();
391 return RAM[0xfef3];
392 }
393 return RAM[0xfef3];
394 }
395
READ_HANDLER(aof_cycle_sr)396 static READ_HANDLER( aof_cycle_sr )
397 {
398 unsigned char *RAM = memory_region(REGION_CPU2);
399
400 if (cpu_get_pc()==0x0143) {
401 cpu_spinuntil_int();
402 return RAM[0xfef3];
403 }
404 return RAM[0xfef3];
405 }
406
407 /*
408 * Sound V2.0
409 *
410 * Used by puzzle Bobble and Goal Goal Goal
411 *
412 */
413
READ_HANDLER(cycle_v2_sr)414 static READ_HANDLER( cycle_v2_sr )
415 {
416 unsigned char *RAM = memory_region(REGION_CPU2);
417
418 if (cpu_get_pc()==0x0143) {
419 cpu_spinuntil_int();
420 return RAM[0xfeef];
421 }
422 return RAM[0xfeef];
423 }
424
READ_HANDLER(vwpoint_cycle_sr)425 static READ_HANDLER( vwpoint_cycle_sr )
426 {
427 unsigned char *RAM = memory_region(REGION_CPU2);
428
429 if (cpu_get_pc()==0x0143) {
430 cpu_spinuntil_int();
431 return RAM[0xfe46];
432 }
433 return RAM[0xfe46];
434 }
435
436 /*
437 * Sound revision no 1.5, and some 2.0 versions,
438 * are not fit for speedups, it results in sound drops !
439 * Games that use this one are : Ghost Pilots, Joy Joy, Nam 1975
440 */
441
442 /*
443 static READ_HANDLER( cycle_v15_sr )
444 {
445 unsigned char *RAM = memory_region(REGION_CPU2);
446
447 if (cpu_get_pc()==0x013D) {
448 cpu_spinuntil_int();
449 return RAM[0xfe46];
450 }
451 return RAM[0xfe46];
452 }
453 */
454
455 /*
456 * Magician Lord uses a different sound core from all other
457 * Neo Geo Games.
458 */
459
READ_HANDLER(maglord_cycle_sr)460 static READ_HANDLER( maglord_cycle_sr )
461 {
462 unsigned char *RAM = memory_region(REGION_CPU2);
463
464 if (cpu_get_pc()==0xd487) {
465 cpu_spinuntil_int();
466 return RAM[0xfb91];
467 }
468 return RAM[0xfb91];
469 }
470
471 /******************************************************************************/
472
473 static int prot_data;
474
READ_HANDLER(fatfury2_protection_r)475 static READ_HANDLER( fatfury2_protection_r )
476 {
477 int res = (prot_data >> 24) & 0xff;
478
479 switch (offset)
480 {
481 case 0x55550:
482 case 0xffff0:
483 case 0x00000:
484 case 0xff000:
485 case 0x36000:
486 case 0x36008:
487 return res;
488
489 case 0x36004:
490 case 0x3600c:
491 return ((res & 0xf0) >> 4) | ((res & 0x0f) << 4);
492
493 default:
494 //logerror("unknown protection read at pc %06x, offset %08x\n",cpu_get_pc(),offset);
495 return 0;
496 }
497 }
498
WRITE_HANDLER(fatfury2_protection_w)499 static WRITE_HANDLER( fatfury2_protection_w )
500 {
501 switch (offset)
502 {
503 case 0x55552: /* data == 0x5555; read back from 55550, ffff0, 00000, ff000 */
504 prot_data = 0xff00ff00;
505 break;
506
507 case 0x56782: /* data == 0x1234; read back from 36000 *or* 36004 */
508 prot_data = 0xf05a3601;
509 break;
510
511 case 0x42812: /* data == 0x1824; read back from 36008 *or* 3600c */
512 prot_data = 0x81422418;
513 break;
514
515 case 0x55550:
516 case 0xffff0:
517 case 0xff000:
518 case 0x36000:
519 case 0x36004:
520 case 0x36008:
521 case 0x3600c:
522 prot_data <<= 8;
523 break;
524
525 default:
526 //logerror("unknown protection write at pc %06x, offset %08x, data %02x\n",cpu_get_pc(),offset,data);
527 break;
528 }
529 }
530
READ_HANDLER(popbounc_sfix_r)531 static READ_HANDLER( popbounc_sfix_r )
532 {
533 if (cpu_get_pc()==0x6b10) {return 0;}
534 return READ_WORD(&neogeo_ram[0x4fbc]);
535 }
536
neogeo_custom_memory(void)537 static void neogeo_custom_memory(void)
538 {
539 /* NeoGeo intro screen cycle skip, used by all games */
540 // install_mem_read_handler(0, 0x10fe8c, 0x10fe8d, bios_cycle_skip_r);
541
542 /* Individual games can go here... */
543
544 #if 1
545 // if (!strcmp(Machine->gamedrv->name,"joyjoy")) install_mem_read_handler(0, 0x100554, 0x100555, joyjoy_cycle_r); // Slower
546 // if (!strcmp(Machine->gamedrv->name,"ridhero")) install_mem_read_handler(0, 0x1000ca, 0x1000cb, ridhero_cycle_r);
547 if (!strcmp(Machine->gamedrv->name,"bstars")) install_mem_read_handler(0, 0x10000a, 0x10000b, bstars_cycle_r);
548 if (!strcmp(Machine->gamedrv->name,"cyberlip")) install_mem_read_handler(0, 0x107bb4, 0x107bb4, cyberlip_cycle_r);
549 if (!strcmp(Machine->gamedrv->name,"lbowling")) install_mem_read_handler(0, 0x100098, 0x100099, lbowling_cycle_r);
550 if (!strcmp(Machine->gamedrv->name,"superspy")) install_mem_read_handler(0, 0x10108c, 0x10108d, superspy_cycle_r);
551 if (!strcmp(Machine->gamedrv->name,"ttbb")) install_mem_read_handler(0, 0x10000e, 0x10000f, ttbb_cycle_r);
552 if (!strcmp(Machine->gamedrv->name,"alpham2")) install_mem_read_handler(0, 0x10e2fe, 0x10e2ff, alpham2_cycle_r); // Very little increase.
553 if (!strcmp(Machine->gamedrv->name,"eightman")) install_mem_read_handler(0, 0x10046e, 0x10046f, eightman_cycle_r);
554 if (!strcmp(Machine->gamedrv->name,"roboarmy")) install_mem_read_handler(0, 0x104010, 0x104011, roboarmy_cycle_r);
555 if (!strcmp(Machine->gamedrv->name,"fatfury1")) install_mem_read_handler(0, 0x104282, 0x104283, fatfury1_cycle_r);
556 if (!strcmp(Machine->gamedrv->name,"burningf")) install_mem_read_handler(0, 0x10000e, 0x10000f, burningf_cycle_r);
557 if (!strcmp(Machine->gamedrv->name,"kotm")) install_mem_read_handler(0, 0x100020, 0x100021, kotm_cycle_r);
558 if (!strcmp(Machine->gamedrv->name,"gpilots")) install_mem_read_handler(0, 0x10a682, 0x10a683, gpilots_cycle_r);
559 if (!strcmp(Machine->gamedrv->name,"lresort")) install_mem_read_handler(0, 0x104102, 0x104103, lresort_cycle_r);
560 if (!strcmp(Machine->gamedrv->name,"fbfrenzy")) install_mem_read_handler(0, 0x100020, 0x100021, fbfrenzy_cycle_r);
561 if (!strcmp(Machine->gamedrv->name,"socbrawl")) install_mem_read_handler(0, 0x10b20c, 0x10b20d, socbrawl_cycle_r);
562 if (!strcmp(Machine->gamedrv->name,"mutnat")) install_mem_read_handler(0, 0x101042, 0x101043, mutnat_cycle_r);
563 if (!strcmp(Machine->gamedrv->name,"aof")) install_mem_read_handler(0, 0x108100, 0x108101, aof_cycle_r);
564 // if (!strcmp(Machine->gamedrv->name,"countb")) install_mem_read_handler(0, 0x108002, 0x108003, countb_cycle_r); // doesn't seem to speed it up.
565 if (!strcmp(Machine->gamedrv->name,"ncombat")) install_mem_read_handler(0, 0x100206, 0x100207, ncombat_cycle_r);
566 //** if (!strcmp(Machine->gamedrv->name,"crsword")) install_mem_read_handler(0, 0x10, 0x10, crsword_cycle_r); // Can't find this one :-(
567 if (!strcmp(Machine->gamedrv->name,"trally")) install_mem_read_handler(0, 0x100206, 0x100207, trally_cycle_r);
568 if (!strcmp(Machine->gamedrv->name,"sengoku")) install_mem_read_handler(0, 0x100088, 0x100089, sengoku_cycle_r);
569 // if (!strcmp(Machine->gamedrv->name,"ncommand")) install_mem_read_handler(0, 0x108206, 0x108207, ncommand_cycle_r); // Slower
570 if (!strcmp(Machine->gamedrv->name,"wh1")) install_mem_read_handler(0, 0x108206, 0x108207, wh1_cycle_r);
571 //** if (!strcmp(Machine->gamedrv->name,"sengoku2")) install_mem_read_handler(0, 0x10, 0x10, sengoku2_cycle_r);
572 if (!strcmp(Machine->gamedrv->name,"androdun")) install_mem_read_handler(0, 0x100080, 0x100081, androdun_cycle_r);
573 if (!strcmp(Machine->gamedrv->name,"bjourney")) install_mem_read_handler(0, 0x100206, 0x100207, bjourney_cycle_r);
574 if (!strcmp(Machine->gamedrv->name,"maglord")) install_mem_read_handler(0, 0x100206, 0x100207, maglord_cycle_r);
575 // if (!strcmp(Machine->gamedrv->name,"janshin")) install_mem_read_handler(0, 0x100026, 0x100027, janshin_cycle_r); // No speed difference
576 if (!strcmp(Machine->gamedrv->name,"pulstar")) install_mem_read_handler(0, 0x101000, 0x101001, pulstar_cycle_r);
577 if (!strcmp(Machine->gamedrv->name,"blazstar")) install_mem_read_handler(0, 0x101000, 0x101001, blazstar_cycle_r);
578 //** if (!strcmp(Machine->gamedrv->name,"pbobble")) install_mem_read_handler(0, 0x10, 0x10, pbobble_cycle_r); // Can't find this one :-(
579 if (!strcmp(Machine->gamedrv->name,"puzzledp")) install_mem_read_handler(0, 0x100000, 0x100001, puzzledp_cycle_r);
580 if (!strcmp(Machine->gamedrv->name,"neodrift")) install_mem_read_handler(0, 0x100424, 0x100425, neodrift_cycle_r);
581 //** if (!strcmp(Machine->gamedrv->name,"neomrdo")) install_mem_read_handler(0, 0x10, 0x10, neomrdo_cycle_r); // Can't find this one :-(
582 if (!strcmp(Machine->gamedrv->name,"spinmast")) install_mem_read_handler(0, 0x100050, 0x100051, spinmast_cycle_r);
583 if (!strcmp(Machine->gamedrv->name,"karnovr")) install_mem_read_handler(0, 0x103466, 0x103467, karnovr_cycle_r);
584 if (!strcmp(Machine->gamedrv->name,"wjammers")) install_mem_read_handler(0, 0x10005a, 0x10005b, wjammers_cycle_r);
585 if (!strcmp(Machine->gamedrv->name,"strhoops")) install_mem_read_handler(0, 0x101200, 0x101201, strhoops_cycle_r);
586 // if (!strcmp(Machine->gamedrv->name,"magdrop3")) install_mem_read_handler(0, 0x100060, 0x100061, magdrop3_cycle_r); // The game starts glitching.
587 //** if (!strcmp(Machine->gamedrv->name,"pspikes2")) install_mem_read_handler(0, 0x10, 0x10, pspikes2_cycle_r); // Can't find this one :-(
588 if (!strcmp(Machine->gamedrv->name,"sonicwi2")) install_mem_read_handler(0, 0x10e5b6, 0x10e5b7, sonicwi2_cycle_r);
589 if (!strcmp(Machine->gamedrv->name,"sonicwi3")) install_mem_read_handler(0, 0x10ea2e, 0x10ea2f, sonicwi3_cycle_r);
590 if (!strcmp(Machine->gamedrv->name,"goalx3")) install_mem_read_handler(0, 0x100006, 0x100007, goalx3_cycle_r);
591 // if (!strcmp(Machine->gamedrv->name,"mslug")) install_mem_read_handler(0, 0x106ed8, 0x106ed9, mslug_cycle_r); // Doesn't work properly.
592 // if (!strcmp(Machine->gamedrv->name,"turfmast")) install_mem_read_handler(0, 0x102e54, 0x102e55, turfmast_cycle_r);
593 if (!strcmp(Machine->gamedrv->name,"kabukikl")) install_mem_read_handler(0, 0x10428a, 0x10428b, kabukikl_cycle_r);
594
595 if (!strcmp(Machine->gamedrv->name,"panicbom")) install_mem_read_handler(0, 0x10009c, 0x10009d, panicbom_cycle_r);
596 if (!strcmp(Machine->gamedrv->name,"neobombe")) install_mem_read_handler(0, 0x10448c, 0x10448d, neobombe_cycle_r);
597 if (!strcmp(Machine->gamedrv->name,"wh2")) install_mem_read_handler(0, 0x108206, 0x108207, wh2_cycle_r);
598 if (!strcmp(Machine->gamedrv->name,"wh2j")) install_mem_read_handler(0, 0x108206, 0x108207, wh2j_cycle_r);
599 if (!strcmp(Machine->gamedrv->name,"aodk")) install_mem_read_handler(0, 0x108206, 0x108207, aodk_cycle_r);
600 if (!strcmp(Machine->gamedrv->name,"whp")) install_mem_read_handler(0, 0x108206, 0x108207, whp_cycle_r);
601 if (!strcmp(Machine->gamedrv->name,"overtop")) install_mem_read_handler(0, 0x108202, 0x108203, overtop_cycle_r);
602 if (!strcmp(Machine->gamedrv->name,"twinspri")) install_mem_read_handler(0, 0x108206, 0x108207, twinspri_cycle_r);
603 if (!strcmp(Machine->gamedrv->name,"stakwin")) install_mem_read_handler(0, 0x100b92, 0x100b93, stakwin_cycle_r);
604 if (!strcmp(Machine->gamedrv->name,"shocktro")) install_mem_read_handler(0, 0x108344, 0x108345, shocktro_cycle_r);
605 if (!strcmp(Machine->gamedrv->name,"tws96")) install_mem_read_handler(0, 0x10010e, 0x10010f, tws96_cycle_r);
606 // if (!strcmp(Machine->gamedrv->name,"zedblade")) install_mem_read_handler(0, 0x109004, 0x109005, zedblade_cycle_r);
607 // if (!strcmp(Machine->gamedrv->name,"doubledr")) install_mem_read_handler(0, 0x101c30, 0x101c31, doubledr_cycle_r);
608 //** if (!strcmp(Machine->gamedrv->name,"gowcaizr")) install_mem_read_handler(0, 0x10, 0x10, gowcaizr_cycle_r); // Can't find this one :-(
609 if (!strcmp(Machine->gamedrv->name,"galaxyfg")) install_mem_read_handler(0, 0x101858, 0x101859, galaxyfg_cycle_r);
610 if (!strcmp(Machine->gamedrv->name,"wakuwak7")) install_mem_read_handler(0, 0x100bd4, 0x100bd5, wakuwak7_cycle_r);
611 if (!strcmp(Machine->gamedrv->name,"mahretsu")) install_mem_read_handler(0, 0x1013b2, 0x1013b3, mahretsu_cycle_r);
612 if (!strcmp(Machine->gamedrv->name,"nam1975")) install_mem_read_handler(0, 0x1012e0, 0x1012e1, nam1975_cycle_r);
613 if (!strcmp(Machine->gamedrv->name,"tpgolf")) install_mem_read_handler(0, 0x1000a4, 0x1000a5, tpgolf_cycle_r);
614 if (!strcmp(Machine->gamedrv->name,"legendos")) install_mem_read_handler(0, 0x100002, 0x100003, legendos_cycle_r);
615 // if (!strcmp(Machine->gamedrv->name,"viewpoin")) install_mem_read_handler(0, 0x101216, 0x101217, viewpoin_cycle_r); // Doesn't work
616 if (!strcmp(Machine->gamedrv->name,"fatfury2")) install_mem_read_handler(0, 0x10418c, 0x10418d, fatfury2_cycle_r);
617 if (!strcmp(Machine->gamedrv->name,"bstars2")) install_mem_read_handler(0, 0x10001c, 0x10001c, bstars2_cycle_r);
618 if (!strcmp(Machine->gamedrv->name,"ssideki")) install_mem_read_handler(0, 0x108c84, 0x108c85, ssideki_cycle_r);
619 if (!strcmp(Machine->gamedrv->name,"kotm2")) install_mem_read_handler(0, 0x101000, 0x101001, kotm2_cycle_r);
620 if (!strcmp(Machine->gamedrv->name,"samsho")) install_mem_read_handler(0, 0x100a76, 0x100a77, samsho_cycle_r);
621 if (!strcmp(Machine->gamedrv->name,"fatfursp")) install_mem_read_handler(0, 0x10418c, 0x10418d, fatfursp_cycle_r);
622 if (!strcmp(Machine->gamedrv->name,"fatfury3")) install_mem_read_handler(0, 0x10418c, 0x10418d, fatfury3_cycle_r);
623 if (!strcmp(Machine->gamedrv->name,"tophuntr")) install_mem_read_handler(0, 0x10008e, 0x10008f, tophuntr_cycle_r); // Can't test this at the moment, it crashes.
624 if (!strcmp(Machine->gamedrv->name,"savagere")) install_mem_read_handler(0, 0x108404, 0x108405, savagere_cycle_r);
625 // if (!strcmp(Machine->gamedrv->name,"kof94")) install_mem_read_handler(0, 0x10, 0x10, kof94_cycle_r); // Can't do this I think. There seems to be too much code in the idle loop.
626 if (!strcmp(Machine->gamedrv->name,"aof2")) install_mem_read_handler(0, 0x108280, 0x108281, aof2_cycle_r);
627 // if (!strcmp(Machine->gamedrv->name,"ssideki2")) install_mem_read_handler(0, 0x104292, 0x104293, ssideki2_cycle_r);
628 if (!strcmp(Machine->gamedrv->name,"samsho2")) install_mem_read_handler(0, 0x100a30, 0x100a31, samsho2_cycle_r);
629 if (!strcmp(Machine->gamedrv->name,"samsho3")) install_mem_read_handler(0, 0x108408, 0x108409, samsho3_cycle_r);
630 if (!strcmp(Machine->gamedrv->name,"kof95")) install_mem_read_handler(0, 0x10a784, 0x10a785, kof95_cycle_r);
631 if (!strcmp(Machine->gamedrv->name,"rbff1")) install_mem_read_handler(0, 0x10418c, 0x10418d, rbff1_cycle_r);
632 // if (!strcmp(Machine->gamedrv->name,"aof3")) install_mem_read_handler(0, 0x104ee8, 0x104ee9, aof3_cycle_r); // Doesn't work properly.
633 if (!strcmp(Machine->gamedrv->name,"ninjamas")) install_mem_read_handler(0, 0x108206, 0x108207, ninjamas_cycle_r);
634 if (!strcmp(Machine->gamedrv->name,"kof96")) install_mem_read_handler(0, 0x10a782, 0x10a783, kof96_cycle_r);
635 if (!strcmp(Machine->gamedrv->name,"samsho4")) install_mem_read_handler(0, 0x10830c, 0x10830d, samsho4_cycle_r);
636 if (!strcmp(Machine->gamedrv->name,"rbffspec")) install_mem_read_handler(0, 0x10418c, 0x10418d, rbffspec_cycle_r);
637 if (!strcmp(Machine->gamedrv->name,"kizuna")) install_mem_read_handler(0, 0x108808, 0x108809, kizuna_cycle_r);
638 if (!strcmp(Machine->gamedrv->name,"kof97")) install_mem_read_handler(0, 0x10a784, 0x10a785, kof97_cycle_r);
639 // if (!strcmp(Machine->gamedrv->name,"mslug2")) install_mem_read_handler(0, 0x10008c, 0x10008d, mslug2_cycle_r); // Breaks the game
640 if (!strcmp(Machine->gamedrv->name,"rbff2")) install_mem_read_handler(0, 0x10418c, 0x10418d, rbff2_cycle_r);
641 if (!strcmp(Machine->gamedrv->name,"ragnagrd")) install_mem_read_handler(0, 0x100042, 0x100043, ragnagrd_cycle_r);
642 if (!strcmp(Machine->gamedrv->name,"lastblad")) install_mem_read_handler(0, 0x109d4e, 0x109d4f, lastblad_cycle_r);
643 if (!strcmp(Machine->gamedrv->name,"gururin")) install_mem_read_handler(0, 0x101002, 0x101003, gururin_cycle_r);
644 // if (!strcmp(Machine->gamedrv->name,"magdrop2")) install_mem_read_handler(0, 0x100064, 0x100065, magdrop2_cycle_r); // Graphic Glitches
645 // if (!strcmp(Machine->gamedrv->name,"miexchng")) install_mem_read_handler(0, 0x10, 0x10, miexchng_cycle_r); // Can't do this.
646 if (!strcmp(Machine->gamedrv->name,"kof98")) install_mem_read_handler(0, 0x10a784, 0x10a785, kof98_cycle_r);
647 if (!strcmp(Machine->gamedrv->name,"marukodq")) install_mem_read_handler(0, 0x100210, 0x100211, marukodq_cycle_r);
648 if (!strcmp(Machine->gamedrv->name,"minasan")) install_mem_read_handler(0, 0x1000ca, 0x1000cb, minasan_cycle_r);
649 if (!strcmp(Machine->gamedrv->name,"stakwin2")) install_mem_read_handler(0, 0x100002, 0x100003, stakwin2_cycle_r);
650 if (!strcmp(Machine->gamedrv->name,"bakatono")) install_mem_read_handler(0, 0x1000fa, 0x1000fb, bakatono_cycle_r);
651 if (!strcmp(Machine->gamedrv->name,"quizkof")) install_mem_read_handler(0, 0x104464, 0x104465, quizkof_cycle_r);
652 if (!strcmp(Machine->gamedrv->name,"quizdais")) install_mem_read_handler(0, 0x1059f2, 0x1059f3, quizdais_cycle_r);
653 if (!strcmp(Machine->gamedrv->name,"quizdai2")) install_mem_read_handler(0, 0x100960, 0x100961, quizdai2_cycle_r);
654 if (!strcmp(Machine->gamedrv->name,"popbounc")) install_mem_read_handler(0, 0x101008, 0x101009, popbounc_cycle_r);
655 if (!strcmp(Machine->gamedrv->name,"sdodgeb")) install_mem_read_handler(0, 0x101104, 0x101105, sdodgeb_cycle_r);
656 if (!strcmp(Machine->gamedrv->name,"shocktr2")) install_mem_read_handler(0, 0x108348, 0x108349, shocktr2_cycle_r);
657 if (!strcmp(Machine->gamedrv->name,"figfever")) install_mem_read_handler(0, 0x108100, 0x108101, figfever_cycle_r);
658 if (!strcmp(Machine->gamedrv->name,"irrmaze")) install_mem_read_handler(0, 0x104b6e, 0x104b6f, irrmaze_cycle_r);
659
660 #endif
661
662 /* AVDB cpu spins based on sound processor status */
663 if (!strcmp(Machine->gamedrv->name,"puzzledp")) install_mem_read_handler(1, 0xfeb1, 0xfeb1, cycle_v3_sr);
664 // if (!strcmp(Machine->gamedrv->name,"ssideki2")) install_mem_read_handler(1, 0xfeb1, 0xfeb1, cycle_v3_sr);
665
666 if (!strcmp(Machine->gamedrv->name,"ssideki")) install_mem_read_handler(1, 0xfef3, 0xfef3, ssideki_cycle_sr);
667 if (!strcmp(Machine->gamedrv->name,"aof")) install_mem_read_handler(1, 0xfef3, 0xfef3, aof_cycle_sr);
668
669 if (!strcmp(Machine->gamedrv->name,"pbobble")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
670 if (!strcmp(Machine->gamedrv->name,"goalx3")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
671 if (!strcmp(Machine->gamedrv->name,"fatfury1")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
672 if (!strcmp(Machine->gamedrv->name,"mutnat")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
673
674 if (!strcmp(Machine->gamedrv->name,"maglord")) install_mem_read_handler(1, 0xfb91, 0xfb91, maglord_cycle_sr);
675 if (!strcmp(Machine->gamedrv->name,"vwpoint")) install_mem_read_handler(1, 0xfe46, 0xfe46, vwpoint_cycle_sr);
676
677 // if (!strcmp(Machine->gamedrv->name,"joyjoy")) install_mem_read_handler(1, 0xfe46, 0xfe46, cycle_v15_sr);
678 // if (!strcmp(Machine->gamedrv->name,"nam1975")) install_mem_read_handler(1, 0xfe46, 0xfe46, cycle_v15_sr);
679 // if (!strcmp(Machine->gamedrv->name,"gpilots")) install_mem_read_handler(1, 0xfe46, 0xfe46, cycle_v15_sr);
680
681 /* kludges */
682
683 if (!strcmp(Machine->gamedrv->name,"gururin"))
684 {
685 /* Fix a really weird problem. The game clears the video RAM but goes */
686 /* beyond the tile RAM, corrupting the zoom control RAM. After that it */
687 /* initializes the control RAM, but then corrupts it again! */
688 unsigned char *RAM = memory_region(REGION_CPU1);
689 WRITE_WORD(&RAM[0x1328],0x4e71);
690 WRITE_WORD(&RAM[0x132a],0x4e71);
691 WRITE_WORD(&RAM[0x132c],0x4e71);
692 WRITE_WORD(&RAM[0x132e],0x4e71);
693 }
694
695 if (!Machine->sample_rate &&
696 !strcmp(Machine->gamedrv->name,"popbounc"))
697 /* the game hangs after a while without this patch */
698 install_mem_read_handler(0, 0x104fbc, 0x104fbd, popbounc_sfix_r);
699
700 /* hacks to make the games which do protection checks run in arcade mode */
701 /* we write protect a SRAM location so it cannot be set to 1 */
702 sram_protection_hack = -1;
703 if (!strcmp(Machine->gamedrv->name,"fatfury3") ||
704 !strcmp(Machine->gamedrv->name,"samsho3") ||
705 !strcmp(Machine->gamedrv->name,"samsho4") ||
706 !strcmp(Machine->gamedrv->name,"aof3") ||
707 !strcmp(Machine->gamedrv->name,"rbff1") ||
708 !strcmp(Machine->gamedrv->name,"rbffspec") ||
709 !strcmp(Machine->gamedrv->name,"kof95") ||
710 !strcmp(Machine->gamedrv->name,"kof96") ||
711 !strcmp(Machine->gamedrv->name,"kof97") ||
712 !strcmp(Machine->gamedrv->name,"kof98") ||
713 !strcmp(Machine->gamedrv->name,"kof99") ||
714 !strcmp(Machine->gamedrv->name,"kizuna") ||
715 !strcmp(Machine->gamedrv->name,"lastblad") ||
716 !strcmp(Machine->gamedrv->name,"lastbld2") ||
717 !strcmp(Machine->gamedrv->name,"rbff2") ||
718 !strcmp(Machine->gamedrv->name,"mslug2") ||
719 !strcmp(Machine->gamedrv->name,"garou"))
720 sram_protection_hack = 0x100;
721
722 if (!strcmp(Machine->gamedrv->name,"pulstar"))
723 sram_protection_hack = 0x35a;
724
725 if (!strcmp(Machine->gamedrv->name,"ssideki"))
726 {
727 /* patch out protection check */
728 /* the protection routines are at 0x25dcc and involve reading and writing */
729 /* addresses in the 0x2xxxxx range */
730 unsigned char *RAM = memory_region(REGION_CPU1);
731 WRITE_WORD(&RAM[0x2240],0x4e71);
732 }
733
734 /* Hacks the program rom of Fatal Fury 2, needed either in arcade or console mode */
735 /* otherwise at level 2 you cannot hit the opponent and other problems */
736 if (!strcmp(Machine->gamedrv->name,"fatfury2"))
737 {
738 /* there seems to also be another protection check like the countless ones */
739 /* patched above by protectiong a SRAM location, but that trick doesn't work */
740 /* here (or maybe the SRAM location to protect is different), so I patch out */
741 /* the routine which trashes memory. Without this, the game goes nuts after */
742 /* the first bonus stage. */
743 unsigned char *RAM = memory_region(REGION_CPU1);
744 WRITE_WORD(&RAM[0xb820],0x4e71);
745 WRITE_WORD(&RAM[0xb822],0x4e71);
746
747 /* again, the protection involves reading and writing addresses in the */
748 /* 0x2xxxxx range. There are several checks all around the code. */
749 install_mem_read_handler (0, 0x200000, 0x2fffff, fatfury2_protection_r);
750 install_mem_write_handler(0, 0x200000, 0x2fffff, fatfury2_protection_w);
751 }
752
753 if (!strcmp(Machine->gamedrv->name,"fatfury3"))
754 {
755 /* patch the first word, it must be 0x0010 not 0x0000 (initial stack pointer) */
756 unsigned char *RAM = memory_region(REGION_CPU1);
757 WRITE_WORD(&RAM[0x0000],0x0010);
758 }
759
760 if (!strcmp(Machine->gamedrv->name,"mslugx"))
761 {
762 /* patch out protection checks */
763 int i;
764 unsigned char *RAM = memory_region(REGION_CPU1);
765
766 for (i = 0;i < 0x100000;i+=2)
767 {
768 if (READ_WORD(&RAM[i+0]) == 0x0243 &&
769 READ_WORD(&RAM[i+2]) == 0x0001 && /* andi.w #$1, D3 */
770 READ_WORD(&RAM[i+4]) == 0x6600) /* bne xxxx */
771 {
772 WRITE_WORD(&RAM[i+4],0x4e71);
773 WRITE_WORD(&RAM[i+6],0x4e71);
774 }
775 }
776
777 WRITE_WORD(&RAM[0x3bdc],0x4e71);
778 WRITE_WORD(&RAM[0x3bde],0x4e71);
779 WRITE_WORD(&RAM[0x3be0],0x4e71);
780 WRITE_WORD(&RAM[0x3c0c],0x4e71);
781 WRITE_WORD(&RAM[0x3c0e],0x4e71);
782 WRITE_WORD(&RAM[0x3c10],0x4e71);
783
784 WRITE_WORD(&RAM[0x3c36],0x4e71);
785 WRITE_WORD(&RAM[0x3c38],0x4e71);
786 }
787 }
788
789
790
WRITE_HANDLER(neogeo_sram_lock_w)791 WRITE_HANDLER( neogeo_sram_lock_w )
792 {
793 sram_locked = 1;
794 }
795
WRITE_HANDLER(neogeo_sram_unlock_w)796 WRITE_HANDLER( neogeo_sram_unlock_w )
797 {
798 sram_locked = 0;
799 }
800
READ_HANDLER(neogeo_sram_r)801 READ_HANDLER( neogeo_sram_r )
802 {
803 return READ_WORD(&neogeo_sram[offset]);
804 }
805
WRITE_HANDLER(neogeo_sram_w)806 WRITE_HANDLER( neogeo_sram_w )
807 {
808 if (sram_locked)
809 {
810 //logerror("PC %06x: warning: write %02x to SRAM %04x while it was protected\n",cpu_get_pc(),data,offset);
811 }
812 else
813 {
814 if (offset == sram_protection_hack)
815 {
816 if (data == 0x0001 || data == 0xff000001)
817 return; /* fake protection pass */
818 }
819
820 COMBINE_WORD_MEM(&neogeo_sram[offset],data);
821 }
822 }
823
neogeo_nvram_handler(void * file,int read_or_write)824 void neogeo_nvram_handler(void *file,int read_or_write)
825 {
826 if (read_or_write)
827 {
828 /* Save the SRAM settings */
829 osd_fwrite_msbfirst(file,neogeo_sram,0x2000);
830
831 /* save the memory card */
832 neogeo_memcard_save();
833 }
834 else
835 {
836 /* Load the SRAM settings for this game */
837 if (file)
838 osd_fread_msbfirst(file,neogeo_sram,0x2000);
839 else
840 memset(neogeo_sram,0,0x10000);
841
842 /* load the memory card */
843 neogeo_memcard_load(memcard_number);
844 }
845 }
846
847
848
849 /*
850 INFORMATION:
851
852 Memory card is a 2kb battery backed RAM.
853 It is accessed thru 0x800000-0x800FFF.
854 Even bytes are always 0xFF
855 Odd bytes are memcard data (0x800 bytes)
856
857 Status byte at 0x380000: (BITS ARE ACTIVE *LOW*)
858
859 0 PAD1 START
860 1 PAD1 SELECT
861 2 PAD2 START
862 3 PAD2 SELECT
863 4 --\ MEMORY CARD
864 5 --/ INSERTED
865 6 MEMORY CARD WRITE PROTECTION
866 7 UNUSED (?)
867 */
868
869
870
871
872 /********************* MEMCARD ROUTINES **********************/
READ_HANDLER(neogeo_memcard_r)873 READ_HANDLER( neogeo_memcard_r )
874 {
875 if (memcard_status==1)
876 {
877 return (neogeo_memcard[offset>>1]|0xFF00);
878 }
879 else
880 return 0xFFFF;
881 }
882
WRITE_HANDLER(neogeo_memcard_w)883 WRITE_HANDLER( neogeo_memcard_w )
884 {
885 if (memcard_status==1)
886 {
887 neogeo_memcard[offset>>1] = (data&0xFF);
888 }
889 }
890
neogeo_memcard_load(int number)891 int neogeo_memcard_load(int number)
892 {
893 char name[16];
894 void *f;
895
896 sprintf(name, "MEMCARD.%03d", number);
897 if ((f=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,0))!=0)
898 {
899 osd_fread(f,neogeo_memcard,0x800);
900 osd_fclose(f);
901 return 1;
902 }
903 return 0;
904 }
905
neogeo_memcard_save(void)906 void neogeo_memcard_save(void)
907 {
908 char name[16];
909 void *f;
910
911 if (memcard_number!=-1)
912 {
913 sprintf(name, "MEMCARD.%03d", memcard_number);
914 if ((f=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,1))!=0)
915 {
916 osd_fwrite(f,neogeo_memcard,0x800);
917 osd_fclose(f);
918 }
919 }
920 }
921
neogeo_memcard_eject(void)922 void neogeo_memcard_eject(void)
923 {
924 if (memcard_number!=-1)
925 {
926 neogeo_memcard_save();
927 memset(neogeo_memcard, 0, 0x800);
928 memcard_status=0;
929 memcard_number=-1;
930 }
931 }
932
neogeo_memcard_create(int number)933 int neogeo_memcard_create(int number)
934 {
935 char buf[0x800];
936 char name[16];
937 void *f1, *f2;
938
939 sprintf(name, "MEMCARD.%03d", number);
940 if ((f1=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,0))==0)
941 {
942 if ((f2=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,1))!=0)
943 {
944 osd_fwrite(f2,buf,0x800);
945 osd_fclose(f2);
946 return 1;
947 }
948 }
949 else
950 osd_fclose(f1);
951
952 return 0;
953 }
954
955