mirror of
https://github.com/holub/mame
synced 2025-04-20 15:32:45 +03:00
fdes2100d: fix bookrom bankswitch, make the lcd update edge triggered
This commit is contained in:
parent
f5f68b5d84
commit
3e5acb3380
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user