summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/fidel_desdis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/fidel_desdis.cpp')
-rw-r--r--src/mame/drivers/fidel_desdis.cpp53
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;
}