From c2317f3208738ade2b47b5957c69f4ab9dd753f0 Mon Sep 17 00:00:00 2001 From: hap Date: Mon, 9 Dec 2019 01:56:05 +0100 Subject: Machines promoted to working ---------------------------- Sphinx 40 [hap, Berger] --- src/mame/drivers/cxg_dominator.cpp | 21 ++--- src/mame/drivers/cxg_sphinx40.cpp | 77 +++++++++--------- src/mame/layout/cxg_dominator.lay | 8 +- src/mame/layout/cxg_sphinx40.lay | 160 ++++++++++++++++++++++++++++++++----- 4 files changed, 190 insertions(+), 76 deletions(-) diff --git a/src/mame/drivers/cxg_dominator.cpp b/src/mame/drivers/cxg_dominator.cpp index bab30b0cc2d..4ba5f50be8c 100644 --- a/src/mame/drivers/cxg_dominator.cpp +++ b/src/mame/drivers/cxg_dominator.cpp @@ -46,8 +46,8 @@ public: m_board(*this, "board"), m_dac(*this, "dac"), m_inputs(*this, "IN.%u", 0), - m_digits(*this, "digit%u", 0U), - m_dp(*this, "dp%u", 0U) + m_out_digit(*this, "digit%u", 0U), + m_out_lcd(*this, "lcd%u.%u", 0U, 0U) { } // machine drivers @@ -64,8 +64,8 @@ private: required_device m_board; required_device m_dac; required_ioport_array<2> m_inputs; - output_finder<8> m_digits; - output_finder<2> m_dp; + output_finder<8> m_out_digit; + output_finder<2, 53> m_out_lcd; // address maps void main_map(address_map &map); @@ -79,8 +79,8 @@ private: void dominator_state::machine_start() { - m_digits.resolve(); - m_dp.resolve(); + m_out_digit.resolve(); + m_out_lcd.resolve(); } @@ -96,7 +96,7 @@ WRITE64_MEMBER(dominator_state::lcd_s_w) u8 d[4]; // 1st digit: S1-S9, unused middle vertical segments - // 2nd digit: S10-S18, unused bottom-right diagonal segment + // 2nd digit: S10-S18, unused bottom-right diagonal segment, colon at S17 // 3rd digit: S21-S27 // 4th digit: S28-S34 d[0] = bitswap<9>(data >> 0 & 0x1ff, 2,7,5,4,3,1,0,8,6) & 0x7f; @@ -105,10 +105,11 @@ WRITE64_MEMBER(dominator_state::lcd_s_w) d[3] = bitswap<7>(data >> 27 & 0x7f, 4,2,0,6,5,3,1); for (int i = 0; i < 4; i++) - m_digits[offset * 4 + i] = d[i]; + m_out_digit[offset * 4 + i] = d[i]; - // colon: S17 (part of 2nd digit) - m_dp[offset] = BIT(data, 16); + // output individual segments + for (int i = 0; i < 53; i++) + m_out_lcd[offset][i] = BIT(data, i); } diff --git a/src/mame/drivers/cxg_sphinx40.cpp b/src/mame/drivers/cxg_sphinx40.cpp index abad5d898a4..bd456721f8b 100644 --- a/src/mame/drivers/cxg_sphinx40.cpp +++ b/src/mame/drivers/cxg_sphinx40.cpp @@ -6,7 +6,7 @@ CXG Sphinx 40 / 50 This is a modular chesscomputer, similar to Mephisto's 3-drawers one. -Chesscomputer on the right, LCD in the middle, and future expansion(?) on the left. +Chesscomputer on the right, LCD in the middle, and future expansion on the left. The only difference between 40 and 50 is the board size (40cm vs 50cm). The chess engine is Cyrus 68K, by Mark Taylor, with advice from David Levy. @@ -18,7 +18,6 @@ incarnation of Frans Morsch's Dominator program. TODO: - unmapped read from 0x200000, looks like expansion ROM - verify XTAL and irq source/frequency -- identify buttons Hardware notes: @@ -71,7 +70,8 @@ public: m_display(*this, "display"), m_board(*this, "board"), m_inputs(*this, "IN.%u", 0), - m_digits(*this, "digit%u", 0U) + m_out_digit(*this, "digit%u", 0U), + m_out_lcd(*this, "lcd%u", 0U) { } // machine drivers @@ -88,7 +88,8 @@ private: required_device m_display; required_device m_board; required_ioport_array<4> m_inputs; - output_finder<8> m_digits; + output_finder<8> m_out_digit; + output_finder<64> m_out_lcd; // address maps void main_map(address_map &map); @@ -113,7 +114,8 @@ private: void sphinx40_state::machine_start() { - m_digits.resolve(); + m_out_digit.resolve(); + m_out_lcd.resolve(); // register for savestates save_item(NAME(m_cb_mux)); @@ -131,9 +133,14 @@ void sphinx40_state::machine_start() WRITE64_MEMBER(sphinx40_state::lcd_seg_w) { + // output individual segments + for (int i = 0; i < 64; i++) + m_out_lcd[i] = BIT(data, i); + + // output digits for (int i = 0; i < 8; i++) { - m_digits[i] = data & 0xff; + m_out_digit[i] = data & 0x7f; data >>= 8; } } @@ -185,12 +192,12 @@ READ8_MEMBER(sphinx40_state::input_r) { u8 data = 0; - // d0-d7: multiplexed inputs (buttons) + // d0-d4: multiplexed inputs (buttons) for (int i = 0; i < 4; i++) if (BIT(m_inp_mux, i)) data |= m_inputs[i]->read(); - return ~data; + return ~data & 0x1f; } WRITE8_MEMBER(sphinx40_state::lcd_w) @@ -231,44 +238,32 @@ void sphinx40_state::nvram_map(address_map &map) static INPUT_PORTS_START( sphinx40 ) PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_NAME("Clock") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("Move") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_NAME("Level") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Function") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Hint") PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) // rook - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) // bishop - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4) PORT_NAME("Rook") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_NAME("Black") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_EQUALS) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Forward") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("What If?") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3) PORT_NAME("Bishop") PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) // knight - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) // sound? - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) // pawn - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2) PORT_NAME("Knight") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Sound") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_MINUS) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Backward") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Analysis") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1) PORT_NAME("Pawn") PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) // king - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) // pawn? - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) // new game? - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) // queen - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_COMMA) + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6) PORT_NAME("King") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_NAME("White") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set-Up") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5) PORT_NAME("Queen") INPUT_PORTS_END @@ -332,4 +327,4 @@ ROM_END ******************************************************************************/ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1987, sphinx40, 0, 0, sphinx40, sphinx40, sphinx40_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx 40", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NOT_WORKING ) +CONS( 1987, sphinx40, 0, 0, sphinx40, sphinx40, sphinx40_state, empty_init, "CXG Systems / Newcrest Technology", "Sphinx 40", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/layout/cxg_dominator.lay b/src/mame/layout/cxg_dominator.lay index a00c1e21fea..b55cfbe3b03 100644 --- a/src/mame/layout/cxg_dominator.lay +++ b/src/mame/layout/cxg_dominator.lay @@ -489,8 +489,8 @@ - - + + @@ -501,8 +501,8 @@ - - + + diff --git a/src/mame/layout/cxg_sphinx40.lay b/src/mame/layout/cxg_sphinx40.lay index e7a06ac3494..b4c12901322 100644 --- a/src/mame/layout/cxg_sphinx40.lay +++ b/src/mame/layout/cxg_sphinx40.lay @@ -74,26 +74,6 @@ - - - - - - - - - - - - - - - - - - - - @@ -386,10 +366,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -416,5 +529,10 @@ + + + + + -- cgit v1.2.3