hd44780_pixel_update_func to delegate (nw)

This commit is contained in:
Miodrag Milanovic 2016-05-06 10:56:19 +02:00
parent 87cca4d3f9
commit 05c516cd26
13 changed files with 50 additions and 44 deletions

View File

@ -47,7 +47,6 @@ ROM_END
hd44780_device::hd44780_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, HD44780, "HD44780 A00", tag, owner, clock, "hd44780_a00", __FILE__),
m_pixel_update_func(nullptr),
m_cgrom(*this, DEVICE_SELF)
{
set_charset_type(CHARSET_HD44780_A00);
@ -55,7 +54,6 @@ hd44780_device::hd44780_device(const machine_config &mconfig, const char *tag, d
hd44780_device::hd44780_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
m_pixel_update_func(nullptr),
m_cgrom(*this, DEVICE_SELF)
{
}
@ -91,6 +89,8 @@ void hd44780_device::device_start()
if (!m_cgrom.found())
m_cgrom.set_target(memregion("cgrom")->base(), 0x1000);
m_pixel_update_cb.bind_relative_to(*owner());
m_busy_timer = timer_alloc(TIMER_BUSY);
m_blink_timer = timer_alloc(TIMER_BLINKING);
m_blink_timer->adjust(attotime::from_msec(409), 0, attotime::from_msec(409));
@ -235,9 +235,9 @@ void hd44780_device::update_nibble(int rs, int rw)
inline void hd44780_device::pixel_update(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)
{
if (m_pixel_update_func != nullptr)
if (!m_pixel_update_cb.isnull())
{
m_pixel_update_func(*this, bitmap, line, pos, y, x, state);
m_pixel_update_cb(bitmap, line, pos, y, x, state);
}
else
{

View File

@ -21,15 +21,15 @@
#define MCFG_HD44780_LCD_SIZE(_lines, _chars) \
hd44780_device::static_set_lcd_size(*device, _lines, _chars);
#define MCFG_HD44780_PIXEL_UPDATE_CB(_cb) \
hd44780_device::static_set_pixel_update_cb(*device, _cb);
#define MCFG_HD44780_PIXEL_UPDATE_CB(_class, _method) \
hd44780_device::static_set_pixel_update_cb(*device, hd44780_pixel_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
typedef void (*hd44780_pixel_update_func)(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state);
#define HD44780_PIXEL_UPDATE(name) void name(device_t &device, bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)
typedef device_delegate<void (bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)> hd44780_pixel_update_delegate;
#define HD44780_PIXEL_UPDATE(name) void name(bitmap_ind16 &bitmap, UINT8 line, UINT8 pos, UINT8 y, UINT8 x, int state)
// ======================> hd44780_device
@ -43,7 +43,7 @@ public:
// static configuration helpers
static void static_set_lcd_size(device_t &device, int _lines, int _chars) { hd44780_device &dev=downcast<hd44780_device &>(device); dev.m_lines = _lines; dev.m_chars = _chars; }
static void static_set_pixel_update_cb(device_t &device, hd44780_pixel_update_func _cb) { downcast<hd44780_device &>(device).m_pixel_update_func = _cb; }
static void static_set_pixel_update_cb(device_t &device, hd44780_pixel_update_delegate callback) { downcast<hd44780_device &>(device).m_pixel_update_cb = callback; }
// device interface
virtual DECLARE_WRITE8_MEMBER(write);
@ -100,7 +100,7 @@ private:
UINT8 m_lines; // number of lines
UINT8 m_chars; // chars for line
hd44780_pixel_update_func m_pixel_update_func; // pixel update callback
hd44780_pixel_update_delegate m_pixel_update_cb; // pixel update callback
bool m_busy_flag; // busy flag
UINT8 m_ddram[0x80]; // internal display data RAM

View File

@ -346,12 +346,10 @@ void alesis_state::machine_reset()
}
static HD44780_PIXEL_UPDATE(sr16_pixel_update)
HD44780_PIXEL_UPDATE(alesis_state::sr16_pixel_update)
{
alesis_state *driv_state = device.machine().driver_data<alesis_state>();
if (line == 1 && pos >= 6 && pos < 8) // last 2 characters of the second line are used to control the LCD symbols
driv_state->update_lcd_symbols(bitmap, pos, y, x, state);
update_lcd_symbols(bitmap, pos, y, x, state);
else if (pos < 8)
bitmap.pix16(line*9 + y, pos*6 + x) = state;
}
@ -402,7 +400,7 @@ static MACHINE_CONFIG_DERIVED( sr16, hr16 )
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(2, 8)
MCFG_HD44780_PIXEL_UPDATE_CB(sr16_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(alesis_state, sr16_pixel_update)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( mmt8, hr16 )

View File

@ -145,6 +145,7 @@ public:
DECLARE_PALETTE_INIT(cc40);
DECLARE_INPUT_CHANGED_MEMBER(sysram_size_changed);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cc40_cartridge);
HD44780_PIXEL_UPDATE(cc40_pixel_update);
};
@ -198,7 +199,7 @@ void cc40_state::update_lcd_indicator(UINT8 y, UINT8 x, int state)
output().set_lamp_value(y * 10 + x, state);
}
static HD44780_PIXEL_UPDATE(cc40_pixel_update)
HD44780_PIXEL_UPDATE(cc40_state::cc40_pixel_update)
{
// char size is 5x7 + cursor
if (x > 4 || y > 7)
@ -207,8 +208,7 @@ static HD44780_PIXEL_UPDATE(cc40_pixel_update)
if (line == 1 && pos == 15)
{
// the last char is used to control the 18 lcd indicators
cc40_state *driver_state = device.machine().driver_data<cc40_state>();
driver_state->update_lcd_indicator(y, x, state);
update_lcd_indicator(y, x, state);
}
else if (line < 2 && pos < 16)
{
@ -606,7 +606,7 @@ static MACHINE_CONFIG_START( cc40, cc40_state )
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16) // 2*16 internal
MCFG_HD44780_PIXEL_UPDATE_CB(cc40_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(cc40_state, cc40_pixel_update)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -42,6 +42,7 @@ public:
virtual void machine_reset() override;
DECLARE_PALETTE_INIT(fb01);
HD44780_PIXEL_UPDATE(fb01_pixel_update);
private:
required_device<z80_device> m_maincpu;
@ -150,7 +151,7 @@ void fb01_state::update_int()
}
static HD44780_PIXEL_UPDATE(fb01_pixel_update)
HD44780_PIXEL_UPDATE(fb01_state::fb01_pixel_update)
{
if ( pos < 8 && line < 2 )
{
@ -189,7 +190,7 @@ static MACHINE_CONFIG_START( fb01, fb01_state )
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 8) // 2x8 displayed as 1x16
MCFG_HD44780_PIXEL_UPDATE_CB(fb01_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(fb01_state,fb01_pixel_update)
MCFG_DEVICE_ADD("upd71051", I8251, XTAL_4MHz)
MCFG_I8251_RXRDY_HANDLER(WRITELINE(fb01_state, upd71051_rxrdy_w))

View File

@ -74,6 +74,7 @@ public:
DECLARE_READ8_MEMBER(henry_io_r);
DECLARE_DRIVER_INIT(hprot1);
DECLARE_PALETTE_INIT(hprot1);
HD44780_PIXEL_UPDATE(hprot1_pixel_update);
private:
virtual void machine_start() override;
virtual void machine_reset() override;
@ -284,7 +285,7 @@ static GFXDECODE_START( hprot1 )
GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, henry_prot_charlayout, 0, 1 )
GFXDECODE_END
static HD44780_PIXEL_UPDATE(hprot1_pixel_update)
HD44780_PIXEL_UPDATE(hprot1_state::hprot1_pixel_update)
{
if ( pos < 16 && line==0 )
{
@ -319,7 +320,7 @@ static MACHINE_CONFIG_START( hprot1, hprot1_state )
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16)
MCFG_HD44780_PIXEL_UPDATE_CB(hprot1_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(hprot1_state,hprot1_pixel_update)
/* TODO: figure out which RTC chip is in use. */

View File

@ -55,6 +55,8 @@ public:
DECLARE_DRIVER_INIT(icatel);
DECLARE_PALETTE_INIT(icatel);
HD44780_PIXEL_UPDATE(icatel_pixel_update);
private:
virtual void machine_start() override;
@ -220,7 +222,7 @@ static GFXDECODE_START( icatel )
GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, prot_charlayout, 0, 1 )
GFXDECODE_END
static HD44780_PIXEL_UPDATE(icatel_pixel_update)
HD44780_PIXEL_UPDATE(icatel_state::icatel_pixel_update)
{
if ( pos < 16 && line==0 )
{
@ -256,7 +258,7 @@ static MACHINE_CONFIG_START( icatel, icatel_state )
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16)
MCFG_HD44780_PIXEL_UPDATE_CB(icatel_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(icatel_state, icatel_pixel_update)
MACHINE_CONFIG_END
ROM_START( icatel )

View File

@ -89,6 +89,7 @@ public:
{ }
virtual void machine_start() override;
HD44780_PIXEL_UPDATE(gl4000_pixel_update);
};
class pc1000_state : public pc2000_state
@ -107,6 +108,7 @@ public:
DECLARE_WRITE8_MEMBER( lcdc_data_w );
DECLARE_READ8_MEMBER( lcdc_control_r );
DECLARE_WRITE8_MEMBER( lcdc_control_w );
HD44780_PIXEL_UPDATE(pc1000_pixel_update);
};
@ -331,7 +333,7 @@ WRITE8_MEMBER( pc1000_state::lcdc_control_w )
m_lcdc->control_write(space, 0, data<<4);
}
static HD44780_PIXEL_UPDATE(pc1000_pixel_update)
HD44780_PIXEL_UPDATE(pc1000_state::pc1000_pixel_update)
{
UINT8 layout[] = { 0x00, 0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37 };
//UINT8 layout[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49 };
@ -862,7 +864,7 @@ static MACHINE_CONFIG_DERIVED( gl2000, pc2000 )
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("misterx_cart", "misterx")
MACHINE_CONFIG_END
static HD44780_PIXEL_UPDATE(gl4000_pixel_update)
HD44780_PIXEL_UPDATE(gl4004_state::gl4000_pixel_update)
{
if (pos < 40)
{
@ -907,7 +909,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( gl4000, pc2000, gl4004_state )
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(4, 20)
MCFG_HD44780_PIXEL_UPDATE_CB(gl4000_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(gl4004_state,gl4000_pixel_update)
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("gl2000_cart", "gl2000")
MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("misterx_cart", "misterx")
@ -927,7 +929,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( misterx, pc2000, pc1000_state )
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(1, 20)
MCFG_HD44780_PIXEL_UPDATE_CB(pc1000_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(pc1000_state,pc1000_pixel_update)
/* Software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list", "misterx")

View File

@ -32,6 +32,7 @@ public:
DECLARE_WRITE8_MEMBER(mcs51_tx_callback);
DECLARE_INPUT_CHANGED_MEMBER(ball_sensor);
DECLARE_CUSTOM_INPUT_MEMBER(ticket_r);
HD44780_PIXEL_UPDATE(piggypas_pixel_update);
required_device<mcs51_cpu_device> m_maincpu;
required_device<ticket_dispenser_device> m_ticket;
@ -123,7 +124,7 @@ void piggypas_state::machine_reset()
m_digit_idx = 0;
}
static HD44780_PIXEL_UPDATE(piggypas_pixel_update)
HD44780_PIXEL_UPDATE(piggypas_state::piggypas_pixel_update)
{
if (pos < 8)
bitmap.pix16(y, (line * 8 + pos) * 6 + x) = state;
@ -149,7 +150,7 @@ static MACHINE_CONFIG_START( piggypas, piggypas_state )
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(1, 16)
MCFG_HD44780_PIXEL_UPDATE_CB(piggypas_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(piggypas_state, piggypas_pixel_update)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -608,7 +608,7 @@ static MACHINE_CONFIG_DERIVED( psion_4lines, psion_2lines )
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(4, 20)
MCFG_HD44780_PIXEL_UPDATE_CB(psion_state::lz_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(psion_state,lz_pixel_update)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED_CLASS( psion1, psion_2lines, psion1_state )
@ -624,7 +624,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( psion1, psion_2lines, psion1_state )
MCFG_DEVICE_MODIFY("hd44780")
MCFG_HD44780_LCD_SIZE(1, 16)
MCFG_HD44780_PIXEL_UPDATE_CB(psion1_state::psion1_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(psion1_state,psion1_pixel_update)
/* Software lists */
MCFG_SOFTWARE_LIST_REMOVE("pack_list")

View File

@ -112,6 +112,8 @@ public:
DECLARE_PALETTE_INIT(ti74);
DECLARE_INPUT_CHANGED_MEMBER(battery_status_changed);
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(ti74_cartridge);
HD44780_PIXEL_UPDATE(ti74_pixel_update);
HD44780_PIXEL_UPDATE(ti95_pixel_update);
};
@ -171,7 +173,7 @@ void ti74_state::update_lcd_indicator(UINT8 y, UINT8 x, int state)
output().set_lamp_value(y * 10 + x, state);
}
static HD44780_PIXEL_UPDATE(ti74_pixel_update)
HD44780_PIXEL_UPDATE(ti74_state::ti74_pixel_update)
{
// char size is 5x7 + cursor
if (x > 4 || y > 7)
@ -180,8 +182,7 @@ static HD44780_PIXEL_UPDATE(ti74_pixel_update)
if (line == 1 && pos == 15)
{
// the last char is used to control the 14 lcd indicators
ti74_state *driver_state = device.machine().driver_data<ti74_state>();
driver_state->update_lcd_indicator(y, x, state);
update_lcd_indicator(y, x, state);
}
else if (line < 2 && pos < 16)
{
@ -191,7 +192,7 @@ static HD44780_PIXEL_UPDATE(ti74_pixel_update)
}
}
static HD44780_PIXEL_UPDATE(ti95_pixel_update)
HD44780_PIXEL_UPDATE(ti74_state::ti95_pixel_update)
{
// char size is 5x7 + cursor
if (x > 4 || y > 7)
@ -200,8 +201,7 @@ static HD44780_PIXEL_UPDATE(ti95_pixel_update)
if (line == 1 && pos == 15)
{
// the last char is used to control the 17 lcd indicators
ti74_state *driver_state = device.machine().driver_data<ti74_state>();
driver_state->update_lcd_indicator(y, x, state);
update_lcd_indicator(y, x, state);
}
else if (line == 0 && pos < 16)
{
@ -532,7 +532,7 @@ static MACHINE_CONFIG_START( ti74, ti74_state )
MCFG_HD44780_ADD("hd44780") // 270kHz
MCFG_HD44780_LCD_SIZE(2, 16) // 2*16 internal
MCFG_HD44780_PIXEL_UPDATE_CB(ti74_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(ti74_state,ti74_pixel_update)
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "ti74_cart")
@ -566,7 +566,7 @@ static MACHINE_CONFIG_START( ti95, ti74_state )
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 16)
MCFG_HD44780_PIXEL_UPDATE_CB(ti95_pixel_update)
MCFG_HD44780_PIXEL_UPDATE_CB(ti74_state,ti95_pixel_update)
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "ti95_cart")

View File

@ -94,7 +94,8 @@ public:
DECLARE_READ8_MEMBER( mmt8_p3_r );
DECLARE_WRITE8_MEMBER( mmt8_p3_w );
DECLARE_WRITE8_MEMBER( sr16_lcd_w );
HD44780_PIXEL_UPDATE(sr16_pixel_update);
private:
UINT8 m_kb_matrix;
UINT8 m_leds;

View File

@ -81,7 +81,7 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(psion_on);
TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer);
static HD44780_PIXEL_UPDATE(lz_pixel_update);
HD44780_PIXEL_UPDATE(lz_pixel_update);
};
@ -98,7 +98,7 @@ public:
DECLARE_READ8_MEMBER( inc_kb_counter_r );
DECLARE_READ8_MEMBER( switchoff_r );
static HD44780_PIXEL_UPDATE(psion1_pixel_update);
HD44780_PIXEL_UPDATE(psion1_pixel_update);
};
#endif // _PSION_H_