1 /***************************************************************************
2 
3   Thunder Zone       (c) 1991 Data East Corporation (World 2 players)
4   Desert Assault     (c) 1991 Data East Corporation (USA 4 players)
5   Desert Assault     (c) 1991 Data East Corporation (USA 2 players)
6 
7   I'm not sure if one of the alpha blending effects is correct (mode 0x8000,
8   the usual mode 0x4000 should be correct).  It may be some kind of orthogonal
9   priority effect where it should cut a hole in other higher priority sprites
10   to reveal a non-alpha'd hole, or alpha against a further back tilemap.
11 
12   Emulation by Bryan McPhail, mish@tendril.co.uk
13 
14 
15 Stephh's notes (based on the games M68000 code and some tests) :
16 
17 0) all games
18 
19   - If the "Flip Screen" Dip Switch is correct, screen flipping is handled by
20     a write to 0x220000.w (dassault_control_1[0]) which isn't supported yet.
21   - I can't confirm the "Demo Sounds" Dip Switch, but the routine is the same
22     in all games (but different addresses) and it writes something to 0x180000.w
23     (see 'WRITE16_HANDLER( dassault_sound_w )').
24 
25 
26 1) 'thndzone'
27 
28   - "Max Players" Dip Switch set to "2" :
29 
30       * COIN1    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
31       * COIN2    : adds coin(s)/credit(s) depending on "Coin B" Dip Switch
32       * COIN3    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
33       * COIN4    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
34       * SERVICE1 : adds 4 coins/credits
35 
36       * START1   : starts a game for player 1
37       * START2   : starts a game for player 2
38 
39       * BUTTON1n : "fire"
40       * BUTTON2n : "nuke"
41 
42   - "Max Players" Dip Switch set to "4" :
43 
44       * COIN1    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
45       * COIN2    : adds coin(s)/credit(s) depending on "Coin B" Dip Switch
46       * COIN3    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
47       * COIN4    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
48       * SERVICE1 : adds 4 coins/credits
49 
50       * START1   : starts a game for player 1
51       * START2   : starts a game for player 2
52 
53       * BUTTON1n : "fire" + starts a game for player n
54       * BUTTON2n : "nuke"
55 
56 
57 2) 'dassault'
58 
59   - "Max Players" Dip Switch set to "2" :
60 
61       * COIN1    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
62       * COIN2    : adds coin(s)/credit(s) depending on "Coin B" Dip Switch
63       * COIN3    : NO EFFECT !
64       * COIN4    : NO EFFECT !
65       * SERVICE1 : adds 1 coin/credit
66 
67       * START1   : starts a game for player 1
68       * START2   : starts a game for player 2
69 
70       * BUTTON1n : "fire"
71       * BUTTON2n : "nuke"
72 
73   - "Max Players" Dip Switch set to "3" :
74 
75       * COIN1    : adds coin(s)/credit(s) for player 1 depending on "Coin A" Dip Switch
76       * COIN2    : adds coin(s)/credit(s) for player 2 depending on "Coin A" Dip Switch
77       * COIN3    : adds coin(s)/credit(s) for player 3 depending on "Coin A" Dip Switch
78       * COIN4    : adds coin(s)/credit(s) for FAKE player 4 depending on "Coin A" Dip Switch
79       * SERVICE1 : adds 1 coin/credit for all players (including FAKE player 4 !)
80 
81       * START1   : NO EFFECT !
82       * START2   : NO EFFECT !
83 
84       * BUTTON1n : "fire" + starts a game for player n
85       * BUTTON2n : "nuke"
86 
87   - "Max Players" Dip Switch set to "4" :
88 
89       * COIN1    : adds coin(s)/credit(s) for player 1 depending on "Coin A" Dip Switch
90       * COIN2    : adds coin(s)/credit(s) for player 2 depending on "Coin A" Dip Switch
91       * COIN3    : adds coin(s)/credit(s) for player 3 depending on "Coin A" Dip Switch
92       * COIN4    : adds coin(s)/credit(s) for player 4 depending on "Coin A" Dip Switch
93       * SERVICE1 : adds 1 coin/credit for all players
94 
95       * START1   : NO EFFECT !
96       * START2   : NO EFFECT !
97 
98       * BUTTON1n : "fire" + starts a game for player n
99       * BUTTON2n : "nuke"
100 
101 
102 3) 'dassaul4'
103 
104   - always 4 players :
105 
106       * COIN1    : adds coin(s)/credit(s) for player 1 depending on "Coinage" Dip Switch
107       * COIN2    : adds coin(s)/credit(s) for player 2 depending on "Coinage" Dip Switch
108       * COIN3    : adds coin(s)/credit(s) for player 3 depending on "Coinage" Dip Switch
109       * COIN4    : adds coin(s)/credit(s) for player 4 depending on "Coinage" Dip Switch
110       * SERVICE1 : adds 1 coin/credit
111 
112       * NO START1 !
113       * NO START2 !
114 
115       * BUTTON1n : "fire" + starts a game for player n
116       * BUTTON2n : "nuke"
117 
118 
119 ***************************************************************************/
120 
121 #include "driver.h"
122 #include "vidhrdw/generic.h"
123 #include "cpu/h6280/h6280.h"
124 #include "deco16ic.h"
125 
126 VIDEO_START( dassault );
127 VIDEO_UPDATE( dassault );
128 
129 static data16_t *dassault_ram,*shared_ram,*dassault_ram2;
130 
131 /**********************************************************************************/
132 
READ16_HANDLER(dassault_control_r)133 static READ16_HANDLER( dassault_control_r )
134 {
135 	switch (offset<<1)
136 	{
137 		case 0: /* Player 1 & Player 2 joysticks & fire buttons */
138 			return (readinputport(0) + (readinputport(1) << 8));
139 
140 		case 2: /* Player 3 & Player 4 joysticks & fire buttons */
141 			return (readinputport(6) + (readinputport(7) << 8));
142 
143 		case 4: /* Dip 1 (stored at 0x3f8035) */
144 			return readinputport(3);
145 
146 		case 6: /* Dip 2 (stored at 0x3f8034) */
147 			return readinputport(4);
148 
149 		case 8: /* VBL, Credits */
150 			return readinputport(2);
151 	}
152 
153 	return 0xffff;
154 }
155 
WRITE16_HANDLER(dassault_control_w)156 static WRITE16_HANDLER( dassault_control_w )
157 {
158 	coin_counter_w(0,data&1);
159 	if (data&0xfffe)
160 		log_cb(RETRO_LOG_DEBUG, LOGPRE "Coin cointrol %04x\n",data);
161 }
162 
READ16_HANDLER(dassault_sub_control_r)163 static READ16_HANDLER( dassault_sub_control_r )
164 {
165 	return readinputport(5);
166 }
167 
WRITE16_HANDLER(dassault_sound_w)168 static WRITE16_HANDLER( dassault_sound_w )
169 {
170 	soundlatch_w(0,data&0xff);
171 	cpu_set_irq_line(2,0,HOLD_LINE); /* IRQ1 */
172 }
173 
174 /* The CPU-CPU irq controller is overlaid onto the end of the shared memory */
READ16_HANDLER(dassault_irq_r)175 static READ16_HANDLER( dassault_irq_r )
176 {
177 	switch (offset) {
178 		case 0: cpu_set_irq_line(0, 5, CLEAR_LINE); break;
179 		case 1: cpu_set_irq_line(1, 6, CLEAR_LINE); break;
180 	}
181 	return shared_ram[(0xffc/2)+offset]; /* The values probably don't matter */
182 }
183 
WRITE16_HANDLER(dassault_irq_w)184 static WRITE16_HANDLER( dassault_irq_w )
185 {
186 	switch (offset) {
187 		case 0: cpu_set_irq_line(0, 5, ASSERT_LINE); break;
188 		case 1: cpu_set_irq_line(1, 6, ASSERT_LINE); break;
189 	}
190 
191 	COMBINE_DATA(&shared_ram[(0xffc/2)+offset]); /* The values probably don't matter */
192 }
193 
WRITE16_HANDLER(shared_ram_w)194 static WRITE16_HANDLER( shared_ram_w )
195 {
196 	COMBINE_DATA(&shared_ram[offset]);
197 }
198 
READ16_HANDLER(shared_ram_r)199 static READ16_HANDLER( shared_ram_r )
200 {
201 	return shared_ram[offset];
202 }
203 
204 /**********************************************************************************/
205 
MEMORY_READ16_START(dassault_readmem)206 static MEMORY_READ16_START( dassault_readmem )
207 	{ 0x000000, 0x07ffff, MRA16_ROM },
208 	{ 0x100000, 0x103fff, MRA16_RAM },
209 	{ 0x1c0000, 0x1c000f, dassault_control_r },
210 	{ 0x200000, 0x201fff, MRA16_RAM },
211 	{ 0x202000, 0x203fff, MRA16_RAM },
212 	{ 0x240000, 0x240fff, MRA16_RAM },
213 	{ 0x242000, 0x242fff, MRA16_RAM },
214 	{ 0x3f8000, 0x3fbfff, MRA16_RAM }, /* Main ram */
215 	{ 0x3fc000, 0x3fcfff, MRA16_RAM }, /* Spriteram (2nd) */
216 	{ 0x3feffc, 0x3fefff, dassault_irq_r },
217 	{ 0x3fe000, 0x3fefff, shared_ram_r }, /* Shared ram */
218 MEMORY_END
219 
220 static MEMORY_WRITE16_START( dassault_writemem )
221 	{ 0x000000, 0x07ffff, MWA16_ROM },
222 	{ 0x100000, 0x103fff, deco16_nonbuffered_palette_w, &paletteram16 },
223 	{ 0x140004, 0x140007, MWA16_NOP }, /* ? */
224 	{ 0x180000, 0x180001, dassault_sound_w },
225 	{ 0x1c000a, 0x1c000b, deco16_priority_w },
226 	{ 0x1c000c, 0x1c000d, buffer_spriteram16_2_w },
227 	{ 0x1c000e, 0x1c000f, dassault_control_w },
228 
229 	{ 0x200000, 0x201fff, deco16_pf1_data_w, &deco16_pf1_data },
230 	{ 0x202000, 0x203fff, deco16_pf2_data_w, &deco16_pf2_data },
231 	{ 0x212000, 0x212fff, MWA16_RAM, &deco16_pf2_rowscroll },
232 	{ 0x220000, 0x22000f, MWA16_RAM, &deco16_pf12_control },
233 
234 	{ 0x240000, 0x240fff, deco16_pf3_data_w, &deco16_pf3_data },
235 	{ 0x242000, 0x242fff, deco16_pf4_data_w, &deco16_pf4_data },
236 	{ 0x252000, 0x252fff, MWA16_RAM, &deco16_pf4_rowscroll },
237 	{ 0x260000, 0x26000f, MWA16_RAM, &deco16_pf34_control },
238 
239 	{ 0x3f8000, 0x3fbfff, MWA16_RAM, &dassault_ram },
240 	{ 0x3fc000, 0x3fcfff, MWA16_RAM, &spriteram16_2, &spriteram_2_size },
241 	{ 0x3feffc, 0x3fefff, dassault_irq_w },
242 	{ 0x3fe000, 0x3fefff, shared_ram_w, &shared_ram },
243 MEMORY_END
244 
245 static MEMORY_READ16_START( dassault_sub_readmem )
246 	{ 0x000000, 0x07ffff, MRA16_ROM },
247 	{ 0x100004, 0x100005, dassault_sub_control_r },
248 	{ 0x3f8000, 0x3fbfff, MRA16_RAM }, /* Sub cpu ram */
249 	{ 0x3fc000, 0x3fcfff, MRA16_RAM }, /* Sprite ram */
250 	{ 0x3feffc, 0x3fefff, dassault_irq_r },
251 	{ 0x3fe000, 0x3fefff, shared_ram_r },
252 MEMORY_END
253 
254 static MEMORY_WRITE16_START( dassault_sub_writemem )
255 	{ 0x000000, 0x07ffff, MWA16_ROM },
256 	{ 0x100000, 0x100001, buffer_spriteram16_w },
257 	{ 0x100002, 0x100007, MWA16_NOP }, /* ? */
258 	{ 0x3f8000, 0x3fbfff, MWA16_RAM, &dassault_ram2 },
259 	{ 0x3fc000, 0x3fcfff, MWA16_RAM, &spriteram16, &spriteram_size },
260 	{ 0x3feffc, 0x3fefff, dassault_irq_w },
261 	{ 0x3fe000, 0x3fefff, shared_ram_w },
262 MEMORY_END
263 
264 /******************************************************************************/
265 
266 static MEMORY_READ_START( sound_readmem )
267 	{ 0x000000, 0x00ffff, MRA_ROM },
268 	{ 0x100000, 0x100001, YM2203_status_port_0_r },
269 	{ 0x110000, 0x110001, YM2151_status_port_0_r },
270 	{ 0x120000, 0x120001, OKIM6295_status_0_r },
271 	{ 0x130000, 0x130001, OKIM6295_status_1_r },
272 	{ 0x140000, 0x140001, soundlatch_r },
273 	{ 0x1f0000, 0x1f1fff, MRA_BANK8 },
274 MEMORY_END
275 
276 static MEMORY_WRITE_START( sound_writemem )
277 	{ 0x000000, 0x00ffff, MWA_ROM },
278 	{ 0x100000, 0x100001, YM2203_word_0_w },
279 	{ 0x110000, 0x110001, YM2151_word_0_w },
280 	{ 0x120000, 0x120001, OKIM6295_data_0_w },
281 	{ 0x130000, 0x130001, OKIM6295_data_1_w },
282 	{ 0x1f0000, 0x1f1fff, MWA_BANK8 },
283 	{ 0x1fec00, 0x1fec01, H6280_timer_w },
284 	{ 0x1ff402, 0x1ff403, H6280_irq_status_w },
285 MEMORY_END
286 
287 /**********************************************************************************/
288 
289 #define DASSAULT_PLAYER_INPUT( player, start ) \
290 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | player ) \
291 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | player ) \
292 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | player ) \
293 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | player ) \
294 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | player ) \
295 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | player ) \
296 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) \
297 	PORT_BIT( 0x80, IP_ACTIVE_LOW, start )
298 
299 
300 INPUT_PORTS_START( thndzone )
301 	PORT_START
302 	DASSAULT_PLAYER_INPUT( IPF_PLAYER1, IPT_START1 )
303 
304 	PORT_START
305 	DASSAULT_PLAYER_INPUT( IPF_PLAYER2, IPT_START2 )
306 
307 	PORT_START
308 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
309 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
310 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )			/* Adds 4 credits/coins !*/
311 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VBLANK )
312 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
313 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
314 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
315 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
316 
317 	PORT_START	/* Dip switch bank 1 */
318 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
319 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
320 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
321 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
322 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
323 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
324 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
325 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
326 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_6C ) )
327 	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
328 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
329 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
330 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
331 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
332 	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
333 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
334 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
335 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_6C ) )
336 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
337 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
338 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
339 	PORT_DIPNAME( 0x80, 0x80, "2 Coins to Start, 1 to Continue" )
340 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
341 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
342 
343 	PORT_START	/* Dip switch bank 2 */
344 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) )
345 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
346 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
347 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) )
348 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
349 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
350 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
351 	PORT_DIPSETTING(    0x08, "Easy" )
352 	PORT_DIPSETTING(    0x0c, "Normal" )
353 	PORT_DIPSETTING(    0x04, "Hard" )
354 	PORT_DIPSETTING(    0x00, "Hardest" )
355 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
356 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
357 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
358 	PORT_DIPNAME( 0x20, 0x00, "Max Players" )
359 	PORT_DIPSETTING(    0x20, "2" )
360 	PORT_DIPSETTING(    0x00, "4" )
361 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
362 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
363 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
364 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )		/* Check code at 0x001490*/
365 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
366 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
367 
368 	PORT_START /* Cpu 1 vblank */
369 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_VBLANK )
370 
371 	PORT_START
372 	DASSAULT_PLAYER_INPUT( IPF_PLAYER3, IPT_COIN3 )
373 
374 	PORT_START
375 	DASSAULT_PLAYER_INPUT( IPF_PLAYER4, IPT_COIN4 )
376 INPUT_PORTS_END
377 
378 INPUT_PORTS_START( dassault )
379 	PORT_START
380 	DASSAULT_PLAYER_INPUT( IPF_PLAYER1, IPT_START1 )
381 
382 	PORT_START
383 	DASSAULT_PLAYER_INPUT( IPF_PLAYER2, IPT_START2 )
384 
385 	PORT_START
386 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
387 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
388 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
389 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VBLANK )
390 
391 	PORT_START	/* Dip switch bank 1 */
392 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
393 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
394 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
395 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
396 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
397 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
398 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
399 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
400 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_6C ) )
401 	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
402 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
403 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
404 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
405 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
406 	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
407 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
408 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
409 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_6C ) )
410 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
411 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
412 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
413 	PORT_DIPNAME( 0x80, 0x80, "2 Coins to Start, 1 to Continue" )
414 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
415 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
416 
417 	PORT_START	/* Dip switch bank 2 */
418 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) )
419 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
420 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
421 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) )
422 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
423 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
424 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
425 	PORT_DIPSETTING(    0x08, "Easy" )
426 	PORT_DIPSETTING(    0x0c, "Normal" )
427 	PORT_DIPSETTING(    0x04, "Hard" )
428 	PORT_DIPSETTING(    0x00, "Hardest" )
429 	PORT_DIPNAME( 0x30, 0x10, "Max Players" )
430 	PORT_DIPSETTING(    0x30, "2" )
431 	PORT_DIPSETTING(    0x20, "3" )
432 	PORT_DIPSETTING(    0x10, "4" )
433 /*	PORT_DIPSETTING(    0x00, "4 (buggy)" )*/
434 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
435 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
436 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
437 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )		/* Check code at 0x0014bc*/
438 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
439 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
440 
441 	PORT_START /* Cpu 1 vblank */
442 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_VBLANK )
443 
444 	PORT_START
445 	DASSAULT_PLAYER_INPUT( IPF_PLAYER3, IPT_COIN3 )
446 
447 	PORT_START
448 	DASSAULT_PLAYER_INPUT( IPF_PLAYER4, IPT_COIN4 )
449 INPUT_PORTS_END
450 
451 INPUT_PORTS_START( dassaul4 )
452 	PORT_START
453 	DASSAULT_PLAYER_INPUT( IPF_PLAYER1, IPT_UNUSED )
454 
455 	PORT_START
456 	DASSAULT_PLAYER_INPUT( IPF_PLAYER2, IPT_UNUSED )
457 
458 	PORT_START
459 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
460 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
461 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
462 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_VBLANK )
463 
464 	PORT_START	/* Dip switch bank 1 */
465 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
466 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
467 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
468 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
469 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
470 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
471 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
472 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
473 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_6C ) )
474 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) )
475 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
476 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
477 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
478 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
479 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
480 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
481 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
482 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
483 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
484 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
485 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
486 	PORT_DIPNAME( 0x80, 0x80, "2 Coins to Start, 1 to Continue" )
487 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
488 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
489 
490 	PORT_START	/* Dip switch bank 2 */
491 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) )
492 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
493 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
494 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) )
495 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
496 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
497 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
498 	PORT_DIPSETTING(    0x08, "Easy" )
499 	PORT_DIPSETTING(    0x0c, "Normal" )
500 	PORT_DIPSETTING(    0x04, "Hard" )
501 	PORT_DIPSETTING(    0x00, "Hardest" )
502 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) )
503 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
504 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
505 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) )
506 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
507 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
508 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) )
509 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
510 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
511 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )		/* Check code at 0x0014a4*/
512 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
513 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
514 
515 	PORT_START /* Cpu 1 vblank */
516 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_VBLANK )
517 
518 	PORT_START
519 	DASSAULT_PLAYER_INPUT( IPF_PLAYER3, IPT_COIN3 )
520 
521 	PORT_START
522 	DASSAULT_PLAYER_INPUT( IPF_PLAYER4, IPT_COIN4 )
523 INPUT_PORTS_END
524 
525 /**********************************************************************************/
526 
527 static struct GfxLayout charlayout =
528 {
529 	8,8,
530 	RGN_FRAC(1,2),
531 	4,
532 	{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 },
533 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
534 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
535 	16*8
536 };
537 
538 static struct GfxLayout tilelayout =
539 {
540 	16,16,
541 	RGN_FRAC(1,2),
542 	4,
543 	{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 },
544 	{ 32*8+0, 32*8+1, 32*8+2, 32*8+3, 32*8+4, 32*8+5, 32*8+6, 32*8+7,
545 		0, 1, 2, 3, 4, 5, 6, 7 },
546 	{ 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16,
547 			8*16, 9*16, 10*16, 11*16, 12*16, 13*16, 14*16, 15*16 },
548 	64*8
549 };
550 
551 static struct GfxDecodeInfo gfxdecodeinfo[] =
552 {
553 	/* REGION_GFX1 is copied to REGION_GFX2 at runtime */
554 	{ REGION_GFX2, 0, &charlayout,     0,  32 },	/* Characters 8x8 */
555 	{ REGION_GFX2, 0, &tilelayout,     0,  32 },	/* Tiles 16x16 */
556 	{ REGION_GFX3, 0, &tilelayout,   512,  32 },	/* Tiles 16x16 */
557 	{ REGION_GFX4, 0, &tilelayout,  1024,  64 },	/* Sprites 16x16 */
558 	{ REGION_GFX5, 0, &tilelayout,  2048,  64 },	/* Sprites 16x16 */
559 	{ -1 } /* end of array */
560 };
561 
562 /**********************************************************************************/
563 
564 static struct YM2203interface ym2203_interface =
565 {
566 	1,
567 	32220000/8,	/* Accurate, audio section crystal is 32.220 MHz */
568 	{ YM2203_VOL(40,40) },
569 	{ 0 },
570 	{ 0 },
571 	{ 0 },
572 	{ 0 },
573 	{ 0 }
574 };
575 
sound_irq(int state)576 static void sound_irq(int state)
577 {
578 	cpu_set_irq_line(2,1,state);
579 }
580 
WRITE_HANDLER(sound_bankswitch_w)581 WRITE_HANDLER( sound_bankswitch_w )
582 {
583 	/* the second OKIM6295 ROM is bank switched */
584 	OKIM6295_set_bank_base(1, (data & 1) * 0x40000);
585 }
586 
587 static struct YM2151interface ym2151_interface =
588 {
589 	1,
590 	32220000/9, /* Accurate, audio section crystal is 32.220 MHz */
591 	{ YM3012_VOL(45,MIXER_PAN_LEFT,45,MIXER_PAN_RIGHT) },
592 	{ sound_irq },
593 	{ sound_bankswitch_w }
594 };
595 
596 static struct OKIM6295interface okim6295_interface =
597 {
598 	2,              /* 2 chips */
599 	{ 7757, 15514 },/* Frequency */
600 	{ REGION_SOUND1, REGION_SOUND2 },
601 	{ 50, 25 }		/* Note!  Keep chip 1 louder than chip 2 */
602 };
603 
604 /**********************************************************************************/
605 
606 static MACHINE_DRIVER_START( dassault )
607 
608 	/* basic machine hardware */
609 	MDRV_CPU_ADD(M68000, 14000000) /* Accurate */
MDRV_CPU_MEMORY(dassault_readmem,dassault_writemem)610 	MDRV_CPU_MEMORY(dassault_readmem,dassault_writemem)
611 	MDRV_CPU_VBLANK_INT(irq4_line_hold,1)
612 
613 	MDRV_CPU_ADD(M68000, 14000000) /* Accurate */
614 	MDRV_CPU_MEMORY(dassault_sub_readmem,dassault_sub_writemem)
615 	MDRV_CPU_VBLANK_INT(irq5_line_hold,1)
616 
617 	MDRV_CPU_ADD(H6280,32220000/8)
618 	MDRV_CPU_FLAGS(CPU_AUDIO_CPU)	/* Accurate */
619 	MDRV_CPU_MEMORY(sound_readmem,sound_writemem)
620 
621 	MDRV_FRAMES_PER_SECOND(60)
622 	MDRV_VBLANK_DURATION(529)
623 	MDRV_INTERLEAVE(140) /* 140 CPU slices per frame */
624 
625 	/* video hardware */
626 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_RGB_DIRECT | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_BUFFERS_SPRITERAM)
627 	MDRV_SCREEN_SIZE(40*8, 32*8)
628 	MDRV_VISIBLE_AREA(0*8, 40*8-1, 1*8, 31*8-1)
629 	MDRV_GFXDECODE(gfxdecodeinfo)
630 	MDRV_PALETTE_LENGTH(4096)
631 
632 	MDRV_VIDEO_START(dassault)
633 	MDRV_VIDEO_UPDATE(dassault)
634 
635 	/* sound hardware */
636 	MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
637 	MDRV_SOUND_ADD(YM2203, ym2203_interface)
638 	MDRV_SOUND_ADD(YM2151, ym2151_interface)
639 	MDRV_SOUND_ADD(OKIM6295, okim6295_interface)
640 MACHINE_DRIVER_END
641 
642 /**********************************************************************************/
643 
644 ROM_START( dassault )
645 	ROM_REGION(0x80000, REGION_CPU1, 0 ) /* 68000 code */
646 	ROM_LOAD16_BYTE("01.bin", 0x00000, 0x20000, CRC(14f17ea7) SHA1(0bb8b7dba05f1ea42e68838861f0d4c263eac6b3) )
647 	ROM_LOAD16_BYTE("03.bin", 0x00001, 0x20000, CRC(bed1b90c) SHA1(c100f89b69025e2ff885b35a733abc627da98a07) )
648 	ROM_LOAD16_BYTE("gs00",   0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) )
649 	ROM_LOAD16_BYTE("gs02",   0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) )
650 
651 	ROM_REGION(0x80000, REGION_CPU2, 0 ) /* 68000 code (Sub cpu) */
652 	ROM_LOAD16_BYTE("hc10-1.bin", 0x00000, 0x20000, CRC(ac5ac770) SHA1(bf6640900c2f9c8091168bf106edf85350c34652) )
653 	ROM_LOAD16_BYTE("hc08-1.bin", 0x00001, 0x20000, CRC(864dca56) SHA1(0967f613684b539d10b67e4f6033c890e2134ea2) )
654 	ROM_LOAD16_BYTE("gs11",       0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) )
655 	ROM_LOAD16_BYTE("gs09",       0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) )
656 
657 	ROM_REGION(0x10000, REGION_CPU3, 0 ) /* Sound CPU */
658 	ROM_LOAD( "gs04",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) )
659 
660 	ROM_REGION(0x020000, REGION_GFX1, ROMREGION_DISPOSE )
661 	ROM_LOAD16_BYTE( "gs05", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) )
662 	ROM_LOAD16_BYTE( "gs06", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) )
663 
664 	ROM_REGION(0x120000, REGION_GFX2, ROMREGION_DISPOSE )
665 	ROM_LOAD( "maj-02", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
666 	/* Other 0x20000 filled in later */
667 
668 	ROM_REGION(0x200000, REGION_GFX3, ROMREGION_DISPOSE )
669 	ROM_LOAD( "maj-01", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
670 	ROM_LOAD( "maj-00", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
671 
672 	ROM_REGION( 0x400000, REGION_GFX4, ROMREGION_DISPOSE ) /* sprites chip 1 */
673 	ROM_LOAD( "maj-04", 0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
674 	ROM_LOAD( "maj-05", 0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
675 	ROM_LOAD( "maj-06", 0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
676 	ROM_LOAD( "maj-07", 0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
677 	ROM_LOAD( "maj-08", 0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
678 	ROM_LOAD( "maj-09", 0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
679 	ROM_LOAD( "maj-10", 0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
680 	ROM_LOAD( "maj-11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
681 
682 	ROM_REGION( 0x80000, REGION_GFX5, ROMREGION_DISPOSE ) /* sprites chip 2 */
683 	ROM_LOAD16_BYTE( "gs12",   0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
684 	ROM_LOAD16_BYTE( "gs13",   0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
685 	ROM_LOAD16_BYTE( "gs14",   0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
686 	ROM_LOAD16_BYTE( "gs15",   0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
687 
688 	ROM_REGION(0x20000, REGION_SOUND1, 0 ) /* Oki samples */
689 	ROM_LOAD( "gs07",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) )
690 
691 	ROM_REGION(0x80000, REGION_SOUND2, 0 ) /* Extra Oki samples */
692 	ROM_LOAD( "maj-03", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )	/* banked */
693 
694 	ROM_REGION( 0x1000, REGION_PROMS, 0 )
695 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )	/* Priority?  Unused */
696 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )	/* Timing??  Unused */
697 	/* Above prom also at 16s and 17s */
698 ROM_END
699 
700 ROM_START( dassaul4 )
701 	ROM_REGION(0x80000, REGION_CPU1, 0 ) /* 68000 code */
702 	ROM_LOAD16_BYTE("gs01", 0x00000, 0x20000, CRC(8613634d) SHA1(69b64e54fde3b5f1ee3435d7327b84e7a7d43f6d) )
703 	ROM_LOAD16_BYTE("gs03", 0x00001, 0x20000, CRC(ea860bd4) SHA1(6e4e2d004433ad5842b4bc895eaa8f55bd1ee168) )
704 	ROM_LOAD16_BYTE("gs00", 0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) )
705 	ROM_LOAD16_BYTE("gs02", 0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) )
706 
707 	ROM_REGION(0x80000, REGION_CPU2, 0 ) /* 68000 code (Sub cpu) */
708 	ROM_LOAD16_BYTE("gs10",   0x00000, 0x20000, CRC(285f72a3) SHA1(d01972aec500805ca1abed14983064cd14e942d4) )
709 	ROM_LOAD16_BYTE("gs08",   0x00001, 0x20000, CRC(16691ede) SHA1(dc481dfc6104833a6fd18be6275e77ecc0510165) )
710 	ROM_LOAD16_BYTE("gs11",   0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) )
711 	ROM_LOAD16_BYTE("gs09",   0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) )
712 
713 	ROM_REGION(0x10000, REGION_CPU3, 0 ) /* Sound CPU */
714 	ROM_LOAD( "gs04",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) )
715 
716 	ROM_REGION(0x020000, REGION_GFX1, ROMREGION_DISPOSE )
717 	ROM_LOAD16_BYTE( "gs05", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) )
718 	ROM_LOAD16_BYTE( "gs06", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) )
719 
720 	ROM_REGION(0x120000, REGION_GFX2, ROMREGION_DISPOSE )
721 	ROM_LOAD( "maj-02", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
722 	/* Other 0x20000 filled in later */
723 
724 	ROM_REGION(0x200000, REGION_GFX3, ROMREGION_DISPOSE )
725 	ROM_LOAD( "maj-01", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
726 	ROM_LOAD( "maj-00", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
727 
728 	ROM_REGION( 0x400000, REGION_GFX4, ROMREGION_DISPOSE ) /* sprites chip 1 */
729 	ROM_LOAD( "maj-04", 0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
730 	ROM_LOAD( "maj-05", 0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
731 	ROM_LOAD( "maj-06", 0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
732 	ROM_LOAD( "maj-07", 0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
733 	ROM_LOAD( "maj-08", 0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
734 	ROM_LOAD( "maj-09", 0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
735 	ROM_LOAD( "maj-10", 0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
736 	ROM_LOAD( "maj-11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
737 
738 	ROM_REGION( 0x80000, REGION_GFX5, ROMREGION_DISPOSE ) /* sprites chip 2 */
739 	ROM_LOAD16_BYTE( "gs12",   0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
740 	ROM_LOAD16_BYTE( "gs13",   0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
741 	ROM_LOAD16_BYTE( "gs14",   0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
742 	ROM_LOAD16_BYTE( "gs15",   0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
743 
744 	ROM_REGION(0x20000, REGION_SOUND1, 0 ) /* Oki samples */
745 	ROM_LOAD( "gs07",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) )
746 
747 	ROM_REGION(0x80000, REGION_SOUND2, 0 ) /* Extra Oki samples */
748 	ROM_LOAD( "maj-03", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )	/* banked */
749 
750 	ROM_REGION( 0x1000, REGION_PROMS, 0 )
751 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )	/* Priority?  Unused */
752 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )	/* Timing??  Unused */
753 	/* Above prom also at 16s and 17s */
754 ROM_END
755 
756 ROM_START( thndzone )
757 	ROM_REGION(0x80000, REGION_CPU1, 0 ) /* 68000 code */
758 	ROM_LOAD16_BYTE("gz_01.bin", 0x00000, 0x20000, CRC(15e8c328) SHA1(8876b5fde77604c2fe4654271ceb341a8fa460c1) )
759 	ROM_LOAD16_BYTE("gz_03.bin", 0x00001, 0x20000, CRC(aab5c86e) SHA1(c3560b15360ddf14e8444d9f70724e698b2bd42f) )
760 	ROM_LOAD16_BYTE("gs00",   0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) ) /* Aka GT00 */
761 	ROM_LOAD16_BYTE("gs02",   0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) ) /* Aka GT02 etc */
762 
763 	ROM_REGION(0x80000, REGION_CPU2, 0 ) /* 68000 code (Sub cpu) */
764 	ROM_LOAD16_BYTE("gz_10.bin", 0x00000, 0x20000, CRC(79f919e9) SHA1(b6793173e310b1df07cf3e9209da1fbec3a8a05b) )
765 	ROM_LOAD16_BYTE("gz_08.bin", 0x00001, 0x20000, CRC(d47d7836) SHA1(8a5d3e8b89f5dfd6bac83f7b093ddb03d5ecef73) )
766 	ROM_LOAD16_BYTE("gs11",      0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) )
767 	ROM_LOAD16_BYTE("gs09",      0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) )
768 
769 	ROM_REGION(0x10000, REGION_CPU3, 0 ) /* Sound CPU */
770 	ROM_LOAD( "gs04",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) )
771 
772 	ROM_REGION(0x020000, REGION_GFX1, ROMREGION_DISPOSE )
773 	ROM_LOAD16_BYTE( "gs05", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) )
774 	ROM_LOAD16_BYTE( "gs06", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) )
775 
776 	ROM_REGION(0x120000, REGION_GFX2, ROMREGION_DISPOSE )
777 	ROM_LOAD( "maj-02", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
778 	/* Other 0x20000 filled in later */
779 
780 	ROM_REGION(0x200000, REGION_GFX3, ROMREGION_DISPOSE )
781 	ROM_LOAD( "maj-01", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
782 	ROM_LOAD( "maj-00", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
783 
784 	ROM_REGION( 0x400000, REGION_GFX4, ROMREGION_DISPOSE ) /* sprites chip 1 */
785 	ROM_LOAD( "maj-04", 0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
786 	ROM_LOAD( "maj-05", 0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
787 	ROM_LOAD( "maj-06", 0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
788 	ROM_LOAD( "maj-07", 0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
789 	ROM_LOAD( "maj-08", 0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
790 	ROM_LOAD( "maj-09", 0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
791 	ROM_LOAD( "maj-10", 0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
792 	ROM_LOAD( "maj-11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
793 
794 	ROM_REGION( 0x80000, REGION_GFX5, ROMREGION_DISPOSE ) /* sprites chip 2 */
795 	ROM_LOAD16_BYTE( "gs12",   0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
796 	ROM_LOAD16_BYTE( "gs13",   0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
797 	ROM_LOAD16_BYTE( "gs14",   0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
798 	ROM_LOAD16_BYTE( "gs15",   0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
799 
800 	ROM_REGION(0x20000, REGION_SOUND1, 0 ) /* Oki samples */
801 	ROM_LOAD( "gs07",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) )
802 
803 	ROM_REGION(0x80000, REGION_SOUND2, 0 ) /* Extra Oki samples */
804 	ROM_LOAD( "maj-03", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )	/* banked */
805 
806 	ROM_REGION( 0x1000, REGION_PROMS, 0 )
807 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )	/* Priority?  Unused */
808 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )	/* Timing??  Unused */
809 	/* Above prom also at 16s and 17s */
810 ROM_END
811 
812 /**********************************************************************************/
813 
814 static READ16_HANDLER( dassault_main_skip )
815 {
816 	int ret=dassault_ram[0];
817 
818 	if (activecpu_get_previouspc()==0x1170 && ret&0x8000)
819 		cpu_spinuntil_int();
820 
821 	return ret;
822 }
823 
READ16_HANDLER(thndzone_main_skip)824 static READ16_HANDLER( thndzone_main_skip )
825 {
826 	int ret=dassault_ram[0];
827 
828 	if (activecpu_get_pc()==0x114c && ret&0x8000)
829 		cpu_spinuntil_int();
830 
831 	return ret;
832 }
833 
init_dassault(void)834 static void init_dassault(void)
835 {
836 	const data8_t *src = memory_region(REGION_GFX1);
837 	data8_t *dst = memory_region(REGION_GFX2);
838 	data8_t *tmp = (data8_t *)malloc(0x80000);
839 
840 	/* Playfield 4 also has access to the char graphics, make things easier
841 	by just copying the chars to both banks (if I just used a different gfx
842 	bank then the colours would be wrong). */
843 	memcpy(tmp+0x000000,dst+0x80000,0x80000);
844 	memcpy(dst+0x090000,tmp+0x00000,0x80000);
845 	memcpy(dst+0x080000,src+0x00000,0x10000);
846 	memcpy(dst+0x110000,src+0x10000,0x10000);
847 
848 	free(tmp);
849 
850 	/* Save time waiting on vblank bit */
851 	install_mem_read16_handler(0, 0x3f8000, 0x3f8001, dassault_main_skip);
852 }
853 
init_thndzone(void)854 static void init_thndzone(void)
855 {
856 	const data8_t *src = memory_region(REGION_GFX1);
857 	data8_t *dst = memory_region(REGION_GFX2);
858 	data8_t *tmp = (data8_t *)malloc(0x80000);
859 
860 	/* Playfield 4 also has access to the char graphics, make things easier
861 	by just copying the chars to both banks (if I just used a different gfx
862 	bank then the colours would be wrong). */
863 	memcpy(tmp+0x000000,dst+0x80000,0x80000);
864 	memcpy(dst+0x090000,tmp+0x00000,0x80000);
865 	memcpy(dst+0x080000,src+0x00000,0x10000);
866 	memcpy(dst+0x110000,src+0x10000,0x10000);
867 
868 	free(tmp);
869 
870 	/* Save time waiting on vblank bit */
871 	install_mem_read16_handler(0, 0x3f8000, 0x3f8001, thndzone_main_skip);
872 }
873 
874 /**********************************************************************************/
875 
876 GAME(1991, thndzone, 0,        dassault, thndzone, thndzone, ROT0, "Data East Corporation", "Thunder Zone (World)" )
877 GAME(1991, dassault, thndzone, dassault, dassault, dassault, ROT0, "Data East Corporation", "Desert Assault (US)" )
878 GAME(1991, dassaul4, thndzone, dassault, dassaul4, dassault, ROT0, "Data East Corporation", "Desert Assault (US 4 Players)" )
879