From 05c516cd26905d7315ee728b84ef7c724ee785b6 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 6 May 2016 10:56:19 +0200 Subject: [PATCH] hd44780_pixel_update_func to delegate (nw) --- src/devices/video/hd44780.cpp | 8 ++++---- src/devices/video/hd44780.h | 12 ++++++------ src/mame/drivers/alesis.cpp | 8 +++----- src/mame/drivers/cc40.cpp | 8 ++++---- src/mame/drivers/fb01.cpp | 5 +++-- src/mame/drivers/hprot1.cpp | 5 +++-- src/mame/drivers/icatel.cpp | 6 ++++-- src/mame/drivers/pc2000.cpp | 10 ++++++---- src/mame/drivers/piggypas.cpp | 5 +++-- src/mame/drivers/psion.cpp | 4 ++-- src/mame/drivers/ti74.cpp | 16 ++++++++-------- src/mame/includes/alesis.h | 3 ++- src/mame/includes/psion.h | 4 ++-- 13 files changed, 50 insertions(+), 44 deletions(-) diff --git a/src/devices/video/hd44780.cpp b/src/devices/video/hd44780.cpp index 0f8647ced55..a8ba3a77cc5 100644 --- a/src/devices/video/hd44780.cpp +++ b/src/devices/video/hd44780.cpp @@ -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 { diff --git a/src/devices/video/hd44780.h b/src/devices/video/hd44780.h index b1210fbd47d..5c2797e83e6 100644 --- a/src/devices/video/hd44780.h +++ b/src/devices/video/hd44780.h @@ -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 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(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(device).m_pixel_update_func = _cb; } + static void static_set_pixel_update_cb(device_t &device, hd44780_pixel_update_delegate callback) { downcast(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 diff --git a/src/mame/drivers/alesis.cpp b/src/mame/drivers/alesis.cpp index 132c60cc7bf..8dffc53a803 100644 --- a/src/mame/drivers/alesis.cpp +++ b/src/mame/drivers/alesis.cpp @@ -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(); - 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 ) diff --git a/src/mame/drivers/cc40.cpp b/src/mame/drivers/cc40.cpp index d36d5dce934..f537259fd42 100644 --- a/src/mame/drivers/cc40.cpp +++ b/src/mame/drivers/cc40.cpp @@ -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(); - 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") diff --git a/src/mame/drivers/fb01.cpp b/src/mame/drivers/fb01.cpp index 99fc222d7ca..a70ccb2cbed 100644 --- a/src/mame/drivers/fb01.cpp +++ b/src/mame/drivers/fb01.cpp @@ -42,6 +42,7 @@ public: virtual void machine_reset() override; DECLARE_PALETTE_INIT(fb01); + HD44780_PIXEL_UPDATE(fb01_pixel_update); private: required_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)) diff --git a/src/mame/drivers/hprot1.cpp b/src/mame/drivers/hprot1.cpp index dabd2b3d0f4..479b5b3ab2b 100644 --- a/src/mame/drivers/hprot1.cpp +++ b/src/mame/drivers/hprot1.cpp @@ -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. */ diff --git a/src/mame/drivers/icatel.cpp b/src/mame/drivers/icatel.cpp index 34e88e683fa..63255983beb 100644 --- a/src/mame/drivers/icatel.cpp +++ b/src/mame/drivers/icatel.cpp @@ -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 ) diff --git a/src/mame/drivers/pc2000.cpp b/src/mame/drivers/pc2000.cpp index 43c630303e1..8d34c4feda2 100644 --- a/src/mame/drivers/pc2000.cpp +++ b/src/mame/drivers/pc2000.cpp @@ -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") diff --git a/src/mame/drivers/piggypas.cpp b/src/mame/drivers/piggypas.cpp index 4e11eb6ebe5..afe628cbef5 100644 --- a/src/mame/drivers/piggypas.cpp +++ b/src/mame/drivers/piggypas.cpp @@ -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 m_maincpu; required_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") diff --git a/src/mame/drivers/psion.cpp b/src/mame/drivers/psion.cpp index 9efaaef9007..39f7c7d9dce 100644 --- a/src/mame/drivers/psion.cpp +++ b/src/mame/drivers/psion.cpp @@ -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") diff --git a/src/mame/drivers/ti74.cpp b/src/mame/drivers/ti74.cpp index 9c01b6ceea2..1f757426de0 100644 --- a/src/mame/drivers/ti74.cpp +++ b/src/mame/drivers/ti74.cpp @@ -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(); - 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(); - 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") diff --git a/src/mame/includes/alesis.h b/src/mame/includes/alesis.h index c22899efdd3..bec0463f49d 100644 --- a/src/mame/includes/alesis.h +++ b/src/mame/includes/alesis.h @@ -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; diff --git a/src/mame/includes/psion.h b/src/mame/includes/psion.h index bf09325add0..e13bfbce8dd 100644 --- a/src/mame/includes/psion.h +++ b/src/mame/includes/psion.h @@ -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_