From 30970c8e9301d7288158eda2a0eedd4ae989fffa Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 4 Jul 2019 00:22:42 +0200 Subject: fidel*: separate inputs (nw) --- src/mame/drivers/fidel_as12.cpp | 45 ++++++-- src/mame/drivers/fidel_cc1.cpp | 36 +++++-- src/mame/drivers/fidel_cc10.cpp | 50 +++++++-- src/mame/drivers/fidel_cc7.cpp | 39 +++++-- src/mame/drivers/fidel_chesster.cpp | 29 ++++-- src/mame/drivers/fidel_csc.cpp | 77 ++++++++++---- src/mame/drivers/fidel_dames.cpp | 40 ++++++-- src/mame/drivers/fidel_desdis.cpp | 53 ++++++++-- src/mame/drivers/fidel_eag68k.cpp | 70 +++++++++---- src/mame/drivers/fidel_elite.cpp | 70 +++++++------ src/mame/drivers/fidel_excel.cpp | 48 ++++++--- src/mame/drivers/fidel_sc12.cpp | 34 ++++++- src/mame/drivers/fidel_sc6.cpp | 58 +++++++++-- src/mame/drivers/fidel_sc8.cpp | 45 ++++++-- src/mame/drivers/fidel_sc9.cpp | 51 ++++++++-- src/mame/drivers/fidel_vcc.cpp | 37 +++++-- src/mame/drivers/fidel_vsc.cpp | 53 ++++++++-- src/mame/drivers/novag_presto.cpp | 6 +- src/mame/includes/chessbase.h | 14 --- src/mame/includes/fidelbase.h | 14 ++- src/mame/layout/fidel_eag.lay | 6 +- src/mame/layout/fidel_eag_68k.lay | 6 +- src/mame/layout/fidel_eas.lay | 6 +- src/mame/layout/fidel_eas_priv.lay | 6 +- src/mame/layout/fidel_pc.lay | 6 +- src/mame/machine/chessbase.cpp | 198 ------------------------------------ 26 files changed, 670 insertions(+), 427 deletions(-) diff --git a/src/mame/drivers/fidel_as12.cpp b/src/mame/drivers/fidel_as12.cpp index 32a6525e066..8f19d82b2c3 100644 --- a/src/mame/drivers/fidel_as12.cpp +++ b/src/mame/drivers/fidel_as12.cpp @@ -42,17 +42,22 @@ public: fidelbase_state(mconfig, type, tag), m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void as12(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_irq_on; required_device m_dac; required_device m_cart; + required_ioport_array<9> m_inputs; // address maps void main_map(address_map &map); @@ -68,8 +73,25 @@ private: DECLARE_WRITE8_MEMBER(control_w); DECLARE_WRITE8_MEMBER(led_w); DECLARE_READ8_MEMBER(input_r); + + u16 m_inp_mux; + u8 m_led_data; }; +void as12_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_inp_mux = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); +} + + /****************************************************************************** Devices, I/O @@ -92,7 +114,7 @@ DEVICE_IMAGE_LOAD_MEMBER(as12_state::cart_load) void as12_state::update_display() { // 8*8(+1) chessboard leds - display_matrix(8, 9, m_led_data_xxx, m_inp_mux_xxx); + display_matrix(8, 9, m_led_data, m_inp_mux); } WRITE8_MEMBER(as12_state::control_w) @@ -100,7 +122,7 @@ WRITE8_MEMBER(as12_state::control_w) // d0-d3: 74245 P0-P3 // 74245 Q0-Q8: input mux, led select u16 sel = 1 << (data & 0xf) & 0x3ff; - m_inp_mux_xxx = bitswap<9>(sel,5,8,7,6,4,3,1,0,2); + m_inp_mux = bitswap<9>(sel,5,8,7,6,4,3,1,0,2); update_display(); // 74245 Q9: speaker out @@ -113,15 +135,26 @@ WRITE8_MEMBER(as12_state::control_w) WRITE8_MEMBER(as12_state::led_w) { // a0-a2,d0: led data via NE591N - m_led_data_xxx = (data & 1) << offset; + m_led_data = (data & 1) << offset; update_display(); } READ8_MEMBER(as12_state::input_r) { + u8 data = 0; + // a0-a2,d7: multiplexed inputs (active low) - u8 inp = bitswap<8>(read_inputs(9),4,3,2,1,0,5,6,7); - return (inp >> offset & 1) ? 0 : 0x80; + // read chessboard sensors + for (int i = 0; i < 8; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + // read sidepanel buttons + if (m_inp_mux & 0x100) + data |= m_inputs[8]->read(); + + data = bitswap<8>(data,4,3,2,1,0,5,6,7); + return (data >> offset & 1) ? 0 : 0x80; } diff --git a/src/mame/drivers/fidel_cc1.cpp b/src/mame/drivers/fidel_cc1.cpp index 0d6d5bb36d8..5c486e4326b 100644 --- a/src/mame/drivers/fidel_cc1.cpp +++ b/src/mame/drivers/fidel_cc1.cpp @@ -61,7 +61,8 @@ public: cc1_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), m_ppi8255(*this, "ppi8255"), - m_delay(*this, "delay") + m_delay(*this, "delay"), + m_inputs(*this, "IN.%u", 0) { } // RE button is tied to 8224 RESIN pin @@ -71,10 +72,14 @@ public: void cc1(machine_config &config); void cc3(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_ppi8255; optional_device m_delay; + required_ioport_array<2> m_inputs; // address maps void main_map(address_map &map); @@ -85,8 +90,25 @@ private: DECLARE_READ8_MEMBER(ppi_porta_r); DECLARE_WRITE8_MEMBER(ppi_portb_w); DECLARE_WRITE8_MEMBER(ppi_portc_w); + + u8 m_led_select; + u8 m_7seg_data; }; +void cc1_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_led_select = 0; + m_7seg_data = 0; + + // register for savestates + save_item(NAME(m_led_select)); + save_item(NAME(m_7seg_data)); +} + + /****************************************************************************** Devices, I/O @@ -98,7 +120,7 @@ void cc1_state::update_display() { // 4 7segs + 2 leds set_display_segmask(0xf, 0x7f); - display_matrix(7, 6, m_7seg_data_xxx, m_led_select_xxx); + display_matrix(7, 6, m_7seg_data, m_led_select); } @@ -108,10 +130,10 @@ READ8_MEMBER(cc1_state::ppi_porta_r) { // 74148(priority encoder) I0-I7: inputs // d0-d2: 74148 S0-S2, d3: 74148 GS - u8 data = count_leading_zeros(m_inp_matrix[0]->read()) - 24; + u8 data = count_leading_zeros(m_inputs[0]->read()) - 24; // d5-d7: more inputs (direct) - data |= ~m_inp_matrix[1]->read() << 5 & 0xe0; + data |= ~m_inputs[1]->read() << 5 & 0xe0; // d4: 555 Q return data | ((m_delay->enabled()) ? 0x10 : 0); @@ -120,19 +142,19 @@ READ8_MEMBER(cc1_state::ppi_porta_r) WRITE8_MEMBER(cc1_state::ppi_portb_w) { // d0-d6: digit segment data - m_7seg_data_xxx = bitswap<7>(data,0,1,2,3,4,5,6); + m_7seg_data = bitswap<7>(data,0,1,2,3,4,5,6); update_display(); } WRITE8_MEMBER(cc1_state::ppi_portc_w) { // d6: trigger monostable 555 (R=15K, C=1uF) - if (~data & m_led_select_xxx & 0x40 && !m_delay->enabled()) + if (~data & m_led_select & 0x40 && !m_delay->enabled()) m_delay->adjust(attotime::from_msec(17)); // d0-d3: digit select // d4: check led, d5: lose led - m_led_select_xxx = data; + m_led_select = data; update_display(); } diff --git a/src/mame/drivers/fidel_cc10.cpp b/src/mame/drivers/fidel_cc10.cpp index 5463c0ee890..9fa902e2788 100644 --- a/src/mame/drivers/fidel_cc10.cpp +++ b/src/mame/drivers/fidel_cc10.cpp @@ -46,7 +46,8 @@ public: fidelbase_state(mconfig, type, tag), m_ppi8255(*this, "ppi8255"), m_beeper_off(*this, "beeper_off"), - m_beeper(*this, "beeper") + m_beeper(*this, "beeper"), + m_inputs(*this, "IN.%u", 0) { } // RE button is tied to Z80 RESET pin @@ -56,11 +57,15 @@ public: void acr(machine_config &config); void ccx(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_ppi8255; optional_device m_beeper_off; optional_device m_beeper; + required_ioport_array<4> m_inputs; TIMER_DEVICE_CALLBACK_MEMBER(beeper_off) { m_beeper->set_state(0); } @@ -79,36 +84,53 @@ private: DECLARE_WRITE8_MEMBER(ppi_portb_w); DECLARE_READ8_MEMBER(ppi_portc_r); DECLARE_WRITE8_MEMBER(ppi_portc_w); + + u8 m_inp_mux; + u8 m_led_select; + u8 m_7seg_data; }; +void ccx_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_inp_mux = 0; + m_led_select = 0; + m_7seg_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); + save_item(NAME(m_7seg_data)); +} + + /****************************************************************************** Devices, I/O ******************************************************************************/ -// misc handlers +// I8255 PPI void ccx_state::update_display() { // 4 7segs + 2 leds set_display_segmask(0xf, 0x7f); - display_matrix(8, 6, m_7seg_data_xxx, m_led_select_xxx); + display_matrix(8, 6, m_7seg_data, m_led_select); } - -// I8255 PPI - WRITE8_MEMBER(ccx_state::ppi_porta_w) { // d7: enable beeper on falling edge (556 monostable) (unpopulated on ACR) - if (m_beeper != nullptr && ~data & m_7seg_data_xxx & 0x80 && !m_beeper_off->enabled()) + if (m_beeper != nullptr && ~data & m_7seg_data & 0x80 && !m_beeper_off->enabled()) { m_beeper->set_state(1); m_beeper_off->adjust(attotime::from_msec(80)); // duration is approximate } // d0-d6: digit segment data - m_7seg_data_xxx = bitswap<8>(data,7,0,1,2,3,4,5,6); + m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); update_display(); } @@ -116,20 +138,26 @@ WRITE8_MEMBER(ccx_state::ppi_portb_w) { // d0: lose led, d1: check(win) led // d2-d5: digit select - m_led_select_xxx = bitswap<6>(data,0,1,5,4,3,2); + m_led_select = bitswap<6>(data,0,1,5,4,3,2); update_display(); } READ8_MEMBER(ccx_state::ppi_portc_r) { + u8 data = 0; + // d0-d3: multiplexed inputs (active low) - return ~read_inputs(4) & 0xf; + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data & 0xf; } WRITE8_MEMBER(ccx_state::ppi_portc_w) { // d4-d7: input mux (inverted) - m_inp_mux_xxx = ~data >> 4 & 0xf; + m_inp_mux = ~data >> 4 & 0xf; } diff --git a/src/mame/drivers/fidel_cc7.cpp b/src/mame/drivers/fidel_cc7.cpp index 8edd5edd967..d8376bae782 100644 --- a/src/mame/drivers/fidel_cc7.cpp +++ b/src/mame/drivers/fidel_cc7.cpp @@ -64,16 +64,21 @@ class bcc_state : public fidelbase_state public: bcc_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), - m_dac(*this, "dac") + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void bcc(machine_config &config); void bkc(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers optional_device m_dac; + required_ioport_array<4> m_inputs; // address maps void main_map(address_map &map); @@ -82,8 +87,24 @@ private: // I/O handlers DECLARE_READ8_MEMBER(input_r); DECLARE_WRITE8_MEMBER(control_w); + + u8 m_inp_mux; + u8 m_7seg_data; }; +void bcc_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_inp_mux = 0; + m_7seg_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_7seg_data)); +} + /****************************************************************************** @@ -96,23 +117,29 @@ WRITE8_MEMBER(bcc_state::control_w) { // a0-a2,d7: digit segment data via NE591 u8 mask = 1 << (offset & 7); - m_7seg_data_xxx = (m_7seg_data_xxx & ~mask) | ((data & 0x80) ? mask : 0); + m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0); // BCC: NE591 Q7 is speaker out if (m_dac != nullptr) - m_dac->write(BIT(m_7seg_data_xxx, 7)); + m_dac->write(BIT(m_7seg_data, 7)); // d0-d3: led select, input mux // d4,d5: upper leds(direct) set_display_segmask(0xf, 0x7f); - display_matrix(8, 6, m_7seg_data_xxx, data & 0x3f); - m_inp_mux_xxx = data & 0xf; + display_matrix(8, 6, m_7seg_data, data & 0x3f); + m_inp_mux = data & 0xf; } READ8_MEMBER(bcc_state::input_r) { + u8 data = 0; + // d0-d3: multiplexed inputs - return read_inputs(4); + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return data; } diff --git a/src/mame/drivers/fidel_chesster.cpp b/src/mame/drivers/fidel_chesster.cpp index 536ea1e927b..d99c2f655ad 100644 --- a/src/mame/drivers/fidel_chesster.cpp +++ b/src/mame/drivers/fidel_chesster.cpp @@ -47,7 +47,8 @@ public: chesster_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), m_irq_on(*this, "irq_on"), - m_rombank(*this, "rombank") + m_rombank(*this, "rombank"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -63,6 +64,7 @@ private: // devices/pointers required_device m_irq_on; required_memory_bank m_rombank; + required_ioport_array<9> m_inputs; // address maps void main_map(address_map &map); @@ -77,6 +79,7 @@ private: int m_numbanks; u8 m_speech_bank; + u8 m_select; }; void chesster_state::init_chesster() @@ -91,9 +94,11 @@ void chesster_state::machine_start() // zerofill m_speech_bank = 0; + m_select = 0; // register for savestates save_item(NAME(m_speech_bank)); + save_item(NAME(m_select)); } @@ -108,27 +113,37 @@ WRITE8_MEMBER(chesster_state::control_w) { // a0-a2,d7: 74259(1) u8 mask = 1 << offset; - m_led_select_xxx = (m_led_select_xxx & ~mask) | ((data & 0x80) ? mask : 0); + m_select = (m_select & ~mask) | ((data & 0x80) ? mask : 0); // 74259 Q4-Q7: 7442 a0-a3 // 7442 0-8: led data, input mux - u16 sel = 1 << (m_led_select_xxx >> 4 & 0xf) & 0x3ff; - m_inp_mux_xxx = sel & 0x1ff; + u16 led_data = 1 << (m_select >> 4 & 0xf) & 0x1ff; // 74259 Q0,Q1: led select (active low) - display_matrix(9, 2, m_inp_mux_xxx, ~m_led_select_xxx & 3); + display_matrix(9, 2, led_data, ~m_select & 3); // 74259 Q2,Q3: speechrom A14,A15 // a0-a2,d0: 74259(2) Q3,Q2,Q0 to A16,A17,A18 m_speech_bank = (m_speech_bank & ~mask) | ((data & 1) ? mask : 0); - u8 bank = (m_led_select_xxx >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2; + u8 bank = (m_select >> 2 & 3) | bitswap<3>(m_speech_bank, 0,2,3) << 2; m_rombank->set_entry(bank & (m_numbanks - 1)); } READ8_MEMBER(chesster_state::input_r) { + u8 sel = m_select >> 4 & 0xf; + u8 data = 0; + // a0-a2,d7: multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; + // read chessboard sensors + if (sel < 8) + data = m_inputs[sel]->read(); + + // read button panel + else if (sel == 8) + data = m_inputs[8]->read(); + + return (data >> offset & 1) ? 0 : 0x80; } diff --git a/src/mame/drivers/fidel_csc.cpp b/src/mame/drivers/fidel_csc.cpp index 54d6ad03f0c..296f1eb1047 100644 --- a/src/mame/drivers/fidel_csc.cpp +++ b/src/mame/drivers/fidel_csc.cpp @@ -224,7 +224,8 @@ public: m_dac(*this, "dac"), m_speech(*this, "speech"), m_speech_rom(*this, "speech"), - m_language(*this, "language") + m_language(*this, "language"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -243,6 +244,7 @@ protected: optional_device m_speech; optional_region_ptr m_speech_rom; optional_region_ptr m_language; + optional_ioport_array<9> m_inputs; // address maps void csc_map(address_map &map); @@ -254,8 +256,11 @@ protected: template TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(Line, CLEAR_LINE); } // I/O handlers + u16 read_inputs(); void update_display(); + void update_sound(); DECLARE_READ8_MEMBER(speech_r); + DECLARE_WRITE8_MEMBER(pia0_pa_w); DECLARE_WRITE8_MEMBER(pia0_pb_w); DECLARE_READ8_MEMBER(pia0_pa_r); @@ -268,6 +273,9 @@ protected: DECLARE_READ8_MEMBER(pia1_pb_r); DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w); + u8 m_led_data; + u8 m_7seg_data; + u8 m_inp_mux; u8 m_speech_bank; }; @@ -276,9 +284,15 @@ void csc_state::machine_start() fidelbase_state::machine_start(); // zerofill + m_led_data = 0; + m_7seg_data = 0; + m_inp_mux = 0; m_speech_bank = 0; // register for savestates + save_item(NAME(m_led_data)); + save_item(NAME(m_7seg_data)); + save_item(NAME(m_inp_mux)); save_item(NAME(m_speech_bank)); } @@ -319,17 +333,33 @@ void su9_state::su9_set_cpu_freq() // misc handlers -void csc_state::update_display() +u16 csc_state::read_inputs() { - // 7442 0-8: led select, input mux - m_inp_mux_xxx = 1 << m_led_select_xxx & 0x3ff; + u16 data = 0; - // 7442 9: speaker out - m_dac->write(BIT(m_inp_mux_xxx, 9)); + // read (chess)board sensors + if (m_inp_mux < 8) + data = m_inputs[m_inp_mux]->read(); + + // read other buttons + if (m_inp_mux < 9) + data |= m_inputs[m_inp_mux].read_safe(0); + return ~data; +} + +void csc_state::update_display() +{ + // 7442 0-8: led select (also input mux) // 7seg leds+H (not on all models), 8*8(+1) chessboard leds set_display_segmask(0xf, 0x7f); - display_matrix(16, 9, m_led_data_xxx << 8 | m_7seg_data_xxx, m_inp_mux_xxx); + display_matrix(16, 9, m_led_data << 8 | m_7seg_data, 1 << m_inp_mux); +} + +void csc_state::update_sound() +{ + // 7442 9: speaker out + m_dac->write(BIT(1 << m_inp_mux, 9)); } READ8_MEMBER(csc_state::speech_r) @@ -342,48 +372,51 @@ READ8_MEMBER(csc_state::speech_r) READ8_MEMBER(csc_state::pia0_pa_r) { - // d0-d5: button row 0-5 (active low) - return (read_inputs(9) & 0x3f) ^ 0xff; + // d0-d5: button row 0-5 + return (read_inputs() & 0x3f) | 0xc0; } WRITE8_MEMBER(csc_state::pia0_pa_w) { // d6,d7: 7442 A0,A1 - m_led_select_xxx = (m_led_select_xxx & ~3) | (data >> 6 & 3); + m_inp_mux = (m_inp_mux & ~3) | (data >> 6 & 3); update_display(); + update_sound(); } WRITE8_MEMBER(csc_state::pia0_pb_w) { // d0-d7: led row data - m_led_data_xxx = data; + m_led_data = data; update_display(); } READ_LINE_MEMBER(csc_state::pia0_ca1_r) { - // button row 6 (active low) - return ~read_inputs(9) >> 6 & 1; + // button row 6 + return read_inputs() >> 6 & 1; } READ_LINE_MEMBER(csc_state::pia0_cb1_r) { - // button row 7 (active low) - return ~read_inputs(9) >> 7 & 1; + // button row 7 + return read_inputs() >> 7 & 1; } WRITE_LINE_MEMBER(csc_state::pia0_cb2_w) { // 7442 A2 - m_led_select_xxx = (m_led_select_xxx & ~4) | (state ? 4 : 0); + m_inp_mux = (m_inp_mux & ~4) | (state ? 4 : 0); update_display(); + update_sound(); } WRITE_LINE_MEMBER(csc_state::pia0_ca2_w) { // 7442 A3 - m_led_select_xxx = (m_led_select_xxx & ~8) | (state ? 8 : 0); + m_inp_mux = (m_inp_mux & ~8) | (state ? 8 : 0); update_display(); + update_sound(); } @@ -395,7 +428,7 @@ WRITE8_MEMBER(csc_state::pia1_pa_w) m_speech->data_w(space, 0, data & 0x3f); // d0-d7: data for the 4 7seg leds, bits are ABFGHCDE (H is extra led) - m_7seg_data_xxx = bitswap<8>(data,0,1,5,6,7,2,3,4); + m_7seg_data = bitswap<8>(data,0,1,5,6,7,2,3,4); update_display(); } @@ -421,11 +454,11 @@ READ8_MEMBER(csc_state::pia1_pb_r) if (m_speech->busy_r()) data |= 0x08; - // d5: button row 8 (active low) - // d6,d7: language switches(hardwired with 2 resistors/jumpers) - data |= (~read_inputs(9) >> 3 & 0x20) | (*m_language << 6 & 0xc0); + // d5: button row 8 + data |= (read_inputs() >> 3 & 0x20); - return data; + // d6,d7: language switches(hardwired with 2 resistors/jumpers) + return data | (*m_language << 6 & 0xc0); } WRITE_LINE_MEMBER(csc_state::pia1_ca2_w) diff --git a/src/mame/drivers/fidel_dames.cpp b/src/mame/drivers/fidel_dames.cpp index 139e9e5fb18..8a283f2f8aa 100644 --- a/src/mame/drivers/fidel_dames.cpp +++ b/src/mame/drivers/fidel_dames.cpp @@ -38,16 +38,21 @@ public: dsc_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), m_irq_on(*this, "irq_on"), - m_dac(*this, "dac") + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void dsc(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_irq_on; required_device m_dac; + required_ioport_array<8> m_inputs; // address maps void main_map(address_map &map); @@ -61,8 +66,25 @@ private: DECLARE_WRITE8_MEMBER(control_w); DECLARE_WRITE8_MEMBER(select_w); DECLARE_READ8_MEMBER(input_r); + + u8 m_inp_mux; + u8 m_led_select; }; +void dsc_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_inp_mux = 0; + m_led_select = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_select)); +} + + /****************************************************************************** Devices, I/O @@ -74,14 +96,13 @@ void dsc_state::update_display() { // 4 7seg leds set_display_segmask(0xf, 0x7f); - display_matrix(8, 4, m_7seg_data_xxx, m_led_select_xxx); + display_matrix(8, 4, m_inp_mux, m_led_select); } WRITE8_MEMBER(dsc_state::control_w) { // d0-d7: input mux, 7seg data - m_inp_mux_xxx = ~data; - m_7seg_data_xxx = data; + m_inp_mux = data; update_display(); } @@ -91,14 +112,21 @@ WRITE8_MEMBER(dsc_state::select_w) m_dac->write(BIT(~data, 4)); // d0-d3: digit select - m_led_select_xxx = data & 0xf; + m_led_select = data & 0xf; update_display(); } READ8_MEMBER(dsc_state::input_r) { + u8 data = 0; + // d0-d7: multiplexed inputs (active low) - return ~read_inputs(8); + // read checkerboard + for (int i = 0; i < 8; i++) + if (BIT(~m_inp_mux, i)) + data |= m_inputs[i]->read(); + + return ~data; } diff --git a/src/mame/drivers/fidel_desdis.cpp b/src/mame/drivers/fidel_desdis.cpp index f24329c904b..28ca0fbb13d 100644 --- a/src/mame/drivers/fidel_desdis.cpp +++ b/src/mame/drivers/fidel_desdis.cpp @@ -65,7 +65,8 @@ public: fidelbase_state(mconfig, type, tag), m_irq_on(*this, "irq_on"), m_rombank(*this, "rombank"), - m_dac(*this, "dac") + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -75,10 +76,13 @@ public: void init_fdes2100d(); protected: + virtual void machine_start() override; + // devices/pointers required_device m_irq_on; optional_memory_bank m_rombank; required_device m_dac; + required_ioport_array<9> m_inputs; // address maps void fdes2100d_map(address_map &map); @@ -91,6 +95,9 @@ protected: virtual DECLARE_WRITE8_MEMBER(control_w); virtual DECLARE_WRITE8_MEMBER(lcd_w); virtual DECLARE_READ8_MEMBER(input_r); + + u8 m_select; + u32 m_lcd_data; }; void desdis_state::init_fdes2100d() @@ -98,6 +105,19 @@ void desdis_state::init_fdes2100d() m_rombank->configure_entries(0, 2, memregion("rombank")->base(), 0x4000); } +void desdis_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_select = 0; + m_lcd_data = 0; + + // register for savestates + save_item(NAME(m_select)); + save_item(NAME(m_lcd_data)); +} + // Designer Master class desmas_state : public desdis_state @@ -149,32 +169,32 @@ void desmas_state::init_fdes2265() WRITE8_MEMBER(desdis_state::control_w) { - u8 q3_old = m_led_select_xxx & 8; + u8 q3_old = m_select & 8; // a0-a2,d7: 74259 u8 mask = 1 << offset; - m_led_select_xxx = (m_led_select_xxx & ~mask) | ((data & 0x80) ? mask : 0); + m_select = (m_select & ~mask) | ((data & 0x80) ? mask : 0); // 74259 Q4-Q7: 7442 a0-a3 // 7442 0-8: led data, input mux - u16 sel = 1 << (m_led_select_xxx >> 4 & 0xf) & 0x3ff; - m_inp_mux_xxx = sel & 0x1ff; + u16 sel = 1 << (m_select >> 4 & 0xf); + u16 led_data = sel & 0x1ff; // 7442 9: speaker out m_dac->write(BIT(sel, 9)); // 74259 Q0,Q1: led select (active low) - display_matrix(9, 2, m_inp_mux_xxx, ~m_led_select_xxx & 3, false); + display_matrix(9, 2, led_data, ~m_select & 3, false); // 74259 Q2: book rom A14 if (m_rombank != nullptr) - m_rombank->set_entry(~m_led_select_xxx >> 2 & 1); + m_rombank->set_entry(~m_select >> 2 & 1); // 74259 Q3: lcd common, update on rising edge - if (~q3_old & m_led_select_xxx & 8) + if (~q3_old & m_select & 8) { for (int i = 0; i < 4; i++) - m_display_state[i+2] = m_7seg_data_xxx >> (8*i) & 0xff; + m_display_state[i+2] = m_lcd_data >> (8*i) & 0xff; } m_display_maxy += 4; @@ -188,15 +208,26 @@ WRITE8_MEMBER(desdis_state::lcd_w) u32 mask = bitswap<8>(1 << offset,3,7,6,0,1,2,4,5); for (int i = 0; i < 4; i++) { - m_7seg_data_xxx = (m_7seg_data_xxx & ~mask) | ((data >> i & 1) ? 0 : mask); + m_lcd_data = (m_lcd_data & ~mask) | ((data >> i & 1) ? 0 : mask); mask <<= 8; } } READ8_MEMBER(desdis_state::input_r) { + u8 sel = m_select >> 4 & 0xf; + u8 data = 0; + // a0-a2,d7: multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; + // read chessboard sensors + if (sel < 8) + data = m_inputs[sel]->read(); + + // read button panel + else if (sel == 8) + data = m_inputs[8]->read(); + + return (data >> offset & 1) ? 0 : 0x80; } diff --git a/src/mame/drivers/fidel_eag68k.cpp b/src/mame/drivers/fidel_eag68k.cpp index 0fd7d19bd4b..e828d14d6d2 100644 --- a/src/mame/drivers/fidel_eag68k.cpp +++ b/src/mame/drivers/fidel_eag68k.cpp @@ -184,7 +184,8 @@ public: m_irq_on(*this, "irq_on"), m_ram(*this, "ram"), m_dac(*this, "dac"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -199,6 +200,7 @@ public: void init_eag(); protected: + virtual void machine_start() override; void eag_base(machine_config &config); // devices/pointers @@ -207,6 +209,7 @@ protected: optional_device m_ram; required_device m_dac; optional_device m_cart; + optional_ioport_array<10> m_inputs; // address maps void eag_map(address_map &map); @@ -226,8 +229,27 @@ protected: DECLARE_READ8_MEMBER(input2_r); DECLARE_WRITE8_MEMBER(leds_w); DECLARE_WRITE8_MEMBER(digit_w); + + u8 m_select; + u8 m_7seg_data; + u8 m_led_data; }; +void eag_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_select = 0; + m_7seg_data = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_select)); + save_item(NAME(m_7seg_data)); + save_item(NAME(m_led_data)); +} + // EAG V5 class eagv5_state : public eag_state @@ -304,49 +326,59 @@ void eag_state::update_display() { // Excel 68000: 4*7seg leds, 8*8 chessboard leds // EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds - u8 seg_data = bitswap<8>(m_7seg_data_xxx,0,1,3,2,7,5,6,4); + u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); set_display_segmask(0x1ff, 0x7f); - display_matrix(16, 9, m_led_data_xxx << 8 | seg_data, m_inp_mux_xxx); + display_matrix(16, 9, m_led_data << 8 | seg_data, 1 << m_select); } WRITE8_MEMBER(eag_state::mux_w) { // a1-a3,d0: 74259 u8 mask = 1 << offset; - m_led_select_xxx = (m_led_select_xxx & ~mask) | ((data & 1) ? mask : 0); + m_select = (m_select & ~mask) | ((data & 1) ? mask : 0); // 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C) + m_select &= 0xf; + // 74145 0-8: input mux, digit/led select // 74145 9: speaker out - u16 sel = 1 << (m_led_select_xxx & 0xf); - m_dac->write(BIT(sel, 9)); - m_inp_mux_xxx = sel & 0x1ff; + m_dac->write(BIT(1 << m_select, 9)); update_display(); } READ8_MEMBER(eag_state::input1_r) { + u8 data = 0; + // a1-a3,d7: multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; + // read chessboard sensors + if (m_select < 8) + data = m_inputs[m_select]->read(); + + // read button panel + else if (m_select == 8) + data = m_inputs[8]->read(); + + return (data >> offset & 1) ? 0 : 0x80; } READ8_MEMBER(eag_state::input2_r) { - // d7: multiplexed inputs highest bit - return (read_inputs(9) & 0x100) ? 0x80 : 0; + // d7: 3 more buttons on EAG + return (BIT(m_inputs[9]->read(), m_select)) ? 0x80 : 0; } WRITE8_MEMBER(eag_state::leds_w) { // a1-a3,d0: led data - m_led_data_xxx = (m_led_data_xxx & ~(1 << offset)) | ((data & 1) << offset); + m_led_data = (m_led_data & ~(1 << offset)) | ((data & 1) << offset); update_display(); } WRITE8_MEMBER(eag_state::digit_w) { // a1-a3,d0(d8): digit segment data - m_7seg_data_xxx = (m_7seg_data_xxx & ~(1 << offset)) | ((data & 1) << offset); + m_7seg_data = (m_7seg_data & ~(1 << offset)) | ((data & 1) << offset); update_display(); } @@ -653,15 +685,6 @@ INPUT_PORTS_END static INPUT_PORTS_START( eag ) PORT_INCLUDE( generic_cb_magnets ) - PORT_MODIFY("IN.0") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") - - PORT_MODIFY("IN.1") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") - - PORT_MODIFY("IN.2") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") - PORT_START("IN.8") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen") @@ -671,6 +694,11 @@ static INPUT_PORTS_START( eag ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("LV / Pawn") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") INPUT_PORTS_END diff --git a/src/mame/drivers/fidel_elite.cpp b/src/mame/drivers/fidel_elite.cpp index 55575346da9..b252454bd5a 100644 --- a/src/mame/drivers/fidel_elite.cpp +++ b/src/mame/drivers/fidel_elite.cpp @@ -82,7 +82,8 @@ public: m_speech(*this, "speech"), m_speech_rom(*this, "speech"), m_language(*this, "language"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -107,6 +108,7 @@ private: required_region_ptr m_speech_rom; required_region_ptr m_language; required_device m_cart; + required_ioport_array<10> m_inputs; // address maps void eas_map(address_map &map); @@ -130,6 +132,9 @@ private: DECLARE_READ8_MEMBER(ppi_portb_r); DECLARE_WRITE8_MEMBER(ppi_portc_w); + u8 m_led_data; + u8 m_7seg_data; + u8 m_inp_mux; u8 m_speech_bank; }; @@ -143,9 +148,15 @@ void elite_state::machine_start() fidelbase_state::machine_start(); // zerofill + m_led_data = 0; + m_7seg_data = 0; + m_inp_mux = 0; m_speech_bank = 0; // register for savestates + save_item(NAME(m_led_data)); + save_item(NAME(m_7seg_data)); + save_item(NAME(m_inp_mux)); save_item(NAME(m_speech_bank)); } @@ -173,7 +184,7 @@ void elite_state::update_display() { // 4/8 7seg leds+H, 8*8(+1) chessboard leds set_display_segmask(0x1ef, 0x7f); - display_matrix(16, 9, m_led_data_xxx << 8 | m_7seg_data_xxx, m_led_select_xxx); + display_matrix(16, 9, m_led_data << 8 | m_7seg_data, 1 << m_inp_mux); } READ8_MEMBER(elite_state::speech_r) @@ -184,22 +195,32 @@ READ8_MEMBER(elite_state::speech_r) WRITE8_MEMBER(elite_state::segment_w) { // a0-a2,d7: digit segment - m_7seg_data_xxx = (data & 0x80) >> offset; - m_7seg_data_xxx = bitswap<8>(m_7seg_data_xxx,7,6,4,5,0,2,1,3); + m_7seg_data = (data & 0x80) >> offset; + m_7seg_data = bitswap<8>(m_7seg_data,7,6,4,5,0,2,1,3); update_display(); } WRITE8_MEMBER(elite_state::led_w) { // a0-a2,d0: led data - m_led_data_xxx = (data & 1) << offset; + m_led_data = (data & 1) << offset; update_display(); } READ8_MEMBER(elite_state::input_r) { + u8 data = 0; + // multiplexed inputs (active low) - return read_inputs(9) ^ 0xff; + // read chessboard sensors + if (m_inp_mux < 8) + data = m_inputs[m_inp_mux]->read(); + + // read button panel + else if (m_inp_mux == 8) + data = m_inputs[8]->read(); + + return ~data; } @@ -219,12 +240,11 @@ WRITE8_MEMBER(elite_state::ppi_portc_w) { // d0-d3: 7442 a0-a3 // 7442 0-8: led select, input mux - m_led_select_xxx = 1 << (data & 0xf) & 0x3ff; - m_inp_mux_xxx = m_led_select_xxx & 0x1ff; + m_inp_mux = data & 0xf; update_display(); // 7442 9: speaker out - m_dac->write(BIT(m_led_select_xxx, 9)); + m_dac->write(BIT(1 << m_inp_mux, 9)); // d4: speech ROM A12 m_speech->force_update(); // update stream to now @@ -249,8 +269,8 @@ READ8_MEMBER(elite_state::ppi_portb_r) // d2,d3: language switches(hardwired) data |= *m_language << 2 & 0x0c; - // d5: multiplexed inputs highest bit - data |= (read_inputs(9) & 0x100) ? 0 : 0x20; + // d5: 3 more buttons + data |= (BIT(m_inputs[9]->read(), m_inp_mux)) ? 0 : 0x20; // other: ? return data | 0xd0; @@ -401,15 +421,6 @@ static INPUT_PORTS_START( eas ) PORT_INCLUDE( fidel_cpu_div_4 ) PORT_INCLUDE( generic_cb_magnets ) - PORT_MODIFY("IN.0") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") - - PORT_MODIFY("IN.1") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") - - PORT_MODIFY("IN.2") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") - PORT_START("IN.8") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Game Control") // labeled RESET on the Prestige, but led display still says - G C - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_SPACE) PORT_NAME("Speaker") @@ -419,21 +430,17 @@ static INPUT_PORTS_START( eas ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("ST / Bishop") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("TB / Knight") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("LV / Pawn") + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") INPUT_PORTS_END static INPUT_PORTS_START( eag ) PORT_INCLUDE( fidel_cpu_div_4 ) PORT_INCLUDE( generic_cb_magnets ) - PORT_MODIFY("IN.0") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") - - PORT_MODIFY("IN.1") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") - - PORT_MODIFY("IN.2") - PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") - PORT_START("IN.8") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("RV") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_O) PORT_NAME("Option") @@ -443,6 +450,11 @@ static INPUT_PORTS_START( eag ) PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("TM / Rook") PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("PV / Queen") PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("PB / King") + + PORT_START("IN.9") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_DEL) PORT_NAME("CL") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_NAME("DM") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_CODE(KEYCODE_N) PORT_NAME("New Game") INPUT_PORTS_END diff --git a/src/mame/drivers/fidel_excel.cpp b/src/mame/drivers/fidel_excel.cpp index a2c772e654f..c2e61f9719f 100644 --- a/src/mame/drivers/fidel_excel.cpp +++ b/src/mame/drivers/fidel_excel.cpp @@ -9,8 +9,11 @@ Fidelity Excellence series hardware (for Excel 68000, see fidel_eag68k.cpp) TODO: -- granits gives error beeps at start, need to press clear to play +- granits gives error beeps at start, need to press clear to play. + Note that this also happens on a real 6080 PCB with this ROM, granits is a modified SC12 PCB though. + The problem goes away if RAM stays powered-on, but PCB has no indication of NVRAM. - granits chessboard buttons seem too sensitive (detects input on falling edge if held too long) +- granits has a module slot, is it usable? ******************************************************************************* @@ -155,7 +158,8 @@ public: m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), m_speech(*this, "speech"), - m_speech_rom(*this, "speech") + m_speech_rom(*this, "speech"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -180,6 +184,7 @@ private: required_device m_dac; optional_device m_speech; optional_region_ptr m_speech_rom; + optional_ioport_array<11> m_inputs; // address maps void fexcel_map(address_map &map); @@ -194,6 +199,8 @@ private: DECLARE_WRITE8_MEMBER(ttl_w); DECLARE_READ8_MEMBER(ttl_r); + u8 m_select; + u8 m_7seg_data; u8 m_speech_data; u8 m_speech_bank; }; @@ -203,10 +210,14 @@ void excel_state::machine_start() fidelbase_state::machine_start(); // zerofill + m_select = 0; + m_7seg_data = 0; m_speech_data = 0; m_speech_bank = 0; // register for savestates + save_item(NAME(m_select)); + save_item(NAME(m_7seg_data)); save_item(NAME(m_speech_data)); save_item(NAME(m_speech_bank)); } @@ -240,23 +251,22 @@ WRITE8_MEMBER(excel_state::ttl_w) { // a0-a2,d0: 74259(1) u8 mask = 1 << offset; - m_led_select_xxx = (m_led_select_xxx & ~mask) | ((data & 1) ? mask : 0); + m_select = (m_select & ~mask) | ((data & 1) ? mask : 0); // 74259 Q0-Q3: 7442 a0-a3 // 7442 0-8: led data, input mux - u16 sel = 1 << (m_led_select_xxx & 0xf) & 0x3ff; + u16 sel = 1 << (m_select & 0xf) & 0x3ff; u8 led_data = sel & 0xff; - m_inp_mux_xxx = sel & 0x1ff; // 7442 9: speaker out m_dac->write(BIT(sel, 9)); // 74259 Q4-Q7,Q2,Q1: digit/led select (active low) - u8 led_sel = ~bitswap<8>(m_led_select_xxx,0,3,1,2,7,6,5,4) & 0x3f; + u8 led_sel = ~bitswap<8>(m_select,0,3,1,2,7,6,5,4) & 0x3f; // a0-a2,d1: digit segment data (model 6093) - m_7seg_data_xxx = (m_7seg_data_xxx & ~mask) | ((data & 2) ? mask : 0); - u8 seg_data = bitswap<8>(m_7seg_data_xxx,0,1,3,2,7,5,6,4); + m_7seg_data = (m_7seg_data & ~mask) | ((data & 2) ? mask : 0); + u8 seg_data = bitswap<8>(m_7seg_data,0,1,3,2,7,5,6,4); // update display: 4 7seg leds, 2*8 chessboard leds for (int i = 0; i < 6; i++) @@ -285,17 +295,27 @@ WRITE8_MEMBER(excel_state::ttl_w) READ8_MEMBER(excel_state::ttl_r) { + u8 sel = m_select & 0xf; u8 d7 = 0x80; + u8 data = 0; // 74259(1) Q7 + 74251 I0: battery status - if (m_inp_matrix[10] != nullptr && m_inp_mux_xxx == 1 && ~m_led_select_xxx & 0x80) - d7 = m_inp_matrix[10]->read() & 0x80; + if (m_inputs[10] != nullptr && sel == 0 && ~m_select & 0x80) + d7 = m_inputs[10]->read() & 0x80; // a0-a2,d6: from speech board: language switches and TSI BUSY line, otherwise tied to VCC - u8 d6 = (m_inp_matrix[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0; + u8 d6 = (m_inputs[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0; // a0-a2,d7: multiplexed inputs (active low) - return ((read_inputs(9) >> offset & 1) ? 0 : d7) | d6 | 0x3f; + // read chessboard sensors + if (sel < 8) + data = m_inputs[sel]->read(); + + // read button panel + else if (sel == 8) + data = m_inputs[8]->read(); + + return ((data >> offset & 1) ? 0 : d7) | d6 | 0x3f; } @@ -507,7 +527,7 @@ void excel_state::granits(machine_config &config) fexcelp(config); /* basic machine hardware */ - m_maincpu->set_clock(8_MHz_XTAL/2); + m_maincpu->set_clock(8_MHz_XTAL/2); // R65C02P4 } void excel_state::fdes2100(machine_config &config) @@ -604,7 +624,7 @@ ROM_START( fexcelpb ) // model 6083, PCB label 510-1099B01 ROM_LOAD("par_ex.ic5", 0x8000, 0x8000, CRC(0d17b0f0) SHA1(3a6070fd4718c62b62ff0f08637bb6eb84eb9a1c) ) // GI 27C256, no label, only 1 byte difference, assume bugfix in bookrom ROM_END -ROM_START( granits ) // modified SC12 board, overclocked Par Excellence program +ROM_START( granits ) // modified SC12 board, Par Excellence program ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD("granit_s-4", 0x8000, 0x8000, CRC(274d6aff) SHA1(c8d943b2f15422ac62f539b568f5509cbce568a3) ) ROM_END diff --git a/src/mame/drivers/fidel_sc12.cpp b/src/mame/drivers/fidel_sc12.cpp index ef8de533873..50b77fb5fdd 100644 --- a/src/mame/drivers/fidel_sc12.cpp +++ b/src/mame/drivers/fidel_sc12.cpp @@ -74,18 +74,23 @@ public: fidelbase_state(mconfig, type, tag), m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void sc12(machine_config &config); void sc12b(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_irq_on; required_device m_dac; required_device m_cart; + required_ioport_array<9> m_inputs; // address maps void main_map(address_map &map); @@ -99,8 +104,19 @@ private: // I/O handlers DECLARE_WRITE8_MEMBER(control_w); DECLARE_READ8_MEMBER(input_r); + + u8 m_inp_mux; }; +void sc12_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill/register for savestates + m_inp_mux = 0; + save_item(NAME(m_inp_mux)); +} + /****************************************************************************** @@ -125,8 +141,8 @@ WRITE8_MEMBER(sc12_state::control_w) { // d0-d3: 7442 a0-a3 // 7442 0-8: led data, input mux - u16 sel = 1 << (data & 0xf) & 0x3ff; - m_inp_mux_xxx = sel & 0x1ff; + m_inp_mux = data & 0xf; + u16 sel = 1 << m_inp_mux & 0x3ff; // 7442 9: speaker out m_dac->write(BIT(sel, 9)); @@ -140,8 +156,18 @@ WRITE8_MEMBER(sc12_state::control_w) READ8_MEMBER(sc12_state::input_r) { + u8 data = 0; + // a0-a2,d7: multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; + // read chessboard sensors + if (m_inp_mux < 8) + data = m_inputs[m_inp_mux]->read(); + + // read button panel + else if (m_inp_mux == 8) + data = m_inputs[8]->read(); + + return (data >> offset & 1) ? 0 : 0x80; } diff --git a/src/mame/drivers/fidel_sc6.cpp b/src/mame/drivers/fidel_sc6.cpp index 3643023ec72..0690418fefa 100644 --- a/src/mame/drivers/fidel_sc6.cpp +++ b/src/mame/drivers/fidel_sc6.cpp @@ -46,17 +46,22 @@ public: fidelbase_state(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_dac(*this, "dac"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void sc6(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_maincpu; required_device m_dac; required_device m_cart; + required_ioport_array<9> m_inputs; // address maps void main_map(address_map &map); @@ -67,11 +72,30 @@ private: void update_display(); DECLARE_WRITE8_MEMBER(mux_w); DECLARE_WRITE8_MEMBER(select_w); + + u8 read_inputs(); DECLARE_READ8_MEMBER(input_r); DECLARE_READ_LINE_MEMBER(input6_r); DECLARE_READ_LINE_MEMBER(input7_r); + + u8 m_led_select; + u8 m_inp_mux; }; +void sc6_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_led_select = 0; + m_inp_mux = 0; + + // register for savestates + save_item(NAME(m_led_select)); + save_item(NAME(m_inp_mux)); +} + + /****************************************************************************** Devices, I/O @@ -103,46 +127,58 @@ void sc6_state::update_display() { // 2 7seg leds set_display_segmask(3, 0x7f); - display_matrix(7, 2, m_7seg_data_xxx, m_led_select_xxx); + display_matrix(7, 2, 1 << m_inp_mux, m_led_select); } WRITE8_MEMBER(sc6_state::mux_w) { // P24-P27: 7442 A-D - u16 sel = 1 << (data >> 4 & 0xf) & 0x3ff; - // 7442 0-8: input mux, 7seg data - m_inp_mux_xxx = sel & 0x1ff; - m_7seg_data_xxx = sel & 0x7f; + m_inp_mux = data >> 4 & 0xf; update_display(); // 7442 9: speaker out - m_dac->write(BIT(sel, 9)); + m_dac->write(BIT(1 << m_inp_mux, 9)); } WRITE8_MEMBER(sc6_state::select_w) { // P16,P17: digit select - m_led_select_xxx = ~data >> 6 & 3; + m_led_select = ~data >> 6 & 3; update_display(); } +u8 sc6_state::read_inputs() +{ + u8 data = 0; + + // read chessboard sensors + if (m_inp_mux < 8) + data = m_inputs[m_inp_mux]->read(); + + // read button panel + else if (m_inp_mux == 8) + data = m_inputs[8]->read(); + + return ~data; +} + READ8_MEMBER(sc6_state::input_r) { // P10-P15: multiplexed inputs low - return (~read_inputs(9) & 0x3f) | 0xc0; + return (read_inputs() & 0x3f) | 0xc0; } READ_LINE_MEMBER(sc6_state::input6_r) { // T0: multiplexed inputs bit 6 - return ~read_inputs(9) >> 6 & 1; + return read_inputs() >> 6 & 1; } READ_LINE_MEMBER(sc6_state::input7_r) { // T1: multiplexed inputs bit 7 - return ~read_inputs(9) >> 7 & 1; + return read_inputs() >> 7 & 1; } diff --git a/src/mame/drivers/fidel_sc8.cpp b/src/mame/drivers/fidel_sc8.cpp index 1f83a6cf128..212637fdc0f 100644 --- a/src/mame/drivers/fidel_sc8.cpp +++ b/src/mame/drivers/fidel_sc8.cpp @@ -34,15 +34,20 @@ class scc_state : public fidelbase_state public: scc_state(const machine_config &mconfig, device_type type, const char *tag) : fidelbase_state(mconfig, type, tag), - m_dac(*this, "dac") + m_dac(*this, "dac"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers void scc(machine_config &config); +protected: + virtual void machine_start() override; + private: // devices/pointers required_device m_dac; + required_ioport_array<9> m_inputs; // address maps void main_map(address_map &map); @@ -51,8 +56,25 @@ private: // I/O handlers DECLARE_READ8_MEMBER(input_r); DECLARE_WRITE8_MEMBER(control_w); + + u8 m_inp_mux; + u8 m_led_data; }; +void scc_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_inp_mux = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); +} + + /****************************************************************************** Devices, I/O @@ -64,19 +86,30 @@ WRITE8_MEMBER(scc_state::control_w) { // a0-a2,d7: led data u8 mask = 1 << (offset & 7); - m_led_data_xxx = (m_led_data_xxx & ~mask) | ((data & 0x80) ? mask : 0); + m_led_data = (m_led_data & ~mask) | ((data & 0x80) ? mask : 0); // d0-d3: led select, input mux (row 9 is speaker out) // d4: corner led(direct) - m_inp_mux_xxx = 1 << (data & 0xf); - m_dac->write(BIT(m_inp_mux_xxx, 9)); - display_matrix(8, 9, m_led_data_xxx, (m_inp_mux_xxx & 0xff) | (data << 4 & 0x100)); + m_inp_mux = data & 0xf; + u16 sel = 1 << m_inp_mux; + m_dac->write(BIT(sel, 9)); + display_matrix(8, 9, m_led_data, (sel & 0xff) | (data << 4 & 0x100)); } READ8_MEMBER(scc_state::input_r) { + u8 data = 0; + // d0-d7: multiplexed inputs (active low) - return ~read_inputs(9); + // read chessboard sensors + if (m_inp_mux < 8) + data = m_inputs[m_inp_mux]->read(); + + // read button panel + else if (m_inp_mux == 8) + data = m_inputs[8]->read(); + + return ~data; } diff --git a/src/mame/drivers/fidel_sc9.cpp b/src/mame/drivers/fidel_sc9.cpp index 0de2ea29739..1e7c6e1e2e8 100644 --- a/src/mame/drivers/fidel_sc9.cpp +++ b/src/mame/drivers/fidel_sc9.cpp @@ -65,7 +65,8 @@ public: fidelbase_state(mconfig, type, tag), m_irq_on(*this, "irq_on"), m_dac(*this, "dac"), - m_cart(*this, "cartslot") + m_cart(*this, "cartslot"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -75,10 +76,13 @@ public: void playmatic(machine_config &config); protected: + virtual void machine_start() override; + // devices/pointers required_device m_irq_on; required_device m_dac; required_device m_cart; + required_ioport_array<9> m_inputs; // address maps void sc9_map(address_map &map); @@ -96,8 +100,24 @@ protected: DECLARE_WRITE8_MEMBER(led_w); DECLARE_READ8_MEMBER(input_r); DECLARE_READ8_MEMBER(input_d7_r); + + u8 m_inp_mux; + u8 m_led_data; }; +void sc9_state::machine_start() +{ + fidelbase_state::machine_start(); + + // zerofill + m_inp_mux = 0; + m_led_data = 0; + + // register for savestates + save_item(NAME(m_inp_mux)); + save_item(NAME(m_led_data)); +} + // SC9C class sc9c_state : public sc9_state @@ -149,19 +169,18 @@ DEVICE_IMAGE_LOAD_MEMBER(sc9_state::cart_load) void sc9_state::update_display() { // 8*8 chessboard leds + 1 corner led - display_matrix(8, 9, m_led_data_xxx, m_inp_mux_xxx); + display_matrix(8, 9, m_led_data, 1 << m_inp_mux); } WRITE8_MEMBER(sc9_state::control_w) { // d0-d3: 74245 P0-P3 // 74245 Q0-Q8: input mux, led select - u16 sel = 1 << (data & 0xf) & 0x3ff; - m_inp_mux_xxx = sel & 0x1ff; + m_inp_mux = data & 0xf; update_display(); // 74245 Q9: speaker out - m_dac->write(BIT(sel, 9)); + m_dac->write(BIT(1 << m_inp_mux, 9)); // d4,d5: ? // d6,d7: N/C @@ -170,20 +189,30 @@ WRITE8_MEMBER(sc9_state::control_w) WRITE8_MEMBER(sc9_state::led_w) { // a0-a2,d0: led data via NE591N - m_led_data_xxx = (data & 1) << offset; + m_led_data = (data & 1) << offset; update_display(); } READ8_MEMBER(sc9_state::input_r) { - // multiplexed inputs (active low) - return read_inputs(9) ^ 0xff; + u8 data = 0; + + // d0-d7: multiplexed inputs (active low) + // read chessboard sensors + if (m_inp_mux < 8) + data = m_inputs[m_inp_mux]->read(); + + // read button panel + else if (m_inp_mux == 8) + data = m_inputs[8]->read(); + + return ~data; } READ8_MEMBER(sc9_state::input_d7_r) { - // a0-a2,d7: multiplexed inputs (active low) - return (read_inputs(9) >> offset & 1) ? 0 : 0x80; + // a0-a2,d7: multiplexed inputs + return (input_r(space, 0) >> offset & 1) ? 0x80 : 0; } @@ -457,7 +486,7 @@ void sc9_state::playmatic(machine_config &config) sc9b(config); /* basic machine hardware */ - m_maincpu->set_clock(3100000); // approximation + m_maincpu->set_clock(1500000 * 2); // advertised as double the speed of SC9 config.set_default_layout(layout_fidel_playmatic); } diff --git a/src/mame/drivers/fidel_vcc.cpp b/src/mame/drivers/fidel_vcc.cpp index 5f0b874465b..4da927c1bd1 100644 --- a/src/mame/drivers/fidel_vcc.cpp +++ b/src/mame/drivers/fidel_vcc.cpp @@ -7,7 +7,7 @@ Fidelity Voice Chess Challenger series hardware - Voice Chess Challenger (VCC) (version A and B?) - Advanced Voice Chess Challenger (UVC) -- *Grandmaster Voice Chess Challenger +- *Grandmaster Voice Chess Challenger (Fidelity Deutschland product) - *Decorator Challenger (FCC) *: not dumped yet @@ -124,7 +124,8 @@ public: m_ppi8255(*this, "ppi8255"), m_speech(*this, "speech"), m_speech_rom(*this, "speech"), - m_language(*this, "language") + m_language(*this, "language"), + m_inputs(*this, "IN.%u", 0) { } // RE button is tied to Z80 RESET pin @@ -142,6 +143,7 @@ private: required_device m_speech; required_region_ptr m_speech_rom; required_region_ptr m_language; + required_ioport_array<4> m_inputs; // address maps void main_map(address_map &map); @@ -156,6 +158,9 @@ private: DECLARE_READ8_MEMBER(ppi_portc_r); DECLARE_WRITE8_MEMBER(ppi_portc_w); + u8 m_led_select; + u8 m_7seg_data; + u8 m_inp_mux; u8 m_speech_bank; }; @@ -164,9 +169,15 @@ void vcc_state::machine_start() fidelbase_state::machine_start(); // zerofill + m_led_select = 0; + m_7seg_data = 0; + m_inp_mux = 0; m_speech_bank = 0; // register for savestates + save_item(NAME(m_led_select)); + save_item(NAME(m_7seg_data)); + save_item(NAME(m_inp_mux)); save_item(NAME(m_speech_bank)); // game relies on RAM filled with FF at power-on @@ -184,9 +195,9 @@ void vcc_state::machine_start() void vcc_state::update_display() { // 4 7seg leds (note: sel d0 for extra leds) - u8 outdata = (m_7seg_data_xxx & 0x7f) | (m_led_select_xxx << 7 & 0x80); + u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80); set_display_segmask(0xf, 0x7f); - display_matrix(8, 4, outdata, m_led_select_xxx >> 2 & 0xf); + display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf); } READ8_MEMBER(vcc_state::speech_r) @@ -200,7 +211,7 @@ READ8_MEMBER(vcc_state::speech_r) WRITE8_MEMBER(vcc_state::ppi_porta_w) { // d0-d6: digit segment data, bits are xABCDEFG - m_7seg_data_xxx = bitswap<8>(data,7,0,1,2,3,4,5,6); + m_7seg_data = bitswap<8>(data,7,0,1,2,3,4,5,6); update_display(); // d0-d5: TSI C0-C5 @@ -227,23 +238,31 @@ WRITE8_MEMBER(vcc_state::ppi_portb_w) { // d0,d2-d5: digit/led select // _d6: enable language switches - m_led_select_xxx = data; + m_led_select = data; update_display(); } READ8_MEMBER(vcc_state::ppi_portc_r) { + u8 data = 0; + // d0-d3: multiplexed inputs (active low) + for (int i = 0; i < 4; i++) + if (BIT(m_inp_mux, i)) + data |= m_inputs[i]->read(); + // also language switches, hardwired with 4 jumpers // 0(none wired): English, 1: German, 2: French, 4: Spanish, 8:Special(unused) - u8 lan = (~m_led_select_xxx & 0x40) ? *m_language : 0; - return ~(lan | read_inputs(4)) & 0xf; + if (~m_led_select & 0x40) + data |= *m_language; + + return ~data & 0xf; } WRITE8_MEMBER(vcc_state::ppi_portc_w) { // d4-d7: input mux (inverted) - m_inp_mux_xxx = ~data >> 4 & 0xf; + m_inp_mux = ~data >> 4 & 0xf; } diff --git a/src/mame/drivers/fidel_vsc.cpp b/src/mame/drivers/fidel_vsc.cpp index cd15203c69b..ffa03988e8f 100644 --- a/src/mame/drivers/fidel_vsc.cpp +++ b/src/mame/drivers/fidel_vsc.cpp @@ -177,7 +177,8 @@ public: m_ppi8255(*this, "ppi8255"), m_speech(*this, "speech"), m_speech_rom(*this, "speech"), - m_language(*this, "language") + m_language(*this, "language"), + m_inputs(*this, "IN.%u", 0) { } // machine drivers @@ -194,6 +195,7 @@ private: required_device m_speech; required_region_ptr m_speech_rom; required_region_ptr m_language; + required_ioport_array<10> m_inputs; // address maps void main_map(address_map &map); @@ -215,6 +217,11 @@ private: DECLARE_READ8_MEMBER(pio_portb_r); DECLARE_WRITE8_MEMBER(pio_portb_w); + u8 m_led_data; + u8 m_7seg_data; + u8 m_cb_mux; + u8 m_kp_mux; + bool m_lan_switch; u8 m_speech_bank; }; @@ -223,9 +230,19 @@ void vsc_state::machine_start() fidelbase_state::machine_start(); // zerofill + m_led_data = 0; + m_7seg_data = 0; + m_cb_mux = 0; + m_kp_mux = 0; m_speech_bank = 0; + m_lan_switch = false; // register for savestates + save_item(NAME(m_led_data)); + save_item(NAME(m_7seg_data)); + save_item(NAME(m_cb_mux)); + save_item(NAME(m_kp_mux)); + save_item(NAME(m_lan_switch)); save_item(NAME(m_speech_bank)); } @@ -241,7 +258,7 @@ void vsc_state::update_display() { // 4 7seg leds+H, 8*8 chessboard leds set_display_segmask(0xf, 0x7f); - display_matrix(16, 8, m_led_data_xxx << 8 | m_7seg_data_xxx, m_led_select_xxx); + display_matrix(16, 8, m_led_data << 8 | m_7seg_data, m_cb_mux); } READ8_MEMBER(vsc_state::speech_r) @@ -258,23 +275,22 @@ WRITE8_MEMBER(vsc_state::ppi_porta_w) m_speech->data_w(space, 0, data & 0x3f); // d0-d7: data for the 4 7seg leds, bits are HGCBAFED (H is extra led) - m_7seg_data_xxx = bitswap<8>(data,7,6,2,1,0,5,4,3); + m_7seg_data = bitswap<8>(data,7,6,2,1,0,5,4,3); update_display(); } WRITE8_MEMBER(vsc_state::ppi_portb_w) { // d0-d7: led row data - m_led_data_xxx = data; + m_led_data = data; update_display(); } WRITE8_MEMBER(vsc_state::ppi_portc_w) { // d0-d3: select digits - // d0-d7: select leds, input mux low bits - m_inp_mux_xxx = (m_inp_mux_xxx & ~0xff) | data; - m_led_select_xxx = data; + // d0-d7: select leds, chessboard input mux + m_cb_mux = data; update_display(); } @@ -283,10 +299,24 @@ WRITE8_MEMBER(vsc_state::ppi_portc_w) READ8_MEMBER(vsc_state::pio_porta_r) { + u8 data = 0; + // d0-d7: multiplexed inputs + // read chessboard sensors + for (int i = 0; i < 8; i++) + if (BIT(m_cb_mux, i)) + data |= m_inputs[i]->read(); + + // read other buttons + for (int i = 0; i < 2; i++) + if (BIT(m_kp_mux, i)) + data |= m_inputs[i+8]->read(); + // also language switches(hardwired with 2 diodes) - u8 lan = (m_inp_mux_xxx & 0x400) ? *m_language : 0; - return read_inputs(10) | lan; + if (m_lan_switch) + data |= *m_language; + + return data; } READ8_MEMBER(vsc_state::pio_portb_r) @@ -301,9 +331,10 @@ READ8_MEMBER(vsc_state::pio_portb_r) WRITE8_MEMBER(vsc_state::pio_portb_w) { - // d0,d1: input mux highest bits + // d0,d1: keypad input mux // d5: enable language switch - m_inp_mux_xxx = (m_inp_mux_xxx & 0xff) | (data << 8 & 0x300) | (data << 5 & 0x400); + m_kp_mux = data & 3; + m_lan_switch = bool(data & 0x20); // d7: TSI ROM A12 m_speech->force_update(); // update stream to now diff --git a/src/mame/drivers/novag_presto.cpp b/src/mame/drivers/novag_presto.cpp index cb4e3d57600..136fb3c44fd 100644 --- a/src/mame/drivers/novag_presto.cpp +++ b/src/mame/drivers/novag_presto.cpp @@ -45,7 +45,7 @@ public: m_display(*this, "display"), m_board(*this, "board"), m_dac(*this, "dac"), - m_keypad(*this, "IN.0") + m_inputs(*this, "IN.0") { } // machine drivers @@ -60,7 +60,7 @@ protected: required_device m_display; required_device m_board; optional_device m_dac; - required_ioport m_keypad; + required_ioport m_inputs; // I/O handlers void update_display(); @@ -159,7 +159,7 @@ READ8_MEMBER(presto_state::input_r) // read sidepanel keypad if (m_kp_select) - data |= m_keypad->read(); + data |= m_inputs->read(); return ~data; } diff --git a/src/mame/includes/chessbase.h b/src/mame/includes/chessbase.h index afd45b810ac..bdd256e5b88 100644 --- a/src/mame/includes/chessbase.h +++ b/src/mame/includes/chessbase.h @@ -19,7 +19,6 @@ class chessbase_state : public driver_device public: chessbase_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_inp_matrix(*this, "IN.%u", 0), m_out_x(*this, "%u.%u", 0U, 0U), m_out_a(*this, "%u.a", 0U), m_out_digit(*this, "digit%u", 0U), @@ -30,20 +29,10 @@ public: protected: // devices/pointers - optional_ioport_array<16> m_inp_matrix; // max 16 output_finder<0x20, 0x20> m_out_x; output_finder<0x20> m_out_a; output_finder<0x20> m_out_digit; - // misc common - u16 m_inp_mux_xxx; // multiplexed keypad/leds mask - u16 m_led_select_xxx; - u16 m_led_data_xxx; - u16 m_led_latch_xxx; - u32 m_7seg_data_xxx; // data for seg leds - - u16 read_inputs(int columns); - // display common int m_display_wait; // led/lamp off-delay in milliseconds (default 33ms) int m_display_maxy; // display matrix number of rows @@ -64,7 +53,4 @@ protected: }; -//INPUT_PORTS_EXTERN( generic_cb_buttons ); -//INPUT_PORTS_EXTERN( generic_cb_magnets ); - #endif // MAME_INCLUDES_CHESSBASE_H diff --git a/src/mame/includes/fidelbase.h b/src/mame/includes/fidelbase.h index ff82c666d80..b102b80ed2f 100644 --- a/src/mame/includes/fidelbase.h +++ b/src/mame/includes/fidelbase.h @@ -28,23 +28,27 @@ public: DECLARE_INPUT_CHANGED_MEMBER(div_changed) { div_refresh(newval); } protected: + virtual void machine_start() override; + virtual void machine_reset() override; + // devices/pointers required_device m_maincpu; optional_device m_mainmap; // dynamic cpu divider + void div_refresh(ioport_value val = 0xff); void div_trampoline_w(offs_t offset, u8 data); u8 div_trampoline_r(offs_t offset); - inline void div_set_cpu_freq(offs_t offset); + void div_trampoline(address_map &map); - void div_refresh(ioport_value val = 0xff); + +private: + inline void div_set_cpu_freq(offs_t offset); + u16 m_div_status; ioport_value m_div_config; double m_div_scale; emu_timer *m_div_timer; - - virtual void machine_start() override; - virtual void machine_reset() override; }; diff --git a/src/mame/layout/fidel_eag.lay b/src/mame/layout/fidel_eag.lay index 7583ea36c32..8f83fd7bedc 100644 --- a/src/mame/layout/fidel_eag.lay +++ b/src/mame/layout/fidel_eag.lay @@ -409,7 +409,7 @@ - + @@ -419,8 +419,8 @@ - - + + diff --git a/src/mame/layout/fidel_eag_68k.lay b/src/mame/layout/fidel_eag_68k.lay index 6e3555b4e1a..7b4337bdf07 100644 --- a/src/mame/layout/fidel_eag_68k.lay +++ b/src/mame/layout/fidel_eag_68k.lay @@ -409,7 +409,7 @@ - + @@ -419,8 +419,8 @@ - - + + diff --git a/src/mame/layout/fidel_eas.lay b/src/mame/layout/fidel_eas.lay index ed98c3a7675..2b912eb6d35 100644 --- a/src/mame/layout/fidel_eas.lay +++ b/src/mame/layout/fidel_eas.lay @@ -369,9 +369,9 @@ - - - + + + diff --git a/src/mame/layout/fidel_eas_priv.lay b/src/mame/layout/fidel_eas_priv.lay index 7d67442371f..29ef090f4a5 100644 --- a/src/mame/layout/fidel_eas_priv.lay +++ b/src/mame/layout/fidel_eas_priv.lay @@ -384,9 +384,9 @@ - - - + + + diff --git a/src/mame/layout/fidel_pc.lay b/src/mame/layout/fidel_pc.lay index aab54f67632..b4d126d5394 100644 --- a/src/mame/layout/fidel_pc.lay +++ b/src/mame/layout/fidel_pc.lay @@ -401,9 +401,9 @@ - - - + + + diff --git a/src/mame/machine/chessbase.cpp b/src/mame/machine/chessbase.cpp index dc8e208edd8..1a0bd51ed41 100644 --- a/src/mame/machine/chessbase.cpp +++ b/src/mame/machine/chessbase.cpp @@ -34,12 +34,6 @@ void chessbase_state::machine_start() memset(m_display_decay, 0, sizeof(m_display_decay)); memset(m_display_segmask, 0, sizeof(m_display_segmask)); - m_inp_mux_xxx = 0; - m_led_select_xxx = 0; - m_led_data_xxx = 0; - m_led_latch_xxx = 0; - m_7seg_data_xxx = 0; - // register for savestates save_item(NAME(m_display_maxy)); save_item(NAME(m_display_maxx)); @@ -48,12 +42,6 @@ void chessbase_state::machine_start() save_item(NAME(m_display_state)); save_item(NAME(m_display_decay)); save_item(NAME(m_display_segmask)); - - save_item(NAME(m_inp_mux_xxx)); - save_item(NAME(m_led_select_xxx)); - save_item(NAME(m_led_data_xxx)); - save_item(NAME(m_led_latch_xxx)); - save_item(NAME(m_7seg_data_xxx)); } void chessbase_state::machine_reset() @@ -137,189 +125,3 @@ void chessbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, boo if (update) display_update(); } - - -// generic input handlers - -u16 chessbase_state::read_inputs(int columns) -{ - u16 ret = 0; - - // read selected input rows - for (int i = 0; i < columns; i++) - if (m_inp_mux_xxx >> i & 1) - ret |= m_inp_matrix[i]->read(); - - return ret; -} - - -// chessboard generic inputs - -#if 0 - -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 - -INPUT_PORTS_START( generic_cb_magnets ) - PORT_START("IN.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - - PORT_START("IN.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor") -INPUT_PORTS_END - -#endif -- cgit v1.2.3