diff options
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 |
commit | 5f5650a936c12225662f7e63e58790999e17a9f8 (patch) | |
tree | 0347ca7762b3f43a145324dd2c50c19d285e1ab7 | |
parent | 78a40fdb3369aad00e637c7b240218fcf05fc5f3 (diff) |
saitek_osa: added Maestro A module [hap, Berger]
-rw-r--r-- | src/devices/bus/saitek_osa/maestroa.cpp | 132 | ||||
-rw-r--r-- | src/devices/bus/saitek_osa/maestroa.h | 27 | ||||
-rw-r--r-- | src/mame/drivers/saitek_leonardo.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/saitek_renaissance.cpp | 28 | ||||
-rw-r--r-- | src/mame/drivers/saitek_superstar.cpp | 5 |
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" |