From 465e64fa148ecfb71bd39c30e78dd9c6a40bd838 Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 25 Apr 2020 02:27:31 +0200 Subject: [PATCH] New working machines -------------------- Sensor Computachess [hap, Sean Riddle] Portachess II [hap, Sean Riddle] --- scripts/target/mame/mess.lua | 1 + src/mame/drivers/cxg_scptchess.cpp | 225 ++++++++++++++++ src/mame/drivers/fidel_dames.cpp | 2 +- src/mame/drivers/hh_hmcs40.cpp | 6 +- src/mame/drivers/saitek_exchess.cpp | 24 +- src/mame/drivers/saitek_mark5.cpp | 20 +- src/mame/layout/cxg_scptchess.lay | 394 ++++++++++++++++++++++++++++ src/mame/mame.lst | 4 + src/mame/mess.flt | 1 + 9 files changed, 660 insertions(+), 17 deletions(-) create mode 100644 src/mame/drivers/cxg_scptchess.cpp create mode 100644 src/mame/layout/cxg_scptchess.lay diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index f7b10ee3136..4a3805bf029 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -2063,6 +2063,7 @@ createMESSProjects(_target, _subtarget, "cxg") files { MAME_DIR .. "src/mame/drivers/cxg_ch2001.cpp", MAME_DIR .. "src/mame/drivers/cxg_dominator.cpp", + MAME_DIR .. "src/mame/drivers/cxg_scptchess.cpp", MAME_DIR .. "src/mame/drivers/cxg_sphinx40.cpp", } diff --git a/src/mame/drivers/cxg_scptchess.cpp b/src/mame/drivers/cxg_scptchess.cpp new file mode 100644 index 00000000000..fa3522d9166 --- /dev/null +++ b/src/mame/drivers/cxg_scptchess.cpp @@ -0,0 +1,225 @@ +// license:BSD-3-Clause +// copyright-holders:hap +// thanks-to:Sean Riddle +/****************************************************************************** + +CXG Sensor Computachess (CXG-001 or WA-001) +CXG Portachess, Portachess II, Sphinx Chess Voyager + +Sensor Computachess is White & Allcock's first original chesscomputer. Cassia's +Chess Mate (aka Computachess) doesn't really count since it was a bootleg of +Fidelity Chess Challenger 10. The chess engine is by Mark Taylor, it's the same +one as in Mini Chess released by SciSys earlier that year. + +Initially, it had a "Sound" button for turning the beeps off. This was later +changed to the more useful "New Game". With Portachess, they added a "Save" +switch which puts the MCU in halt state. + +Hardware notes (Sensor Computachess): +- PCB label WA 001 +- HD44801 MCU @ ~400kHz +- buzzer, 16 leds, button sensors chessboard + +HD44801A50 used in: +- CXG Sensor Computachess +- Hanimex HCG 1500 +- Schneider Sensor Chesspartner MK 3 +- Systema Computachess + +HD44801C89 used in: +- CXG Portachess II +- CXG Computachess IV +- Fidelity Computachess IV +- Fidelity Mini Chess Challenger (same housing as Portachess II) +- Schneider MK 7 (same housing as Portachess II) +- Schneider Sensor Chessmaster MK 6 +- Schneider Sensor Chesspartner MK 4 + +TODO: +- Does the 1st Portachess have the same rom data as prtchess2? HD44801C89 + says "202" which is the model number of Portachess, although C89 is from 1985. + +******************************************************************************/ + +#include "emu.h" +#include "cpu/hmcs40/hmcs40.h" +#include "machine/sensorboard.h" +#include "sound/dac.h" +#include "sound/volt_reg.h" +#include "video/pwm.h" +#include "speaker.h" + +// internal artwork +#include "cxg_scptchess.lh" // clickable + + +namespace { + +class scptchess_state : public driver_device +{ +public: + scptchess_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_board(*this, "board"), + m_display(*this, "display"), + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) + { } + + void scptchess(machine_config &config); + + // assume that New Game button is directly tied to MCU reset + DECLARE_INPUT_CHANGED_MEMBER(reset_button) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE); } + +protected: + virtual void machine_start() override; + +private: + // devices/pointers + required_device m_maincpu; + required_device m_board; + required_device m_display; + required_device m_dac; + required_ioport_array<2> m_inputs; + + void update_display(); + template void mux_w(u8 data); + void leds_w(u16 data); + u16 input_r(); + + u8 m_inp_mux = 0; + u8 m_led_data = 0; +}; + +void scptchess_state::machine_start() +{ + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); +} + + + +/****************************************************************************** + I/O +******************************************************************************/ + +void scptchess_state::update_display() +{ + m_display->matrix(m_inp_mux, m_led_data); +} + +template +void scptchess_state::mux_w(u8 data) +{ + // R2x,R3x: input mux, led select + m_inp_mux = (m_inp_mux & ~(0xf << (N*4))) | (data << (N*4)); + update_display(); +} + +void scptchess_state::leds_w(u16 data) +{ + // D2,D3: led data + m_led_data = ~data >> 2 & 3; + update_display(); + + // D0: speaker out + m_dac->write(data & 1); +} + +u16 scptchess_state::input_r() +{ + u16 data = 0; + + // D7: read buttons + if (m_inp_mux & m_inputs[0]->read()) + data |= 0x80; + + // D8-D15: read chessboard + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_board->read_file(i ^ 7) << 8; + + return ~data; +} + + + +/****************************************************************************** + Input Ports +******************************************************************************/ + +static INPUT_PORTS_START( scptchess ) + PORT_START("IN.0") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Sound") // only hooked up on 1st version + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Reverse Play") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + + PORT_START("IN.1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_CHANGED_MEMBER(DEVICE_SELF, scptchess_state, reset_button, 0) PORT_NAME("New Game") +INPUT_PORTS_END + +static INPUT_PORTS_START( prtchess2 ) + PORT_INCLUDE( scptchess ) + + PORT_MODIFY("IN.0") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED) +INPUT_PORTS_END + + + +/****************************************************************************** + Machine Configs +******************************************************************************/ + +void scptchess_state::scptchess(machine_config &config) +{ + /* basic machine hardware */ + HD44801(config, m_maincpu, 400000); + m_maincpu->write_r<2>().set(FUNC(scptchess_state::mux_w<0>)); + m_maincpu->write_r<3>().set(FUNC(scptchess_state::mux_w<1>)); + m_maincpu->write_d().set(FUNC(scptchess_state::leds_w)); + m_maincpu->read_d().set(FUNC(scptchess_state::input_r)); + + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); + m_board->set_delay(attotime::from_msec(150)); + + /* video hardware */ + PWM_DISPLAY(config, m_display).set_size(8, 2); + config.set_default_layout(layout_cxg_scptchess); + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + DAC_1BIT(config, m_dac).add_route(ALL_OUTPUTS, "speaker", 0.25); + VOLTAGE_REGULATOR(config, "vref").add_route(0, "dac", 1.0, DAC_VREF_POS_INPUT); +} + + + +/****************************************************************************** + ROM Definitions +******************************************************************************/ + +ROM_START( scptchess ) + ROM_REGION( 0x2000, "maincpu", 0 ) + ROM_LOAD("white_allcock_44801a50", 0x0000, 0x2000, CRC(c5c53e05) SHA1(8fa9b8e48ca54f08585afd83ae78fb1970fbd382) ) +ROM_END + +ROM_START( prtchess2 ) + ROM_REGION( 0x2000, "maincpu", 0 ) + ROM_LOAD("202_newcrest_16_hd44801c89", 0x0000, 0x2000, CRC(56b48f70) SHA1(84ec62323c6d3314e0515bccfde2f65f6d753e99) ) +ROM_END + +} // anonymous namespace + + + +/****************************************************************************** + Drivers +******************************************************************************/ + +// YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS +CONS( 1981, scptchess, 0, 0, scptchess, scptchess, scptchess_state, empty_init, "CXG Systems / White & Allcock", "Sensor Computachess", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) + +CONS( 1985, prtchess2, 0, 0, scptchess, prtchess2, scptchess_state, empty_init, "CXG Systems / Newcrest Technology", "Portachess II", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/drivers/fidel_dames.cpp b/src/mame/drivers/fidel_dames.cpp index 7b5193988e9..fad565b94e9 100644 --- a/src/mame/drivers/fidel_dames.cpp +++ b/src/mame/drivers/fidel_dames.cpp @@ -11,7 +11,7 @@ Hardware notes: - 4-digit 7seg panel, sensory board with 50 buttons - PCB label 510-1030A01 -It's a checkers game for once instead of chess. +Instead of chess, it's a checkers game for once (international rules). When playing it on MAME with the sensorboard device, use the modifier keys (eg. hold CTRL to ignore sensor). The game expects the player to press a sensor diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp index 354d6703567..4e9b6207375 100644 --- a/src/mame/drivers/hh_hmcs40.cpp +++ b/src/mame/drivers/hh_hmcs40.cpp @@ -65,15 +65,15 @@ @A88 HD38820 1984, Bandai Pair Match (PT-460) (1/2) @A89 HD38820 1984, Bandai Pair Match (PT-460) (2/2) - *A34 HD44801 1981, Scisys Graduate Chess / Chesspartner 3000/4000 - *A50 HD44801 1981, CXG Sensor Computachess + *A34 HD44801 1981, Scisys Mini Chess / Graduate Chess / Chesspartner 3000/4000 + A50 HD44801 1981, CXG Sensor Computachess -> cxg_scptchess.cpp A75 HD44801 1982, Alpha 8201 protection MCU -> machine/alpha8201.* *A85 HD44801 1982, Scisys Travel Sensor / Travel Mate / Chesspartner 5000/6000 B35 HD44801 1983, Alpha 8302 protection MCU (see 8201) B42 HD44801 1983, Alpha 8303 protection MCU (see 8201) *B43 HD44801 1983, Alpha 8304 protection MCU (see 8201) C57 HD44801 1985, Alpha 8505 protection MCU (see 8201) - *C89 HD44801 1985, CXG Portachess II / Computachess IV + C89 HD44801 1985, CXG Portachess II / Computachess IV -> cxg_scptchess.cpp *A86 HD44820 1983, Chess King Pocket Micro *B63 HD44820 1985, CXG Pocket Chess (12 buttons) diff --git a/src/mame/drivers/saitek_exchess.cpp b/src/mame/drivers/saitek_exchess.cpp index 9d82ae727f4..f5eda160958 100644 --- a/src/mame/drivers/saitek_exchess.cpp +++ b/src/mame/drivers/saitek_exchess.cpp @@ -21,6 +21,7 @@ TODO: #include "machine/f3853.h" #include "video/hlcd0538.h" #include "video/pwm.h" +#include "screen.h" // internal artwork //#include "saitek_exchess.lh" // clickable @@ -37,11 +38,15 @@ public: m_lcd1(*this, "lcd1"), m_lcd2(*this, "lcd2"), m_display(*this, "display"), + m_battery(*this, "battery"), m_inputs(*this, "IN.%u", 0) { } void exchess(machine_config &config); + // battery status indicator is not software controlled + DECLARE_INPUT_CHANGED_MEMBER(battery) { m_battery = newval; } + protected: virtual void machine_start() override; @@ -51,7 +56,8 @@ private: required_device m_lcd1; required_device m_lcd2; required_device m_display; - required_ioport_array<3> m_inputs; + output_finder<> m_battery; + required_ioport_array<4> m_inputs; void main_map(address_map &map); void main_io(address_map &map); @@ -72,6 +78,7 @@ private: void exchess_state::machine_start() { + m_battery.resolve(); m_ram = make_unique_clear(0x400); // register for savestates @@ -127,7 +134,7 @@ u8 exchess_state::ram_address_r() u8 data = m_ram_address[N]; // P13: Enter button - return (N) ? data | m_inputs[0]->read() : data; + return (N) ? data | (m_inputs[0]->read() & 8) : data; } void exchess_state::ram_data_w(u8 data) @@ -183,6 +190,11 @@ static INPUT_PORTS_START( exchess ) PORT_START("IN.2") PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED) + + PORT_START("IN.3") + PORT_CONFNAME( 0x01, 0x00, "Battery Status" ) PORT_CHANGED_MEMBER(DEVICE_SELF, exchess_state, battery, 0) + PORT_CONFSETTING( 0x01, "Low" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) INPUT_PORTS_END @@ -218,6 +230,11 @@ void exchess_state::exchess(machine_config &config) PWM_DISPLAY(config, m_display).set_size(8, 26+34); //config.set_default_layout(layout_saitek_exchess); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG)); + screen.set_refresh_hz(60); + screen.set_size(977, 1080); + screen.set_visarea_full(); } @@ -229,6 +246,9 @@ void exchess_state::exchess(machine_config &config) ROM_START( exchess ) ROM_REGION( 0x1000, "maincpu", 0 ) ROM_LOAD("sl90553", 0x0000, 0x1000, CRC(a61b0c7e) SHA1(a13b11a93f78236223c5c0b9879a93284b7f7525) ) + + ROM_REGION( 774009, "screen", ROMREGION_ERASE00 ) + //ROM_LOAD("exchess.svg", 0, 774009, CRC(795d66e0) SHA1(5f786c00bf33793bfba7065d8e9ec476e02e5c46) ) ROM_END } // anonymous namespace diff --git a/src/mame/drivers/saitek_mark5.cpp b/src/mame/drivers/saitek_mark5.cpp index 2accd278b81..ae314766d07 100644 --- a/src/mame/drivers/saitek_mark5.cpp +++ b/src/mame/drivers/saitek_mark5.cpp @@ -14,7 +14,7 @@ Mark VI/Philidor was released a year later, it was a plug-in module for the Mark It's not much stronger than Mark V(retroactively called Mark V/Travemunde). When using the MAME sensorboard interface with MK VI, reset the board by pressing -CLEAR before RESET, needed on 1st power-on or when starting a new game. +CLEAR before RESET, needed when starting a new game. Hardware notes: - SY6502A @ ~2MHz (19.6608MHz XTAL, bunch of 74113 dividers) @@ -122,11 +122,12 @@ private: template DECLARE_WRITE8_MEMBER(pwm_output_w); template DECLARE_WRITE64_MEMBER(lcd_output_w); - u8 m_dac_data; - u8 m_lcd_lcd; - u8 m_lcd_rowsel; - u8 m_cb_mux; + u8 m_dac_data = 0; + u8 m_lcd_lcd = 0; + u8 m_lcd_rowsel = 0; + u8 m_cb_mux = 0; + emu_timer *m_cb_startdelay; emu_timer *m_irqtimer; TIMER_CALLBACK_MEMBER(interrupt); void write_lcd(int state); @@ -137,11 +138,8 @@ void mark5_state::machine_start() m_out_x.resolve(); m_irqtimer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mark5_state::interrupt),this)); - // zerofill - m_dac_data = 0; - m_lcd_lcd = 0; - m_lcd_rowsel = 0; - m_cb_mux = 0; + m_cb_startdelay = machine().scheduler().timer_alloc(timer_expired_delegate()); + m_cb_startdelay->adjust(attotime::from_msec(100)); // register for savestates save_item(NAME(m_dac_data)); @@ -279,7 +277,7 @@ WRITE8_MEMBER(mark5_state::cb_w) READ8_MEMBER(mark5_state::cb_r) { - if (~m_inputs[6]->read() & 0x20) + if (~m_inputs[6]->read() & 0x20 || m_cb_startdelay->enabled()) return 0xff; // read chessboard sensors diff --git a/src/mame/layout/cxg_scptchess.lay b/src/mame/layout/cxg_scptchess.lay new file mode 100644 index 00000000000..24922fa7db8 --- /dev/null +++ b/src/mame/layout/cxg_scptchess.lay @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 5900a918aef..b9ad9343853 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -11414,6 +11414,10 @@ ch2001 @source:cxg_dominator.cpp sdtor +@source:cxg_scptchess.cpp +prtchess2 +scptchess + @source:cxg_sphinx40.cpp sphinx40 diff --git a/src/mame/mess.flt b/src/mame/mess.flt index 0fd600810d1..6fb838c7d8f 100644 --- a/src/mame/mess.flt +++ b/src/mame/mess.flt @@ -193,6 +193,7 @@ ct486.cpp cvicny.cpp cxg_ch2001.cpp cxg_dominator.cpp +cxg_scptchess.cpp cxg_sphinx40.cpp cxhumax.cpp cybiko.cpp