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