1 // license:BSD-3-Clause
2 // copyright-holders:Bryan McPhail
3 /***************************************************************************
4 
5   Thunder Zone / Desert Assault (c) 1991 Data East Corporation
6 
7   Thunder Zone       (World 2 or 4 players, 2 sets)
8   Thunder Zone       (World 4 players only)
9   Thunder Zone       (Japan 2 or 4 players)
10   Desert Assault     (USA 4 players only)
11   Desert Assault     (USA Selectable 2-4 players)
12 
13   Emulation by Bryan McPhail, mish@tendril.co.uk
14 
15 ***************************************************************************
16 
17 Thunder Zone / Desert Assault
18 Data East 1991
19 
20 PCB Layout
21 ----------
22 
23 Main PCB:
24 
25 DE-0344-3
26 |--------------------------------------------------------|
27 |TA8205      YM3012   YM2151    GT04         MAJ-01  GZ03|
28 | VOL VOL    YM3014   YM2203    6264   |---| MAJ-00  GT02|
29 |  3403 3403  M6295(1) MAJ-03          |45 |         GZ01|
30 |  3403 3403  M6295(2) GT07     32MHz  |---|         GT00|
31 |                      MAJ-02                            |
32 |  SW3 SW2 SW1         GT06                     6264     |
33 |J                     GT05            |-----|  6264     |
34 |A       MB7128                        | 55  |      6264 |
35 |M                                     |     |      6264 |
36 |M                                     |-----|           |
37 |A                                                       |
38 | RCDM-I111                                          77  |
39 | RCDM-I111                            |-----| 6264      |
40 | RCDM-I111                            | 55  | 6264      |
41 | RCDM-I111       6116                 |     |    |---|  |
42 |                 6116                 |-----|    |59 |  |
43 | CN4             6116                            |---|  |
44 | CN3                                                    |
45 |--------------------------------------------------------|
46 Notes:
47             (some PCBs may use a 32.22MHz oscillator)
48        59 - 68000-based CPU (in custom QFP64 package) disguised as Data East chip 59. Clock input 14.161MHz [28.322/2] (QFP64)
49        45 - Hudson/NEC HuC6280 disguised as Data East chip 45. Clock input 8.000MHz on pin 10 [32/4] (QFP80)
50        55 - Data East custom chip 55 graphic generator IC (QFP160)
51        77 - Data East custom chip 77 (SOP28)
52  M6295(1) - OKI M6295 4-Channel Mixing ADPCM Voice Synthesis LSI. Clock input 2.000MHz [32/16]. Pin 7 HIGH (QFP44)
53  M6295(2) - OKI M6295 4-Channel Mixing ADPCM Voice Synthesis LSI. Clock input 1.000MHz [32/32]. Pin 7 HIGH (QFP44)
54    YM2203 - Yamaha YM2203C FM Operator Type-N(OPN). Clock input 4.000MHz [32/8] (DIP40)
55    YM2151 - Yamaha YM2151 FM Operator Type-M(OPM). Clock input 3.55556MHz comes from a 74F163 on pin 12. F163 input pin 2 is 32MHz (DIP24)
56    YM3012 - Yamaha YM3012 2-Channel Serial Input Floating D/A Converter (DIP16)
57    YM3014 - Yamaha YM3014 Serial Input Floating D/A Converter (DIP8)
58      6116 - 2kx8 SRAM (DIP24)
59      6264 - 8kx8 SRAM (DIP28)
60      MAJ* - Mask ROMs
61 GT* & GZ* - EPROMs
62    MB7128 - Fujitsu MB7128 Bi-Polar PROM marked 'GR-0' (DIP18)
63     CN3/4 - Connector for extra joystick & buttons for player 3 and player 4
64    TA8205 - Toshiba TA8205AH 18W BTL 2 Channel Audio Power Amplifier
65      3403 - NEC uPC3403C Quad Operational Amplifier (DIP14)
66 RCDM-I111 - Custom Data East resistor array
67   SW1/2/3 - 8-position DIP switch (2 populated, SW3 unpopulated)
68     HSYNC - 15.80464kHz
69     VSYNC - 58.1052Hz
70 
71 Sub PCB:
72 
73 DE-0345-1
74 |--------------------------------------------------------|
75 |                       28.322MHz         GT12           |
76 |            6116                         GT13    MAJ-04 |
77 |6116        6116            |-----|      GT14    MAJ-05 |
78 |6116                        | 52  |      GT15    MAJ-06 |
79 |                            |     |              MAJ-07 |
80 |      |---|                 |-----|                     |
81 |      |59 |                                      MAJ-08 |
82 |      |---|                 |-----|              MAJ-09 |
83 |                            | 52  |              MAJ-10 |
84 |              6116          |     |              MAJ-11 |
85 |GZ08          6116          |-----|                     |
86 |GT09                                                    |
87 |GZ10  6264                         6116                 |
88 |GT11  6264    6116                 6116                 |
89 |              6116                                      |
90 |MB8421 MB8431                                           |
91 |                                               MB7138   |
92 |                                       MB7138  MB7138   |
93 |--------------------------------------------------------|
94 Notes:
95             (some PCBs may use a 28.0MHz oscillator)
96        59 - 68000-based CPU (in custom QFP64 package) disguised as Data East chip 59. Clock input 14.161MHz [28.322/2] (QFP64)
97        52 - Data East custom chip 52 graphic generator IC (QFP128)
98    MB7138 - Fujitsu MB7138 Bi-Polar PROM marked 'GR-1' (DIP24)
99      6116 - 2kx8 SRAM (DIP24)
100      6264 - 8kx8 SRAM (DIP28)
101      MAJ* - Mask ROMs
102 GT* & GZ* - EPROMs
103    MB8421 - Fujitsu MB8421 CMOS 16k-bit Dual-port SRAM (SDIP52)
104    MB8431 - Fujitsu MB8431 CMOS 16k-bit Dual-port SRAM (SDIP52)
105 
106 ***************************************************************************
107 
108 Stephh's notes (based on the games M68000 code and some tests) :
109 
110 
111 1) 'thndzone'
112 
113   - "Max Players" Dip Switch set to "2" :
114 
115       * COIN1    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
116       * COIN2    : adds coin(s)/credit(s) depending on "Coin B" Dip Switch
117       * COIN3    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
118       * COIN4    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
119       * SERVICE1 : adds 4 coins/credits
120 
121       * START1   : starts a game for player 1
122       * START2   : starts a game for player 2
123 
124       * BUTTON1n : "fire"
125       * BUTTON2n : "nuke"
126 
127   - "Max Players" Dip Switch set to "4" :
128 
129       * COIN1    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
130       * COIN2    : adds coin(s)/credit(s) depending on "Coin B" Dip Switch
131       * COIN3    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
132       * COIN4    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
133       * SERVICE1 : adds 4 coins/credits
134 
135       * START1   : starts a game for player 1
136       * START2   : starts a game for player 2
137 
138       * BUTTON1n : "fire" + starts a game for player n
139       * BUTTON2n : "nuke"
140 
141 
142 2) 'dassault'
143 
144   - "Max Players" Dip Switch set to "2" :
145 
146       * COIN1    : adds coin(s)/credit(s) depending on "Coin A" Dip Switch
147       * COIN2    : adds coin(s)/credit(s) depending on "Coin B" Dip Switch
148       * COIN3    : NO EFFECT !
149       * COIN4    : NO EFFECT !
150       * SERVICE1 : adds 1 coin/credit
151 
152       * START1   : starts a game for player 1
153       * START2   : starts a game for player 2
154 
155       * BUTTON1n : "fire"
156       * BUTTON2n : "nuke"
157 
158   - "Max Players" Dip Switch set to "3" :
159 
160       * COIN1    : adds coin(s)/credit(s) for player 1 depending on "Coin A" Dip Switch
161       * COIN2    : adds coin(s)/credit(s) for player 2 depending on "Coin A" Dip Switch
162       * COIN3    : adds coin(s)/credit(s) for player 3 depending on "Coin A" Dip Switch
163       * COIN4    : adds coin(s)/credit(s) for FAKE player 4 depending on "Coin A" Dip Switch
164       * SERVICE1 : adds 1 coin/credit for all players (including FAKE player 4 !)
165 
166       * START1   : NO EFFECT !
167       * START2   : NO EFFECT !
168 
169       * BUTTON1n : "fire" + starts a game for player n
170       * BUTTON2n : "nuke"
171 
172   - "Max Players" Dip Switch set to "4" :
173 
174       * COIN1    : adds coin(s)/credit(s) for player 1 depending on "Coin A" Dip Switch
175       * COIN2    : adds coin(s)/credit(s) for player 2 depending on "Coin A" Dip Switch
176       * COIN3    : adds coin(s)/credit(s) for player 3 depending on "Coin A" Dip Switch
177       * COIN4    : adds coin(s)/credit(s) for player 4 depending on "Coin A" Dip Switch
178       * SERVICE1 : adds 1 coin/credit for all players
179 
180       * START1   : NO EFFECT !
181       * START2   : NO EFFECT !
182 
183       * BUTTON1n : "fire" + starts a game for player n
184       * BUTTON2n : "nuke"
185 
186 
187 3) 'dassault4'
188 
189   - always 4 players :
190 
191       * COIN1    : adds coin(s)/credit(s) for player 1 depending on "Coinage" Dip Switch
192       * COIN2    : adds coin(s)/credit(s) for player 2 depending on "Coinage" Dip Switch
193       * COIN3    : adds coin(s)/credit(s) for player 3 depending on "Coinage" Dip Switch
194       * COIN4    : adds coin(s)/credit(s) for player 4 depending on "Coinage" Dip Switch
195       * SERVICE1 : adds 1 coin/credit
196 
197       * NO START1 !
198       * NO START2 !
199 
200       * BUTTON1n : "fire" + starts a game for player n
201       * BUTTON2n : "nuke"
202 
203 
204 2008-08
205 Dip locations verified with US conversion kit manual.
206 
207 TODO:
208     Blend function aren't fully emulated.
209 
210 ***************************************************************************/
211 
212 #include "emu.h"
213 #include "includes/dassault.h"
214 
215 #include "cpu/m68000/m68000.h"
216 #include "machine/mb8421.h"
217 #include "sound/2203intf.h"
218 #include "sound/ym2151.h"
219 #include "screen.h"
220 #include "speaker.h"
221 
222 
223 /**********************************************************************************/
224 
priority_w(offs_t offset,uint16_t data,uint16_t mem_mask)225 void dassault_state::priority_w(offs_t offset, uint16_t data, uint16_t mem_mask)
226 {
227 	COMBINE_DATA(&m_priority);
228 }
229 
main_irq_ack_w(uint16_t data)230 void dassault_state::main_irq_ack_w(uint16_t data)
231 {
232 	m_maincpu->set_input_line(M68K_IRQ_4, CLEAR_LINE);
233 }
234 
sub_irq_ack_w(uint16_t data)235 void dassault_state::sub_irq_ack_w(uint16_t data)
236 {
237 	m_subcpu->set_input_line(M68K_IRQ_5, CLEAR_LINE);
238 }
239 
dassault_control_r(offs_t offset)240 uint16_t dassault_state::dassault_control_r(offs_t offset)
241 {
242 	switch (offset << 1)
243 	{
244 		case 0: /* Player 1 & Player 2 joysticks & fire buttons */
245 			return ioport("P1_P2")->read();
246 
247 		case 2: /* Player 3 & Player 4 joysticks & fire buttons */
248 			return ioport("P3_P4")->read();
249 
250 		case 4: /* Dip 1 (stored at 0x3f8035) */
251 			return ioport("DSW1")->read();
252 
253 		case 6: /* Dip 2 (stored at 0x3f8034) */
254 			return ioport("DSW2")->read();
255 
256 		case 8: /* VBL, Credits */
257 			return ioport("SYSTEM")->read();
258 	}
259 
260 	return 0xffff;
261 }
262 
dassault_control_w(uint16_t data)263 void dassault_state::dassault_control_w(uint16_t data)
264 {
265 	machine().bookkeeping().coin_counter_w(0, data & 1);
266 	if (data & 0xfffe)
267 		logerror("Coin cointrol %04x\n", data);
268 }
269 
dassault_sub_control_r()270 uint16_t dassault_state::dassault_sub_control_r()
271 {
272 	return ioport("VBLANK1")->read();
273 }
274 
275 /**********************************************************************************/
276 
dassault_map(address_map & map)277 void dassault_state::dassault_map(address_map &map)
278 {
279 	map(0x000000, 0x07ffff).rom();
280 
281 	map(0x100000, 0x103fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
282 
283 	map(0x140004, 0x140005).w(FUNC(dassault_state::main_irq_ack_w));
284 	map(0x140006, 0x140007).nopw(); /* ? */
285 
286 	map(0x180001, 0x180001).w(m_soundlatch, FUNC(generic_latch_8_device::write));
287 
288 	map(0x1c0000, 0x1c000f).r(FUNC(dassault_state::dassault_control_r));
289 	map(0x1c000a, 0x1c000b).w(FUNC(dassault_state::priority_w));
290 	map(0x1c000c, 0x1c000d).w(m_spriteram[1], FUNC(buffered_spriteram16_device::write));
291 	map(0x1c000e, 0x1c000f).w(FUNC(dassault_state::dassault_control_w));
292 
293 	map(0x200000, 0x201fff).rw(m_deco_tilegen[0], FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w));
294 	map(0x202000, 0x203fff).rw(m_deco_tilegen[0], FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w));
295 	map(0x212000, 0x212fff).writeonly().share("pf2_rowscroll");
296 	map(0x220000, 0x22000f).w(m_deco_tilegen[0], FUNC(deco16ic_device::pf_control_w));
297 
298 	map(0x240000, 0x240fff).rw(m_deco_tilegen[1], FUNC(deco16ic_device::pf1_data_r), FUNC(deco16ic_device::pf1_data_w));
299 	map(0x242000, 0x242fff).rw(m_deco_tilegen[1], FUNC(deco16ic_device::pf2_data_r), FUNC(deco16ic_device::pf2_data_w));
300 	map(0x252000, 0x252fff).writeonly().share("pf4_rowscroll");
301 	map(0x260000, 0x26000f).w(m_deco_tilegen[1], FUNC(deco16ic_device::pf_control_w));
302 
303 	map(0x3f8000, 0x3fbfff).ram(); /* Main ram */
304 	map(0x3fc000, 0x3fcfff).ram().share("spriteram2"); /* Spriteram (2nd) */
305 	map(0x3fe000, 0x3fefff).rw("sharedram", FUNC(mb8421_mb8431_16_device::left_r), FUNC(mb8421_mb8431_16_device::left_w));
306 }
307 
dassault_sub_map(address_map & map)308 void dassault_state::dassault_sub_map(address_map &map)
309 {
310 	map(0x000000, 0x07ffff).rom();
311 
312 	map(0x100000, 0x100001).w(m_spriteram[0], FUNC(buffered_spriteram16_device::write));
313 	map(0x100002, 0x100003).w(FUNC(dassault_state::sub_irq_ack_w));
314 	map(0x100004, 0x100007).nopw(); /* ? */
315 	map(0x100004, 0x100005).r(FUNC(dassault_state::dassault_sub_control_r));
316 
317 	map(0x3f8000, 0x3fbfff).ram(); /* Sub cpu ram */
318 	map(0x3fc000, 0x3fcfff).ram().share("spriteram1"); /* Sprite ram */
319 	map(0x3fe000, 0x3fefff).rw("sharedram", FUNC(mb8421_mb8431_16_device::right_r), FUNC(mb8421_mb8431_16_device::right_w));
320 }
321 
322 /******************************************************************************/
323 
sound_map(address_map & map)324 void dassault_state::sound_map(address_map &map)
325 {
326 	map(0x000000, 0x00ffff).rom();
327 	map(0x100000, 0x100001).rw("ym1", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
328 	map(0x110000, 0x110001).rw("ym2", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
329 	map(0x120000, 0x120001).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
330 	map(0x130000, 0x130001).rw(m_oki2, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
331 	map(0x140000, 0x140001).r(m_soundlatch, FUNC(generic_latch_8_device::read));
332 	map(0x1f0000, 0x1f1fff).ram();
333 }
334 
335 /**********************************************************************************/
336 
337 static INPUT_PORTS_START( thndzone )
338 
339 	PORT_START("SYSTEM")
340 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
341 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
342 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )           // Adds 4 credits/coins !
343 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
344 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
345 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
346 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
347 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
348 
349 	PORT_START("DSW1")
350 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
351 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
352 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
353 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
354 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
355 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
356 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
357 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_5C ) )
358 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_6C ) )
359 	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6")
360 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
361 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
362 	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
363 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
364 	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
365 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
366 	PORT_DIPSETTING(    0x18, DEF_STR( 1C_5C ) )
367 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_6C ) )
368 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
369 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
370 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
371 	PORT_DIPNAME( 0x80, 0x80, "2 Coins to Start, 1 to Continue" ) PORT_DIPLOCATION("SW1:8")
372 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
373 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
374 
375 	PORT_START("DSW2")
376 	PORT_DIPUNUSED_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW2:1" )   /* OFF & Not to be changed, according to manual */
377 	PORT_DIPUNUSED_DIPLOC( 0x02, IP_ACTIVE_LOW, "SW2:2" )   /* OFF & Not to be changed, according to manual */
378 	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4")
379 	PORT_DIPSETTING(    0x08, DEF_STR( Easy ) )
380 	PORT_DIPSETTING(    0x0c, DEF_STR( Normal ) )
381 	PORT_DIPSETTING(    0x04, DEF_STR( Hard ) )
382 	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
383 	PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW2:5" )   /* OFF & Not to be changed, according to manual */
384 	PORT_DIPNAME( 0x20, 0x20, "Max Players" ) PORT_DIPLOCATION("SW2:6")
385 	PORT_DIPSETTING(    0x20, "2" )
386 	PORT_DIPSETTING(    0x00, "4" )
387 	PORT_DIPUNUSED_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW2:7" )   /* OFF & Not to be changed, according to manual */
388 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")    // Check code at 0x001490
389 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
390 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
391 
392 	PORT_START("P1_P2")
393 	PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_8WAY
394 	PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_8WAY
395 	PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_8WAY
396 	PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
397 	PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
398 	PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
399 	PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED )
400 	PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
401 
402 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) PORT_8WAY
403 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY
404 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_8WAY
405 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_8WAY
406 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
407 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
408 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
409 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
410 
411 	PORT_START("P3_P4")
412 	PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(3) PORT_8WAY
413 	PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) PORT_8WAY
414 	PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) PORT_8WAY
415 	PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) PORT_8WAY
416 	PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3)
417 	PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3)
418 	PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED )
419 	PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN3 )
420 
421 	PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(4) PORT_8WAY
422 	PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) PORT_8WAY
423 	PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) PORT_8WAY
424 	PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) PORT_8WAY
425 	PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
426 	PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4)
427 	PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNUSED )
428 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_COIN4 )
429 
430 	PORT_START("VBLANK1") /* Cpu 1 vblank */
431 	PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
432 INPUT_PORTS_END
433 
434 static INPUT_PORTS_START( thndzone4 ) /* Coin-B selectable values work for this set */
435 	PORT_INCLUDE( thndzone )
436 
437 	PORT_MODIFY("P1_P2")
438 	PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) /* Start Buttons not used, hit Player Button1 to start for that player */
439 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) /* Start Buttons not used, hit Player Button1 to start for that player */
440 
441 	PORT_MODIFY("DSW2")
442 	PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW2:6" ) /* No selectable number of players DSW */
443 INPUT_PORTS_END
444 
445 static INPUT_PORTS_START( dassault )
446 	PORT_INCLUDE( thndzone )
447 
448 	PORT_MODIFY("DSW2")
449 	PORT_DIPNAME( 0x30, 0x30, "Max Players" ) PORT_DIPLOCATION("SW2:5,6")
450 	PORT_DIPSETTING(    0x30, "2" )
451 	PORT_DIPSETTING(    0x20, "3" )
452 	PORT_DIPSETTING(    0x10, "4" )
453 //  PORT_DIPSETTING(    0x00, "4 (buggy)" )
454 INPUT_PORTS_END
455 
456 static INPUT_PORTS_START( dassault4 )
457 	PORT_INCLUDE( thndzone )
458 
459 	PORT_MODIFY("P1_P2")
460 	PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNUSED ) /* Start Buttons not used, hit Player Button1 to start for that player */
461 	PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNUSED ) /* Start Buttons not used, hit Player Button1 to start for that player */
462 
463 	PORT_MODIFY("DSW1")
464 	PORT_DIPUNUSED_DIPLOC( 0x08, IP_ACTIVE_LOW, "SW1:4" ) /* No selectable Coin-B values */
465 	PORT_DIPUNUSED_DIPLOC( 0x10, IP_ACTIVE_LOW, "SW1:5" )
466 	PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW1:6" )
467 
468 	PORT_MODIFY("DSW2")
469 	PORT_DIPUNUSED_DIPLOC( 0x20, IP_ACTIVE_LOW, "SW2:6" ) /* No selectable number of players DSW */
470 INPUT_PORTS_END
471 
472 /**********************************************************************************/
473 
474 static const gfx_layout charlayout =
475 {
476 	8,8,
477 	RGN_FRAC(1,2),
478 	4,
479 	{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 },
480 	{ STEP8(0,1) },
481 	{ STEP8(0,8*2) },
482 	16*8
483 };
484 
485 static const gfx_layout tilelayout =
486 {
487 	16,16,
488 	RGN_FRAC(1,2),
489 	4,
490 	{ RGN_FRAC(1,2)+8, RGN_FRAC(1,2), 8, 0 },
491 	{ STEP8(16*8*2,1), STEP8(0,1) },
492 	{ STEP16(0,8*2) },
493 	64*8
494 };
495 
496 static GFXDECODE_START( gfx_dassault )
497 	/* "gfx1" is copied to "gfx2" at runtime */
498 	GFXDECODE_ENTRY( "gfx2", 0, charlayout,     0,  32 )    /* Characters 8x8 */
499 	GFXDECODE_ENTRY( "gfx2", 0, tilelayout,     0,  32 )    /* Tiles 16x16 */
500 	GFXDECODE_ENTRY( "gfx3", 0, tilelayout,   512,  32 )    /* Tiles 16x16 */
501 	GFXDECODE_ENTRY( "gfx4", 0, tilelayout,  0/*1024*/,  64 )   /* Sprites 16x16 */
502 	GFXDECODE_ENTRY( "gfx5", 0, tilelayout,  0/*2048*/,  64 )   /* Sprites 16x16 */
503 GFXDECODE_END
504 
505 /**********************************************************************************/
506 
sound_bankswitch_w(uint8_t data)507 void dassault_state::sound_bankswitch_w(uint8_t data)
508 {
509 	/* the second OKIM6295 ROM is bank switched */
510 	m_oki2->set_rom_bank(data & 1);
511 }
512 
513 /**********************************************************************************/
514 
DECO16IC_BANK_CB_MEMBER(dassault_state::bank_callback)515 DECO16IC_BANK_CB_MEMBER(dassault_state::bank_callback)
516 {
517 	return ((bank >> 4) & 0xf) << 12;
518 }
519 
machine_reset()520 void dassault_state::machine_reset()
521 {
522 	m_priority = 0;
523 }
524 
dassault(machine_config & config)525 void dassault_state::dassault(machine_config &config)
526 {
527 	/* basic machine hardware */
528 	M68000(config, m_maincpu, XTAL(28'000'000)/2);   /* 14MHz - Accurate */
529 	m_maincpu->set_addrmap(AS_PROGRAM, &dassault_state::dassault_map);
530 	m_maincpu->set_vblank_int("screen", FUNC(dassault_state::irq4_line_assert));
531 
532 	M68000(config, m_subcpu, XTAL(28'000'000)/2);   /* 14MHz - Accurate */
533 	m_subcpu->set_addrmap(AS_PROGRAM, &dassault_state::dassault_sub_map);
534 	m_subcpu->set_vblank_int("screen", FUNC(dassault_state::irq5_line_assert));
535 
536 	H6280(config, m_audiocpu, XTAL(32'220'000)/8);    /* Accurate */
537 	m_audiocpu->set_addrmap(AS_PROGRAM, &dassault_state::sound_map);
538 	m_audiocpu->add_route(ALL_OUTPUTS, "lspeaker", 0); // internal sound unused
539 	m_audiocpu->add_route(ALL_OUTPUTS, "rspeaker", 0);
540 
541 //  config.set_maximum_quantum(attotime::from_hz(8400)); /* 140 CPU slices per frame */
542 	config.set_perfect_quantum(m_maincpu); // I was seeing random lockups.. let's see if this helps
543 
544 	mb8421_mb8431_16_device &sharedram(MB8421_MB8431_16BIT(config, "sharedram"));
545 	sharedram.intl_callback().set_inputline("maincpu", M68K_IRQ_5);
546 	sharedram.intr_callback().set_inputline("sub", M68K_IRQ_6);
547 
548 	/* video hardware */
549 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
550 	screen.set_raw(XTAL(28'000'000) / 4, 442, 0, 320, 274, 8, 248);  // same as robocop2(cninja.cpp)? verify this from real pcb.
551 	screen.set_screen_update(FUNC(dassault_state::screen_update_dassault));
552 
553 	GFXDECODE(config, "gfxdecode", m_palette, gfx_dassault);
554 	PALETTE(config, m_palette).set_format(palette_device::xBGR_888, 4096);
555 
556 	BUFFERED_SPRITERAM16(config, m_spriteram[0]);
557 	BUFFERED_SPRITERAM16(config, m_spriteram[1]);
558 
559 	DECO16IC(config, m_deco_tilegen[0], 0);
560 	m_deco_tilegen[0]->set_pf1_size(DECO_64x32);
561 	m_deco_tilegen[0]->set_pf2_size(DECO_64x32);
562 	m_deco_tilegen[0]->set_pf1_col_bank(0);
563 	m_deco_tilegen[0]->set_pf2_col_bank(16);
564 	m_deco_tilegen[0]->set_pf1_col_mask(0x0f);
565 	m_deco_tilegen[0]->set_pf2_col_mask(0x0f);
566 	m_deco_tilegen[0]->set_bank1_callback(FUNC(dassault_state::bank_callback));
567 	m_deco_tilegen[0]->set_bank2_callback(FUNC(dassault_state::bank_callback));
568 	m_deco_tilegen[0]->set_pf12_8x8_bank(0);
569 	m_deco_tilegen[0]->set_pf12_16x16_bank(1);
570 	m_deco_tilegen[0]->set_gfxdecode_tag("gfxdecode");
571 
572 	DECO16IC(config, m_deco_tilegen[1], 0);
573 	m_deco_tilegen[1]->set_pf1_size(DECO_64x32);
574 	m_deco_tilegen[1]->set_pf2_size(DECO_64x32);
575 	m_deco_tilegen[1]->set_pf1_col_bank(0);
576 	m_deco_tilegen[1]->set_pf2_col_bank(16);
577 	m_deco_tilegen[1]->set_pf1_col_mask(0x0f);
578 	m_deco_tilegen[1]->set_pf2_col_mask(0x0f);
579 	m_deco_tilegen[1]->set_bank1_callback(FUNC(dassault_state::bank_callback));
580 	m_deco_tilegen[1]->set_bank2_callback(FUNC(dassault_state::bank_callback));
581 	m_deco_tilegen[1]->set_pf12_8x8_bank(0);
582 	m_deco_tilegen[1]->set_pf12_16x16_bank(2);
583 	m_deco_tilegen[1]->set_gfxdecode_tag("gfxdecode");
584 
585 	DECO_SPRITE(config, m_sprgen[0], 0);
586 	m_sprgen[0]->set_gfx_region(3);
587 	m_sprgen[0]->set_gfxdecode_tag("gfxdecode");
588 
589 	DECO_SPRITE(config, m_sprgen[1], 0);
590 	m_sprgen[1]->set_gfx_region(4);
591 	m_sprgen[1]->set_gfxdecode_tag("gfxdecode");
592 
593 	/* sound hardware */
594 	SPEAKER(config, "lspeaker").front_left();
595 	SPEAKER(config, "rspeaker").front_right();
596 
597 	GENERIC_LATCH_8(config, m_soundlatch);
598 	m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0); // IRQ1
599 
600 	ym2203_device &ym1(YM2203(config, "ym1", XTAL(32'220'000)/8));
601 	ym1.add_route(ALL_OUTPUTS, "lspeaker", 0.40);
602 	ym1.add_route(ALL_OUTPUTS, "rspeaker", 0.40);
603 
604 	ym2151_device &ym2(YM2151(config, "ym2", XTAL(32'220'000)/9));
605 	ym2.irq_handler().set_inputline(m_audiocpu, 1);
606 	ym2.port_write_handler().set(FUNC(dassault_state::sound_bankswitch_w));
607 	ym2.add_route(0, "lspeaker", 0.45);
608 	ym2.add_route(1, "rspeaker", 0.45);
609 
610 	okim6295_device &oki1(OKIM6295(config, "oki1", XTAL(32'220'000)/32, okim6295_device::PIN7_HIGH)); // verified
611 	oki1.add_route(ALL_OUTPUTS, "lspeaker", 0.50);
612 	oki1.add_route(ALL_OUTPUTS, "rspeaker", 0.50);
613 
614 	OKIM6295(config, m_oki2, XTAL(32'220'000)/16, okim6295_device::PIN7_HIGH); // verified
615 	m_oki2->add_route(ALL_OUTPUTS, "lspeaker", 0.25);
616 	m_oki2->add_route(ALL_OUTPUTS, "rspeaker", 0.25);
617 }
618 
619 /**********************************************************************************/
620 
621 ROM_START( thndzone ) /* World rev 1 set, DSW selectable 2 or 4 players */
622 	ROM_REGION(0x80000, "maincpu", 0 ) /* 68000 code */
623 	ROM_LOAD16_BYTE("gz01-1.a15", 0x00000, 0x20000, CRC(20250da6) SHA1(2d01d59b67a2ecc2ddc88eded43f451931a0a33b) )
624 	ROM_LOAD16_BYTE("gz03-1.a17", 0x00001, 0x20000, CRC(3595fad0) SHA1(5d61776cdf2274cb26ea06ce97c35f5ce7f27e66) )
CRC(b7277175)625 	ROM_LOAD16_BYTE("gt00.a14",   0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) ) /* Same data as GS00.A14 */
626 	ROM_LOAD16_BYTE("gt02.a16",   0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) ) /* Same data as GS02.A16 */
627 
628 	ROM_REGION(0x80000, "sub", 0 ) /* 68000 code (Sub cpu) */
629 	ROM_LOAD16_BYTE("gz10-1.a12", 0x00000, 0x20000, CRC(811d86d7) SHA1(94971acad2c648b7a65ca54d9315414ed3b94f24) )
630 	ROM_LOAD16_BYTE("gz08-1.a9",  0x00001, 0x20000, CRC(8f61ab1e) SHA1(df4e7db889915eca39ed4e1a4b5fcae9cd1a9882) )
631 	ROM_LOAD16_BYTE("gt11-1.a14", 0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) ) /* Same data as GS11.A14 */
632 	ROM_LOAD16_BYTE("gt09-1.a11", 0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) ) /* Same data as GS09.A11 */
633 
634 	ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
635 	ROM_LOAD( "gt04.f18",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) ) /* Same data for all regions, different label */
636 
637 	ROM_REGION(0x020000, "gfx1", 0 )
638 	ROM_LOAD16_BYTE( "gt05.h11", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) ) /* Same data for all regions, different label */
639 	ROM_LOAD16_BYTE( "gt06.h12", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) ) /* Same data for all regions, different label */
640 
641 	ROM_REGION(0x120000, "gfx2", 0 )
642 	ROM_LOAD( "maj-02.h14", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
643 	/* Other 0x20000 filled in later */
644 
645 	ROM_REGION(0x200000, "gfx3", 0 )
646 	ROM_LOAD( "maj-01.c18", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
647 	ROM_LOAD( "maj-00.c17", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
648 
649 	ROM_REGION( 0x400000, "gfx4", 0 ) /* sprites chip 1 */
650 	ROM_LOAD( "maj-04.r1",  0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
651 	ROM_LOAD( "maj-05.r2",  0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
652 	ROM_LOAD( "maj-06.r3",  0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
653 	ROM_LOAD( "maj-07.r5",  0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
654 	ROM_LOAD( "maj-08.s6",  0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
655 	ROM_LOAD( "maj-09.s8",  0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
656 	ROM_LOAD( "maj-10.s9",  0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
657 	ROM_LOAD( "maj-11.s11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
658 
659 	ROM_REGION( 0x80000, "gfx5", 0 ) /* sprites chip 2 */
660 	ROM_LOAD16_BYTE( "gt12.n1", 0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
661 	ROM_LOAD16_BYTE( "gt13.n2", 0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
662 	ROM_LOAD16_BYTE( "gt14.n3", 0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
663 	ROM_LOAD16_BYTE( "gt15.n5", 0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
664 
665 	ROM_REGION(0x40000, "oki1", 0 ) /* Oki samples */
666 	ROM_LOAD( "gt07.h15",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) ) /* Same data as GS07.H15 */
667 
668 	ROM_REGION(0x80000, "oki2", 0 ) /* Extra Oki samples */
669 	ROM_LOAD( "maj-03.h16", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )   /* banked */
670 
671 	ROM_REGION( 0x1000, "proms", 0 )
672 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )   /* Priority?  Unused */
673 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Timing??  Unused */
674 	/* Above prom also at 16s and 17s */
675 
676 	ROM_REGION( 0x1000, "plds", 0 )
677 	ROM_LOAD( "pal16r8a 1h",  0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
678 	ROM_LOAD( "pal16l8b.7c",  0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
679 	ROM_LOAD( "pal16l8b.7d",  0x0400, 0x0104, CRC(199e83fd) SHA1(ebb5d66f29935b0a58e79b0db30611b5dce328a6) ) /* PAL is read protected */
680 	ROM_LOAD( "pal16l8b.7e",  0x0600, 0x0104, NO_DUMP ) /* PAL is read protected */
681 	ROM_LOAD( "pal16l8b.7l",  0x0800, 0x0104, NO_DUMP ) /* PAL is read protected */
682 	ROM_LOAD( "pal16l8b.8e",  0x0a00, 0x0104, NO_DUMP ) /* PAL is read protected */
683 	ROM_LOAD( "pal16l8b.9d",  0x0c00, 0x0104, NO_DUMP ) /* PAL is read protected */
684 	ROM_LOAD( "pal16l8b.10c", 0x0e00, 0x0104, NO_DUMP ) /* PAL is read protected */
685 ROM_END
686 
687 ROM_START( thndzonea ) /* World set, DSW selectable 2 or 4 players */
688 	ROM_REGION(0x80000, "maincpu", 0 ) /* 68000 code */
689 	ROM_LOAD16_BYTE("gz01.a15", 0x00000, 0x20000, CRC(15e8c328) SHA1(8876b5fde77604c2fe4654271ceb341a8fa460c1) )
690 	ROM_LOAD16_BYTE("gz03.a17", 0x00001, 0x20000, CRC(aab5c86e) SHA1(c3560b15360ddf14e8444d9f70724e698b2bd42f) )
691 	ROM_LOAD16_BYTE("gt00.a14", 0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) ) /* Same data as GS00.A14 */
692 	ROM_LOAD16_BYTE("gt02.a16", 0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) ) /* Same data as GS02.A16 */
693 
694 	ROM_REGION(0x80000, "sub", 0 ) /* 68000 code (Sub cpu) */
695 	ROM_LOAD16_BYTE("gz10.a12",   0x00000, 0x20000, CRC(79f919e9) SHA1(b6793173e310b1df07cf3e9209da1fbec3a8a05b) )
696 	ROM_LOAD16_BYTE("gz08.a9",    0x00001, 0x20000, CRC(d47d7836) SHA1(8a5d3e8b89f5dfd6bac83f7b093ddb03d5ecef73) )
697 	ROM_LOAD16_BYTE("gt11-1.a14", 0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) ) /* Same data as GS11.A14 */
698 	ROM_LOAD16_BYTE("gt09-1.a11", 0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) ) /* Same data as GS09.A11 */
699 
700 	ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
701 	ROM_LOAD( "gt04.f18",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) ) /* Same data for all regions, different label */
702 
703 	ROM_REGION(0x020000, "gfx1", 0 )
704 	ROM_LOAD16_BYTE( "gt05.h11", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) ) /* Same data for all regions, different label */
705 	ROM_LOAD16_BYTE( "gt06.h12", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) ) /* Same data for all regions, different label */
706 
707 	ROM_REGION(0x120000, "gfx2", 0 )
708 	ROM_LOAD( "maj-02.h14", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
709 	/* Other 0x20000 filled in later */
710 
711 	ROM_REGION(0x200000, "gfx3", 0 )
712 	ROM_LOAD( "maj-01.c18", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
713 	ROM_LOAD( "maj-00.c17", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
714 
715 	ROM_REGION( 0x400000, "gfx4", 0 ) /* sprites chip 1 */
716 	ROM_LOAD( "maj-04.r1",  0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
717 	ROM_LOAD( "maj-05.r2",  0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
718 	ROM_LOAD( "maj-06.r3",  0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
719 	ROM_LOAD( "maj-07.r5",  0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
720 	ROM_LOAD( "maj-08.s6",  0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
721 	ROM_LOAD( "maj-09.s8",  0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
722 	ROM_LOAD( "maj-10.s9",  0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
723 	ROM_LOAD( "maj-11.s11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
724 
725 	ROM_REGION( 0x80000, "gfx5", 0 ) /* sprites chip 2 */
726 	ROM_LOAD16_BYTE( "gt12.n1", 0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
727 	ROM_LOAD16_BYTE( "gt13.n2", 0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
728 	ROM_LOAD16_BYTE( "gt14.n3", 0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
729 	ROM_LOAD16_BYTE( "gt15.n5", 0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
730 
731 	ROM_REGION(0x40000, "oki1", 0 ) /* Oki samples */
732 	ROM_LOAD( "gt07.h15",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) ) /* Same data as GS07.H15 */
733 
734 	ROM_REGION(0x80000, "oki2", 0 ) /* Extra Oki samples */
735 	ROM_LOAD( "maj-03.h16", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )   /* banked */
736 
737 	ROM_REGION( 0x2000, "proms", 0 )
738 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )   /* Priority?  Unused */
739 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
740 	ROM_LOAD( "mb7128y.16s", 0x01000,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
741 	ROM_LOAD( "mb7128y.17s", 0x01800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused - Data identical for 3 proms! */
742 
743 	ROM_REGION( 0x1000, "plds", 0 )
744 	ROM_LOAD( "pal16r8a 1h",  0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
745 	ROM_LOAD( "pal16l8b.7c",  0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
746 	ROM_LOAD( "pal16l8b.7d",  0x0400, 0x0104, CRC(199e83fd) SHA1(ebb5d66f29935b0a58e79b0db30611b5dce328a6) ) /* PAL is read protected */
747 	ROM_LOAD( "pal16l8b.7e",  0x0600, 0x0104, NO_DUMP ) /* PAL is read protected */
748 	ROM_LOAD( "pal16l8b.7l",  0x0800, 0x0104, NO_DUMP ) /* PAL is read protected */
749 	ROM_LOAD( "pal16l8b.8e",  0x0a00, 0x0104, NO_DUMP ) /* PAL is read protected */
750 	ROM_LOAD( "pal16l8b.9d",  0x0c00, 0x0104, NO_DUMP ) /* PAL is read protected */
751 	ROM_LOAD( "pal16l8b.10c", 0x0e00, 0x0104, NO_DUMP ) /* PAL is read protected */
752 ROM_END
753 
754 ROM_START( thndzone4 ) /* World set, 4 Player (shared credits) only English set from a Korean PCB without labels */
755 	ROM_REGION(0x80000, "maincpu", 0 ) /* 68000 code */
756 	ROM_LOAD16_BYTE("27c010.a15", 0x00000, 0x20000, CRC(30f21608) SHA1(087defd8869faf3f7f4569b98debe691a75fcec4) )
757 	ROM_LOAD16_BYTE("27c010.a17", 0x00001, 0x20000, CRC(60886a33) SHA1(5b215e460845705af4b5e0cd00f6b0ad488520bb) )
758 	ROM_LOAD16_BYTE("gt00.a14", 0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) ) /* Same data as GS00.A14 */
759 	ROM_LOAD16_BYTE("gt02.a16", 0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) ) /* Same data as GS02.A16 */
760 
761 	ROM_REGION(0x80000, "sub", 0 ) /* 68000 code (Sub cpu) */
762 	ROM_LOAD16_BYTE("d27c010.a12", 0x00000, 0x20000, CRC(99356cba) SHA1(2bc2b031bd44101e12213bb04a94d2d438f96ee0) )
763 	ROM_LOAD16_BYTE("d27c010.a9",  0x00001, 0x20000, CRC(8bf114e7) SHA1(84b1b8d8aea8788902367cae3b766bb4e6e44d5a) )
764 	ROM_LOAD16_BYTE("d27c010.a14", 0x40000, 0x20000, CRC(3d96d47e) SHA1(e2c01a17237cb6dc914da847642629415eda14a8) )
765 	ROM_LOAD16_BYTE("d27c010.a11", 0x40001, 0x20000, CRC(2ab9b63f) SHA1(2ab06abbdee6e0d9c83004cdcb871c7389624086) )
766 
767 	ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
768 	ROM_LOAD( "gu04.f18",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) ) /* Same data for all regions, different label */
769 
770 	ROM_REGION(0x020000, "gfx1", 0 )
771 	ROM_LOAD16_BYTE( "27512.j10", 0x000000, 0x10000, CRC(ab22a078) SHA1(246c9ebae5c2f296652395267fa3eeb81b8b52bd) ) /* Only set with different data here! */
772 	ROM_LOAD16_BYTE( "27512.j12", 0x000001, 0x10000, CRC(34fc4428) SHA1(c912441ab8433391193b4199c2553d7909221d93) ) /* Only set with different data here! */
773 
774 	ROM_REGION(0x120000, "gfx2", 0 )
775 	ROM_LOAD( "maj-02.h14", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
776 	/* Other 0x20000 filled in later */
777 
778 	ROM_REGION(0x200000, "gfx3", 0 )
779 	ROM_LOAD( "maj-01.c18", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
780 	ROM_LOAD( "maj-00.c17", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
781 
782 	ROM_REGION( 0x400000, "gfx4", 0 ) /* sprites chip 1 */
783 	ROM_LOAD( "maj-04.r1",  0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
784 	ROM_LOAD( "maj-05.r2",  0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
785 	ROM_LOAD( "maj-06.r3",  0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
786 	ROM_LOAD( "maj-07.r5",  0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
787 	ROM_LOAD( "maj-08.s6",  0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
788 	ROM_LOAD( "maj-09.s8",  0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
789 	ROM_LOAD( "maj-10.s9",  0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
790 	ROM_LOAD( "maj-11.s11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
791 
792 	ROM_REGION( 0x80000, "gfx5", 0 ) /* sprites chip 2 */
793 	ROM_LOAD16_BYTE( "gt12.n1", 0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
794 	ROM_LOAD16_BYTE( "gt13.n2", 0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
795 	ROM_LOAD16_BYTE( "gt14.n3", 0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
796 	ROM_LOAD16_BYTE( "gt15.n5", 0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
797 
798 	ROM_REGION(0x40000, "oki1", 0 ) /* Oki samples */
799 	ROM_LOAD( "gs07.h15",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) )
800 
801 	ROM_REGION(0x80000, "oki2", 0 ) /* Extra Oki samples */
802 	ROM_LOAD( "maj-03.h16", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )   /* banked */
803 
804 	ROM_REGION( 0x2000, "proms", 0 )
805 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )   /* Priority?  Unused */
806 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
807 	ROM_LOAD( "mb7128y.16s", 0x01000,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
808 	ROM_LOAD( "mb7128y.17s", 0x01800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused - Data identical for 3 proms! */
809 
810 	ROM_REGION( 0x1000, "plds", 0 )
811 	ROM_LOAD( "pal16r8a 1h",  0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
812 	ROM_LOAD( "pal16l8b.7c",  0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
813 	ROM_LOAD( "pal16l8b.7d",  0x0400, 0x0104, CRC(199e83fd) SHA1(ebb5d66f29935b0a58e79b0db30611b5dce328a6) ) /* PAL is read protected */
814 	ROM_LOAD( "pal16l8b.7e",  0x0600, 0x0104, NO_DUMP ) /* PAL is read protected */
815 	ROM_LOAD( "pal16l8b.7l",  0x0800, 0x0104, NO_DUMP ) /* PAL is read protected */
816 	ROM_LOAD( "pal16l8b.8e",  0x0a00, 0x0104, NO_DUMP ) /* PAL is read protected */
817 	ROM_LOAD( "pal16l8b.9d",  0x0c00, 0x0104, NO_DUMP ) /* PAL is read protected */
818 	ROM_LOAD( "pal16l8b.10c", 0x0e00, 0x0104, NO_DUMP ) /* PAL is read protected */
819 ROM_END
820 
821 ROM_START( thndzonej ) /* Japan set, DSW selectable 2 or 4 players - Japanese language */
822 	ROM_REGION(0x80000, "maincpu", 0 ) /* 68000 code */
823 	ROM_LOAD16_BYTE("gu01.a15", 0x00000, 0x20000, CRC(eb28f8e8) SHA1(834f89db3ef48a71d20c0ec3a0c2231e115d7f48) )
824 	ROM_LOAD16_BYTE("gu03.a17", 0x00001, 0x20000, CRC(9ad2b431) SHA1(c2fb88b4d2df93e3f787fe49c240573e1bc2844e) )
825 	ROM_LOAD16_BYTE("gu00.a14", 0x40000, 0x20000, CRC(fca9e84f) SHA1(a0ecf99eace7357b05da8f8fe06b9bbf7d16d95a) )
826 	ROM_LOAD16_BYTE("gu02.a16", 0x40001, 0x20000, CRC(b6026bae) SHA1(673b7f7a432580ec1780d1efa2b48184af428698) )
827 
828 	ROM_REGION(0x80000, "sub", 0 ) /* 68000 code (Sub cpu) */
829 	ROM_LOAD16_BYTE("gu10.a12", 0x00000, 0x20000, CRC(8042e87d) SHA1(dc69b13fc06d94a2bc5569e96931e6d9496bd44f) )
830 	ROM_LOAD16_BYTE("gu08.a9",  0x00001, 0x20000, CRC(c8895bfa) SHA1(6a5421bd926e0aa86c81e345f2dfe5265bd3add2) )
831 	ROM_LOAD16_BYTE("gu11.a14", 0x40000, 0x20000, CRC(c0d6eb82) SHA1(44070e6d37f5327cf7f647e44ea49a1fe6844e5e) )
832 	ROM_LOAD16_BYTE("gu09.a11", 0x40001, 0x20000, CRC(42de13a7) SHA1(f948d31e368499fd8c35da0c7dd7519cfbd4b5f7) )
833 
834 	ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
835 	ROM_LOAD( "gu04.f18",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) ) /* Same data for all regions, different label */
836 
837 	ROM_REGION(0x020000, "gfx1", 0 )
838 	ROM_LOAD16_BYTE( "gu05.h11", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) ) /* Same data for all regions, different label */
839 	ROM_LOAD16_BYTE( "gu06.h12", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) ) /* Same data for all regions, different label */
840 
841 	ROM_REGION(0x120000, "gfx2", 0 )
842 	ROM_LOAD( "maj-02.h14", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
843 	/* Other 0x20000 filled in later */
844 
845 	ROM_REGION(0x200000, "gfx3", 0 )
846 	ROM_LOAD( "maj-01.c18", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
847 	ROM_LOAD( "maj-00.c17", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
848 
849 	ROM_REGION( 0x400000, "gfx4", 0 ) /* sprites chip 1 */
850 	ROM_LOAD( "maj-04.r1",  0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
851 	ROM_LOAD( "maj-05.r2",  0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
852 	ROM_LOAD( "maj-06.r3",  0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
853 	ROM_LOAD( "maj-07.r5",  0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
854 	ROM_LOAD( "maj-08.s6",  0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
855 	ROM_LOAD( "maj-09.s8",  0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
856 	ROM_LOAD( "maj-10.s9",  0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
857 	ROM_LOAD( "maj-11.s11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
858 
859 	ROM_REGION( 0x80000, "gfx5", 0 ) /* sprites chip 2 */
860 	/* Although the other Mask ROMs on the PCB are MAJ-xx, for the Japan version, these 4 are actually MAL-xx */
861 	ROM_LOAD16_BYTE( "mal-12.n1", 0x000000, 0x20000, NO_DUMP ) /* Mask ROM - Need to verify if these are the same or different as the other sets */
862 	ROM_LOAD16_BYTE( "mal-13.n2", 0x000001, 0x20000, NO_DUMP ) /* Mask ROM - Need to verify if these are the same or different as the other sets */
863 	ROM_LOAD16_BYTE( "mal-14.n3", 0x040000, 0x20000, NO_DUMP ) /* Mask ROM - Need to verify if these are the same or different as the other sets */
864 	ROM_LOAD16_BYTE( "mal-15.n5", 0x040001, 0x20000, NO_DUMP ) /* Mask ROM - Need to verify if these are the same or different as the other sets */
865 	ROM_LOAD16_BYTE( "gt12.n1", 0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) ) /* REMOVE when MAL-12.N1 is dumped & added */
866 	ROM_LOAD16_BYTE( "gt13.n2", 0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) ) /* REMOVE when MAL-13.N2 is dumped & added */
867 	ROM_LOAD16_BYTE( "gt14.n3", 0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) ) /* REMOVE when MAL-14.N3 is dumped & added */
868 	ROM_LOAD16_BYTE( "gt15.n5", 0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) ) /* REMOVE when MAL-15.N5 is dumped & added */
869 
870 	ROM_REGION(0x40000, "oki1", 0 ) /* Oki samples */
871 	/* This rom is also a Mask ROM label MAL-07 and _NOT_ MAJ-07 */
872 	ROM_LOAD( "mal-07.h15",  0x00000,  0x20000, NO_DUMP ) /* Mask ROM - Need to verify if these are the same or different as the other sets */
873 	ROM_LOAD( "gs07.h15",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) ) /* REMOVE when MAL-07.H15 is dumped & added */
874 
875 	ROM_REGION(0x80000, "oki2", 0 ) /* Extra Oki samples */
876 	ROM_LOAD( "maj-03.h16", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )   /* banked */
877 
878 	ROM_REGION( 0x2000, "proms", 0 )
879 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )   /* Priority?  Unused */
880 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
881 	ROM_LOAD( "mb7128y.16s", 0x01000,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
882 	ROM_LOAD( "mb7128y.17s", 0x01800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused - Data identical for 3 proms! */
883 
884 	ROM_REGION( 0x1000, "plds", 0 )
885 	ROM_LOAD( "pal16r8a 1h",  0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
886 	ROM_LOAD( "pal16l8b.7c",  0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
887 	ROM_LOAD( "pal16l8b.7d",  0x0400, 0x0104, CRC(199e83fd) SHA1(ebb5d66f29935b0a58e79b0db30611b5dce328a6) ) /* PAL is read protected */
888 	ROM_LOAD( "pal16l8b.7e",  0x0600, 0x0104, NO_DUMP ) /* PAL is read protected */
889 	ROM_LOAD( "pal16l8b.7l",  0x0800, 0x0104, NO_DUMP ) /* PAL is read protected */
890 	ROM_LOAD( "pal16l8b.8e",  0x0a00, 0x0104, NO_DUMP ) /* PAL is read protected */
891 	ROM_LOAD( "pal16l8b.9d",  0x0c00, 0x0104, NO_DUMP ) /* PAL is read protected */
892 	ROM_LOAD( "pal16l8b.10c", 0x0e00, 0x0104, NO_DUMP ) /* PAL is read protected */
893 ROM_END
894 
895 ROM_START( dassault ) /* USA set, DSW selectable 2, 3 or 4 players */
896 	ROM_REGION(0x80000, "maincpu", 0 ) /* 68000 code */
897 	ROM_LOAD16_BYTE("01.a15",   0x00000, 0x20000, CRC(14f17ea7) SHA1(0bb8b7dba05f1ea42e68838861f0d4c263eac6b3) )
898 	ROM_LOAD16_BYTE("03.a17",   0x00001, 0x20000, CRC(bed1b90c) SHA1(c100f89b69025e2ff885b35a733abc627da98a07) )
899 	ROM_LOAD16_BYTE("gs00.a14", 0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) ) /* Same data as GT00.A14 */
900 	ROM_LOAD16_BYTE("gs02.a16", 0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) ) /* Same data as GT02.A16 */
901 
902 	ROM_REGION(0x80000, "sub", 0 ) /* 68000 code (Sub cpu) */
903 	ROM_LOAD16_BYTE("hc10-1.a12", 0x00000, 0x20000, CRC(ac5ac770) SHA1(bf6640900c2f9c8091168bf106edf85350c34652) )
904 	ROM_LOAD16_BYTE("hc08-1.a9",  0x00001, 0x20000, CRC(864dca56) SHA1(0967f613684b539d10b67e4f6033c890e2134ea2) )
905 	ROM_LOAD16_BYTE("gs11.a14",   0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) ) /* Same data as GT11-1.A14 */
906 	ROM_LOAD16_BYTE("gs09.a11",   0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) ) /* Same data as GT09-1.A11 */
907 
908 	ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
909 	ROM_LOAD( "gs04.f18",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) ) /* Same data for all regions, different label */
910 
911 	ROM_REGION(0x020000, "gfx1", 0 )
912 	ROM_LOAD16_BYTE( "gs05.h11", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) ) /* Same data for all regions, different label */
913 	ROM_LOAD16_BYTE( "gs06.h12", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) ) /* Same data for all regions, different label */
914 
915 	ROM_REGION(0x120000, "gfx2", 0 )
916 	ROM_LOAD( "maj-02.h14", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
917 	/* Other 0x20000 filled in later */
918 
919 	ROM_REGION(0x200000, "gfx3", 0 )
920 	ROM_LOAD( "maj-01.c18", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
921 	ROM_LOAD( "maj-00.c17", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
922 
923 	ROM_REGION( 0x400000, "gfx4", 0 ) /* sprites chip 1 */
924 	ROM_LOAD( "maj-04.r1",  0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
925 	ROM_LOAD( "maj-05.r2",  0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
926 	ROM_LOAD( "maj-06.r3",  0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
927 	ROM_LOAD( "maj-07.r5",  0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
928 	ROM_LOAD( "maj-08.s6",  0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
929 	ROM_LOAD( "maj-09.s8",  0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
930 	ROM_LOAD( "maj-10.s9",  0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
931 	ROM_LOAD( "maj-11.s11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
932 
933 	ROM_REGION( 0x80000, "gfx5", 0 ) /* sprites chip 2 */
934 	ROM_LOAD16_BYTE( "gs12.n1", 0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
935 	ROM_LOAD16_BYTE( "gs13.n2", 0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
936 	ROM_LOAD16_BYTE( "gs14.n3", 0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
937 	ROM_LOAD16_BYTE( "gs15.n5", 0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
938 
939 	ROM_REGION(0x40000, "oki1", 0 ) /* Oki samples */
940 	ROM_LOAD( "gs07.h15",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) )
941 
942 	ROM_REGION(0x80000, "oki2", 0 ) /* Extra Oki samples */
943 	ROM_LOAD( "maj-03.h16", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )   /* banked */
944 
945 	ROM_REGION( 0x2000, "proms", 0 )
946 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )   /* Priority?  Unused */
947 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
948 	ROM_LOAD( "mb7128y.16s", 0x01000,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
949 	ROM_LOAD( "mb7128y.17s", 0x01800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused - Data identical for 3 proms! */
950 
951 	ROM_REGION( 0x1000, "plds", 0 )
952 	ROM_LOAD( "pal16r8a 1h",  0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
953 	ROM_LOAD( "pal16l8b.7c",  0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
954 	ROM_LOAD( "pal16l8b.7d",  0x0400, 0x0104, CRC(199e83fd) SHA1(ebb5d66f29935b0a58e79b0db30611b5dce328a6) ) /* PAL is read protected */
955 	ROM_LOAD( "pal16l8b.7e",  0x0600, 0x0104, NO_DUMP ) /* PAL is read protected */
956 	ROM_LOAD( "pal16l8b.7l",  0x0800, 0x0104, NO_DUMP ) /* PAL is read protected */
957 	ROM_LOAD( "pal16l8b.8e",  0x0a00, 0x0104, NO_DUMP ) /* PAL is read protected */
958 	ROM_LOAD( "pal16l8b.9d",  0x0c00, 0x0104, NO_DUMP ) /* PAL is read protected */
959 	ROM_LOAD( "pal16l8b.10c", 0x0e00, 0x0104, NO_DUMP ) /* PAL is read protected */
960 ROM_END
961 
962 ROM_START( dassault4 ) /* USA set, 4 player only */
963 	ROM_REGION(0x80000, "maincpu", 0 ) /* 68000 code */
964 	ROM_LOAD16_BYTE("gs01.a15", 0x00000, 0x20000, CRC(8613634d) SHA1(69b64e54fde3b5f1ee3435d7327b84e7a7d43f6d) )
965 	ROM_LOAD16_BYTE("gs03.a17", 0x00001, 0x20000, CRC(ea860bd4) SHA1(6e4e2d004433ad5842b4bc895eaa8f55bd1ee168) )
966 	ROM_LOAD16_BYTE("gs00.a14", 0x40000, 0x20000, CRC(b7277175) SHA1(ffb19c4dd12e0391f01de57c46a7998885fe22bf) ) /* Same data as GT00.A14 */
967 	ROM_LOAD16_BYTE("gs02.a16", 0x40001, 0x20000, CRC(cde31e35) SHA1(0219845308c9f46e73b0504bd2aefa2fa74f388e) ) /* Same data as GT02.A16 */
968 
969 	ROM_REGION(0x80000, "sub", 0 ) /* 68000 code (Sub cpu) */
970 	ROM_LOAD16_BYTE("gs10.a12", 0x00000, 0x20000, CRC(285f72a3) SHA1(d01972aec500805ca1abed14983064cd14e942d4) )
971 	ROM_LOAD16_BYTE("gs08.a9",  0x00001, 0x20000, CRC(16691ede) SHA1(dc481dfc6104833a6fd18be6275e77ecc0510165) )
972 	ROM_LOAD16_BYTE("gs11.a14", 0x40000, 0x20000, CRC(80cb23de) SHA1(d52426460eea2285c57cfc3fe37aa6dc79990e25) ) /* Same data as GT11-1.A14 */
973 	ROM_LOAD16_BYTE("gs09.a11", 0x40001, 0x20000, CRC(0a8fa7e1) SHA1(330ae9602b5f56b5dc4961a41991b64412a59880) ) /* Same data as GT09-1.A11 */
974 
975 	ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
976 	ROM_LOAD( "gs04.f18",    0x00000, 0x10000, CRC(81c29ebf) SHA1(1b241277a8e35cdeaeb120970d14a09d33032459) ) /* Same data for all regions, different label */
977 
978 	ROM_REGION(0x020000, "gfx1", 0 )
979 	ROM_LOAD16_BYTE( "gs05.h11", 0x000000, 0x10000, CRC(0aae996a) SHA1(d37a12b057e9934212362d7eafa575c961819a27) ) /* Same data for all regions, different label */
980 	ROM_LOAD16_BYTE( "gs06.h12", 0x000001, 0x10000, CRC(4efdf03d) SHA1(835d22829c6d0f4efc76801b449f9a779f460f1c) ) /* Same data for all regions, different label */
981 
982 	ROM_REGION(0x120000, "gfx2", 0 )
983 	ROM_LOAD( "maj-02.h14", 0x000000, 0x100000, CRC(383bbc37) SHA1(c537ab147a2770ce28ee185b08dd62d35249bfa9) )
984 	/* Other 0x20000 filled in later */
985 
986 	ROM_REGION(0x200000, "gfx3", 0 )
987 	ROM_LOAD( "maj-01.c18", 0x000000, 0x100000, CRC(9840a204) SHA1(096c351769da5184c3d9a05495370134acc9507a) )
988 	ROM_LOAD( "maj-00.c17", 0x100000, 0x100000, CRC(87ea8d16) SHA1(db47123aa2ebbb800cfc5cfcf50309bc39cadbcd) )
989 
990 	ROM_REGION( 0x400000, "gfx4", 0 ) /* sprites chip 1 */
991 	ROM_LOAD( "maj-04.r1",  0x000000, 0x80000, CRC(36e49b19) SHA1(bfbc45b635bf3d46ff8b8a514a3f352bf3a95535) )
992 	ROM_LOAD( "maj-05.r2",  0x080000, 0x80000, CRC(80fc71cc) SHA1(65b15afbe5d628051b012777d486b6ce92a3795c) )
993 	ROM_LOAD( "maj-06.r3",  0x100000, 0x80000, CRC(2e7a684b) SHA1(cffeda1a816dad30d6b1cb12458661188d625d40) )
994 	ROM_LOAD( "maj-07.r5",  0x180000, 0x80000, CRC(3acc1f78) SHA1(87ec65b4f54a66370754534d03f4c9217531b42f) )
995 	ROM_LOAD( "maj-08.s6",  0x200000, 0x80000, CRC(1958a36d) SHA1(466a30dcd2ea13028272ed2187f890ee20d6636b) )
996 	ROM_LOAD( "maj-09.s8",  0x280000, 0x80000, CRC(c21087a1) SHA1(b769c5f2f9b9c525d121902fe9557a6bfc077b99) )
997 	ROM_LOAD( "maj-10.s9",  0x300000, 0x80000, CRC(a02fa641) SHA1(14b999a441964e612700bf21945a948eaebb253e) )
998 	ROM_LOAD( "maj-11.s11", 0x380000, 0x80000, CRC(dabe9305) SHA1(44d69fe55e674de7f4c610d295d4528d4b2eb150) )
999 
1000 	ROM_REGION( 0x80000, "gfx5", 0 ) /* sprites chip 2 */
1001 	ROM_LOAD16_BYTE( "gs12.n1", 0x000000, 0x20000, CRC(9a86a015) SHA1(968576b8422393ab9a93d98c15428b1c11417b3d) )
1002 	ROM_LOAD16_BYTE( "gs13.n2", 0x000001, 0x20000, CRC(f4709905) SHA1(697842a3d7bc2588c77833c3af8938e6f0b1238d) )
1003 	ROM_LOAD16_BYTE( "gs14.n3", 0x040000, 0x20000, CRC(750fc523) SHA1(ef8794359ff3a44a97ab402821fbe205a0be8f6a) )
1004 	ROM_LOAD16_BYTE( "gs15.n5", 0x040001, 0x20000, CRC(f14edd3d) SHA1(802d576df6dac2c9bf99f963f1955fc3a7ffdac0) )
1005 
1006 	ROM_REGION(0x40000, "oki1", 0 ) /* Oki samples */
1007 	ROM_LOAD( "gs07.h15",  0x00000,  0x20000,  CRC(750b7e5d) SHA1(d33b17a1d8c9b05d5c1daf0c80fed6381e04b167) )
1008 
1009 	ROM_REGION(0x80000, "oki2", 0 ) /* Extra Oki samples */
1010 	ROM_LOAD( "maj-03.h16", 0x00000, 0x80000,  CRC(31dcfac3) SHA1(88c7fc139f871991defbc8dc2c9c66b150dd6f6f) )   /* banked */
1011 
1012 	ROM_REGION( 0x2000, "proms", 0 )
1013 	ROM_LOAD( "mb7128y.10m", 0x00000,  0x800,  CRC(bde780a2) SHA1(94ea9fe6c3a421e976d077e67f564ca5c37a5e88) )   /* Priority?  Unused */
1014 	ROM_LOAD( "mb7128y.16p", 0x00800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
1015 	ROM_LOAD( "mb7128y.16s", 0x01000,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused */
1016 	ROM_LOAD( "mb7128y.17s", 0x01800,  0x800,  CRC(c44d2751) SHA1(7c195650689d5cbbdccba696e0e7d3dc5bb7c506) )   /* Unknown,  Unused - Data identical for 3 proms! */
1017 
1018 	ROM_REGION( 0x1000, "plds", 0 )
1019 	ROM_LOAD( "pal16r8a 1h",  0x0000, 0x0104, NO_DUMP ) /* PAL is read protected */
1020 	ROM_LOAD( "pal16l8b.7c",  0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */
1021 	ROM_LOAD( "pal16l8b.7d",  0x0400, 0x0104, CRC(199e83fd) SHA1(ebb5d66f29935b0a58e79b0db30611b5dce328a6) ) /* PAL is read protected */
1022 	ROM_LOAD( "pal16l8b.7e",  0x0600, 0x0104, NO_DUMP ) /* PAL is read protected */
1023 	ROM_LOAD( "pal16l8b.7l",  0x0800, 0x0104, NO_DUMP ) /* PAL is read protected */
1024 	ROM_LOAD( "pal16l8b.8e",  0x0a00, 0x0104, NO_DUMP ) /* PAL is read protected */
1025 	ROM_LOAD( "pal16l8b.9d",  0x0c00, 0x0104, NO_DUMP ) /* PAL is read protected */
1026 	ROM_LOAD( "pal16l8b.10c", 0x0e00, 0x0104, NO_DUMP ) /* PAL is read protected */
1027 ROM_END
1028 
1029 /**********************************************************************************/
1030 
1031 
1032 void dassault_state::init_dassault()
1033 {
1034 	const uint8_t *src = memregion("gfx1")->base();
1035 	uint8_t *dst = memregion("gfx2")->base();
1036 	std::vector<uint8_t> tmp(0x80000);
1037 
1038 	/* Playfield 4 also has access to the char graphics, make things easier
1039 	by just copying the chars to both banks (if I just used a different gfx
1040 	bank then the colours would be wrong). */
1041 	memcpy(&tmp[0x000000], dst + 0x80000, 0x80000);
1042 	memcpy(dst + 0x090000, &tmp[0x00000], 0x80000);
1043 	memcpy(dst + 0x080000, src + 0x00000, 0x10000);
1044 	memcpy(dst + 0x110000, src + 0x10000, 0x10000);
1045 }
1046 
1047 /**********************************************************************************/
1048 
1049 GAME( 1991, thndzone,  0,        dassault, thndzone,  dassault_state, init_dassault, ROT0, "Data East Corporation", "Thunder Zone (World, Rev 1)",    MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1050 GAME( 1991, thndzonea, thndzone, dassault, thndzone,  dassault_state, init_dassault, ROT0, "Data East Corporation", "Thunder Zone (World)",           MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1051 GAME( 1991, thndzone4, thndzone, dassault, thndzone4, dassault_state, init_dassault, ROT0, "Data East Corporation", "Thunder Zone (World 4 Players)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1052 GAME( 1991, thndzonej, thndzone, dassault, thndzone,  dassault_state, init_dassault, ROT0, "Data East Corporation", "Thunder Zone (Japan)",           MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1053 GAME( 1991, dassault,  thndzone, dassault, dassault,  dassault_state, init_dassault, ROT0, "Data East Corporation", "Desert Assault (US)",            MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1054 GAME( 1991, dassault4, thndzone, dassault, dassault4, dassault_state, init_dassault, ROT0, "Data East Corporation", "Desert Assault (US 4 Players)",  MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
1055