From 3e5acb33801f3f5de6d992692fb2420c1c133207 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 14 Oct 2022 19:03:44 +0200 Subject: fdes2100d: fix bookrom bankswitch, make the lcd update edge triggered --- src/mame/fidelity/desdis.cpp | 28 ++++++++++++---------------- src/mame/fidelity/phantom.cpp | 5 ++--- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/mame/fidelity/desdis.cpp b/src/mame/fidelity/desdis.cpp index db0b07dc2a1..c114e6df93b 100644 --- a/src/mame/fidelity/desdis.cpp +++ b/src/mame/fidelity/desdis.cpp @@ -92,11 +92,12 @@ protected: void fdes2100d_map(address_map &map); // I/O handlers - void update_lcd(); virtual void control_w(offs_t offset, u8 data); virtual void lcd_w(offs_t offset, u8 data); virtual u8 input_r(offs_t offset); + virtual u8 lcd_mask(bool pol) { return pol ? 0 : 0xff; } + u8 m_select = 0; u32 m_lcd_data = 0; }; @@ -135,6 +136,7 @@ private: // I/O handlers, slightly different (control_w is d0 instead of d7) virtual void control_w(offs_t offset, u8 data) override { desdis_state::control_w(offset, data << 7); } + virtual u8 lcd_mask(bool pol) override { return desdis_state::lcd_mask(!pol); } }; void desmas_state::init_fdes2265() @@ -159,18 +161,10 @@ void desmas_state::init_fdes2265() I/O ******************************************************************************/ -// TTL/generic - -void desdis_state::update_lcd() -{ - u8 mask = (m_select & 8) ? 0 : 0xff; - for (int i = 0; i < 4; i++) - m_display->write_row(i+2, (m_lcd_data >> (8*i) & 0xff) ^ mask); -} - void desdis_state::control_w(offs_t offset, u8 data) { // a0-a2,d7: 74259 + u8 prev = m_select; u8 mask = 1 << offset; m_select = (m_select & ~mask) | ((data & 0x80) ? mask : 0); @@ -187,10 +181,14 @@ void desdis_state::control_w(offs_t offset, u8 data) // 74259 Q2: book rom A14 if (m_rombank != nullptr) - m_rombank->set_entry(~m_select >> 2 & 1); + m_rombank->set_entry(m_select >> 2 & 1); - // 74259 Q3: lcd polarity - update_lcd(); + // 74259 Q3: lcd polarity (update at any edge) + if ((prev ^ m_select) & 8) + { + for (int i = 0; i < 4; i++) + m_display->write_row(i+2, (m_lcd_data >> (8*i) & 0xff) ^ lcd_mask(m_select & 8)); + } } void desdis_state::lcd_w(offs_t offset, u8 data) @@ -202,8 +200,6 @@ void desdis_state::lcd_w(offs_t offset, u8 data) m_lcd_data = (m_lcd_data & ~mask) | ((data >> i & 1) ? 0 : mask); mask <<= 8; } - - update_lcd(); } u8 desdis_state::input_r(offs_t offset) @@ -357,7 +353,7 @@ ROM_START( fdes2100d ) // model 6106, PCB label 510.1130A01, serial 000646xx ROM_LOAD("bk_3_white.ic10", 0x0000, 0x8000, CRC(3857cc35) SHA1(f073dafb9fd885c7ddb7fbff10e3653f343ef1c6) ) // " ROM_END -ROM_START( fdes2100da ) // model 6106, serial 914611xx +ROM_START( fdes2100da ) // model 6106, PCB label 510.1130A01, serial 914611xx ROM_REGION( 0x10000, "maincpu", 0 ) ROM_LOAD("i9_orange.ic9", 0x8000, 0x8000, CRC(83fec02a) SHA1(6f43ab05bc605061989b05d0592dbd184efff9d4) ) // Microchip 27C256-15 diff --git a/src/mame/fidelity/phantom.cpp b/src/mame/fidelity/phantom.cpp index dba7549e32a..510b94f0209 100644 --- a/src/mame/fidelity/phantom.cpp +++ b/src/mame/fidelity/phantom.cpp @@ -326,9 +326,8 @@ void phantom_state::update_lcd(u8 select) void phantom_state::control_w(offs_t offset, u8 data) { - u8 lcd_prev = m_select; - // a0-a2,d1: 74259 + u8 prev = m_select; u8 mask = 1 << offset; m_select = (m_select & ~mask) | ((data & 0x02) ? mask : 0); @@ -342,7 +341,7 @@ void phantom_state::control_w(offs_t offset, u8 data) m_rombank->set_entry(BIT(m_select, 6)); // 74259 Q7: lcd polarity - update_lcd(lcd_prev); + update_lcd(prev); } void chessterp_state::control_w(offs_t offset, u8 data) -- cgit v1.2.3