diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/drivers/hh_tms1k.cpp | 33 | ||||
-rw-r--r-- | src/mame/drivers/wmg.cpp | 513 |
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. |