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