From 646bcfc81e53325532b725d3bf51d4187f65f6d8 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 26 Nov 2022 20:14:43 +1100 Subject: bus/msx/ctrl: Added FM Towns Marty Pad. fujistsu/fmtowns.cpp: Made FM Towns Marty have a single Marty Pad plugged in by default. --- src/devices/bus/msx/ctrl/ctrl.cpp | 1 + src/devices/bus/msx/ctrl/ctrl.h | 2 +- src/devices/bus/msx/ctrl/townspad.cpp | 62 ++++++++++++++++++++++++++--------- src/devices/bus/msx/ctrl/townspad.h | 1 + src/mame/fujitsu/fmtowns.cpp | 3 ++ src/mame/fujitsu/fmtowns.h | 6 ++-- 6 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/devices/bus/msx/ctrl/ctrl.cpp b/src/devices/bus/msx/ctrl/ctrl.cpp index d698f759ece..71dc9b6c119 100644 --- a/src/devices/bus/msx/ctrl/ctrl.cpp +++ b/src/devices/bus/msx/ctrl/ctrl.cpp @@ -44,6 +44,7 @@ void msx_general_purpose_port_devices(device_slot_interface &device) { device.option_add("joystick", MSX_JOYSTICK); device.option_add("libbler", MSX_LIBBLERPAD); + device.option_add("martypad", MSX_MARTYPAD); device.option_add("mouse", MSX_MOUSE); device.option_add("towns6b", MSX_TOWNS6B); device.option_add("townspad", MSX_TOWNSPAD); diff --git a/src/devices/bus/msx/ctrl/ctrl.h b/src/devices/bus/msx/ctrl/ctrl.h index b9332ddea64..bc827c31e7e 100644 --- a/src/devices/bus/msx/ctrl/ctrl.h +++ b/src/devices/bus/msx/ctrl/ctrl.h @@ -60,7 +60,7 @@ public: // pin 5 - +5V // bit 4 - pin 6 - Button 1 (I/O) // bit 5 - pin 7 - Button 2 (I/O) - // pin 8 - Strobe (O) + // bit 6 - pin 8 - Strobe (O for MSX, I/O for FM Towns) // pin 9 - GND // u8 read() { return exists() ? m_device->read() : 0xff; } diff --git a/src/devices/bus/msx/ctrl/townspad.cpp b/src/devices/bus/msx/ctrl/townspad.cpp index f646502ee58..2a77cf94ed9 100644 --- a/src/devices/bus/msx/ctrl/townspad.cpp +++ b/src/devices/bus/msx/ctrl/townspad.cpp @@ -14,14 +14,22 @@ namespace { INPUT_PORTS_START(fm_towns_pad) PORT_START("PAD") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_8WAY - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_8WAY - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_8WAY - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("%p A") - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("%p B") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_START) PORT_NAME("%p Run") - PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_SELECT) + PORT_BIT(0x001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_8WAY + PORT_BIT(0x002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_8WAY + PORT_BIT(0x004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_8WAY + PORT_BIT(0x008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY + PORT_BIT(0x010, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("%p A") + PORT_BIT(0x020, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("%p B") + PORT_BIT(0x0c0, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x100, IP_ACTIVE_LOW, IPT_START) PORT_NAME("%p Run") + PORT_BIT(0x200, IP_ACTIVE_LOW, IPT_SELECT) +INPUT_PORTS_END + +INPUT_PORTS_START(marty_pad) + PORT_INCLUDE(fm_towns_pad) + + PORT_MODIFY("PAD") + PORT_BIT(0x040, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("%p Zoom") // shoulder button INPUT_PORTS_END @@ -33,6 +41,8 @@ public: virtual u8 read() override; protected: + fm_towns_pad_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + virtual void device_start() override { } virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(fm_towns_pad); } @@ -42,7 +52,12 @@ private: fm_towns_pad_device::fm_towns_pad_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, MSX_TOWNSPAD, tag, owner, clock) + : fm_towns_pad_device(mconfig, MSX_TOWNSPAD, tag, owner, clock) +{ +} + +fm_towns_pad_device::fm_towns_pad_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, type, tag, owner, clock) , device_msx_general_purpose_port_interface(mconfig, *this) , m_pad(*this, "PAD") { @@ -50,15 +65,32 @@ fm_towns_pad_device::fm_towns_pad_device(const machine_config &mconfig, const ch u8 fm_towns_pad_device::read() { - u8 pad = m_pad->read(); - if (!BIT(pad, 6)) // RUN activates RIGHT+LEFT - pad &= 0xf3; - if (!BIT(pad, 7)) // SELECT activates BACK+FWD - pad &= 0xfc; - return pad | 0xc0; + auto pad = m_pad->read(); + if (!BIT(pad, 8)) // RUN activates RIGHT+LEFT + pad &= ~0x0c; + if (!BIT(pad, 9)) // SELECT activates BACK+FWD + pad &= ~0x03; + return u8(pad & 0xff); +} + + +class marty_pad_device : public fm_towns_pad_device +{ +public: + marty_pad_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + virtual ioport_constructor device_input_ports() const override { return INPUT_PORTS_NAME(marty_pad); } +}; + + +marty_pad_device::marty_pad_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : fm_towns_pad_device(mconfig, MSX_MARTYPAD, tag, owner, clock) +{ } } // anonymous namespace DEFINE_DEVICE_TYPE_PRIVATE(MSX_TOWNSPAD, device_msx_general_purpose_port_interface, fm_towns_pad_device, "msx_townspad", "FM Towns 2-button Pad") +DEFINE_DEVICE_TYPE_PRIVATE(MSX_MARTYPAD, device_msx_general_purpose_port_interface, marty_pad_device, "msx_martypad", "FM Towns Marty Pad") diff --git a/src/devices/bus/msx/ctrl/townspad.h b/src/devices/bus/msx/ctrl/townspad.h index c5fa88fa937..c6070526be6 100644 --- a/src/devices/bus/msx/ctrl/townspad.h +++ b/src/devices/bus/msx/ctrl/townspad.h @@ -15,5 +15,6 @@ DECLARE_DEVICE_TYPE(MSX_TOWNSPAD, device_msx_general_purpose_port_interface) +DECLARE_DEVICE_TYPE(MSX_MARTYPAD, device_msx_general_purpose_port_interface) #endif // MAME_BUS_MSX_CTRL_TOWNSPAD_H diff --git a/src/mame/fujitsu/fmtowns.cpp b/src/mame/fujitsu/fmtowns.cpp index 48c5baad75b..83539ca0011 100644 --- a/src/mame/fujitsu/fmtowns.cpp +++ b/src/mame/fujitsu/fmtowns.cpp @@ -2724,6 +2724,9 @@ void marty_state::marty(machine_config &config) m_maincpu->set_vblank_int("screen", FUNC(towns_state::towns_vsync_irq)); m_maincpu->set_irq_acknowledge_callback("pic8259_master", FUNC(pic8259_device::inta_cb)); + m_pad_ports[0]->set_default_option("martypad"); + m_pad_ports[1]->set_default_option(nullptr); + FLOPPY_CONNECTOR(config.replace(), m_flop[1], towns_floppies, nullptr, towns_state::floppy_formats); // 2 MB onboard, expandable to 4 MB with a Marty-only expansion card diff --git a/src/mame/fujitsu/fmtowns.h b/src/mame/fujitsu/fmtowns.h index e1aaead698c..f450575dd32 100644 --- a/src/mame/fujitsu/fmtowns.h +++ b/src/mame/fujitsu/fmtowns.h @@ -101,6 +101,7 @@ public: , m_dma(*this, "dma_%u", 1U) , m_scsi(*this, "fmscsi") , m_flop(*this, "fdc:%u", 0U) + , m_pad_ports(*this, "pad%u", 1U) , m_speaker(*this, "speaker") , m_pic_master(*this, "pic8259_master") , m_pic_slave(*this, "pic8259_slave") @@ -124,7 +125,6 @@ public: , m_nvram(*this, "nvram") , m_nvram16(*this, "nvram16") , m_kb_ports(*this, "key%u", 1U) - , m_pad_ports(*this, "pad%u", 1U) , m_user(*this,"user") , m_serial(*this,"serial") { } @@ -162,6 +162,9 @@ protected: required_device_array m_dma; optional_device m_scsi; required_device_array m_flop; + + required_device_array m_pad_ports; + static void floppy_formats(format_registration &fr); DECLARE_WRITE_LINE_MEMBER(towns_scsi_irq); @@ -359,7 +362,6 @@ private: void cdda_db_to_gain(float db); required_ioport_array<4> m_kb_ports; - required_device_array m_pad_ports; required_memory_region m_user; optional_memory_region m_serial; -- cgit v1.2.3