summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/hh_tms1k.cpp33
-rw-r--r--src/mame/drivers/wmg.cpp513
2 files changed, 289 insertions, 257 deletions
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index 229eb2c8f9d..85b9d0842c6 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -2555,7 +2555,7 @@ MACHINE_CONFIG_END
Entex Space Battle
* TMS1000 EN-6004 MP0920 (die label 1000B, MP0920)
- * x
+ * 2 7seg LEDs, and other LEDs behind bezel, 1-bit sound
The Japanese version was published by Gakken, same name.
@@ -2591,14 +2591,29 @@ public:
void esbattle_state::prepare_display()
{
+ // R8,R9 are 7segs
+ set_display_segmask(0x300, 0x7f);
+ display_matrix(8, 10, m_o, m_r);
}
WRITE16_MEMBER(esbattle_state::write_r)
{
+ // R0,R1: input mux
+ m_inp_mux = data & 3;
+
+ // R10: speaker out
+ m_speaker->level_w(data >> 10 & 1);
+
+ // R0-R9: led select
+ m_r = data;
+ prepare_display();
}
WRITE16_MEMBER(esbattle_state::write_o)
{
+ // O0-O7: led state
+ m_o = data;
+ prepare_display();
}
READ8_MEMBER(esbattle_state::read_k)
@@ -2612,15 +2627,15 @@ READ8_MEMBER(esbattle_state::read_k)
static INPUT_PORTS_START( esbattle )
PORT_START("IN.0") // R0
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.1") // R1
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire 1") // F1
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire 2") // F2
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Launch")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.1") // R1
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch")
PORT_CONFNAME( 0x08, 0x08, "Players" )
PORT_CONFSETTING( 0x08, "1" ) // Auto
PORT_CONFSETTING( 0x00, "2" ) // Manual
@@ -2629,7 +2644,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( esbattle, esbattle_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=47K, C=33pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 425000) // approximation - RC osc. R=47K, C=33pf
MCFG_TMS1XXX_READ_K_CB(READ8(esbattle_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(esbattle_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(esbattle_state, write_o))
@@ -6466,7 +6481,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( monkeysee, monkeysee_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 225000) // approximation - RC osc. R=68K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 250000) // approximation - RC osc. R=68K, C=47pf
MCFG_TMS1XXX_READ_K_CB(READ8(monkeysee_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(monkeysee_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(monkeysee_state, write_o))
diff --git a/src/mame/drivers/wmg.cpp b/src/mame/drivers/wmg.cpp
index 8b0baba54f7..07f5ae8e726 100644
--- a/src/mame/drivers/wmg.cpp
+++ b/src/mame/drivers/wmg.cpp
@@ -84,197 +84,36 @@ public:
wmg_state(const machine_config &mconfig, device_type type, const char *tag)
: williams_state(mconfig, type, tag)
, m_p_ram(*this, "nvram")
+ , m_pia0(*this, "pia_0")
+ , m_pia1(*this, "pia_1")
+ , m_keyboard(*this, "X%d", 0)
{ }
- DECLARE_WRITE8_MEMBER(wmg_rombank_w);
DECLARE_MACHINE_RESET(wmg);
DECLARE_DRIVER_INIT(wmg);
- uint8_t m_wmg_bank;
- uint8_t m_wmg_def_bank;
- uint8_t m_wmg_port_select;
- uint8_t m_wmg_vram_bank;
DECLARE_READ8_MEMBER(wmg_nvram_r);
DECLARE_WRITE8_MEMBER(wmg_nvram_w);
DECLARE_READ8_MEMBER(wmg_pia_0_r);
- DECLARE_WRITE8_MEMBER(wmg_def_rombank_w);
+ DECLARE_WRITE8_MEMBER(wmg_c400_w);
+ DECLARE_WRITE8_MEMBER(wmg_d000_w);
DECLARE_WRITE_LINE_MEMBER(wmg_port_select_w);
DECLARE_WRITE8_MEMBER(wmg_sound_reset_w);
DECLARE_WRITE8_MEMBER(wmg_vram_select_w);
DECLARE_CUSTOM_INPUT_MEMBER(wmg_mux_r);
- void wmg_def_install_io_space(address_space &space);
- required_shared_ptr<uint8_t> m_p_ram;
-};
-
-
-/*************************************
- *
- * NVRAM (8k x 8), banked
- *
- *************************************/
-READ8_MEMBER( wmg_state::wmg_nvram_r )
-{
- return m_p_ram[offset+(m_wmg_bank<<10)];
-}
-
-WRITE8_MEMBER( wmg_state::wmg_nvram_w )
-{
- m_p_ram[offset+(m_wmg_bank<<10)] = data;
-}
-
-/*************************************
- *
- * Bankswitching
- *
- *************************************/
-
-/* switches the banks around when given a game number.
- The hardware has a lock feature, so that once a bank is selected, the next choice must be the menu */
-
-WRITE8_MEMBER( wmg_state::wmg_rombank_w )
-{
- address_space &space1 = m_maincpu->space(AS_PROGRAM);
- uint8_t *RAM = memregion("maincpu")->base();
-
- data &= 7;
-
- if ((!data) || (!m_wmg_bank)) // we must be going to/from the menu
- {
- m_wmg_bank = data;
- wmg_def_rombank_w( space1, 0, 0);
- memcpy( &RAM[0x10000], &RAM[(data << 16) + 0x20000], 0x9000 ); /* Gfx etc */
- membank("bank5")->set_entry(data); /* Code */
- membank("bank6")->set_entry(data); /* Sound */
- }
-}
-
-WRITE8_MEMBER( wmg_state::wmg_sound_reset_w )
-{
- /* This resets the sound card when bit 0 is low */
- if (!BIT(data, 0)) m_soundcpu->reset();
-}
-
-WRITE8_MEMBER( wmg_state::wmg_vram_select_w )
-{
- /* VRAM/ROM banking from bit 0 */
- m_wmg_vram_bank = BIT(data, 0);
- membank("bank1")->set_entry(m_wmg_vram_bank);
-
- /* cocktail flip from bit 1 */
- m_cocktail = BIT(data, 1);
-}
-
-void wmg_state::wmg_def_install_io_space(address_space &space)
-{
- pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0");
- pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1");
-
- /* this routine dynamically installs the memory mapped above from c000-cfff */
- space.install_write_bank (0xc000, 0xc00f, "bank4");
- space.install_write_handler (0xc010, 0xc01f, write8_delegate(FUNC(williams_state::defender_video_control_w),this));
- space.install_write_handler (0xc400, 0xc400, write8_delegate(FUNC(wmg_state::wmg_rombank_w),this));
- space.install_write_handler (0xc401, 0xc401, write8_delegate(FUNC(wmg_state::wmg_sound_reset_w),this));
- space.install_readwrite_handler(0xc804, 0xc807, read8_delegate(FUNC(wmg_state::wmg_pia_0_r),this), write8_delegate(FUNC(pia6821_device::write), pia_0));
- space.install_readwrite_handler(0xc80c, 0xc80f, read8_delegate(FUNC(pia6821_device::read), pia_1), write8_delegate(FUNC(pia6821_device::write), pia_1));
- space.install_write_handler (0xc900, 0xc9ff, write8_delegate(FUNC(wmg_state::wmg_vram_select_w),this));
- space.install_write_handler (0xca00, 0xca07, write8_delegate(FUNC(williams_state::williams_blitter_w),this));
- space.install_write_handler (0xcbff, 0xcbff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),this));
- space.install_read_handler (0xcb00, 0xcbff, read8_delegate(FUNC(williams_state::williams_video_counter_r),this));
- space.install_readwrite_handler(0xcc00, 0xcfff, read8_delegate(FUNC(wmg_state::wmg_nvram_r), this), write8_delegate(FUNC(wmg_state::wmg_nvram_w),this));
- membank("bank4")->set_base(m_generic_paletteram_8);
-}
-
-WRITE8_MEMBER( wmg_state::wmg_def_rombank_w )
-{
- address_space &space1 = m_maincpu->space(AS_PROGRAM);
- data &= 15;
-
- if ((m_wmg_def_bank != data) && (m_wmg_bank == 5) && (data != 0))
- {
- m_wmg_def_bank = data;
-
- /* set bank address */
- switch (data)
- {
- /* pages 1,2,3,7 map to ROM banks */
- case 1:
- case 2:
- case 3:
- space1.install_read_bank(0xc000, 0xcfff, "bank7");
- space1.unmap_write(0xc000, 0xcfff);
- membank("bank7")->set_entry(data);
- break;
-
- case 7:
- space1.install_read_bank(0xc000, 0xcfff, "bank7");
- space1.unmap_write(0xc000, 0xcfff);
- membank("bank7")->set_entry(4);
- break;
-
- default:
- printf("Unknown bank %X selected\n",data);
- }
- }
- else if ((m_wmg_def_bank != data) && (!data))
- {
- /* page 0 is I/O space */
- m_wmg_def_bank = data;
- wmg_def_install_io_space(space1);
- }
-}
-
-
-MACHINE_RESET_MEMBER( wmg_state, wmg )
-{
- address_space &space1 = m_maincpu->space(AS_PROGRAM);
- m_wmg_bank=0;
- m_wmg_def_bank=8;
- m_wmg_port_select=0;
- m_wmg_vram_bank=0;
- wmg_rombank_w( space1, 0, 0);
- MACHINE_RESET_CALL_MEMBER(williams_common);
- m_maincpu->reset();
-}
-
-/*************************************
- *
- * Input selector code
- *
- *************************************/
-
-WRITE_LINE_MEMBER( wmg_state::wmg_port_select_w )
-{
- m_wmg_port_select = state | (m_wmg_bank << 1);
-}
-CUSTOM_INPUT_MEMBER(wmg_state::wmg_mux_r)
-{
- const char *tag = (const char *)param;
+private:
- if (m_wmg_port_select)
- for (int i = 0; i < m_wmg_port_select; i++)
- tag += strlen(tag) + 1;
-
- return ioport(tag)->read();
-}
-
-READ8_MEMBER( wmg_state::wmg_pia_0_r )
-{
-/* if player presses P1 and P2 in a game, return to the menu.
- Since there is no code in rom to handle this, it must be a hardware feature
- which probably just resets the cpu. */
-
- address_space &space1 = m_maincpu->space(AS_PROGRAM);
- pia6821_device *pia_0 = space1.machine().device<pia6821_device>("pia_0");
- uint8_t data = pia_0->read(space1, offset);
+ uint8_t m_wmg_c400;
+ uint8_t m_wmg_d000;
+ uint8_t m_wmg_port_select;
+ uint8_t m_wmg_vram_bank;
+ required_shared_ptr<uint8_t> m_p_ram;
+ required_device<pia6821_device> m_pia0;
+ required_device<pia6821_device> m_pia1;
+ required_ioport_array<17> m_keyboard;
+};
- if ((m_wmg_bank) && (!offset) && ((data & 0x30) == 0x30)) // P1 and P2 pressed
- {
- wmg_rombank_w( space1, 0, 0);
- m_maincpu->reset();
- }
- return data;
-}
/*************************************
*
@@ -286,7 +125,7 @@ static ADDRESS_MAP_START( wmg_cpu1, AS_PROGRAM, 8, wmg_state )
AM_RANGE(0x9000, 0xbfff) AM_RAM
AM_RANGE(0xc000, 0xcfff) AM_ROMBANK("bank7")
AM_RANGE(0xd000, 0xffff) AM_ROMBANK("bank5")
- AM_RANGE(0xd000, 0xd000) AM_WRITE(wmg_def_rombank_w)
+ AM_RANGE(0xd000, 0xd000) AM_WRITE(wmg_d000_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( wmg_cpu2, AS_PROGRAM, 8, wmg_state )
@@ -299,17 +138,20 @@ static ADDRESS_MAP_START( wmg_cpu2, AS_PROGRAM, 8, wmg_state )
AM_RANGE(0xf000, 0xffff) AM_ROMBANK("bank6")
ADDRESS_MAP_END
-/******************************************
+/***************************************************************
*
* Inputs, banked. One set for each game.
+ * Note: defaults from original games are used.
+ * JOYSTICK PLAYER(1) is really JOYSTICKLEFT on WMG hardware
+ * JOYSTICK PLAYER(2) is really JOYSTICKRIGHT on WMG hardware
*
- ******************************************/
+ ***************************************************************/
static INPUT_PORTS_START( wmg )
PORT_START("IN0")
- PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "IN000\0IN000\0IN100\0IN100\0IN202\0IN201\0IN300\0IN300\0IN400\0IN400\0IN500\0IN500\0IN602\0IN601\0IN400\0IN400")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "0")
PORT_START("IN1")
- PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "IN010\0IN010\0IN110\0IN110\0IN210\0IN210\0IN310\0IN310\0IN410\0IN410\0IN510\0IN510\0IN612\0IN611\0IN410\0IN410")
+ PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "1")
PORT_START("IN2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Auto Up / Manual Down") PORT_TOGGLE PORT_CODE(KEYCODE_F1)
@@ -322,17 +164,17 @@ static INPUT_PORTS_START( wmg )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
/* menu */
- PORT_START("IN000")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_NAME("Menu/Left/Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_NAME("Menu/Left/Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_NAME("Menu/Left/Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_NAME("Menu/Left/Right")
+ PORT_START("X0") // IN000 (game,port,player)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Menu/Left/Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Menu/Left/Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_NAME("Menu/Left/Left")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_NAME("Menu/Left/Right")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_NAME("Menu/Right/Up")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_NAME("Menu/Right/Down")
- PORT_START("IN010")
+ PORT_START("X1") // IN010
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_NAME("Menu/Right/Left")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Menu/Right/Right")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Menu/Fire")
@@ -343,43 +185,43 @@ static INPUT_PORTS_START( wmg )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Menu/Inviso or Flap")
/* robotron */
- PORT_START("IN100")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_NAME("Robotron/Left/Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_NAME("Robotron/Left/Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_NAME("Robotron/Left/Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Left/Right")
+ PORT_START("X2") // IN100
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Robotron/Left/Move Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Robotron/Left/Move Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_NAME("Robotron/Left/Move Left")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Left/Move Right")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_NAME("Robotron/Right/Up")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_NAME("Robotron/Right/Down")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Up")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Down")
- PORT_START("IN110")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_NAME("Robotron/Right/Left")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Right/Right")
+ PORT_START("X3") // IN110
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Left")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Right")
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
/* joust */
- PORT_START("IN201") /* muxed into IN0 */
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_2WAY PORT_NAME("Joust/P1/Left")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_2WAY PORT_NAME("Joust/P1/Right")
+ PORT_START("X4") // IN201
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(1) PORT_NAME("Joust/P1/Left")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(1) PORT_NAME("Joust/P1/Right")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Joust/P1/Flap")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0xc8, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("IN202") /* muxed into IN0 */
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_2WAY PORT_NAME("Joust/P2/Left")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_2WAY PORT_NAME("Joust/P2/Right")
+ PORT_START("X5") // IN202
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2) PORT_NAME("Joust/P2/Left")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2) PORT_NAME("Joust/P2/Right")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Joust/P2/Flap")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0xc8, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_START("IN210")
+ PORT_START("X6") // IN210
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
/* stargate */
- PORT_START("IN300")
+ PORT_START("X7") // IN300
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Stargate/Fire")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stargate/Thrust")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Stargate/Smart Bomb")
@@ -387,28 +229,28 @@ static INPUT_PORTS_START( wmg )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Stargate/Reverse")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_2WAY PORT_NAME("Stargate/Down")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_2WAY PORT_NAME("Stargate/Down")
- PORT_START("IN310")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_2WAY PORT_NAME("Stargate/Up")
+ PORT_START("X8") // IN310
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY PORT_NAME("Stargate/Up")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Stargate/Inviso")
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
/* bubbles */
- PORT_START("IN400")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_NAME("Bubbles/Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_NAME("Bubbles/Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_NAME("Bubbles/Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_NAME("Bubble/Right")
+ PORT_START("X9") // IN400
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Bubbles/Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Bubbles/Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_NAME("Bubbles/Left")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_NAME("Bubble/Right")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("IN410")
+ PORT_START("X10") // IN410
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
/* defender */
- PORT_START("IN500")
+ PORT_START("X11") // IN500
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Defender/Fire")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Defender/Thrust")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Defender/Smart Bomb")
@@ -416,39 +258,231 @@ static INPUT_PORTS_START( wmg )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Defender/Reverse")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN) PORT_2WAY PORT_NAME("Defender/Down")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_2WAY PORT_NAME("Defender/Down")
- PORT_START("IN510")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_2WAY PORT_NAME("Defender/Up")
+ PORT_START("X12") // IN510
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY PORT_NAME("Defender/Up")
PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN )
/* splat - there are no P2 controls, so it can only be played by a single player */
- PORT_START("IN601") /* muxed into IN0 */
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Up")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Down")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Left")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Right")
+ PORT_START("X13") // IN601
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Up")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Down")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Left")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Right")
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Up")
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Down")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Up")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Down")
- PORT_START("IN602") /* muxed into IN0 */
+ PORT_START("X14") // IN602
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 )
PORT_BIT( 0xcf, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("IN611") /* muxed into IN1 */
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Left")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Right")
+ PORT_START("X15") // IN611
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Left")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Right")
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN )
- PORT_START("IN612") /* muxed into IN1 */
+ PORT_START("X16") // IN612
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
INPUT_PORTS_END
/*************************************
*
+ * NVRAM (8k x 8), banked
+ *
+ *************************************/
+READ8_MEMBER( wmg_state::wmg_nvram_r )
+{
+ return m_p_ram[offset+(m_wmg_c400<<10)];
+}
+
+WRITE8_MEMBER( wmg_state::wmg_nvram_w )
+{
+ m_p_ram[offset+(m_wmg_c400<<10)] = data;
+}
+
+/*************************************
+ *
+ * Bankswitching
+ *
+ *************************************/
+
+/* switches the banks around when given a game number.
+ The hardware has a lock feature, so that once a bank is selected, the next choice must be the menu */
+
+WRITE8_MEMBER( wmg_state::wmg_c400_w )
+{
+ data &= 7;
+ if (m_wmg_c400 == data)
+ return;
+
+ if ((data == 0) || (m_wmg_c400 == 0)) // we must be going to/from the menu
+ {
+ m_wmg_c400 = data;
+ wmg_d000_w( space, 0, 0); // select i/o
+ uint8_t *cpu = memregion("maincpu")->base();
+ memcpy( &cpu[0x10000], &cpu[(data << 16) + 0x20000], 0x9000 ); // Gfx etc
+ membank("bank5")->set_entry(data); // Code
+ membank("bank6")->set_entry(data); // Sound
+ m_soundcpu->reset();
+ }
+}
+
+WRITE8_MEMBER( wmg_state::wmg_sound_reset_w )
+{
+ /* This resets the sound card when bit 0 is low */
+ if (!BIT(data, 0)) m_soundcpu->reset();
+}
+
+WRITE8_MEMBER( wmg_state::wmg_vram_select_w )
+{
+ /* VRAM/ROM banking from bit 0 */
+ m_wmg_vram_bank = BIT(data, 0);
+ membank("bank1")->set_entry(m_wmg_vram_bank);
+
+ /* cocktail flip from bit 1 */
+ m_cocktail = BIT(data, 1);
+}
+
+
+// if defender, choose a rom, else enable i/o
+WRITE8_MEMBER( wmg_state::wmg_d000_w )
+{
+ data &= 15;
+ if (m_wmg_d000 == data)
+ return;
+
+ // defender && data > 0
+ if ((m_wmg_c400 == 5) && (data))
+ {
+ // replace i/o with defender roms
+ if (m_wmg_d000 == 0) // was i/o?
+ {
+ space.install_read_bank(0xc000, 0xcfff, "bank7");
+ space.unmap_write(0xc000, 0xcfff);
+ }
+
+ switch (data)
+ {
+ /* pages 1,2,3,7 map to ROM banks */
+ case 1:
+ case 2:
+ case 3:
+ membank("bank7")->set_entry(data);
+ break;
+
+ case 7:
+ membank("bank7")->set_entry(4);
+ break;
+
+ default:
+ printf("Unknown bank %X selected\n",data);
+ }
+ }
+ else
+ // everything else - choose i/o space
+ if (data == 0)
+ {
+ /* install the i/o devices into c000-cfff */
+ pia6821_device *pia0 = m_pia0;
+ pia6821_device *pia1 = m_pia1;
+
+ space.unmap_read(0xc000, 0xcfff); // throw out bank7
+ space.install_write_bank (0xc000, 0xc00f, "bank4");
+ membank("bank4")->set_base(m_generic_paletteram_8);
+ space.install_write_handler (0xc010, 0xc01f, write8_delegate(FUNC(williams_state::defender_video_control_w),this));
+ space.install_write_handler (0xc400, 0xc400, write8_delegate(FUNC(wmg_state::wmg_c400_w),this));
+ space.install_write_handler (0xc401, 0xc401, write8_delegate(FUNC(wmg_state::wmg_sound_reset_w),this));
+ space.install_readwrite_handler(0xc804, 0xc807, read8_delegate(FUNC(wmg_state::wmg_pia_0_r),this), write8_delegate(FUNC(pia6821_device::write), pia0));
+ space.install_readwrite_handler(0xc80c, 0xc80f, read8_delegate(FUNC(pia6821_device::read), pia1), write8_delegate(FUNC(pia6821_device::write), pia1));
+ space.install_write_handler (0xc900, 0xc9ff, write8_delegate(FUNC(wmg_state::wmg_vram_select_w),this));
+ space.install_write_handler (0xca00, 0xca07, write8_delegate(FUNC(williams_state::williams_blitter_w),this));
+ space.install_write_handler (0xcbff, 0xcbff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),this));
+ space.install_read_handler (0xcb00, 0xcbff, read8_delegate(FUNC(williams_state::williams_video_counter_r),this));
+ space.install_readwrite_handler(0xcc00, 0xcfff, read8_delegate(FUNC(wmg_state::wmg_nvram_r), this), write8_delegate(FUNC(wmg_state::wmg_nvram_w),this));
+ }
+
+ m_wmg_d000 = data;
+}
+
+
+MACHINE_RESET_MEMBER( wmg_state, wmg )
+{
+ address_space &space1 = m_maincpu->space(AS_PROGRAM);
+ m_wmg_c400=0xff;
+ m_wmg_d000=0xff;
+ m_wmg_port_select=0;
+ m_wmg_vram_bank=0;
+ wmg_c400_w( space1, 0, 0);
+ MACHINE_RESET_CALL_MEMBER(williams_common);
+ m_maincpu->reset();
+}
+
+/*************************************
+ *
+ * Input selector code
+ *
+ *************************************/
+
+WRITE_LINE_MEMBER( wmg_state::wmg_port_select_w )
+{
+ m_wmg_port_select = state | (m_wmg_c400 << 1);
+}
+
+CUSTOM_INPUT_MEMBER(wmg_state::wmg_mux_r)
+{
+ const char *port = (const char *)param;
+
+ if (port[0] == '0')
+ {
+ uint8_t ports[17] = { 0,0,2,2,5,4,7,7,9,9,11,11,14,13,9,9 };
+ return m_keyboard[ports[m_wmg_port_select]]->read();
+ }
+ else
+ {
+ uint8_t ports[17] = { 1,1,3,3,6,6,8,8,10,10,12,12,16,15,10,10 };
+ return m_keyboard[ports[m_wmg_port_select]]->read();
+ }
+}
+
+READ8_MEMBER( wmg_state::wmg_pia_0_r )
+{
+/* if player presses P1 and P2 in a game, return to the menu.
+ Since there is no code in rom to handle this, it must be a hardware feature
+ which probably just resets the cpu. */
+
+ uint8_t data = m_pia0->read(space, offset);
+
+ if ((m_wmg_c400) && (offset == 0) && ((data & 0x30) == 0x30)) // P1 and P2 pressed
+ {
+ wmg_c400_w( space, 0, 0);
+ m_maincpu->reset();
+ }
+
+ return data;
+}
+
+/*************************************
+ *
+ * Driver Initialisation
+ *
+ *************************************/
+DRIVER_INIT_MEMBER( wmg_state, wmg )
+{
+ uint8_t *cpu = memregion("maincpu")->base();
+ uint8_t *snd = memregion("soundcpu")->base();
+ membank("bank5")->configure_entries(0, 8, &cpu[0x2d000], 0x10000); // Code
+ membank("bank6")->configure_entries(0, 8, &snd[0x10000], 0x1000); // Sound
+ membank("bank7")->configure_entries(1, 4, &cpu[0x78000], 0x1000); // Defender roms
+ m_blitter_config = WILLIAMS_BLITTER_SC01;
+ m_blitter_clip_address = 0xc000;
+}
+
+/*************************************
+ *
* Machine Driver
*
*************************************/
@@ -505,29 +539,12 @@ MACHINE_CONFIG_END
/*************************************
*
- * Driver Initialisation
- *
- *************************************/
-DRIVER_INIT_MEMBER( wmg_state, wmg )
-{
- uint8_t *RAM = memregion("maincpu")->base();
- uint8_t *ROM = memregion("soundcpu")->base();
- membank("bank5")->configure_entries(0, 8, &RAM[0x2d000], 0x10000); /* Code */
- membank("bank6")->configure_entries(0, 8, &ROM[0x10000], 0x1000); /* Sound */
- membank("bank7")->configure_entries(1, 4, &RAM[0x78000], 0x1000); /* Defender roms */
-// CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC01, 0xc000);
- m_blitter_config = WILLIAMS_BLITTER_SC01;
- m_blitter_clip_address = 0xc000;
-}
-
-/*************************************
- *
* Roms
*
*************************************/
ROM_START( wmg )
ROM_REGION( 0xa0000, "maincpu", 0 )
- ROM_LOAD( "wmg.cpu", 0x20000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) )
+ ROM_LOAD( "wmg.cpu", 0x20000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) )
/* This little HACK! lets the menu boot up.
It patches a jump to some new code, which sets a few memory locations, and sets the stack pointer.