1 // license:BSD-3-Clause
2 // copyright-holders:Zsolt Vasvari
3 /***************************************************************************
4 
5   Seibu Stinger/Wiz hardware
6 
7   Driver by Zsolt Vasvari
8 
9 
10 XTAL: 18.432MHz??
11 2xZ80, 3xAY8910 (stinger/scion have 2xAY8910 + discrete sound)
12 
13 These boards are similar to a Galaxian board in the way it handles scrolling
14 and sprites, but the similarities pretty much end there. The most notable
15 difference is that there are 2 independently scrollable playfields.
16 
17 
18 Wiz/Stinger/Scion/Kung-Fu Taikun memory map (preliminary)
19 
20 Main CPU:
21 
22 0000-BFFF  ROM
23 C000-C7FF  RAM
24 D000-D3FF  Video RAM (Foreground)
25 D400-D7FF  Color RAM (Foreground) (Wiz)
26 D800-D83F  Attributes RAM (Foreground)
27 D840-D85F  Sprite RAM 1
28 E000-E3FF  Video RAM (Background)
29 E400-E7FF  Color RAM (Background) (Wiz)
30 E800-E83F  Attributes RAM (Background)
31 E840-E85F  Sprite RAM 2
32 
33 I/O read:
34 d400 Protection (Wiz)
35 f000 DIP SW#1
36 f008 DIP SW#2
37 f010 Input Port 1
38 f018 Input Port 2
39 f800 Watchdog
40 
41 I/O write:
42 c800 Coin Counter A
43 c801 Coin Counter B
44 f000 Sprite bank select (Wiz)
45 f001 NMI enable
46 f002 \ Palette select
47 f003 /
48 f004 \ Character bank select
49 f005 /
50 f006 \ Flip screen
51 f007 /
52 f800 Sound Command write
53 f818 (?) Sound or Background color
54 
55 
56 Sound CPU:
57 
58 0000-1FFF  ROM
59 2000-23FF  RAM
60 
61 I/O read:
62 3000 Sound Command Read (Stinger/Scion)
63 7000 Sound Command Read (Wiz)
64 
65 I/O write:
66 3000 NMI enable (Stinger/Scion)
67 4000 AY8910 Control Port #1 (Wiz)
68 4001 AY8910 Write Port #1   (Wiz)
69 5000 AY8910 Control Port #2
70 5001 AY8910 Write Port #2
71 6000 AY8910 Control Port #3
72 6001 AY8910 Write Port #3
73 7000 NMI enable (Wiz)
74 
75 
76 ****************************************************************************
77 
78 TODO:
79 
80 - Verify sprite colors in stinger/scion
81 - Global palette is wrong in stinger/scion compared to pcb, or could it be
82   due to gamma/hue?
83 - cpu/video/interrupt frequency measurements
84 - sprite-sprite priorities are not correct yet, eg:
85   * stinger popcorn enemies at beginning of the game should have higher priority
86     than that 'vacuum cleaner' enemy sphere,
87   * the cloud in kungfut should have higher prio than player char
88 - Improve stinger/scion discrete sound, shot sound should include noise
89 - stinger/scion audiocpu jumps to lalaland after receiving a soundlatch of 0x90,
90   basically resetting itself. I assume this is a game bug
91 - scion insert-coin sound sometimes repeats or is silent due to soundlatch timing,
92   this could be a game bug as well
93 - Background noise in scion (but not scionc). Note that the sound program is
94   almost identical, except for three patches affecting noise period, noise
95   channel C enable and channel C volume. So it looks just like a bug in the
96   original (weird), or some strange form of protection.
97 - Is wiz protection emulation complete?
98 - Wiz: the supplier of the screenshot says there still may be some wrong
99   colors. Just before the break on Level 2 there is a crescent moon,
100   the background should probably be black.
101 
102 
103 ****************************************************************************
104 
105 2002-Nov-30 Kung-Fu Taikun added
106   2xZ80 , 3x AY8910
107   (DSW 1 , bit 2 )
108   "THE MICROPHONE IS OUT OF CONTROL, SO THIS GAME DEPENDS ON THE BUTTONS"
109   There's no additional hw or connectors on the pcb
110   (except for small (bit 0 - ON, bit 1 - ON)  DSW near AY chips )
111   Tomasz Slanina
112 
113 Notes:
114   The microphone is for summoning clouds. The game falls back to use
115   buttons if it's not functioning.
116 
117 
118 ****************************************************************************
119 
120 Stephh's notes (based on the games Z80 code and some tests) :
121 
122 1a) 'stinger'
123 
124   - Here are some infos about the "Debug Mode" Dip Switch :
125 
126       * when it is set to OFF, the value which was previously written
127         to 0xc500 is NOT erased, but the only value written to it is 0x00.
128       * when it is set to ON, 0x00 is ALWAYS written to 0xc500.
129         (check code at 0x0ef6)
130 
131     As you can see, there is no VISIBLE difference ...
132 
133     This is because it's in fact a leftover from 'stinger2' (the code for the
134     "TEST PLAY" still exists !)
135 
136 
137 1b) 'stinger2'
138 
139   - Here are some infos about the "Debug Mode" Dip Switch :
140 
141       * when it it set to OFF, the value which was previously written
142         to 0xc500 is NOT erased, but the only value written to it is 0x00.
143       * when it is set to ON, 0x01 is ALWAYS written to 0xc500.
144         (check code at 0x0ef6)
145 
146   - When 0xc500 = 0x01, you enter what the game calls "TEST PLAY".
147 
148   - "TEST PLAY" features :
149 
150       * automatically sets credits to 1
151       * impossible to insert a coin
152       * only one player game is available
153       * player 1 has infinite lives (always set to 5)
154 
155   - "Coin B" settings also affect the "difficulty" and the "bongo time" :
156     compare the code from 0x0e69 to 0x0e9c in the 2 sets, and you'll notice
157     that it is the SAME ! That's why I've set the default coinage to be
158     the same as the "difficulty" and "bongo time" settings in 'stinger'.
159 
160 
161 2)  'scion*'
162 
163   - Dip Switches 1-6 to 1-8 must remain OFF because of code at 0x28bf :
164     there is NO "and $03" instruction, so it goes over the "coin B" table,
165     which means that you have really weird coinage if you set them ON !
166 
167 
168 3)  'kungfut'
169 
170   - When "Microphone" Dip Switch is OFF, press BUTTON3 (bit 4 of IN1 -
171     shared by the 2 players) to make a little cloud appear so players
172     can climb it to go up.
173   - "20000 60000" setting for the "Bonus Life" Dip Switch is NEVER used
174     due to the "bit 0,a" instruction at 0x94fd !
175 
176 
177 ***************************************************************************/
178 
179 #include "emu.h"
180 #include "includes/wiz.h"
181 
182 #include "cpu/z80/z80.h"
183 #include "machine/gen_latch.h"
184 #include "machine/watchdog.h"
185 #include "sound/ay8910.h"
186 #include "screen.h"
187 #include "speaker.h"
188 
189 
190 /***************************************************************************
191 
192   Stinger/Scion discrete sound
193 
194 ***************************************************************************/
195 
196 #define STINGER_SHOT_EN1    NODE_01
197 #define STINGER_SHOT_EN2    NODE_02
198 #define STINGER_BOOM_EN1    NODE_03
199 #define STINGER_BOOM_EN2    NODE_04
200 
201 // cut-and-pasted from Asteroid
202 static const discrete_lfsr_desc stinger_lfsr =
203 {
204 	DISC_CLK_IS_FREQ,
205 	16,         /* Bit Length */
206 	0,          /* Reset Value */
207 	6,          /* Use Bit 6 as XOR input 0 */
208 	14,         /* Use Bit 14 as XOR input 1 */
209 	DISC_LFSR_XNOR,     /* Feedback stage1 is XNOR */
210 	DISC_LFSR_OR,       /* Feedback stage2 is just stage 1 output OR with external feed */
211 	DISC_LFSR_REPLACE,  /* Feedback stage3 replaces the shifted register contents */
212 	0x000001,       /* Everything is shifted into the first bit only */
213 	0,          /* Output is already inverted by XNOR */
214 	16          /* Output bit is feedback bit */
215 };
216 
217 static DISCRETE_SOUND_START(stinger_discrete)
218 
219 #define STINGER_SHOT_OUT    NODE_90
220 #define STINGER_BOOM_OUT    NODE_91
221 #define STINGER_FINAL_MIX   NODE_99
222 
223 	// triggers are interleaved to give each circuit sufficient time to reset
DISCRETE_INPUT_LOGIC(STINGER_SHOT_EN1)224 	DISCRETE_INPUT_LOGIC    (STINGER_SHOT_EN1) // even-inteval shots
225 	DISCRETE_INPUT_LOGIC    (STINGER_SHOT_EN2) // odd-inteval shots
226 	DISCRETE_INPUT_LOGIC    (STINGER_BOOM_EN1) // even-inteval explosions
227 	DISCRETE_INPUT_LOGIC    (STINGER_BOOM_EN2) // odd-inteval explosions
228 
229 	//---------------------------------------
230 	// Sample Shot Sound Circuit
231 
232 	#define SHOT_IN1    NODE_11
233 	#define SHOT_IN2    NODE_12
234 	#define SHOT_MOD    NODE_13
235 	#define SHOT_FRQ    NODE_14
236 	#define SHOT_AMP    NODE_15
237 
238 	DISCRETE_RCDISC     (SHOT_IN1, STINGER_SHOT_EN1, 1.0, 0.2, 1.0)
239 	DISCRETE_RCDISC     (SHOT_IN2, STINGER_SHOT_EN2, 1.0, 0.2, 1.0)
240 	DISCRETE_SWITCH     (SHOT_MOD, 1, STINGER_SHOT_EN1, SHOT_IN2, SHOT_IN1)
241 	DISCRETE_MULTIPLY   (SHOT_FRQ, SHOT_MOD, 2000)
242 	DISCRETE_MULTIPLY   (SHOT_AMP, SHOT_MOD,  800)
243 	DISCRETE_SQUAREWAVE (STINGER_SHOT_OUT, 1, SHOT_FRQ, SHOT_AMP, 50, 0, 0)
244 
245 	//---------------------------------------
246 	// Sample Explosion Sound Circuit
247 
248 	#define BOOM_IN1    NODE_21
249 	#define BOOM_IN2    NODE_22
250 	#define BOOM_MOD    NODE_23
251 	#define BOOM_AMP    NODE_24
252 
253 	DISCRETE_RCDISC     (BOOM_IN1, STINGER_BOOM_EN1, 1.0, 0.25, 1.0)
254 	DISCRETE_RCDISC     (BOOM_IN2, STINGER_BOOM_EN2, 1.0, 0.25, 1.0)
255 	DISCRETE_SWITCH     (BOOM_MOD, 1, STINGER_BOOM_EN1, BOOM_IN2, BOOM_IN1)
256 	DISCRETE_MULTIPLY   (BOOM_AMP, BOOM_MOD, 1500)
257 	DISCRETE_LFSR_NOISE (STINGER_BOOM_OUT, 1, 1, 1800, BOOM_AMP, 0, 0, &stinger_lfsr)
258 
259 	//---------------------------------------
260 
261 	DISCRETE_ADDER2 (STINGER_FINAL_MIX, 1, STINGER_SHOT_OUT, STINGER_BOOM_OUT)
262 
263 	DISCRETE_OUTPUT (STINGER_FINAL_MIX, 5)
264 
265 DISCRETE_SOUND_END
266 
267 void wiz_state::stinger_explosion_w(uint8_t data)
268 {
269 	// explosion sound trigger(analog?)
270 	m_discrete->write(STINGER_BOOM_EN1, m_dsc1);
271 	m_discrete->write(STINGER_BOOM_EN2, m_dsc1^=1);
272 }
273 
stinger_shot_w(uint8_t data)274 void wiz_state::stinger_shot_w(uint8_t data)
275 {
276 	// player shot sound trigger(analog?)
277 	m_discrete->write(STINGER_SHOT_EN1, m_dsc0);
278 	m_discrete->write(STINGER_SHOT_EN2, m_dsc0^=1);
279 }
280 
281 
282 
283 /***************************************************************************
284 
285   I/O, Memory maps
286 
287 ***************************************************************************/
288 
wiz_protection_r()289 uint8_t wiz_state::wiz_protection_r()
290 {
291 	switch (m_colorram2[0])
292 	{
293 		case 0x35: return 0x25; /* FIX: sudden player death + free play afterwards   */
294 		case 0x8f: return 0x1f; /* FIX: early boss appearance with corrupt graphics  */
295 		case 0xa0: return 0x00; /* FIX: executing junk code after defeating the boss */
296 	}
297 
298 	return m_colorram2[0];
299 }
300 
wiz_coin_counter_w(offs_t offset,uint8_t data)301 void wiz_state::wiz_coin_counter_w(offs_t offset, uint8_t data)
302 {
303 	machine().bookkeeping().coin_counter_w(offset, data & 1);
304 }
305 
wiz_main_nmi_mask_w(uint8_t data)306 void wiz_state::wiz_main_nmi_mask_w(uint8_t data)
307 {
308 	m_main_nmi_mask = data & 1;
309 }
310 
311 
kungfut_main_map(address_map & map)312 void wiz_state::kungfut_main_map(address_map &map)
313 {
314 	map(0x0000, 0xbfff).rom();
315 	map(0xc000, 0xc7ff).ram();
316 	map(0xd000, 0xd3ff).ram().share("videoram2");
317 	map(0xd400, 0xd7ff).ram().share("colorram2");
318 	map(0xd800, 0xd83f).ram().share("attrram2");
319 	map(0xd840, 0xd85f).ram().share("spriteram2");
320 	map(0xe000, 0xe3ff).ram().share("videoram");
321 	map(0xe400, 0xe7ff).ram().share("colorram");
322 	map(0xe800, 0xe83f).ram().share("attrram");
323 	map(0xe840, 0xe85f).ram().share("spriteram");
324 	map(0xf000, 0xf000).portr("DSW0");
325 	map(0xf001, 0xf001).w(FUNC(wiz_state::wiz_main_nmi_mask_w));
326 	map(0xf002, 0xf003).w(FUNC(wiz_state::wiz_palette_bank_w));
327 	map(0xf004, 0xf005).w(FUNC(wiz_state::wiz_char_bank_w));
328 	map(0xf006, 0xf006).w(FUNC(wiz_state::wiz_flipx_w));
329 	map(0xf007, 0xf007).w(FUNC(wiz_state::wiz_flipy_w));
330 	map(0xf008, 0xf008).portr("DSW1");
331 	map(0xf010, 0xf010).portr("IN0");
332 	map(0xf018, 0xf018).portr("IN1");
333 	map(0xf800, 0xf800).w("soundlatch", FUNC(generic_latch_8_device::write));
334 	map(0xf818, 0xf818).w(FUNC(wiz_state::wiz_bgcolor_w));
335 }
336 
decrypted_opcodes_map(address_map & map)337 void wiz_state::decrypted_opcodes_map(address_map &map)
338 {
339 	map(0x0000, 0xbfff).rom().share("decrypted_opcodes");
340 }
341 
wiz_main_map(address_map & map)342 void wiz_state::wiz_main_map(address_map &map)
343 {
344 	kungfut_main_map(map);
345 	map(0xc800, 0xc801).w(FUNC(wiz_state::wiz_coin_counter_w));
346 	map(0xd400, 0xd400).r(FUNC(wiz_state::wiz_protection_r));
347 	map(0xf000, 0xf000).w(FUNC(wiz_state::wiz_sprite_bank_w));
348 }
349 
stinger_main_map(address_map & map)350 void wiz_state::stinger_main_map(address_map &map)
351 {
352 	kungfut_main_map(map);
353 //  map(0xf008, 0xf00f).nopw(); // ?
354 	map(0xf800, 0xf800).r("watchdog", FUNC(watchdog_timer_device::reset_r));
355 	map(0xf808, 0xf808).w(FUNC(wiz_state::stinger_explosion_w));
356 	map(0xf80a, 0xf80a).w(FUNC(wiz_state::stinger_shot_w));
357 }
358 
359 
360 /**************************************************************************/
361 
wiz_sound_nmi_mask_w(uint8_t data)362 void wiz_state::wiz_sound_nmi_mask_w(uint8_t data)
363 {
364 	m_sound_nmi_mask = data & 1;
365 }
366 
367 
kungfut_sound_map(address_map & map)368 void wiz_state::kungfut_sound_map(address_map &map)
369 {
370 	map.global_mask(0x7fff);
371 	map(0x0000, 0x1fff).rom();
372 	map(0x2000, 0x23ff).ram();
373 	map(0x4000, 0x4001).w("8910.3", FUNC(ay8910_device::address_data_w));
374 	map(0x5000, 0x5001).w("8910.1", FUNC(ay8910_device::address_data_w));
375 	map(0x6000, 0x6001).w("8910.2", FUNC(ay8910_device::address_data_w));
376 	map(0x7000, 0x7000).r("soundlatch", FUNC(generic_latch_8_device::read)).w(FUNC(wiz_state::wiz_sound_nmi_mask_w));
377 }
378 
stinger_sound_map(address_map & map)379 void wiz_state::stinger_sound_map(address_map &map)
380 {
381 	map.global_mask(0x7fff);
382 	map(0x0000, 0x1fff).rom();
383 	map(0x2000, 0x23ff).ram();
384 	map(0x3000, 0x3000).r("soundlatch", FUNC(generic_latch_8_device::read)).w(FUNC(wiz_state::wiz_sound_nmi_mask_w));
385 	map(0x4000, 0x4000).nopw(); // ?
386 	map(0x5000, 0x5001).w("8910.1", FUNC(ay8910_device::address_data_w));
387 	map(0x6000, 0x6001).w("8910.2", FUNC(ay8910_device::address_data_w));
388 	map(0x5000, 0x7fff).nopr(); // prevent error.log spam, cpu jumps here by accident
389 }
390 
391 
392 
393 /***************************************************************************
394 
395   Inputs
396 
397 ***************************************************************************/
398 
399 static INPUT_PORTS_START( stinger )
400 	PORT_START("IN0")
401 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
402 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL
403 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
404 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
405 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 )
406 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
407 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 )
408 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
409 
410 	PORT_START("IN1")
411 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
412 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
413 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )  PORT_COCKTAIL
414 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
415 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
416 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
417 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )    PORT_COCKTAIL
418 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )  PORT_COCKTAIL
419 
420 	PORT_START("DSW0")
421 	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
422 	PORT_DIPSETTING(    0x01, DEF_STR( 4C_1C ) )
423 	PORT_DIPSETTING(    0x02, DEF_STR( 3C_1C ) )
424 	PORT_DIPSETTING(    0x04, DEF_STR( 2C_1C ) )
425 	PORT_DIPSETTING(    0x00, DEF_STR( 3C_2C ) )
426 	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
427 	PORT_DIPSETTING(    0x03, DEF_STR( 2C_3C ) )
428 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
429 	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
430 	PORT_DIPNAME( 0x18, 0x08, DEF_STR( Lives ) )
431 	PORT_DIPSETTING(    0x00, "2" )
432 	PORT_DIPSETTING(    0x08, "3" )
433 	PORT_DIPSETTING(    0x10, "4" )
434 	PORT_DIPSETTING(    0x18, "5" )
435 	PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Bonus_Life ) )
436 	PORT_DIPSETTING(    0xe0, "20000 50000" )
437 	PORT_DIPSETTING(    0xc0, "20000 60000" )
438 	PORT_DIPSETTING(    0xa0, "20000 70000" )
439 	PORT_DIPSETTING(    0x80, "20000 80000" )
440 	PORT_DIPSETTING(    0x60, "20000 90000" )
441 	PORT_DIPSETTING(    0x40, "30000 80000" )
442 	PORT_DIPSETTING(    0x20, "30000 90000" )
443 	PORT_DIPSETTING(    0x00, DEF_STR( None ) )
444 
445 	PORT_START("DSW1")
446 	PORT_DIPNAME( 0x01, 0x00, "Debug Mode" )        /* See notes */
447 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
448 	PORT_DIPSETTING(    0x01, DEF_STR( On ) )
449 	PORT_DIPNAME( 0x0e, 0x0e, DEF_STR( Coin_B ) )
450 	PORT_DIPSETTING(    0x00, DEF_STR( 5C_1C ) )
451 	PORT_DIPSETTING(    0x08, DEF_STR( 4C_1C ) )
452 	PORT_DIPSETTING(    0x0c, DEF_STR( 3C_1C ) )
453 	PORT_DIPSETTING(    0x0a, DEF_STR( 2C_1C ) )
454 	PORT_DIPSETTING(    0x04, DEF_STR( 3C_2C ) )
455 	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_1C ) )
456 	PORT_DIPSETTING(    0x02, DEF_STR( 2C_3C ) )
457 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
458 	PORT_DIPNAME( 0x30, 0x20, "Bongo Time" )
459 	PORT_DIPSETTING(    0x30, "Long" )
460 	PORT_DIPSETTING(    0x20, DEF_STR( Medium ) )
461 	PORT_DIPSETTING(    0x10, "Short" )
462 	PORT_DIPSETTING(    0x00, "Shortest" )
463 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Difficulty ) )
464 	PORT_DIPSETTING(    0x00, DEF_STR( Normal ) )
465 	PORT_DIPSETTING(    0x40, DEF_STR( Hard ) )
466 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) )
467 	PORT_DIPSETTING(    0x80, DEF_STR( Upright ) )
468 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
469 INPUT_PORTS_END
470 
471 static INPUT_PORTS_START( stinger2 )
472 	PORT_INCLUDE( stinger )
473 
474 	PORT_MODIFY("DSW1")
475 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) )
476 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
477 	PORT_DIPSETTING(    0x02, DEF_STR( On ) )
478 	PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unused ) )
479 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
480 	PORT_DIPSETTING(    0x04, DEF_STR( On ) )
481 	PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) )
482 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
483 	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
484 	PORT_DIPNAME( 0x70, 0x20, DEF_STR( Coin_B ) )   /* See notes */
485 	PORT_DIPSETTING(    0x70, DEF_STR( 1C_1C ) )
486 	PORT_DIPSETTING(    0x60, DEF_STR( 1C_2C ) )
487 	PORT_DIPSETTING(    0x50, DEF_STR( 1C_3C ) )
488 	PORT_DIPSETTING(    0x40, DEF_STR( 1C_4C ) )
489 	PORT_DIPSETTING(    0x30, DEF_STR( 1C_5C ) )
490 	PORT_DIPSETTING(    0x20, DEF_STR( 1C_6C ) )
491 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_7C ) )
492 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_8C ) )
493 INPUT_PORTS_END
494 
495 static INPUT_PORTS_START( scion )
496 	PORT_INCLUDE( stinger )
497 
498 	PORT_MODIFY("IN1")
499 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
500 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )  PORT_COCKTAIL
501 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )  PORT_COCKTAIL
502 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )    PORT_COCKTAIL
503 
504 	PORT_MODIFY("DSW0")
505 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) )
506 	PORT_DIPSETTING(    0x01, DEF_STR( Upright ) )
507 	PORT_DIPSETTING(    0x00, DEF_STR( Cocktail ) )
508 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Difficulty ) )
509 	PORT_DIPSETTING(    0x00, DEF_STR( Easy ) )
510 	PORT_DIPSETTING(    0x02, DEF_STR( Hard ) )
511 	PORT_DIPNAME( 0x0c, 0x04, DEF_STR( Lives ) )
512 	PORT_DIPSETTING(    0x00, "2" )
513 	PORT_DIPSETTING(    0x04, "3" )
514 	PORT_DIPSETTING(    0x08, "4" )
515 	PORT_DIPSETTING(    0x0c, "5" )
516 	PORT_DIPNAME( 0x30, 0x00, DEF_STR( Bonus_Life ) )
517 	PORT_DIPSETTING(    0x00, "20000 40000" )
518 	PORT_DIPSETTING(    0x20, "20000 60000" )
519 	PORT_DIPSETTING(    0x10, "20000 80000" )
520 	PORT_DIPSETTING(    0x30, "30000 90000" )
521 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
522 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
523 	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
524 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
525 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
526 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
527 
528 	PORT_MODIFY("DSW1")
529 	PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coin_A ) )
530 	PORT_DIPSETTING(    0x07, DEF_STR( 5C_1C ) )
531 	PORT_DIPSETTING(    0x03, DEF_STR( 4C_1C ) )
532 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
533 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
534 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
535 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
536 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_3C ) )
537 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_5C ) )
538 	PORT_DIPNAME( 0x18, 0x00, DEF_STR( Coin_B ) )
539 	PORT_DIPSETTING(    0x18, DEF_STR( 3C_1C ) )
540 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
541 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
542 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
543 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) )
544 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
545 //  PORT_DIPSETTING(    0x20, DEF_STR( On ) )       /* See notes */
546 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
547 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
548 //  PORT_DIPSETTING(    0x40, DEF_STR( On ) )       /* See notes */
549 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
550 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
551 //  PORT_DIPSETTING(    0x80, DEF_STR( On ) )       /* See notes */
552 INPUT_PORTS_END
553 
554 static INPUT_PORTS_START( kungfut )
555 	PORT_START("IN0")
556 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
557 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
558 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )
559 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
560 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 )
561 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
562 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 )
563 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
564 
565 	PORT_START("IN1")
566 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
567 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )  PORT_2WAY
568 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
569 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN )
570 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME ("Microphone Input") // call up cloud
571 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
572 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
573 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
574 
575 	PORT_START("DSW0")
576 	PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coin_A ) )
577 	PORT_DIPSETTING(    0x07, DEF_STR( 5C_1C ) )
578 	PORT_DIPSETTING(    0x03, DEF_STR( 4C_1C ) )
579 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
580 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
581 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
582 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
583 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_3C ) )
584 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_5C ) )
585 	PORT_DIPNAME( 0x18, 0x00, DEF_STR( Coin_B ) )
586 	PORT_DIPSETTING(    0x18, DEF_STR( 3C_1C ) )
587 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
588 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
589 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
590 	PORT_DIPNAME( 0x20, 0x20, "2 Players Game" )
591 	PORT_DIPSETTING(    0x00, "1 Credit" )
592 	PORT_DIPSETTING(    0x20, "2 Credits" )
593 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
594 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
595 	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
596 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
597 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
598 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
599 
600 	PORT_START("DSW1")
601 	PORT_DIPNAME( 0x01, 0x00, DEF_STR( Difficulty ) )
602 	PORT_DIPSETTING(    0x00, DEF_STR( Easy ) )
603 	PORT_DIPSETTING(    0x01, DEF_STR( Hard ) )
604 	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) )
605 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
606 	PORT_DIPSETTING(    0x02, DEF_STR( On ) )
607 	PORT_DIPNAME( 0x04, 0x04, "Microphone" )        /* See notes */
608 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
609 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
610 	PORT_DIPNAME( 0x18, 0x08, DEF_STR( Lives ) )
611 	PORT_DIPSETTING(    0x00, "2" )
612 	PORT_DIPSETTING(    0x08, "3" )
613 	PORT_DIPSETTING(    0x10, "4" )
614 	PORT_DIPSETTING(    0x18, "5" )
615 	PORT_DIPNAME( 0x60, 0x00, DEF_STR( Bonus_Life ) )
616 	PORT_DIPSETTING(    0x00, "20000 40000" )
617 //  PORT_DIPSETTING(    0x20, "20000 40000" )       // duplicated setting
618 	PORT_DIPSETTING(    0x10, "20000 80000" )
619 	PORT_DIPSETTING(    0x30, "30000 90000" )
620 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) )
621 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
622 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
623 INPUT_PORTS_END
624 
625 static INPUT_PORTS_START( wiz )
626 	PORT_START("IN0")
627 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 )
628 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL     // Shoot
629 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )                   // Shoot
630 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 )
631 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 )
632 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
633 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 )                   // Magic
634 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL     // Magic
635 
636 	PORT_START("IN1")
637 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
638 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
639 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )
640 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )
641 	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
642 	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )  PORT_COCKTAIL
643 	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP )    PORT_COCKTAIL
644 	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN )  PORT_COCKTAIL
645 
646 	PORT_START("DSW0")
647 	PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coin_A ) )
648 	PORT_DIPSETTING(    0x07, DEF_STR( 5C_1C ) )
649 	PORT_DIPSETTING(    0x03, DEF_STR( 4C_1C ) )
650 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
651 	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
652 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
653 	PORT_DIPSETTING(    0x04, DEF_STR( 1C_2C ) )
654 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_3C ) )
655 	PORT_DIPSETTING(    0x06, DEF_STR( 1C_5C ) )
656 	PORT_DIPNAME( 0x18, 0x00, DEF_STR( Coin_B ) )
657 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
658 	PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
659 	PORT_DIPSETTING(    0x18, DEF_STR( 2C_3C ) )
660 	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
661 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) )
662 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
663 	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
664 	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) )
665 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
666 	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
667 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Free_Play ) )
668 	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
669 	PORT_DIPSETTING(    0x80, DEF_STR( On ) )
670 
671 	PORT_START("DSW1")
672 	PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) )
673 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
674 	PORT_DIPSETTING(    0x01, DEF_STR( Cocktail ) )
675 	PORT_DIPNAME( 0x06, 0x00, DEF_STR( Difficulty ) )
676 	PORT_DIPSETTING(    0x00, DEF_STR( Easy ) )
677 	PORT_DIPSETTING(    0x02, DEF_STR( Normal ) )
678 	PORT_DIPSETTING(    0x04, DEF_STR( Hard ) )
679 	PORT_DIPSETTING(    0x06, DEF_STR( Hardest ) )
680 	PORT_DIPNAME( 0x18, 0x10, DEF_STR( Lives ) )
681 	PORT_DIPSETTING(    0x08, "1" )
682 	PORT_DIPSETTING(    0x10, "3" )
683 	PORT_DIPSETTING(    0x18, "5" )
684 	PORT_DIPSETTING(    0x00, "255 (Cheat)")
685 	PORT_DIPNAME( 0x60, 0x00, DEF_STR( Bonus_Life ) )
686 	PORT_DIPSETTING(    0x00, "10000 30000" )
687 	PORT_DIPSETTING(    0x20, "20000 40000" )
688 	PORT_DIPSETTING(    0x40, "30000 60000" )
689 	PORT_DIPSETTING(    0x60, "40000 80000" )
690 	PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
691 INPUT_PORTS_END
692 
693 
694 
695 /***************************************************************************
696 
697   Machine configs, misc. interface
698 
699 ***************************************************************************/
700 
701 static const gfx_layout charlayout =
702 {
703 	8,8,    /* 8*8 characters */
704 	256,    /* 256 characters */
705 	3,      /* 3 bits per pixel */
706 	{ 0x4000*8, 0x2000*8, 0 },  /* the three bitplanes are separated */
707 	{ 0, 1, 2, 3, 4, 5, 6, 7 },
708 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
709 	8*8 /* every char takes 8 consecutive bytes */
710 };
711 
712 static const gfx_layout spritelayout =
713 {
714 	16,16,  /* 16*16 sprites */
715 	256,    /* 256 sprites */
716 	3,      /* 3 bits per pixel */
717 	{ 0x4000*8, 0x2000*8, 0 },  /* the three bitplanes are separated */
718 	{ 0, 1, 2, 3, 4, 5, 6, 7,
719 		8*8+0, 8*8+1, 8*8+2, 8*8+3, 8*8+4, 8*8+5, 8*8+6, 8*8+7 },
720 	{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
721 		16*8, 17*8, 18*8, 19*8, 20*8, 21*8, 22*8, 23*8 },
722 	32*8    /* every sprite takes 32 consecutive bytes */
723 };
724 
725 
726 static GFXDECODE_START( gfx_wiz )
727 	GFXDECODE_ENTRY( "gfx1", 0x0000, charlayout,   0, 32 )
728 	GFXDECODE_ENTRY( "gfx1", 0x0800, charlayout,   0, 32 )
729 	GFXDECODE_ENTRY( "gfx2", 0x6000, charlayout,   0, 32 )
730 	GFXDECODE_ENTRY( "gfx2", 0x0000, charlayout,   0, 32 )
731 	GFXDECODE_ENTRY( "gfx2", 0x0800, charlayout,   0, 32 )
732 	GFXDECODE_ENTRY( "gfx2", 0x6800, charlayout,   0, 32 )
733 	GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 32 )
734 	GFXDECODE_ENTRY( "gfx2", 0x0000, spritelayout, 0, 32 )
735 	GFXDECODE_ENTRY( "gfx2", 0x6000, spritelayout, 0, 32 )
736 GFXDECODE_END
737 
GFXDECODE_START(gfx_stinger)738 static GFXDECODE_START( gfx_stinger )
739 	GFXDECODE_ENTRY( "gfx1", 0x0000, charlayout,   0, 32 )
740 	GFXDECODE_ENTRY( "gfx1", 0x0800, charlayout,   0, 32 )
741 	GFXDECODE_ENTRY( "gfx2", 0x0000, charlayout,   0, 32 )
742 	GFXDECODE_ENTRY( "gfx2", 0x0800, charlayout,   0, 32 )
743 	GFXDECODE_ENTRY( "gfx1", 0x0000, spritelayout, 0, 32 )
744 	GFXDECODE_ENTRY( "gfx2", 0x0000, spritelayout, 0, 32 )
745 GFXDECODE_END
746 
747 /**************************************************************************/
748 
749 void wiz_state::machine_reset()
750 {
751 	m_main_nmi_mask = 0;
752 	m_sound_nmi_mask = 0;
753 	m_dsc0 = m_dsc1 = 1;
754 
755 	m_sprite_bank = 0;
756 	m_charbank[0] = m_charbank[1] = 0;
757 	m_palbank[0] = m_palbank[1] = 0;
758 	m_flipx = 0;
759 	m_flipy = 0;
760 	m_bgcolor = 0;
761 }
762 
machine_start()763 void wiz_state::machine_start()
764 {
765 	// register for savestates
766 	save_item(NAME(m_main_nmi_mask));
767 	save_item(NAME(m_sound_nmi_mask));
768 	save_item(NAME(m_dsc0));
769 	save_item(NAME(m_dsc1));
770 
771 	save_item(NAME(m_sprite_bank));
772 	save_item(NAME(m_charbank));
773 	save_item(NAME(m_palbank));
774 	save_item(NAME(m_flipx));
775 	save_item(NAME(m_flipy));
776 	save_item(NAME(m_bgcolor));
777 }
778 
779 /**************************************************************************/
780 
INTERRUPT_GEN_MEMBER(wiz_state::wiz_vblank_interrupt)781 INTERRUPT_GEN_MEMBER(wiz_state::wiz_vblank_interrupt)
782 {
783 	if (m_main_nmi_mask & 1)
784 		device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
785 }
786 
INTERRUPT_GEN_MEMBER(wiz_state::wiz_sound_interrupt)787 INTERRUPT_GEN_MEMBER(wiz_state::wiz_sound_interrupt)
788 {
789 	if (m_sound_nmi_mask & 1)
790 		device.execute().pulse_input_line(INPUT_LINE_NMI, attotime::zero);
791 }
792 
kungfut(machine_config & config)793 void wiz_state::kungfut(machine_config &config)
794 {
795 	/* basic machine hardware */
796 	Z80(config, m_maincpu, 18432000/6); /* 3.072 MHz ??? */
797 	m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::kungfut_main_map);
798 	m_maincpu->set_vblank_int("screen", FUNC(wiz_state::wiz_vblank_interrupt));
799 
800 	Z80(config, m_audiocpu, 18432000/6); /* 3.072 MHz ??? */
801 	m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::kungfut_sound_map);
802 	m_audiocpu->set_periodic_int(FUNC(wiz_state::wiz_sound_interrupt), attotime::from_hz(4*60)); /* ??? */
803 
804 	/* video hardware */
805 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
806 	screen.set_refresh_hz(60);
807 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */ );
808 	screen.set_size(32*8, 32*8);
809 	screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1);
810 	screen.set_screen_update(FUNC(wiz_state::screen_update_kungfut));
811 	screen.set_palette(m_palette);
812 
813 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_stinger);
814 	PALETTE(config, m_palette, FUNC(wiz_state::wiz_palette), 256);
815 
816 	/* sound hardware */
817 	SPEAKER(config, "mono").front_center();
818 
819 	GENERIC_LATCH_8(config, "soundlatch");
820 
821 	AY8910(config, "8910.1", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10);
822 
823 	AY8910(config, "8910.2", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10);
824 
825 	AY8910(config, "8910.3", 18432000/12).add_route(ALL_OUTPUTS, "mono", 0.10);
826 }
827 
wiz(machine_config & config)828 void wiz_state::wiz(machine_config &config)
829 {
830 	kungfut(config);
831 
832 	/* basic machine hardware */
833 	m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::wiz_main_map);
834 
835 	/* video hardware */
836 	m_gfxdecode->set_info(gfx_wiz);
837 	subdevice<screen_device>("screen")->set_screen_update(FUNC(wiz_state::screen_update_wiz));
838 }
839 
840 
stinger(machine_config & config)841 void wiz_state::stinger(machine_config &config)
842 {
843 	kungfut(config);
844 
845 	/* basic machine hardware */
846 	m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_main_map);
847 	m_maincpu->set_addrmap(AS_OPCODES, &wiz_state::decrypted_opcodes_map);
848 
849 	/* basic machine hardware */
850 	m_audiocpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_sound_map);
851 
852 	WATCHDOG_TIMER(config, "watchdog");
853 
854 	/* video hardware */
855 	subdevice<screen_device>("screen")->set_screen_update(FUNC(wiz_state::screen_update_stinger));
856 
857 	/* sound hardware */
858 	config.device_remove("8910.3");
859 
860 	DISCRETE(config, m_discrete, stinger_discrete).add_route(ALL_OUTPUTS, "mono", 0.5);
861 }
862 
scion(machine_config & config)863 void wiz_state::scion(machine_config &config)
864 {
865 	stinger(config);
866 
867 	Z80(config.replace(), m_maincpu, 18432000/6); /* 3.072 MHz ??? */
868 	m_maincpu->set_addrmap(AS_PROGRAM, &wiz_state::stinger_main_map);
869 	m_maincpu->set_vblank_int("screen", FUNC(wiz_state::wiz_vblank_interrupt));
870 
871 	/* video hardware */
872 	subdevice<screen_device>("screen")->set_visarea(2*8, 32*8-1, 2*8, 30*8-1);
873 }
874 
875 
876 
877 /***************************************************************************
878 
879   Game driver(s)
880 
881 ***************************************************************************/
882 
883 ROM_START( kungfut )
884 	ROM_REGION( 0xc000, "maincpu", 0 )
CRC(b1e56960)885 	ROM_LOAD( "p1.bin",  0x0000, 0x4000, CRC(b1e56960) SHA1(993388bbb663412110d1012be9ffc00b06fce4d0) )
886 	ROM_LOAD( "p3.bin",  0x4000, 0x4000, CRC(6fc346f8) SHA1(bd1663fa780e41eafd668bf502b40c9750270e55) )
887 	ROM_LOAD( "p2.bin",  0x8000, 0x4000, CRC(042cc9c5) SHA1(09f87e240c2aaa19fe7b8cb548ded828ab67b18b) )
888 
889 	ROM_REGION( 0x2000, "audiocpu", 0 )
890 	ROM_LOAD( "1.bin",  0x0000, 0x2000, CRC(68028a5d) SHA1(2fabf5e55e09a34cd090d123737d31970e4086e8) )
891 
892 	ROM_REGION( 0x6000,  "gfx1", 0 )
893 	ROM_LOAD( "2.bin",  0x0000, 0x2000, CRC(5c3ef697) SHA1(5218d361e6020aefb1925a8034a5ed6eb7bb1001) )
894 	ROM_LOAD( "3.bin",  0x2000, 0x2000, CRC(905e81fa) SHA1(8d3328b2dc7e99ab1e43420a517f04ec4d463b05) )
895 	ROM_LOAD( "4.bin",  0x4000, 0x2000, CRC(965bb5d1) SHA1(ea837118d98378303cf9173005cfd50823b1596a) )
896 
897 	ROM_REGION( 0x6000,  "gfx2", 0 )
898 	ROM_LOAD( "5.bin",  0x0000, 0x2000, CRC(763bb61a) SHA1(9bea4a929db5d2e8c925a847591b9e5b2ad5aaaa) )
899 	ROM_LOAD( "6.bin",  0x2000, 0x2000, CRC(c9649fce) SHA1(f65e75355d2f7b0899ea3769146a55b187da37d3) )
900 	ROM_LOAD( "7.bin",  0x4000, 0x2000, CRC(32f02c13) SHA1(85781f03cca622ce8ee66924a1e72758ce42bdfe) )
901 
902 	ROM_REGION( 0x0300,  "proms", 0 )
903 	ROM_LOAD( "82s129.0", 0x0000, 0x0100, CRC(eb823177) SHA1(a28233dbf87744a9896fe675b76603557e7f596b) )
904 	ROM_LOAD( "82s129.1", 0x0100, 0x0100, CRC(6eec5dd9) SHA1(e846209c167b2a7d790faacea082a7edc1338e47) )
905 	ROM_LOAD( "82s129.2", 0x0200, 0x0100, CRC(c31eb3e6) SHA1(94fb8c6d83432c5f456510d628971147d373faf5) )
906 ROM_END
907 
908 ROM_START( kungfuta )
909 	ROM_REGION( 0xc000, "maincpu", 0 )
910 	ROM_LOAD( "kungfu.01",  0x0000, 0x4000, CRC(48dada70) SHA1(a90901d2aef73d4fa9d9c80769b82a3fead0a0f9) )
911 	ROM_LOAD( "kungfu.02",  0x4000, 0x4000, CRC(c08c5152) SHA1(c5db3ee1ee165708d93d296b51a5bb43265ac75f) )
912 	ROM_LOAD( "kungfu.03",  0x8000, 0x4000, CRC(09b8670c) SHA1(170e7cbf87727d940e959fa7a0328b4cc1aba195) )
913 
914 	ROM_REGION( 0x2000, "audiocpu", 0 )
915 	ROM_LOAD( "kungfu.04",  0x0000, 0x2000,  CRC(352bff48) SHA1(87d2408d31e1326ec810debcb2c724d1f003ae7b) )
916 
917 	ROM_REGION( 0x6000,  "gfx1", 0 )
918 	ROM_LOAD( "kungfu.08",  0x0000, 0x2000, CRC(60b91d2f) SHA1(4a3337bb8f475a40b9b7f31d4b42e73179177763) )
919 	ROM_LOAD( "kungfu.09",  0x2000, 0x2000, CRC(121ba029) SHA1(4e4375cb9e93af45dd16e2a295fa88753201e6e8) )
920 	ROM_LOAD( "kungfu.10",  0x4000, 0x2000, CRC(146df9de) SHA1(8dcc33bc281f1e5b069b52645123de62037261e6) )
921 
922 	ROM_REGION( 0x6000,  "gfx2", 0 )
923 	ROM_LOAD( "kungfu.07",  0x0000, 0x2000, CRC(1df48de5) SHA1(e620ea55a1ed2dc934878d077d5cd6437e833a6d) )
924 	ROM_LOAD( "kungfu.06",  0x2000, 0x2000, CRC(1921d49b) SHA1(fcc5500c8c1605e571b203828d6a7de36ad76fab) )
925 	ROM_LOAD( "kungfu.05",  0x4000, 0x2000, CRC(ff9aced4) SHA1(b13f8ea4131b54bdd2888841f52f1482b02b6624) )
926 
927 	ROM_REGION( 0x0300,  "proms", 0 )
928 	ROM_LOAD( "82s129.0", 0x0000, 0x0100, CRC(eb823177) SHA1(a28233dbf87744a9896fe675b76603557e7f596b) ) // ic.23
929 	ROM_LOAD( "82s129.1", 0x0100, 0x0100, CRC(6eec5dd9) SHA1(e846209c167b2a7d790faacea082a7edc1338e47) ) // ic.24
930 	ROM_LOAD( "82s129.2", 0x0200, 0x0100, CRC(c31eb3e6) SHA1(94fb8c6d83432c5f456510d628971147d373faf5) ) // ic.25
931 ROM_END
932 
933 ROM_START( wiz )
934 	ROM_REGION( 0xc000, "maincpu", 0 )
935 	ROM_LOAD( "ic07_01.bin",  0x0000, 0x4000, CRC(c05f2c78) SHA1(98b93234684a3a228552ef41a08512fef1befedd) )
936 	ROM_LOAD( "ic05_03.bin",  0x4000, 0x4000, CRC(7978d879) SHA1(866efdff3c111793d5a3cc2fa0b03a2b4e371c49) )
937 	ROM_LOAD( "ic06_02.bin",  0x8000, 0x4000, CRC(9c406ad2) SHA1(cd82c3dc622886b6ebb30ba565f3c34d5a4e229b) )
938 
939 	ROM_REGION( 0x2000, "audiocpu", 0 )
940 	ROM_LOAD( "ic57_10.bin",  0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) )
941 
942 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
943 	ROM_LOAD( "ic12_04.bin",  0x0000, 0x2000, CRC(8969acdd) SHA1(f37c4697232b4fb4171d6290c9407f740e7d1448) )
944 	ROM_LOAD( "ic13_05.bin",  0x2000, 0x2000, CRC(2868e6a5) SHA1(1b8ac71a6b901df845bab945bfcf11df47932990) )
945 	ROM_LOAD( "ic14_06.bin",  0x4000, 0x2000, CRC(b398e142) SHA1(1cafaf5cbfa96b410ae236a298473ff51122d9fc) )
946 
947 	ROM_REGION( 0xc000,  "gfx2", 0 )    /* sprites/chars */
948 	ROM_LOAD( "ic03_07.bin",  0x0000, 0x2000, CRC(297c02fc) SHA1(8eee765a660e3ff1b6cdcdac0d068177098cc339) )
949 	ROM_CONTINUE(             0x6000, 0x2000  )
950 	ROM_LOAD( "ic02_08.bin",  0x2000, 0x2000, CRC(ede77d37) SHA1(01fe35fc3373b7513ea90e8262d66200629b89fe) )
951 	ROM_CONTINUE(             0x8000, 0x2000  )
952 	ROM_LOAD( "ic01_09.bin",  0x4000, 0x2000, CRC(4d86b041) SHA1(fe7f8c89ef16020f45a97ed875ddd7396a32665d) )
953 	ROM_CONTINUE(             0xa000, 0x2000  )
954 
955 	ROM_REGION( 0x0300, "proms", 0 )
956 	ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) )    /* palette red component */
957 	ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) )    /* palette green component */
958 	ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) )    /* palette blue component */
959 ROM_END
960 
961 ROM_START( wizt )
962 	ROM_REGION( 0xc000, "maincpu", 0 )
963 	ROM_LOAD( "wiz1.bin",     0x0000, 0x4000, CRC(5a6d3c60) SHA1(faeb7e7ddeee9638ec046655e87f866d81fdbee0) )
964 	ROM_LOAD( "ic05_03.bin",  0x4000, 0x4000, CRC(7978d879) SHA1(866efdff3c111793d5a3cc2fa0b03a2b4e371c49) )
965 	ROM_LOAD( "ic06_02.bin",  0x8000, 0x4000, CRC(9c406ad2) SHA1(cd82c3dc622886b6ebb30ba565f3c34d5a4e229b) )
966 
967 	ROM_REGION( 0x2000, "audiocpu", 0 )
968 	ROM_LOAD( "ic57_10.bin",  0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) )
969 
970 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
971 	ROM_LOAD( "wiz4.bin",     0x0000, 0x2000, CRC(e6c636b3) SHA1(0d5b98d404d2d87f375cde5d5a90c7d6318ea197) )
972 	ROM_LOAD( "wiz5.bin",     0x2000, 0x2000, CRC(77986058) SHA1(8002affdd9ac246a0b9c887654d0db8d3a6913b2) )
973 	ROM_LOAD( "wiz6.bin",     0x4000, 0x2000, CRC(f6970b23) SHA1(82d1fe0fee6bf9c6c2f472ed3479c02da85d5f69) )
974 
975 	ROM_REGION( 0xc000,  "gfx2", 0 )    /* sprites/chars */
976 	ROM_LOAD( "wiz7.bin",     0x0000, 0x2000, CRC(601f2f3f) SHA1(6c0cc7de5fd94628eaecca409c4faa155f684bdc) )
977 	ROM_CONTINUE(             0x6000, 0x2000 )
978 	ROM_LOAD( "wiz8.bin",     0x2000, 0x2000, CRC(f5ab982d) SHA1(5e0e72ec702dd5f48814a15f1a92bcdd29c944d8) )
979 	ROM_CONTINUE(             0x8000, 0x2000 )
980 	ROM_LOAD( "wiz9.bin",     0x4000, 0x2000, CRC(f6c662e2) SHA1(54e904d731ea30f532dfea60d47edf2da99f32eb) )
981 	ROM_CONTINUE(             0xa000, 0x2000 )
982 
983 	ROM_REGION( 0x0300, "proms", 0 )
984 	ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) )    /* palette red component */
985 	ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) )    /* palette green component */
986 	ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) )    /* palette blue component */
987 ROM_END
988 
989 /* was marked as Wiz Alt Sound */
990 ROM_START( wizta )
991 	ROM_REGION( 0xc000, "maincpu", 0 )
992 	ROM_LOAD( "ic7",  0x0000, 0x4000, CRC(b2ec49ad) SHA1(f1624995e9d426dd69d6567a91713aa023e716ad) )
993 	ROM_LOAD( "ic5",  0x4000, 0x4000, CRC(f7e8f792) SHA1(2c1f82e6f6b2573d8bf0a27fb344fe86f475ddef) )
994 	ROM_LOAD( "ic6",  0x8000, 0x4000, CRC(9c406ad2) SHA1(cd82c3dc622886b6ebb30ba565f3c34d5a4e229b) )
995 
996 	ROM_REGION( 0x2000, "audiocpu", 0 )
997 	ROM_LOAD( "ic57",  0x0000, 0x2000, CRC(8a7575bd) SHA1(5470c4c3a40139f45db7a9e260f40b5244f10123) )
998 
999 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
1000 	ROM_LOAD( "ic12",     0x0000, 0x2000, CRC(e6c636b3) SHA1(0d5b98d404d2d87f375cde5d5a90c7d6318ea197) )
1001 	ROM_LOAD( "ic13",     0x2000, 0x2000, CRC(77986058) SHA1(8002affdd9ac246a0b9c887654d0db8d3a6913b2) )
1002 	ROM_LOAD( "ic14",     0x4000, 0x2000, CRC(f6970b23) SHA1(82d1fe0fee6bf9c6c2f472ed3479c02da85d5f69) )
1003 
1004 	ROM_REGION( 0xc000,  "gfx2", 0 )    /* sprites/chars */
1005 	ROM_LOAD( "ic3",      0x0000, 0x2000, CRC(601f2f3f) SHA1(6c0cc7de5fd94628eaecca409c4faa155f684bdc) )
1006 	ROM_CONTINUE(         0x6000, 0x2000 )
1007 	ROM_LOAD( "ic2",      0x2000, 0x2000, CRC(f5ab982d) SHA1(5e0e72ec702dd5f48814a15f1a92bcdd29c944d8) )
1008 	ROM_CONTINUE(         0x8000, 0x2000 )
1009 	ROM_LOAD( "ic1",      0x4000, 0x2000, CRC(f6c662e2) SHA1(54e904d731ea30f532dfea60d47edf2da99f32eb) )
1010 	ROM_CONTINUE(         0xa000, 0x2000 )
1011 
1012 	ROM_REGION( 0x0300, "proms", 0 )
1013 	ROM_LOAD( "ic23_3-1.bin", 0x0000, 0x0100, CRC(2dd52fb2) SHA1(61722aba7a370f4a97cafbd5df88ec7c6263c4ad) )    /* palette red component */
1014 	ROM_LOAD( "ic23_3-2.bin", 0x0100, 0x0100, CRC(8c2880c9) SHA1(9b4c17f7fa5d6dc01d79c40cec9725ab97f514cb) )    /* palette green component */
1015 	ROM_LOAD( "ic23_3-3.bin", 0x0200, 0x0100, CRC(a488d761) SHA1(6dade1dd16905b4751778d49f374936795c3fb6e) )    /* palette blue component */
1016 ROM_END
1017 
1018 ROM_START( stinger )
1019 	ROM_REGION( 0xc000, "maincpu", 0 )
1020 	ROM_LOAD( "1-5j.bin",     0x0000, 0x2000, CRC(1a2ca600) SHA1(473e89f2c49f6e6f38df5d6fc2267ffecf84c6c8) )    /* encrypted */
1021 	ROM_LOAD( "2-6j.bin",     0x2000, 0x2000, CRC(957cd39c) SHA1(38bb589b3bfd962415b31d1151adf4bdb661122f) )    /* encrypted */
1022 	ROM_LOAD( "3-8j.bin",     0x4000, 0x2000, CRC(404c932e) SHA1(c23eac49e06ff38564062c0e8c8cdadf877f1d6a) )    /* encrypted */
1023 	ROM_LOAD( "4-9j.bin",     0x6000, 0x2000, CRC(2d570f91) SHA1(31d54d9fd5254c33f07c605bd6112c7eb53c42a1) )    /* encrypted */
1024 	ROM_LOAD( "5-10j.bin",    0x8000, 0x2000, CRC(c841795c) SHA1(e03860813c03ca1c737935accc2b5fe87c6b624a) )    /* encrypted */
1025 
1026 	ROM_REGION( 0x2000, "audiocpu", 0 )
1027 	ROM_LOAD( "6-9f.bin",     0x0000, 0x2000, CRC(79757f0c) SHA1(71be938c32c6a84618763761786ecc5d7d47581a) )
1028 
1029 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
1030 	ROM_LOAD( "7-9e.bin",     0x0000, 0x2000, CRC(775489be) SHA1(5fccede323895626cf2eabd606ed21282aa36356) )
1031 	ROM_LOAD( "8-11e.bin",    0x2000, 0x2000, CRC(43c61b3f) SHA1(5cdb6a5096b42406c2f2784d37e4e39207c35d40) )
1032 	ROM_LOAD( "9-14e.bin",    0x4000, 0x2000, CRC(c9ed8fc7) SHA1(259d7681b663adb1c5fe057e2ef08469ddcbd3c3) )
1033 
1034 	ROM_REGION( 0x6000,  "gfx2", 0 )    /* sprites/chars */
1035 	ROM_LOAD( "10-9h.bin",    0x0000, 0x2000, CRC(6fc3a22d) SHA1(6875b86d60a06aa329d8ff18d0eb48d158074c5d) )
1036 	ROM_LOAD( "11-11h.bin",   0x2000, 0x2000, CRC(3df1f57e) SHA1(e365ee4cc8c055cc39abb4598ad80597d3ae19c7) )
1037 	ROM_LOAD( "12-14h.bin",   0x4000, 0x2000, CRC(2fbe1391) SHA1(669edc154164944d82dfccda328774ea4a2318ba) )
1038 
1039 	ROM_REGION( 0x0300,  "proms", 0 )
1040 	ROM_LOAD( "stinger.a7",   0x0000, 0x0100, CRC(52c06fc2) SHA1(b416077fcfabe0dbb1ca30752de6a219ea896f75) )    /* red component */
1041 	ROM_LOAD( "stinger.b7",   0x0100, 0x0100, CRC(9985e575) SHA1(b0d609968917121325760f8d4777066abdb7ccfc) )    /* green component */
1042 	ROM_LOAD( "stinger.a8",   0x0200, 0x0100, CRC(76b57629) SHA1(836763948753b7fed97c9e5d90a16dc4ba68f42a) )    /* blue component */
1043 ROM_END
1044 
1045 ROM_START( stinger2 )
1046 	ROM_REGION( 0xc000, "maincpu", 0 )
1047 	ROM_LOAD( "n1.bin",       0x0000, 0x2000, CRC(f2d2790c) SHA1(0e5e92ef45b5bc27b0818f83c89b3bda0e701403) )    /* encrypted */
1048 	ROM_LOAD( "n2.bin",       0x2000, 0x2000, CRC(8fd2d8d8) SHA1(d3318a81fddeb3fa50d01569c1e1145e26ce7277) )    /* encrypted */
1049 	ROM_LOAD( "n3.bin",       0x4000, 0x2000, CRC(f1794d36) SHA1(7954500f489c0bc58cda8e7ffc2e4474759fdc33) )    /* encrypted */
1050 	ROM_LOAD( "n4.bin",       0x6000, 0x2000, CRC(230ba682) SHA1(c419ffebd021d41b3f5021948007fb6bcdb1cdf7) )    /* encrypted */
1051 	ROM_LOAD( "n5.bin",       0x8000, 0x2000, CRC(a03a01da) SHA1(28fecac7a821ac4718242919840266a907160df0) )    /* encrypted */
1052 
1053 	ROM_REGION( 0x2000, "audiocpu", 0 )
1054 	ROM_LOAD( "6-9f.bin",     0x0000, 0x2000, CRC(79757f0c) SHA1(71be938c32c6a84618763761786ecc5d7d47581a) )
1055 
1056 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
1057 	ROM_LOAD( "7-9e.bin",     0x0000, 0x2000, CRC(775489be) SHA1(5fccede323895626cf2eabd606ed21282aa36356) )
1058 	ROM_LOAD( "8-11e.bin",    0x2000, 0x2000, CRC(43c61b3f) SHA1(5cdb6a5096b42406c2f2784d37e4e39207c35d40) )
1059 	ROM_LOAD( "9-14e.bin",    0x4000, 0x2000, CRC(c9ed8fc7) SHA1(259d7681b663adb1c5fe057e2ef08469ddcbd3c3) )
1060 
1061 	ROM_REGION( 0x6000,  "gfx2", 0 )    /* sprites/chars */
1062 	ROM_LOAD( "10.bin",       0x0000, 0x2000, CRC(f6721930) SHA1(fb903f1deb5f093ff5fe129e213966af58a68339) )
1063 	ROM_LOAD( "11.bin",       0x2000, 0x2000, CRC(a4404e63) SHA1(50ae99748547af20e04f6c6c8c7eba85f967b9dc) )
1064 	ROM_LOAD( "12.bin",       0x4000, 0x2000, CRC(b60fa88c) SHA1(2d3bca35076625251933989f5e566d5d3290542b) )
1065 
1066 	ROM_REGION( 0x0300,  "proms", 0 )
1067 	ROM_LOAD( "stinger.a7",   0x0000, 0x0100, CRC(52c06fc2) SHA1(b416077fcfabe0dbb1ca30752de6a219ea896f75) )    /* red component */
1068 	ROM_LOAD( "stinger.b7",   0x0100, 0x0100, CRC(9985e575) SHA1(b0d609968917121325760f8d4777066abdb7ccfc) )    /* green component */
1069 	ROM_LOAD( "stinger.a8",   0x0200, 0x0100, CRC(76b57629) SHA1(836763948753b7fed97c9e5d90a16dc4ba68f42a) )    /* blue component */
1070 ROM_END
1071 
1072 ROM_START( scion )
1073 	ROM_REGION( 0xc000, "maincpu", 0 )
1074 	ROM_LOAD( "sc1",          0x0000, 0x2000, CRC(8dcad575) SHA1(3f194ece25e730b1cbbf3f332bbdebc3a6a72b0f) )
1075 	ROM_LOAD( "sc2",          0x2000, 0x2000, CRC(f608e0ba) SHA1(e55b0ad4dc117339d45a999e13760f4ab3ca4ce0) )
1076 	ROM_LOAD( "sc3",          0x4000, 0x2000, CRC(915289b9) SHA1(b32b40f93de4501619486a8c5a8367d3b2e357a6) )
1077 	ROM_LOAD( "4.9j",         0x6000, 0x2000, CRC(0f40d002) SHA1(13b04f3902ebdda02670fcb667e181cf70594c37) )
1078 	ROM_LOAD( "5.10j",        0x8000, 0x2000, CRC(dc4923b7) SHA1(ec5c22ef1f9ba0fe4da3de62a63a44aa3ff850f4) )
1079 
1080 	ROM_REGION( 0x2000, "audiocpu", 0 )
1081 	ROM_LOAD( "sc6",          0x0000, 0x2000, CRC(09f5f9c1) SHA1(83e489f32597880fb1a13f0bafedd275facb21f7) )
1082 
1083 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
1084 	ROM_LOAD( "7.10e",        0x0000, 0x2000, CRC(223e0d2a) SHA1(073638172ce0762d103cc07705fc493432e5aa63) )
1085 	ROM_LOAD( "8.12e",        0x2000, 0x2000, CRC(d3e39b48) SHA1(c686ef35bf866d044637df295bb70c9c005fc98c) )
1086 	ROM_LOAD( "9.15e",        0x4000, 0x2000, CRC(630861b5) SHA1(a6ccfa10e43e92407c452f9744aa1735b257c28e) )
1087 
1088 	ROM_REGION( 0x6000,  "gfx2", 0 )    /* sprites/chars */
1089 	ROM_LOAD( "10.10h",       0x0000, 0x2000, CRC(0d2a0d1e) SHA1(518689f91019e64138ed3560e161d3ef93d0671d) )
1090 	ROM_LOAD( "11.12h",       0x2000, 0x2000, CRC(dc6ef8ab) SHA1(ba93392a494a66336197d28e45832b9f8f3e4376) )
1091 	ROM_LOAD( "12.15h",       0x4000, 0x2000, CRC(c82c28bf) SHA1(8952b515f01027a94bee0186221a1989ea2cd919) )
1092 
1093 	ROM_REGION( 0x0300,  "proms", 0 )
1094 	ROM_LOAD( "82s129.7a",    0x0000, 0x0100, CRC(2f89d9ea) SHA1(37adbddb9b3253b995a02a74e0de27ad594dc544) )    /* red component */
1095 	ROM_LOAD( "82s129.7b",    0x0100, 0x0100, CRC(ba151e6a) SHA1(3d3139936de9e1913dee94317420a171bd3d2062) )    /* green component */
1096 	ROM_LOAD( "82s129.8a",    0x0200, 0x0100, CRC(f681ce59) SHA1(4ac74c1d04e6b3f14a0f4530a41ba188f5a8f6be) )    /* blue component */
1097 ROM_END
1098 
1099 ROM_START( scionc )
1100 	ROM_REGION( 0xc000, "maincpu", 0 )
1101 	ROM_LOAD( "1.5j",         0x0000, 0x2000, CRC(5aaf571e) SHA1(53becfad13e95012dce6597625c64dcba9ac4433) )
1102 	ROM_LOAD( "2.6j",         0x2000, 0x2000, CRC(d5a66ac9) SHA1(3192da12b2d6a07e203999ed97cdba16d4917a98) )
1103 	ROM_LOAD( "3.8j",         0x4000, 0x2000, CRC(6e616f28) SHA1(ea32add6173251152ca84426c098c92ace123878) )
1104 	ROM_LOAD( "4.9j",         0x6000, 0x2000, CRC(0f40d002) SHA1(13b04f3902ebdda02670fcb667e181cf70594c37) )
1105 	ROM_LOAD( "5.10j",        0x8000, 0x2000, CRC(dc4923b7) SHA1(ec5c22ef1f9ba0fe4da3de62a63a44aa3ff850f4) )
1106 
1107 	ROM_REGION( 0x2000, "audiocpu", 0 )
1108 	ROM_LOAD( "6.9f",         0x0000, 0x2000, CRC(a66a0ce6) SHA1(b2d6a8ded007c362c58496ead33d1561a982440a) )
1109 
1110 	ROM_REGION( 0x6000,  "gfx1", 0 )    /* sprites/chars */
1111 	ROM_LOAD( "7.10e",        0x0000, 0x2000, CRC(223e0d2a) SHA1(073638172ce0762d103cc07705fc493432e5aa63) )
1112 	ROM_LOAD( "8.12e",        0x2000, 0x2000, CRC(d3e39b48) SHA1(c686ef35bf866d044637df295bb70c9c005fc98c) )
1113 	ROM_LOAD( "9.15e",        0x4000, 0x2000, CRC(630861b5) SHA1(a6ccfa10e43e92407c452f9744aa1735b257c28e) )
1114 
1115 	ROM_REGION( 0x6000,  "gfx2", 0 )    /* sprites/chars */
1116 	ROM_LOAD( "10.10h",       0x0000, 0x2000, CRC(0d2a0d1e) SHA1(518689f91019e64138ed3560e161d3ef93d0671d) )
1117 	ROM_LOAD( "11.12h",       0x2000, 0x2000, CRC(dc6ef8ab) SHA1(ba93392a494a66336197d28e45832b9f8f3e4376) )
1118 	ROM_LOAD( "12.15h",       0x4000, 0x2000, CRC(c82c28bf) SHA1(8952b515f01027a94bee0186221a1989ea2cd919) )
1119 
1120 	ROM_REGION( 0x0300,  "proms", 0 )
1121 	ROM_LOAD( "82s129.7a",    0x0000, 0x0100, CRC(2f89d9ea) SHA1(37adbddb9b3253b995a02a74e0de27ad594dc544) )    /* red component */
1122 	ROM_LOAD( "82s129.7b",    0x0100, 0x0100, CRC(ba151e6a) SHA1(3d3139936de9e1913dee94317420a171bd3d2062) )    /* green component */
1123 	ROM_LOAD( "82s129.8a",    0x0200, 0x0100, CRC(f681ce59) SHA1(4ac74c1d04e6b3f14a0f4530a41ba188f5a8f6be) )    /* blue component */
1124 ROM_END
1125 
1126 
1127 void wiz_state::init_stinger()
1128 {
1129 	static const uint8_t swap_xor_table[4][4] =
1130 	{
1131 		{ 7,3,5, 0xa0 },
1132 		{ 3,7,5, 0x88 },
1133 		{ 5,3,7, 0x80 },
1134 		{ 5,7,3, 0x28 }
1135 	};
1136 
1137 	uint8_t *rom = memregion("maincpu")->base();
1138 	const uint8_t *tbl;
1139 
1140 	for (int a = 0x0000; a < 0xc000; a++)
1141 	{
1142 		if (a & 0x2040)
1143 		{
1144 			/* not encrypted */
1145 			m_decrypted_opcodes[a] = rom[a];
1146 		}
1147 		else
1148 		{
1149 			const uint8_t src = rom[a];
1150 
1151 			/* pick the translation table from bits 3 and 5 of the address */
1152 			int row = ((a >> 3) & 1) + (((a >> 5) & 1) << 1);
1153 
1154 			/* decode the opcodes */
1155 			tbl = swap_xor_table[row];
1156 			m_decrypted_opcodes[a] = bitswap<8>(src, tbl[0], 6, tbl[1], 4, tbl[2], 2, 1, 0) ^ tbl[3];
1157 		}
1158 	}
1159 }
1160 
1161 
1162 GAME( 1983, stinger,  0,       stinger, stinger,  wiz_state, init_stinger, ROT90,  "Seibu Denshi", "Stinger", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
1163 GAME( 1983, stinger2, stinger, stinger, stinger2, wiz_state, init_stinger, ROT90,  "Seibu Denshi", "Stinger (prototype?)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
1164 GAME( 1984, scion,    0,       scion,   scion,    wiz_state, empty_init,   ROT0,   "Seibu Denshi", "Scion", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
1165 GAME( 1984, scionc,   scion,   scion,   scion,    wiz_state, empty_init,   ROT0,   "Seibu Denshi (Cinematronics license)", "Scion (Cinematronics)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE )
1166 GAME( 1984, kungfut,  0,       kungfut, kungfut,  wiz_state, empty_init,   ROT0,   "Seibu Kaihatsu", "Kung-Fu Taikun (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_MICROPHONE )
1167 GAME( 1984, kungfuta, kungfut, kungfut, kungfut,  wiz_state, empty_init,   ROT0,   "Seibu Kaihatsu", "Kung-Fu Taikun (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NODEVICE_MICROPHONE ) /* board was a bootleg but set might still be original */
1168 GAME( 1985, wiz,      0,       wiz,     wiz,      wiz_state, empty_init,   ROT270, "Seibu Kaihatsu", "Wiz", MACHINE_SUPPORTS_SAVE )
1169 GAME( 1985, wizt,     wiz,     wiz,     wiz,      wiz_state, empty_init,   ROT270, "Seibu Kaihatsu (Taito license)", "Wiz (Taito, set 1)", MACHINE_SUPPORTS_SAVE )
1170 GAME( 1985, wizta,    wiz,     wiz,     wiz,      wiz_state, empty_init,   ROT270, "Seibu Kaihatsu (Taito license)", "Wiz (Taito, set 2)", MACHINE_SUPPORTS_SAVE )
1171