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(&ltime);
78 	today = localtime(&ltime);
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