summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-05-15 00:33:42 +0200
committer hap <happppp@users.noreply.github.com>2021-05-15 00:33:53 +0200
commit5f5650a936c12225662f7e63e58790999e17a9f8 (patch)
tree0347ca7762b3f43a145324dd2c50c19d285e1ab7
parent78a40fdb3369aad00e637c7b240218fcf05fc5f3 (diff)
saitek_osa: added Maestro A module [hap, Berger]
-rw-r--r--src/devices/bus/saitek_osa/maestroa.cpp132
-rw-r--r--src/devices/bus/saitek_osa/maestroa.h27
-rw-r--r--src/mame/drivers/saitek_leonardo.cpp4
-rw-r--r--src/mame/drivers/saitek_renaissance.cpp28
-rw-r--r--src/mame/drivers/saitek_superstar.cpp5
5 files changed, 162 insertions, 34 deletions
diff --git a/src/devices/bus/saitek_osa/maestroa.cpp b/src/devices/bus/saitek_osa/maestroa.cpp
index e895828c01e..b3245c1e1aa 100644
--- a/src/devices/bus/saitek_osa/maestroa.cpp
+++ b/src/devices/bus/saitek_osa/maestroa.cpp
@@ -1,54 +1,150 @@
// license:BSD-3-Clause
// copyright-holders:hap
+// thanks-to:Berger
/***************************************************************************
+Saitek OSA Module: Maestro A
+
+TODO:
+- does not work if cpu speed is 4MHz
+
***************************************************************************/
#include "emu.h"
#include "maestroa.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "cpu/m6502/r65c02.h"
+
+#include "softlist.h"
-//**************************************************************************
-// DEVICE DEFINITIONS
-//**************************************************************************
DEFINE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device, "osa_maestroa", "Maestro A")
+
//-------------------------------------------------
-// device_add_mconfig - add device configuration
+// initialization
//-------------------------------------------------
-void saitekosa_maestroa_device::device_add_mconfig(machine_config &config)
+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),
+ m_maincpu(*this, "maincpu")
+{ }
+
+void saitekosa_maestroa_device::device_start()
{
+ save_item(NAME(m_latch_enable));
+ save_item(NAME(m_latch));
}
+void saitekosa_maestroa_device::device_reset()
+{
+ p2600_w(0);
+}
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
//-------------------------------------------------
-// saitekosa_maestroa_device - constructor
+// rom_region - device-specific ROM region
//-------------------------------------------------
-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)
-{ }
+ROM_START( maestroa )
+ ROM_REGION(0x10000, "maincpu", 0)
+
+ ROM_SYSTEM_BIOS(0, "a1", "Maestro A (set 1)")
+ ROM_SYSTEM_BIOS(1, "a2", "Maestro A (set 2)")
+
+ ROMX_LOAD("m6a_a29b.u6", 0x8000, 0x8000, CRC(6ee0197a) SHA1(61f201ca64576aca582bc9f2a427638bd79e1fee), ROM_BIOS(0))
+ ROMX_LOAD("m6a_v14b.u6", 0x8000, 0x8000, CRC(d566a476) SHA1(ef81b9a0dcfbd8427025cfe9bf738d42a7a1139a), ROM_BIOS(1))
+ROM_END
+
+const tiny_rom_entry *saitekosa_maestroa_device::device_rom_region() const
+{
+ return ROM_NAME(maestroa);
+}
+
//-------------------------------------------------
-// device_start - device-specific startup
+// device_add_mconfig - add device configuration
//-------------------------------------------------
-void saitekosa_maestroa_device::device_start()
+void saitekosa_maestroa_device::device_add_mconfig(machine_config &config)
+{
+ // basic machine hardware
+ R65C02(config, m_maincpu, 6_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &saitekosa_maestroa_device::main_map);
+
+ // extension rom
+ GENERIC_SOCKET(config, "extrom", generic_plain_slot, "saitek_kso");
+ SOFTWARE_LIST(config, "cart_list").set_original("saitek_kso");
+}
+
+
+//-------------------------------------------------
+// internal i/o
+//-------------------------------------------------
+
+u8 saitekosa_maestroa_device::p2200_r()
+{
+ if (!machine().side_effects_disabled())
+ {
+ // strobe RTS-P
+ m_expansion->rts_w(1);
+ m_expansion->rts_w(0);
+ }
+
+ return 0xff;
+}
+
+void saitekosa_maestroa_device::p2400_w(u8 data)
{
+ // clock latch
+ m_latch = data;
}
+u8 saitekosa_maestroa_device::p2400_r()
+{
+ return m_expansion->data_state();
+}
-//**************************************************************************
-// IMPLEMENTATION
-//**************************************************************************
+void saitekosa_maestroa_device::p2600_w(u8 data)
+{
+ // d3: enable latch output
+ m_latch_enable = bool(data & 8);
+
+ // d2: STB-P
+ m_expansion->stb_w(BIT(data, 2));
+}
+
+u8 saitekosa_maestroa_device::p2600_r()
+{
+ // d7: ACK-P
+ return m_expansion->ack_state() ? 0x80 : 0;
+}
+
+void saitekosa_maestroa_device::main_map(address_map &map)
+{
+ map.unmap_value_high();
+ map(0x0000, 0x1fff).ram();
+ map(0x2200, 0x2200).mirror(0x01ff).r(FUNC(saitekosa_maestroa_device::p2200_r));
+ map(0x2400, 0x2400).mirror(0x01ff).rw(FUNC(saitekosa_maestroa_device::p2400_r), FUNC(saitekosa_maestroa_device::p2400_w));
+ map(0x2600, 0x2600).mirror(0x01ff).rw(FUNC(saitekosa_maestroa_device::p2600_r), FUNC(saitekosa_maestroa_device::p2600_w));
+ map(0x4000, 0x5fff).r("extrom", FUNC(generic_slot_device::read_rom));
+ map(0x8000, 0xffff).rom();
+}
+
+
+//-------------------------------------------------
+// host i/o
+//-------------------------------------------------
+
+u8 saitekosa_maestroa_device::data_r()
+{
+ return m_latch_enable ? m_latch : 0xff;
+}
void saitekosa_maestroa_device::nmi_w(int state)
{
+ m_maincpu->set_input_line(INPUT_LINE_NMI, !state ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/devices/bus/saitek_osa/maestroa.h b/src/devices/bus/saitek_osa/maestroa.h
index 2048bde7b60..3ef210e153a 100644
--- a/src/devices/bus/saitek_osa/maestroa.h
+++ b/src/devices/bus/saitek_osa/maestroa.h
@@ -2,7 +2,7 @@
// copyright-holders:hap
/***************************************************************************
- Saitek OSA Maestro A
+ Saitek OSA Module: Maestro A
***************************************************************************/
@@ -14,12 +14,6 @@
#include "expansion.h"
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// ======================> saitekosa_maestroa_device
-
class saitekosa_maestroa_device : public device_t, public device_saitekosa_expansion_interface
{
public:
@@ -27,14 +21,31 @@ public:
saitekosa_maestroa_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// from host
+ virtual u8 data_r() override;
virtual void nmi_w(int state) override;
protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+
+ void main_map(address_map &map);
+
+ u8 p2200_r();
+ u8 p2400_r();
+ void p2400_w(u8 data);
+ u8 p2600_r();
+ void p2600_w(u8 data);
+
+ u8 m_latch = 0xff;
+ bool m_latch_enable = false;
};
-// device type definition
+
DECLARE_DEVICE_TYPE(OSA_MAESTROA, saitekosa_maestroa_device)
#endif // MAME_BUS_SAITEKOSA_MAESTROA_H
diff --git a/src/mame/drivers/saitek_leonardo.cpp b/src/mame/drivers/saitek_leonardo.cpp
index 68377a31d7a..26bbbbd201f 100644
--- a/src/mame/drivers/saitek_leonardo.cpp
+++ b/src/mame/drivers/saitek_leonardo.cpp
@@ -207,7 +207,7 @@ void leo_state::p5_w(u8 data)
m_expansion->nmi_w(BIT(data, 2));
// d3: enable expansion STB signal
- m_stb_enable = bool(BIT(data, 3));
+ m_stb_enable = bool(data & 8);
// d5: expansion ACK-P
m_expansion->ack_w(BIT(data, 5));
@@ -321,6 +321,8 @@ void leo_state::leo(machine_config &config)
m_maincpu->in_p6_cb().set(FUNC(leo_state::p6_r));
m_maincpu->out_p6_cb().set(FUNC(leo_state::p6_w));
+ config.set_perfect_quantum(m_maincpu);
+
SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(150));
diff --git a/src/mame/drivers/saitek_renaissance.cpp b/src/mame/drivers/saitek_renaissance.cpp
index 0a71c2bb191..6176bf73c5c 100644
--- a/src/mame/drivers/saitek_renaissance.cpp
+++ b/src/mame/drivers/saitek_renaissance.cpp
@@ -23,6 +23,7 @@ so a chessboard display + 7seg info.
TODO:
- not sure about comm/module leds
+- fart noise at boot if osa module is inserted
- finish internal artwork
- make it a subdriver of saitek_leonardo.cpp? or too many differences
- same TODO list as saitek_leonardo.cpp
@@ -91,6 +92,7 @@ private:
void leds_w(u8 data);
void control_w(u8 data);
u8 control_r();
+ void exp_stb_w(int state);
u8 p2_r();
void p2_w(u8 data);
@@ -177,6 +179,12 @@ u8 ren_state::control_r()
return 0;
}
+void ren_state::exp_stb_w(int state)
+{
+ // STB-P to P5 IS
+ m_maincpu->set_input_line(M6801_IS_LINE, state ? CLEAR_LINE : ASSERT_LINE);
+}
+
// MCU ports
@@ -189,7 +197,6 @@ u8 ren_state::p2_r()
data = m_inputs[m_inp_mux & 7]->read();
// d3: ?
-
return ~data;
}
@@ -205,24 +212,32 @@ u8 ren_state::p5_r()
// d6: battery status
u8 b = m_inputs[8]->read() & 0x40;
+ // d4: IS strobe (handled with inputline)
// other: ?
- return b | 0xbf;
+ return b | (0xff ^ 0x50);
}
void ren_state::p5_w(u8 data)
{
- // ?
+ // d1: expansion NMI-P
+ m_expansion->nmi_w(BIT(data, 1));
+
+ // d5: expansion ACK-P
+ m_expansion->ack_w(BIT(data, 5));
+
+ // other: ?
}
u8 ren_state::p6_r()
{
- // read chessboard sensors
- return ~m_board->read_file(m_inp_mux & 0xf);
+ // read chessboard sensors and module data
+ return ~m_board->read_file(m_inp_mux & 0xf) & m_expansion->data_r();
}
void ren_state::p6_w(u8 data)
{
// module data
+ m_expansion->data_w(data);
}
@@ -314,6 +329,8 @@ void ren_state::ren(machine_config &config)
m_maincpu->in_p6_cb().set(FUNC(ren_state::p6_r));
m_maincpu->out_p6_cb().set(FUNC(ren_state::p6_w));
+ config.set_perfect_quantum(m_maincpu);
+
SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(150));
@@ -338,6 +355,7 @@ void ren_state::ren(machine_config &config)
// expansion module
SAITEKOSA_EXPANSION(config, m_expansion, saitekosa_expansion_modules);
+ m_expansion->stb_handler().set(FUNC(ren_state::exp_stb_w));
}
diff --git a/src/mame/drivers/saitek_superstar.cpp b/src/mame/drivers/saitek_superstar.cpp
index 52b96be68b2..5ad20a7669f 100644
--- a/src/mame/drivers/saitek_superstar.cpp
+++ b/src/mame/drivers/saitek_superstar.cpp
@@ -39,13 +39,14 @@ TODO:
******************************************************************************/
#include "emu.h"
+
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6502/r65c02.h"
#include "machine/sensorboard.h"
#include "sound/dac.h"
#include "video/pwm.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
#include "softlist.h"
#include "speaker.h"