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