diff options
Diffstat (limited to 'src/mame/drivers/fidel_desdis.cpp')
-rw-r--r-- | src/mame/drivers/fidel_desdis.cpp | 53 |
1 files changed, 42 insertions, 11 deletions
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<timer_device> m_irq_on; optional_memory_bank m_rombank; required_device<dac_bit_interface> 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; } |