summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/saitek_osa/maestro.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/saitek_osa/maestro.cpp')
-rw-r--r--src/devices/bus/saitek_osa/maestro.cpp393
1 files changed, 236 insertions, 157 deletions
diff --git a/src/devices/bus/saitek_osa/maestro.cpp b/src/devices/bus/saitek_osa/maestro.cpp
index fc755dd023c..2599707130c 100644
--- a/src/devices/bus/saitek_osa/maestro.cpp
+++ b/src/devices/bus/saitek_osa/maestro.cpp
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:hap
// thanks-to:Berger
-/***************************************************************************
+/*******************************************************************************
Saitek OSA Module: Kasparov Maestro/Analyst (1987-1990)
This is for the newer versions. For Maestro A, see maestroa.*
@@ -26,28 +26,71 @@ higher speed versions, they overclocked the CPU. And if the CPU couldn't
handle the overclock well enough, they went for a slightly lower speed XTAL.
TODO:
-- does not work if cpu speed is 4MHz
- cpu clock divider after writing to 0x2000/0x2200
-***************************************************************************/
+*******************************************************************************/
#include "emu.h"
#include "maestro.h"
#include "bus/generic/carts.h"
+#include "bus/generic/slot.h"
#include "cpu/m6502/r65c02.h"
+#include "video/hd44780.h"
-#include "softlist.h"
-
-
-DEFINE_DEVICE_TYPE(OSA_MAESTRO, saitekosa_maestro_device, "osa_maestro", "Maestro B-D")
-DEFINE_DEVICE_TYPE(OSA_ANALYST, saitekosa_analyst_device, "osa_analyst", "Analyst")
+#include "softlist_dev.h"
+namespace {
//-------------------------------------------------
// initialization
//-------------------------------------------------
+// Maestro / shared
+
+class saitekosa_maestro_device : public device_t, public device_saitekosa_expansion_interface
+{
+public:
+ // construction/destruction
+ saitekosa_maestro_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ DECLARE_INPUT_CHANGED_MEMBER(change_cpu_freq);
+
+ // from host
+ virtual u8 data_r() override;
+ virtual void nmi_w(int state) override;
+ virtual void ack_w(int state) override;
+
+protected:
+ saitekosa_maestro_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ required_device<cpu_device> m_maincpu;
+ memory_share_creator<u8> m_banked_ram;
+ required_memory_bank m_rambank;
+ required_memory_bank m_rombank;
+ required_device<generic_slot_device> m_extrom;
+
+ u8 m_latch = 0xff;
+ bool m_latch_enable = false;
+ u8 m_extrom_bank = 0;
+
+ virtual void main_map(address_map &map);
+
+ u8 extrom_r(offs_t offset);
+ template <int N> void stall_w(u8 data = 0);
+ u8 rts_r();
+ u8 xdata_r();
+ void xdata_w(u8 data);
+ u8 ack_r();
+ void control_w(u8 data);
+};
+
saitekosa_maestro_device::saitekosa_maestro_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, type, tag, owner, clock),
device_saitekosa_expansion_interface(mconfig, *this),
@@ -62,11 +105,34 @@ saitekosa_maestro_device::saitekosa_maestro_device(const machine_config &mconfig
saitekosa_maestro_device(mconfig, OSA_MAESTRO, tag, owner, clock)
{ }
+
+// Analyst
+
+class saitekosa_analyst_device : public saitekosa_maestro_device
+{
+public:
+ saitekosa_analyst_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) override;
+
+ static auto parent_rom_device_type() { return &OSA_MAESTRO; }
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ required_device<hd44780_device> m_lcd;
+
+ virtual void main_map(address_map &map) override;
+};
+
saitekosa_analyst_device::saitekosa_analyst_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
saitekosa_maestro_device(mconfig, OSA_ANALYST, tag, owner, clock),
m_lcd(*this, "lcd")
{ }
+
void saitekosa_maestro_device::device_start()
{
// init banks
@@ -81,156 +147,51 @@ void saitekosa_maestro_device::device_start()
void saitekosa_maestro_device::device_reset()
{
- set_cpu_freq();
control_w(0);
}
-void saitekosa_maestro_device::set_cpu_freq()
+INPUT_CHANGED_MEMBER(saitekosa_maestro_device::change_cpu_freq)
{
static const XTAL xtal[6] = { 4_MHz_XTAL, 5.67_MHz_XTAL, 6_MHz_XTAL, 7.2_MHz_XTAL, 8_MHz_XTAL, 10_MHz_XTAL };
- m_maincpu->set_unscaled_clock(xtal[ioport("FAKE")->read() % 6]);
+ m_maincpu->set_unscaled_clock(xtal[newval % 6]);
}
//-------------------------------------------------
-// rom_region - device-specific ROM region
+// host i/o
//-------------------------------------------------
-ROM_START( maestro )
- ROM_REGION(0x10000, "maincpu", 0)
-
- ROM_DEFAULT_BIOS("d1")
-
- // B (Maestro only)
- ROM_SYSTEM_BIOS(0, "b1", "Maestro B (set 1)")
- ROMX_LOAD("m6c_807c_u2.u2", 0x0000, 0x8000, CRC(57c34b4d) SHA1(1f436687f90b1afd4646e90d5617cf05c4465c98), ROM_BIOS(0))
- ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(0))
-
- ROM_SYSTEM_BIOS(1, "b2", "Maestro B (set 2)")
- ROMX_LOAD("m6c_807e_u2.u2", 0x0000, 0x8000, CRC(a6b11715) SHA1(18e086353d9122034f78bcd75ef5b3462c5983ac), ROM_BIOS(1))
- ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(1))
-
- // C (C and above are shared Maestro/Analyst)
- ROM_SYSTEM_BIOS(2, "c", "Maestro C")
- ROMX_LOAD("m6l_b30d_u2.u2", 0x0000, 0x8000, CRC(bb10e15c) SHA1(7b0fb987c49da76a03b46c80d2b4eacaa785ee75), ROM_BIOS(2))
- ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(2))
-
- // D
- ROM_SYSTEM_BIOS(3, "d1", "Maestro D (set 1)")
- ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(3))
- ROMX_LOAD("b6m_b15_u3.u3", 0x8000, 0x8000, CRC(6155de90) SHA1(bb5cdf061dde2d1dc7925d455891c3ade1d274e3), ROM_BIOS(3))
-
- ROM_SYSTEM_BIOS(4, "d2", "Maestro D (set 2)")
- ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(4))
- ROMX_LOAD("b6m_629_u3.u3", 0x8000, 0x8000, CRC(15e7b1f1) SHA1(d2a757114f13c6141d74a15671aa06b675304b4a), ROM_BIOS(4))
-
- // D+
- ROM_SYSTEM_BIOS(5, "dp", "Maestro D+")
- ROMX_LOAD("m6m_625_u2.u2", 0x0000, 0x8000, CRC(aa7b5cfd) SHA1(e909108fdace633a519fecf0b9876fe6a46b2067), ROM_BIOS(5))
- ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(5))
-
- // D++
- ROM_SYSTEM_BIOS(6, "dpp", "Maestro D++")
- ROMX_LOAD("d++_u2.u2", 0x0000, 0x8000, CRC(48ef032c) SHA1(d336cb2096780b4d3bcceda0d2ed1246e780cd8d), ROM_BIOS(6))
- ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(6))
-ROM_END
-
-ROM_START( analyst )
- ROM_REGION(0x10000, "maincpu", 0)
-
- ROM_DEFAULT_BIOS("d1")
-
- // B (Analyst only)
- ROM_SYSTEM_BIOS(0, "b", "Analyst B")
- ROMX_LOAD("m6l_a15_u2.u2", 0x0000, 0x8000, CRC(91570897) SHA1(e6db36ffc87ce3941a3e12222678069cff9e47f6), ROM_BIOS(0))
- ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(0))
-
- // C (C and above are shared Maestro/Analyst)
- ROM_SYSTEM_BIOS(1, "c", "Analyst C")
- ROMX_LOAD("m6l_b30d_u2.u2", 0x0000, 0x8000, CRC(bb10e15c) SHA1(7b0fb987c49da76a03b46c80d2b4eacaa785ee75), ROM_BIOS(1))
- ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(1))
-
- // D
- ROM_SYSTEM_BIOS(2, "d1", "Analyst D (set 1)")
- ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(2))
- ROMX_LOAD("b6m_b15_u3.u3", 0x8000, 0x8000, CRC(6155de90) SHA1(bb5cdf061dde2d1dc7925d455891c3ade1d274e3), ROM_BIOS(2))
-
- ROM_SYSTEM_BIOS(3, "d2", "Analyst D (set 2)")
- ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(3))
- ROMX_LOAD("b6m_629_u3.u3", 0x8000, 0x8000, CRC(15e7b1f1) SHA1(d2a757114f13c6141d74a15671aa06b675304b4a), ROM_BIOS(3))
-
- // D+
- ROM_SYSTEM_BIOS(4, "dp", "Analyst D+")
- ROMX_LOAD("m6m_625_u2.u2", 0x0000, 0x8000, CRC(aa7b5cfd) SHA1(e909108fdace633a519fecf0b9876fe6a46b2067), ROM_BIOS(4))
- ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(4))
-
- // D++
- ROM_SYSTEM_BIOS(5, "dpp", "Analyst D++")
- ROMX_LOAD("d++_u2.u2", 0x0000, 0x8000, CRC(48ef032c) SHA1(d336cb2096780b4d3bcceda0d2ed1246e780cd8d), ROM_BIOS(5))
- ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(5))
-ROM_END
-
-const tiny_rom_entry *saitekosa_maestro_device::device_rom_region() const
-{
- return ROM_NAME(maestro);
-}
-
-const tiny_rom_entry *saitekosa_analyst_device::device_rom_region() const
+u8 saitekosa_maestro_device::data_r()
{
- return ROM_NAME(analyst);
+ return m_latch_enable ? m_latch : 0xff;
}
-
-//-------------------------------------------------
-// input_ports - device-specific input ports
-//-------------------------------------------------
-
-static INPUT_PORTS_START( maestro )
- PORT_START("FAKE")
- PORT_CONFNAME( 0x07, 0x04, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, saitekosa_maestro_device, switch_cpu_freq, 0) // factory set
- PORT_CONFSETTING( 0x00, "4MHz" )
- PORT_CONFSETTING( 0x01, "5.67MHz" )
- PORT_CONFSETTING( 0x02, "6MHz" )
- PORT_CONFSETTING( 0x03, "7.2MHz" )
- PORT_CONFSETTING( 0x04, "8MHz" )
- PORT_CONFSETTING( 0x05, "10MHz" )
-INPUT_PORTS_END
-
-ioport_constructor saitekosa_maestro_device::device_input_ports() const
+void saitekosa_maestro_device::nmi_w(int state)
{
- return INPUT_PORTS_NAME(maestro);
+ m_maincpu->set_input_line(0, !state ? ASSERT_LINE : CLEAR_LINE);
}
-
-//-------------------------------------------------
-// device_add_mconfig - add device configuration
-//-------------------------------------------------
-
-void saitekosa_maestro_device::device_add_mconfig(machine_config &config)
+void saitekosa_maestro_device::ack_w(int state)
{
- // basic machine hardware
- R65C02(config, m_maincpu, 8_MHz_XTAL);
- m_maincpu->set_addrmap(AS_PROGRAM, &saitekosa_maestro_device::main_map);
-
- // extension rom
- GENERIC_SOCKET(config, "extrom", generic_plain_slot, "saitek_egr");
- SOFTWARE_LIST(config, "cart_list").set_original("saitek_egr");
+ if (state != m_expansion->ack_state())
+ machine().scheduler().perfect_quantum(attotime::from_usec(100));
}
-void saitekosa_analyst_device::device_add_mconfig(machine_config &config)
+u32 saitekosa_analyst_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- saitekosa_maestro_device::device_add_mconfig(config);
+ bitmap.fill(0xffffff, cliprect);
+ const u8 *render = m_lcd->render();
- // video hardware
- HD44780(config, m_lcd, 0);
- m_lcd->set_lcd_size(2, 8);
-}
+ // draw lcd characters
+ for (int i = 0; i < 16; i++)
+ {
+ const u8 *src = render + 16 * ((i & 7) + BIT(i, 3) * 40);
+ for (int y = 0; y < 8; y++)
+ for (int x = 0; x < 5; x++)
+ bitmap.pix(y + 4, i * 6 + x + 2) = (BIT(src[y], 4 - x) && m_expansion->pw_state()) ? 0x282828 : 0xe8e8e8;
+ }
-void saitekosa_analyst_device::device_config_complete()
-{
- auto *screen = subdevice<screen_device>("^screen");
- screen->set_size(6 * 16 + 3, 16);
- screen->set_visarea_full();
+ return 0;
}
@@ -291,7 +252,7 @@ void saitekosa_maestro_device::control_w(u8 data)
u8 saitekosa_maestro_device::ack_r()
{
- // d6: ?
+ // d6: _Vcc
// d7: ACK-P
return m_expansion->ack_state() ? 0x80 : 0x00;
}
@@ -316,38 +277,156 @@ void saitekosa_analyst_device::main_map(address_map &map)
//-------------------------------------------------
-// host i/o
+// input_ports - device-specific input ports
//-------------------------------------------------
-u8 saitekosa_maestro_device::data_r()
+static INPUT_PORTS_START( maestro )
+ PORT_START("CPU")
+ PORT_CONFNAME( 0x07, 0x04, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, saitekosa_maestro_device, change_cpu_freq, 0) // factory set
+ PORT_CONFSETTING( 0x00, "4MHz" )
+ PORT_CONFSETTING( 0x01, "5.67MHz" )
+ PORT_CONFSETTING( 0x02, "6MHz" )
+ PORT_CONFSETTING( 0x03, "7.2MHz" )
+ PORT_CONFSETTING( 0x04, "8MHz" )
+ PORT_CONFSETTING( 0x05, "10MHz" )
+INPUT_PORTS_END
+
+ioport_constructor saitekosa_maestro_device::device_input_ports() const
{
- return m_latch_enable ? m_latch : 0xff;
+ return INPUT_PORTS_NAME(maestro);
}
-void saitekosa_maestro_device::nmi_w(int state)
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void saitekosa_maestro_device::device_add_mconfig(machine_config &config)
{
- m_maincpu->set_input_line(0, !state ? ASSERT_LINE : CLEAR_LINE);
+ // basic machine hardware
+ R65C02(config, m_maincpu, 8_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &saitekosa_maestro_device::main_map);
+
+ // extension rom
+ GENERIC_SOCKET(config, "extrom", generic_plain_slot, "saitek_egr");
+ SOFTWARE_LIST(config, "cart_list").set_original("saitek_egr");
}
-void saitekosa_maestro_device::ack_w(int state)
+void saitekosa_analyst_device::device_add_mconfig(machine_config &config)
{
- if (state != m_expansion->ack_state())
- machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100));
+ saitekosa_maestro_device::device_add_mconfig(config);
+
+ // video hardware
+ HD44780(config, m_lcd, 270'000); // OSC = 91K resistor
}
-u32 saitekosa_analyst_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
-{
- bitmap.fill(0xffffff, cliprect);
- const u8 *render = m_lcd->render();
- // draw lcd characters
- for (int i = 0; i < 16; i++)
- {
- const u8 *src = render + 16 * ((i & 7) + BIT(i, 3) * 40);
- for (int y = 0; y < 8; y++)
- for (int x = 0; x < 5; x++)
- bitmap.pix(y + 4, i * 6 + x + 2) = (BIT(src[y], 4 - x) && m_expansion->pw_state()) ? 0x282828 : 0xe8e8e8;
- }
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
- return 0;
+ROM_START( maestro )
+ ROM_REGION(0x10000, "maincpu", 0)
+
+ ROM_DEFAULT_BIOS("d1")
+
+ // B (Maestro only)
+ ROM_SYSTEM_BIOS(0, "b1", "Maestro B (set 1)")
+ ROMX_LOAD("m6c_807e_u2.u2", 0x0000, 0x8000, CRC(a6b11715) SHA1(18e086353d9122034f78bcd75ef5b3462c5983ac), ROM_BIOS(0))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(0))
+
+ ROM_SYSTEM_BIOS(1, "b2", "Maestro B (set 2)")
+ ROMX_LOAD("m6c_807c_u2.u2", 0x0000, 0x8000, CRC(57c34b4d) SHA1(1f436687f90b1afd4646e90d5617cf05c4465c98), ROM_BIOS(1))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(1))
+
+ // C (C and above are shared Maestro/Analyst)
+ ROM_SYSTEM_BIOS(2, "c1", "Maestro C (set 1)")
+ ROMX_LOAD("m6l_b30d_u2.u2", 0x0000, 0x8000, CRC(bb10e15c) SHA1(7b0fb987c49da76a03b46c80d2b4eacaa785ee75), ROM_BIOS(2))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(2))
+
+ ROM_SYSTEM_BIOS(3, "c2", "Maestro C (set 2)")
+ ROMX_LOAD("m6l_b30b_u2.u2", 0x0000, 0x8000, CRC(4b5026d7) SHA1(9715a0220c1bd3456480104f1c7ae61cbf1a1d73), ROM_BIOS(3))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(3))
+
+ ROM_SYSTEM_BIOS(4, "c3", "Maestro C (set 3)")
+ ROMX_LOAD("m6l_b25_u2.u2", 0x0000, 0x8000, CRC(217ae56c) SHA1(27ec80d0f82723c2710e2ccb477705934a4c2119), ROM_BIOS(4))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(4))
+
+ // D
+ ROM_SYSTEM_BIOS(5, "d1", "Maestro D (set 1)")
+ ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(5))
+ ROMX_LOAD("b6m_b15_u3.u3", 0x8000, 0x8000, CRC(6155de90) SHA1(bb5cdf061dde2d1dc7925d455891c3ade1d274e3), ROM_BIOS(5))
+
+ ROM_SYSTEM_BIOS(6, "d2", "Maestro D (set 2)")
+ ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(6))
+ ROMX_LOAD("b6m_629_u3.u3", 0x8000, 0x8000, CRC(15e7b1f1) SHA1(d2a757114f13c6141d74a15671aa06b675304b4a), ROM_BIOS(6))
+
+ // D+
+ ROM_SYSTEM_BIOS(7, "dp", "Maestro D+")
+ ROMX_LOAD("m6m_625_u2.u2", 0x0000, 0x8000, CRC(aa7b5cfd) SHA1(e909108fdace633a519fecf0b9876fe6a46b2067), ROM_BIOS(7))
+ ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(7))
+
+ // D++
+ ROM_SYSTEM_BIOS(8, "dpp", "Maestro D++")
+ ROMX_LOAD("d++_u2.u2", 0x0000, 0x8000, CRC(48ef032c) SHA1(d336cb2096780b4d3bcceda0d2ed1246e780cd8d), ROM_BIOS(8))
+ ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(8))
+ROM_END
+
+ROM_START( analyst )
+ ROM_REGION(0x10000, "maincpu", 0)
+
+ ROM_DEFAULT_BIOS("d1")
+
+ // B (Analyst only)
+ ROM_SYSTEM_BIOS(0, "b", "Analyst B")
+ ROMX_LOAD("m6l_a15_u2.u2", 0x0000, 0x8000, CRC(91570897) SHA1(e6db36ffc87ce3941a3e12222678069cff9e47f6), ROM_BIOS(0))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(0))
+
+ // C (C and above are shared Maestro/Analyst)
+ ROM_SYSTEM_BIOS(1, "c1", "Analyst C (set 1)")
+ ROMX_LOAD("m6l_b30d_u2.u2", 0x0000, 0x8000, CRC(bb10e15c) SHA1(7b0fb987c49da76a03b46c80d2b4eacaa785ee75), ROM_BIOS(1))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(1))
+
+ ROM_SYSTEM_BIOS(2, "c2", "Analyst C (set 2)")
+ ROMX_LOAD("m6l_b30b_u2.u2", 0x0000, 0x8000, CRC(4b5026d7) SHA1(9715a0220c1bd3456480104f1c7ae61cbf1a1d73), ROM_BIOS(2))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(2))
+
+ ROM_SYSTEM_BIOS(3, "c3", "Analyst C (set 3)")
+ ROMX_LOAD("m6l_b25_u2.u2", 0x0000, 0x8000, CRC(217ae56c) SHA1(27ec80d0f82723c2710e2ccb477705934a4c2119), ROM_BIOS(3))
+ ROMX_LOAD("b6c_721_u3.u3", 0x8000, 0x8000, CRC(b1e57023) SHA1(6cec5cdc0bf4f8ac88afb0397fcb4738136b0431), ROM_BIOS(3))
+
+ // D
+ ROM_SYSTEM_BIOS(4, "d1", "Analyst D (set 1)")
+ ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(4))
+ ROMX_LOAD("b6m_b15_u3.u3", 0x8000, 0x8000, CRC(6155de90) SHA1(bb5cdf061dde2d1dc7925d455891c3ade1d274e3), ROM_BIOS(4))
+
+ ROM_SYSTEM_BIOS(5, "d2", "Analyst D (set 2)")
+ ROMX_LOAD("ma3_714a_u2.u2", 0x0000, 0x8000, CRC(435e1e30) SHA1(0d82df7c40443cb341dacebdf65f33c3e03bce70), ROM_BIOS(5))
+ ROMX_LOAD("b6m_629_u3.u3", 0x8000, 0x8000, CRC(15e7b1f1) SHA1(d2a757114f13c6141d74a15671aa06b675304b4a), ROM_BIOS(5))
+
+ // D+
+ ROM_SYSTEM_BIOS(6, "dp", "Analyst D+")
+ ROMX_LOAD("m6m_625_u2.u2", 0x0000, 0x8000, CRC(aa7b5cfd) SHA1(e909108fdace633a519fecf0b9876fe6a46b2067), ROM_BIOS(6))
+ ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(6))
+
+ // D++
+ ROM_SYSTEM_BIOS(7, "dpp", "Analyst D++")
+ ROMX_LOAD("d++_u2.u2", 0x0000, 0x8000, CRC(48ef032c) SHA1(d336cb2096780b4d3bcceda0d2ed1246e780cd8d), ROM_BIOS(7))
+ ROMX_LOAD("b6m_614_u3.u3", 0x8000, 0x8000, CRC(eff75543) SHA1(d7c1b3824bc87d5ffada6f5c8c72a8b292ff3d46), ROM_BIOS(7))
+ROM_END
+
+const tiny_rom_entry *saitekosa_maestro_device::device_rom_region() const
+{
+ return ROM_NAME(maestro);
}
+
+const tiny_rom_entry *saitekosa_analyst_device::device_rom_region() const
+{
+ return ROM_NAME(analyst);
+}
+
+} // anonymous namespace
+
+
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_MAESTRO, device_saitekosa_expansion_interface, saitekosa_maestro_device, "osa_maestro", "Saitek OSA Maestro B-D")
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_ANALYST, device_saitekosa_expansion_interface, saitekosa_analyst_device, "osa_analyst", "Saitek OSA Analyst")