1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder
3 // thanks-to:Kenneth Lin (original driver author)
4 /***************************************************************************
5 
6   jackal.cpp
7 
8 Notes:
9 - This game uses two 005885 gfx chip in parallel. The unique thing about it is
10   that the two 4bpp tilemaps from the two chips are merged to form a single
11   8bpp tilemap.
12 - topgunbl is derived from a completely different version, which supports gun
13   turret rotation. The copyright year is also different, but this doesn't
14   necessarily mean anything.
15 
16 TODO:
17 - running the sound CPU at the nominal clock rate, music stops working at the
18   beginning of the game. This is kludged by overclocking the sound CPU. This
19   looks like a CPU communication timing issue however fiddling with the
20   interleave factor has no effect.
21 
22 
23 Memory Map
24 ----------
25 
26 MAIN CPU:
27 
28 Address range 00xxxxxxxxxx---- is handled by the 007343 custom so layout is
29 inferred by program behaviour. Note that address lines A8 and A9 are ORed
30 together and go to the single A8.9 input of the 007343.
31 
32 Address          Dir Data     Description
33 ---------------- --- -------- -----------------------
34 00000000000000xx R/W xxxxxxxx 005885 registers
35 0000000000000100 R/W xxxxxxxx 005885 registers
36 0000000000010000 R   xxxxxxxx DIPSW1
37 0000000000010001 R   xxxxxxxx P1 inputs + DIPSW3.4
38 0000000000010010 R   xxxxxxxx P2 inputs
39 0000000000010011 R   xxxxxxxx Coin inputs + DIPSW3.1-3
40 00000000000101-0 R   xxxxxxxx P1 extra inputs (only used by the bootleg for the rotary control)
41 00000000000101-1 R   xxxxxxxx P2 extra inputs (only used by the bootleg for the rotary control)
42 00000000000110-0 R   xxxxxxxx DIPSW2
43 00000000000111-0   W -------x Coin Counter 1 (to 005924 OUT1 input)
44                    W ------x- Coin Counter 2 (to 005924 OUT2 input)
45                    W -----x-- unknown ("END", to connector SVCN4P pin 4)
46                    W ----x--- sprite RAM bank (to 007343 OBJB input)
47                    W ---x---- 005885 select (to 007343 GATEB input)
48                    W --x----- ROM bank
49 00000000000111-1 R/W -------- Watchdog reset (to 005924 AFR input)
50 00000000001xxxxx R/W xxxxxxxx scroll RAM (005885)
51 00000000010xxxxx R/W xxxxxxxx Z RAM (005885)
52 000xxxxxxxxxxxxx R/W xxxxxxxx RAM (shared with sound CPU--note that addresses 0000-005F are handled above so they are excluded)
53 0010xxxxxxxxxxxx R/W xxxxxxxx video RAM (005885)
54 0011xxxxxxxxxxxx R/W xxxxxxxx sprite RAM (005885)
55 01xxxxxxxxxxxxxx R   xxxxxxxx ROM (banked)
56 10xxxxxxxxxxxxxx R   xxxxxxxx ROM (banked)
57 11xxxxxxxxxxxxxx R   xxxxxxxx ROM
58 
59 
60 SOUND CPU:
61 
62 Address          Dir Data     Description
63 ---------------- --- -------- -----------------------
64 000-------------              n.c.
65 001------------x R/W xxxxxxxx YM2151
66 010-xxxxxxxxxxxx R/W xxxxxxxx 007327 (palette)
67 011xxxxxxxxxxxxx R/W xxxxxxxx RAM (shared with main CPU)
68 1xxxxxxxxxxxxxxx R   xxxxxxxx ROM
69 
70 ***************************************************************************/
71 
72 #include "emu.h"
73 #include "includes/jackal.h"
74 #include "includes/konamipt.h"
75 
76 #include "cpu/m6809/m6809.h"
77 #include "machine/watchdog.h"
78 #include "sound/ym2151.h"
79 #include "screen.h"
80 #include "speaker.h"
81 
82 
83 /*************************************
84  *
85  *  Memory handlers
86  *
87  *************************************/
88 
jackalr_rotary_r(offs_t offset)89 uint8_t jackal_state::jackalr_rotary_r(offs_t offset)
90 {
91 	return (1 << m_dials[offset].read_safe(0x00)) ^ 0xff;
92 }
93 
jackal_flipscreen_w(uint8_t data)94 void jackal_state::jackal_flipscreen_w(uint8_t data)
95 {
96 	m_irq_enable = data & 0x02;
97 	flip_screen_set(data & 0x08);
98 }
99 
jackal_zram_r(offs_t offset)100 uint8_t jackal_state::jackal_zram_r(offs_t offset)
101 {
102 	return m_rambank[0x0020 + offset];
103 }
104 
105 
jackal_voram_r(offs_t offset)106 uint8_t jackal_state::jackal_voram_r(offs_t offset)
107 {
108 	return m_rambank[0x2000 + offset];
109 }
110 
111 
jackal_spriteram_r(offs_t offset)112 uint8_t jackal_state::jackal_spriteram_r(offs_t offset)
113 {
114 	return m_spritebank[0x3000 + offset];
115 }
116 
117 
jackal_rambank_w(uint8_t data)118 void jackal_state::jackal_rambank_w(uint8_t data)
119 {
120 	uint8_t *rgn = memregion("master")->base();
121 
122 	if (data & 0x04)
123 		popmessage("jackal_rambank_w %02x", data);
124 
125 	// all revisions flips the coin counter bit between 1 -> 0 five times, causing the bookkeeping to report 5 coins inserted.
126 	// most likely solution in HW is a f/f that disables coin counters when any of the other bits are enabled.
127 	if((data & 0xfc) == 0)
128 	{
129 		machine().bookkeeping().coin_counter_w(0, data & 0x01);
130 		machine().bookkeeping().coin_counter_w(1, data & 0x02);
131 	}
132 
133 	m_spritebank = &rgn[((data & 0x08) << 13)];
134 	m_rambank = &rgn[((data & 0x10) << 12)];
135 	membank("bank1")->set_entry((data & 0x20) ? 1 : 0);
136 }
137 
138 
jackal_zram_w(offs_t offset,uint8_t data)139 void jackal_state::jackal_zram_w(offs_t offset, uint8_t data)
140 {
141 	m_rambank[0x0020 + offset] = data;
142 }
143 
144 
jackal_voram_w(offs_t offset,uint8_t data)145 void jackal_state::jackal_voram_w(offs_t offset, uint8_t data)
146 {
147 	if ((offset & 0xf800) == 0)
148 		jackal_mark_tile_dirty(offset & 0x3ff);
149 
150 	m_rambank[0x2000 + offset] = data;
151 }
152 
153 
jackal_spriteram_w(offs_t offset,uint8_t data)154 void jackal_state::jackal_spriteram_w(offs_t offset, uint8_t data)
155 {
156 	m_spritebank[0x3000 + offset] = data;
157 }
158 
159 /*************************************
160  *
161  *  Address maps
162  *
163  *************************************/
164 
master_map(address_map & map)165 void jackal_state::master_map(address_map &map)
166 {
167 	map(0x0000, 0x0003).ram().share("videoctrl");   // scroll + other things
168 	map(0x0004, 0x0004).w(FUNC(jackal_state::jackal_flipscreen_w));
169 	map(0x0010, 0x0010).portr("DSW1");
170 	map(0x0011, 0x0011).portr("IN1");
171 	map(0x0012, 0x0012).portr("IN2");
172 	map(0x0013, 0x0013).portr("IN0");
173 	map(0x0014, 0x0015).r(FUNC(jackal_state::jackalr_rotary_r));
174 	map(0x0018, 0x0018).portr("DSW2");
175 	map(0x0019, 0x0019).w("watchdog", FUNC(watchdog_timer_device::reset_w));
176 	map(0x001c, 0x001c).w(FUNC(jackal_state::jackal_rambank_w));
177 	map(0x0020, 0x005f).rw(FUNC(jackal_state::jackal_zram_r), FUNC(jackal_state::jackal_zram_w));             // MAIN   Z RAM,SUB    Z RAM
178 	map(0x0060, 0x1fff).ram().share("share1");                          // M COMMON RAM,S COMMON RAM
179 	map(0x2000, 0x2fff).rw(FUNC(jackal_state::jackal_voram_r), FUNC(jackal_state::jackal_voram_w));           // MAIN V O RAM,SUB  V O RAM
180 	map(0x3000, 0x3fff).rw(FUNC(jackal_state::jackal_spriteram_r), FUNC(jackal_state::jackal_spriteram_w));   // MAIN V O RAM,SUB  V O RAM
181 	map(0x4000, 0xbfff).bankr("bank1");
182 	map(0xc000, 0xffff).rom();
183 }
184 
slave_map(address_map & map)185 void jackal_state::slave_map(address_map &map)
186 {
187 	map(0x2000, 0x2001).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
188 	map(0x4000, 0x43ff).ram().w(m_palette, FUNC(palette_device::write_indirect)).share("palette");  // self test only checks 0x4000-0x423f, 007327 should actually go up to 4fff
189 	map(0x6000, 0x605f).ram();                     // SOUND RAM (Self test check 0x6000-605f, 0x7c00-0x7fff)
190 	map(0x6060, 0x7fff).ram().share("share1");
191 	map(0x8000, 0xffff).rom();
192 }
193 
194 /*************************************
195  *
196  *  Input ports
197  *
198  *************************************/
199 
200 static INPUT_PORTS_START( jackal )
201 	PORT_START("DSW1")
202 	KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
203 	/* "No Coin B" = coins produce sound, but no effect on coin counter */
204 
205 	PORT_START("DSW2")
206 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION( "SW2:1,2" )
207 	PORT_DIPSETTING(    0x03, "2" )
208 	PORT_DIPSETTING(    0x02, "3" )
209 	PORT_DIPSETTING(    0x01, "4" )
210 	PORT_DIPSETTING(    0x00, "7" )
211 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) PORT_DIPLOCATION( "SW2:3" )
212 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
213 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
214 	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION( "SW2:4,5" )
215 	PORT_DIPSETTING(    0x18, "30K 150K" )
216 	PORT_DIPSETTING(    0x10, "50K 200K" )
217 	PORT_DIPSETTING(    0x08, "30K" )
218 	PORT_DIPSETTING(    0x00, "50K" )
219 	PORT_DIPNAME( 0x60, 0x40, DEF_STR( Difficulty ) ) PORT_DIPLOCATION( "SW2:6,7" )
220 	PORT_DIPSETTING(    0x60, DEF_STR( Easy ) )
221 	PORT_DIPSETTING(    0x40, DEF_STR( Normal ) )
222 	PORT_DIPSETTING(    0x20, DEF_STR( Difficult ) )
223 	PORT_DIPSETTING(    0x00, DEF_STR( Very_Difficult ) )
224 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION( "SW2:8" )
225 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
226 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
227 
228 	PORT_START("IN0")
229 	KONAMI8_SYSTEM_10
230 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION( "SW3:1" )
231 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
232 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
233 	PORT_DIPNAME( 0x40, 0x00, "Sound Adjustment" ) PORT_DIPLOCATION( "SW3:2" )
234 	PORT_DIPSETTING(    0x00, DEF_STR( Upright ) )
235 	PORT_DIPSETTING(    0x40, DEF_STR( Cocktail ) )
236 	PORT_DIPNAME( 0x80, 0x00, "Sound Mode" ) PORT_DIPLOCATION( "SW3:3" )
237 	PORT_DIPSETTING(    0x80, DEF_STR( Mono ) )
238 	PORT_DIPSETTING(    0x00, DEF_STR( Stereo ) )
239 
240 	PORT_START("IN1")
241 	KONAMI8_B12(1)
242 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION( "SW3:4" )
243 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
244 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
245 
246 	PORT_START("IN2")
247 	KONAMI8_B12_UNK(2)
248 INPUT_PORTS_END
249 
250 static INPUT_PORTS_START( jackalr )
251 	PORT_INCLUDE(jackal)
252 
253 	PORT_MODIFY("IN0")
254 	PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED )
255 
256 	PORT_START("DIAL0") // player 1 8-way rotary control - converted in jackalr_rotary_r()
257 	PORT_BIT( 0xff, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(8) PORT_WRAPS PORT_SENSITIVITY(15) PORT_KEYDELTA(1) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X) PORT_FULL_TURN_COUNT(8)
258 
259 	PORT_START("DIAL1") // player 2 8-way rotary control - converted in jackalr_rotary_r()
260 	PORT_BIT( 0xff, 0x00, IPT_POSITIONAL ) PORT_POSITIONS(8) PORT_WRAPS PORT_SENSITIVITY(15) PORT_KEYDELTA(1) PORT_CODE_DEC(KEYCODE_N) PORT_CODE_INC(KEYCODE_M) PORT_PLAYER(2) PORT_FULL_TURN_COUNT(8)
261 INPUT_PORTS_END
262 
263 
264 /*************************************
265  *
266  *  Graphics definitions
267  *
268  *************************************/
269 
270 static const gfx_layout charlayout =
271 {
272 	8, 8,
273 	RGN_FRAC(1,4),
274 	8,  /* 8 bits per pixel (!) */
275 	{ 0, 1, 2, 3, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+3 },
276 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
277 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
278 	32*8
279 };
280 
281 static const gfx_layout spritelayout =
282 {
283 	16, 16,
284 	RGN_FRAC(1,4),
285 	4,
286 	{ 0, 1, 2, 3 },
287 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
288 			32*8+0*4, 32*8+1*4, 32*8+2*4, 32*8+3*4, 32*8+4*4, 32*8+5*4, 32*8+6*4, 32*8+7*4 },
289 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
290 			16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32 },
291 	32*32
292 };
293 
294 static const gfx_layout spritelayout8 =
295 {
296 	8, 8,
297 	RGN_FRAC(1,4),
298 	4,
299 	{ 0, 1, 2, 3 },
300 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
301 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
302 	32*8
303 };
304 
305 static GFXDECODE_START( gfx_jackal )
306 	GFXDECODE_ENTRY( "gfx1", 0x00000, charlayout,        0,  1 )    // colors 256-511 without lookup
307 	GFXDECODE_ENTRY( "gfx1", 0x20000, spritelayout,  0x100, 16 )    // colors   0- 15 with lookup
308 	GFXDECODE_ENTRY( "gfx1", 0x20000, spritelayout8, 0x100, 16 )    // to handle 8x8 sprites
309 	GFXDECODE_ENTRY( "gfx1", 0x60000, spritelayout,  0x200, 16 )    // colors  16- 31 with lookup
310 	GFXDECODE_ENTRY( "gfx1", 0x60000, spritelayout8, 0x200, 16 )    // to handle 8x8 sprites
311 GFXDECODE_END
312 
313 /*************************************
314  *
315  *  Interrupt generator
316  *
317  *************************************/
318 
WRITE_LINE_MEMBER(jackal_state::vblank_irq)319 WRITE_LINE_MEMBER(jackal_state::vblank_irq)
320 {
321 	if (state && m_irq_enable)
322 	{
323 		m_mastercpu->set_input_line(0, HOLD_LINE);
324 		m_slavecpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
325 	}
326 }
327 
328 
329 /*************************************
330  *
331  *  Machine driver
332  *
333  *************************************/
334 
machine_start()335 void jackal_state::machine_start()
336 {
337 	uint8_t *ROM = memregion("master")->base();
338 
339 	membank("bank1")->configure_entry(0, &ROM[0x04000]);
340 	membank("bank1")->configure_entry(1, &ROM[0x14000]);
341 	membank("bank1")->set_entry(0);
342 
343 	save_item(NAME(m_irq_enable));
344 }
345 
machine_reset()346 void jackal_state::machine_reset()
347 {
348 	uint8_t *rgn = memregion("master")->base();
349 
350 	// HACK: running at the nominal clock rate, music stops working
351 	// at the beginning of the game. This fixes it.
352 	m_slavecpu->set_clock_scale(1.2f);
353 
354 	m_rambank = rgn;
355 	m_spritebank = rgn;
356 
357 	m_irq_enable = 0;
358 }
359 
jackal(machine_config & config)360 void jackal_state::jackal(machine_config &config)
361 {
362 	/* basic machine hardware */
363 	MC6809E(config, m_mastercpu, MASTER_CLOCK/12); // verified on pcb
364 	m_mastercpu->set_addrmap(AS_PROGRAM, &jackal_state::master_map);
365 
366 	MC6809E(config, m_slavecpu, MASTER_CLOCK/12); // verified on pcb
367 	m_slavecpu->set_addrmap(AS_PROGRAM, &jackal_state::slave_map);
368 
369 	config.set_maximum_quantum(attotime::from_hz(6000));
370 
371 	WATCHDOG_TIMER(config, "watchdog");
372 
373 	/* video hardware */
374 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
375 	screen.set_refresh_hz(60);
376 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
377 	screen.set_size(32*8, 32*8);
378 	screen.set_visarea(1*8, 31*8-1, 2*8, 30*8-1);
379 	screen.set_screen_update(FUNC(jackal_state::screen_update_jackal));
380 	screen.set_palette(m_palette);
381 	screen.screen_vblank().set(FUNC(jackal_state::vblank_irq));
382 
383 	GFXDECODE(config, m_gfxdecode, m_palette, gfx_jackal);
384 	PALETTE(config, m_palette, FUNC(jackal_state::jackal_palette));
385 	m_palette->set_format(palette_device::xBGR_555, 0x300, 0x200);
386 	m_palette->set_endianness(ENDIANNESS_LITTLE);
387 
388 	/* sound hardware */
389 	SPEAKER(config, "lspeaker").front_left();
390 	SPEAKER(config, "rspeaker").front_right();
391 
392 	YM2151(config, "ymsnd", SOUND_CLOCK).add_route(0, "lspeaker", 0.50).add_route(1, "rspeaker", 0.50); // verified on pcb
393 }
394 
395 /*************************************
396  *
397  *  ROM definition(s)
398  *
399  *************************************/
400 
401 ROM_START( jackal ) /* 8-Way Joystick: You can only shoot in one direction regardless of travel - up the screen */
402 	ROM_REGION( 0x20000, "master", 0 )  /* Banked 64k for 1st CPU */
403 	ROM_LOAD( "631_v02.15d", 0x04000, 0x8000, CRC(0b7e0584) SHA1(e4019463345a4c020d5a004c9a400aca4bdae07b) )
404 	ROM_CONTINUE(            0x14000, 0x8000 )
405 	ROM_LOAD( "631_v03.16d", 0x0c000, 0x4000, CRC(3e0dfb83) SHA1(5ba7073751eee33180e51143b348256597909516) )
406 
407 	ROM_REGION( 0x10000, "slave", 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
408 	ROM_LOAD( "631_t01.11d", 0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
409 
410 	ROM_REGION( 0x80000, "gfx1", 0 )
411 	ROM_LOAD16_BYTE( "631t04.7h",  0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) /* Silkscreened MASK1M */
412 	ROM_LOAD16_BYTE( "631t05.8h",  0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) /* Silkscreened MASK1M */
413 	ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) /* Silkscreened MASK1M */
414 	ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) /* Silkscreened MASK1M */
415 
416 	ROM_REGION( 0x0200, "proms", 0 )    /* color lookup tables */
417 	ROM_LOAD( "631r08.9h",  0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
418 	ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
419 ROM_END
420 
421 ROM_START( jackalr ) /* Rotary Joystick: Shot direction is controlled via the rotary function of the joystick */
422 	ROM_REGION( 0x20000, "master", 0 )  /* Banked 64k for 1st CPU */
423 	ROM_LOAD( "631_q02.15d", 0x04000, 0x8000, CRC(ed2a7d66) SHA1(3d9b31fa8b31e509880d617feb0dd4bd9790d2d5) )
424 	ROM_CONTINUE(            0x14000, 0x8000 )
425 	ROM_LOAD( "631_q03.16d", 0x0c000, 0x4000, CRC(b9d34836) SHA1(af23a0c844fb9e60a757511ca898d73eef4c2e51) )
426 
427 	ROM_REGION( 0x10000, "slave", 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
428 	ROM_LOAD( "631_q01.11d", 0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) )
429 
430 	ROM_REGION( 0x80000, "gfx1", 0 )
431 	ROM_LOAD16_BYTE( "631t04.7h",  0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) /* Silkscreened MASK1M */
432 	ROM_LOAD16_BYTE( "631t05.8h",  0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) /* Silkscreened MASK1M */
433 	ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) /* Silkscreened MASK1M */
434 	ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) /* Silkscreened MASK1M */
435 		/* These roms are on a tiny riser board - two smaller roms instead of MASK1M roms */
436 //  ROM_LOAD16_BYTE( "631_q04.7h",  0x20000, 0x10000, CRC(0) SHA1(0) )
437 //  ROM_LOAD16_BYTE( "631_q05.7h",  0x00000, 0x10000, CRC(0) SHA1(0) )
438 //  ROM_LOAD16_BYTE( "631_q06.8h",  0x20001, 0x10000, CRC(0) SHA1(0) )
439 //  ROM_LOAD16_BYTE( "631_q07.8h",  0x00001, 0x10000, CRC(0) SHA1(0) ) /* 631 Q04 through 631 Q11 need to be redumped and verified. Should be the same data */
440 //  ROM_LOAD16_BYTE( "631_q08.12h", 0x40000, 0x10000, CRC(0) SHA1(0) ) /* until then we are going to use the standard MASK1M roms - Will fixed when dumped  */
441 //  ROM_LOAD16_BYTE( "631_q09.12h", 0x60000, 0x10000, CRC(0) SHA1(0) )
442 //  ROM_LOAD16_BYTE( "631_q10.13h", 0x40001, 0x10000, CRC(0) SHA1(0) )
443 //  ROM_LOAD16_BYTE( "631_q11.13h", 0x60001, 0x10000, CRC(0) SHA1(0) )
444 
445 	ROM_REGION( 0x0200, "proms", 0 )    /* color lookup tables */
446 	ROM_LOAD( "631r08.9h",  0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
447 	ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
448 ROM_END
449 
450 ROM_START( topgunr ) /* 8-Way Joystick:  You can only shoot in one direction regardless of travel - up the screen */
451 	ROM_REGION( 0x20000, "master", 0 )  /* Banked 64k for 1st CPU */
452 	ROM_LOAD( "631_u02.15d", 0x04000, 0x8000, CRC(f7e28426) SHA1(db2d5f252a574b8aa4d8406a8e93b423fd2a7fef) )
453 	ROM_CONTINUE(            0x14000, 0x8000 )
454 	ROM_LOAD( "631_u03.16d", 0x0c000, 0x4000, CRC(c086844e) SHA1(4d6f27ac3aabb4b2d673aa619e407e417ad89337) )
455 
456 	ROM_REGION( 0x10000, "slave", 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
457 	ROM_LOAD( "631_t01.11d", 0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
458 
459 	ROM_REGION( 0x80000, "gfx1", 0 )
460 	ROM_LOAD16_BYTE( "631u04.7h",  0x00000, 0x20000, CRC(50122a12) SHA1(c9e0132a3a40d9d28685c867c70231947d8a9cb7) ) /* Silkscreened MASK1M */
461 	ROM_LOAD16_BYTE( "631u05.8h",  0x00001, 0x20000, CRC(6943b1a4) SHA1(40de2b434600ea4c8fb42e6b21be2c3705a55d67) ) /* Silkscreened MASK1M */
462 	ROM_LOAD16_BYTE( "631u06.12h", 0x40000, 0x20000, CRC(37dbbdb0) SHA1(f94db780d69e7dd40231a75629af79469d957378) ) /* Silkscreened MASK1M */
463 	ROM_LOAD16_BYTE( "631u07.13h", 0x40001, 0x20000, CRC(22effcc8) SHA1(4d174b0ce64def32050f87343c4b1424e0fef6f7) ) /* Silkscreened MASK1M */
464 
465 	ROM_REGION( 0x0200, "proms", 0 )    /* color lookup tables */
466 	ROM_LOAD( "631r08.9h",  0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
467 	ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
468 ROM_END
469 
470 ROM_START( jackalj ) /* 8-Way Joystick: You can only shoot in the direction you're traveling */
471 	ROM_REGION( 0x20000, "master", 0 )  /* Banked 64k for 1st CPU */
472 	ROM_LOAD( "631_t02.15d", 0x04000, 0x8000, CRC(14db6b1a) SHA1(b469ea50aa94a2bda3bd0442300aa1272e5f30c4) )
473 	ROM_CONTINUE(            0x14000, 0x8000 )
474 	ROM_LOAD( "631_t03.16d", 0x0c000, 0x4000, CRC(fd5f9624) SHA1(2520c1ff54410ef498ecbf52877f011900baed4c) )
475 
476 	ROM_REGION( 0x10000, "slave", 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
477 	ROM_LOAD( "631_t01.11d", 0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
478 
479 	ROM_REGION( 0x80000, "gfx1", 0 )
480 	ROM_LOAD16_BYTE( "631t04.7h",  0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) ) /* Silkscreened MASK1M */
481 	ROM_LOAD16_BYTE( "631t05.8h",  0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) ) /* Silkscreened MASK1M */
482 	ROM_LOAD16_BYTE( "631t06.12h", 0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) ) /* Silkscreened MASK1M */
483 	ROM_LOAD16_BYTE( "631t07.13h", 0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) ) /* Silkscreened MASK1M */
484 
485 	ROM_REGION( 0x0200, "proms", 0 )    /* color lookup tables */
486 	ROM_LOAD( "631r08.9h",  0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
487 	ROM_LOAD( "631r09.14h", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) ) /* MMI 63S141AN or compatible (silkscreened 6301) */
488 ROM_END
489 
490 ROM_START( jackalbl ) // This is based on jackalr. Was dumped from 2 different PCBs.
491 	ROM_REGION( 0x20000, "master", 0 )  /* Banked 64k for 1st CPU */
492 	ROM_LOAD( "epr-a-3.bin", 0x04000, 0x8000, CRC(5fffee27) SHA1(224d5fd26dd1e0f15a3c99fd2fffbb76f641416e) ) // also found labeled "3.17"
493 	ROM_LOAD( "epr-a-2.bin", 0x0c000, 0x4000, CRC(ae2a290a) SHA1(e9bee75a02aef5cf330dccb9e7a45b0171a8c1d7) ) // also found labeled "2.20"
494 	ROM_LOAD( "epr-a-4.bin", 0x14000, 0x8000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) ) // also found labeled "4.18"
495 
496 	ROM_REGION( 0x10000, "slave", 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
497 	ROM_LOAD( "epr-a-1.bin", 0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) ) // also found labeled "1.19"
498 
499 	ROM_REGION( 0x80000, "gfx1", 0 )
500 	/* same data, different layout */
501 	ROM_LOAD16_WORD_SWAP( "epr-a-17.bin", 0x00000, 0x08000, CRC(a96720b6) SHA1(d3c2a1848fa9d9d1232e58e412bdd69032fe2c83) ) // also found labeled "17.5"
502 	ROM_LOAD16_WORD_SWAP( "epr-a-18.bin", 0x08000, 0x08000, CRC(932d0ecb) SHA1(20bf789f45c5b3ba90012e1a945523236578a014) ) // also found labeled "18.6"
503 	ROM_LOAD16_WORD_SWAP( "epr-a-19.bin", 0x10000, 0x08000, CRC(1e3412e7) SHA1(dc0be23d6c89b7b131c3bd5cd117123e5f9d971c) ) // also found labeled "19.7"
504 	ROM_LOAD16_WORD_SWAP( "epr-a-20.bin", 0x18000, 0x08000, CRC(4b0d15be) SHA1(657c861357b5881e4ff356b1f27345b11e6c0696) ) // also found labeled "20.8"
505 	ROM_LOAD16_WORD_SWAP( "epr-a-6.bin",  0x20000, 0x08000, CRC(ec7141ad) SHA1(eb631ca58364827659fba1cb3dca326c2e5bf5b7) ) // also found labeled "6.9"
506 	ROM_LOAD16_WORD_SWAP( "epr-a-5.bin",  0x28000, 0x08000, CRC(c6375c74) SHA1(55090485307c6581556632fadbf704431734b145) ) // also found labeled "5.10"
507 	ROM_LOAD16_WORD_SWAP( "epr-a-7.bin",  0x30000, 0x08000, CRC(03e1de04) SHA1(c5f17633f4d5907310effb490488053861a55f6c) ) // also found labeled "7.11"
508 	ROM_LOAD16_WORD_SWAP( "epr-a-8.bin",  0x38000, 0x08000, CRC(f946ada7) SHA1(fd9a0786436cbdb4c844f71342232e4e6645d98f) ) // also found labeled "8.12"
509 	ROM_LOAD16_WORD_SWAP( "epr-a-13.bin", 0x40000, 0x08000, CRC(7c29c59e) SHA1(c2764f99ab4b39e7c0e43f58f69d6c353d0357aa) ) // also found labeled "13.1"
510 	ROM_LOAD16_WORD_SWAP( "epr-a-14.bin", 0x48000, 0x08000, CRC(f2bbff39) SHA1(f39dfdb3301f9b01d58071ffee41c467757d99d9) ) // also found labeled "14.2"
511 	ROM_LOAD16_WORD_SWAP( "epr-a-15.bin", 0x50000, 0x08000, CRC(594dbaaf) SHA1(e3f05acbdba8e8644dbabb065832476c1cb20569) ) // also found labeled "15.3"
512 	ROM_LOAD16_WORD_SWAP( "epr-a-16.bin", 0x58000, 0x08000, CRC(069bf945) SHA1(93ecc7dd779d16d825680bbc4986a312758db52f) ) // also found labeled "16.4"
513 	ROM_LOAD16_WORD_SWAP( "epr-a-9.bin",  0x60000, 0x08000, CRC(c00cef79) SHA1(94af2f4a67d1425fbb64b58ed7e618c8b38df203) ) // also found labeled "9.13"
514 	ROM_LOAD16_WORD_SWAP( "epr-a-10.bin", 0x68000, 0x08000, CRC(0aed6cd7) SHA1(88f81be5d8b2679349bf5cf2d4e02aff25c5118b) ) // also found labeled "10.14"
515 	ROM_LOAD16_WORD_SWAP( "epr-a-11.bin", 0x70000, 0x08000, CRC(a48e9f60) SHA1(6d5af16c16b40fb092fdba6dce852b94ac4767f4) ) // also found labeled "11.15"
516 	ROM_LOAD16_WORD_SWAP( "epr-a-12.bin", 0x78000, 0x08000, CRC(79b7c71c) SHA1(8510226114ab9098ec48e02840465fc8b69b5262) ) // also found labeled "12.16"
517 
518 	ROM_REGION( 0x0200, "proms", 0 )    /* color lookup tables */
519 	ROM_LOAD( "n82s129n.prom2", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
520 	ROM_LOAD( "n82s129n.prom1", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
521 
522 	ROM_REGION( 0x1000, "pals", 0 ) /* currently not used by the emulation */
523 	ROM_LOAD( "pal16r6cn.pal1",     0x0000, 0x0104, CRC(9bba948f) SHA1(5f42568489f16f8b3719eb2ec178e7c61d7ce25f) )
524 	ROM_LOAD( "ampal16l8pc.pal2",   0x0200, 0x0104, CRC(17c9de2f) SHA1(2db42618f9ca1174bdcdbf92ea91ebc1a79bc6d2) )
525 	ROM_LOAD( "ampal16r4pc.pal3",   0x0400, 0x0104, CRC(e54cd288) SHA1(5b8ae5a2a4a9ec3fab603b063fd18c96dd1fd0cf) )
526 	ROM_LOAD( "pal16r8acn.pal4",    0x0600, 0x0104, CRC(5cc45e00) SHA1(cbd871addbac6310c8593fe8e8d5a962c2b45b2c) )
527 	ROM_LOAD( "pal20l8a-2cns.pal5", 0x0800, 0x0144, NO_DUMP ) // read protected
528 	ROM_LOAD( "pal20l8acns.pal6",   0x0a00, 0x0144, NO_DUMP ) // read protected
529 	ROM_LOAD( "pal16l8pc.pal7",     0x0c00, 0x0104, CRC(e8cdc259) SHA1(6917ef8f4f09aa099a48b8ae2d10bcd10961fb43) )
530 	ROM_LOAD( "d5c121.ep1200",      0x0e00, 0x0200, NO_DUMP ) // not dumped yet
531 ROM_END
532 
533 ROM_START( topgunbl ) /* Rotary Joystick: Shot direction is controlled via the Rotary function of the joystick */
534 	ROM_REGION( 0x20000, "master", 0 )  /* Banked 64k for 1st CPU */
535 	ROM_LOAD( "t-3.c5", 0x04000, 0x8000, CRC(7826ad38) SHA1(875e87867924905b9b83bc203eb7ffe81cf72233) )
536 	ROM_LOAD( "t-4.c4", 0x14000, 0x8000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) ) /* == 2nd half of 631_q02.15d */
537 	ROM_LOAD( "t-2.c6", 0x0c000, 0x4000, CRC(d53172e5) SHA1(44b7f180c17f9a121a2f06f2d3471920a8989e21) )
538 
539 	ROM_REGION( 0x10000, "slave", 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
540 	ROM_LOAD( "t-1.c14", 0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) ) /* == 631_q01.11d */
541 
542 	ROM_REGION( 0x80000, "gfx1", 0 )
543 	/* same data, different layout */
544 	ROM_LOAD16_WORD_SWAP( "t-17.n12", 0x00000, 0x08000, CRC(e8875110) SHA1(73f4c47ab039dce8c285bf222253084c860c95bf) )
545 	ROM_LOAD16_WORD_SWAP( "t-18.n13", 0x08000, 0x08000, CRC(cf14471d) SHA1(896aa8d7c93f837f6661d30bd0d6e19d16669107) )
546 	ROM_LOAD16_WORD_SWAP( "t-19.n14", 0x10000, 0x08000, CRC(46ee5dd2) SHA1(1a910984a197af341f13b4683babee857aafb245) )
547 	ROM_LOAD16_WORD_SWAP( "t-20.n15", 0x18000, 0x08000, CRC(3f472344) SHA1(49b9da8741b8e474d25726a706cf3008096ab2dc) )
548 	ROM_LOAD16_WORD_SWAP( "t-6.n1",   0x20000, 0x08000, CRC(539cc48c) SHA1(476ff5fe239e5acb61ede4d745d327f6bc3709f3) )
549 	ROM_LOAD16_WORD_SWAP( "t-5.m1",   0x28000, 0x08000, CRC(dbc26afe) SHA1(faab1feae91a9c22c008555955596c55d77b70c7) )
550 	ROM_LOAD16_WORD_SWAP( "t-7.n2",   0x30000, 0x08000, CRC(0ecd31b1) SHA1(06d77159ed55c1e288f2a194cdb09d29542e06d6) )
551 	ROM_LOAD16_WORD_SWAP( "t-8.n3",   0x38000, 0x08000, CRC(f946ada7) SHA1(fd9a0786436cbdb4c844f71342232e4e6645d98f) )
552 	ROM_LOAD16_WORD_SWAP( "t-13.n8",  0x40000, 0x08000, CRC(5d669abb) SHA1(faba6d7b47caae2ecdf15fb3527824bdb22e3d6b) )
553 	ROM_LOAD16_WORD_SWAP( "t-14.n9",  0x48000, 0x08000, CRC(f349369b) SHA1(f19238ef5feb1c89ef58c17a2506cc96ed8054e1) )
554 	ROM_LOAD16_WORD_SWAP( "t-15.n10", 0x50000, 0x08000, CRC(7c5a91dd) SHA1(85a1d76efc385e8e971a65e225de7f5d100bfbc7) )
555 	ROM_LOAD16_WORD_SWAP( "t-16.n11", 0x58000, 0x08000, CRC(5ec46d8e) SHA1(350e983b56a9f7d95e98429ee9a5fa6d3af36db4) )
556 	ROM_LOAD16_WORD_SWAP( "t-9.n4",   0x60000, 0x08000, CRC(8269caca) SHA1(8b80b7bad966d5b61a5c22d2ced625b5645f2ce2) )
557 	ROM_LOAD16_WORD_SWAP( "t-10.n5",  0x68000, 0x08000, CRC(25393e4f) SHA1(f6d7995b51d5bbbc3e325d6949dbc435446b5cf9) )
558 	ROM_LOAD16_WORD_SWAP( "t-11.n6",  0x70000, 0x08000, CRC(7895c22d) SHA1(c81ae51116fb32ac99d37eb7c2000c990d089b8d) )
559 	ROM_LOAD16_WORD_SWAP( "t-12.n7",  0x78000, 0x08000, CRC(15606dfc) SHA1(829492da49dbe70f81d15237803c5203aa011957) )
560 
561 	ROM_REGION( 0x0200, "proms", 0 )    /* color lookup tables */
562 	ROM_LOAD( "631r08.bpr", 0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
563 	ROM_LOAD( "631r09.bpr", 0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
564 ROM_END
565 
566 
567 /*************************************
568  *
569  *  Game driver(s)
570  *
571  *************************************/
572 
573 GAME( 1986, jackal,   0,      jackal, jackal,  jackal_state, empty_init, ROT90, "Konami",  "Jackal (World, 8-way Joystick)",               0 )
574 GAME( 1986, jackalr,  jackal, jackal, jackalr, jackal_state, empty_init, ROT90, "Konami",  "Jackal (World, Rotary Joystick)",              0 )
575 GAME( 1986, topgunr,  jackal, jackal, jackal,  jackal_state, empty_init, ROT90, "Konami",  "Top Gunner (US, 8-way Joystick)",              0 )
576 GAME( 1986, jackalj,  jackal, jackal, jackal,  jackal_state, empty_init, ROT90, "Konami",  "Tokushu Butai Jackal (Japan, 8-way Joystick)", 0 )
577 GAME( 1986, jackalbl, jackal, jackal, jackalr, jackal_state, empty_init, ROT90, "bootleg", "Jackal (bootleg, Rotary Joystick)",            0 )
578 GAME( 1986, topgunbl, jackal, jackal, jackalr, jackal_state, empty_init, ROT90, "bootleg", "Top Gunner (bootleg, Rotary Joystick)",        0 )
579