diff options
Diffstat (limited to 'src/mame/drivers/nova2001.c')
-rw-r--r-- | src/mame/drivers/nova2001.c | 270 |
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 ) |