From 262aa23c89169e620f4d3f51b93e49ab744fd37e Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 21 May 2021 19:05:52 +0200 Subject: saitek_osa: added maestro/analyst B/C/D/D+/D++ module [hap, Berger, anonymous] --- scripts/src/bus.lua | 2 + src/devices/bus/saitek_osa/expansion.cpp | 2 +- src/devices/bus/saitek_osa/maestro.cpp | 353 +++++++++++++++++++++++++++++++ src/devices/bus/saitek_osa/maestro.h | 86 ++++++++ src/devices/bus/saitek_osa/maestroa.cpp | 60 ++++-- src/devices/bus/saitek_osa/maestroa.h | 16 +- src/devices/bus/saitek_osa/modules.cpp | 3 + src/mame/drivers/regence.cpp | 12 +- src/mame/drivers/saitek_corona.cpp | 20 +- src/mame/drivers/saitek_leonardo.cpp | 9 +- src/mame/drivers/saitek_renaissance.cpp | 11 +- src/mame/drivers/saitek_stratos.cpp | 39 +--- src/mame/includes/saitek_stratos.h | 8 +- src/mame/layout/saitek_leonardo.lay | 2 +- src/mame/layout/saitek_renaissance.lay | 2 +- 15 files changed, 543 insertions(+), 82 deletions(-) create mode 100644 src/devices/bus/saitek_osa/maestro.cpp create mode 100644 src/devices/bus/saitek_osa/maestro.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 2beab5212bf..1ee46b10559 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -4457,6 +4457,8 @@ if (BUSES["SAITEK_OSA"]~=null) then MAME_DIR .. "src/devices/bus/saitek_osa/expansion.h", MAME_DIR .. "src/devices/bus/saitek_osa/modules.cpp", MAME_DIR .. "src/devices/bus/saitek_osa/modules.h", + MAME_DIR .. "src/devices/bus/saitek_osa/maestro.cpp", + MAME_DIR .. "src/devices/bus/saitek_osa/maestro.h", MAME_DIR .. "src/devices/bus/saitek_osa/maestroa.cpp", MAME_DIR .. "src/devices/bus/saitek_osa/maestroa.h", MAME_DIR .. "src/devices/bus/saitek_osa/sparc.cpp", diff --git a/src/devices/bus/saitek_osa/expansion.cpp b/src/devices/bus/saitek_osa/expansion.cpp index afae7b15a56..d89a9fd6da8 100644 --- a/src/devices/bus/saitek_osa/expansion.cpp +++ b/src/devices/bus/saitek_osa/expansion.cpp @@ -71,7 +71,7 @@ void saitekosa_expansion_device::device_add_mconfig(machine_config &config) // optional embedded screen auto &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); screen.set_refresh_hz(60); - screen.set_size(100, 100); + screen.set_size(16, 16); screen.set_visarea_full(); screen.set_screen_update(FUNC(saitekosa_expansion_device::screen_update)); } diff --git a/src/devices/bus/saitek_osa/maestro.cpp b/src/devices/bus/saitek_osa/maestro.cpp new file mode 100644 index 00000000000..195d8a72e09 --- /dev/null +++ b/src/devices/bus/saitek_osa/maestro.cpp @@ -0,0 +1,353 @@ +// 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.* + +The hardware and chess engine is similar to the Stratos/Turbo King series. + +Hardware notes: +- CPU: see notes below +- 64KB ROM (2*27C256) +- 16KB RAM (2*HY62C64P-70), one of them is optional +- 1 ROM socket for EGR expansion ROM + +Analyst adds a HD44780A00H and a small 16-char LCD screen. + +Both were sold at 4MHz, 6MHz, 8MHz speeds, Maestro also had a 10MHz version. +CPUs used were: R65C02P4, RP65C02F, W65C02P-8. In almost all cases with the +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 "cpu/m6502/r65c02.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") + + +//------------------------------------------------- +// initialization +//------------------------------------------------- + +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), + m_maincpu(*this, "maincpu"), + m_banked_ram(*this, "banked_ram", 0x2000, ENDIANNESS_LITTLE), + m_rambank(*this, "rambank"), + m_rombank(*this, "rombank"), + m_extrom(*this, "extrom") +{ } + +saitekosa_maestro_device::saitekosa_maestro_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + saitekosa_maestro_device(mconfig, OSA_MAESTRO, tag, owner, clock) +{ } + +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 + m_rombank->configure_entries(0, 2, memregion("maincpu")->base(), 0x8000); + m_rambank->configure_entries(0, 2, m_banked_ram, 0x1000); + + // register for savestates + save_item(NAME(m_latch_enable)); + save_item(NAME(m_latch)); + save_item(NAME(m_extrom_bank)); +} + +void saitekosa_maestro_device::device_reset() +{ + set_cpu_freq(); + control_w(0); +} + +void saitekosa_maestro_device::set_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]); +} + + +//------------------------------------------------- +// rom_region - device-specific ROM region +//------------------------------------------------- + +ROM_START( maestro ) + ROM_REGION(0x10000, "maincpu", 0) + + ROM_DEFAULT_BIOS("dpp") + + // 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_629_u3.u3", 0x8000, 0x8000, CRC(15e7b1f1) SHA1(d2a757114f13c6141d74a15671aa06b675304b4a), 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_b15_u3.u3", 0x8000, 0x8000, CRC(6155de90) SHA1(bb5cdf061dde2d1dc7925d455891c3ade1d274e3), 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("dpp") + + // 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_629_u3.u3", 0x8000, 0x8000, CRC(15e7b1f1) SHA1(d2a757114f13c6141d74a15671aa06b675304b4a), 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_b15_u3.u3", 0x8000, 0x8000, CRC(6155de90) SHA1(bb5cdf061dde2d1dc7925d455891c3ade1d274e3), 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 +{ + return ROM_NAME(analyst); +} + + +//------------------------------------------------- +// 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 +{ + return INPUT_PORTS_NAME(maestro); +} + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void saitekosa_maestro_device::device_add_mconfig(machine_config &config) +{ + // 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_analyst_device::device_add_mconfig(machine_config &config) +{ + saitekosa_maestro_device::device_add_mconfig(config); + + // video hardware + HD44780(config, m_lcd, 0); + m_lcd->set_lcd_size(2, 8); + + auto *screen = subdevice(":exp:screen"); + screen->set_size(6 * 16 + 3, 16); + screen->set_visarea_full(); +} + + +//------------------------------------------------- +// internal i/o +//------------------------------------------------- + +u8 saitekosa_maestro_device::extrom_r(offs_t offset) +{ + u16 bank = m_extrom_bank * 0x4000; + return (m_extrom->exists()) ? m_extrom->read_rom(offset | bank) : 0xff; +} + +template void saitekosa_maestro_device::stall_w(u8 data) +{ + // cpu clock divider +} + +u8 saitekosa_maestro_device::rts_r() +{ + if (!machine().side_effects_disabled()) + { + // strobe RTS-P + m_expansion->rts_w(1); + m_expansion->rts_w(0); + } + + return 0xff; +} + +void saitekosa_maestro_device::xdata_w(u8 data) +{ + // clock latch + m_latch = data; +} + +u8 saitekosa_maestro_device::xdata_r() +{ + return m_expansion->data_state(); +} + +void saitekosa_maestro_device::control_w(u8 data) +{ + // d0: main rom bank + m_rombank->set_entry(data & 1); + + // d1: ext rom bank + // d1: ram bank + m_extrom_bank = BIT(data, 1); + m_rambank->set_entry(m_extrom_bank); + + // d3: enable latch output + m_latch_enable = bool(data & 8); + + // d2: STB-P + m_expansion->stb_w(BIT(data, 2)); +} + +u8 saitekosa_maestro_device::ack_r() +{ + // d6: ? + // d7: ACK-P + return m_expansion->ack_state() ? 0x80 : 0x00; +} + +void saitekosa_maestro_device::main_map(address_map &map) +{ + map(0x0000, 0x1fff).ram(); + map(0x2000, 0x2000).mirror(0x01ff).w(FUNC(saitekosa_maestro_device::stall_w<0>)); + map(0x2200, 0x2200).mirror(0x01ff).rw(FUNC(saitekosa_maestro_device::rts_r), FUNC(saitekosa_maestro_device::stall_w<1>)); + map(0x2400, 0x2400).mirror(0x01ff).rw(FUNC(saitekosa_maestro_device::xdata_r), FUNC(saitekosa_maestro_device::xdata_w)); + map(0x2600, 0x2600).mirror(0x01ff).rw(FUNC(saitekosa_maestro_device::ack_r), FUNC(saitekosa_maestro_device::control_w)); + map(0x2800, 0x37ff).bankrw("rambank"); + map(0x4000, 0x7fff).r(FUNC(saitekosa_maestro_device::extrom_r)); + map(0x8000, 0xffff).bankr("rombank"); +} + +void saitekosa_analyst_device::main_map(address_map &map) +{ + saitekosa_maestro_device::main_map(map); + map(0x3800, 0x3801).mirror(0x07fe).rw(m_lcd, FUNC(hd44780_device::read), FUNC(hd44780_device::write)); +} + + +//------------------------------------------------- +// host i/o +//------------------------------------------------- + +u8 saitekosa_maestro_device::data_r() +{ + return m_latch_enable ? m_latch : 0xff; +} + +void saitekosa_maestro_device::nmi_w(int state) +{ + m_maincpu->set_input_line(0, !state ? ASSERT_LINE : CLEAR_LINE); +} + +void saitekosa_maestro_device::ack_w(int state) +{ + if (state != m_expansion->ack_state()) + machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); +} + +u32 saitekosa_analyst_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + static const rgb_t colors[3] = + { + rgb_t(131, 136, 139), // lcd pixel off + rgb_t(51, 42, 43), // lcd pixel on + rgb_t(138, 146, 148) // background + }; + + bitmap.fill(colors[2], 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) = colors[BIT(src[y], 4 - x)]; + } + + return 0; +} diff --git a/src/devices/bus/saitek_osa/maestro.h b/src/devices/bus/saitek_osa/maestro.h new file mode 100644 index 00000000000..b5739789af8 --- /dev/null +++ b/src/devices/bus/saitek_osa/maestro.h @@ -0,0 +1,86 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/*************************************************************************** + + Saitek OSA Module: Kasparov Maestro/Analyst + +***************************************************************************/ + +#ifndef MAME_BUS_SAITEKOSA_MAESTRO_H +#define MAME_BUS_SAITEKOSA_MAESTRO_H + +#pragma once + +#include "expansion.h" + +#include "bus/generic/slot.h" +#include "video/hd44780.h" + + +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(switch_cpu_freq) { set_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 m_maincpu; + memory_share_creator m_banked_ram; + required_memory_bank m_rambank; + required_memory_bank m_rombank; + required_device m_extrom; + + virtual void main_map(address_map &map); + + u8 extrom_r(offs_t offset); + template 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); + + void set_cpu_freq(); + + u8 m_latch = 0xff; + bool m_latch_enable = false; + u8 m_extrom_bank = 0; +}; + +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; + +protected: + virtual const tiny_rom_entry *device_rom_region() const override; + virtual void device_add_mconfig(machine_config &config) override; + +private: + required_device m_lcd; + + virtual void main_map(address_map &map) override; +}; + + +DECLARE_DEVICE_TYPE(OSA_MAESTRO, saitekosa_maestro_device) +DECLARE_DEVICE_TYPE(OSA_ANALYST, saitekosa_analyst_device) + +#endif // MAME_BUS_SAITEKOSA_MAESTRO_H diff --git a/src/devices/bus/saitek_osa/maestroa.cpp b/src/devices/bus/saitek_osa/maestroa.cpp index 78c16d6d791..aa96c7b3798 100644 --- a/src/devices/bus/saitek_osa/maestroa.cpp +++ b/src/devices/bus/saitek_osa/maestroa.cpp @@ -14,8 +14,8 @@ Hardware notes: - 8KB RAM (HM6264LP-15) - 3 more sockets, one for KSO expansion ROM, 2 unused -The PCB is not compatible for upgrading to newer Maestro versions. -CPU is a 4MHz part. The higher speed Maestro versions overclock it. +The CPU is a 4MHz part, higher speed modules overclock it. The PCB is not +compatible for upgrading to newer Maestro versions. TODO: - does not work if cpu speed is 4MHz @@ -53,7 +53,14 @@ void saitekosa_maestroa_device::device_start() void saitekosa_maestroa_device::device_reset() { - p2600_w(0); + set_cpu_freq(); + control_w(0); +} + +void saitekosa_maestroa_device::set_cpu_freq() +{ + static const XTAL xtal[3] = { 4_MHz_XTAL, 5.67_MHz_XTAL, 6_MHz_XTAL }; + m_maincpu->set_unscaled_clock(xtal[ioport("FAKE")->read() % 3]); } @@ -64,10 +71,13 @@ void saitekosa_maestroa_device::device_reset() 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)") + ROM_DEFAULT_BIOS("a1") + // A + ROM_SYSTEM_BIOS(0, "a1", "Maestro A (set 1)") ROMX_LOAD("m6a_a29b.u6", 0x8000, 0x8000, CRC(6ee0197a) SHA1(61f201ca64576aca582bc9f2a427638bd79e1fee), ROM_BIOS(0)) + + ROM_SYSTEM_BIOS(1, "a2", "Maestro A (set 2)") ROMX_LOAD("m6a_v14b.u6", 0x8000, 0x8000, CRC(d566a476) SHA1(ef81b9a0dcfbd8427025cfe9bf738d42a7a1139a), ROM_BIOS(1)) ROM_END @@ -77,6 +87,24 @@ const tiny_rom_entry *saitekosa_maestroa_device::device_rom_region() const } +//------------------------------------------------- +// input_ports - device-specific input ports +//------------------------------------------------- + +static INPUT_PORTS_START( maestroa ) + PORT_START("FAKE") + PORT_CONFNAME( 0x03, 0x02, "CPU Frequency" ) PORT_CHANGED_MEMBER(DEVICE_SELF, saitekosa_maestroa_device, switch_cpu_freq, 0) // factory set + PORT_CONFSETTING( 0x00, "4MHz" ) + PORT_CONFSETTING( 0x01, "5.67MHz" ) + PORT_CONFSETTING( 0x02, "6MHz" ) +INPUT_PORTS_END + +ioport_constructor saitekosa_maestroa_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(maestroa); +} + + //------------------------------------------------- // device_add_mconfig - add device configuration //------------------------------------------------- @@ -97,7 +125,7 @@ void saitekosa_maestroa_device::device_add_mconfig(machine_config &config) // internal i/o //------------------------------------------------- -u8 saitekosa_maestroa_device::p2200_r() +u8 saitekosa_maestroa_device::rts_r() { if (!machine().side_effects_disabled()) { @@ -109,18 +137,18 @@ u8 saitekosa_maestroa_device::p2200_r() return 0xff; } -void saitekosa_maestroa_device::p2400_w(u8 data) +void saitekosa_maestroa_device::xdata_w(u8 data) { // clock latch m_latch = data; } -u8 saitekosa_maestroa_device::p2400_r() +u8 saitekosa_maestroa_device::xdata_r() { return m_expansion->data_state(); } -void saitekosa_maestroa_device::p2600_w(u8 data) +void saitekosa_maestroa_device::control_w(u8 data) { // d3: enable latch output m_latch_enable = bool(data & 8); @@ -129,7 +157,7 @@ void saitekosa_maestroa_device::p2600_w(u8 data) m_expansion->stb_w(BIT(data, 2)); } -u8 saitekosa_maestroa_device::p2600_r() +u8 saitekosa_maestroa_device::ack_r() { // d7: ACK-P return m_expansion->ack_state() ? 0x80 : 0; @@ -139,9 +167,9 @@ 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(0x2200, 0x2200).mirror(0x01ff).r(FUNC(saitekosa_maestroa_device::rts_r)); + map(0x2400, 0x2400).mirror(0x01ff).rw(FUNC(saitekosa_maestroa_device::xdata_r), FUNC(saitekosa_maestroa_device::xdata_w)); + map(0x2600, 0x2600).mirror(0x01ff).rw(FUNC(saitekosa_maestroa_device::ack_r), FUNC(saitekosa_maestroa_device::control_w)); map(0x4000, 0x5fff).r("extrom", FUNC(generic_slot_device::read_rom)); map(0x8000, 0xffff).rom(); } @@ -160,3 +188,9 @@ void saitekosa_maestroa_device::nmi_w(int state) { m_maincpu->set_input_line(INPUT_LINE_NMI, !state ? ASSERT_LINE : CLEAR_LINE); } + +void saitekosa_maestroa_device::ack_w(int state) +{ + if (state != m_expansion->ack_state()) + machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); +} diff --git a/src/devices/bus/saitek_osa/maestroa.h b/src/devices/bus/saitek_osa/maestroa.h index f214c4a7fb3..11bb1a26711 100644 --- a/src/devices/bus/saitek_osa/maestroa.h +++ b/src/devices/bus/saitek_osa/maestroa.h @@ -20,12 +20,16 @@ public: // construction/destruction saitekosa_maestroa_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + DECLARE_INPUT_CHANGED_MEMBER(switch_cpu_freq) { set_cpu_freq(); } + // from host virtual u8 data_r() override; virtual void nmi_w(int state) override; + virtual void ack_w(int state) override; protected: 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; @@ -35,11 +39,13 @@ private: 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 rts_r(); + u8 xdata_r(); + void xdata_w(u8 data); + u8 ack_r(); + void control_w(u8 data); + + void set_cpu_freq(); u8 m_latch = 0xff; bool m_latch_enable = false; diff --git a/src/devices/bus/saitek_osa/modules.cpp b/src/devices/bus/saitek_osa/modules.cpp index 7cdbe1524fa..19b7af1ff13 100644 --- a/src/devices/bus/saitek_osa/modules.cpp +++ b/src/devices/bus/saitek_osa/modules.cpp @@ -9,11 +9,14 @@ #include "emu.h" #include "modules.h" +#include "maestro.h" #include "maestroa.h" #include "sparc.h" void saitekosa_expansion_modules(device_slot_interface &device) { + device.option_add("analyst", OSA_ANALYST); + device.option_add("maestro", OSA_MAESTRO); device.option_add("maestroa", OSA_MAESTROA); device.option_add("sparc", OSA_SPARC); } diff --git a/src/mame/drivers/regence.cpp b/src/mame/drivers/regence.cpp index 2617c6c3e5a..d03f75fe4c0 100644 --- a/src/mame/drivers/regence.cpp +++ b/src/mame/drivers/regence.cpp @@ -14,10 +14,6 @@ Hardware notes: - 2KB RAM (MSM5128-15RS), 3 sockets, only middle one used - TTL, piezo, 8*8+4 LEDs, magnetic sensors -TODO: -- verify irq source/frequency, probably a 555 ic, current approximation is from - comparing led blink rate with a video recording - ******************************************************************************/ #include "emu.h" @@ -181,7 +177,7 @@ void regence_state::regence(machine_config &config) Z80(config, m_maincpu, 8_MHz_XTAL/2); m_maincpu->set_addrmap(AS_PROGRAM, ®ence_state::main_map); - m_maincpu->set_periodic_int(FUNC(regence_state::irq0_line_hold), attotime::from_hz(400)); // approximation + m_maincpu->set_periodic_int(FUNC(regence_state::irq0_line_hold), attotime::from_hz(448)); // from 555, measured SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); @@ -204,9 +200,9 @@ void regence_state::regence(machine_config &config) ROM_START( regence ) ROM_REGION( 0x10000, "maincpu", 0 ) - ROM_LOAD("ic13", 0x0000, 0x1000, CRC(ac6a0a67) SHA1(52b115c7cd372dfbad14b00854aa4f6f75a937d3) ) - ROM_LOAD("ic12", 0x4000, 0x1000, CRC(5c2fb0c7) SHA1(811ab3d7cefcf872741eb2265115080aaf913f0f) ) - ROM_LOAD("ic11", 0x8000, 0x1000, CRC(e4c39dbd) SHA1(b6a6d1d39f73a2ff1ade6205bdf180be13e84df3) ) + ROM_LOAD("arc0.ic13", 0x0000, 0x1000, CRC(ac6a0a67) SHA1(52b115c7cd372dfbad14b00854aa4f6f75a937d3) ) // M5L2732K + ROM_LOAD("arc1.ic12", 0x4000, 0x1000, CRC(5c2fb0c7) SHA1(811ab3d7cefcf872741eb2265115080aaf913f0f) ) // " + ROM_LOAD("arc2.ic11", 0x8000, 0x1000, CRC(e4c39dbd) SHA1(b6a6d1d39f73a2ff1ade6205bdf180be13e84df3) ) // " ROM_END } // anonymous namespace diff --git a/src/mame/drivers/saitek_corona.cpp b/src/mame/drivers/saitek_corona.cpp index b5f3fae6792..96f76a325c3 100644 --- a/src/mame/drivers/saitek_corona.cpp +++ b/src/mame/drivers/saitek_corona.cpp @@ -71,26 +71,18 @@ private: u8 chessboard_r(); void lcd_reset_w(u8 data); - u8 m_control1; - u8 m_control2; - u8 m_select1; - u8 m_select2; - u8 m_led_data1; - u8 m_led_data2; + u8 m_control1 = 0; + u8 m_control2 = 0; + u8 m_select1 = 0; + u8 m_select2 = 0; + u8 m_led_data1 = 0; + u8 m_led_data2 = 0; }; void corona_state::machine_start() { saitek_stratos_state::machine_start(); - // zerofill - m_control1 = 0; - m_control2 = 0; - m_select1 = 0; - m_select2 = 0; - m_led_data1 = 0; - m_led_data2 = 0; - // register for savestates save_item(NAME(m_control1)); save_item(NAME(m_control2)); diff --git a/src/mame/drivers/saitek_leonardo.cpp b/src/mame/drivers/saitek_leonardo.cpp index e985306a4de..68069222c9c 100644 --- a/src/mame/drivers/saitek_leonardo.cpp +++ b/src/mame/drivers/saitek_leonardo.cpp @@ -174,7 +174,6 @@ void leo_state::exp_stb_w(int state) void leo_state::exp_rts_w(int state) { // NAND with ACK-P? (not used by module) - machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); } @@ -213,8 +212,10 @@ void leo_state::p5_w(u8 data) // d2: expansion NMI-P m_expansion->nmi_w(BIT(data, 2)); - // d3,d5: expansion ACK-P? - m_expansion->ack_w(BIT(data, 3) & BIT(data, 5)); + // d3: NAND with STB-P? + + // d5: expansion ACK-P + m_expansion->ack_w(BIT(data, 5)); // d6,d7: chessboard led row data m_led_data[0] = (m_led_data[0] & 3) | (~data >> 4 & 0xc); @@ -325,6 +326,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_maximum_quantum(attotime::from_hz(6000)); + 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 7bda77e4416..9e6cd192402 100644 --- a/src/mame/drivers/saitek_renaissance.cpp +++ b/src/mame/drivers/saitek_renaissance.cpp @@ -22,7 +22,7 @@ The LCD screen is fairly large, it's the same one as in Saitek Simultano, so a chessboard display + 7seg info. TODO: -- fart noise at boot if osa module is inserted +- fart noise at boot if maestroa 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 @@ -185,7 +185,6 @@ void ren_state::exp_stb_w(int state) void ren_state::exp_rts_w(int state) { // NAND with ACK-P? (not used by module) - machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); } @@ -225,8 +224,10 @@ void ren_state::p5_w(u8 data) // d1: expansion NMI-P m_expansion->nmi_w(BIT(data, 1)); - // d3,d5: expansion ACK-P? - m_expansion->ack_w(BIT(data, 3) & BIT(data, 5)); + // d3: NAND with STB-P? + + // d5: expansion ACK-P + m_expansion->ack_w(BIT(data, 5)); // other: ? } @@ -332,6 +333,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_maximum_quantum(attotime::from_hz(6000)); + 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_stratos.cpp b/src/mame/drivers/saitek_stratos.cpp index dcc868b7b3b..26d6f42c98a 100644 --- a/src/mame/drivers/saitek_stratos.cpp +++ b/src/mame/drivers/saitek_stratos.cpp @@ -72,9 +72,9 @@ class stratos_state : public saitek_stratos_state public: stratos_state(const machine_config &mconfig, device_type type, const char *tag) : saitek_stratos_state(mconfig, type, tag), - m_nvram(*this, "nvram.u7"), - m_rombank(*this, "rombank"), + m_banked_nvram(*this, "nvram.u7", 0x2000, ENDIANNESS_LITTLE), m_nvrambank(*this, "nvrambank"), + m_rombank(*this, "rombank"), m_extrom(*this, "extrom"), m_board(*this, "board"), m_dac(*this, "dac"), @@ -94,9 +94,9 @@ protected: private: // devices/pointers - required_device m_nvram; - required_memory_bank m_rombank; + memory_share_creator m_banked_nvram; required_memory_bank m_nvrambank; + required_memory_bank m_rombank; required_device m_extrom; required_device m_board; required_device m_dac; @@ -115,11 +115,9 @@ private: u8 lcd_data_r(); u8 extrom_r(offs_t offset); - std::unique_ptr m_nvram_data; - - u8 m_select; - u8 m_control; - u8 m_led_data; + u8 m_select = 0; + u8 m_control = 0; + u8 m_led_data = 0; }; // saitek_stratos_state @@ -130,12 +128,6 @@ void saitek_stratos_state::machine_start() m_out_digit.resolve(); m_out_lcd.resolve(); - // zerofill - m_power = false; - m_lcd_ready = false; - m_lcd_count = 0; - m_lcd_command = 0; - // register for savestates save_item(NAME(m_power)); save_item(NAME(m_lcd_ready)); @@ -158,8 +150,8 @@ void saitek_stratos_state::set_cpu_freq() { // known officially* released CPU speeds: 5MHz, 5.626MHz, 5.67MHz // *not including reseller overclocks, user mods, or the "Turbo Kit" - u8 inp = ioport("FAKE")->read(); - m_maincpu->set_unscaled_clock((inp & 2) ? 5.67_MHz_XTAL : ((inp & 1) ? 5.626_MHz_XTAL : 5_MHz_XTAL)); + static const XTAL xtal[3] = { 5.626_MHz_XTAL, 5.67_MHz_XTAL, 5_MHz_XTAL }; + m_maincpu->set_unscaled_clock(xtal[ioport("FAKE")->read() % 3]); } // stratos_state @@ -170,16 +162,7 @@ void stratos_state::machine_start() // init banks m_rombank->configure_entries(0, 2, memregion("maincpu")->base(), 0x8000); - - m_nvram_data = make_unique_clear(0x2000); - save_pointer(NAME(m_nvram_data), 0x2000); - m_nvram->set_base(m_nvram_data.get(), 0x2000); - m_nvrambank->configure_entries(0, 2, m_nvram_data.get(), 0x1000); - - // zerofill - m_select = 0; - m_control = 0; - m_led_data = 0; + m_nvrambank->configure_entries(0, 2, m_banked_nvram, 0x1000); // register for savestates save_item(NAME(m_select)); @@ -342,7 +325,7 @@ void stratos_state::control_w(u8 data) // d0: main rom bank // d1: ext rom bank - // d1: nvram bank? + // d1: nvram bank m_rombank->set_entry(data & 1); m_nvrambank->set_entry(data >> 1 & 1); diff --git a/src/mame/includes/saitek_stratos.h b/src/mame/includes/saitek_stratos.h index ce23c1f6a46..23a0bf694fe 100644 --- a/src/mame/includes/saitek_stratos.h +++ b/src/mame/includes/saitek_stratos.h @@ -50,10 +50,10 @@ protected: void set_cpu_freq(); void lcd_data_w(u8 data); - bool m_power; - bool m_lcd_ready; - u8 m_lcd_count; - u8 m_lcd_command; + bool m_power = false; + bool m_lcd_ready = false; + u8 m_lcd_count = 0; + u8 m_lcd_command = 0; u8 m_lcd_data[0x40]; }; diff --git a/src/mame/layout/saitek_leonardo.lay b/src/mame/layout/saitek_leonardo.lay index d63bfd10283..5a6e38defff 100644 --- a/src/mame/layout/saitek_leonardo.lay +++ b/src/mame/layout/saitek_leonardo.lay @@ -503,7 +503,7 @@ license:CC0 - + diff --git a/src/mame/layout/saitek_renaissance.lay b/src/mame/layout/saitek_renaissance.lay index f84f21f42db..e8684eb2603 100644 --- a/src/mame/layout/saitek_renaissance.lay +++ b/src/mame/layout/saitek_renaissance.lay @@ -487,7 +487,7 @@ license:CC0 - + -- cgit v1.2.3