diff options
| author | 2026-05-02 17:09:52 +0200 | |
|---|---|---|
| committer | 2026-05-02 17:10:07 +0200 | |
| commit | 891eebbd29b24a375f1f60c2921a22d0f6cd5d8a (patch) | |
| tree | a509040749b80fb6abf6a1c8ea6d17554078b12b /src/devices | |
| parent | 67b67f83d7be409132832611ecdf191dbd4e7d01 (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.cpp | 188 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/bruteforce.h | 18 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/expansion.cpp | 2 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/maestro.cpp | 13 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/maestro.h | 2 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/maestroa.cpp | 11 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/maestroa.h | 2 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/sparc.cpp | 14 | ||||
| -rw-r--r-- | src/devices/bus/saitek_osa/sparc.h | 2 |
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 *******************************************************************************/ |
