summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/tunhunt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/tunhunt.cpp')
-rw-r--r--src/mame/drivers/tunhunt.cpp396
1 files changed, 396 insertions, 0 deletions
diff --git a/src/mame/drivers/tunhunt.cpp b/src/mame/drivers/tunhunt.cpp
new file mode 100644
index 00000000000..cc567c6778e
--- /dev/null
+++ b/src/mame/drivers/tunhunt.cpp
@@ -0,0 +1,396 @@
+// license:BSD-3-Clause
+// copyright-holders:Phil Stroffolino, David Haywood
+/***************************************************************************
+
+ Atari Tunnel Hunt hardware
+
+ Games supported:
+ * Tunnel Hunt
+
+ Known issues:
+ * see below
+
+****************************************************************************
+
+ MAME driver for Tunnel Hunt (C)1981
+ (aka Tube Chase)
+ Developed by Atari
+ Hardware by Dave Sherman
+ Game Programmed by Owen Rubin
+ Licensed and Distributed by Centuri
+
+ Many thanks to Owen Rubin for invaluable hardware information and
+ game description!
+
+ Known Issues:
+
+ Colors:
+ - Hues are hardcoded. There doesn't appear to be any logical way to
+ map the color proms so that the correct colors appear.
+ See last page of schematics for details. Are color proms bad?
+ (shouldn't be, both sets were the same)
+
+ Shell Objects:
+ - vstretch/placement/color handling isn't confirmed
+ - two bitplanes per character or two banks?
+
+ Motion Object:
+ - enemy ships look funny when they get close (to ram player)
+ - stretch probably isn't implemented correctly (see splash screen
+ with zooming "TUNNEL HUNT" logo.
+ - colors may not be mapped correctly.
+
+ Square Generator:
+ - needs optimization
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "sound/pokey.h"
+#include "includes/tunhunt.h"
+
+
+/*************************************
+ *
+ * Output ports
+ *
+ *************************************/
+
+WRITE8_MEMBER(tunhunt_state::control_w)
+{
+ /*
+ 0x01 coin counter#2 "right counter"
+ 0x02 coin counter#1 "center counter"
+ 0x04 "left counter"
+ 0x08 cover screen (shell0 hstretch)
+ 0x10 cover screen (shell1 hstretch)
+ 0x40 start LED
+ 0x80 in-game
+ */
+
+ m_control = data;
+ coin_counter_w( machine(), 0,data&0x01 );
+ coin_counter_w( machine(), 1,data&0x02 );
+ set_led_status( machine(), 0, data&0x40 ); /* start */
+}
+
+
+
+/*************************************
+ *
+ * Input ports
+ *
+ *************************************/
+
+READ8_MEMBER(tunhunt_state::button_r)
+{
+ int data = ioport("IN0")->read();
+ return ((data>>offset)&1)?0x00:0x80;
+}
+
+
+READ8_MEMBER(tunhunt_state::dsw2_0r)
+{
+ return (ioport("DSW")->read()&0x0100)?0x80:0x00;
+}
+
+
+READ8_MEMBER(tunhunt_state::dsw2_1r)
+{
+ return (ioport("DSW")->read()&0x0200)?0x80:0x00;
+}
+
+
+READ8_MEMBER(tunhunt_state::dsw2_2r)
+{
+ return (ioport("DSW")->read()&0x0400)?0x80:0x00;
+}
+
+
+READ8_MEMBER(tunhunt_state::dsw2_3r)
+{
+ return (ioport("DSW")->read()&0x0800)?0x80:0x00;
+}
+
+
+READ8_MEMBER(tunhunt_state::dsw2_4r)
+{
+ return (ioport("DSW")->read()&0x1000)?0x80:0x00;
+}
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, tunhunt_state )
+ ADDRESS_MAP_GLOBAL_MASK(0x7fff)
+ AM_RANGE(0x0000, 0x03ff) AM_RAM AM_SHARE("workram") /* Work RAM */
+ AM_RANGE(0x1080, 0x10ff) AM_WRITEONLY
+ AM_RANGE(0x1200, 0x12ff) AM_WRITEONLY
+ AM_RANGE(0x1400, 0x14ff) AM_WRITEONLY
+ AM_RANGE(0x1600, 0x160f) AM_WRITEONLY AM_SHARE("paletteram") /* COLRAM (D7-D4 SHADE; D3-D0 COLOR) */
+ AM_RANGE(0x1800, 0x1800) AM_WRITEONLY /* SHEL0H */
+ AM_RANGE(0x1a00, 0x1a00) AM_WRITEONLY /* SHEL1H */
+ AM_RANGE(0x1c00, 0x1c00) AM_WRITEONLY /* MOBJV */
+ AM_RANGE(0x1e00, 0x1eff) AM_WRITE(videoram_w) AM_SHARE("videoram") /* ALPHA */
+ AM_RANGE(0x2000, 0x2000) AM_WRITENOP /* watchdog */
+ AM_RANGE(0x2000, 0x2007) AM_READ(button_r)
+ AM_RANGE(0x2400, 0x2400) AM_WRITENOP /* INT ACK */
+ AM_RANGE(0x2800, 0x2800) AM_WRITE(control_w)
+ AM_RANGE(0x2c00, 0x2fff) AM_WRITEONLY AM_SHARE("spriteram")
+ AM_RANGE(0x3000, 0x300f) AM_DEVREADWRITE("pokey1", pokey_device, read, write)
+ AM_RANGE(0x4000, 0x400f) AM_DEVREADWRITE("pokey2", pokey_device, read, write)
+ AM_RANGE(0x5000, 0x7fff) AM_ROM
+ADDRESS_MAP_END
+
+
+/*************************************
+ *
+ * Port definitions
+ *
+ *************************************/
+
+static INPUT_PORTS_START( tunhunt )
+ PORT_START("IN0")
+ PORT_BIT ( 0x01, IP_ACTIVE_HIGH, IPT_TILT )
+ PORT_BIT ( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 )
+ PORT_SERVICE( 0x04, IP_ACTIVE_HIGH )
+ PORT_BIT ( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 )
+ PORT_BIT ( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 )
+ PORT_BIT ( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 )
+ PORT_BIT ( 0x40, IP_ACTIVE_HIGH, IPT_START1 )
+ PORT_BIT ( 0x80, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen")
+
+ PORT_START("IN1")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_Y ) PORT_SENSITIVITY(100) PORT_KEYDELTA(4)
+
+ PORT_START("IN2")
+ PORT_BIT( 0xff, 0x00, IPT_AD_STICK_X ) PORT_SENSITIVITY(100) PORT_KEYDELTA(4) PORT_REVERSE
+
+ PORT_START("DSW")
+ PORT_DIPNAME (0x0003, 0x0002, DEF_STR( Coinage ) ) PORT_DIPLOCATION("B4:1,2")
+ PORT_DIPSETTING ( 0x0003, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING ( 0x0002, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING ( 0x0001, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING ( 0x0000, DEF_STR( Free_Play ) )
+ PORT_DIPNAME (0x000c, 0x0000, "Coin 2 Multiplier" ) PORT_DIPLOCATION("B4:3,4")
+ PORT_DIPSETTING ( 0x0000, "1" )
+ PORT_DIPSETTING ( 0x0004, "4" )
+ PORT_DIPSETTING ( 0x0008, "5" )
+ PORT_DIPSETTING ( 0x000c, "6" )
+ PORT_DIPNAME (0x0010, 0x0000, "Coin 1 Multiplier" ) PORT_DIPLOCATION("B4:5")
+ PORT_DIPSETTING ( 0x0000, "1" )
+ PORT_DIPSETTING ( 0x0010, "2" )
+ PORT_DIPNAME (0x0060, 0x0000, "Bonus Credits" ) PORT_DIPLOCATION("B4:6,7")
+ PORT_DIPSETTING ( 0x0000, DEF_STR( None ) )
+ PORT_DIPSETTING ( 0x0060, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING ( 0x0040, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING ( 0x0020, DEF_STR( 2C_1C ) )
+ PORT_DIPNAME (0x0880, 0x0000, DEF_STR( Language ) ) PORT_DIPLOCATION("B3:3,B4:8")
+ PORT_DIPSETTING ( 0x0000, DEF_STR( English ) )
+ PORT_DIPSETTING ( 0x0080, DEF_STR( German ) )
+ PORT_DIPSETTING ( 0x0800, DEF_STR( French ) )
+ PORT_DIPSETTING ( 0x0880, DEF_STR( Spanish ) )
+ PORT_DIPNAME (0x1100, 0x0100, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("B3:2,1")
+ PORT_DIPSETTING ( 0x0000, DEF_STR( None ) )
+ PORT_DIPSETTING ( 0x1000, "30K, 100K" )
+ PORT_DIPSETTING ( 0x0100, "60K, 100K" )
+ PORT_DIPSETTING ( 0x1100, "90K, 100K" )
+ PORT_DIPNAME (0x0600, 0x0200, DEF_STR( Lives ) ) PORT_DIPLOCATION("B3:4,5")
+ PORT_DIPSETTING ( 0x0000, "2" )
+ PORT_DIPSETTING ( 0x0200, "3" )
+ PORT_DIPSETTING ( 0x0400, "4" )
+ PORT_DIPSETTING ( 0x0600, "5" )
+ PORT_DIPUNUSED_DIPLOC( 0x2000, 0x0000, "B3:6" ) // N/C
+ PORT_DIPUNUSED_DIPLOC( 0x4000, 0x0000, "B3:7" ) // N/C
+ PORT_DIPUNUSED_DIPLOC( 0x8000, 0x0000, "B3:8" ) // N/C
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
+static const gfx_layout alpha_layout =
+{
+ 8,8,
+ 0x40,
+ 1,
+ { 4 },
+ { 0,1,2,3,8,9,10,11 },
+ { 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70 },
+ 0x80
+};
+
+
+static const gfx_layout obj_layout =
+{
+ 16,16,
+ 8, /* number of objects */
+ 1, /* number of bitplanes */
+ { 4 }, /* plane offsets */
+ {
+ 0x00+0,0x00+1,0x00+2,0x00+3,
+ 0x08+0,0x08+1,0x08+2,0x08+3,
+ 0x10+0,0x10+1,0x10+2,0x10+3,
+ 0x18+0,0x18+1,0x18+2,0x18+3
+ }, /* x offsets */
+ {
+ 0x0*0x20, 0x1*0x20, 0x2*0x20, 0x3*0x20,
+ 0x4*0x20, 0x5*0x20, 0x6*0x20, 0x7*0x20,
+ 0x8*0x20, 0x9*0x20, 0xa*0x20, 0xb*0x20,
+ 0xc*0x20, 0xd*0x20, 0xe*0x20, 0xf*0x20
+ }, /* y offsets */
+ 0x200
+};
+
+
+static GFXDECODE_START( tunhunt )
+ GFXDECODE_ENTRY( "gfx1", 0x000, alpha_layout, 0x10, 4 )
+ GFXDECODE_ENTRY( "gfx2", 0x200, obj_layout, 0x18, 1 )
+ GFXDECODE_ENTRY( "gfx2", 0x000, obj_layout, 0x18, 1 ) /* second bank, or second bitplane? */
+GFXDECODE_END
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static MACHINE_CONFIG_START( tunhunt, tunhunt_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M6502, XTAL_12_096MHz/6) /* ??? */
+ MCFG_CPU_PROGRAM_MAP(main_map)
+ MCFG_CPU_PERIODIC_INT_DRIVER(tunhunt_state, irq0_line_hold, 4*60) /* 48V, 112V, 176V, 240V */
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
+ MCFG_SCREEN_SIZE(256, 256-16)
+ MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 255-16)
+ MCFG_SCREEN_UPDATE_DRIVER(tunhunt_state, screen_update)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", tunhunt)
+ MCFG_PALETTE_ADD("palette", 0x1a)
+ MCFG_PALETTE_INDIRECT_ENTRIES(16)
+ MCFG_PALETTE_INIT_OWNER(tunhunt_state, tunhunt)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("pokey1", POKEY, XTAL_12_096MHz/10)
+ MCFG_POKEY_ALLPOT_R_CB(IOPORT("DSW"))
+ MCFG_POKEY_OUTPUT_RC(RES_K(1), CAP_U(0.047), 5.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+
+ MCFG_SOUND_ADD("pokey2", POKEY, XTAL_12_096MHz/10)
+ MCFG_POKEY_POT0_R_CB(IOPORT("IN1"))
+ MCFG_POKEY_POT1_R_CB(IOPORT("IN2"))
+ MCFG_POKEY_POT2_R_CB(READ8(tunhunt_state, dsw2_0r))
+ MCFG_POKEY_POT3_R_CB(READ8(tunhunt_state, dsw2_1r))
+ MCFG_POKEY_POT4_R_CB(READ8(tunhunt_state, dsw2_2r))
+ MCFG_POKEY_POT5_R_CB(READ8(tunhunt_state, dsw2_3r))
+ MCFG_POKEY_POT6_R_CB(READ8(tunhunt_state, dsw2_4r))
+ MCFG_POKEY_OUTPUT_RC(RES_K(1), CAP_U(0.047), 5.0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+
+
+/*************************************
+ *
+ * ROM definitions
+ *
+ *************************************/
+
+/*
+
+ATARI TUBE CHASE
+
+136000-101 5000 6/16
+136000-102 5800 6/16
+136000-103 6000 6/16
+136000-104 6800 6/16
+136000-105 7000 6/16
+136000-106 7800 6/16
+
+136000-015 SYNC
+136000-017 SW 1 B8
+136000-016 SW 0 A8
+136000-018 PRIORITY H9
+136000-019 A/N C10
+136000-013 RED C11
+136000-014 B/G D11
+
+*/
+
+ROM_START( tunhunt )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "001.lm1", 0x5000, 0x800, CRC(2601a3a4) SHA1(939bafc54576fdaccf688b49cc9d201b03feec3a) )
+ ROM_LOAD( "002.k1", 0x5800, 0x800, CRC(29bbf3df) SHA1(4a0ec4cfab362a976d3962b347f687db45095cfd) )
+ ROM_LOAD( "136000.103", 0x6000, 0x800, CRC(1a6a60a4) SHA1(7c60cc92595f1b90f421eabbaa20f657181ed4f0) )
+ ROM_LOAD( "004.fh1", 0x6800, 0x800, CRC(4d6c920e) SHA1(2ef274356f4b8a0170a267cd6a3758b2bda693b5) )
+ ROM_LOAD( "005.ef1", 0x7000, 0x800, CRC(e17badf0) SHA1(6afbf517486340fe54b01fa26258877b2a8fc510) )
+ ROM_LOAD( "006.d1", 0x7800, 0x800, CRC(c3ae8519) SHA1(2b2e49065bc38429894ef29a29ffc60f96e64840) )
+
+ ROM_REGION( 0x400, "gfx1", 0 ) /* alphanumeric characters */
+ ROM_LOAD( "019.c10", 0x000, 0x400, CRC(d6fd45a9) SHA1(c86ea3790c29c554199af8ad6f3d563dcb7723c7) )
+
+ ROM_REGION( 0x400, "gfx2", 0 ) /* "SHELL" objects (16x16 pixel sprites) */
+ ROM_LOAD( "016.a8", 0x000, 0x200, CRC(830e6c34) SHA1(37a5eeb722dd80c4224c7f622b0edabb3ac1ca19) )
+ ROM_LOAD( "017.b8", 0x200, 0x200, CRC(5bef8b5a) SHA1(bfd9c592a34ed4861a6ad76ef10ea0d9b76a92b2) )
+
+ ROM_REGION( 0x540, "proms", 0 )
+ ROM_LOAD( "013.d11", 0x000, 0x020, CRC(66f1f5eb) SHA1(bcf5348ae328cf943d2bf6e38df727c0c4c466b7) ) /* hue: BBBBGGGG? */
+ ROM_LOAD( "014.c11", 0x020, 0x020, CRC(662444b2) SHA1(2e510c1d9b7e34a3045048a46045e61fabaf918e) ) /* hue: RRRR----? */
+ ROM_LOAD( "015.n4", 0x040, 0x100, CRC(00e224a0) SHA1(1a384ef488791c62566c91b18d6a1fb4a5def2ba) ) /* timing? */
+ ROM_LOAD( "018.h9", 0x140, 0x400, CRC(6547c208) SHA1(f19c334f9b4a1cfcbc913c0920688db2730dded0) ) /* color lookup table? */
+ROM_END
+
+ROM_START( tunhuntc )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "001.lm1", 0x5000, 0x800, CRC(2601a3a4) SHA1(939bafc54576fdaccf688b49cc9d201b03feec3a) )
+ ROM_LOAD( "002.k1", 0x5800, 0x800, CRC(29bbf3df) SHA1(4a0ec4cfab362a976d3962b347f687db45095cfd) )
+ ROM_LOAD( "003.j1", 0x6000, 0x800, CRC(360c0f47) SHA1(8e3d815836504c7651812e0e26423b0c7045621c) ) /* bad crc? fails self-test */
+ /* 0xcaa6bb2a: alternate prom (re)dumped by Al also fails, they simply modified the rom without fixing the checksum routine? */
+ ROM_LOAD( "004.fh1", 0x6800, 0x800, CRC(4d6c920e) SHA1(2ef274356f4b8a0170a267cd6a3758b2bda693b5) )
+ ROM_LOAD( "005.ef1", 0x7000, 0x800, CRC(e17badf0) SHA1(6afbf517486340fe54b01fa26258877b2a8fc510) )
+ ROM_LOAD( "006.d1", 0x7800, 0x800, CRC(c3ae8519) SHA1(2b2e49065bc38429894ef29a29ffc60f96e64840) )
+
+ ROM_REGION( 0x400, "gfx1", 0 ) /* alphanumeric characters */
+ ROM_LOAD( "019.c10", 0x000, 0x400, CRC(d6fd45a9) SHA1(c86ea3790c29c554199af8ad6f3d563dcb7723c7) )
+
+ ROM_REGION( 0x400, "gfx2", 0 ) /* "SHELL" objects (16x16 pixel sprites) */
+ ROM_LOAD( "016.a8", 0x000, 0x200, CRC(830e6c34) SHA1(37a5eeb722dd80c4224c7f622b0edabb3ac1ca19) )
+ ROM_LOAD( "017.b8", 0x200, 0x200, CRC(5bef8b5a) SHA1(bfd9c592a34ed4861a6ad76ef10ea0d9b76a92b2) )
+
+ ROM_REGION( 0x540, "proms", 0 )
+ ROM_LOAD( "013.d11", 0x000, 0x020, CRC(66f1f5eb) SHA1(bcf5348ae328cf943d2bf6e38df727c0c4c466b7) ) /* hue: BBBBGGGG? */
+ ROM_LOAD( "014.c11", 0x020, 0x020, CRC(662444b2) SHA1(2e510c1d9b7e34a3045048a46045e61fabaf918e) ) /* hue: RRRR----? */
+ ROM_LOAD( "015.n4", 0x040, 0x100, CRC(00e224a0) SHA1(1a384ef488791c62566c91b18d6a1fb4a5def2ba) ) /* timing? */
+ ROM_LOAD( "018.h9", 0x140, 0x400, CRC(6547c208) SHA1(f19c334f9b4a1cfcbc913c0920688db2730dded0) ) /* color lookup table? */
+ROM_END
+
+
+
+/*************************************
+ *
+ * Game drivers
+ *
+ *************************************/
+
+/* rom parent machine inp init */
+GAME( 1979,tunhunt, 0, tunhunt, tunhunt, driver_device, 0, ORIENTATION_SWAP_XY, "Atari", "Tunnel Hunt", MACHINE_SUPPORTS_SAVE )
+GAME( 1981,tunhuntc, tunhunt, tunhunt, tunhunt, driver_device, 0, ORIENTATION_SWAP_XY, "Atari (Centuri license)", "Tunnel Hunt (Centuri)", MACHINE_SUPPORTS_SAVE )