fdes2100d: fix bookrom bankswitch, make the lcd update edge triggered

This commit is contained in:
hap 2022-10-14 19:03:44 +02:00
parent f5f68b5d84
commit 3e5acb3380
2 changed files with 14 additions and 19 deletions

View File

@ -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

View File

@ -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)