/***************************************************************************

    Atari Black Widow hardware

    Games supported:
        * Space Duel
        * Black Widow
        * Gravitar

****************************************************************************

    Black Widow memory map (preliminary)

    0000-04ff RAM
    0800      COIN_IN
    0a00      IN1
    0c00      IN2

    2000-27ff Vector generator RAM
    5000-7fff ROM



    BLACK WIDOW SWITCH SETTINGS (Atari, 1983)
    -----------------------------------------

    -------------------------------------------------------------------------------
    Settings of 8-Toggle Switch on Black Widow CPU PCB (at D4)
     8   7   6   5   4   3   2   1   Option
    -------------------------------------------------------------------------------
    Off Off                          1 coin/1 credit <
    On  On                           1 coin/2 credits
    On  Off                          2 coins/1 credit
    Off On                           Free play

            Off Off                  Right coin mechanism x 1 <
            On  Off                  Right coin mechanism x 4
            Off On                   Right coin mechanism x 5
            On  On                   Right coin mechanism x 6

                    Off              Left coin mechanism x 1 <
                    On               Left coin mechanism x 2

                        Off Off Off  No bonus coins (0)* <
                        Off On  On   No bonus coins (6)
                        On  On  On   No bonus coins (7)

                        On  Off Off  For every 2 coins inserted,
                                     logic adds 1 more coin (1)
                        Off On  Off  For every 4 coins inserted,
                                     logic adds 1 more coin (2)
                        On  On  Off  For every 4 coins inserted,
                                     logic adds 2 more coins (3)
                        Off Off On   For every 5 coins inserted,
                                     logic adds 1 more coin (4)
                        On  Off On   For every 3 coins inserted,
                                     logic adds 1 more coin (5)

    -------------------------------------------------------------------------------

    * The numbers in parentheses will appear on the BONUS ADDER line in the
      Operator Information Display (Figure 2-1) for these settings.
    < Manufacturer's recommended setting

    -------------------------------------------------------------------------------
    Settings of 8-Toggle Switch on Black Widow CPU PCB (at B4)
     8   7   6   5   4   3   2   1   Option

    Note: The bits are the exact opposite of the switch numbers - switch 8 is bit 0.
    -------------------------------------------------------------------------------
    Off Off                          Maximum start at level 13
    On  Off                          Maximum start at level 21 <
    Off On                           Maximum start at level 37
    On  On                           Maximum start at level 53

            Off Off                  3 spiders per game <
            On  Off                  4 spiders per game
            Off On                   5 spiders per game
            On  On                   6 spiders per game

                    Off Off          Easy game play
                    On  Off          Medium game play <
                    Off On           Hard game play
                    On  On           Demonstration mode

                            Off Off  Bonus spider every 20,000 points <
                            On  Off  Bonus spider every 30,000 points
                            Off On   Bonus spider every 40,000 points
                            On  On   No bonus

    -------------------------------------------------------------------------------

    < Manufacturer's recommended setting


    GRAVITAR SWITCH SETTINGS (Atari, 1982)
    --------------------------------------

    -------------------------------------------------------------------------------
    Settings of 8-Toggle Switch on Gravitar PCB (at B4)
     8   7   6   5   4   3   2   1   Option
    -------------------------------------------------------------------------------
    Off On                           Free play
    On  On                           1 coin for 2 credits
    Off Off                          1 coin for 1 credit <
    On  Off                          2 coins for 1 credit

            Off Off                  Right coin mechanism x 1 <
            On  Off                  Right coin mechanism x 4
            Off On                   Right coin mechanism x 5
            On  On                   Right coin mechanism x 6

                    Off              Left coin mechanism x 1 <
                    On               Left coin mechanism x 2

                        Off Off Off  No bonus coins <

                        Off On  Off  For every 4 coins inserted,
                                     logic adds 1 more coin
                        On  On  Off  For every 4 coins inserted,
                                     logic adds 2 more coins
                        Off Off On   For every 5 coins inserted,
                                     logic adds 1 more coin
                        On  Off On   For every 3 coins inserted,
                                     logic adds 1 more coin

                        Off On  On   No bonus coins
                        On  Off Off  ??? (not in manual!)
                        On  On  On   No bonus coins

    -------------------------------------------------------------------------------

    < Manufacturer's recommended setting

    -------------------------------------------------------------------------------
    Settings of 8-Toggle Switch on Gravitar PCB (at D4)
     8   7   6   5   4   3   2   1   Option
    -------------------------------------------------------------------------------
                            On  On   No bonus
                            Off Off  Bonus ship every 10,000 points <
     d   d               d  On  Off  Bonus ship every 20,000 points
     e   e               e  Off On   Bonus ship every 30,000 points
     s   s               s
     U   U          On   U           Easy game play <
                    Off              Hard game play
     t   t               t
     o   o  Off Off      o           3 ships per game
     N   N  On  Off      N           4 ships per game <
            Off On                   5 ships per game
            On  On                   6 ships per game

    -------------------------------------------------------------------------------

    < Manufacturer's recommended setting

    Space Duel Settings
    -------------------

    (Settings of 8-Toggle Switch on Space Duel game PCB at D4)
    Note: The bits are the exact opposite of the switch numbers - switch 8 is bit 0.

     8   7   6   5   4   3   2   1       Option
    On  Off                         3 ships per game
    Off Off                         4 ships per game $
    On  On                          5 ships per game
    Off On                          6 ships per game
            On  Off                *Easy game difficulty
            Off Off                 Normal game difficulty $
            On  On                  Medium game difficulty
            Off On                  Hard game difficulty
                    Off Off         English $
                    On  Off         German
                    On  On          Spanish
                    Off On          French
                                    Bonus life granted every:
                            Off On  8,000 points
                            Off Off 10,000 points
                            On  Off 15,000 points
                            On  On  No bonus life

    $Manufacturer's suggested settings
    *Easy-In the beginning of the first wave, 3 targets appear on the
    screen.  Targets increase by one in each new wave.
    Normal-Space station action is the same as 'Easy'.  Fighter action has
    4 targets in the beginning of the first wave.  Targets increase by 2
    in each new wave.  Targets move faster and more targets enter.
    Medium and Hard-In the beginning of the first wave, 4 targets appear
    on the screen.  Targets increase by 2 in each new wave.  As difficulty
    increases, targets move faster, and more targets enter.


    (Settings of 8-Toggle Switch on Space Duel game PCB at B4)
     8   7   6   5   4   3   2   1       Option
    Off On                          Free play
    Off Off                        *1 coin for 1 game (or 1 player) $
    On  On                          1 coin for 2 game (or 2 players)
    On  Off                         2 coins for 1 game (or 1 player)
            Off Off                 Right coin mech x 1 $
            On  Off                 Right coin mech x 4
            Off On                  Right coin mech x 5
            On  On                  Right coin mech x 6
                    Off             Left coin mech x 1 $
                    On              Left coin mech x 2
                        Off Off Off No bonus coins $
                        Off On  Off For every 4 coins, game logic adds 1 more coin
                        On  On  Off For every 4 coins, game logic adds 2 more coin
                        Off On  On  For every 5 coins, game logic adds 1 more coin
                        On  Off On**For every 3 coins, game logic adds 1 more coin

    $Manufacturer's suggested settings

    **In operator Information Display, this option displays same as no bonus.

***************************************************************************/

#include "driver.h"
#include "video/vector.h"
#include "video/avgdvg.h"
#include "machine/atari_vg.h"
#include "sound/pokey.h"

#define MASTER_CLOCK (12096000)
#define CLOCK_3KHZ  (MASTER_CLOCK / 4096)

#define IN_LEFT	(1 << 0)
#define IN_RIGHT (1 << 1)
#define IN_FIRE (1 << 2)
#define IN_SHIELD (1 << 3)
#define IN_THRUST (1 << 4)
#define IN_P1 (1 << 5)
#define IN_P2 (1 << 6)


/*************************************
 *
 *  Input ports
 *
 *************************************/

/*

These 7 memory locations are used to read the 2 players' controls as well
as sharing some dipswitch info in the lower 4 bits pertaining to coins/credits
Typically, only the high 2 bits are read.

*/
/* misfitmame start - this copied from drivers\bzone.c and made static */
#define IN0_3KHZ (1<<7)
#define IN0_VG_HALT (1<<6)

static READ8_HANDLER( bzone_IN0_r )
{
	int res;

	res = input_port_read(machine, "IN0");

	if (activecpu_gettotalcycles() & 0x100)
		res |= IN0_3KHZ;
	else
		res &= ~IN0_3KHZ;

	if (avgdvg_done())
		res |= IN0_VG_HALT;
	else
		res &= ~IN0_VG_HALT;

	return res;
}

/* misfitmame end */

static READ8_HANDLER( spacduel_IN3_r )
{
	int res;
	int res1;
	int res2;

	res1 = input_port_read(machine, "IN3");
	res2 = input_port_read(machine, "IN4");
	res = 0x00;

	switch (offset & 0x07)
	{
		case 0:
			if (res1 & IN_SHIELD) res |= 0x80;
			if (res1 & IN_FIRE) res |= 0x40;
			break;
		case 1: /* Player 2 */
			if (res2 & IN_SHIELD) res |= 0x80;
			if (res2 & IN_FIRE) res |= 0x40;
			break;
		case 2:
			if (res1 & IN_LEFT) res |= 0x80;
			if (res1 & IN_RIGHT) res |= 0x40;
			break;
		case 3: /* Player 2 */
			if (res2 & IN_LEFT) res |= 0x80;
			if (res2 & IN_RIGHT) res |= 0x40;
			break;
		case 4:
			if (res1 & IN_THRUST) res |= 0x80;
			if (res1 & IN_P1) res |= 0x40;
			break;
		case 5:  /* Player 2 */
			if (res2 & IN_THRUST) res |= 0x80;
			break;
		case 6:
			if (res1 & IN_P2) res |= 0x80;
			break;
		case 7:
			res = (0x00 /* upright */ | (0 & 0x40));
			break;
	}

	return res;
}



/*************************************
 *
 *  Output ports
 *
 *************************************/

static WRITE8_HANDLER( bwidow_misc_w )
{
	/*
        0x10 = p1 led
        0x20 = p2 led
        0x01 = coin counter 1
        0x02 = coin counter 2
    */
	static int lastdata;

	if (data == lastdata) return;
	set_led_status(0,~data & 0x10);
	set_led_status(1,~data & 0x20);
	coin_counter_w(0, data & 0x01);
	coin_counter_w(1, data & 0x02);
	lastdata = data;
}

/*************************************
 *
 *  Interrupt ack
 *
 *************************************/

static WRITE8_HANDLER( irq_ack_w )
{
	cpunum_set_input_line(machine, 0, 0, CLEAR_LINE);
}


/*************************************
 *
 *  Main CPU memory handlers
 *
 *************************************/

static ADDRESS_MAP_START( bwidow_map, ADDRESS_SPACE_PROGRAM, 8 )
	AM_RANGE(0x0000, 0x07ff) AM_RAM
	AM_RANGE(0x2000, 0x27ff) AM_RAM AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION("main", 0x2000)
	AM_RANGE(0x2800, 0x5fff) AM_ROM
	AM_RANGE(0x6000, 0x67ff) AM_READWRITE(pokey1_r, pokey1_w)
	AM_RANGE(0x6800, 0x6fff) AM_READWRITE(pokey2_r, pokey2_w)
	AM_RANGE(0x7000, 0x7000) AM_READ(atari_vg_earom_r)
	AM_RANGE(0x7800, 0x7800) AM_READ(bzone_IN0_r)	/* IN0 */
	AM_RANGE(0x8000, 0x8000) AM_READ(input_port_3_r)	/* IN1 */
	AM_RANGE(0x8800, 0x8800) AM_READ(input_port_4_r)	/* IN1 */
	AM_RANGE(0x8800, 0x8800) AM_WRITE(bwidow_misc_w) /* coin counters, leds */
	AM_RANGE(0x8840, 0x8840) AM_WRITE(avgdvg_go_w)
	AM_RANGE(0x8880, 0x8880) AM_WRITE(avgdvg_reset_w)
	AM_RANGE(0x88c0, 0x88c0) AM_WRITE(irq_ack_w) /* interrupt acknowledge */
	AM_RANGE(0x8900, 0x8900) AM_WRITE(atari_vg_earom_ctrl_w)
	AM_RANGE(0x8940, 0x897f) AM_WRITE(atari_vg_earom_w)
	AM_RANGE(0x8980, 0x89ed) AM_WRITE(SMH_NOP) /* watchdog clear */
	AM_RANGE(0x9000, 0xffff) AM_ROM
ADDRESS_MAP_END


static ADDRESS_MAP_START( spacduel_map, ADDRESS_SPACE_PROGRAM, 8 )
	AM_RANGE(0x0000, 0x03ff) AM_RAM
	AM_RANGE(0x0800, 0x0800) AM_READ(bzone_IN0_r)	/* IN0 */
	AM_RANGE(0x0900, 0x0907) AM_READ(spacduel_IN3_r)	/* IN1 */
	AM_RANGE(0x0905, 0x0906) AM_WRITE(SMH_NOP) /* ignore? */
	AM_RANGE(0x0a00, 0x0a00) AM_READ(atari_vg_earom_r)
//  AM_RANGE(0x0c00, 0x0c00) AM_WRITE(coin_counter_w) /* coin out */
	AM_RANGE(0x0c80, 0x0c80) AM_WRITE(avgdvg_go_w)
	AM_RANGE(0x0d00, 0x0d00) AM_WRITE(SMH_NOP) /* watchdog clear */
	AM_RANGE(0x0d80, 0x0d80) AM_WRITE(avgdvg_reset_w)
	AM_RANGE(0x0e00, 0x0e00) AM_WRITE(irq_ack_w) /* interrupt acknowledge */
	AM_RANGE(0x0e80, 0x0e80) AM_WRITE(atari_vg_earom_ctrl_w)
	AM_RANGE(0x0f00, 0x0f3f) AM_WRITE(atari_vg_earom_w)
	AM_RANGE(0x1000, 0x100f) AM_READWRITE(pokey1_r, pokey1_w)
	AM_RANGE(0x1400, 0x140f) AM_READWRITE(pokey2_r, pokey2_w)
	AM_RANGE(0x2000, 0x27ff) AM_RAM AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION("main", 0x2000)
	AM_RANGE(0x2800, 0x3fff) AM_ROM
	AM_RANGE(0x4000, 0xffff) AM_ROM
ADDRESS_MAP_END



/*************************************
 *
 *  Port definitions
 *
 *************************************/

static INPUT_PORTS_START( bwidow )
	PORT_START("IN0")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )	// To fit "Coin B" Dip Switch
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )	// To fit "Coin A" Dip Switch
	PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
	/* bit 6 is the VG HALT bit. We set it to "low" */
	/* per default (busy vector processor). */
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL )
	/* bit 7 is tied to a 3kHz clock */
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL )

	PORT_START("DSW0")
	PORT_DIPNAME(0x03, 0x00, DEF_STR( Coinage ) )
	PORT_DIPSETTING (  0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING (  0x00, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING (  0x03, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING (  0x02, DEF_STR( Free_Play ) )
	PORT_DIPNAME(0x0c, 0x00, DEF_STR( Coin_B ) )
	PORT_DIPSETTING (  0x00, "*1" )
	PORT_DIPSETTING (  0x04, "*4" )
	PORT_DIPSETTING (  0x08, "*5" )
	PORT_DIPSETTING (  0x0c, "*6" )
	PORT_DIPNAME(0x10, 0x00, DEF_STR( Coin_A ) )
	PORT_DIPSETTING (  0x00, "*1" )
	PORT_DIPSETTING (  0x10, "*2" )
	PORT_DIPNAME(0xe0, 0x00, "Bonus Coins" )
	PORT_DIPSETTING (  0x80, "1 each 5" )
	PORT_DIPSETTING (  0x60, "2 each 4" )
	PORT_DIPSETTING (  0x40, "1 each 4" )
	PORT_DIPSETTING (  0xa0, "1 each 3" )
	PORT_DIPSETTING (  0x20, "1 each 2" )
	PORT_DIPSETTING (  0x00, DEF_STR( None ) )

	PORT_START("DSW1")
	PORT_DIPNAME(0x03, 0x01, "Max Start" )
	PORT_DIPSETTING (  0x00, "Lev 13" )
	PORT_DIPSETTING (  0x01, "Lev 21" )
	PORT_DIPSETTING (  0x02, "Lev 37" )
	PORT_DIPSETTING (  0x03, "Lev 53" )
	PORT_DIPNAME(0x0c, 0x00, DEF_STR( Lives ) )
	PORT_DIPSETTING (  0x00, "3" )
	PORT_DIPSETTING (  0x04, "4" )
	PORT_DIPSETTING (  0x08, "5" )
	PORT_DIPSETTING (  0x0c, "6" )
	PORT_DIPNAME(0x30, 0x10, DEF_STR( Difficulty ) )
	PORT_DIPSETTING (  0x00, DEF_STR( Easy ) )
	PORT_DIPSETTING (  0x10, DEF_STR( Medium ) )
	PORT_DIPSETTING (  0x20, DEF_STR( Hard ) )
	PORT_DIPSETTING (  0x30, "Demo" )
	PORT_DIPNAME(0xc0, 0x00, DEF_STR( Bonus_Life ) )
	PORT_DIPSETTING (  0x00, "20000" )
	PORT_DIPSETTING (  0x40, "30000" )
	PORT_DIPSETTING (  0x80, "40000" )
	PORT_DIPSETTING (  0xc0, DEF_STR( None ) )

	PORT_START("IN3")	/* IN3 - Movement joystick */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKLEFT_UP ) PORT_8WAY
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )

	PORT_START("IN4")	/* IN4 - Firing joystick */
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END


static INPUT_PORTS_START( gravitar )
	PORT_START("IN0")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )	// To fit "Coin B" Dip Switch
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )	// To fit "Coin A" Dip Switch
	PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
	/* bit 6 is the VG HALT bit. We set it to "low" */
	/* per default (busy vector processor). */
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL )
	/* bit 7 is tied to a 3kHz clock */
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL )

	PORT_START("DSW0")
	PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED )
	PORT_DIPNAME(0x0c, 0x04, DEF_STR( Lives ) )
	PORT_DIPSETTING (  0x00, "3" )
	PORT_DIPSETTING (  0x04, "4" )
	PORT_DIPSETTING (  0x08, "5" )
	PORT_DIPSETTING (  0x0c, "6" )
	PORT_DIPNAME(0x10, 0x00, DEF_STR( Difficulty ) )
	PORT_DIPSETTING (  0x00, DEF_STR( Easy ) )
	PORT_DIPSETTING (  0x10, DEF_STR( Hard ) )
	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
	PORT_DIPNAME(0xc0, 0x00, DEF_STR( Bonus_Life ) )
	PORT_DIPSETTING (  0x00, "10000" )
	PORT_DIPSETTING (  0x40, "20000" )
	PORT_DIPSETTING (  0x80, "30000" )
	PORT_DIPSETTING (  0xc0, DEF_STR( None ) )

	PORT_START("DSW1")
	PORT_DIPNAME(0x03, 0x00, DEF_STR( Coinage ) )
	PORT_DIPSETTING (  0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING (  0x00, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING (  0x03, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING (  0x02, DEF_STR( Free_Play ) )
	PORT_DIPNAME(0x0c, 0x00, DEF_STR( Coin_B ) )
	PORT_DIPSETTING (  0x00, "*1" )
	PORT_DIPSETTING (  0x04, "*4" )
	PORT_DIPSETTING (  0x08, "*5" )
	PORT_DIPSETTING (  0x0c, "*6" )
	PORT_DIPNAME(0x10, 0x00, DEF_STR( Coin_A ) )
	PORT_DIPSETTING (  0x00, "*1" )
	PORT_DIPSETTING (  0x10, "*2" )
	PORT_DIPNAME(0xe0, 0x00, "Bonus Coins" )
	PORT_DIPSETTING (  0x80, "1 each 5" )
	PORT_DIPSETTING (  0x60, "2 each 4" )
	PORT_DIPSETTING (  0x40, "1 each 4" )
	PORT_DIPSETTING (  0xa0, "1 each 3" )
	PORT_DIPSETTING (  0x20, "1 each 2" )
	PORT_DIPSETTING (  0x00, DEF_STR( None ) )

	PORT_START("IN3")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_2WAY
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_2WAY
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )

	PORT_START("IN4")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START1 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END


static INPUT_PORTS_START( lunarbat )
	PORT_START("IN0")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )	// To be similar with other games
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )	// To be similar with other games
	PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	/* bit 6 is the VG HALT bit. We set it to "low" */
	/* per default (busy vector processor). */
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL )
	/* bit 7 is tied to a 3kHz clock */
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL )

	PORT_START("DSW0")	/* DSW0 - Not read */
	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )

	PORT_START("DSW1")	/* DSW1 - Not read */
	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )

	PORT_START("IN3")
	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 )
	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 )
	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 )
	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 )
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )

	PORT_START("IN4")	/* IN4 - Not read */
	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END


static INPUT_PORTS_START( spacduel )
	PORT_START("IN0")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 )	// To fit "Coin B" Dip Switch
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 )	// To fit "Coin A" Dip Switch
	PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
	PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
	/* bit 6 is the VG HALT bit. We set it to "low" */
	/* per default (busy vector processor). */
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL )
	/* bit 7 is tied to a 3kHz clock */
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL )

	PORT_START("DSW0")
	PORT_DIPNAME(0x03, 0x01, DEF_STR( Lives ) )
	PORT_DIPSETTING (  0x01, "3" )
	PORT_DIPSETTING (  0x00, "4" )
	PORT_DIPSETTING (  0x03, "5" )
	PORT_DIPSETTING (  0x02, "6" )
	PORT_DIPNAME(0x0c, 0x00, DEF_STR( Difficulty ) )
	PORT_DIPSETTING (  0x04, DEF_STR( Easy ) )
	PORT_DIPSETTING (  0x00, DEF_STR( Normal ) )
	PORT_DIPSETTING (  0x0c, DEF_STR( Medium ) )
	PORT_DIPSETTING (  0x08, DEF_STR( Hard ) )
	PORT_DIPNAME(0x30, 0x00, DEF_STR( Language ) )
	PORT_DIPSETTING (  0x00, DEF_STR( English ) )
	PORT_DIPSETTING (  0x10, DEF_STR( German ) )
	PORT_DIPSETTING (  0x20, DEF_STR( French ) )
	PORT_DIPSETTING (  0x30, DEF_STR( Spanish ) )
	PORT_DIPNAME(0xc0, 0x00, DEF_STR( Bonus_Life ) )
	PORT_DIPSETTING (  0xc0, "8000" )
	PORT_DIPSETTING (  0x00, "10000" )
	PORT_DIPSETTING (  0x40, "15000" )
	PORT_DIPSETTING (  0x80, DEF_STR( None ) )

	PORT_START("DSW1")
	PORT_DIPNAME(0x03, 0x00, DEF_STR( Coinage ) )
	PORT_DIPSETTING (  0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING (  0x00, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING (  0x03, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING (  0x02, DEF_STR( Free_Play ) )
	PORT_DIPNAME(0x0c, 0x00, DEF_STR( Coin_B ) )
	PORT_DIPSETTING (  0x00, "*1" )
	PORT_DIPSETTING (  0x04, "*4" )
	PORT_DIPSETTING (  0x08, "*5" )
	PORT_DIPSETTING (  0x0c, "*6" )
	PORT_DIPNAME(0x10, 0x00, DEF_STR( Coin_A ) )
	PORT_DIPSETTING (  0x00, "*1" )
	PORT_DIPSETTING (  0x10, "*2" )
	PORT_DIPNAME(0xe0, 0x00, "Bonus Coins" )
	PORT_DIPSETTING (  0x80, "1 each 5" )
	PORT_DIPSETTING (  0x60, "2 each 4" )
	PORT_DIPSETTING (  0x40, "1 each 4" )
	PORT_DIPSETTING (  0xa0, "1 each 3" )
	PORT_DIPSETTING (  0x20, "1 each 2" )
	PORT_DIPSETTING (  0x00, DEF_STR( None ) )

	/* See machine/spacduel.c for more info on these 2 ports */
	PORT_START("IN3")	/* IN3 - Player 1 - spread over 8 memory locations */
	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(1)
	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(1)
	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1)
	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
	PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("Start")
	PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("Select")
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )

	PORT_START("IN4")	/* IN4 - Player 2 - spread over 8 memory locations */
	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2)
	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2)
	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2)
	PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2)
	PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
	PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
	PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END



/*************************************
 *
 *  Sound interfaces
 *
 *************************************/

static const pokey_interface pokey_interface_1 =
{
	{ 0 },
	input_port_1_r
};


static const pokey_interface pokey_interface_2 =
{
	{ 0 },
	input_port_2_r
};



/*************************************
 *
 *  Machine drivers
 *
 *************************************/

static MACHINE_DRIVER_START( bwidow )

	/* basic machine hardware */
	MDRV_CPU_ADD("main", M6502, MASTER_CLOCK / 8)
	MDRV_CPU_PROGRAM_MAP(bwidow_map,0)
	MDRV_CPU_PERIODIC_INT(irq0_line_assert, (double)MASTER_CLOCK / 4096 / 12)

	MDRV_NVRAM_HANDLER(atari_vg)

	/* video hardware */
	MDRV_SCREEN_ADD("main", VECTOR)
	MDRV_SCREEN_REFRESH_RATE(60)
	MDRV_SCREEN_SIZE(400, 300)
	MDRV_SCREEN_VISIBLE_AREA(0, 480, 0, 440)

	MDRV_VIDEO_START(avg)
	MDRV_VIDEO_UPDATE(vector)

	/* sound hardware */
	MDRV_SPEAKER_STANDARD_MONO("mono")

	MDRV_SOUND_ADD("pokey1", POKEY, MASTER_CLOCK / 8)
	MDRV_SOUND_CONFIG(pokey_interface_1)
	MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)

	MDRV_SOUND_ADD("pokey2", POKEY, MASTER_CLOCK / 8)
	MDRV_SOUND_CONFIG(pokey_interface_2)
	MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_DRIVER_END


static MACHINE_DRIVER_START( gravitar )

	/* basic machine hardware */
	MDRV_IMPORT_FROM(bwidow)

	/* video hardware */
	MDRV_SCREEN_MODIFY("main")
	MDRV_SCREEN_VISIBLE_AREA(0, 420, 0, 400)
MACHINE_DRIVER_END


static MACHINE_DRIVER_START( lunarbat )

	/* basic machine hardware */
	MDRV_IMPORT_FROM(gravitar)
	MDRV_CPU_MODIFY("main")
	MDRV_CPU_PROGRAM_MAP(spacduel_map,0)

	/* video hardware */
	MDRV_SCREEN_MODIFY("main")
	MDRV_SCREEN_REFRESH_RATE(45)
	MDRV_SCREEN_VISIBLE_AREA(0, 500, 0, 440)
MACHINE_DRIVER_END


static MACHINE_DRIVER_START( spacduel )

	/* basic machine hardware */
	MDRV_IMPORT_FROM(gravitar)
	MDRV_CPU_MODIFY("main")
	MDRV_CPU_PROGRAM_MAP(spacduel_map,0)

	/* video hardware */
	MDRV_SCREEN_MODIFY("main")
	MDRV_SCREEN_REFRESH_RATE(45)
	MDRV_SCREEN_VISIBLE_AREA(0, 540, 0, 400)
MACHINE_DRIVER_END



/*************************************
 *
 *  ROM definitions
 *
 *************************************/

/* Misfitmame start */

/* The MAME version is apparently a prototype, while this is the proper release */
ROM_START( bwidowa )
	ROM_REGION( 0x10000, "main", 0 )
	/* Vector ROM */
	ROM_LOAD( "136017.107",   0x2800, 0x0800, CRC(97f6000c) SHA1(bbae93058228820ee67b05f23e45fb54ee0963ff) )
	ROM_LOAD( "136017.108",   0x3000, 0x1000, CRC(3da354ed) SHA1(935295d66ad40ad702eb7a694296e836f53d22ec) )
	ROM_LOAD( "136017.109",   0x4000, 0x1000, CRC(2fc4ce79) SHA1(2b324877bf55151747eaacd9a58f846712bfbc14) )
	ROM_LOAD( "136017.110",   0x5000, 0x1000, CRC(0dd52987) SHA1(72aa1d24f20cc86701189df486488edc434b1be1) )
	/* Program ROM */
	ROM_LOAD( "136017.101",   0x9000, 0x1000, CRC(fe3febb7) SHA1(b62f7622ca60248e1b8376ee135ae3d94d0b4437) )
	ROM_LOAD( "136017.102",   0xa000, 0x1000, CRC(10ad0376) SHA1(614c74daa468a7430ed965a3a9d07b6ad846016c) )
	ROM_LOAD( "136017.103",   0xb000, 0x1000, CRC(8a1430ee) SHA1(3aa6c40721a4289c1cf01f37c89b6b0a96336c68) )
	ROM_LOAD( "136017.104",   0xc000, 0x1000, CRC(44f9943f) SHA1(e83d8242e4592149719be6a68cf3aba46116072f) )
	ROM_LOAD( "bwidowa.105",  0xd000, 0x1000, CRC(a046a2e2) SHA1(ed0cbf5f673c12459b07fe84d0d3d219b1774489) )
	ROM_LOAD( "bwidowa.106",  0xe000, 0x1000, CRC(4dc28b22) SHA1(06a3fa722c89ab43f7407703b28fc85c2122c3ea) )
	ROM_COPY(  "main", 0xeffa, 0xfffa, 6 )	/* for reset/interrupt vectors */

	/* AVG PROM */
	ROM_REGION( 0x100, "user1", 0 )
	ROM_LOAD( "136002-125.n4",   0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
ROM_END

/* cannot see how this could ever work... */
ROM_START( spacwarp )
	ROM_REGION( 0x10000, "main", 0 )
	/* Vector ROM */
	ROM_LOAD( "spacwarp.106",   0x2800, 0x0800, CRC(23a25ff9) SHA1(e4117e6c453408079bd4a9e7b30a9b82e7b1712d) )
	ROM_LOAD( "136006.107",     0x3000, 0x1000, CRC(d8dd0461) SHA1(58060b20b2511d30d2ec06479d21840bdd0b53c6) )
	/* Program ROM */
	ROM_LOAD( "spacwarp.201",   0x4000, 0x1000, CRC(0acb38e9) SHA1(dcdeeedc798d7735d03249559556d55b8256abc6) )
	ROM_LOAD( "spacwarp.102",   0x5000, 0x1000, CRC(75fae2df) SHA1(7510e93781fe444ff10aac92abf4b882a65999aa) )
	ROM_LOAD( "136006.103",     0x6000, 0x1000, CRC(ee72da63) SHA1(d36d62cdf7fe76ee9cdbfc2e76ac5d90f22986ba) )
	ROM_LOAD( "spacwarp.104",   0x7000, 0x1000, CRC(aae05ec6) SHA1(14629e8375e1ae12dce96a742f1a0777e5114edb) )
	ROM_LOAD( "spacwarp.105",   0x8000, 0x1000, CRC(41cddb2d) SHA1(8dcd7f72ca1099b04f3d29730b5071d3cb55888e) )
	ROM_COPY(  "main", 0x8ffa, 0xfffa, 6 )	/* for reset/interrupt vectors */

	/* AVG PROM */
	ROM_REGION( 0x100, "user1", 0 )
	ROM_LOAD( "136002-125.n4",   0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
ROM_END

GAME( 1982, bwidowa,  0, bwidow,   bwidow,   0, ROT0, "Atari", "Black Widow (set 2)", 0 )
GAME( 1999, spacwarp, 0, spacduel, spacduel, 0, ROT0, "Jeff Hendrix", "Space War (Proto on Space Duel HW)", GAME_NOT_WORKING )
/* Misfitmame end */
