1 /***************************************************************************
2 
3   jackal.c
4 
5   Written by Kenneth Lin (kenneth_lin@ai.vancouver.bc.ca)
6 
7 Notes:
8 - This game uses two 005885 gfx chip in parallel. The unique thing about it is
9   that the two 4bpp tilemaps from the two chips are merged to form a single
10   8bpp tilemap.
11 - topgunbl is derived from a completely different version, which supports gun
12   turret rotation. The copyright year is also deiffrent, but this doesn't
13   necessarily mean anything.
14 
15 TODO:
16 - The high score table colors are wrong, are there proms missing?
17 - Sprite lag
18 - Coin counters don't work correctly, because the register is overwritten by
19   other routines and the coin counter bits rapidly toggle between 0 and 1.
20 
21 ***************************************************************************/
22 
23 #include "driver.h"
24 #include "vidhrdw/generic.h"
25 #include "cpu/m6809/m6809.h"
26 
27 
28 extern unsigned char *jackal_videoctrl;
29 
30 MACHINE_INIT( jackal );
31 VIDEO_START( jackal );
32 
33 READ_HANDLER( jackal_zram_r );
34 READ_HANDLER( jackal_commonram_r );
35 READ_HANDLER( jackal_commonram1_r );
36 READ_HANDLER( jackal_voram_r );
37 READ_HANDLER( jackal_spriteram_r );
38 
39 WRITE_HANDLER( jackal_rambank_w );
40 WRITE_HANDLER( jackal_zram_w );
41 WRITE_HANDLER( jackal_commonram_w );
42 WRITE_HANDLER( jackal_commonram1_w );
43 WRITE_HANDLER( jackal_voram_w );
44 WRITE_HANDLER( jackal_spriteram_w );
45 
46 PALETTE_INIT( jackal );
47 VIDEO_UPDATE( jackal );
48 
49 
50 
READ_HANDLER(rotary_0_r)51 static READ_HANDLER( rotary_0_r )
52 {
53 	return (1 << (readinputport(5) * 8 / 256)) ^ 0xff;
54 }
55 
READ_HANDLER(rotary_1_r)56 static READ_HANDLER( rotary_1_r )
57 {
58 	return (1 << (readinputport(6) * 8 / 256)) ^ 0xff;
59 }
60 
61 static int irq_enable;
62 
WRITE_HANDLER(ctrl_w)63 static WRITE_HANDLER( ctrl_w )
64 {
65 	irq_enable = data & 0x02;
66 	flip_screen_set(data & 0x08);
67 }
68 
INTERRUPT_GEN(jackal_interrupt)69 INTERRUPT_GEN( jackal_interrupt )
70 {
71 	if (irq_enable)
72 		cpu_set_irq_line(0, 0, HOLD_LINE);
73 }
74 
75 
76 
MEMORY_READ_START(jackal_readmem)77 static MEMORY_READ_START( jackal_readmem )
78 	{ 0x0010, 0x0010, input_port_0_r },
79 	{ 0x0011, 0x0011, input_port_1_r },
80 	{ 0x0012, 0x0012, input_port_2_r },
81 	{ 0x0013, 0x0013, input_port_3_r },
82 	{ 0x0014, 0x0014, rotary_0_r },
83 	{ 0x0015, 0x0015, rotary_1_r },
84 	{ 0x0018, 0x0018, input_port_4_r },
85 	{ 0x0020, 0x005f, jackal_zram_r },	/* MAIN   Z RAM,SUB    Z RAM */
86 	{ 0x0060, 0x1fff, jackal_commonram_r },	/* M COMMON RAM,S COMMON RAM */
87 	{ 0x2000, 0x2fff, jackal_voram_r },	/* MAIN V O RAM,SUB  V O RAM */
88 	{ 0x3000, 0x3fff, jackal_spriteram_r },	/* MAIN V O RAM,SUB  V O RAM */
89 	{ 0x4000, 0xbfff, MRA_BANK1 },
90 	{ 0xc000, 0xffff, MRA_ROM },
91 MEMORY_END
92 
93 static MEMORY_WRITE_START( jackal_writemem )
94 	{ 0x0000, 0x0003, MWA_RAM, &jackal_videoctrl },	/* scroll + other things */
95 	{ 0x0004, 0x0004, ctrl_w },
96 	{ 0x0019, 0x0019, MWA_NOP },	/* possibly watchdog reset */
97 	{ 0x001c, 0x001c, jackal_rambank_w },
98 	{ 0x0020, 0x005f, jackal_zram_w },
99 	{ 0x0060, 0x1fff, jackal_commonram_w },
100 	{ 0x2000, 0x2fff, jackal_voram_w },
101 	{ 0x3000, 0x3fff, jackal_spriteram_w },
102 	{ 0x4000, 0xffff, MWA_ROM },
103 MEMORY_END
104 
105 static MEMORY_READ_START( jackal_sound_readmem )
106 	{ 0x2001, 0x2001, YM2151_status_port_0_r },
107 	{ 0x4000, 0x43ff, MRA_RAM },		/* COLOR RAM (Self test only check 0x4000-0x423f */
108 	{ 0x6000, 0x605f, MRA_RAM },		/* SOUND RAM (Self test check 0x6000-605f, 0x7c00-0x7fff */
109 	{ 0x6060, 0x7fff, jackal_commonram1_r }, /* COMMON RAM */
110 	{ 0x8000, 0xffff, MRA_ROM },
111 MEMORY_END
112 
113 static MEMORY_WRITE_START( jackal_sound_writemem )
114 	{ 0x2000, 0x2000, YM2151_register_port_0_w },
115 	{ 0x2001, 0x2001, YM2151_data_port_0_w },
116 	{ 0x4000, 0x43ff, paletteram_xBBBBBGGGGGRRRRR_w, &paletteram },
117 	{ 0x6000, 0x605f, MWA_RAM },
118 	{ 0x6060, 0x7fff, jackal_commonram1_w },
119 	{ 0x8000, 0xffff, MWA_ROM },
120 MEMORY_END
121 
122 
123 
124 INPUT_PORTS_START( jackal )
125 	PORT_START	/* DSW1 */
126 	PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
127 	PORT_DIPSETTING(    0x02, DEF_STR( 4C_1C ) )
128 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
129 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
130 	PORT_DIPSETTING(    0x04, DEF_STR( 3C_2C ) )
131 	PORT_DIPSETTING(    0x01, DEF_STR( 4C_3C ) )
132 	PORT_DIPSETTING(    0x0f, DEF_STR( 1C_1C ) )
133 	PORT_DIPSETTING(    0x03, DEF_STR( 3C_4C ) )
134 	PORT_DIPSETTING(    0x07, DEF_STR( 2C_3C ) )
135 	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_2C ) )
136 	PORT_DIPSETTING(    0x06, DEF_STR( 2C_5C ) )
137 	PORT_DIPSETTING(    0x0d, DEF_STR( 1C_3C ) )
138 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_4C ) )
139 	PORT_DIPSETTING(    0x0b, DEF_STR( 1C_5C ) )
140 	PORT_DIPSETTING(    0x0a, DEF_STR( 1C_6C ) )
141 	PORT_DIPSETTING(    0x09, DEF_STR( 1C_7C ) )
142 	PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
143 	PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
144 	PORT_DIPSETTING(    0x20, DEF_STR( 4C_1C ) )
145 	PORT_DIPSETTING(    0x50, DEF_STR( 3C_1C ) )
146 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) )
147 	PORT_DIPSETTING(    0x40, DEF_STR( 3C_2C ) )
148 	PORT_DIPSETTING(    0x10, DEF_STR( 4C_3C ) )
149 	PORT_DIPSETTING(    0xf0, DEF_STR( 1C_1C ) )
150 	PORT_DIPSETTING(    0x30, DEF_STR( 3C_4C ) )
151 	PORT_DIPSETTING(    0x70, DEF_STR( 2C_3C ) )
152 	PORT_DIPSETTING(    0xe0, DEF_STR( 1C_2C ) )
153 	PORT_DIPSETTING(    0x60, DEF_STR( 2C_5C ) )
154 	PORT_DIPSETTING(    0xd0, DEF_STR( 1C_3C ) )
155 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_4C ) )
156 	PORT_DIPSETTING(    0xb0, DEF_STR( 1C_5C ) )
157 	PORT_DIPSETTING(    0xa0, DEF_STR( 1C_6C ) )
158 	PORT_DIPSETTING(    0x90, DEF_STR( 1C_7C ) )
159 	PORT_DIPSETTING(    0x00, "Invalid" )
160 
161 	PORT_START	/* IN1 */
162 	/* note that button 3 for player 1 and 2 are exchanged */
163 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER1 )
164 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 )
165 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER1 )
166 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER1 )
167 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 )
168 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 )
169 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
170 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
171 
172 	PORT_START	/* IN2 */
173 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
174 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
175 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
176 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
177 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
178 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
179 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
180 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
181 
182 	PORT_START	/* IN0 */
183 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
184 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
185 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
186 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
187 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
188 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) )
189 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
190 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
191 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
192 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
193 
194 	PORT_START	/* DSW2 */
195 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
196 	PORT_DIPSETTING(    0x03, "2" )
197 	PORT_DIPSETTING(    0x02, "3" )
198 	PORT_DIPSETTING(    0x01, "4" )
199 	PORT_DIPSETTING(    0x00, "7" )
200 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
201 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
202 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
203 	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )
204 	PORT_DIPSETTING(    0x18, "30000 150000" )
205 	PORT_DIPSETTING(    0x10, "50000 200000" )
206 	PORT_DIPSETTING(    0x08, "30000" )
207 	PORT_DIPSETTING(    0x00, "50000" )
208 	PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) )
209 	PORT_DIPSETTING(    0x60, "Easy" )
210 	PORT_DIPSETTING(    0x40, "Medium" )
211 	PORT_DIPSETTING(    0x20, "Hard" )
212 	PORT_DIPSETTING(    0x00, "Hardest" )
213 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
214 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
215 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
216 INPUT_PORTS_END
217 
218 /* identical, plus additional rotary controls */
219 INPUT_PORTS_START( topgunbl )
220 	PORT_START	/* DSW1 */
221 	PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) )
222 	PORT_DIPSETTING(    0x02, DEF_STR( 4C_1C ) )
223 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
224 	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
225 	PORT_DIPSETTING(    0x04, DEF_STR( 3C_2C ) )
226 	PORT_DIPSETTING(    0x01, DEF_STR( 4C_3C ) )
227 	PORT_DIPSETTING(    0x0f, DEF_STR( 1C_1C ) )
228 	PORT_DIPSETTING(    0x03, DEF_STR( 3C_4C ) )
229 	PORT_DIPSETTING(    0x07, DEF_STR( 2C_3C ) )
230 	PORT_DIPSETTING(    0x0e, DEF_STR( 1C_2C ) )
231 	PORT_DIPSETTING(    0x06, DEF_STR( 2C_5C ) )
232 	PORT_DIPSETTING(    0x0d, DEF_STR( 1C_3C ) )
233 	PORT_DIPSETTING(    0x0c, DEF_STR( 1C_4C ) )
234 	PORT_DIPSETTING(    0x0b, DEF_STR( 1C_5C ) )
235 	PORT_DIPSETTING(    0x0a, DEF_STR( 1C_6C ) )
236 	PORT_DIPSETTING(    0x09, DEF_STR( 1C_7C ) )
237 	PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
238 	PORT_DIPNAME( 0xf0, 0xf0, DEF_STR( Coin_B ) )
239 	PORT_DIPSETTING(    0x20, DEF_STR( 4C_1C ) )
240 	PORT_DIPSETTING(    0x50, DEF_STR( 3C_1C ) )
241 	PORT_DIPSETTING(    0x80, DEF_STR( 2C_1C ) )
242 	PORT_DIPSETTING(    0x40, DEF_STR( 3C_2C ) )
243 	PORT_DIPSETTING(    0x10, DEF_STR( 4C_3C ) )
244 	PORT_DIPSETTING(    0xf0, DEF_STR( 1C_1C ) )
245 	PORT_DIPSETTING(    0x30, DEF_STR( 3C_4C ) )
246 	PORT_DIPSETTING(    0x70, DEF_STR( 2C_3C ) )
247 	PORT_DIPSETTING(    0xe0, DEF_STR( 1C_2C ) )
248 	PORT_DIPSETTING(    0x60, DEF_STR( 2C_5C ) )
249 	PORT_DIPSETTING(    0xd0, DEF_STR( 1C_3C ) )
250 	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_4C ) )
251 	PORT_DIPSETTING(    0xb0, DEF_STR( 1C_5C ) )
252 	PORT_DIPSETTING(    0xa0, DEF_STR( 1C_6C ) )
253 	PORT_DIPSETTING(    0x90, DEF_STR( 1C_7C ) )
254 	PORT_DIPSETTING(    0x00, "Invalid" )
255 
256 	PORT_START	/* IN1 */
257 	/* note that button 3 for player 1 and 2 are exchanged */
258 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER1 )
259 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER1 )
260 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER1 )
261 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER1 )
262 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER1 )
263 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER1 )
264 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
265 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
266 
267 	PORT_START	/* IN2 */
268 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT  | IPF_8WAY | IPF_PLAYER2 )
269 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_PLAYER2 )
270 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP    | IPF_8WAY | IPF_PLAYER2 )
271 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN  | IPF_8WAY | IPF_PLAYER2 )
272 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_PLAYER2 )
273 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_PLAYER2 )
274 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
275 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
276 
277 	PORT_START	/* IN0 */
278 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
279 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
280 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
281 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
282 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
283 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) )
284 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
285 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
286 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
287 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
288 
289 	PORT_START	/* DSW2 */
290 	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) )
291 	PORT_DIPSETTING(    0x03, "2" )
292 	PORT_DIPSETTING(    0x02, "3" )
293 	PORT_DIPSETTING(    0x01, "4" )
294 	PORT_DIPSETTING(    0x00, "7" )
295 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
296 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
297 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
298 	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Bonus_Life ) )
299 	PORT_DIPSETTING(    0x18, "30000 150000" )
300 	PORT_DIPSETTING(    0x10, "50000 200000" )
301 	PORT_DIPSETTING(    0x08, "30000" )
302 	PORT_DIPSETTING(    0x00, "50000" )
303 	PORT_DIPNAME( 0x60, 0x60, DEF_STR( Difficulty ) )
304 	PORT_DIPSETTING(    0x60, "Easy" )
305 	PORT_DIPSETTING(    0x40, "Medium" )
306 	PORT_DIPSETTING(    0x20, "Hard" )
307 	PORT_DIPSETTING(    0x00, "Hardest" )
308 	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) )
309 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
310 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
311 
312 	PORT_START	/* player 1 8-way rotary control - converted in rotary_0_r() */
313 	PORT_ANALOGX( 0xff, 0x00, IPT_DIAL, 25, 10, 0, 0, KEYCODE_Z, KEYCODE_X, IP_JOY_NONE, IP_JOY_NONE )
314 
315 	PORT_START	/* player 2 8-way rotary control - converted in rotary_1_r() */
316 	PORT_ANALOGX( 0xff, 0x00, IPT_DIAL | IPF_PLAYER2, 25, 10, 0, 0, KEYCODE_N, KEYCODE_M, IP_JOY_NONE, IP_JOY_NONE )
317 INPUT_PORTS_END
318 
319 
320 
321 static struct GfxLayout charlayout =
322 {
323 	8,8,
324 	RGN_FRAC(1,4),
325 	8,	/* 8 bits per pixel (!) */
326 	{ 0, 1, 2, 3, RGN_FRAC(1,2)+0, RGN_FRAC(1,2)+1, RGN_FRAC(1,2)+2, RGN_FRAC(1,2)+3 },
327 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
328 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
329 	32*8
330 };
331 
332 static struct GfxLayout spritelayout =
333 {
334 	16,16,
335 	RGN_FRAC(1,4),
336 	4,
337 	{ 0, 1, 2, 3 },
338 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
339 			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 },
340 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
341 			16*32, 17*32, 18*32, 19*32, 20*32, 21*32, 22*32, 23*32 },
342 	32*32
343 };
344 
345 static struct GfxLayout spritelayout8 =
346 {
347 	8,8,
348 	RGN_FRAC(1,4),
349 	4,
350 	{ 0, 1, 2, 3 },
351 	{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
352 	{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
353 	32*8
354 };
355 
356 static struct GfxDecodeInfo jackal_gfxdecodeinfo[] =
357 {
358 	{ REGION_GFX1, 0x00000, &charlayout,               0, 16 },	/* colors 256-511 with lookup */
359 	{ REGION_GFX1, 0x20000, &spritelayout,        256*16, 16 },	/* colors   0- 15 with lookup */
360 	{ REGION_GFX1, 0x20000, &spritelayout8,       256*16, 16 },	/* to handle 8x8 sprites */
361 	{ REGION_GFX1, 0x60000, &spritelayout,  256*16+16*16, 16 },	/* colors  16- 31 with lookup */
362 	{ REGION_GFX1, 0x60000, &spritelayout8, 256*16+16*16, 16 },	/* to handle 8x8 sprites */
363 	{ -1 } /* end of array */
364 };
365 
366 
367 
368 static struct YM2151interface ym2151_interface =
369 {
370 	1,
371 	3580000,
372 	{ YM3012_VOL(50,MIXER_PAN_LEFT,50,MIXER_PAN_RIGHT) },
373 	{ 0 },
374 };
375 
376 
377 static MACHINE_DRIVER_START( jackal )
378 
379 	/* basic machine hardware */
380 	MDRV_CPU_ADD(M6809, 2000000)	/* 2 MHz???? */
381 	MDRV_CPU_MEMORY(jackal_readmem,jackal_writemem)
382 	MDRV_CPU_VBLANK_INT(jackal_interrupt,1)
383 
384 	MDRV_CPU_ADD(M6809, 2000000)	/* 2 MHz???? */
385 	MDRV_CPU_MEMORY(jackal_sound_readmem,jackal_sound_writemem)
386 
387 	MDRV_FRAMES_PER_SECOND(60)
388 	MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION)
389 	MDRV_INTERLEAVE(10)	/* 10 CPU slices per frame - seems enough to keep the CPUs in sync */
390 
391 	MDRV_MACHINE_INIT(jackal)
392 
393 	/* video hardware */
394 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
395 	MDRV_SCREEN_SIZE(32*8, 32*8)
396 	MDRV_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
397 	MDRV_GFXDECODE(jackal_gfxdecodeinfo)
398 	MDRV_PALETTE_LENGTH(512)
399 	MDRV_COLORTABLE_LENGTH(256*16+16*16+16*16)
400 
401 	MDRV_PALETTE_INIT(jackal)
402 	MDRV_VIDEO_START(jackal)
403 	MDRV_VIDEO_UPDATE(jackal)
404 
405 	/* sound hardware */
406 	MDRV_SOUND_ATTRIBUTES(SOUND_SUPPORTS_STEREO)
407 	MDRV_SOUND_ADD(YM2151, ym2151_interface)
408 MACHINE_DRIVER_END
409 
410 
411 
412 /***************************************************************************
413 
414   Game driver(s)
415 
416 ***************************************************************************/
417 
418 ROM_START( jackal )
419 	ROM_REGION( 0x20000, REGION_CPU1, 0 )	/* Banked 64k for 1st CPU */
420 	ROM_LOAD( "j-v02.rom",    0x04000, 0x8000, CRC(0b7e0584) SHA1(e4019463345a4c020d5a004c9a400aca4bdae07b) )
421 	ROM_CONTINUE(             0x14000, 0x8000 )
422 	ROM_LOAD( "j-v03.rom",    0x0c000, 0x4000, CRC(3e0dfb83) SHA1(5ba7073751eee33180e51143b348256597909516) )
423 
424 	ROM_REGION( 0x10000, REGION_CPU2, 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
425 	ROM_LOAD( "631t01.bin",   0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
426 
427 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
428 	ROM_LOAD16_BYTE( "631t04.bin",   0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) )
429 	ROM_LOAD16_BYTE( "631t05.bin",   0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) )
430 	ROM_LOAD16_BYTE( "631t06.bin",   0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) )
431 	ROM_LOAD16_BYTE( "631t07.bin",   0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) )
432 
433 	ROM_REGION( 0x0200, REGION_PROMS, 0 )	/* color lookup tables */
434 	ROM_LOAD( "631r08.bpr",   0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
435 	ROM_LOAD( "631r09.bpr",   0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
436 ROM_END
437 
438 ROM_START( topgunr )
439 	ROM_REGION( 0x20000, REGION_CPU1, 0 )	/* Banked 64k for 1st CPU */
440 	ROM_LOAD( "tgnr15d.bin",  0x04000, 0x8000, CRC(f7e28426) SHA1(db2d5f252a574b8aa4d8406a8e93b423fd2a7fef) )
441 	ROM_CONTINUE(             0x14000, 0x8000 )
442 	ROM_LOAD( "tgnr16d.bin",  0x0c000, 0x4000, CRC(c086844e) SHA1(4d6f27ac3aabb4b2d673aa619e407e417ad89337) )
443 
444 	ROM_REGION( 0x10000, REGION_CPU2, 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
445 	ROM_LOAD( "631t01.bin",   0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
446 
447 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
448 	ROM_LOAD16_BYTE( "tgnr7h.bin",   0x00000, 0x20000, CRC(50122a12) SHA1(c9e0132a3a40d9d28685c867c70231947d8a9cb7) )
449 	ROM_LOAD16_BYTE( "tgnr8h.bin",   0x00001, 0x20000, CRC(6943b1a4) SHA1(40de2b434600ea4c8fb42e6b21be2c3705a55d67) )
450 	ROM_LOAD16_BYTE( "tgnr12h.bin",  0x40000, 0x20000, CRC(37dbbdb0) SHA1(f94db780d69e7dd40231a75629af79469d957378) )
451 	ROM_LOAD16_BYTE( "tgnr13h.bin",  0x40001, 0x20000, CRC(22effcc8) SHA1(4d174b0ce64def32050f87343c4b1424e0fef6f7) )
452 
453 	ROM_REGION( 0x0200, REGION_PROMS, 0 )	/* color lookup tables */
454 	ROM_LOAD( "631r08.bpr",   0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
455 	ROM_LOAD( "631r09.bpr",   0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
456 ROM_END
457 
458 ROM_START( jackalj )
459 	ROM_REGION( 0x20000, REGION_CPU1, 0 )	/* Banked 64k for 1st CPU */
460 	ROM_LOAD( "631t02.bin",   0x04000, 0x8000, CRC(14db6b1a) SHA1(b469ea50aa94a2bda3bd0442300aa1272e5f30c4) )
461 	ROM_CONTINUE(             0x14000, 0x8000 )
462 	ROM_LOAD( "631t03.bin",   0x0c000, 0x4000, CRC(fd5f9624) SHA1(2520c1ff54410ef498ecbf52877f011900baed4c) )
463 
464 	ROM_REGION( 0x10000, REGION_CPU2, 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
465 	ROM_LOAD( "631t01.bin",   0x8000, 0x8000, CRC(b189af6a) SHA1(f7df996c394fdd6f2ce128a8df38d7838f7ec6d6) )
466 
467 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
468 	ROM_LOAD16_BYTE( "631t04.bin",   0x00000, 0x20000, CRC(457f42f0) SHA1(08413a13d128875dddcf4f6ad302363096bf1d41) )
469 	ROM_LOAD16_BYTE( "631t05.bin",   0x00001, 0x20000, CRC(732b3fc1) SHA1(7e89650b9e5e2b7ae82f8c55ac9995740f6fdfe1) )
470 	ROM_LOAD16_BYTE( "631t06.bin",   0x40000, 0x20000, CRC(2d10e56e) SHA1(447b464ea725fb9ef87da067a41bcf463b427cce) )
471 	ROM_LOAD16_BYTE( "631t07.bin",   0x40001, 0x20000, CRC(4961c397) SHA1(b430df58fc3bb722d6fb23bed7d04afdb7e5d9c1) )
472 
473 	ROM_REGION( 0x0200, REGION_PROMS, 0 )	/* color lookup tables */
474 	ROM_LOAD( "631r08.bpr",   0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
475 	ROM_LOAD( "631r09.bpr",   0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
476 ROM_END
477 
478 ROM_START( topgunbl )
479 	ROM_REGION( 0x20000, REGION_CPU1, 0 )	/* Banked 64k for 1st CPU */
480 	ROM_LOAD( "t-3.c5",       0x04000, 0x8000, CRC(7826ad38) SHA1(875e87867924905b9b83bc203eb7ffe81cf72233) )
481 	ROM_LOAD( "t-4.c4",       0x14000, 0x8000, CRC(976c8431) SHA1(c199f57c25380d741aec85b0e0bfb6acf383e6a6) )
482 	ROM_LOAD( "t-2.c6",       0x0c000, 0x4000, CRC(d53172e5) SHA1(44b7f180c17f9a121a2f06f2d3471920a8989e21) )
483 
484 	ROM_REGION( 0x10000, REGION_CPU2, 0 )     /* 64k for 2nd cpu (Graphics & Sound)*/
485 	ROM_LOAD( "t-1.c14",      0x8000, 0x8000, CRC(54aa2d29) SHA1(ebc6b3a5db5120cc33d62e3213d0e881f658282d) )
486 
487 	ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE )
488 	ROM_LOAD16_BYTE( "tgnr7h.bin",   0x00000, 0x20000, CRC(50122a12) SHA1(c9e0132a3a40d9d28685c867c70231947d8a9cb7) )
489 	ROM_LOAD16_BYTE( "tgnr8h.bin",   0x00001, 0x20000, CRC(6943b1a4) SHA1(40de2b434600ea4c8fb42e6b21be2c3705a55d67) )
490 	ROM_LOAD16_BYTE( "tgnr12h.bin",  0x40000, 0x20000, CRC(37dbbdb0) SHA1(f94db780d69e7dd40231a75629af79469d957378) )
491 	ROM_LOAD16_BYTE( "tgnr13h.bin",  0x40001, 0x20000, CRC(22effcc8) SHA1(4d174b0ce64def32050f87343c4b1424e0fef6f7) )
492 
493 #if 0
494 	same data, different layout (and one bad ROM)
495 	ROM_LOAD16_WORD_SWAP( "t-17.n12",     0x00000, 0x08000, CRC(e8875110) )
496 	ROM_LOAD16_WORD_SWAP( "t-18.n13",     0x08000, 0x08000, CRC(cf14471d) )
497 	ROM_LOAD16_WORD_SWAP( "t-19.n14",     0x10000, 0x08000, CRC(46ee5dd2) )
498 	ROM_LOAD16_WORD_SWAP( "t-20.n15",     0x18000, 0x08000, CRC(3f472344) )
499 	ROM_LOAD16_WORD_SWAP( "t-6.n1",       0x20000, 0x08000, CRC(539cc48c) )
500 	ROM_LOAD16_WORD_SWAP( "t-5.m1",       0x28000, 0x08000, BAD_DUMP CRC(2dd9a5e9) )
501 	ROM_LOAD16_WORD_SWAP( "t-7.n2",       0x30000, 0x08000, CRC(0ecd31b1) )
502 	ROM_LOAD16_WORD_SWAP( "t-8.n3",       0x38000, 0x08000, CRC(f946ada7) )
503 	ROM_LOAD16_WORD_SWAP( "t-13.n8",      0x40000, 0x08000, CRC(5d669abb) )
504 	ROM_LOAD16_WORD_SWAP( "t-14.n9",      0x48000, 0x08000, CRC(f349369b) )
505 	ROM_LOAD16_WORD_SWAP( "t-15.n10",     0x50000, 0x08000, CRC(7c5a91dd) )
506 	ROM_LOAD16_WORD_SWAP( "t-16.n11",     0x58000, 0x08000, CRC(5ec46d8e) )
507 	ROM_LOAD16_WORD_SWAP( "t-9.n4",       0x60000, 0x08000, CRC(8269caca) )
508 	ROM_LOAD16_WORD_SWAP( "t-10.n5",      0x68000, 0x08000, CRC(25393e4f) )
509 	ROM_LOAD16_WORD_SWAP( "t-11.n6",      0x70000, 0x08000, CRC(7895c22d) )
510 	ROM_LOAD16_WORD_SWAP( "t-12.n7",      0x78000, 0x08000, CRC(15606dfc) )
511 #endif
512 
513 	ROM_REGION( 0x0200, REGION_PROMS, 0 )	/* color lookup tables */
514 	ROM_LOAD( "631r08.bpr",   0x0000, 0x0100, CRC(7553a172) SHA1(eadf1b4157f62c3af4602da764268df954aa0018) )
515 	ROM_LOAD( "631r09.bpr",   0x0100, 0x0100, CRC(a74dd86c) SHA1(571f606f8fc0fd3d98d26761de79ccb4cc9ab044) )
516 ROM_END
517 
518 
519 
520 GAMEX( 1986, jackal,   0,      jackal, jackal,   0, ROT90, "Konami", "Jackal (World)", GAME_IMPERFECT_COLORS | GAME_NO_COCKTAIL )
521 GAMEX( 1986, topgunr,  jackal, jackal, jackal,   0, ROT90, "Konami", "Top Gunner (US)", GAME_IMPERFECT_COLORS | GAME_NO_COCKTAIL )
522 GAMEX( 1986, jackalj,  jackal, jackal, jackal,   0, ROT90, "Konami", "Tokushu Butai Jackal (Japan)", GAME_IMPERFECT_COLORS | GAME_NO_COCKTAIL )
523 GAMEX( 1986, topgunbl, jackal, jackal, topgunbl, 0, ROT90, "bootleg", "Top Gunner (bootleg)", GAME_IMPERFECT_COLORS | GAME_NO_COCKTAIL )
524