1 /***************************************************************************
2 
3 Atari Wolf Pack (prototype) driver
4 
5 ***************************************************************************/
6 
7 #include "driver.h"
8 
9 extern int wolfpack_collision;
10 
11 extern UINT8* wolfpack_alpha_num_ram;
12 
13 extern VIDEO_UPDATE( wolfpack );
14 extern VIDEO_START( wolfpack );
15 extern VIDEO_EOF( wolfpack );
16 
17 extern WRITE_HANDLER( wolfpack_video_invert_w );
18 extern WRITE_HANDLER( wolfpack_ship_reflect_w );
19 extern WRITE_HANDLER( wolfpack_pt_pos_select_w );
20 extern WRITE_HANDLER( wolfpack_pt_horz_w );
21 extern WRITE_HANDLER( wolfpack_pt_pic_w );
22 extern WRITE_HANDLER( wolfpack_ship_h_w );
23 extern WRITE_HANDLER( wolfpack_torpedo_pic_w );
24 extern WRITE_HANDLER( wolfpack_ship_size_w );
25 extern WRITE_HANDLER( wolfpack_ship_h_precess_w );
26 extern WRITE_HANDLER( wolfpack_ship_pic_w );
27 extern WRITE_HANDLER( wolfpack_torpedo_h_w );
28 extern WRITE_HANDLER( wolfpack_torpedo_v_w );
29 
30 
periodic_callback(int scanline)31 static void periodic_callback(int scanline)
32 {
33 	cpu_set_nmi_line(0, PULSE_LINE);
34 
35 	scanline += 64;
36 
37 	if (scanline >= 262)
38 	{
39 		scanline = 0;
40 	}
41 
42 	timer_set(cpu_getscanlinetime(scanline), scanline, periodic_callback);
43 }
44 
45 
MACHINE_INIT(wolfpack)46 static MACHINE_INIT( wolfpack )
47 {
48 	timer_set(cpu_getscanlinetime(0), 0, periodic_callback);
49 }
50 
51 
PALETTE_INIT(wolfpack)52 static PALETTE_INIT( wolfpack )
53 {
54 	int i;
55 
56 	palette_set_color(0, 0x00, 0x00, 0x00);
57 	palette_set_color(1, 0xc1, 0xc1, 0xc1);
58 	palette_set_color(2, 0x81, 0x81, 0x81);
59 	palette_set_color(3, 0x48, 0x48, 0x48);
60 
61 	for (i = 0; i < 4; i++)
62 	{
63 		UINT8 r, g, b;
64 
65 		palette_get_color(i, &r, &g, &b);
66 
67 		palette_set_color(4 + i,
68 			r < 0xb8 ? r + 0x48 : 0xff,
69 			g < 0xb8 ? g + 0x48 : 0xff,
70 			b < 0xb8 ? b + 0x48 : 0xff);
71 	}
72 
73 	colortable[0] = 0;
74 	colortable[1] = 1;
75 	colortable[2] = 1;
76 	colortable[3] = 0;
77 	colortable[4] = 0;
78 	colortable[5] = 2;
79 	colortable[6] = 0;
80 	colortable[7] = 3;
81 }
82 
83 
READ_HANDLER(wolfpack_zeropage_r)84 static READ_HANDLER( wolfpack_zeropage_r )
85 {
86 	return memory_region(REGION_CPU1)[offset & 0xff];
87 }
88 
89 
READ_HANDLER(wolfpack_input_r)90 static READ_HANDLER( wolfpack_input_r )
91 {
92 	UINT8 val = readinputport(0);
93 
94 	if (((readinputport(2) + 0) / 2) & 1)
95 	{
96 		val |= 1;
97 	}
98 	if (((readinputport(2) + 1) / 2) & 1)
99 	{
100 		val |= 2;
101 	}
102 
103 	return val;
104 }
105 
106 
READ_HANDLER(wolfpack_misc_r)107 static READ_HANDLER( wolfpack_misc_r )
108 {
109 	UINT8 val = 0;
110 
111 	/* BIT0 => SPEECH BUSY */
112 	/* BIT1 => COMP SIREN  */
113 	/* BIT2 => SPARE       */
114 	/* BIT3 => SPARE       */
115 	/* BIT4 => COL DETECT  */
116 	/* BIT5 => UNUSED      */
117 	/* BIT6 => UNUSED      */
118 	/* BIT7 => VBLANK      */
119 
120 	if (!wolfpack_collision)
121 	{
122 		val |= 0x10;
123 	}
124 	if (cpu_getscanline() >= 240)
125 	{
126 		val |= 0x80;
127 	}
128 
129 	return val;
130 }
131 
132 
WRITE_HANDLER(wolfpack_zeropage_w)133 static WRITE_HANDLER( wolfpack_zeropage_w )
134 {
135 	memory_region(REGION_CPU1)[offset & 0xff] = data;
136 }
137 
138 
WRITE_HANDLER(wolfpack_high_explo_w)139 static WRITE_HANDLER( wolfpack_high_explo_w ) { }
WRITE_HANDLER(wolfpack_sonar_ping_w)140 static WRITE_HANDLER( wolfpack_sonar_ping_w ) {}
WRITE_HANDLER(wolfpack_sirlat_w)141 static WRITE_HANDLER( wolfpack_sirlat_w ) {}
WRITE_HANDLER(wolfpack_pt_sound_w)142 static WRITE_HANDLER( wolfpack_pt_sound_w ) {}
WRITE_HANDLER(wolfpack_start_speech_w)143 static WRITE_HANDLER( wolfpack_start_speech_w ) {}
WRITE_HANDLER(wolfpack_launch_torpedo_w)144 static WRITE_HANDLER( wolfpack_launch_torpedo_w ) {}
WRITE_HANDLER(wolfpack_low_explo_w)145 static WRITE_HANDLER( wolfpack_low_explo_w ) {}
WRITE_HANDLER(wolfpack_screw_cont_w)146 static WRITE_HANDLER( wolfpack_screw_cont_w ) {}
WRITE_HANDLER(wolfpack_lamp_flash_w)147 static WRITE_HANDLER( wolfpack_lamp_flash_w ) {}
WRITE_HANDLER(wolfpack_warning_light_w)148 static WRITE_HANDLER( wolfpack_warning_light_w ) {}
WRITE_HANDLER(wolfpack_audamp_w)149 static WRITE_HANDLER( wolfpack_audamp_w ) {}
WRITE_HANDLER(wolfpack_word_w)150 static WRITE_HANDLER( wolfpack_word_w ) {}
151 
152 
WRITE_HANDLER(wolfpack_attract_w)153 static WRITE_HANDLER( wolfpack_attract_w )
154 {
155 	coin_lockout_global_w(!(data & 1));
156 }
157 
158 
WRITE_HANDLER(wolfpack_credit_w)159 static WRITE_HANDLER( wolfpack_credit_w )
160 {
161 	set_led_status(0, !(data & 1));
162 }
163 
164 
WRITE_HANDLER(wolfpack_coldetres_w)165 static WRITE_HANDLER( wolfpack_coldetres_w )
166 {
167 	wolfpack_collision = 0;
168 }
169 
170 
MEMORY_READ_START(wolfpack_readmem)171 static MEMORY_READ_START( wolfpack_readmem )
172 	{ 0x0000, 0x00ff, MRA_RAM },
173 	{ 0x0100, 0x01ff, wolfpack_zeropage_r },
174 	{ 0x1000, 0x1000, wolfpack_input_r },
175 	{ 0x2000, 0x2000, wolfpack_misc_r },
176 	{ 0x3000, 0x3000, input_port_1_r },
177 	{ 0x7000, 0x7fff, MRA_ROM },
178 	{ 0x9000, 0x9000, MRA_NOP }, /* debugger ROM location? */
179 	{ 0xf000, 0xffff, MRA_ROM },
180 MEMORY_END
181 
182 
183 static MEMORY_WRITE_START( wolfpack_writemem )
184 	{ 0x0000, 0x00ff, MWA_RAM },
185 	{ 0x0100, 0x01ff, wolfpack_zeropage_w },
186 	{ 0x1000, 0x10ff, MWA_RAM, &wolfpack_alpha_num_ram },
187 	{ 0x2000, 0x2000, wolfpack_high_explo_w },
188 	{ 0x2001, 0x2001, wolfpack_sonar_ping_w },
189 	{ 0x2002, 0x2002, wolfpack_sirlat_w },
190 	{ 0x2003, 0x2003, wolfpack_pt_sound_w },
191 	{ 0x2004, 0x2004, wolfpack_start_speech_w },
192 	{ 0x2005, 0x2005, wolfpack_launch_torpedo_w },
193 	{ 0x2006, 0x2006, wolfpack_low_explo_w },
194 	{ 0x2007, 0x2007, wolfpack_screw_cont_w },
195 	{ 0x2008, 0x2008, wolfpack_video_invert_w },
196 	{ 0x2009, 0x2009, wolfpack_ship_reflect_w },
197 	{ 0x200a, 0x200a, wolfpack_lamp_flash_w },
198 	{ 0x200c, 0x200c, wolfpack_credit_w },
199 	{ 0x200d, 0x200d, wolfpack_attract_w },
200 	{ 0x200e, 0x200e, wolfpack_pt_pos_select_w },
201 	{ 0x200f, 0x200f, wolfpack_warning_light_w },
202 	{ 0x3000, 0x3000, wolfpack_audamp_w },
203 	{ 0x3001, 0x3001, wolfpack_pt_horz_w },
204 	{ 0x3003, 0x3003, wolfpack_pt_pic_w },
205 	{ 0x3004, 0x3004, wolfpack_word_w },
206 	{ 0x3007, 0x3007, wolfpack_coldetres_w },
207 	{ 0x4000, 0x4000, wolfpack_ship_h_w },
208 	{ 0x4001, 0x4001, wolfpack_torpedo_pic_w },
209 	{ 0x4002, 0x4002, wolfpack_ship_size_w },
210 	{ 0x4003, 0x4003, wolfpack_ship_h_precess_w },
211 	{ 0x4004, 0x4004, wolfpack_ship_pic_w },
212 	{ 0x4005, 0x4005, wolfpack_torpedo_h_w },
213 	{ 0x4006, 0x4006, wolfpack_torpedo_v_w },
214 	{ 0x5000, 0x5fff, watchdog_reset_w },
215 	{ 0x7000, 0x7fff, MWA_ROM },
216 	{ 0xf000, 0xffff, MWA_ROM },
217 MEMORY_END
218 
219 
220 INPUT_PORTS_START( wolfpack )
221 
222 	PORT_START
223 	PORT_BIT ( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) /* dial connects here */
224 	PORT_BIT ( 0x04, IP_ACTIVE_LOW, IPT_TILT )
225 	PORT_BIT ( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 )
226 	PORT_SERVICE( 0x10, IP_ACTIVE_HIGH )
227 	PORT_BIT ( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
228 	PORT_BIT ( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
229 	PORT_BIT ( 0x80, IP_ACTIVE_LOW, IPT_COIN2 )
230 
231 	PORT_START
232 	PORT_DIPNAME( 0x03, 0x01, DEF_STR( Coinage ) )
233 	PORT_DIPSETTING(    0x03, DEF_STR( 4C_1C ) )
234 	PORT_DIPSETTING(    0x02, DEF_STR( 2C_1C ) )
235 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_1C ) )
236 	PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
237 	PORT_DIPNAME( 0x04, 0x00, "Extended Play" )
238 	PORT_DIPSETTING(    0x04, DEF_STR( No ) )
239 	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
240 	PORT_DIPNAME( 0x18, 0x08, "Play Time" )
241 	PORT_DIPSETTING(    0x00, "65 seconds" )
242 	PORT_DIPSETTING(    0x08, "97 seconds" )
243 	PORT_DIPSETTING(    0x10, "130 seconds" )
244 	PORT_DIPSETTING(    0x18, "160 seconds" )
245 	PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) /* demo sound? */
246 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
247 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
248 	PORT_DIPNAME( 0xc0, 0x80, "Score for Extended Play" )
249 	PORT_DIPSETTING(    0x00, "8000" )
250 	PORT_DIPSETTING(    0x40, "12000" )
251 	PORT_DIPSETTING(    0x80, "16000" )
252 	PORT_DIPSETTING(    0xc0, "20000" )
253 
254 	PORT_START
255 	PORT_ANALOG( 0xff, 0x80, IPT_DIAL, 30, 5, 0, 255)
256 INPUT_PORTS_END
257 
258 
259 static struct GfxLayout tile_layout =
260 {
261 	16, 8,
262 	64,
263 	1,
264 	{ 0 },
265 	{
266 		0x7, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4,
267 		0xf, 0xf, 0xe, 0xe, 0xd, 0xd, 0xc, 0xc
268 	},
269 	{
270 		0x70, 0x60, 0x50, 0x40, 0x30, 0x20, 0x10, 0x00
271 	},
272 	0x80
273 };
274 
275 
276 static struct GfxLayout ship_layout =
277 {
278 	64, 16,
279 	16,
280 	1,
281 	{ 0 },
282 	{
283 		0x04, 0x05, 0x06, 0x07, 0x0c, 0x0d, 0x0e, 0x0f,
284 		0x14, 0x15, 0x16, 0x17, 0x1c, 0x1d, 0x1e, 0x1f,
285 		0x24, 0x25, 0x26, 0x27, 0x2c, 0x2d, 0x2e, 0x2f,
286 		0x34, 0x35, 0x36, 0x37, 0x3c, 0x3d, 0x3e, 0x3f,
287 		0x44, 0x45, 0x46, 0x47, 0x4c, 0x4d, 0x4e, 0x4f,
288 		0x54, 0x55, 0x56, 0x57, 0x5c, 0x5d, 0x5e, 0x5f,
289 		0x64, 0x65, 0x66, 0x67, 0x6c, 0x6d, 0x6e, 0x6f,
290 		0x74, 0x75, 0x76, 0x77, 0x7c, 0x7d, 0x7e, 0x7f
291 	},
292 	{
293 		0x780, 0x700, 0x680, 0x600, 0x580, 0x500, 0x480, 0x400,
294 		0x380, 0x300, 0x280, 0x200, 0x180, 0x100, 0x080, 0x000
295 	},
296 	0x800
297 };
298 
299 
300 static struct GfxLayout pt_layout =
301 {
302 	64, 8,
303 	16,
304 	1,
305 	{ 0 },
306 	{
307 		0x3f, 0x3f, 0x3e, 0x3e, 0x3d, 0x3d, 0x3c, 0x3c,
308 		0x37, 0x37, 0x36, 0x36, 0x35, 0x35, 0x34, 0x34,
309 		0x2f, 0x2f, 0x2e, 0x2e, 0x2d, 0x2d, 0x2c, 0x2c,
310 		0x27, 0x27, 0x26, 0x26, 0x25, 0x25, 0x24, 0x24,
311 		0x1f, 0x1f, 0x1e, 0x1e, 0x1d, 0x1d, 0x1c, 0x1c,
312 		0x17, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14,
313 		0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c,
314 		0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04
315 	},
316 	{
317 		0x000, 0x040, 0x080, 0x0c0, 0x100, 0x140, 0x180, 0x1c0
318 	},
319 	0x200
320 };
321 
322 
323 static struct GfxLayout torpedo_layout =
324 {
325 	16, 32,
326 	16,
327 	1,
328 	{ 0 },
329 	{
330 		0x4, 0x4, 0x5, 0x5, 0x6, 0x6, 0x7, 0x7,
331 		0xc, 0xc, 0xd, 0xd, 0xe, 0xe, 0xf, 0xf
332 	},
333 	{
334 		0x000, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070,
335 		0x080, 0x090, 0x0a0, 0x0b0, 0x0c0, 0x0d0, 0x0e0, 0x0f0,
336 		0x100, 0x110, 0x120, 0x130, 0x140, 0x150, 0x160, 0x170,
337 		0x180, 0x190, 0x1a0, 0x1b0, 0x1c0, 0x1d0, 0x1e0, 0x1f0
338 	},
339 	0x0200
340 };
341 
342 
343 static struct GfxDecodeInfo gfxdecodeinfo[] =
344 {
345 	{ REGION_GFX1, 0, &tile_layout, 0, 2 },
346 	{ REGION_GFX2, 0, &ship_layout, 6, 1 },
347 	{ REGION_GFX3, 0, &pt_layout, 0, 1 },
348 	{ REGION_GFX4, 0, &torpedo_layout, 4, 1 },
349 	{ -1 } /* end of array */
350 };
351 
352 
353 static MACHINE_DRIVER_START(wolfpack)
354 
355 	/* basic machine hardware */
356 	MDRV_CPU_ADD(M6502, 12096000 / 16)
357 	MDRV_CPU_MEMORY(wolfpack_readmem, wolfpack_writemem)
358 
359 	MDRV_FRAMES_PER_SECOND(60)
360 
361 	/* video hardware */
362 	MDRV_MACHINE_INIT(wolfpack)
363 
364 	MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
365 	MDRV_SCREEN_SIZE(512, 262)
366 	MDRV_VISIBLE_AREA(0, 511, 16, 239)
367 	MDRV_GFXDECODE(gfxdecodeinfo)
368 	MDRV_PALETTE_LENGTH(8)
369 	MDRV_COLORTABLE_LENGTH(8)
370 	MDRV_PALETTE_INIT(wolfpack)
371 	MDRV_VIDEO_START(wolfpack)
372 	MDRV_VIDEO_UPDATE(wolfpack)
373 	MDRV_VIDEO_EOF(wolfpack)
374 
375 	/* sound hardware */
376 MACHINE_DRIVER_END
377 
378 
379 ROM_START( wolfpack )
380 	ROM_REGION( 0x10000, REGION_CPU1, 0 )
381 	ROM_LOAD_NIB_LOW ( "30285.e3", 0x7000, 0x0800, CRC(b4d30b33) SHA1(46645c227828632b57244bdccad455e1831b5273) )
382 	ROM_RELOAD       (             0xF000, 0x0800 )
383 	ROM_LOAD_NIB_HIGH( "30287.g3", 0x7000, 0x0800, CRC(c6300dc9) SHA1(6a0ec0bfa6ad4c870aa6f21bfde094da6975b58b) )
384 	ROM_RELOAD       (             0xF000, 0x0800 )
385 	ROM_LOAD_NIB_LOW ( "30286.f3", 0x7800, 0x0800, CRC(17dce9e8) SHA1(9c7bac1aa676548dc7908f1518efd58c72645ab7) )
386 	ROM_RELOAD       (             0xF800, 0x0800 )
387 	ROM_LOAD_NIB_HIGH( "30288.h3", 0x7800, 0x0800, CRC(b80ab7b6) SHA1(f2ede98ac5337064499ae2262a8a81f83505bd66) )
388 	ROM_RELOAD       (             0xF800, 0x0800 )
389 
390 	ROM_REGION( 0x0400, REGION_GFX1, ROMREGION_DISPOSE )
391 	ROM_LOAD( "30291.c1", 0x0000, 0x0400, CRC(7e3d22cf) SHA1(92e6bbe049dc8fcd674f2ff96cde3786f714508d) )
392 
393 	ROM_REGION( 0x1000, REGION_GFX2, ROMREGION_DISPOSE )
394 	ROM_LOAD( "30289.j6", 0x0000, 0x0800, CRC(f63e5629) SHA1(d64f19fc62060d395df5bb8663a7694a23b0aa2e) )
395 	ROM_LOAD( "30290.k6", 0x0800, 0x0800, CRC(70d5430e) SHA1(d512fc3bb0cf0816a1c987f7188c4b331303347f) )
396 
397 	ROM_REGION( 0x0400, REGION_GFX3, ROMREGION_DISPOSE )
398 	ROM_LOAD( "30294.p4", 0x0000, 0x0400, CRC(ea93f4b9) SHA1(48b4e0136f5349eb53fea7127a969d87457d70f9) )
399 
400 	ROM_REGION( 0x0400, REGION_GFX4, ROMREGION_DISPOSE )
401 	ROM_LOAD( "30293.m6", 0x0000, 0x0400, CRC(11900d47) SHA1(2dcb3c3488a5e9ed7f1751649f8dc25696f0f57a) )
402 
403 	ROM_REGION( 0x0800, REGION_SOUND1, ROMREGION_DISPOSE ) /* voice data */
404 	ROM_LOAD_NIB_LOW ( "30863.r1", 0x0000, 0x0800, CRC(3f779f13) SHA1(8ed8a1bf680e8277066416f467388e3875e8cbbd) )
405 	ROM_LOAD_NIB_HIGH( "30864.r3", 0x0000, 0x0800, CRC(c4a58d1d) SHA1(a2ba9354b99c739bbfa94458d671c109be163ca0) )
406 ROM_END
407 
408 
409 GAMEX( 1978, wolfpack, 0, wolfpack, wolfpack, 0, ORIENTATION_FLIP_Y, "Atari", "Wolf Pack (prototype)", GAME_NO_SOUND )
410