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