diff --git a/src/devices/machine/sensorboard.cpp b/src/devices/machine/sensorboard.cpp index 63fb92a8649..2fd22010ec3 100644 --- a/src/devices/machine/sensorboard.cpp +++ b/src/devices/machine/sensorboard.cpp @@ -438,11 +438,8 @@ INPUT_CHANGED_MEMBER(sensorboard_device::sensor) INPUT_CHANGED_MEMBER(sensorboard_device::ui_spawn) { - if (!newval) - return; - - u8 pos = (u8)(uintptr_t)param; - if (pos > m_maxspawn) + u8 pos = (newval) ? (u8)(uintptr_t)param : 32 - count_leading_zeros(m_inp_spawn->read()); + if (pos == 0 || pos > m_maxspawn) return; cancel_sensor(); diff --git a/src/mame/drivers/cking_master.cpp b/src/mame/drivers/cking_master.cpp index cfb72a740ac..bf9d7b93192 100644 --- a/src/mame/drivers/cking_master.cpp +++ b/src/mame/drivers/cking_master.cpp @@ -117,8 +117,11 @@ u8 master_state::input_r() u8 data = 0; // d0-d7: multiplexed inputs + // read chessboard sensors if (m_inp_mux < 8) data = m_board->read_file(m_inp_mux, true); + + // read other buttons else if (m_inp_mux < 10) data = m_inputs[m_inp_mux - 8]->read(); diff --git a/src/mame/drivers/cxg_ch2001.cpp b/src/mame/drivers/cxg_ch2001.cpp index 31aaf84949a..ea29e4aae2f 100644 --- a/src/mame/drivers/cxg_ch2001.cpp +++ b/src/mame/drivers/cxg_ch2001.cpp @@ -115,8 +115,11 @@ READ8_MEMBER(ch2001_state::input_r) u8 data = 0; // d0-d7: multiplexed inputs + // read chessboard sensors if (m_inp_mux < 8) data = m_board->read_file(m_inp_mux, true); + + // read other buttons else if (m_inp_mux < 10) data = m_inputs[m_inp_mux - 8]->read(); diff --git a/src/mame/drivers/fidel_dames.cpp b/src/mame/drivers/fidel_dames.cpp index 8b4206effe7..defdd7443df 100644 --- a/src/mame/drivers/fidel_dames.cpp +++ b/src/mame/drivers/fidel_dames.cpp @@ -11,12 +11,20 @@ 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 +It's a checkers game for once instead of chess. + +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 +only once when doing a multiple capture. + +TODO: +- doesn't announce winner/loser when the game ends, or is this normal? ******************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" +#include "machine/sensorboard.h" #include "machine/timer.h" #include "sound/dac.h" #include "sound/volt_reg.h" @@ -36,6 +44,7 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_irq_on(*this, "irq_on"), + m_board(*this, "board"), m_display(*this, "display"), m_dac(*this, "dac"), m_inputs(*this, "IN.%u", 0) @@ -51,9 +60,10 @@ private: // devices/pointers required_device m_maincpu; required_device m_irq_on; + required_device m_board; required_device m_display; required_device m_dac; - required_ioport_array<8> m_inputs; + required_ioport_array<2> m_inputs; // address maps void main_map(address_map &map); @@ -68,6 +78,9 @@ private: DECLARE_WRITE8_MEMBER(select_w); DECLARE_READ8_MEMBER(input_r); + void init_board(int state); + u8 read_board_row(u8 row); + u8 m_inp_mux; u8 m_led_select; }; @@ -89,6 +102,44 @@ void dsc_state::machine_start() Devices, I/O ******************************************************************************/ +// sensorboard handlers + +void dsc_state::init_board(int state) +{ + for (int i = 0; i < 20; i++) + { + m_board->write_piece(i % 5, i / 5, 1); // white + m_board->write_piece(i % 5, i / 5 + 6, 3); // black + } +} + +u8 dsc_state::read_board_row(u8 row) +{ + u8 data = 0; + + // inputs to sensorboard translation table + static const u8 lut_i2sb[64] = + { + 0x00, 0x50, 0x60, 0x70, 0x40, 0x30, 0x20, 0x10, + 0x01, 0x51, 0x61, 0x71, 0x41, 0x31, 0x21, 0x11, + 0x02, 0x52, 0x62, 0x72, 0x42, 0x32, 0x22, 0x12, + 0x03, 0x83, 0x84, 0x82, 0x91, 0x81, 0x90, 0x80, + 0xff, 0x93, 0x94, 0x92, 0xff, 0xff, 0xff, 0xff, + 0x04, 0x53, 0x63, 0x73, 0x43, 0x33, 0x23, 0x13, + 0xff, 0x54, 0x64, 0x74, 0x44, 0x34, 0x24, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + }; + + for (int i = 0; i < 8; i++) + { + u8 pos = lut_i2sb[row * 8 + i]; + data = data << 1 | m_board->read_sensor(pos & 0xf, pos >> 4); + } + + return data; +} + + // TTL void dsc_state::update_display() @@ -119,10 +170,16 @@ READ8_MEMBER(dsc_state::input_r) u8 data = 0; // d0-d7: multiplexed inputs (active low) - // read checkerboard for (int i = 0; i < 8; i++) if (BIT(~m_inp_mux, i)) - data |= m_inputs[i]->read(); + { + // read checkerboard + data |= read_board_row(i); + + // read other buttons + if (i >= 6) + data |= m_inputs[i - 6]->read(); + } return ~data; } @@ -149,98 +206,11 @@ void dsc_state::main_map(address_map &map) Input Ports ******************************************************************************/ -INPUT_PORTS_START( generic_cb_buttons ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("Board Sensor") -INPUT_PORTS_END - static INPUT_PORTS_START( dsc ) - PORT_INCLUDE( generic_cb_buttons ) - - PORT_MODIFY("IN.4") - PORT_BIT(0x8f, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_MODIFY("IN.6") + PORT_START("IN.0") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("Black King") - PORT_MODIFY("IN.7") + PORT_START("IN.1") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Black") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("White King") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("White") @@ -268,6 +238,12 @@ void dsc_state::dsc(machine_config &config) m_irq_on->set_start_delay(irq_period - attotime::from_usec(41)); // active for 41us TIMER(config, "irq_off").configure_periodic(FUNC(dsc_state::irq_off), irq_period); + SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); + m_board->init_cb().set(FUNC(dsc_state::init_board)); + m_board->set_size(5, 10); // 2 columns per x (eg. square 1 & 6 are same x) + m_board->set_spawnpoints(4); + m_board->set_delay(attotime::from_msec(100)); + /* video hardware */ PWM_DISPLAY(config, m_display).set_size(4, 8); m_display->set_segmask(0xf, 0x7f); @@ -299,4 +275,4 @@ ROM_END ******************************************************************************/ // YEAR NAME PARENT CMP MACHINE INPUT STATE INIT COMPANY, FULLNAME, FLAGS -CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_IMPERFECT_CONTROLS ) +CONS( 1981, damesc, 0, 0, dsc, dsc, dsc_state, empty_init, "Fidelity Electronics", "Dame Sensory Challenger", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) diff --git a/src/mame/layout/cxg_ch2001.lay b/src/mame/layout/cxg_ch2001.lay index 49cb4c4c9b3..5c04a96f11a 100644 --- a/src/mame/layout/cxg_ch2001.lay +++ b/src/mame/layout/cxg_ch2001.lay @@ -4,10 +4,7 @@ - - - - + @@ -19,112 +16,112 @@ - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -139,8 +136,8 @@ - - + + @@ -305,34 +302,34 @@ - + - + - + - + - + - + - + @@ -433,8 +430,9 @@ - - + + + @@ -467,55 +465,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -534,8 +532,8 @@ - - + + diff --git a/src/mame/layout/fidel_csc.lay b/src/mame/layout/fidel_csc.lay index fe95d67ed69..27e774d550b 100644 --- a/src/mame/layout/fidel_csc.lay +++ b/src/mame/layout/fidel_csc.lay @@ -459,7 +459,7 @@ - + @@ -529,50 +529,50 @@ - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + diff --git a/src/mame/layout/fidel_dsc.lay b/src/mame/layout/fidel_dsc.lay index 33237310fad..0c2c00c6e41 100644 --- a/src/mame/layout/fidel_dsc.lay +++ b/src/mame/layout/fidel_dsc.lay @@ -3,6 +3,11 @@ + + + + + @@ -12,16 +17,6 @@ - - - - - - - - - - @@ -33,210 +28,205 @@ - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + @@ -259,222 +249,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -506,34 +548,40 @@ + + - - - - - - - - + + + + + + + + + - - - - - - - - + - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/layout/fidel_su9.lay b/src/mame/layout/fidel_su9.lay index 1ef33f56df5..f06e409dcda 100644 --- a/src/mame/layout/fidel_su9.lay +++ b/src/mame/layout/fidel_su9.lay @@ -484,7 +484,7 @@ - + @@ -562,50 +562,50 @@ - + - + - + - + - + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +