1 /***************************************************************************
2 
3 	Underfire  							(c) 1993 Taito
4     Chase Bombers                       (c) 1994 Taito
5 
6 	Driver by Bryan McPhail & David Graves.
7 
8 	Board Info (Underfire):
9 
10 		TC0470LIN : ?
11 		TC0480SCP : known tilemap chip
12 		TC0510NIO : known input chip
13 		TC0570SPC : must be the object chip (next to spritemap and OBJ roms)
14 		TC0590PIV : Piv tilemaps
15 		TC0620SCC : lightgun ??? pivot port ???
16 		TC0650FDA : palette ? (Slapshot and F3 games also have one)
17 
18 	M43E0278A
19 	K1100744A Main Board
20 
21 	2018 2088           43256    43256   68020-25
22 	2018 2088           D67-23   D67-17                    93C46
23 	2018 2088           43256    43256
24 	2018                D67-18   D67-19                TC0510NIO
25 	2018
26 	2018 TC0570 SPC                      43256
27 		                                     43256
28 	 D67-13                              43256  TC0650FDA
29 	          D67-07                            2018
30 	          D67-06
31 	TC0470LIN D67-05
32 	          D67-04                      43256
33 	TC0590PIV D67-03    43256    D67-10   43256
34 	                    43256    D67-11
35 	   D67-09    TC0480SCP       D67-12   TC0620SCC
36 	   D67-08
37 
38 	  MB8421
39 	  MB8421   43256             EnsoniqOTIS
40 	           D67-20    D67-01
41 	           43256                             EnsoniqESP-R6
42 	 68000-12  D67-21    D67-02     EnsoniqSuperGlu
43 
44 	           40MHz            16MHz   30.476MHz    68681
45 
46 
47 	Under Fire combines the sprite system used in Taito Z games with
48 	the TC0480SCP tilemap chip plus some features from the Taito F3 system.
49 	It has an extra tilemap chip which is a dead ringer for the TC0100SCN
50 	(check the inits). Why did Taito give it a different name in this
51 	incarnation?
52 
53 
54 	Game misbehaviours
55 	------------------
56 
57 	(i) Sprites on some rounds had sprite/tile priority issues.
58 	Solved by upping sprite priority while TC0480SCP row zoom is
59 	enabled - kludge.
60 
61 
62 	Todo
63 	----
64 
65 	This game needs a fake aim target!
66 
67 	What does the 0xb00000 area do... alpha blending ??
68 
69 	What is the unknown hardware at 0x600000... an alternative
70 	or legacy lightgun hookup?
71 
72 	Pivot port which may be used for rotation: but not
73 	seen changing except in game inits. Perhaps only used
74 	in later levels?
75 
76 
77 	Gun calibration
78 	---------------
79 
80 	The values below work well (set speed down to 4 so you can enter
81 	them). They give a little reloading margin all around screen.
82 
83 	Use X=0x2000  Y=0x100 for top center
84 	Use X=0x3740  (same Y) top left
85 	Use X=0x8c0   (same Y) top right
86 	Then for the points from left to right near bottom (all Y=0x3400):
87 	X=0x3f00,0x3740,0x2f80,0x27c0,0x2000,0x1840,0x1080,0x8c0,0x100
88 
89 
90 Code documentation
91 ------------------
92 
93 $17b6e2: loop which keeps displaying the trail of aim dots in test mode
94 
95 $181826: routine which calls subs to derive aim coords for P1 and P2 and
96 pokes them in the game's internal sprite table format into RAM - along
97 with the nine blue "flag point" sprites on the calibration screen
98 which seem to have fixed coordinates. [It also refreshes some green
99 text on screen - the calls to $1bfa.]
100 
101 $18141a sub appears to be doing all the calculations - including an
102 indirected subroutine so there may be quite a lot of possible code.
103 It is called with parameter of 1 for player 2 (and 0 for player 1).
104 
105 $1821c8 sub is called just after - this is simpler and seems to be
106 copying the calculation results (modified slightly by 3 pixels in each
107 direction - to adjust for size of aim sprite?) into the table in ram.
108 
109 (Subsequently a standard conversion routine turns the table on the fly
110 into dwords that are actually poked into spriteram. To locate the code
111 do a watchpoint on the first sprite in spriteram - the P1 aim point.)
112 
113 In-game: $18141a is called 3 times when you hit fire - 3 bullets - and
114 once when you hit shotgun. Like Spacegun it is only doing the aim
115 calculations when it needs to, so to provide an artificial target we
116 need to reproduce the $18141a calculations.
117 
118 
119 Info (Chase Bombers)
120 
121 Chase Bombers
122 Taito, 1994
123 
124 Runs on hardware similar to Ground Effects
125 
126 
127 PCB Layout
128 ----------
129 
130 MAIN PCB-D
131 K1100809A
132 J1100342A
133 |----------------------------------------------------------------------------------------------|
134 |           C5                              C6                             SMC_COM20020  LANOUT|
135 | 68EC020   61256     68EC000  61256            68EC000      61256      MB8421                 |
136 |           61256              61256                         61256                       LANIN |
137 |           61256                     61256                  PAL                               |
138 |           61256    PAL              61256                  PAL                               |
139 |                    PAL                                     PAL        MB8421                 |
140 |                    40MHz                                                                     |
141 |                                                                  MC68681                     |
142 |                                           TC511664-80     MB3771                             |
143 |                                                                                            P1|
144 |  MACH120   MACH120                                                                           |
145 |                                     ENSONIQ         30.4761MHz  16MHz   ADC0809              |
146 |                                     ESP-R6                                                   |
147 |                                                       ENSONIQ                                |
148 |                                     ENSONIQ           5701     DSW1(8)  TC0510NIO            |
149 |                                     OTIS-R2                                                 Z|
150 |                                                         93C46                                |
151 |           C3                              C4                                                 |
152 |                                                                                              |
153 |  61256                                                                                     |-|
154 |  61256                                                                                     |
155 |                                                                                            |-|
156 |                TC0480SCP        TC0620SCC           TC0360PRI                                |
157 |                                                                                              |
158 |                                                                                TC0650FDA     |
159 |  2018                                                                  61256                 |
160 |                                                                        61256                 |
161 |  2018     2088             61256                                       61256                G|
162 |                            61256                    TC0580PIV                                |
163 |  2018     2088                                                                               |
164 |                                                                                              |
165 |  2018                                                             TL074    TL074   TDA1543   |
166 |           TC0570SPC         TC0470LIN               514256  514256                           |
167 |  2018                                               514256  514256        TA8221   TD62064 |-|
168 |                                                     514256  514256                 TD62064 |
169 |  2018                                                               MB87078        TD62064 |-|
170 |           C1                              C2                                                 |
171 |----------------------------------------------------------------------------------------------|
172 Notes:
173       ROM board plugs into C* connectors
174       No clocks for now, PCB has light corrosion and will need extensive cleaning before it can be powered up.
175 
176 ROM Board
177 ---------
178 
179 PCB Numbers - ROM.PCB
180               K9100508A
181               J9100367A
182 
183 Board contains only 29 ROMs and not much else.
184 
185 
186 
187 ***************************************************************************/
188 
189 #include "driver.h"
190 #include "cpu/m68000/m68000.h"
191 #include "vidhrdw/generic.h"
192 #include "vidhrdw/taitoic.h"
193 #include "sndhrdw/taitosnd.h"
194 #include "machine/eeprom.h"
195 
196 VIDEO_START( undrfire );
197 VIDEO_UPDATE( undrfire );
198 VIDEO_UPDATE( cbombers );
199 
200 /* F3 sound */
201 READ16_HANDLER(f3_68000_share_r);
202 WRITE16_HANDLER(f3_68000_share_w);
203 READ16_HANDLER(f3_68681_r);
204 WRITE16_HANDLER(f3_68681_w);
205 READ16_HANDLER(es5510_dsp_r);
206 WRITE16_HANDLER(es5510_dsp_w);
207 WRITE16_HANDLER(f3_volume_w);
208 WRITE16_HANDLER(f3_es5505_bank_w);
209 void f3_68681_reset(void);
210 extern data32_t *f3_shared_ram;
211 
212 static UINT16 coin_word;
213 static UINT16 port_sel = 0;
214 extern UINT16 undrfire_rotate_ctrl[8];
215 static int frame_counter=0;
216 
217 data32_t *undrfire_ram;	/* will be read in vidhrdw for gun target calcs */
218 UINT32 *shared_ram;
219 
220 /***********************************************************
221 				COLOR RAM
222 
223 Extract a standard version of this
224 ("taito_8bpg_palette_word_w"?) to Taitoic.c ?
225 ***********************************************************/
226 
WRITE32_HANDLER(color_ram_w)227 static WRITE32_HANDLER( color_ram_w )
228 {
229 	int a,r,g,b;
230 	COMBINE_DATA(&paletteram32[offset]);
231 
232 	{
233 		a = paletteram32[offset];
234 		r = (a &0xff0000) >> 16;
235 		g = (a &0xff00) >> 8;
236 		b = (a &0xff);
237 
238 		palette_set_color(offset,r,g,b);
239 	}
240 }
241 
242 
243 /***********************************************************
244 				INTERRUPTS
245 ***********************************************************/
246 
undrfire_interrupt5(int x)247 void undrfire_interrupt5(int x)
248 {
249 	cpu_set_irq_line(0,5,HOLD_LINE);
250 }
251 
252 
253 /**********************************************************
254 				EPROM
255 **********************************************************/
256 
257 static data8_t default_eeprom[128]=
258 {
259 	0x02,0x01,0x11,0x12,0x01,0x01,0x01,0x00,0x80,0x80,0x30,0x01,0x00,0x00,0x62,0x45,
260 	0xe0,0xa0,0xff,0x28,0xff,0xff,0xfa,0xd7,0x33,0x28,0x00,0x00,0x33,0x28,0x00,0x00,
261 	0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xa0,0xff,0x28,0xff,0xff,0xff,0xff,0xfa,0xd7,
262 	0x33,0x28,0x00,0x00,0x33,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
263 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
264 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
265 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
266 	0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
267 };
268 
269 static struct EEPROM_interface undrfire_eeprom_interface =
270 {
271 	6,				/* address bits */
272 	16,				/* data bits */
273 	"0110",			/* read command */
274 	"0101",			/* write command */
275 	"0111",			/* erase command */
276 	"0100000000",	/* unlock command */
277 	"0100110000",	/* lock command */
278 };
279 
NVRAM_HANDLER(undrfire)280 static NVRAM_HANDLER( undrfire )
281 {
282 	if (read_or_write)
283 		EEPROM_save(file);
284 	else {
285 		EEPROM_init(&undrfire_eeprom_interface);
286 		if (file)
287 			EEPROM_load(file);
288 		else
289 			EEPROM_set_data(default_eeprom,128);  /* Default the gun setup values */
290 	}
291 }
292 
293 
294 /**********************************************************
295 			GAME INPUTS
296 **********************************************************/
297 
READ32_HANDLER(undrfire_input_r)298 static READ32_HANDLER( undrfire_input_r )
299 {
300 	switch (offset)
301 	{
302 		case 0x00:
303 		{
304 			return (input_port_0_word_r(0,0) << 16) | input_port_1_word_r(0,0) |
305 				  (EEPROM_read_bit() << 7) | frame_counter;
306 		}
307 
308 		case 0x01:
309 		{
310 			return input_port_2_word_r(0,0) | (coin_word << 16);
311 		}
312  	}
313 
314 	return 0xffffffff;
315 }
316 
WRITE32_HANDLER(undrfire_input_w)317 static WRITE32_HANDLER( undrfire_input_w )
318 {
319 	switch (offset)
320 	{
321 		case 0x00:
322 		{
323 			if (ACCESSING_MSB32)	/* $500000 is watchdog */
324 			{
325 				watchdog_reset_w(0,data >> 24);
326 			}
327 
328 			if (ACCESSING_LSB32)
329 			{
330 				EEPROM_set_clock_line((data & 0x20) ? ASSERT_LINE : CLEAR_LINE);
331 				EEPROM_write_bit(data & 0x40);
332 				EEPROM_set_cs_line((data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
333 				return;
334 			}
335 
336 			return;
337 		}
338 
339 		case 0x01:
340 		{
341 			if (ACCESSING_MSB32)
342 			{
343 				coin_lockout_w(0,~data & 0x01000000);
344 				coin_lockout_w(1,~data & 0x02000000);
345 				coin_counter_w(0, data & 0x04000000);
346 				coin_counter_w(1, data & 0x08000000);
347 				coin_word = (data >> 16) &0xffff;
348 			}
349 		}
350 	}
351 }
352 
353 
READ16_HANDLER(shared_ram_r)354 static READ16_HANDLER( shared_ram_r )
355 {
356 	if ((offset&1)==0) return (shared_ram[offset/2]&0xffff0000)>>16;
357 	return (shared_ram[offset/2]&0x0000ffff);
358 }
359 
360 
WRITE16_HANDLER(shared_ram_w)361 static WRITE16_HANDLER( shared_ram_w )
362 {
363 	if ((offset&1)==0) {
364 		if (ACCESSING_MSB)
365 			shared_ram[offset/2]=(shared_ram[offset/2]&0x00ffffff)|((data&0xff00)<<16);
366 		if (ACCESSING_LSB)
367 			shared_ram[offset/2]=(shared_ram[offset/2]&0xff00ffff)|((data&0x00ff)<<16);
368 	} else {
369 		if (ACCESSING_MSB)
370 			shared_ram[offset/2]=(shared_ram[offset/2]&0xffff00ff)|((data&0xff00)<< 0);
371 		if (ACCESSING_LSB)
372 			shared_ram[offset/2]=(shared_ram[offset/2]&0xffffff00)|((data&0x00ff)<< 0);
373 	}
374 }
375 
376 
377 /* Some unknown hardware byte mapped at $600002-5 */
378 
READ32_HANDLER(unknown_hardware_r)379 static READ32_HANDLER( unknown_hardware_r )
380 {
381 	switch (offset)	/* four single bytes are read in sequence at $156e */
382 	{
383 		case 0x00:	/* $600002-3 */
384 		{
385 			return 0xffff;	/* no idea what they should be*/
386 		}
387 
388 		case 0x01:	/* $600004-5 */
389 		{
390 			return 0xffff0000;	/* no idea what they should be*/
391 		}
392 	}
393 
394 	return 0x0;
395 }
396 
397 
WRITE32_HANDLER(unknown_int_req_w)398 static WRITE32_HANDLER( unknown_int_req_w )
399 {
400 	/* 10000 cycle delay is arbitrary */
401 	timer_set(TIME_IN_CYCLES(10000,0),0, undrfire_interrupt5);
402 }
403 
404 
READ32_HANDLER(undrfire_lightgun_r)405 static READ32_HANDLER( undrfire_lightgun_r )
406 {
407 	int x,y;
408 
409 	switch (offset)
410 	{
411 		/* NB we are raising the raw inputs by an arbitrary amount,
412 		   but presumably the guns on the original will not have had
413 		   full 0-0xffff travel. We don't center around 0x8000... but
414 		   who knows if the real machine does. */
415 
416 		case 0x00:	/* P1 */
417 		{
418 			x = input_port_3_word_r(0,0) << 6;
419 			y = input_port_4_word_r(0,0) << 6;
420 
421 			return ((x << 24) &0xff000000) | ((x << 8) &0xff0000)
422 				 | ((y << 8) &0xff00) | ((y >> 8) &0xff) ;
423 		}
424 
425 		case 0x01:	/* P2 */
426 		{
427 			x = input_port_5_word_r(0,0) << 6;
428 			y = input_port_6_word_r(0,0) << 6;
429 
430 			return ((x << 24) &0xff000000) | ((x << 8) &0xff0000)
431 				 | ((y << 8) &0xff00) | ((y >> 8) &0xff) ;
432 		}
433 	}
434 
435 log_cb(RETRO_LOG_DEBUG, LOGPRE "CPU #0 PC %06x: warning - read unmapped lightgun offset %06x\n",activecpu_get_pc(),offset);
436 
437 	return 0x0;
438 }
439 
440 
WRITE32_HANDLER(rotate_control_w)441 static WRITE32_HANDLER( rotate_control_w )	/* only a guess that it's rotation */
442 {
443 		if (ACCESSING_LSW32)
444 		{
445 			undrfire_rotate_ctrl[port_sel] = data;
446 			return;
447 		}
448 
449 		if (ACCESSING_MSW32)
450 		{
451 			port_sel = (data &0x70000) >> 16;
452 		}
453 }
454 
455 
WRITE32_HANDLER(motor_control_w)456 static WRITE32_HANDLER( motor_control_w )
457 {
458 /*
459 	Standard value poked is 0x00910200 (we ignore lsb and msb
460 	which seem to be always zero)
461 
462 	0x0, 0x8000 and 0x9100 are written at startup
463 
464 	Two bits are written in test mode to this middle word
465 	to test gun vibration:
466 
467 	........ .x......   P1 gun vibration
468 	........ x.......   P2 gun vibration
469 */
470 }
471 
WRITE32_HANDLER(cbombers_cpua_ctrl_w)472 static WRITE32_HANDLER( cbombers_cpua_ctrl_w )
473 {
474 /*
475     ........ ..xxxxxx   Lamp 1-6 enables
476     ........ .x......   Vibration
477 */
478 
479 	cpu_set_reset_line(2,(data & 0x1000) ? CLEAR_LINE : ASSERT_LINE);
480 }
481 
READ32_HANDLER(cbombers_adc_r)482 static READ32_HANDLER( cbombers_adc_r )
483 {
484 	return (input_port_3_word_r(0,0) << 24 );
485 }
486 
WRITE32_HANDLER(cbombers_adc_w)487 static WRITE32_HANDLER( cbombers_adc_w )
488 {
489 	/* One interrupt per input port (4 per frame, though only 2 used).
490         1000 cycle delay is arbitrary */
491 	timer_set(TIME_IN_CYCLES(10000,0),0, undrfire_interrupt5);
492 }
493 
494 /***********************************************************
495 			 MEMORY STRUCTURES
496 ***********************************************************/
497 
MEMORY_READ32_START(undrfire_readmem)498 static MEMORY_READ32_START( undrfire_readmem )
499 	{ 0x000000, 0x1fffff, MRA32_ROM },
500 	{ 0x200000, 0x21ffff, MRA32_RAM },	/* main CPUA ram */
501 	{ 0x300000, 0x303fff, MRA32_RAM },	/* sprite ram */
502 /*	{ 0x304000, 0x304003, MRA32_RAM },	*/ /* debugging*/
503 /*	{ 0x304400, 0x304403, MRA32_RAM },	*/ /* debugging*/
504 	{ 0x500000, 0x500007, undrfire_input_r },
505 	{ 0x600000, 0x600007, unknown_hardware_r },	/* unknown byte reads at $156e */
506 	{ 0x700000, 0x7007ff, MRA32_RAM },
507 	{ 0x800000, 0x80ffff, TC0480SCP_long_r },	  /* tilemaps */
508 	{ 0x830000, 0x83002f, TC0480SCP_ctrl_long_r },	/* debugging*/
509 	{ 0x900000, 0x90ffff, TC0100SCN_long_r },	/* piv tilemaps */
510 	{ 0x920000, 0x92000f, TC0100SCN_ctrl_long_r },
511 	{ 0xa00000, 0xa0ffff, MRA32_RAM },	/* palette ram */
512 	{ 0xb00000, 0xb003ff, MRA32_RAM },	/* ?? single bytes*/
513 	{ 0xf00000, 0xf00007, undrfire_lightgun_r },	/* stick coords read at $11b2-bc */
514 MEMORY_END
515 
516 static MEMORY_WRITE32_START( undrfire_writemem )
517 	{ 0x000000, 0x1fffff, MWA32_ROM },
518 	{ 0x200000, 0x21ffff, MWA32_RAM, &undrfire_ram },
519 	{ 0x300000, 0x303fff, MWA32_RAM, &spriteram32, &spriteram_size },
520 /*	{ 0x304000, 0x304003, MWA32_RAM },	*/ /* ??? doesn't change*/
521 /*	{ 0x304400, 0x304403, MWA32_RAM },	*/ /* ??? doesn't change*/
522 	{ 0x400000, 0x400003, motor_control_w },	/* gun vibration */
523 	{ 0x500000, 0x500007, undrfire_input_w },	/* eerom etc. */
524 	{ 0x600000, 0x600007, unknown_int_req_w },	/* int request for unknown hardware */
525 	{ 0x700000, 0x7007ff, MWA32_RAM, &f3_shared_ram },
526 	{ 0x800000, 0x80ffff, TC0480SCP_long_w },	  /* tilemaps */
527 	{ 0x830000, 0x83002f, TC0480SCP_ctrl_long_w },
528 	{ 0x900000, 0x90ffff, TC0100SCN_long_w },	/* piv tilemaps */
529 	{ 0x920000, 0x92000f, TC0100SCN_ctrl_long_w },
530 	{ 0xa00000, 0xa0ffff, color_ram_w, &paletteram32 },
531 	{ 0xb00000, 0xb003ff, MWA32_RAM },	/* single bytes, blending ??*/
532 	{ 0xd00000, 0xd00003, rotate_control_w },	/* perhaps port based rotate control? */
533 MEMORY_END
534 
535 static MEMORY_READ32_START( cbombers_readmem )
536     { 0x000000, 0x1fffff, MRA32_ROM },
537 	{ 0x200000, 0x21ffff, MRA32_RAM },
538 	{ 0x300000, 0x303fff, MRA32_RAM },
539 	{ 0x500000, 0x500007, undrfire_input_r },
540 	{ 0x600000, 0x600007, cbombers_adc_r },
541 	{ 0x700000, 0x7007ff, MRA32_RAM },
542 	{ 0x800000, 0x80ffff, TC0480SCP_long_r },		/* tilemaps */
543 	{ 0x830000, 0x83002f, TC0480SCP_ctrl_long_r },
544 	{ 0x900000, 0x90ffff, TC0100SCN_long_r },		/* piv tilemaps */
545 	{ 0x920000, 0x92000f, TC0100SCN_ctrl_long_r },
546 	{ 0xb00000, 0xb0000f, MRA32_RAM }, /* ? */
547 	{ 0xc00000, 0xc00007, MRA32_RAM }, /* LAN controller? */
548 	{ 0xe00000, 0xe0ffff, MRA32_RAM },
549 MEMORY_END
550 
551 static MEMORY_WRITE32_START( cbombers_writemem )
552     { 0x000000, 0x1fffff, MWA32_ROM },
553 	{ 0x200000, 0x21ffff, MWA32_RAM },
554 	{ 0x300000, 0x303fff, MWA32_RAM, &spriteram32, &spriteram_size },
555 	{ 0x400000, 0x400003, cbombers_cpua_ctrl_w },
556 	{ 0x500000, 0x500007, undrfire_input_w },
557 	{ 0x600000, 0x600007, cbombers_adc_w },
558 	{ 0x700000, 0x7007ff, MWA32_RAM, &f3_shared_ram },
559 	{ 0x800000, 0x80ffff, TC0480SCP_long_w },		/* tilemaps */
560 	{ 0x830000, 0x83002f, TC0480SCP_ctrl_long_w },
561 	{ 0x900000, 0x90ffff, TC0100SCN_long_w },		/* piv tilemaps */
562 	{ 0x920000, 0x92000f, TC0100SCN_ctrl_long_w },
563     { 0xa00000, 0xa0ffff, color_ram_w, &paletteram32 },
564 	{ 0xb00000, 0xb0000f, MWA32_RAM }, /* ? */
565 	{ 0xc00000, 0xc00007, MWA32_RAM },/* LAN controller? */
566 	{ 0xd00000, 0xd00003, rotate_control_w },	/* perhaps port based rotate control? */
567 	{ 0xe00000, 0xe0ffff, MWA32_RAM, &shared_ram },
568 MEMORY_END
569 
570 static MEMORY_READ16_START( cbombers_sub_readmem )
571     { 0x000000, 0x03ffff, MRA16_ROM },
572 	{ 0x400000, 0x40ffff, MRA16_RAM	}, /* local ram */
573 	{ 0x800000, 0x80ffff, shared_ram_r },
574 MEMORY_END
575 
576 static MEMORY_WRITE16_START( cbombers_sub_writemem )
577     { 0x000000, 0x03ffff, MWA16_ROM },
578 	{ 0x400000, 0x40ffff, MWA16_RAM	},/* local ram */
579 	{ 0x800000, 0x80ffff, shared_ram_w },
580 MEMORY_END
581 
582 
583 /******************************************************************************/
584 
585 static MEMORY_READ16_START( sound_readmem )
586 	{ 0x000000, 0x03ffff, MRA16_RAM },
587 	{ 0x140000, 0x140fff, f3_68000_share_r },
588 	{ 0x200000, 0x20001f, ES5505_data_0_r },
589 	{ 0x260000, 0x2601ff, es5510_dsp_r },
590 	{ 0x280000, 0x28001f, f3_68681_r },
591 	{ 0xc00000, 0xcfffff, MRA16_BANK1 },
592 	{ 0xff8000, 0xffffff, MRA16_RAM },
593 MEMORY_END
594 
595 static MEMORY_WRITE16_START( sound_writemem )
596 	{ 0x000000, 0x03ffff, MWA16_RAM },
597 	{ 0x140000, 0x140fff, f3_68000_share_w },
598 	{ 0x200000, 0x20001f, ES5505_data_0_w },
599 	{ 0x260000, 0x2601ff, es5510_dsp_w },
600 	{ 0x280000, 0x28001f, f3_68681_w },
601 	{ 0x300000, 0x30003f, f3_es5505_bank_w },
602 	{ 0x340000, 0x340003, f3_volume_w }, /* 8 channel volume control */
603 	{ 0xc00000, 0xcfffff, MWA16_ROM },
604 	{ 0xff8000, 0xffffff, MWA16_RAM },
605 MEMORY_END
606 
607 
608 /***********************************************************
609 			 INPUT PORTS (dips in eprom)
610 ***********************************************************/
611 
612 INPUT_PORTS_START( undrfire )
613 	PORT_START      /* IN0 */
614 	PORT_BIT( 0x0001, IP_ACTIVE_LOW,  IPT_UNKNOWN )
615 	PORT_BIT( 0x0002, IP_ACTIVE_LOW,  IPT_UNKNOWN )
616 	PORT_BIT( 0x0004, IP_ACTIVE_LOW,  IPT_UNKNOWN )
617 	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON3 | IPF_PLAYER1 )	/* ? where is freeze input */
618 	PORT_BIT( 0x0010, IP_ACTIVE_LOW,  IPT_BUTTON1 | IPF_PLAYER1 )
619 	PORT_BIT( 0x0020, IP_ACTIVE_LOW,  IPT_BUTTON2 | IPF_PLAYER1 )
620 	PORT_BIT( 0x0040, IP_ACTIVE_LOW,  IPT_BUTTON1 | IPF_PLAYER2 )
621 	PORT_BIT( 0x0080, IP_ACTIVE_LOW,  IPT_BUTTON2 | IPF_PLAYER2 )
622 	PORT_BIT( 0x0100, IP_ACTIVE_LOW,  IPT_UNKNOWN )
623 	PORT_BIT( 0x0200, IP_ACTIVE_LOW,  IPT_UNKNOWN )
624 	PORT_BIT( 0x0400, IP_ACTIVE_LOW,  IPT_UNKNOWN )
625 	PORT_BIT( 0x0800, IP_ACTIVE_LOW,  IPT_UNKNOWN )
626 	PORT_BIT( 0x1000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
627 	PORT_BIT( 0x2000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
628 	PORT_BIT( 0x4000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
629 	PORT_BIT( 0x8000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
630 
631 	PORT_START      /* IN1 */
632 	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* Frame counter */
633 	PORT_BIT( 0x0002, IP_ACTIVE_LOW,  IPT_UNKNOWN )
634 	PORT_BIT( 0x0004, IP_ACTIVE_LOW,  IPT_UNKNOWN )
635 	PORT_BIT( 0x0008, IP_ACTIVE_LOW,  IPT_UNKNOWN )
636 	PORT_BIT( 0x0010, IP_ACTIVE_LOW,  IPT_UNKNOWN )
637 	PORT_BIT( 0x0020, IP_ACTIVE_LOW,  IPT_UNKNOWN )
638 	PORT_BIT( 0x0040, IP_ACTIVE_LOW,  IPT_UNKNOWN )
639 	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_SPECIAL )	/* reserved for EEROM */
640 	PORT_BIT( 0x0100, IP_ACTIVE_LOW,  IPT_UNKNOWN )
641 	PORT_BIT( 0x0200, IP_ACTIVE_LOW,  IPT_UNKNOWN )
642 	PORT_BIT( 0x0400, IP_ACTIVE_LOW,  IPT_UNKNOWN )
643 	PORT_BIT( 0x0800, IP_ACTIVE_LOW,  IPT_UNKNOWN )
644 	PORT_BIT( 0x1000, IP_ACTIVE_LOW,  IPT_START1 )
645 	PORT_BIT( 0x2000, IP_ACTIVE_LOW,  IPT_START2 )
646 	PORT_BIT( 0x4000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
647 	PORT_BIT( 0x8000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
648 
649 	PORT_START      /* IN2 */
650 	PORT_BITX(0x01, IP_ACTIVE_LOW,  IPT_SERVICE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE )
651 	PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_SERVICE1 )
652 	PORT_BIT( 0x04, IP_ACTIVE_LOW,  IPT_COIN1 )
653 	PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_COIN2 )
654 	PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_UNKNOWN )
655 	PORT_BIT( 0x20, IP_ACTIVE_LOW,  IPT_UNKNOWN )
656 	PORT_BIT( 0x40, IP_ACTIVE_LOW,  IPT_UNKNOWN )
657 	PORT_BIT( 0x80, IP_ACTIVE_LOW,  IPT_UNKNOWN )
658 
659 	/* Gun inputs (real range is 0-0xffff: we use standard 0-255 and shift later) */
660 
661 	PORT_START	/* IN 3, P1X */
662 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER1, 20, 25, 0, 0xff)
663 
664 	PORT_START	/* IN 4, P1Y */
665 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER1, 20, 25, 0, 0xff)
666 
667 	PORT_START	/* IN 5, P2X */
668 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_X | IPF_REVERSE | IPF_PLAYER2, 20, 25, 0, 0xff)
669 
670 	PORT_START	/* IN 6, P2Y */
671 	PORT_ANALOG( 0xff, 0x80, IPT_LIGHTGUN_Y | IPF_PLAYER2, 20, 25, 0, 0xff)
672 
673 	PORT_START	/* Fake DSW */
674 	PORT_BITX(    0x01, 0x00, IPT_DIPSWITCH_NAME | IPF_TOGGLE, "Show gun target", KEYCODE_F1, IP_JOY_NONE )
675 	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
676 	PORT_DIPSETTING(    0x01, DEF_STR( Yes ) )
677 INPUT_PORTS_END
678 
679 
680 INPUT_PORTS_START( cbombers )
681 	PORT_START
682 	PORT_BIT( 0x0001, IP_ACTIVE_LOW,  IPT_UNKNOWN )
683 	PORT_BIT( 0x0002, IP_ACTIVE_LOW,  IPT_UNKNOWN )
684 	PORT_BIT( 0x0004, IP_ACTIVE_LOW,  IPT_UNKNOWN )
685 	PORT_BIT( 0x0008, IP_ACTIVE_HIGH, IPT_BUTTON5 ) /* ? where is freeze input */
686 	PORT_BIT( 0x0010, IP_ACTIVE_LOW,  IPT_UNKNOWN )
687 	PORT_BIT( 0x0020, IP_ACTIVE_LOW,  IPT_UNKNOWN )
688 	PORT_BIT( 0x0040, IP_ACTIVE_LOW,  IPT_UNKNOWN )
689 	PORT_BIT( 0x0080, IP_ACTIVE_LOW,  IPT_UNKNOWN )
690 	PORT_BITX(0x0100, IP_ACTIVE_LOW,  IPT_BUTTON4 | IPF_TOGGLE, "Gear Shift", IP_KEY_DEFAULT, IP_JOY_DEFAULT )
691 	PORT_BITX(0x0200, IP_ACTIVE_LOW,  IPT_BUTTON3, "Fire", IP_KEY_DEFAULT, IP_JOY_DEFAULT )
692 	PORT_BITX(0x0400, IP_ACTIVE_LOW,  IPT_BUTTON1, "Accelerator", IP_KEY_DEFAULT, IP_JOY_DEFAULT )
693 	PORT_BITX(0x0800, IP_ACTIVE_LOW,  IPT_BUTTON2, "Brake", IP_KEY_DEFAULT, IP_JOY_DEFAULT )
694 	PORT_BIT( 0x1000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
695 	PORT_BIT( 0x2000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
696 	PORT_BIT( 0x4000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
697 	PORT_BIT( 0x8000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
698 
699 	PORT_START
700 	PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* Frame counter */
701 	PORT_BIT( 0x0002, IP_ACTIVE_LOW,  IPT_UNKNOWN )
702 	PORT_BIT( 0x0004, IP_ACTIVE_LOW,  IPT_UNKNOWN )
703 	PORT_BIT( 0x0008, IP_ACTIVE_LOW,  IPT_UNKNOWN )
704 	PORT_BIT( 0x0010, IP_ACTIVE_LOW,  IPT_UNKNOWN )
705 	PORT_BIT( 0x0020, IP_ACTIVE_LOW,  IPT_UNKNOWN )
706 	PORT_BIT( 0x0040, IP_ACTIVE_LOW,  IPT_UNKNOWN )
707 	PORT_BIT( 0x0080, IP_ACTIVE_HIGH, IPT_SPECIAL )	/* reserved for EEROM */
708 	PORT_BIT( 0x0100, IP_ACTIVE_LOW,  IPT_UNKNOWN )
709 	PORT_BIT( 0x0200, IP_ACTIVE_LOW,  IPT_UNKNOWN )
710 	PORT_BIT( 0x0400, IP_ACTIVE_LOW,  IPT_UNKNOWN )
711 	PORT_BIT( 0x0800, IP_ACTIVE_LOW,  IPT_UNKNOWN )
712 	PORT_BIT( 0x1000, IP_ACTIVE_LOW,  IPT_START1 )
713 	PORT_BIT( 0x2000, IP_ACTIVE_LOW,  IPT_START2 )
714 	PORT_BIT( 0x4000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
715 	PORT_BIT( 0x8000, IP_ACTIVE_LOW,  IPT_UNKNOWN )
716 
717 	PORT_START
718 	PORT_BITX(0x01, IP_ACTIVE_LOW,  IPT_SERVICE, DEF_STR( Service_Mode ), KEYCODE_F2, IP_JOY_NONE )
719 	PORT_BIT( 0x02, IP_ACTIVE_LOW,  IPT_SERVICE1 )
720 	PORT_BIT( 0x04, IP_ACTIVE_LOW,  IPT_COIN1 )
721 	PORT_BIT( 0x08, IP_ACTIVE_LOW,  IPT_COIN2 )
722 	PORT_BIT( 0x10, IP_ACTIVE_LOW,  IPT_UNKNOWN )
723 	PORT_BIT( 0x20, IP_ACTIVE_LOW,  IPT_UNKNOWN )
724 	PORT_BIT( 0x40, IP_ACTIVE_LOW,  IPT_UNKNOWN )
725 	PORT_BIT( 0x80, IP_ACTIVE_LOW,  IPT_UNKNOWN )
726 
727 	PORT_START	/* IN 3, steering wheel */
728 	PORT_ANALOG( 0xff, 0x7f, IPT_AD_STICK_X | IPF_REVERSE | IPF_PLAYER1, 25, 15, 0, 0xff)
729 INPUT_PORTS_END
730 
731 
732 /**********************************************************
733 				GFX DECODING
734 **********************************************************/
735 
736 static struct GfxLayout tile16x16_layout =
737 {
738 	16,16,	/* 16*16 sprites */
739 	RGN_FRAC(1,2),
740 	5,	/* 5 bits per pixel */
741 	{ RGN_FRAC(1,2), 0, 8, 16, 24,},
742 	{ 32, 33, 34, 35, 36, 37, 38, 39, 0, 1, 2, 3, 4, 5, 6, 7 },
743 	{ 0*64, 1*64,  2*64,  3*64,  4*64,  5*64,  6*64,  7*64,
744 	  8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
745 	64*16	/* every sprite takes 128 consecutive bytes */
746 };
747 
748 static struct GfxLayout charlayout =
749 {
750 	16,16,    /* 16*16 characters */
751 	RGN_FRAC(1,1),
752 	4,        /* 4 bits per pixel */
753 	{ 0, 1, 2, 3 },
754 	{ 1*4, 0*4, 5*4, 4*4, 3*4, 2*4, 7*4, 6*4, 9*4, 8*4, 13*4, 12*4, 11*4, 10*4, 15*4, 14*4 },
755 	{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
756 	128*8     /* every sprite takes 128 consecutive bytes */
757 };
758 
759 static struct GfxLayout pivlayout =
760 {
761 	8,8,    /* 8*8 characters */
762 	RGN_FRAC(1,2),
763 	6,      /* 4 bits per pixel */
764 	{ RGN_FRAC(1,2), RGN_FRAC(1,2)+1, 0, 1, 2, 3 },
765 	{ 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4 },
766 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
767 	32*8    /* every sprite takes 32 consecutive bytes */
768 };
769 
770 static struct GfxDecodeInfo undrfire_gfxdecodeinfo[] =
771 {
772 	{ REGION_GFX2, 0x0, &tile16x16_layout,  0, 512 },
773 	{ REGION_GFX1, 0x0, &charlayout,        0, 512 },
774 	{ REGION_GFX3, 0x0, &pivlayout,         0, 512 },
775 	{ -1 } /* end of array */
776 };
777 
778 static struct GfxDecodeInfo cbombers_gfxdecodeinfo[] =
779 {
780 	{ REGION_GFX2, 0x0, &tile16x16_layout,  0, 512 },
781 	{ REGION_GFX1, 0x0, &charlayout,        0x1000, 512 },
782 	{ REGION_GFX3, 0x0, &pivlayout,         0, 512 },
783 	{ -1 } /* end of array */
784 };
785 
786 
787 /***********************************************************
788 			     MACHINE DRIVERS
789 ***********************************************************/
790 
791 
MACHINE_INIT(undrfire)792 static MACHINE_INIT( undrfire )
793 {
794 	/* Sound cpu program loads to 0xc00000 so we use a bank */
795 	data16_t *RAM = (data16_t *)memory_region(REGION_CPU2);
796 	cpu_setbank(1,&RAM[0x80000]);
797 
798 	RAM[0]=RAM[0x80000]; /* Stack and Reset vectors */
799 	RAM[1]=RAM[0x80001];
800 	RAM[2]=RAM[0x80002];
801 	RAM[3]=RAM[0x80003];
802 
803 	f3_68681_reset();
804 }
805 
806 
807 static struct ES5505interface es5505_interface =
808 {
809 	1,					/* total number of chips */
810 	{ 30476000 / 2 },	/* freq */
811 	{ REGION_SOUND1 },	/* Bank 0: Unused by F3 games? */
812 	{ REGION_SOUND1 },	/* Bank 1: All games seem to use this */
813 	{ YM3012_VOL(100,MIXER_PAN_LEFT,100,MIXER_PAN_RIGHT) },		/* master volume */
814 };
815 
INTERRUPT_GEN(undrfire_interrupt)816 static INTERRUPT_GEN( undrfire_interrupt )
817 {
818 	frame_counter^=1;
819 	cpu_set_irq_line(0, 4, HOLD_LINE);
820 }
821 
822 static MACHINE_DRIVER_START( undrfire )
823 
824 	/* basic machine hardware */
825 	MDRV_CPU_ADD(M68EC020, 16000000)	/* 16 MHz */
MDRV_CPU_MEMORY(undrfire_readmem,undrfire_writemem)826 	MDRV_CPU_MEMORY(undrfire_readmem,undrfire_writemem)
827 	MDRV_CPU_VBLANK_INT(undrfire_interrupt,1)
828 
829 	MDRV_CPU_ADD(M68000, 16000000)
830 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
831 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
832 
833 	MDRV_FRAMES_PER_SECOND(60)
834 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
835 
836 	MDRV_MACHINE_INIT(undrfire)
837 	MDRV_NVRAM_HANDLER(undrfire)
838 
839 	/* video hardware */
840 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN)
841 	MDRV_SCREEN_SIZE(40*8, 32*8)
842 	MDRV_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1)
843 	MDRV_GFXDECODE(undrfire_gfxdecodeinfo)
844 	MDRV_PALETTE_LENGTH(16384)
845 
846 	MDRV_VIDEO_START(undrfire)
847 	MDRV_VIDEO_UPDATE(undrfire)
848 
849 	/* sound hardware */
850 	MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
851 	MDRV_SOUND_ADD(ES5505, es5505_interface)
852 MACHINE_DRIVER_END
853 
854 
855 static MACHINE_DRIVER_START( cbombers )
856 
857 	/* basic machine hardware */
858 	MDRV_CPU_ADD(M68EC020, 16000000)	/* 16 MHz */
859 	MDRV_CPU_MEMORY(cbombers_readmem, cbombers_writemem)
860 	MDRV_CPU_VBLANK_INT(irq4_line_hold,1)
861 
862 	MDRV_CPU_ADD(M68000, 16000000)  /* 16 MHz */
863 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)
864 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
865 
866 	MDRV_CPU_ADD(M68000, 16000000)	/* 16 MHz */
867 	MDRV_CPU_MEMORY(cbombers_sub_readmem, cbombers_sub_writemem)
868 	MDRV_CPU_VBLANK_INT(irq4_line_hold,1)
869 
870 	MDRV_INTERLEAVE(5)	/* CPU slices - Need to interleave Cpu's 1 & 3 */
871 	MDRV_FRAMES_PER_SECOND(60)
872 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
873 
874 	MDRV_MACHINE_INIT(undrfire)
875 	MDRV_NVRAM_HANDLER(undrfire)
876 
877 	/* video hardware */
878 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_NEEDS_6BITS_PER_GUN)
879 	MDRV_SCREEN_SIZE(40*8, 32*8)
880 	MDRV_VISIBLE_AREA(0, 40*8-1, 3*8, 32*8-1)
881 	MDRV_GFXDECODE(cbombers_gfxdecodeinfo)
882 	MDRV_PALETTE_LENGTH(16384)
883 
884 	MDRV_VIDEO_START(undrfire)
885 	MDRV_VIDEO_UPDATE(cbombers)
886 
887 	/* sound hardware */
888 	MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
889 	MDRV_SOUND_ADD(ES5505, es5505_interface)
890 MACHINE_DRIVER_END
891 
892 /***************************************************************************
893 					DRIVERS
894 ***************************************************************************/
895 
896 ROM_START( undrfire )
897 	ROM_REGION( 0x200000, REGION_CPU1, 0 )	/* 2048K for 68020 code (CPU A) */
898 	ROM_LOAD32_BYTE( "d67-19", 0x00000, 0x80000, CRC(1d88fa5a) SHA1(5e498efb9535a8f4e82b5525390b8bde7c45c07e) )
899 	ROM_LOAD32_BYTE( "d67-18", 0x00001, 0x80000, CRC(f41ae7fd) SHA1(bdd0df01b11205c263d2fa280746826b831d58bc) )
900 	ROM_LOAD32_BYTE( "d67-17", 0x00002, 0x80000, CRC(34e030b7) SHA1(62c270c817199a56e647ea74849fe5c07717ac18) )
901 	ROM_LOAD32_BYTE( "d67-23", 0x00003, 0x80000, CRC(28e84e0a) SHA1(74c73c6df07d33ef4c0a29f8c1ee1a33eee922da) )
902 
903 	ROM_REGION( 0x140000, REGION_CPU2, 0 )
904 	ROM_LOAD16_BYTE( "d67-20", 0x100000, 0x20000,  CRC(974ebf69) SHA1(8a5de503c514bf0da0c956e2dfdf0cfb83ea1f72) )
905 	ROM_LOAD16_BYTE( "d67-21", 0x100001, 0x20000,  CRC(8fc6046f) SHA1(28522ce5c5900f74d3faa86710256a7201b32500) )
906 
907 	ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE )
908 	ROM_LOAD16_BYTE( "d67-08", 0x000000, 0x200000, CRC(56730d44) SHA1(110872714b3c26a82473c7b80c120918b91b1b4b) )	/* SCR 16x16 tiles */
909 	ROM_LOAD16_BYTE( "d67-09", 0x000001, 0x200000, CRC(3c19f9e3) SHA1(7ba8475d37cbf8bf38029124afdf62c915c8668d) )
910 
911 	ROM_REGION( 0x1000000, REGION_GFX2, ROMREGION_DISPOSE )
912 	ROM_LOAD32_BYTE( "d67-03", 0x000003, 0x200000, CRC(3b6e99a9) SHA1(1e0e66763ddfa18a2d291626b245633555092959) )	/* OBJ 16x16 tiles */
913 	ROM_LOAD32_BYTE( "d67-04", 0x000002, 0x200000, CRC(8f2934c9) SHA1(ead95b34eec3a6df27199edcbdd5595bc6555a50) )
914 	ROM_LOAD32_BYTE( "d67-05", 0x000001, 0x200000, CRC(e2e7dcf3) SHA1(185dbd0489931123a295139dc0a045ad239018fb) )
915 	ROM_LOAD32_BYTE( "d67-06", 0x000000, 0x200000, CRC(a2a63488) SHA1(a1ed140cc3757c3c05a0a822089c6efc83bf4805) )
916 	ROM_LOAD32_BYTE( "d67-07", 0x800000, 0x200000, CRC(189c0ee5) SHA1(de85b39dc67f31ef80800ff6ec9a391652eb12e4) )
917 
918 	ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE )
919 	ROM_LOAD16_BYTE( "d67-10", 0x000000, 0x100000, CRC(d79e6ce9) SHA1(8b38302971816d599cdaa3279cb6395441373c6f) )	/* PIV 8x8 tiles, 6bpp */
920 	ROM_LOAD16_BYTE( "d67-11", 0x000001, 0x100000, CRC(7a401bb3) SHA1(47257a6a4b37ec1ceb4e974b776ee3ea30db06fa) )
921 	ROM_LOAD       ( "d67-12", 0x300000, 0x100000, CRC(67b16fec) SHA1(af0f9f50516331780ef6cfab1e12a23edf87daa7) )
922 	ROM_FILL       (           0x200000, 0x100000, 0 )
923 
924 	ROM_REGION16_LE( 0x80000, REGION_USER1, 0 )
925 	ROM_LOAD16_WORD( "d67-13", 0x00000,  0x80000,  CRC(42e7690d) SHA1(5f00f3f814653733bf9a5cb010675799de02fa76) )	/* STY, spritemap */
926 
927 	ROM_REGION16_BE( 0x1000000, REGION_SOUND1, ROMREGION_SOUNDONLY | ROMREGION_ERASE00 )
928 	ROM_LOAD16_BYTE( "d67-01", 0x000000, 0x200000, CRC(a2f18122) SHA1(640014c6e6d66c59fe0accf370ad3bab9f40429a) )	/* Ensoniq samples */
929 	ROM_LOAD16_BYTE( "d67-02", 0xc00000, 0x200000, CRC(fceb715e) SHA1(9326513acb0696669d4f2345649ab37c8c6ed171) )
930 ROM_END
931 
932 
933 ROM_START( undrfiru )
934 	ROM_REGION( 0x200000, REGION_CPU1, 0 )	/* 2048K for 68020 code (CPU A) */
935 	ROM_LOAD32_BYTE( "d67-19", 0x00000, 0x80000, CRC(1d88fa5a) SHA1(5e498efb9535a8f4e82b5525390b8bde7c45c07e) )
936 	ROM_LOAD32_BYTE( "d67-18", 0x00001, 0x80000, CRC(f41ae7fd) SHA1(bdd0df01b11205c263d2fa280746826b831d58bc) )
937 	ROM_LOAD32_BYTE( "d67-17", 0x00002, 0x80000, CRC(34e030b7) SHA1(62c270c817199a56e647ea74849fe5c07717ac18) )
938 	ROM_LOAD32_BYTE( "d67-22", 0x00003, 0x80000, CRC(5fef7e9c) SHA1(03a6ea0715ce8705d74550186b22940f8a49c088) )
939 
940 	ROM_REGION( 0x140000, REGION_CPU2, 0 )
941 	ROM_LOAD16_BYTE( "d67-20", 0x100000, 0x20000,  CRC(974ebf69) SHA1(8a5de503c514bf0da0c956e2dfdf0cfb83ea1f72) )
942 	ROM_LOAD16_BYTE( "d67-21", 0x100001, 0x20000,  CRC(8fc6046f) SHA1(28522ce5c5900f74d3faa86710256a7201b32500) )
943 
944 	ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE )
945 	ROM_LOAD16_BYTE( "d67-08", 0x000000, 0x200000, CRC(56730d44) SHA1(110872714b3c26a82473c7b80c120918b91b1b4b) )	/* SCR 16x16 tiles */
946 	ROM_LOAD16_BYTE( "d67-09", 0x000001, 0x200000, CRC(3c19f9e3) SHA1(7ba8475d37cbf8bf38029124afdf62c915c8668d) )
947 
948 	ROM_REGION( 0x1000000, REGION_GFX2, ROMREGION_DISPOSE )
949 	ROM_LOAD32_BYTE( "d67-03", 0x000003, 0x200000, CRC(3b6e99a9) SHA1(1e0e66763ddfa18a2d291626b245633555092959) )	/* OBJ 16x16 tiles */
950 	ROM_LOAD32_BYTE( "d67-04", 0x000002, 0x200000, CRC(8f2934c9) SHA1(ead95b34eec3a6df27199edcbdd5595bc6555a50) )
951 	ROM_LOAD32_BYTE( "d67-05", 0x000001, 0x200000, CRC(e2e7dcf3) SHA1(185dbd0489931123a295139dc0a045ad239018fb) )
952 	ROM_LOAD32_BYTE( "d67-06", 0x000000, 0x200000, CRC(a2a63488) SHA1(a1ed140cc3757c3c05a0a822089c6efc83bf4805) )
953 	ROM_LOAD32_BYTE( "d67-07", 0x800000, 0x200000, CRC(189c0ee5) SHA1(de85b39dc67f31ef80800ff6ec9a391652eb12e4) )
954 
955 	ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE )
956 	ROM_LOAD16_BYTE( "d67-10", 0x000000, 0x100000, CRC(d79e6ce9) SHA1(8b38302971816d599cdaa3279cb6395441373c6f) )	/* PIV 8x8 tiles, 6bpp */
957 	ROM_LOAD16_BYTE( "d67-11", 0x000001, 0x100000, CRC(7a401bb3) SHA1(47257a6a4b37ec1ceb4e974b776ee3ea30db06fa) )
958 	ROM_LOAD       ( "d67-12", 0x300000, 0x100000, CRC(67b16fec) SHA1(af0f9f50516331780ef6cfab1e12a23edf87daa7) )
959 	ROM_FILL       (           0x200000, 0x100000, 0 )
960 
961 	ROM_REGION16_LE( 0x80000, REGION_USER1, 0 )
962 	ROM_LOAD16_WORD( "d67-13", 0x00000,  0x80000,  CRC(42e7690d) SHA1(5f00f3f814653733bf9a5cb010675799de02fa76) )	/* STY, spritemap */
963 
964 	ROM_REGION16_BE( 0x1000000, REGION_SOUND1, ROMREGION_SOUNDONLY | ROMREGION_ERASE00 )
965 	ROM_LOAD16_BYTE( "d67-01", 0x000000, 0x200000, CRC(a2f18122) SHA1(640014c6e6d66c59fe0accf370ad3bab9f40429a) )	/* Ensoniq samples */
966 	ROM_LOAD16_BYTE( "d67-02", 0xc00000, 0x200000, CRC(fceb715e) SHA1(9326513acb0696669d4f2345649ab37c8c6ed171) )
967 ROM_END
968 
969 ROM_START( undrfirj )
970 	ROM_REGION( 0x200000, REGION_CPU1, 0 )	/* 2048K for 68020 code (CPU A) */
971 	ROM_LOAD32_BYTE( "d67-19", 0x00000, 0x80000, CRC(1d88fa5a) SHA1(5e498efb9535a8f4e82b5525390b8bde7c45c07e) )
972 	ROM_LOAD32_BYTE( "d67-18", 0x00001, 0x80000, CRC(f41ae7fd) SHA1(bdd0df01b11205c263d2fa280746826b831d58bc) )
973 	ROM_LOAD32_BYTE( "d67-17", 0x00002, 0x80000, CRC(34e030b7) SHA1(62c270c817199a56e647ea74849fe5c07717ac18) )
974 	ROM_LOAD32_BYTE( "d67-16", 0x00003, 0x80000, CRC(c6e62f26) SHA1(6a430916f829a4b0240ccf8477dcbb1f39a26e90) )
975 
976 	ROM_REGION( 0x140000, REGION_CPU2, 0 )
977 	ROM_LOAD16_BYTE( "d67-20", 0x100000, 0x20000,  CRC(974ebf69) SHA1(8a5de503c514bf0da0c956e2dfdf0cfb83ea1f72) )
978 	ROM_LOAD16_BYTE( "d67-21", 0x100001, 0x20000,  CRC(8fc6046f) SHA1(28522ce5c5900f74d3faa86710256a7201b32500) )
979 
980 	ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE )
981 	ROM_LOAD16_BYTE( "d67-08", 0x000000, 0x200000, CRC(56730d44) SHA1(110872714b3c26a82473c7b80c120918b91b1b4b) )	/* SCR 16x16 tiles */
982 	ROM_LOAD16_BYTE( "d67-09", 0x000001, 0x200000, CRC(3c19f9e3) SHA1(7ba8475d37cbf8bf38029124afdf62c915c8668d) )
983 
984 	ROM_REGION( 0x1000000, REGION_GFX2, ROMREGION_DISPOSE )
985 	ROM_LOAD32_BYTE( "d67-03", 0x000003, 0x200000, CRC(3b6e99a9) SHA1(1e0e66763ddfa18a2d291626b245633555092959) )	/* OBJ 16x16 tiles */
986 	ROM_LOAD32_BYTE( "d67-04", 0x000002, 0x200000, CRC(8f2934c9) SHA1(ead95b34eec3a6df27199edcbdd5595bc6555a50) )
987 	ROM_LOAD32_BYTE( "d67-05", 0x000001, 0x200000, CRC(e2e7dcf3) SHA1(185dbd0489931123a295139dc0a045ad239018fb) )
988 	ROM_LOAD32_BYTE( "d67-06", 0x000000, 0x200000, CRC(a2a63488) SHA1(a1ed140cc3757c3c05a0a822089c6efc83bf4805) )
989 	ROM_LOAD32_BYTE( "d67-07", 0x800000, 0x200000, CRC(189c0ee5) SHA1(de85b39dc67f31ef80800ff6ec9a391652eb12e4) )
990 
991 	ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE )
992 	ROM_LOAD16_BYTE( "d67-10", 0x000000, 0x100000, CRC(d79e6ce9) SHA1(8b38302971816d599cdaa3279cb6395441373c6f) )	/* PIV 8x8 tiles, 6bpp */
993 	ROM_LOAD16_BYTE( "d67-11", 0x000001, 0x100000, CRC(7a401bb3) SHA1(47257a6a4b37ec1ceb4e974b776ee3ea30db06fa) )
994 	ROM_LOAD       ( "d67-12", 0x300000, 0x100000, CRC(67b16fec) SHA1(af0f9f50516331780ef6cfab1e12a23edf87daa7) )
995 	ROM_FILL       (           0x200000, 0x100000, 0 )
996 
997 	ROM_REGION16_LE( 0x80000, REGION_USER1, 0 )
998 	ROM_LOAD16_WORD( "d67-13", 0x00000,  0x80000,  CRC(42e7690d) SHA1(5f00f3f814653733bf9a5cb010675799de02fa76) )	/* STY, spritemap */
999 
1000 	ROM_REGION16_BE( 0x1000000, REGION_SOUND1, ROMREGION_SOUNDONLY | ROMREGION_ERASE00 )
1001 	ROM_LOAD16_BYTE( "d67-01", 0x000000, 0x200000, CRC(a2f18122) SHA1(640014c6e6d66c59fe0accf370ad3bab9f40429a) )	/* Ensoniq samples */
1002 	ROM_LOAD16_BYTE( "d67-02", 0xc00000, 0x200000, CRC(fceb715e) SHA1(9326513acb0696669d4f2345649ab37c8c6ed171) )
1003 ROM_END
1004 
1005 ROM_START( cbombers )
1006 	ROM_REGION( 0x200000, REGION_CPU1, 0 )	/* 2048K for 68020 code (CPU A) */
1007 	ROM_LOAD32_BYTE( "d83_39.ic17", 0x00000, 0x80000, CRC(b9f48284) SHA1(acc5d412e8900dda483a89a1ac1febd6d5735f3c) )
1008 	ROM_LOAD32_BYTE( "d83_41.ic4",  0x00001, 0x80000, CRC(a2f4c8be) SHA1(0f8f3b5ecff34d8c35af1ab11bb5528b52e30109) )
1009 	ROM_LOAD32_BYTE( "d83_40.ic3",  0x00002, 0x80000, CRC(b05f59ea) SHA1(e46a31737f44be2a3d478b8010fe0d6383290e03) )
1010 	ROM_LOAD32_BYTE( "d83_38.ic16", 0x00003, 0x80000, CRC(0a10616c) SHA1(c9cfc8c870f8a989f004d2db4f6fb76e5b7b7f9b) )
1011 
1012 	ROM_REGION( 0x140000, REGION_CPU2, 0 )	/* Sound cpu */
1013 	ROM_LOAD16_BYTE( "d83_26.ic37", 0x100000, 0x20000, CRC(4f49b484) SHA1(96daa3cb7fa4aae3aedc91ec27d85945311dfcc9) )
1014 	ROM_LOAD16_BYTE( "d83_27.ic38", 0x100001, 0x20000, CRC(2aa1a237) SHA1(b809f75bbbbb4eb5d0df725aaa31aae8a6fba552) )
1015 
1016 	ROM_REGION( 0x40000, REGION_CPU3, 0 )	/* 256K for 68000 code (CPU B) */
1017 	ROM_LOAD16_BYTE( "d83_28.ic26", 0x00001, 0x20000, CRC(06328ef7) SHA1(90a14649e56221e47b87958896f6eae4556265c2) )
1018 	ROM_LOAD16_BYTE( "d83_29.ic27", 0x00000, 0x20000, CRC(771b4080) SHA1(a47c3a6abc07a6a61b694d32baa0ad4c25045841) )
1019 
1020 	ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE )
1021 	ROM_LOAD16_BYTE( "d83_04.ic8", 0x000000, 0x200000, CRC(79f36cce) SHA1(2c8dc4cd5c4aa335c1e45888f5947acf94fa628a) )
1022 	ROM_LOAD16_BYTE( "d83_05.ic7", 0x000001, 0x200000, CRC(7787e495) SHA1(1758de5fdd1d12727368d08d7d4752c3756fc23e) )
1023 
1024 	ROM_REGION( 0x1800000, REGION_GFX2, ROMREGION_DISPOSE )
1025 	ROM_LOAD32_BYTE( "d83_06.ic28", 0x000003, 0x200000, CRC(4b71944e) SHA1(e8ed190280c7378fb4edcb192cef0d4d62582ad5) )
1026 	ROM_LOAD32_BYTE( "d83_07.ic30", 0x000002, 0x200000, CRC(29861b61) SHA1(76562b0243c1bc38623c0ef9d20de7572a979e37) )
1027 	ROM_LOAD32_BYTE( "d83_08.ic32", 0x000001, 0x200000, CRC(a0e81e01) SHA1(96ad8cfc849caaf85350cfc7cf23ad23635a3813) )
1028 	ROM_LOAD32_BYTE( "d83_09.ic45", 0x000000, 0x200000, CRC(7e4dec50) SHA1(4d8c1be739d425d8ded07774094b775f35a915bf) )
1029 	ROM_LOAD32_BYTE( "d83_11.ic41", 0x800003, 0x100000, CRC(a790e490) SHA1(9c57405ef2ef3368eb0958a3e43601110c1cc90d) )
1030 	ROM_LOAD32_BYTE( "d83_12.ic29", 0x800002, 0x100000, CRC(2f237b0d) SHA1(2ecb947671d263a77510bfebda03f883b55b8df4) )
1031 	ROM_LOAD32_BYTE( "d83_13.ic31", 0x800001, 0x100000, CRC(c2cceeb6) SHA1(3ec932655326caed13a40394bbf8e8baf836de2a) )
1032 	ROM_LOAD32_BYTE( "d83_14.ic44", 0x800000, 0x100000, CRC(8b6f4f12) SHA1(6a28004d287f00627622376aa3d6704f2684a6f3) )
1033 	ROM_LOAD32_BYTE( "d83_10.ic43", 0xc00000, 0x200000, CRC(36c440a0) SHA1(31685d3cdf4e39e1365df7e6a588c28f95d7e0a8) )
1034 	ROM_LOAD32_BYTE( "d83_15.ic42", 0x1400000, 0x100000, CRC(1b71175e) SHA1(60ad38ce97fd7995ff2f29d6b1a3b873dc2f0eb3) )
1035 
1036 	ROM_REGION( 0x400000, REGION_GFX3, ROMREGION_DISPOSE )
1037 	ROM_LOAD16_BYTE( "d83_16.ic19", 0x000000, 0x100000, CRC(d364cf1e) SHA1(ee43f50edf50ec840acfb98b1314140ee9693839) )
1038 	ROM_LOAD16_BYTE( "d83_17.ic5",  0x000001, 0x100000, CRC(0ffe737c) SHA1(5923a4edf9d0c8339f793840c2bdc691e2c651e6) )
1039 	ROM_LOAD       ( "d83_18.ic6",  0x300000, 0x100000, CRC(87979155) SHA1(0ffafa970f9f9c98f8938104b97e63d2b5757804) )
1040 	ROM_FILL       (                0x200000, 0x100000, 0 )
1041 
1042 	ROM_REGION16_LE( 0x80000, REGION_USER1, 0 )
1043 	ROM_LOAD16_BYTE( "d83_31.ic10", 0x000001, 0x40000, CRC(85c37961) SHA1(15ea5c4904d910575e984e146c8941dff913d45f) )
1044 	ROM_LOAD16_BYTE( "d83_32.ic11", 0x000000, 0x40000, CRC(b0db2559) SHA1(2bfae2dbe164b42e95d0a93fab82b7040c3fbc56) )
1045 
1046 	ROM_REGION( 0x40000, REGION_USER2, 0 )
1047 	ROM_LOAD( "d83_30.ic9", 0x00000,  0x40000,  CRC(eb86dc67) SHA1(31c7b6f30ff912fafed4b87ce8bf603ee17d1664) )
1048 
1049 	ROM_REGION16_BE( 0x1000000,  REGION_SOUND1, ROMREGION_SOUNDONLY | ROMREGION_ERASE00 )
1050 	ROM_LOAD16_BYTE( "d83_01.ic40", 0xc00000, 0x200000, CRC(912799f4) SHA1(22f69e61519d2cddcfc4e4c9601e78a9d5265d5b) )
1051 	ROM_LOAD16_BYTE( "d83_02.ic39", 0x000000, 0x200000, CRC(2abca020) SHA1(3491a95651ca89b7fe6d040b8576fa7646bfe84b) )
1052 	ROM_RELOAD     (                0x400000, 0x200000 )
1053 	ROM_LOAD16_BYTE( "d83_03.ic18", 0x800000, 0x200000, CRC(1b2d9ec3) SHA1(ead6b5542ad3987ef0f9ea01ce7f960abc9119b3) )
1054 ROM_END
1055 
1056 
1057 static READ32_HANDLER( main_cycle_r )
1058 {
1059 	int ptr;
1060 	if ((activecpu_get_sp()&2)==0) ptr=undrfire_ram[(activecpu_get_sp()&0x1ffff)/4];
1061 	else ptr=(((undrfire_ram[(activecpu_get_sp()&0x1ffff)/4])&0x1ffff)<<16) |
1062 	(undrfire_ram[((activecpu_get_sp()&0x1ffff)/4)+1]>>16);
1063 
1064 	if (activecpu_get_pc()==0x682 && ptr==0x1156)
1065 		cpu_spinuntil_int();
1066 
1067 	return undrfire_ram[0x4f8/4];
1068 }
1069 
DRIVER_INIT(undrfire)1070 DRIVER_INIT( undrfire )
1071 {
1072 	unsigned int offset,i;
1073 	UINT8 *gfx = memory_region(REGION_GFX3);
1074 	int size=memory_region_length(REGION_GFX3);
1075 	int data;
1076 
1077 	/* Speedup handlers */
1078 	install_mem_read32_handler(0, 0x2004f8, 0x2004fb, main_cycle_r);
1079 
1080 	/* make piv tile GFX format suitable for gfxdecode */
1081 	offset = size/2;
1082 	for (i = size/2+size/4; i<size; i++)
1083 	{
1084 		int d1,d2,d3,d4;
1085 
1086 		/* Expand 2bits into 4bits format */
1087 		data = gfx[i];
1088 		d1 = (data>>0) & 3;
1089 		d2 = (data>>2) & 3;
1090 		d3 = (data>>4) & 3;
1091 		d4 = (data>>6) & 3;
1092 
1093 		gfx[offset] = (d1<<2) | (d2<<6);
1094 		offset++;
1095 
1096 		gfx[offset] = (d3<<2) | (d4<<6);
1097 		offset++;
1098 	}
1099 }
1100 
1101 
DRIVER_INIT(cbombers)1102 DRIVER_INIT( cbombers )
1103 {
1104 	unsigned int offset,i;
1105 	UINT8 *gfx = memory_region(REGION_GFX3);
1106 	int size=memory_region_length(REGION_GFX3);
1107 	int data;
1108 
1109 
1110 	/* make piv tile GFX format suitable for gfxdecode */
1111 	offset = size/2;
1112 	for (i = size/2+size/4; i<size; i++)
1113 	{
1114 		int d1,d2,d3,d4;
1115 
1116 		/* Expand 2bits into 4bits format */
1117 		data = gfx[i];
1118 		d1 = (data>>0) & 3;
1119 		d2 = (data>>2) & 3;
1120 		d3 = (data>>4) & 3;
1121 		d4 = (data>>6) & 3;
1122 
1123 		gfx[offset] = (d1<<2) | (d2<<6);
1124 		offset++;
1125 
1126 		gfx[offset] = (d3<<2) | (d4<<6);
1127 		offset++;
1128 	}
1129 }
1130 
1131 GAME( 1993, undrfire, 0,        undrfire, undrfire, undrfire, ROT0, "Taito Corporation Japan", "Under Fire (World)" )
1132 GAME( 1993, undrfiru, undrfire, undrfire, undrfire, undrfire, ROT0, "Taito America Corporation", "Under Fire (US)" )
1133 GAME( 1993, undrfirj, undrfire, undrfire, undrfire, undrfire, ROT0, "Taito Corporation", "Under Fire (Japan)" )
1134 GAME( 1994, cbombers, 0,        cbombers, cbombers, cbombers, ROT0, "Taito Corporation Japan", "Chase Bombers (World)" )
1135