summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2026-05-02 17:09:52 +0200
committer hap <happppp@users.noreply.github.com>2026-05-02 17:10:07 +0200
commit891eebbd29b24a375f1f60c2921a22d0f6cd5d8a (patch)
treea509040749b80fb6abf6a1c8ea6d17554078b12b /src/devices
parent67b67f83d7be409132832611ecdf191dbd4e7d01 (diff)
saitek_osa: added brute force module [hap, Berger, Mr. Lars]
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/bus/saitek_osa/bruteforce.cpp188
-rw-r--r--src/devices/bus/saitek_osa/bruteforce.h18
-rw-r--r--src/devices/bus/saitek_osa/expansion.cpp2
-rw-r--r--src/devices/bus/saitek_osa/maestro.cpp13
-rw-r--r--src/devices/bus/saitek_osa/maestro.h2
-rw-r--r--src/devices/bus/saitek_osa/maestroa.cpp11
-rw-r--r--src/devices/bus/saitek_osa/maestroa.h2
-rw-r--r--src/devices/bus/saitek_osa/sparc.cpp14
-rw-r--r--src/devices/bus/saitek_osa/sparc.h2
9 files changed, 231 insertions, 21 deletions
diff --git a/src/devices/bus/saitek_osa/bruteforce.cpp b/src/devices/bus/saitek_osa/bruteforce.cpp
new file mode 100644
index 00000000000..eb926ed2297
--- /dev/null
+++ b/src/devices/bus/saitek_osa/bruteforce.cpp
@@ -0,0 +1,188 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+// thanks-to:Berger, Mr. Lars
+/*******************************************************************************
+
+Saitek OSA: Kasparov Brute Force Module (1992)
+
+When Brute Force Module was announced, it was supposed to include a program by
+Ulf Rathsman (known from Conchess and Mephisto MM II). It got canceled for some
+reason, and the final version is by Frans Morsch.
+
+Hardware notes:
+- Hitachi H8/325 MCU, 20MHz XTAL
+- 256KB DRAM (2*NEC D424256C-80)
+- PCA EP9604-100 delay line (for DRAM CAS)
+
+*******************************************************************************/
+
+#include "emu.h"
+#include "bruteforce.h"
+
+#include "cpu/h8/h8325.h"
+
+namespace {
+
+//-------------------------------------------------
+// initialization
+//-------------------------------------------------
+
+class saitekosa_bforce_device : public device_t, public device_saitekosa_expansion_interface
+{
+public:
+ // construction/destruction
+ saitekosa_bforce_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;
+ virtual void ack_w(int state) override;
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual void device_start() override ATTR_COLD;
+
+private:
+ required_device<h8325_device> m_maincpu;
+ memory_share_creator<u8> m_ram;
+ required_memory_bank m_rambank;
+
+ u8 m_data_out = 0;
+
+ void main_map(address_map &map) ATTR_COLD;
+
+ u8 p4_r();
+ void p4_w(u8 data);
+ u8 p5_r();
+ void p5_w(u8 data);
+ void p6_w(u8 data);
+ u8 p7_r();
+};
+
+saitekosa_bforce_device::saitekosa_bforce_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+ device_t(mconfig, OSA_BFORCE, tag, owner, clock),
+ device_saitekosa_expansion_interface(mconfig, *this),
+ m_maincpu(*this, "maincpu"),
+ m_ram(*this, "ram", 0x40000, ENDIANNESS_BIG),
+ m_rambank(*this, "rambank")
+{ }
+
+void saitekosa_bforce_device::device_start()
+{
+ m_rambank->configure_entries(0, 16, m_ram, 0x4000);
+
+ save_item(NAME(m_data_out));
+}
+
+
+//-------------------------------------------------
+// host i/o
+//-------------------------------------------------
+
+u8 saitekosa_bforce_device::data_r()
+{
+ return m_data_out;
+}
+
+void saitekosa_bforce_device::nmi_w(int state)
+{
+ m_maincpu->set_input_line(0, state ? CLEAR_LINE : ASSERT_LINE);
+}
+
+void saitekosa_bforce_device::ack_w(int state)
+{
+ if (state != m_expansion->ack_state())
+ machine().scheduler().perfect_quantum(attotime::from_usec(100));
+}
+
+
+//-------------------------------------------------
+// internal i/o
+//-------------------------------------------------
+
+u8 saitekosa_bforce_device::p4_r()
+{
+ // P40-P43: DC0-DC3
+ return m_expansion->data_state() & 0xf;
+}
+
+void saitekosa_bforce_device::p4_w(u8 data)
+{
+ // P40-P43: DC0-DC3
+ m_data_out = (m_data_out & 0xf0) | (data & 0x0f);
+}
+
+u8 saitekosa_bforce_device::p5_r()
+{
+ // P50-P53: DC4-DC7
+ return m_expansion->data_state() >> 4;
+}
+
+void saitekosa_bforce_device::p5_w(u8 data)
+{
+ // P50-P53: DC4-DC7
+ m_data_out = (m_data_out & 0x0f) | (data << 4 & 0xf0);
+
+ // P54: RTS-P
+ m_expansion->rts_w(BIT(data, 4));
+
+ // P55: STB-P
+ m_expansion->stb_w(BIT(data, 5));
+}
+
+void saitekosa_bforce_device::p6_w(u8 data)
+{
+ // P60-P63: RAM bank
+ m_rambank->set_entry(data & 0xf);
+}
+
+u8 saitekosa_bforce_device::p7_r()
+{
+ // P70: ACK-P
+ return m_expansion->ack_state();
+}
+
+void saitekosa_bforce_device::main_map(address_map &map)
+{
+ map(0x8000, 0xbfff).bankrw(m_rambank);
+}
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void saitekosa_bforce_device::device_add_mconfig(machine_config &config)
+{
+ // basic machine hardware
+ H8325(config, m_maincpu, 20_MHz_XTAL);
+ m_maincpu->set_mode(2);
+ m_maincpu->set_addrmap(AS_PROGRAM, &saitekosa_bforce_device::main_map);
+ m_maincpu->read_port4().set(FUNC(saitekosa_bforce_device::p4_r));
+ m_maincpu->write_port4().set(FUNC(saitekosa_bforce_device::p4_w));
+ m_maincpu->read_port5().set(FUNC(saitekosa_bforce_device::p5_r));
+ m_maincpu->write_port5().set(FUNC(saitekosa_bforce_device::p5_w));
+ m_maincpu->write_port6().set(FUNC(saitekosa_bforce_device::p6_w));
+ m_maincpu->read_port7().set(FUNC(saitekosa_bforce_device::p7_r));
+}
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+ROM_START( bforce )
+ ROM_REGION16_BE( 0x8000, "maincpu", 0 )
+ ROM_LOAD("h8_325_hd6473258p10_sm18_b16_u_2.u2", 0x0000, 0x8000, CRC(f22e46d2) SHA1(7baa809ffc09117a27bdeede655f92bc3a6d1626) )
+ROM_END
+
+const tiny_rom_entry *saitekosa_bforce_device::device_rom_region() const
+{
+ return ROM_NAME(bforce);
+}
+
+} // anonymous namespace
+
+
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_BFORCE, device_saitekosa_expansion_interface, saitekosa_bforce_device, "osa_bforce", "Saitek OSA: Kasparov Brute Force Module")
diff --git a/src/devices/bus/saitek_osa/bruteforce.h b/src/devices/bus/saitek_osa/bruteforce.h
new file mode 100644
index 00000000000..d08f6e6c0bb
--- /dev/null
+++ b/src/devices/bus/saitek_osa/bruteforce.h
@@ -0,0 +1,18 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*******************************************************************************
+
+ Saitek OSA: Kasparov Brute Force Module
+
+*******************************************************************************/
+
+#ifndef MAME_BUS_SAITEK_OSA_BFORCE_H
+#define MAME_BUS_SAITEK_OSA_BFORCE_H
+
+#pragma once
+
+#include "expansion.h"
+
+DECLARE_DEVICE_TYPE(OSA_BFORCE, device_saitekosa_expansion_interface)
+
+#endif // MAME_BUS_SAITEK_OSA_BFORCE_H
diff --git a/src/devices/bus/saitek_osa/expansion.cpp b/src/devices/bus/saitek_osa/expansion.cpp
index a226a8ffafc..e9a9337d89d 100644
--- a/src/devices/bus/saitek_osa/expansion.cpp
+++ b/src/devices/bus/saitek_osa/expansion.cpp
@@ -11,6 +11,7 @@ Used by Saitek(SciSys) chess computers Leonardo, Galileo, Renaissance.
#include "emu.h"
#include "expansion.h"
+#include "bruteforce.h"
#include "maestro.h"
#include "maestroa.h"
#include "sparc.h"
@@ -161,6 +162,7 @@ device_saitekosa_expansion_interface::~device_saitekosa_expansion_interface()
void saitekosa_expansion_modules(device_slot_interface &device)
{
device.option_add("analyst", OSA_ANALYST);
+ device.option_add("bforce", OSA_BFORCE);
device.option_add("maestro", OSA_MAESTRO);
device.option_add("maestroa", OSA_MAESTROA);
device.option_add("sparc", OSA_SPARC);
diff --git a/src/devices/bus/saitek_osa/maestro.cpp b/src/devices/bus/saitek_osa/maestro.cpp
index 971daa32e0b..2092ad809e7 100644
--- a/src/devices/bus/saitek_osa/maestro.cpp
+++ b/src/devices/bus/saitek_osa/maestro.cpp
@@ -3,7 +3,7 @@
// thanks-to:Berger
/*******************************************************************************
-Saitek OSA Module: Kasparov Maestro/Analyst (1987-1990)
+Saitek OSA: Kasparov Maestro/Analyst Module (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.
@@ -147,6 +147,7 @@ void saitekosa_maestro_device::device_start()
void saitekosa_maestro_device::device_reset()
{
+ m_expansion->rts_w(1);
control_w(0);
}
@@ -168,7 +169,7 @@ u8 saitekosa_maestro_device::data_r()
void saitekosa_maestro_device::nmi_w(int state)
{
- m_maincpu->set_input_line(0, !state ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(0, state ? CLEAR_LINE : ASSERT_LINE);
}
void saitekosa_maestro_device::ack_w(int state)
@@ -215,8 +216,8 @@ u8 saitekosa_maestro_device::rts_r()
if (!machine().side_effects_disabled())
{
// strobe RTS-P
- m_expansion->rts_w(1);
m_expansion->rts_w(0);
+ m_expansion->rts_w(1);
}
return 0xff;
@@ -254,7 +255,7 @@ u8 saitekosa_maestro_device::ack_r()
{
// d6: _Vcc
// d7: ACK-P
- return m_expansion->ack_state() ? 0x80 : 0x00;
+ return m_expansion->ack_state() ? 0 : 0x80;
}
void saitekosa_maestro_device::main_map(address_map &map)
@@ -432,5 +433,5 @@ const tiny_rom_entry *saitekosa_analyst_device::device_rom_region() const
} // 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")
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_MAESTRO, device_saitekosa_expansion_interface, saitekosa_maestro_device, "osa_maestro", "Saitek OSA: Kasparov Maestro B-D Module")
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_ANALYST, device_saitekosa_expansion_interface, saitekosa_analyst_device, "osa_analyst", "Saitek OSA: Kasparov Analyst Module")
diff --git a/src/devices/bus/saitek_osa/maestro.h b/src/devices/bus/saitek_osa/maestro.h
index a3440416c7a..eb2d2b5d248 100644
--- a/src/devices/bus/saitek_osa/maestro.h
+++ b/src/devices/bus/saitek_osa/maestro.h
@@ -2,7 +2,7 @@
// copyright-holders:hap
/*******************************************************************************
- Saitek OSA Module: Kasparov Maestro/Analyst
+ Saitek OSA: Kasparov Maestro/Analyst Module
*******************************************************************************/
diff --git a/src/devices/bus/saitek_osa/maestroa.cpp b/src/devices/bus/saitek_osa/maestroa.cpp
index 866fcabf201..98cac90d5d1 100644
--- a/src/devices/bus/saitek_osa/maestroa.cpp
+++ b/src/devices/bus/saitek_osa/maestroa.cpp
@@ -3,7 +3,7 @@
// thanks-to:Berger
/*******************************************************************************
-Saitek OSA Module: Kasparov Maestro A (SciSys, 1986)
+Saitek OSA: Kasparov Maestro A Module (SciSys, 1986)
The chess engine revision is in-between Kaplan's Stratos and Turbostar.
@@ -83,6 +83,7 @@ void saitekosa_maestroa_device::device_start()
void saitekosa_maestroa_device::device_reset()
{
+ m_expansion->rts_w(1);
control_w(0);
}
@@ -104,7 +105,7 @@ u8 saitekosa_maestroa_device::data_r()
void saitekosa_maestroa_device::nmi_w(int state)
{
- m_maincpu->set_input_line(INPUT_LINE_NMI, !state ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_NMI, state ? CLEAR_LINE : ASSERT_LINE);
}
void saitekosa_maestroa_device::ack_w(int state)
@@ -123,8 +124,8 @@ u8 saitekosa_maestroa_device::rts_r()
if (!machine().side_effects_disabled())
{
// strobe RTS-P
- m_expansion->rts_w(1);
m_expansion->rts_w(0);
+ m_expansion->rts_w(1);
}
return 0xff;
@@ -153,7 +154,7 @@ void saitekosa_maestroa_device::control_w(u8 data)
u8 saitekosa_maestroa_device::ack_r()
{
// d7: ACK-P
- return m_expansion->ack_state() ? 0x80 : 0;
+ return m_expansion->ack_state() ? 0 : 0x80;
}
void saitekosa_maestroa_device::main_map(address_map &map)
@@ -227,4 +228,4 @@ const tiny_rom_entry *saitekosa_maestroa_device::device_rom_region() const
} // anonymous namespace
-DEFINE_DEVICE_TYPE_PRIVATE(OSA_MAESTROA, device_saitekosa_expansion_interface, saitekosa_maestroa_device, "osa_maestroa", "Saitek OSA Maestro A")
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_MAESTROA, device_saitekosa_expansion_interface, saitekosa_maestroa_device, "osa_maestroa", "Saitek OSA: Kasparov Maestro A Module")
diff --git a/src/devices/bus/saitek_osa/maestroa.h b/src/devices/bus/saitek_osa/maestroa.h
index 9ce0909040d..ed89f9c922e 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 Module: Kasparov Maestro A
+ Saitek OSA: Kasparov Maestro A Module
*******************************************************************************/
diff --git a/src/devices/bus/saitek_osa/sparc.cpp b/src/devices/bus/saitek_osa/sparc.cpp
index 82f4e04a005..cedd39eeaa7 100644
--- a/src/devices/bus/saitek_osa/sparc.cpp
+++ b/src/devices/bus/saitek_osa/sparc.cpp
@@ -3,7 +3,7 @@
// thanks-to:Berger
/*******************************************************************************
-Saitek OSA Module: Kasparov Sparc (1993)
+Saitek OSA: Kasparov Sparc Module (1993)
The chess engine is by the Spracklen's. Their last, and also their strongest.
@@ -11,7 +11,7 @@ Hardware notes:
- Fujitsu MB86930-20 SPARClite @ 20MHz
- 256KB ROM (4*AMD AM27C512)
- 1MB DRAM (8*NEC 424256-60), expandable to 4MB
-- ESAN 31A-5500 delay line (only on newer PCB)
+- ESAN 31A-5500 delay line (for DRAM CAS, only on newer PCB)
Two PCB revisions are known, the older one is a lighter green PCB, it has
empty positions for more ICs (maybe expanded RAM?), and does not have a
@@ -126,7 +126,7 @@ u8 saitekosa_sparc_device::data_r()
void saitekosa_sparc_device::nmi_w(int state)
{
- m_maincpu->set_input_line(SPARC_IRQ1, !state ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(SPARC_IRQ1, state ? CLEAR_LINE : ASSERT_LINE);
}
void saitekosa_sparc_device::ack_w(int state)
@@ -142,8 +142,8 @@ void saitekosa_sparc_device::ack_w(int state)
u32 saitekosa_sparc_device::host_io_r(offs_t offset, u32 mem_mask)
{
- // d0-d7: data input latch, d8: ACK-P
- return m_expansion->data_state() | (m_expansion->ack_state() ? 0 : 0x100);
+ // d0-d7: data input, d8: ACK-P
+ return m_expansion->data_state() | (m_expansion->ack_state() << 8);
}
void saitekosa_sparc_device::host_io_w(offs_t offset, u32 data, u32 mem_mask)
@@ -153,7 +153,7 @@ void saitekosa_sparc_device::host_io_w(offs_t offset, u32 data, u32 mem_mask)
// d8: STB-P, d9: RTS-P
m_expansion->stb_w(BIT(m_data_out, 8));
- m_expansion->rts_w(BIT(~m_data_out, 9));
+ m_expansion->rts_w(BIT(m_data_out, 9));
}
void saitekosa_sparc_device::debugger_map(address_map &map)
@@ -234,4 +234,4 @@ const tiny_rom_entry *saitekosa_sparc_device::device_rom_region() const
} // anonymous namespace
-DEFINE_DEVICE_TYPE_PRIVATE(OSA_SPARC, device_saitekosa_expansion_interface, saitekosa_sparc_device, "osa_sparc", "Saitek OSA Sparc")
+DEFINE_DEVICE_TYPE_PRIVATE(OSA_SPARC, device_saitekosa_expansion_interface, saitekosa_sparc_device, "osa_sparc", "Saitek OSA: Kasparov Sparc Module")
diff --git a/src/devices/bus/saitek_osa/sparc.h b/src/devices/bus/saitek_osa/sparc.h
index eb5484c9dc6..0053a76cbd1 100644
--- a/src/devices/bus/saitek_osa/sparc.h
+++ b/src/devices/bus/saitek_osa/sparc.h
@@ -2,7 +2,7 @@
// copyright-holders:hap
/*******************************************************************************
- Saitek OSA Module: Kasparov Sparc
+ Saitek OSA: Kasparov Sparc Module
*******************************************************************************/