summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/nova2001.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/nova2001.c')
-rw-r--r--src/mame/drivers/nova2001.c270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/mame/drivers/nova2001.c b/src/mame/drivers/nova2001.c
new file mode 100644
index 00000000000..bb194946101
--- /dev/null
+++ b/src/mame/drivers/nova2001.c
@@ -0,0 +1,270 @@
+/*******************************************************************************
+
+ Nova 2001 - by UPL - 1983
+
+ driver by Howie Cohen, Frank Palazzolo, Alex Pasadyn
+
+ Memory Map:
+
+ Address Range: R/W: Function:
+ --------------------------------------------------------------------------
+ 0000 - 7fff R Program ROM (7000-7fff mirror of 6000-6fff)
+ a000 - a3ff R/W Foreground Playfield character RAM
+ a400 - a7ff R/W Foreground Playfield color modifier RAM
+ a800 - abff R/W Scrolling Playfield character RAM
+ ac00 - a7ff R/W Scrolling Playfield color modifier RAM
+ b000 - b7ff R/W Sprite RAM
+ bfff W flip screen
+ c000 R/W AY8910 #1 Data R/W
+ c001 R/W AY8910 #2 Data R/W
+ c002 W AY8910 #1 Control W
+ c003 W AY8910 #2 Control W
+ c004 R Interrupt acknowledge / Watchdog reset
+ c006 R Player 1 Controls
+ c007 R Player 2 Controls
+ c00e R Coin Inputs, etc.
+ e000 - e7ff R/W Work RAM
+
+ the parent set is VERY sensitive to coin inputs, if the coin isn't held down
+ long enough, or is held down too long the game will reset, likewise if coins
+ are inserted too quickly
+
+*******************************************************************************/
+
+#include "driver.h"
+#include "sound/ay8910.h"
+
+/* From video/nova2001.c */
+extern UINT8 *nova2001_videoram2, *nova2001_colorram2;
+
+extern WRITE8_HANDLER( nova2001_videoram_w );
+extern WRITE8_HANDLER( nova2001_colorram_w );
+extern WRITE8_HANDLER( nova2001_videoram2_w );
+extern WRITE8_HANDLER( nova2001_colorram2_w );
+extern WRITE8_HANDLER( nova2001_scroll_x_w );
+extern WRITE8_HANDLER( nova2001_scroll_y_w );
+extern WRITE8_HANDLER( nova2001_flipscreen_w );
+
+extern PALETTE_INIT( nova2001 );
+extern VIDEO_START( nova2001 );
+extern VIDEO_UPDATE( nova2001 );
+
+
+
+static ADDRESS_MAP_START( nova2001_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0xa000, 0xa3ff) AM_RAM AM_WRITE(nova2001_videoram2_w) AM_BASE(&nova2001_videoram2)
+ AM_RANGE(0xa400, 0xa7ff) AM_RAM AM_WRITE(nova2001_colorram2_w) AM_BASE(&nova2001_colorram2)
+ AM_RANGE(0xa800, 0xabff) AM_RAM AM_WRITE(nova2001_videoram_w) AM_BASE(&videoram)
+ AM_RANGE(0xac00, 0xafff) AM_RAM AM_WRITE(nova2001_colorram_w) AM_BASE(&colorram)
+ AM_RANGE(0xb000, 0xb7ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size)
+ AM_RANGE(0xbfff, 0xbfff) AM_WRITE(nova2001_flipscreen_w)
+ AM_RANGE(0xc000, 0xc000) AM_READWRITE(AY8910_read_port_0_r, AY8910_write_port_0_w)
+ AM_RANGE(0xc001, 0xc001) AM_READWRITE(AY8910_read_port_1_r, AY8910_write_port_1_w)
+ AM_RANGE(0xc002, 0xc002) AM_WRITE(AY8910_control_port_0_w)
+ AM_RANGE(0xc003, 0xc003) AM_WRITE(AY8910_control_port_1_w)
+ AM_RANGE(0xc004, 0xc004) AM_READ(watchdog_reset_r)
+ AM_RANGE(0xc006, 0xc006) AM_READ(input_port_0_r)
+ AM_RANGE(0xc007, 0xc007) AM_READ(input_port_1_r)
+ AM_RANGE(0xc00e, 0xc00e) AM_READ(input_port_2_r)
+ AM_RANGE(0xe000, 0xe7ff) AM_RAM
+ADDRESS_MAP_END
+
+
+
+static INPUT_PORTS_START( nova2001 )
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) // pause
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) // fire
+
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
+ PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+
+ PORT_START
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(4)
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x78, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK )
+
+ PORT_START /* dsw0 */
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x04, 0x04, "1st Bonus Life" )
+ PORT_DIPSETTING( 0x04, "20K" )
+ PORT_DIPSETTING( 0x00, "30K" )
+ PORT_DIPNAME( 0x18, 0x18, "Extra Bonus Life" )
+ PORT_DIPSETTING( 0x18, "60K" )
+ PORT_DIPSETTING( 0x10, "70K" )
+ PORT_DIPSETTING( 0x08, "90K" )
+ PORT_DIPSETTING( 0x00, DEF_STR( None ) )
+ PORT_DIPNAME( 0x60, 0x60, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_2C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START /* dsw1 */
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Medium ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x04, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "High Score Names" )
+ PORT_DIPSETTING( 0x00, "3 Letters" )
+ PORT_DIPSETTING( 0x08, "8 Letters" )
+ PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
+INPUT_PORTS_END
+
+
+
+static const gfx_layout charlayout =
+{
+ 8,8, /* 8*8 characters */
+ 256, /* 256 characters */
+ 4, /* 4 bits per pixel */
+ {0,1,2,3 }, /* the bitplanes are packed in one nibble */
+ {0, 4, 8192*8+0, 8192*8+4, 8, 12, 8192*8+8, 8192*8+12},
+ {16*0, 16*1, 16*2, 16*3, 16*4, 16*5, 16*6, 16*7},
+ 8*16
+};
+
+static const gfx_layout spritelayout =
+{
+ 16,16, /* 16*16 characters */
+ 128, /* 128 sprites */
+ 4, /* 4 bits per pixel */
+ {0,1,2,3}, /* the bitplanes are packed in one nibble */
+ {0, 4, 8192*8+0, 8192*8+4, 8, 12, 8192*8+8, 8192*8+12,
+ 16*8+0, 16*8+4, 16*8+8192*8+0, 16*8+8192*8+4, 16*8+8, 16*8+12, 16*8+8192*8+8, 16*8+8192*8+12},
+ {16*0, 16*1, 16*2, 16*3, 16*4, 16*5, 16*6, 16*7,
+ 32*8+16*0, 32*8+16*1, 32*8+16*2, 32*8+16*3, 32*8+16*4, 32*8+16*5, 32*8+16*6, 32*8+16*7},
+ 8*64
+};
+
+static GFXDECODE_START( nova2001 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0x0000, charlayout, 0, 16 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x0000, charlayout, 16*16, 16 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0x0000, spritelayout, 0, 16 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0x0000, spritelayout, 0, 16 )
+GFXDECODE_END
+
+
+
+static struct AY8910interface ay8910_interface_1 =
+{
+ 0,
+ 0,
+ nova2001_scroll_x_w, /* writes are connected to pf scroll */
+ nova2001_scroll_y_w
+};
+
+static struct AY8910interface ay8910_interface_2 =
+{
+ input_port_3_r,
+ input_port_4_r
+};
+
+static MACHINE_DRIVER_START( nova2001 )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(Z80, 12000000/4) // 3 MHz
+ MDRV_CPU_PROGRAM_MAP(nova2001_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_hold,1)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_REAL_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(32*8, 32*8)
+ MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 4*8, 28*8-1)
+ MDRV_GFXDECODE(nova2001)
+ MDRV_PALETTE_LENGTH(32)
+ MDRV_COLORTABLE_LENGTH(32*16)
+
+ MDRV_PALETTE_INIT(nova2001)
+ MDRV_VIDEO_START(nova2001)
+ MDRV_VIDEO_UPDATE(nova2001)
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD(AY8910, 6000000/3)
+ MDRV_SOUND_CONFIG(ay8910_interface_1)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MDRV_SOUND_ADD(AY8910, 6000000/3)
+ MDRV_SOUND_CONFIG(ay8910_interface_2)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_DRIVER_END
+
+
+
+ROM_START( nova2001 )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "1.6c", 0x0000, 0x2000, CRC(368cffc0) SHA1(b756c0542d5b86640af62639bdd0d32f6e364dd3) )
+ ROM_LOAD( "2.6d", 0x2000, 0x2000, CRC(bc4e442b) SHA1(6e1dca5dde442db95403377bf49aaad2a337813e) )
+ ROM_LOAD( "3.6f", 0x4000, 0x2000, CRC(b2849038) SHA1(b56c7c03ef7c677cc6df0280a485f9cda3435b23) )
+ ROM_LOAD( "4.6g", 0x6000, 0x1000, CRC(6b5bb12d) SHA1(74aee3d08a7ee1f98eaec4a4b3062aa9d17948ec) )
+ ROM_RELOAD( 0x7000, 0x1000 )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "5.12s", 0x0000, 0x2000, CRC(54198941) SHA1(fe762a0bbcf10b13ece87ded2ea730257cfbe7d3) )
+ ROM_LOAD( "6.12p", 0x2000, 0x2000, CRC(cbd90dca) SHA1(7eacde832f5783f4389fb98d6bf6b26dd494665d) )
+
+ ROM_REGION( 0x4000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "7.12n", 0x0000, 0x2000, CRC(9ebd8806) SHA1(26b6caa0d0a7ae52a182070ecc7bc696c12038b3) )
+ ROM_LOAD( "8.12l", 0x2000, 0x2000, CRC(d1b18389) SHA1(2d808fee774f1bb4cec42e23cfef36b54eee0efa) )
+
+ ROM_REGION( 0x0020, REGION_PROMS, 0 )
+ ROM_LOAD( "nova2001.clr", 0x0000, 0x0020, CRC(a2fac5cd) SHA1(ad14aa2be57722d1f48b47171fe72f96091423b6) )
+ROM_END
+
+ROM_START( nov2001u )
+ ROM_REGION( 0x10000, REGION_CPU1, 0 )
+ ROM_LOAD( "nova2001.1", 0x0000, 0x2000, CRC(b79461bd) SHA1(7fac3313bc76612f66a6518450d0fed32fe70c45) )
+ ROM_LOAD( "nova2001.2", 0x2000, 0x2000, CRC(fab87144) SHA1(506703f9d96443839f864ef5bde1a71120f54384) )
+ ROM_LOAD( "3.6f", 0x4000, 0x2000, CRC(b2849038) SHA1(b56c7c03ef7c677cc6df0280a485f9cda3435b23) )
+ ROM_LOAD( "4.6g", 0x6000, 0x1000, CRC(6b5bb12d) SHA1(74aee3d08a7ee1f98eaec4a4b3062aa9d17948ec) )
+ ROM_RELOAD( 0x7000, 0x1000 )
+
+ ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE )
+ ROM_LOAD( "nova2001.5", 0x0000, 0x2000, CRC(8ea576e8) SHA1(d8dbcfd43aafe25afad7f947a80737cdc55b23d7) )
+ ROM_LOAD( "nova2001.6", 0x2000, 0x2000, CRC(0c61656c) SHA1(41c480799798c95543b5a805694e68282b9f563a) )
+
+ ROM_REGION( 0x4000, REGION_GFX2, ROMREGION_DISPOSE )
+ ROM_LOAD( "7.12n", 0x0000, 0x2000, CRC(9ebd8806) SHA1(26b6caa0d0a7ae52a182070ecc7bc696c12038b3) )
+ ROM_LOAD( "8.12l", 0x2000, 0x2000, CRC(d1b18389) SHA1(2d808fee774f1bb4cec42e23cfef36b54eee0efa) )
+
+ ROM_REGION( 0x0020, REGION_PROMS, 0 )
+ ROM_LOAD( "nova2001.clr", 0x0000, 0x0020, CRC(a2fac5cd) SHA1(ad14aa2be57722d1f48b47171fe72f96091423b6) )
+ROM_END
+
+
+
+GAME( 1983, nova2001, 0, nova2001, nova2001, 0, ROT0, "UPL", "Nova 2001 (Japan)", 0 )
+GAME( 1983, nov2001u, nova2001, nova2001, nova2001, 0, ROT0, "UPL (Universal license)", "Nova 2001 (US)", 0 )