summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/saitek_osa
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-05-14 22:00:28 +0200
committer hap <happppp@users.noreply.github.com>2021-05-14 22:00:42 +0200
commitc8d53cabbdd8b6056d27f9a3a541aaf1cfc00be0 (patch)
tree1e034a4e3db94f3073b00e1d49b896418018825b /src/devices/bus/saitek_osa
parentc89891e4aa3746da8d3f325a6e4db5bd1468e1c8 (diff)
added saitek OSA module interface used in leonardo/renaissance
Diffstat (limited to 'src/devices/bus/saitek_osa')
-rw-r--r--src/devices/bus/saitek_osa/expansion.cpp127
-rw-r--r--src/devices/bus/saitek_osa/expansion.h117
-rw-r--r--src/devices/bus/saitek_osa/maestroa.cpp54
-rw-r--r--src/devices/bus/saitek_osa/maestroa.h40
-rw-r--r--src/devices/bus/saitek_osa/modules.cpp17
-rw-r--r--src/devices/bus/saitek_osa/modules.h16
6 files changed, 371 insertions, 0 deletions
diff --git a/src/devices/bus/saitek_osa/expansion.cpp b/src/devices/bus/saitek_osa/expansion.cpp
new file mode 100644
index 00000000000..ec5f527c919
--- /dev/null
+++ b/src/devices/bus/saitek_osa/expansion.cpp
@@ -0,0 +1,127 @@
+// license:BSD-3-Clause
+// copyright-holders:Dirk Best, hap
+/***************************************************************************
+
+Saitek OSA Expansion Slot
+
+TODO:
+- not sure what RTS does
+
+***************************************************************************/
+
+#include "emu.h"
+#include "expansion.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(SAITEKOSA_EXPANSION, saitekosa_expansion_device, "saitekosa_expansion", "Saitek OSA Expansion Bus")
+
+
+//**************************************************************************
+// SLOT DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// saitekosa_expansion_device - constructor
+//-------------------------------------------------
+
+saitekosa_expansion_device::saitekosa_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, SAITEKOSA_EXPANSION, tag, owner, clock),
+ device_single_card_slot_interface<device_saitekosa_expansion_interface>(mconfig, *this),
+ m_stb_handler(*this),
+ m_rts_handler(*this),
+ m_module(nullptr)
+{ }
+
+//-------------------------------------------------
+// saitekosa_expansion_device - destructor
+//-------------------------------------------------
+
+saitekosa_expansion_device::~saitekosa_expansion_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void saitekosa_expansion_device::device_start()
+{
+ // get inserted module
+ m_module = get_card_device();
+
+ // resolve callbacks
+ m_stb_handler.resolve_safe();
+ m_rts_handler.resolve_safe();
+
+ // register for savestates
+ save_item(NAME(m_data));
+ save_item(NAME(m_nmi));
+ save_item(NAME(m_ack));
+}
+
+//-------------------------------------------------
+// host to module interface
+//-------------------------------------------------
+
+u8 saitekosa_expansion_device::data_r()
+{
+ if (m_module)
+ return m_module->data_r();
+
+ return 0xff;
+}
+
+void saitekosa_expansion_device::data_w(u8 data)
+{
+ if (m_module)
+ m_module->data_w(data);
+
+ m_data = data;
+}
+
+void saitekosa_expansion_device::nmi_w(int state)
+{
+ state = (state) ? 1 : 0;
+
+ if (m_module)
+ m_module->nmi_w(state);
+
+ m_nmi = state;
+}
+
+void saitekosa_expansion_device::ack_w(int state)
+{
+ state = (state) ? 1 : 0;
+
+ if (m_module)
+ m_module->ack_w(state);
+
+ m_ack = state;
+}
+
+
+//**************************************************************************
+// MODULE INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_saitekosa_expansion_interface - constructor
+//-------------------------------------------------
+
+device_saitekosa_expansion_interface::device_saitekosa_expansion_interface(const machine_config &mconfig, device_t &device) :
+ device_interface(device, "saitekosaexp")
+{
+ m_expansion = dynamic_cast<saitekosa_expansion_device *>(device.owner());
+}
+
+//-------------------------------------------------
+// ~device_saitekosa_expansion_interface - destructor
+//-------------------------------------------------
+
+device_saitekosa_expansion_interface::~device_saitekosa_expansion_interface()
+{
+}
diff --git a/src/devices/bus/saitek_osa/expansion.h b/src/devices/bus/saitek_osa/expansion.h
new file mode 100644
index 00000000000..2e6727d3f1b
--- /dev/null
+++ b/src/devices/bus/saitek_osa/expansion.h
@@ -0,0 +1,117 @@
+// license:BSD-3-Clause
+// copyright-holders:Dirk Best, hap
+/***************************************************************************
+
+ Saitek OSA Expansion Slot
+
+ 15-pin slot "PIO"
+
+ STB-P <
+ D0 <>
+ D1 <>
+ D2 <>
+ D3 <>
+ D4 <>
+ D5 <>
+ D6 <>
+ D7 <>
+ ACK-P >
+ RTS-P <
+ PW >
+ GND >
+ NMI-P >
+ V+ >
+
+***************************************************************************/
+
+#ifndef MAME_BUS_SAITEKOSA_EXPANSION_H
+#define MAME_BUS_SAITEKOSA_EXPANSION_H
+
+#pragma once
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class device_saitekosa_expansion_interface;
+
+// ======================> saitekosa_expansion_device
+
+class saitekosa_expansion_device : public device_t, public device_single_card_slot_interface<device_saitekosa_expansion_interface>
+{
+public:
+ // construction/destruction
+ template <typename T>
+ saitekosa_expansion_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts) :
+ saitekosa_expansion_device(mconfig, tag, owner, u32(0))
+ {
+ option_reset();
+ opts(*this);
+ set_default_option(nullptr);
+ set_fixed(false);
+ }
+
+ saitekosa_expansion_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ virtual ~saitekosa_expansion_device();
+
+ // callbacks
+ auto stb_handler() { return m_stb_handler.bind(); }
+ auto rts_handler() { return m_rts_handler.bind(); }
+
+ // called from module device
+ void stb_w(int state) { m_stb_handler(state); }
+ void rts_w(int state) { m_rts_handler(state); }
+
+ u8 data_state() { return m_data; }
+ int nmi_state() { return m_nmi; }
+ int ack_state() { return m_ack; }
+
+ // called from host
+ u8 data_r();
+ void data_w(u8 data);
+ void nmi_w(int state);
+ void ack_w(int state);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ devcb_write_line m_stb_handler;
+ devcb_write_line m_rts_handler;
+
+ // input pins state
+ u8 m_data = 0;
+ int m_nmi = 0;
+ int m_ack = 0;
+
+ device_saitekosa_expansion_interface *m_module;
+};
+
+// ======================> device_saitekosa_expansion_interface
+
+class device_saitekosa_expansion_interface : public device_interface
+{
+public:
+ // construction/destruction
+ virtual ~device_saitekosa_expansion_interface();
+
+ virtual u8 data_r() { return 0xff; }
+ virtual void data_w(u8 data) { }
+ virtual void nmi_w(int state) { }
+ virtual void ack_w(int state) { }
+
+protected:
+ device_saitekosa_expansion_interface(const machine_config &mconfig, device_t &device);
+
+ saitekosa_expansion_device *m_expansion;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(SAITEKOSA_EXPANSION, saitekosa_expansion_device)
+
+// include here so drivers don't need to
+#include "modules.h"
+
+#endif // MAME_BUS_SAITEKOSA_EXPANSION_H
diff --git a/src/devices/bus/saitek_osa/maestroa.cpp b/src/devices/bus/saitek_osa/maestroa.cpp
new file mode 100644
index 00000000000..e895828c01e
--- /dev/null
+++ b/src/devices/bus/saitek_osa/maestroa.cpp
@@ -0,0 +1,54 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/***************************************************************************
+
+***************************************************************************/
+
+#include "emu.h"
+#include "maestroa.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device, "osa_maestroa", "Maestro A")
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void saitekosa_maestroa_device::device_add_mconfig(machine_config &config)
+{
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// saitekosa_maestroa_device - constructor
+//-------------------------------------------------
+
+saitekosa_maestroa_device::saitekosa_maestroa_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, OSA_MAESTROA, tag, owner, clock),
+ device_saitekosa_expansion_interface(mconfig, *this)
+{ }
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void saitekosa_maestroa_device::device_start()
+{
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+void saitekosa_maestroa_device::nmi_w(int state)
+{
+}
diff --git a/src/devices/bus/saitek_osa/maestroa.h b/src/devices/bus/saitek_osa/maestroa.h
new file mode 100644
index 00000000000..2048bde7b60
--- /dev/null
+++ b/src/devices/bus/saitek_osa/maestroa.h
@@ -0,0 +1,40 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/***************************************************************************
+
+ Saitek OSA Maestro A
+
+***************************************************************************/
+
+#ifndef MAME_BUS_SAITEKOSA_MAESTROA_H
+#define MAME_BUS_SAITEKOSA_MAESTROA_H
+
+#pragma once
+
+#include "expansion.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> saitekosa_maestroa_device
+
+class saitekosa_maestroa_device : public device_t, public device_saitekosa_expansion_interface
+{
+public:
+ // construction/destruction
+ saitekosa_maestroa_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ // from host
+ virtual void nmi_w(int state) override;
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+};
+
+// device type definition
+DECLARE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device)
+
+#endif // MAME_BUS_SAITEKOSA_MAESTROA_H
diff --git a/src/devices/bus/saitek_osa/modules.cpp b/src/devices/bus/saitek_osa/modules.cpp
new file mode 100644
index 00000000000..e220b59f6aa
--- /dev/null
+++ b/src/devices/bus/saitek_osa/modules.cpp
@@ -0,0 +1,17 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/***************************************************************************
+
+ Saitek OSA Expansion Slot modules
+
+***************************************************************************/
+
+#include "emu.h"
+#include "modules.h"
+
+#include "maestroa.h"
+
+void saitekosa_expansion_modules(device_slot_interface &device)
+{
+ device.option_add("maestroa", OSA_MAESTROA);
+}
diff --git a/src/devices/bus/saitek_osa/modules.h b/src/devices/bus/saitek_osa/modules.h
new file mode 100644
index 00000000000..009daf69cec
--- /dev/null
+++ b/src/devices/bus/saitek_osa/modules.h
@@ -0,0 +1,16 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/***************************************************************************
+
+ Saitek OSA Expansion Slot modules
+
+***************************************************************************/
+
+#ifndef MAME_BUS_SAITEKOSA_MODULES_H
+#define MAME_BUS_SAITEKOSA_MODULES_H
+
+#pragma once
+
+void saitekosa_expansion_modules(device_slot_interface &device);
+
+#endif // MAME_BUS_SAITEKOSA_MODULES_H