summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/drivers/mhavoc.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/drivers/mhavoc.c')
-rw-r--r--trunk/src/mame/drivers/mhavoc.c749
1 files changed, 749 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/mhavoc.c b/trunk/src/mame/drivers/mhavoc.c
new file mode 100644
index 00000000000..7b259fdee7f
--- /dev/null
+++ b/trunk/src/mame/drivers/mhavoc.c
@@ -0,0 +1,749 @@
+/***************************************************************************
+
+ Atari Major Havoc hardware
+
+ driver by Mike Appolo
+
+ Modified 10/08/2006 by Jess M. Askey to include support for Speech which was not stuffed on production
+ Major Havoc PCB's. However, the hardware if stuffed is functional. Speech is used in Major Havoc Return
+ to Vaxx.
+
+ Games supported:
+ * Alpha One
+ * Major Havoc
+ * Major Havoc: Return to Vax (including speech) - This version is a hack that includes 3 new levels
+ near the end of the game. Level 19 is incomplete.
+
+ Known bugs:
+ * none at this time
+
+****************************************************************************
+
+ MAJOR HAVOC (Driver)
+
+ Notes:
+
+ This game was provided in three configurations:
+ 1) New Machine Purchase
+ 2) Upgrade kit for Tempest (Kit "A")
+ 3) Upgrade kit for Space Duel, Gravitar, and Black Window (Kit "B")
+
+ Controls on the machine were:
+ A backlit cylinder (roller) on new Major Havoc machines
+ or
+ A Tempest-like spinner on upgrades
+
+
+ Memory Map for Major Havoc
+
+ Alpha Processor
+ D D D D D D D D
+ Hex Address 7 6 5 4 3 2 1 0 Function
+ --------------------------------------------------------------------------------
+ 0000-01FF | D D D D D D D D | R/W | Program RAM (1/2K)
+ 0200-07FF | D D D D D D D D | R/W | Paged Program RAM (3K)
+ 0800-09FF | D D D D D D D D | R/W | Program RAM (1/2K)
+ | | |
+ 1000 | D D D D D D D D | R | Gamma Commuication Read Port
+ | | |
+ 1200 | D | R | Right Coin (Player 1=0)
+ 1200 | D | R | Left Coin (Player 1=0)
+ 1200 | D | R | Aux. Coin (Player 1=0)
+ 1200 | D | R | Diagnostic Step
+ 1200 | D | R | Self Test Switch (Player 1=1)
+ 1200 | D | R | Cabinet Switch (Player 1=1)
+ 1200 | D | R | Aux. Coin Switch (Player 1=1)
+ 1200 | D | R | Diagnostic Step
+ 1200 | D | R | Gammma Rcvd Flag
+ 1200 | D | R | Gamma Xmtd Flag
+ 1200 | D | R | 2.4 KHz
+ 1200 | D | R | Vector Generator Halt Flag
+ | | |
+ 1400-141F | D D D D | W | ColorRAM
+ | | |
+ 1600 | D | W | Invert X
+ 1600 | D | W | Invert Y
+ 1600 | D | W | Player 1
+ 1600 | D | W | Not Used
+ 1600 | D | W | Gamma Proc. Reset
+ 1600 | D | W | Beta Proc. Reset
+ 1600 | D | W | Not Used
+ 1600 | D | W | Roller Controller Light
+ | | |
+ 1640 | | W | Vector Generator Go
+ 1680 | | W | Watchdog Clear
+ 16C0 | | W | Vector Generator Reset
+ | | |
+ 1700 | | W | IRQ Acknowledge
+ 1740 | D D | W | Program ROM Page Select
+ 1780 | D | W | Program RAM Page Select
+ 17C0 | D D D D D D D D | W | Gamma Comm. Write Port
+ | | |
+ 1800-1FFF | D D D D D D D D | R/W | Shared Beta RAM(not used)
+ | | |
+ 2000-3FFF | D D D D D D D D | R | Paged Program ROM (32K)
+ 4000-4FFF | D D D D D D D D | R/W | Vector Generator RAM (4K)
+ 5000-5FFF | D D D D D D D D | R | Vector Generator ROM (4K)
+ 6000-7FFF | D D D D D D D D | R | Paged Vector ROM (32K)
+ 8000-FFFF | D D D D D D D D | R | Program ROM (32K)
+ -------------------------------------------------------------------------------
+
+ Gamma Processor
+
+ D D D D D D D D
+ Hex Address 7 6 5 4 3 2 1 0 Function
+ --------------------------------------------------------------------------------
+ 0000-07FF | D D D D D D D D | R/W | Program RAM (2K)
+ 2000-203F | D D D D D D D D | R/W | Quad-Pokey I/O
+ | | |
+ 2800 | D | R | Fire 1 Switch
+ 2800 | D | R | Shield 1 Switch
+ 2800 | D | R | Fire 2 Switch
+ 2800 | D | R | Shield 2 Switch
+ 2800 | D | R | Not Used
+ 2800 | D | R | Speech Chip Ready
+ 2800 | D | R | Alpha Rcvd Flag
+ 2800 | D | R | Alpha Xmtd Flag
+ | | |
+ 3000 | D D D D D D D D | R | Alpha Comm. Read Port
+ | | |
+ 3800-3803 | D D D D D D D D | R | Roller Controller Input
+ | | |
+ 4000 | | W | IRQ Acknowledge
+ 4800 | D | W | Left Coin Counter
+ 4800 | D | W | Right Coin Counter
+ | | |
+ 5000 | D D D D D D D D | W | Alpha Comm. Write Port
+ | | |
+ 5800 | D D D D D D D D | W | Speech Data Write / Write Strobe Clear
+ 5900 | | W | Speech Write Strobe Set
+ | | |
+ 6000-61FF | D D D D D D D D | R/W | EEROM
+ 8000-BFFF | D D D D D D D D | R | Program ROM (16K)
+ -----------------------------------------------------------------------------
+
+
+
+ MAJOR HAVOC DIP SWITCH SETTINGS
+
+ $=Default
+
+ DIP Switch at position 13/14S
+
+ 1 2 3 4 5 6 7 8
+ STARTING LIVES _________________________________________
+ Free Play 1 Coin 2 Coin | | | | | | | | |
+ 2 3 5 $|Off |Off | | | | | | |
+ 3 4 4 | On | On | | | | | | |
+ 4 5 6 | On |Off | | | | | | |
+ 5 6 7 |Off | On | | | | | | |
+ GAME DIFFICULTY | | | | | | | | |
+ Hard | | | On | On | | | | |
+ Medium $| | |Off |Off | | | | |
+ Easy | | |Off | On | | | | |
+ Demo | | | On |Off | | | | |
+ BONUS LIFE | | | | | | | | |
+ 50,000 | | | | | On | On | | |
+ 100,000 $| | | | |Off |Off | | |
+ 200,000 | | | | |Off | On | | |
+ No Bonus Life | | | | | On |Off | | |
+ ATTRACT MODE SOUND | | | | | | | | |
+ Silence | | | | | | | On | |
+ Sound $| | | | | | |Off | |
+ ADAPTIVE DIFFICULTY | | | | | | | | |
+ No | | | | | | | | On |
+ Yes $| | | | | | | |Off |
+ -----------------------------------------
+
+ DIP Switch at position 8S
+
+ 1 2 3 4 5 6 7 8
+ _________________________________________
+ Free Play | | | | | | | On |Off |
+ 1 Coin for 1 Game | | | | | | |Off |Off |
+ 1 Coin for 2 Games | | | | | | | On | On |
+ 2 Coins for 1 Game $| | | | | | |Off | On |
+ RIGHT COIN MECHANISM | | | | | | | | |
+ x1 $| | | | |Off |Off | | |
+ x4 | | | | |Off | On | | |
+ x5 | | | | | On |Off | | |
+ x6 | | | | | On | On | | |
+ LEFT COIN MECHANISM | | | | | | | | |
+ x1 $| | | |Off | | | | |
+ x2 | | | | On | | | | |
+ BONUS COIN ADDER | | | | | | | | |
+ No Bonus Coins $|Off |Off |Off | | | | | |
+ Every 4, add 1 |Off | On |Off | | | | | |
+ Every 4, add 2 |Off | On | On | | | | | |
+ Every 5, add 1 | On |Off |Off | | | | | |
+ Every 3, add 1 | On |Off | On | | | | | |
+ -----------------------------------------
+
+ 2 COIN MINIMUM OPTION: Short pin 6 @13N to ground.
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "machine/atari_vg.h"
+#include "video/avgdvg.h"
+#include "video/vector.h"
+#include "sound/tms5220.h"
+#include "sound/pokey.h"
+#include "machine/nvram.h"
+#include "includes/mhavoc.h"
+
+/*************************************
+ *
+ * Alpha One: dual POKEY?
+ *
+ *************************************/
+
+static READ8_HANDLER( dual_pokey_r )
+{
+ int pokey_num = (offset >> 3) & 0x01;
+ int control = (offset & 0x10) >> 1;
+ int pokey_reg = (offset % 8) | control;
+
+ if (pokey_num == 0)
+ return pokey_r(space->machine().device("pokey1"), pokey_reg);
+ else
+ return pokey_r(space->machine().device("pokey2"), pokey_reg);
+}
+
+
+static WRITE8_HANDLER( dual_pokey_w )
+{
+ int pokey_num = (offset >> 3) & 0x01;
+ int control = (offset & 0x10) >> 1;
+ int pokey_reg = (offset % 8) | control;
+
+ if (pokey_num == 0)
+ pokey_w(space->machine().device("pokey1"), pokey_reg, data);
+ else
+ pokey_w(space->machine().device("pokey2"), pokey_reg, data);
+}
+
+
+/*************************************
+ *
+ * Alpha CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( alpha_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x01ff) AM_RAM
+ AM_RANGE(0x0200, 0x07ff) AM_RAMBANK("bank1") AM_BASE_MEMBER(mhavoc_state, m_zram0)
+ AM_RANGE(0x0800, 0x09ff) AM_RAM
+ AM_RANGE(0x0a00, 0x0fff) AM_RAMBANK("bank1") AM_BASE_MEMBER(mhavoc_state, m_zram1)
+ AM_RANGE(0x1000, 0x1000) AM_READ(mhavoc_gamma_r) /* Gamma Read Port */
+ AM_RANGE(0x1200, 0x1200) AM_READ_PORT("IN0") AM_WRITENOP /* Alpha Input Port 0 */
+ AM_RANGE(0x1400, 0x141f) AM_RAM AM_BASE(&avgdvg_colorram) /* ColorRAM */
+ AM_RANGE(0x1600, 0x1600) AM_WRITE(mhavoc_out_0_w) /* Control Signals */
+ AM_RANGE(0x1640, 0x1640) AM_WRITE(avgdvg_go_w) /* Vector Generator GO */
+ AM_RANGE(0x1680, 0x1680) AM_WRITE(watchdog_reset_w) /* Watchdog Clear */
+ AM_RANGE(0x16c0, 0x16c0) AM_WRITE(avgdvg_reset_w) /* Vector Generator Reset */
+ AM_RANGE(0x1700, 0x1700) AM_WRITE(mhavoc_alpha_irq_ack_w) /* IRQ ack */
+ AM_RANGE(0x1740, 0x1740) AM_WRITE(mhavoc_rom_banksel_w) /* Program ROM Page Select */
+ AM_RANGE(0x1780, 0x1780) AM_WRITE(mhavoc_ram_banksel_w) /* Program RAM Page Select */
+ AM_RANGE(0x17c0, 0x17c0) AM_WRITE(mhavoc_gamma_w) /* Gamma Communication Write Port */
+ AM_RANGE(0x1800, 0x1fff) AM_RAM /* Shared Beta Ram */
+ AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank2") /* Paged Program ROM (32K) */
+ AM_RANGE(0x4000, 0x4fff) AM_RAM AM_BASE(&avgdvg_vectorram) AM_SIZE(&avgdvg_vectorram_size) AM_REGION("alpha", 0x4000) /* Vector Generator RAM */
+ AM_RANGE(0x5000, 0x7fff) AM_ROM /* Vector ROM */
+ AM_RANGE(0x8000, 0xffff) AM_ROM /* Program ROM (32K) */
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Gamma CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( gamma_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x07ff) AM_RAM /* Program RAM (2K) */
+ AM_RANGE(0x0800, 0x0fff) AM_RAM AM_MIRROR (0x1800)
+ AM_RANGE(0x2000, 0x203f) AM_READWRITE(quad_pokey_r, quad_pokey_w) /* Quad Pokey read */
+ AM_RANGE(0x2800, 0x2800) AM_READ_PORT("IN1") /* Gamma Input Port */
+ AM_RANGE(0x3000, 0x3000) AM_READ(mhavoc_alpha_r) /* Alpha Comm. Read Port*/
+ AM_RANGE(0x3800, 0x3803) AM_READ_PORT("DIAL") /* Roller Controller Input*/
+ AM_RANGE(0x4000, 0x4000) AM_READ_PORT("DSW2") AM_WRITE(mhavoc_gamma_irq_ack_w) /* DSW at 8S, IRQ Acknowledge*/
+ AM_RANGE(0x4800, 0x4800) AM_WRITE(mhavoc_out_1_w) /* Coin Counters */
+ AM_RANGE(0x5000, 0x5000) AM_WRITE(mhavoc_alpha_w) /* Alpha Comm. Write Port */
+ AM_RANGE(0x6000, 0x61ff) AM_RAM AM_SHARE("nvram") /* EEROM */
+ AM_RANGE(0x8000, 0xffff) AM_ROM /* Program ROM (16K) */
+ADDRESS_MAP_END
+
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers (Alpha One)
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( alphaone_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x01ff) AM_RAM
+ AM_RANGE(0x0200, 0x07ff) AM_RAMBANK("bank1") AM_BASE_MEMBER(mhavoc_state, m_zram0)
+ AM_RANGE(0x0800, 0x09ff) AM_RAM
+ AM_RANGE(0x0a00, 0x0fff) AM_RAMBANK("bank1") AM_BASE_MEMBER(mhavoc_state, m_zram1)
+ AM_RANGE(0x1020, 0x103f) AM_READWRITE(dual_pokey_r, dual_pokey_w)
+ AM_RANGE(0x1040, 0x1040) AM_READ_PORT("IN0") AM_WRITENOP /* Alpha Input Port 0 */
+ AM_RANGE(0x1060, 0x1060) AM_READ_PORT("IN1") /* Gamma Input Port */
+ AM_RANGE(0x1080, 0x1080) AM_READ_PORT("DIAL") /* Roller Controller Input*/
+ AM_RANGE(0x10a0, 0x10a0) AM_WRITE(alphaone_out_0_w) /* Control Signals */
+ AM_RANGE(0x10a4, 0x10a4) AM_WRITE(avgdvg_go_w) /* Vector Generator GO */
+ AM_RANGE(0x10a8, 0x10a8) AM_WRITE(watchdog_reset_w) /* Watchdog Clear */
+ AM_RANGE(0x10ac, 0x10ac) AM_WRITE(avgdvg_reset_w) /* Vector Generator Reset */
+ AM_RANGE(0x10b0, 0x10b0) AM_WRITE(mhavoc_alpha_irq_ack_w) /* IRQ ack */
+ AM_RANGE(0x10b4, 0x10b4) AM_WRITE(mhavoc_rom_banksel_w)
+ AM_RANGE(0x10b8, 0x10b8) AM_WRITE(mhavoc_ram_banksel_w)
+ AM_RANGE(0x10e0, 0x10ff) AM_WRITEONLY AM_BASE(&avgdvg_colorram) /* ColorRAM */
+ AM_RANGE(0x1800, 0x18ff) AM_RAM AM_SHARE("nvram") /* EEROM */
+ AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank2") /* Paged Program ROM (32K) */
+ AM_RANGE(0x4000, 0x4fff) AM_RAM AM_BASE(&avgdvg_vectorram) AM_SIZE(&avgdvg_vectorram_size) AM_REGION("alpha", 0x4000) /* Vector Generator RAM */
+ AM_RANGE(0x5000, 0x7fff) AM_ROM /* Vector ROM */
+ AM_RANGE(0x8000, 0xffff) AM_ROM /* Program ROM (32K) */
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Port definitions
+ *
+ *************************************/
+
+static CUSTOM_INPUT( clock_r )
+{
+ /* 2.4kHz (divide 2.5MHz by 1024) */
+ return (field.machine().device<cpu_device>("alpha")->total_cycles() & 0x400) ? 0 : 1;
+}
+
+
+/* 2008-08 FP:
+ IN0 Bit 4 is tested in the second input test, but it's not clear its effect.
+ According to the memory map at top it should be Diagnostic Step, but it's
+ actually IN0 Bit 5 to have this function. I marked it as UNKNOWN for the moment */
+static INPUT_PORTS_START( mhavoc )
+ PORT_START("IN0") /* alpha */
+ /* Bits 7-6 = selected based on player_1 */
+ /* Bits 5-4 = common */
+ /* Bit 3 = Gamma rcvd flag */
+ /* Bit 2 = Gamma xmtd flag */
+ /* Bit 1 = 2.4kHz (divide 2.5MHz by 1024) */
+ /* Bit 0 = Vector generator halt flag */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(avgdvg_done_r, NULL)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(clock_r, NULL)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(gamma_xmtd_r, NULL)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(gamma_rcvd_r, NULL)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diag Step/Coin C") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(mhavoc_bit67_r, "COIN\0SERVICE")
+
+ PORT_START("IN1") /* gamma */
+ /* Bits 7-2 = input switches */
+ /* Bit 1 = Alpha rcvd flag */
+ /* Bit 0 = Alpha xmtd flag */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(alpha_xmtd_r, NULL)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(alpha_rcvd_r, NULL)
+ PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
+
+ PORT_START("DIAL") /* gamma */
+ PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(40) PORT_REVERSE
+
+ PORT_START("DSW1") /* DIP Switch at position 13/14S */
+ PORT_DIPNAME( 0x01, 0x00, "Adaptive Difficulty" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ))
+ PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:5,6")
+ PORT_DIPSETTING( 0x0c, "50000")
+ PORT_DIPSETTING( 0x00, "100000")
+ PORT_DIPSETTING( 0x04, "200000")
+ PORT_DIPSETTING( 0x08, DEF_STR( None ))
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:3,4")
+ PORT_DIPSETTING( 0x10, DEF_STR( Easy ))
+ PORT_DIPSETTING( 0x00, DEF_STR( Medium ))
+ PORT_DIPSETTING( 0x30, DEF_STR( Hard ))
+ PORT_DIPSETTING( 0x20, "Demo")
+ PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
+ PORT_DIPSETTING( 0x00, "3 (2 in Free Play)")
+ PORT_DIPSETTING( 0xc0, "4 (3 in Free Play)")
+ PORT_DIPSETTING( 0x80, "5 (4 in Free Play)")
+ PORT_DIPSETTING( 0x40, "6 (5 in Free Play)")
+
+ PORT_START("DSW2") /* DIP Switch at position 8S */
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW2:7,8")
+ PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Free_Play ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Right Coin Mechanism" ) PORT_DIPLOCATION("SW2:5,6")
+ PORT_DIPSETTING( 0x0c, "x1" )
+ PORT_DIPSETTING( 0x08, "x4" )
+ PORT_DIPSETTING( 0x04, "x5" )
+ PORT_DIPSETTING( 0x00, "x6" )
+ PORT_DIPNAME( 0x10, 0x10, "Left Coin Mechanism" ) PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING( 0x10, "x1" )
+ PORT_DIPSETTING( 0x00, "x2" )
+ PORT_DIPNAME( 0xe0, 0xe0, "Bonus Credits" ) PORT_DIPLOCATION("SW2:1,2,3")
+ PORT_DIPSETTING( 0x80, "2 each 4" )
+ PORT_DIPSETTING( 0x40, "1 each 3" )
+ PORT_DIPSETTING( 0xa0, "1 each 4" )
+ PORT_DIPSETTING( 0x60, "1 each 5" )
+ PORT_DIPSETTING( 0xe0, DEF_STR( None ) )
+
+ PORT_START("COIN") /* dummy for player_1 = 0 on alpha */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) /* Left Coin Switch */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) /* Right Coin */
+
+ PORT_START("SERVICE") /* dummy for player_1 = 1 on alpha */
+ PORT_DIPNAME( 0x01, 0x01, "Credit to start" )
+ PORT_DIPSETTING( 0x01, "1" )
+ PORT_DIPSETTING( 0x00, "2" )
+ PORT_SERVICE( 0x02, IP_ACTIVE_LOW )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( mhavocrv )
+ PORT_INCLUDE( mhavoc )
+
+ PORT_MODIFY("IN1")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(tms5220_r, NULL)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( mhavocp )
+ PORT_INCLUDE( mhavoc )
+
+ PORT_MODIFY("DSW1")
+ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:7,8")
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPSETTING( 0x01, "2" )
+ PORT_DIPSETTING( 0x02, "3" )
+ PORT_DIPSETTING( 0x03, "4" )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( alphaone )
+ PORT_START("IN0") /* alpha (player_1 = 0) */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(avgdvg_done_r, NULL)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(clock_r, NULL)
+ PORT_BIT( 0x7c, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
+
+ PORT_START("IN1") /* gamma */
+ PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
+
+ PORT_START("DIAL") /* gamma */
+ PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(40) PORT_REVERSE
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Sound interfaces
+ *
+ *************************************/
+
+static const pokey_interface pokey_config =
+{
+ { DEVCB_NULL },
+ DEVCB_INPUT_PORT("DSW1")
+};
+
+
+/*************************************
+ *
+ * Machine drivers
+ *
+ *************************************/
+
+static MACHINE_CONFIG_START( mhavoc, mhavoc_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("alpha", M6502, MHAVOC_CLOCK_2_5M) /* 2.5 MHz */
+ MCFG_CPU_PROGRAM_MAP(alpha_map)
+
+ MCFG_CPU_ADD("gamma", M6502, MHAVOC_CLOCK_1_25M) /* 1.25 MHz */
+ MCFG_CPU_PROGRAM_MAP(gamma_map)
+
+ MCFG_MACHINE_START(mhavoc)
+ MCFG_MACHINE_RESET(mhavoc)
+ MCFG_NVRAM_ADD_1FILL("nvram")
+
+ MCFG_TIMER_ADD_PERIODIC("5k_timer", mhavoc_cpu_irq_clock, attotime::from_hz(MHAVOC_CLOCK_5K))
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", VECTOR)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_SIZE(400, 300)
+ MCFG_SCREEN_VISIBLE_AREA(0, 300, 0, 260)
+ MCFG_SCREEN_UPDATE(vector)
+
+ MCFG_VIDEO_START(avg_mhavoc)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("pokey1", POKEY, MHAVOC_CLOCK_1_25M)
+ MCFG_SOUND_CONFIG(pokey_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MCFG_SOUND_ADD("pokey2", POKEY, MHAVOC_CLOCK_1_25M)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MCFG_SOUND_ADD("pokey3", POKEY, MHAVOC_CLOCK_1_25M)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ MCFG_SOUND_ADD("pokey4", POKEY, MHAVOC_CLOCK_1_25M)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( mhavocrv, mhavoc )
+
+ MCFG_SOUND_ADD("tms", TMS5220, MHAVOC_CLOCK/2/9)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( alphaone, mhavoc )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("alpha")
+ MCFG_CPU_PROGRAM_MAP(alphaone_map)
+ MCFG_DEVICE_REMOVE("gamma")
+
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_VISIBLE_AREA(0, 580, 0, 500)
+
+ /* sound hardware */
+ MCFG_SOUND_REPLACE("pokey1", POKEY, MHAVOC_CLOCK_1_25M)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+
+ MCFG_SOUND_REPLACE("pokey2", POKEY, MHAVOC_CLOCK_1_25M)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+
+ MCFG_DEVICE_REMOVE("pokey3")
+ MCFG_DEVICE_REMOVE("pokey4")
+MACHINE_CONFIG_END
+
+
+
+/*************************************
+ *
+ * ROM definitions
+ *
+ *************************************/
+
+/*
+ * Notes:
+ * the R3 roms are supported as "mhavoc", the R2 roms (with a bug in gameplay)
+ * are supported as "mhavoc2".
+ * "Return to Vax" - Jess Askey's souped up version (errors on self test)
+ * are supported as "mhavocrv".
+ * Prototype is supported as "mhavocp"
+ * Alpha one is a single-board prototype
+ */
+
+ROM_START( mhavoc )
+ /* Alpha Processor ROMs */
+ ROM_REGION( 0x20000, "alpha", 0 ) /* 152KB for ROMs */
+ /* Vector Generator ROM */
+ ROM_LOAD( "136025.210", 0x05000, 0x2000, CRC(c67284ca) SHA1(d9adad80c266d36429444f483cac4ebcf1fec7b8) )
+
+ /* Program ROM */
+ ROM_LOAD( "136025.216", 0x08000, 0x4000, CRC(522a9cc0) SHA1(bbd75e01c45220e1c87bd1e013cf2c2fb9f376b2) )
+ ROM_LOAD( "136025.217", 0x0c000, 0x4000, CRC(ea3d6877) SHA1(27823c1b546c073b37ff11a8cb25312ea71673c2) )
+
+ /* Paged Program ROM */
+ ROM_LOAD( "136025.215", 0x10000, 0x4000, CRC(a4d380ca) SHA1(c3cdc76054be2f904b1fb6f28c3c027eba5c3a70) ) /* page 0+1 */
+ ROM_LOAD( "136025.318", 0x14000, 0x4000, CRC(ba935067) SHA1(05ad81e7a1982b9d8fddb48502546f48b5dc21b7) ) /* page 2+3 */
+
+ /* Paged Vector Generator ROM */
+ ROM_LOAD( "136025.106", 0x18000, 0x4000, CRC(2ca83c76) SHA1(cc1adca32f70af30c4590e9fd6b056b051ccdb38) ) /* page 0+1 */
+ ROM_LOAD( "136025.107", 0x1c000, 0x4000, CRC(5f81c5f3) SHA1(be4055727a2d4536e37ec20150deffdb5af5b01f) ) /* page 2+3 */
+
+ /* Gamma Processor ROM */
+ ROM_REGION( 0x10000, "gamma", 0 )
+ ROM_LOAD( "136025.108", 0x08000, 0x4000, CRC(93faf210) SHA1(7744368a1d520f986d1c4246113a7e24fcdd6d04) )
+ ROM_RELOAD( 0x0c000, 0x4000 ) /* reset+interrupt vectors */
+
+ /* AVG PROM */
+ ROM_REGION( 0x100, "user1", 0 )
+ ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, BAD_DUMP CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
+ROM_END
+
+
+ROM_START( mhavoc2 )
+ /* Alpha Processor ROMs */
+ ROM_REGION( 0x20000, "alpha", 0 )
+ /* Vector Generator ROM */
+ ROM_LOAD( "136025.110", 0x05000, 0x2000, CRC(16eef583) SHA1(277252bd716dd96d5b98ec5e33a3a6a3bc1a9abf) )
+
+ /* Program ROM */
+ ROM_LOAD( "136025.103", 0x08000, 0x4000, CRC(bf192284) SHA1(4c2dc3ba75122e521ebf2c42f89b31737613c2df) )
+ ROM_LOAD( "136025.104", 0x0c000, 0x4000, CRC(833c5d4e) SHA1(932861b2a329172247c1a5d0a6498a00a1fce814) )
+
+ /* Paged Program ROM - switched to 2000-3fff */
+ ROM_LOAD( "136025.101", 0x10000, 0x4000, CRC(2b3b591f) SHA1(39fd6fdd14367906bc0102bde15d509d3289206b) ) /* page 0+1 */
+ ROM_LOAD( "136025.109", 0x14000, 0x4000, CRC(4d766827) SHA1(7697bf6f92bff0e62850ed75ff66008a08583ef7) ) /* page 2+3 */
+
+ /* Paged Vector Generator ROM */
+ ROM_LOAD( "136025.106", 0x18000, 0x4000, CRC(2ca83c76) SHA1(cc1adca32f70af30c4590e9fd6b056b051ccdb38) ) /* page 0+1 */
+ ROM_LOAD( "136025.107", 0x1c000, 0x4000, CRC(5f81c5f3) SHA1(be4055727a2d4536e37ec20150deffdb5af5b01f) ) /* page 2+3 */
+
+ /* the last 0x1000 is used for the 2 RAM pages */
+
+ /* Gamma Processor ROM */
+ ROM_REGION( 0x10000, "gamma", 0 )
+ ROM_LOAD( "136025.108", 0x08000, 0x4000, CRC(93faf210) SHA1(7744368a1d520f986d1c4246113a7e24fcdd6d04) )
+ ROM_RELOAD( 0x0c000, 0x4000 ) /* reset+interrupt vectors */
+
+ /* AVG PROM */
+ ROM_REGION( 0x100, "user1", 0 )
+ ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, BAD_DUMP CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
+ROM_END
+
+
+ROM_START( mhavocrv )
+ /* Alpha Processor ROMs */
+ ROM_REGION( 0x20000, "alpha", 0 ) /* 152KB for ROMs */
+ /* Vector Generator ROM */
+ ROM_LOAD( "136025.210", 0x05000, 0x2000, CRC(c67284ca) SHA1(d9adad80c266d36429444f483cac4ebcf1fec7b8) )
+
+ /* Program ROM */
+ ROM_LOAD( "136025.916", 0x08000, 0x4000, CRC(1255bd7f) SHA1(e277fe7b23ce8cf1294b6bfa5548b24a6c8952ce) )
+ ROM_LOAD( "136025.917", 0x0c000, 0x4000, CRC(21889079) SHA1(d1ad6d9fa1432912e376bca50ceeefac2bfd6ac3) )
+
+ /* Paged Program ROM */
+ ROM_LOAD( "136025.915", 0x10000, 0x4000, CRC(4c7235dc) SHA1(67cafc2ce438ec389550efb46c554a7fe7b45efc) ) /* page 0+1 */
+ ROM_LOAD( "136025.918", 0x14000, 0x4000, CRC(84735445) SHA1(21aacd862ce8911d257c6f48ead119ee5bb0b60d) ) /* page 2+3 */
+
+ /* Paged Vector Generator ROM */
+ ROM_LOAD( "136025.106", 0x18000, 0x4000, CRC(2ca83c76) SHA1(cc1adca32f70af30c4590e9fd6b056b051ccdb38) ) /* page 0+1 */
+ ROM_LOAD( "136025.907", 0x1c000, 0x4000, CRC(4deea2c9) SHA1(c4107581748a3f2d2084de2a4f120abd67a52189) ) /* page 2+3 */
+
+ /* Gamma Processor ROM */
+ ROM_REGION( 0x10000, "gamma", 0 )
+ ROM_LOAD( "136025.908", 0x08000, 0x4000, CRC(c52ec664) SHA1(08120a385f71b17ec02a3c2ef856ff835a91773e) )
+ ROM_RELOAD( 0x0c000, 0x4000 ) /* reset+interrupt vectors */
+
+ /* AVG PROM */
+ ROM_REGION( 0x100, "user1", 0 )
+ ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, BAD_DUMP CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
+ROM_END
+
+
+ROM_START( mhavocp )
+ /* Alpha Processor ROMs */
+ ROM_REGION( 0x20000, "alpha", 0 )
+ /* Vector Generator ROM */
+ ROM_LOAD( "136025.010", 0x05000, 0x2000, CRC(3050c0e6) SHA1(f19a9538996d949cdca7e6abd4f04e8ff6e0e2c1) )
+
+ /* Program ROM */
+ ROM_LOAD( "136025.016", 0x08000, 0x4000, CRC(94caf6c0) SHA1(8734411280bd0484c99a59231b97ad64d6e787e8) )
+ ROM_LOAD( "136025.017", 0x0c000, 0x4000, CRC(05cba70a) SHA1(c069e6dec3e5bc278103156d0908ab93f3784be1) )
+
+ /* Paged Program ROM - switched to 2000-3fff */
+ ROM_LOAD( "136025.015", 0x10000, 0x4000, CRC(c567c11b) SHA1(23b89389f59bb6a040342adfe583818a91ce5bff) )
+ ROM_LOAD( "136025.018", 0x14000, 0x4000, CRC(a8c35ccd) SHA1(c243a5407557390a64c6560d857f5031f839973f) )
+
+ /* Paged Vector Generator ROM */
+ ROM_LOAD( "136025.006", 0x18000, 0x4000, CRC(e272ed41) SHA1(0de395d1c4300a64da7f45746d7b550779e36a21) )
+ ROM_LOAD( "136025.007", 0x1c000, 0x4000, CRC(e152c9d8) SHA1(79d0938fa9ad262c7f28c5a8ad21004a4dec9ed8) )
+
+ /* the last 0x1000 is used for the 2 RAM pages */
+
+ /* Gamma Processor ROM */
+ ROM_REGION( 0x10000, "gamma", 0 )
+ ROM_LOAD( "136025.008", 0x8000, 0x4000, CRC(22ea7399) SHA1(eeda8cc40089506063835a62c3273e7dd3918fd5) )
+ ROM_RELOAD( 0xc000, 0x4000 )/* reset+interrupt vectors */
+
+ /* AVG PROM */
+ ROM_REGION( 0x100, "user1", 0 )
+ ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, BAD_DUMP CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
+ROM_END
+
+
+ROM_START( alphaone )
+ ROM_REGION( 0x20000, "alpha", 0 )
+ /* Vector Generator ROM */
+ ROM_LOAD( "vec5000.tw", 0x05000, 0x1000, CRC(2a4c149f) SHA1(b60a0b29958bee9b5f7c1d88163680b626bb76dd) )
+
+ /* Program ROM */
+ ROM_LOAD( "8000.tw", 0x08000, 0x2000, CRC(962d4da2) SHA1(2299f850aed7470a80a21526143f7b412a879cb1) )
+ ROM_LOAD( "a000.tw", 0x0a000, 0x2000, CRC(f739a791) SHA1(1e70e446fc7dd27683ad71e768ebb2bc1d4fedd3) )
+ ROM_LOAD( "twjk1.bin", 0x0c000, 0x2000, CRC(1ead0b34) SHA1(085e05526d029bcff7c8ae050cde73f52ee13846) )
+ ROM_LOAD( "e000.tw", 0x0e000, 0x1000, CRC(6b1d7d2b) SHA1(36ac8b53e2fe01ed281c94afec02484ef676ddad) )
+ ROM_RELOAD( 0x0f000, 0x1000 )
+
+ /* Paged Program ROM - switched to 2000-3fff */
+ ROM_LOAD( "page01.tw", 0x10000, 0x4000, CRC(cbf3b05a) SHA1(1dfaf9300a252c9c921f06167160a59cdf329726) )
+
+ /* Paged Vector Generator ROM */
+ ROM_LOAD( "vec_pg01.tw", 0x18000, 0x4000, CRC(e392a94d) SHA1(b5843da97d7aa5767c87c29660115efc5ad9ad54) )
+ ROM_LOAD( "vec_pg23.tw", 0x1c000, 0x4000, CRC(1ff74292) SHA1(90e61c48544c62d905e207bba5c67ae7694e86a5) )
+
+ /* the last 0x1000 is used for the 2 RAM pages */
+
+ /* AVG PROM */
+ ROM_REGION( 0x100, "user1", 0 )
+ ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, BAD_DUMP CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
+ROM_END
+
+
+ROM_START( alphaonea )
+ ROM_REGION( 0x20000, "alpha", 0 )
+ /* Vector Generator ROM */
+ ROM_LOAD( "vec5000.tw", 0x05000, 0x1000, CRC(2a4c149f) SHA1(b60a0b29958bee9b5f7c1d88163680b626bb76dd) )
+
+ /* Program ROM */
+ ROM_LOAD( "8000.tw", 0x08000, 0x2000, CRC(962d4da2) SHA1(2299f850aed7470a80a21526143f7b412a879cb1) )
+ ROM_LOAD( "a000.tw", 0x0a000, 0x2000, CRC(f739a791) SHA1(1e70e446fc7dd27683ad71e768ebb2bc1d4fedd3) )
+ ROM_LOAD( "c000.tw", 0x0c000, 0x2000, CRC(f21fb1ac) SHA1(2590147e75611a3f87397e7b0baa7020e7528ac8) )
+ ROM_LOAD( "e000.tw", 0x0e000, 0x1000, CRC(6b1d7d2b) SHA1(36ac8b53e2fe01ed281c94afec02484ef676ddad) )
+ ROM_RELOAD( 0x0f000, 0x1000 )
+
+ /* Paged Program ROM - switched to 2000-3fff */
+ ROM_LOAD( "page01.tw", 0x10000, 0x4000, CRC(cbf3b05a) SHA1(1dfaf9300a252c9c921f06167160a59cdf329726) )
+
+ /* Paged Vector Generator ROM */
+ ROM_LOAD( "vec_pg01.tw", 0x18000, 0x4000, CRC(e392a94d) SHA1(b5843da97d7aa5767c87c29660115efc5ad9ad54) )
+ ROM_LOAD( "vec_pg23.tw", 0x1c000, 0x4000, CRC(1ff74292) SHA1(90e61c48544c62d905e207bba5c67ae7694e86a5) )
+
+ /* the last 0x1000 is used for the 2 RAM pages */
+
+ /* AVG PROM */
+ ROM_REGION( 0x100, "user1", 0 )
+ ROM_LOAD( "136002-125.6c", 0x0000, 0x0100, BAD_DUMP CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
+ROM_END
+
+
+
+/*************************************
+ *
+ * Game drivers
+ *
+ *************************************/
+
+GAME( 1983, mhavoc, 0, mhavoc, mhavoc, 0, ROT0, "Atari", "Major Havoc (rev 3)", GAME_SUPPORTS_SAVE )
+GAME( 1983, mhavoc2, mhavoc, mhavoc, mhavoc, 0, ROT0, "Atari", "Major Havoc (rev 2)", GAME_SUPPORTS_SAVE )
+GAME( 1983, mhavocrv, mhavoc, mhavocrv, mhavocrv, mhavocrv, ROT0, "Atari / JMA", "Major Havoc (Return to Vax)", GAME_SUPPORTS_SAVE )
+GAME( 1983, mhavocp, mhavoc, mhavoc, mhavocp, 0, ROT0, "Atari", "Major Havoc (prototype)", GAME_SUPPORTS_SAVE )
+GAME( 1983, alphaone, mhavoc, alphaone, alphaone, 0, ROT0, "Atari", "Alpha One (prototype, 3 lives)", GAME_SUPPORTS_SAVE )
+GAME( 1983, alphaonea,mhavoc, alphaone, alphaone, 0, ROT0, "Atari", "Alpha One (prototype, 5 lives)", GAME_SUPPORTS_SAVE )