diff options
Diffstat (limited to 'src')
93 files changed, 292 insertions, 326 deletions
diff --git a/src/emu/cheat.c b/src/emu/cheat.c index f2280ed64f8..e058398717f 100644 --- a/src/emu/cheat.c +++ b/src/emu/cheat.c @@ -1097,7 +1097,7 @@ cheat_manager::cheat_manager(running_machine &machine) return; // request a callback - machine.add_notifier(MACHINE_NOTIFY_FRAME, frame_update_static); + machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(cheat_manager::frame_update), this)); // create a global symbol table m_symtable.add("frame", symbol_table::READ_ONLY, &m_framecount); @@ -1380,11 +1380,6 @@ UINT64 cheat_manager::execute_tobcd(symbol_table &table, void *ref, int params, // frame_update - per-frame callback //------------------------------------------------- -void cheat_manager::frame_update_static(running_machine &machine) -{ - machine.cheat().frame_update(); -} - void cheat_manager::frame_update() { // set up for accumulating output diff --git a/src/emu/cheat.h b/src/emu/cheat.h index f8be8233a59..936352cc370 100644 --- a/src/emu/cheat.h +++ b/src/emu/cheat.h @@ -314,7 +314,7 @@ private: // ======================> cheat_manager // private machine-global data -class cheat_manager +class cheat_manager : public bindable_object { public: // construction/destruction @@ -343,7 +343,6 @@ public: private: // internal helpers - static void frame_update_static(running_machine &machine); void frame_update(); void load_cheats(const char *filename); diff --git a/src/emu/config.c b/src/emu/config.c index 070f3cd4cc7..d2937d38f21 100644 --- a/src/emu/config.c +++ b/src/emu/config.c @@ -28,8 +28,8 @@ struct _config_type { struct _config_type * next; /* next in line */ const char * name; /* node name */ - config_callback_func load; /* load callback */ - config_callback_func save; /* save callback */ + config_saveload_delegate load; /* load callback */ + config_saveload_delegate save; /* save callback */ }; @@ -75,7 +75,7 @@ void config_init(running_machine &machine) * *************************************/ -void config_register(running_machine &machine, const char *nodename, config_callback_func load, config_callback_func save) +void config_register(running_machine &machine, const char *nodename, config_saveload_delegate load, config_saveload_delegate save) { config_type *newtype; config_type **ptype; @@ -108,7 +108,7 @@ int config_load_settings(running_machine &machine) /* loop over all registrants and call their init function */ for (type = typelist; type; type = type->next) - (*type->load)(machine, CONFIG_TYPE_INIT, NULL); + type->load(CONFIG_TYPE_INIT, NULL); /* now load the controller file */ if (controller[0] != 0) @@ -138,7 +138,7 @@ int config_load_settings(running_machine &machine) /* loop over all registrants and call their final function */ for (type = typelist; type; type = type->next) - (*type->load)(machine, CONFIG_TYPE_FINAL, NULL); + type->load(CONFIG_TYPE_FINAL, NULL); /* if we didn't find a saved config, return 0 so the main core knows that it */ /* is the first time the game is run and it should diplay the disclaimer. */ @@ -152,7 +152,7 @@ void config_save_settings(running_machine &machine) /* loop over all registrants and call their init function */ for (type = typelist; type; type = type->next) - (*type->save)(machine, CONFIG_TYPE_INIT, NULL); + type->save(CONFIG_TYPE_INIT, NULL); /* save the defaults file */ emu_file file(machine.options().cfg_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); @@ -167,7 +167,7 @@ void config_save_settings(running_machine &machine) /* loop over all registrants and call their final function */ for (type = typelist; type; type = type->next) - (*type->save)(machine, CONFIG_TYPE_FINAL, NULL); + type->save(CONFIG_TYPE_FINAL, NULL); } @@ -253,7 +253,7 @@ static int config_load_xml(running_machine &machine, emu_file &file, int which_t /* loop over all registrants and call their load function */ for (type = typelist; type; type = type->next) - (*type->load)(machine, which_type, xml_get_sibling(systemnode->child, type->name)); + type->load(which_type, xml_get_sibling(systemnode->child, type->name)); count++; } @@ -308,7 +308,7 @@ static int config_save_xml(running_machine &machine, emu_file &file, int which_t xml_data_node *curnode = xml_add_child(systemnode, type->name, NULL); if (!curnode) goto error; - (*type->save)(machine, which_type, curnode); + type->save(which_type, curnode); /* if nothing was added, just nuke the node */ if (!curnode->value && !curnode->child) diff --git a/src/emu/config.h b/src/emu/config.h index 4dc13486b6c..e94b0bfbb2f 100644 --- a/src/emu/config.h +++ b/src/emu/config.h @@ -43,7 +43,7 @@ enum * *************************************/ -typedef void (*config_callback_func)(running_machine &machine, int config_type, xml_data_node *parentnode); +typedef delegate<void (int, xml_data_node *)> config_saveload_delegate; @@ -54,7 +54,7 @@ typedef void (*config_callback_func)(running_machine &machine, int config_type, *************************************/ void config_init(running_machine &machine); -void config_register(running_machine &machine, const char *nodename, config_callback_func load, config_callback_func save); +void config_register(running_machine &machine, const char *nodename, config_saveload_delegate load, config_saveload_delegate save); int config_load_settings(running_machine &machine); void config_save_settings(running_machine &machine); diff --git a/src/emu/cpu/drcbec.c b/src/emu/cpu/drcbec.c index 65c8c2fc396..491175a9145 100644 --- a/src/emu/cpu/drcbec.c +++ b/src/emu/cpu/drcbec.c @@ -319,7 +319,8 @@ drcbe_c::drcbe_c(drcuml_state &drcuml, device_t &device, drc_cache &cache, UINT3 : drcbe_interface(drcuml, cache, device), m_hash(cache, modes, addrbits, ignorebits), m_map(cache, 0), - m_labels(cache) + m_labels(cache), + m_fixup_delegate(FUNC(drcbe_c::fixup_label), this) { } @@ -403,7 +404,7 @@ void drcbe_c::generate(drcuml_block &block, const instruction *instlist, UINT32 // JMP instructions need to resolve their labels case OP_JMP: (dst++)->i = MAKE_OPCODE_FULL(opcode, inst.size(), inst.condition(), inst.flags(), 1); - dst->inst = (drcbec_instruction *)m_labels.get_codeptr(inst.param(0).label(), fixup_label, dst); + dst->inst = (drcbec_instruction *)m_labels.get_codeptr(inst.param(0).label(), m_fixup_delegate, dst); dst++; break; diff --git a/src/emu/cpu/drcbec.h b/src/emu/cpu/drcbec.h index f74face8497..ada16d7f055 100644 --- a/src/emu/cpu/drcbec.h +++ b/src/emu/cpu/drcbec.h @@ -70,7 +70,7 @@ public: private: // helpers void output_parameter(drcbec_instruction **dstptr, void **immedptr, int size, const uml::parameter ¶m); - static void fixup_label(void *parameter, drccodeptr labelcodeptr); + void fixup_label(void *parameter, drccodeptr labelcodeptr); int dmulu(UINT64 &dstlo, UINT64 &dsthi, UINT64 src1, UINT64 src2, int flags); int dmuls(UINT64 &dstlo, UINT64 &dsthi, INT64 src1, INT64 src2, int flags); @@ -78,6 +78,7 @@ private: drc_hash_table m_hash; // hash table state drc_map_variables m_map; // code map drc_label_list m_labels; // label list + drc_label_fixup_delegate m_fixup_delegate; // precomputed delegate static const UINT32 s_condition_map[32]; static UINT64 s_immediate_zero; diff --git a/src/emu/cpu/drcbeut.c b/src/emu/cpu/drcbeut.c index b33d2207a1c..883c3ba05ec 100644 --- a/src/emu/cpu/drcbeut.c +++ b/src/emu/cpu/drcbeut.c @@ -463,7 +463,8 @@ UINT32 drc_map_variables::get_last_value(UINT32 mapvar) //------------------------------------------------- drc_label_list::drc_label_list(drc_cache &cache) - : m_cache(cache) + : m_cache(cache), + m_oob_callback_delegate(FUNC(drc_label_list::oob_callback), this) { } @@ -497,6 +498,14 @@ void drc_label_list::block_begin(drcuml_block &block) void drc_label_list::block_end(drcuml_block &block) { + // can't free until the cache is clean of our OOB requests + assert(!m_cache.generating_code()); + + // free all of the pending fixup requests + label_fixup *fixup; + while ((fixup = m_fixup_list.detach_head()) != NULL) + m_cache.dealloc(fixup, sizeof(*fixup)); + // make sure the label list is clear, and fatalerror if we missed anything reset(true); } @@ -508,13 +517,19 @@ void drc_label_list::block_end(drcuml_block &block) // undefined //------------------------------------------------- -drccodeptr drc_label_list::get_codeptr(uml::code_label label, fixup_func fixup, void *param) +drccodeptr drc_label_list::get_codeptr(uml::code_label label, drc_label_fixup_delegate callback, void *param) { label_entry *curlabel = find_or_allocate(label); // if no code pointer, request an OOB callback - if (curlabel->m_codeptr == NULL && fixup != NULL) - m_cache.request_oob_codegen(oob_callback, curlabel, (void *)fixup, param); + if (curlabel->m_codeptr == NULL && !callback.isnull()) + { + label_fixup *fixup = reinterpret_cast<label_fixup *>(m_cache.alloc(sizeof(*fixup))); + fixup->m_callback = callback; + fixup->m_label = curlabel; + m_fixup_list.append(*fixup); + m_cache.request_oob_codegen(m_oob_callback_delegate, fixup, param); + } return curlabel->m_codeptr; } @@ -584,10 +599,8 @@ drc_label_list::label_entry *drc_label_list::find_or_allocate(uml::code_label la // for labels //------------------------------------------------- -void drc_label_list::oob_callback(drccodeptr *codeptr, void *param1, void *param2, void *param3) +void drc_label_list::oob_callback(drccodeptr *codeptr, void *param1, void *param2) { - label_entry *label = (label_entry *)param1; - fixup_func callback = (fixup_func)param2; - - (*callback)(param3, label->m_codeptr); + label_fixup *fixup = reinterpret_cast<label_fixup *>(param1); + fixup->m_callback(param2, fixup->m_label->m_codeptr); } diff --git a/src/emu/cpu/drcbeut.h b/src/emu/cpu/drcbeut.h index 250d3328000..291772e9958 100644 --- a/src/emu/cpu/drcbeut.h +++ b/src/emu/cpu/drcbeut.h @@ -144,12 +144,11 @@ private: // ======================> drc_label_list +typedef delegate<void (void *, drccodeptr)> drc_label_fixup_delegate; + // structure holding a live list of labels -class drc_label_list +class drc_label_list : public bindable_object { - // callback function for forward-referenced labels - typedef void (*fixup_func)(void *parameter, drccodeptr labelcodeptr); - public: // construction/destruction drc_label_list(drc_cache &cache); @@ -160,7 +159,7 @@ public: void block_end(drcuml_block &block); // get/set values - drccodeptr get_codeptr(uml::code_label label, fixup_func fixup, void *param); + drccodeptr get_codeptr(uml::code_label label, drc_label_fixup_delegate fixup, void *param); void set_codeptr(uml::code_label label, drccodeptr codeptr); private: @@ -171,15 +170,25 @@ private: uml::code_label m_label; // the label specified drccodeptr m_codeptr; // pointer to the relevant code }; + + struct label_fixup + { + label_fixup *next() const { return m_next; } + label_fixup * m_next; // pointer to the next oob + label_entry * m_label; // the label in question + drc_label_fixup_delegate m_callback; // callback + }; // internal helpers void reset(bool fatal_on_leftovers); label_entry *find_or_allocate(uml::code_label label); - static void oob_callback(drccodeptr *codeptr, void *param1, void *param2, void *param3); + void oob_callback(drccodeptr *codeptr, void *param1, void *param2); // internal state drc_cache & m_cache; // pointer to the cache simple_list<label_entry> m_list; // head of the live list + simple_list<label_fixup> m_fixup_list; // list of pending oob fixups + drc_oob_delegate m_oob_callback_delegate; // pre-computed delegate }; diff --git a/src/emu/cpu/drcbex64.c b/src/emu/cpu/drcbex64.c index cd72fbb6943..9419337f2b5 100644 --- a/src/emu/cpu/drcbex64.c +++ b/src/emu/cpu/drcbex64.c @@ -621,6 +621,8 @@ drcbe_x64::drcbe_x64(drcuml_state &drcuml, device_t &device, drc_cache &cache, U m_entry(NULL), m_exit(NULL), m_nocode(NULL), + m_fixup_label(FUNC(drcbe_x64::fixup_label), this), + m_fixup_exception(FUNC(drcbe_x64::fixup_exception), this), m_near(*(near_state *)cache.alloc_near(sizeof(m_near))) { // build up necessary arrays @@ -2931,7 +2933,7 @@ void drcbe_x64::op_jmp(x86code *&dst, const instruction &inst) assert(labelp.is_code_label()); // look up the jump target and jump there - x86code *jmptarget = (x86code *)m_labels.get_codeptr(labelp.label(), fixup_label, dst); + x86code *jmptarget = (x86code *)m_labels.get_codeptr(labelp.label(), m_fixup_label, dst); if (jmptarget == NULL) jmptarget = dst + 0x7ffffff0; if (inst.condition() == uml::COND_ALWAYS) @@ -2975,7 +2977,7 @@ void drcbe_x64::op_exh(x86code *&dst, const instruction &inst) else { emit_jcc(dst, X86_CONDITION(inst.condition()), dst + 0x7ffffff0); // jcc exception - m_cache.request_oob_codegen(oob_func_stub<drcbe_x64, &drcbe_x64::fixup_exception>, dst, &const_cast<instruction &>(inst), this); + m_cache.request_oob_codegen(m_fixup_exception, dst, &const_cast<instruction &>(inst)); } } diff --git a/src/emu/cpu/drcbex64.h b/src/emu/cpu/drcbex64.h index 277046d1df2..13de4221f02 100644 --- a/src/emu/cpu/drcbex64.h +++ b/src/emu/cpu/drcbex64.h @@ -149,7 +149,7 @@ private: void emit_smart_call_r64(x86code *&dst, x86code *target, UINT8 reg); void emit_smart_call_m64(x86code *&dst, x86code **target); - static void fixup_label(void *parameter, drccodeptr labelcodeptr); + void fixup_label(void *parameter, drccodeptr labelcodeptr); void fixup_exception(drccodeptr *codeptr, void *param1, void *param2); static void debug_log_hashjmp(offs_t pc, int mode); @@ -333,6 +333,9 @@ private: x86code * m_exit; // exit point x86code * m_nocode; // nocode handler + drc_label_fixup_delegate m_fixup_label; // precomputed delegate for fixups + drc_oob_delegate m_fixup_exception; // precomputed delegate for exception fixups + // state to live in the near cache struct near_state { diff --git a/src/emu/cpu/drcbex86.c b/src/emu/cpu/drcbex86.c index ad62f3c3338..7d0687c7a86 100644 --- a/src/emu/cpu/drcbex86.c +++ b/src/emu/cpu/drcbex86.c @@ -556,7 +556,9 @@ drcbe_x86::drcbe_x86(drcuml_state &drcuml, device_t &device, drc_cache &cache, U m_stacksave(0), m_hashstacksave(0), m_reslo(0), - m_reshi(0) + m_reshi(0), + m_fixup_label(FUNC(drcbe_x86::fixup_label), this), + m_fixup_exception(FUNC(drcbe_x86::fixup_exception), this) { // compute hi pointers for each register for (int regnum = 0; regnum < ARRAY_LENGTH(int_register_map); regnum++) @@ -3156,7 +3158,7 @@ void drcbe_x86::op_jmp(x86code *&dst, const instruction &inst) assert(labelp.is_code_label()); // look up the jump target and jump there - x86code *jmptarget = (x86code *)m_labels.get_codeptr(labelp.label(), fixup_label, dst); + x86code *jmptarget = (x86code *)m_labels.get_codeptr(labelp.label(), m_fixup_label, dst); if (inst.condition() == uml::COND_ALWAYS) emit_jmp(dst, jmptarget); // jmp target else @@ -3197,7 +3199,7 @@ void drcbe_x86::op_exh(x86code *&dst, const instruction &inst) else { emit_jcc(dst, X86_CONDITION(inst.condition()), 0); // jcc exception - m_cache.request_oob_codegen(oob_func_stub<drcbe_x86, &drcbe_x86::fixup_exception>, dst, &const_cast<instruction &>(inst), this); + m_cache.request_oob_codegen(m_fixup_exception, dst, &const_cast<instruction &>(inst)); } } diff --git a/src/emu/cpu/drcbex86.h b/src/emu/cpu/drcbex86.h index bbe47b4b775..a7ceb4d9bd1 100644 --- a/src/emu/cpu/drcbex86.h +++ b/src/emu/cpu/drcbex86.h @@ -151,7 +151,7 @@ private: bool can_skip_upper_load(x86code *&dst, UINT32 *memref, UINT8 reghi); void track_resolve_link(x86code *&destptr, const emit_link &linkinfo); - static void fixup_label(void *parameter, drccodeptr labelcodeptr); + void fixup_label(void *parameter, drccodeptr labelcodeptr); void fixup_exception(drccodeptr *codeptr, void *param1, void *param2); static void debug_log_hashjmp(int mode, offs_t pc); @@ -355,6 +355,9 @@ private: void * m_hashstacksave; // saved stack pointer for hashjmp UINT64 m_reslo; // extended low result UINT64 m_reshi; // extended high result + + drc_label_fixup_delegate m_fixup_label; // precomputed delegate for fixups + drc_oob_delegate m_fixup_exception; // precomputed delegate for exception fixups // globals typedef void (drcbe_x86::*opcode_generate_func)(x86code *&dst, const uml::instruction &inst); diff --git a/src/emu/cpu/drccache.c b/src/emu/cpu/drccache.c index b5564458ae5..b9922c3dc7b 100644 --- a/src/emu/cpu/drccache.c +++ b/src/emu/cpu/drccache.c @@ -243,7 +243,7 @@ drccodeptr drc_cache::end_codegen() while ((oob = m_ooblist.detach_head()) != NULL) { // call the callback - (*oob->m_callback)(&m_top, oob->m_param1, oob->m_param2, oob->m_param3); + oob->m_callback(&m_top, oob->m_param1, oob->m_param2); assert(m_top - m_codegen < CODEGEN_MAX_BYTES); // release our memory @@ -263,7 +263,7 @@ drccodeptr drc_cache::end_codegen() // out-of-band codegen //------------------------------------------------- -void drc_cache::request_oob_codegen(oob_func callback, void *param1, void *param2, void *param3) +void drc_cache::request_oob_codegen(drc_oob_delegate callback, void *param1, void *param2) { assert(m_codegen != NULL); @@ -275,7 +275,6 @@ void drc_cache::request_oob_codegen(oob_func callback, void *param1, void *param oob->m_callback = callback; oob->m_param1 = param1; oob->m_param2 = param2; - oob->m_param3 = param3; // add to the tail m_ooblist.append(*oob); diff --git a/src/emu/cpu/drccache.h b/src/emu/cpu/drccache.h index b633eec3e4d..ae90ca0aea1 100644 --- a/src/emu/cpu/drccache.h +++ b/src/emu/cpu/drccache.h @@ -63,21 +63,13 @@ typedef UINT8 *drccodeptr; // helper template for oob codegen -template<class T, void (T::*func)(drccodeptr *codeptr, void *param1, void *param2)> -void oob_func_stub(drccodeptr *codeptr, void *param1, void *param2, void *param3) -{ - T *target = reinterpret_cast<T *>(param3); - (target->*func)(codeptr, param1, param2); -} +typedef delegate<void (drccodeptr *, void *, void *)> drc_oob_delegate; // drc_cache class drc_cache { public: - // out of band codegen callback - typedef void (*oob_func)(drccodeptr *codeptr, void *param1, void *param2, void *param3); - // construction/destruction drc_cache(size_t bytes); ~drc_cache(); @@ -90,6 +82,7 @@ public: // pointer checking bool contains_pointer(const void *ptr) const { return ((const drccodeptr)ptr >= m_near && (const drccodeptr)ptr < m_near + m_size); } bool contains_near_pointer(const void *ptr) const { return ((const drccodeptr)ptr >= m_near && (const drccodeptr)ptr < m_neartop); } + bool generating_code() const { return (m_codegen != NULL); } // memory management void flush(); @@ -101,7 +94,7 @@ public: // codegen helpers drccodeptr *begin_codegen(UINT32 reserve_bytes); drccodeptr end_codegen(); - void request_oob_codegen(oob_func callback, void *param1 = NULL, void *param2 = NULL, void *param3 = NULL); + void request_oob_codegen(drc_oob_delegate callback, void *param1 = NULL, void *param2 = NULL); private: // largest block of code that can be generated at once @@ -131,10 +124,9 @@ private: oob_handler *next() const { return m_next; } oob_handler * m_next; // next handler - oob_func m_callback; // callback function + drc_oob_delegate m_callback; // callback function void * m_param1; // 1st pointer parameter void * m_param2; // 2nd pointer parameter - void * m_param3; // 3rd pointer parameter }; simple_list<oob_handler> m_ooblist; // list of oob handlers diff --git a/src/emu/cpu/drcuml.h b/src/emu/cpu/drcuml.h index a67b6170046..3058c06d1df 100644 --- a/src/emu/cpu/drcuml.h +++ b/src/emu/cpu/drcuml.h @@ -166,7 +166,7 @@ private: // interface structure for a back-end -class drcbe_interface +class drcbe_interface : public bindable_object { public: // construction/destruction diff --git a/src/emu/crsshair.c b/src/emu/crsshair.c index fbf9700ab83..38a37a6cf36 100644 --- a/src/emu/crsshair.c +++ b/src/emu/crsshair.c @@ -135,7 +135,7 @@ static void crosshair_exit(running_machine &machine); static void crosshair_load(running_machine &machine, int config_type, xml_data_node *parentnode); static void crosshair_save(running_machine &machine, int config_type, xml_data_node *parentnode); -static void animate(screen_device &device, void *param, bool vblank_state); +static void animate(running_machine &machine, screen_device &device, bool vblank_state); /*************************************************************************** @@ -211,7 +211,7 @@ static void create_bitmap(running_machine &machine, int player) void crosshair_init(running_machine &machine) { /* request a callback upon exiting */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, crosshair_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(crosshair_exit), &machine)); /* clear all the globals */ memset(&global, 0, sizeof(global)); @@ -242,11 +242,11 @@ void crosshair_init(running_machine &machine) /* register callbacks for when we load/save configurations */ if (global.usage) - config_register(machine, "crosshairs", crosshair_load, crosshair_save); + config_register(machine, "crosshairs", config_saveload_delegate(FUNC(crosshair_load), &machine), config_saveload_delegate(FUNC(crosshair_save), &machine)); /* register the animation callback */ if (machine.primary_screen != NULL) - machine.primary_screen->register_vblank_callback(animate, NULL); + machine.primary_screen->register_vblank_callback(vblank_state_delegate(FUNC(animate), &machine)); } @@ -325,7 +325,7 @@ void crosshair_set_user_settings(running_machine &machine, UINT8 player, crossha animate - animates the crosshair once a frame -------------------------------------------------*/ -static void animate(screen_device &device, void *param, bool vblank_state) +static void animate(running_machine &machine, screen_device &device, bool vblank_state) { int player; diff --git a/src/emu/debug/debugcmd.c b/src/emu/debug/debugcmd.c index b09efc125ae..313294b16f0 100644 --- a/src/emu/debug/debugcmd.c +++ b/src/emu/debug/debugcmd.c @@ -369,7 +369,7 @@ void debug_command_init(running_machine &machine) debug_console_register_command(machine, "softreset", CMDFLAG_NONE, 0, 0, 1, execute_softreset); debug_console_register_command(machine, "hardreset", CMDFLAG_NONE, 0, 0, 1, execute_hardreset); - machine.add_notifier(MACHINE_NOTIFY_EXIT, debug_command_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debug_command_exit), &machine)); /* set up the initial debugscript if specified */ name = machine.options().debug_script(); diff --git a/src/emu/debug/debugcon.c b/src/emu/debug/debugcon.c index e73b463a99a..6cb821ad810 100644 --- a/src/emu/debug/debugcon.c +++ b/src/emu/debug/debugcon.c @@ -99,7 +99,7 @@ void debug_console_init(running_machine &machine) debug_console_printf(machine, "Currently targeting %s (%s)\n", machine.system().name, machine.system().description); /* request callback upon exiting */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, debug_console_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debug_console_exit), &machine)); } diff --git a/src/emu/debug/debugcpu.c b/src/emu/debug/debugcpu.c index 37fc7327387..8489d9e1666 100644 --- a/src/emu/debug/debugcpu.c +++ b/src/emu/debug/debugcpu.c @@ -113,7 +113,7 @@ struct _debugcpu_private /* internal helpers */ static void debug_cpu_exit(running_machine &machine); -static void on_vblank(screen_device &device, void *param, bool vblank_state); +static void on_vblank(running_machine &machine, screen_device &device, bool vblank_state); static void reset_transient_flags(running_machine &machine); static void process_source_file(running_machine &machine); @@ -182,9 +182,9 @@ void debug_cpu_init(running_machine &machine) /* add callback for breaking on VBLANK */ if (machine.primary_screen != NULL) - machine.primary_screen->register_vblank_callback(on_vblank, NULL); + machine.primary_screen->register_vblank_callback(vblank_state_delegate(FUNC(on_vblank), &machine)); - machine.add_notifier(MACHINE_NOTIFY_EXIT, debug_cpu_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debug_cpu_exit), &machine)); } @@ -1068,7 +1068,7 @@ static void debug_cpu_exit(running_machine &machine) on_vblank - called when a VBLANK hits -------------------------------------------------*/ -static void on_vblank(screen_device &device, void *param, bool vblank_state) +static void on_vblank(running_machine &machine, screen_device &device, bool vblank_state) { /* just set a global flag to be consumed later */ if (vblank_state) diff --git a/src/emu/debugger.c b/src/emu/debugger.c index 536740dd97b..dc960d34322 100644 --- a/src/emu/debugger.c +++ b/src/emu/debugger.c @@ -77,7 +77,7 @@ void debugger_init(running_machine &machine) debugint_init(machine); /* allocate a new entry for our global list */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, debugger_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debugger_exit), &machine)); entry = global_alloc(machine_entry); entry->next = machine_list; entry->machine = &machine; diff --git a/src/emu/debugint/debugint.c b/src/emu/debugint/debugint.c index 45351d302ca..f02ef141acb 100644 --- a/src/emu/debugint/debugint.c +++ b/src/emu/debugint/debugint.c @@ -921,7 +921,7 @@ void debugint_init(running_machine &machine) debug_font_width++; /* FIXME: above does not really work */ debug_font_width = 10; - machine.add_notifier(MACHINE_NOTIFY_EXIT, debugint_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(debugint_exit), &machine)); } #if 0 diff --git a/src/emu/devintrf.c b/src/emu/devintrf.c index ede4a6b5167..6e04b3f6d2e 100644 --- a/src/emu/devintrf.c +++ b/src/emu/devintrf.c @@ -124,8 +124,8 @@ void device_list::set_machine_all(running_machine &machine) void device_list::start_all() { // add exit and reset callbacks - machine().add_notifier(MACHINE_NOTIFY_RESET, static_reset); - machine().add_notifier(MACHINE_NOTIFY_EXIT, static_exit); + machine().add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(device_list::reset_all), this)); + machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(device_list::exit), this)); // add pre-save and post-load callbacks machine().save().register_presave(static_pre_save, this); @@ -178,7 +178,7 @@ void device_list::start_new_devices() // reset_all - reset all devices in the list //------------------------------------------------- -void device_list::reset_all() const +void device_list::reset_all() { // iterate over devices and reset them for (device_t *device = first(); device != NULL; device = device->next()) @@ -267,31 +267,20 @@ device_t *device_list::find(device_type type, int index) const //------------------------------------------------- -// static_reset - internal callback for resetting -// all devices -//------------------------------------------------- - -void device_list::static_reset(running_machine &machine) -{ - machine.devicelist().reset_all(); -} - - -//------------------------------------------------- // static_exit - tear down all the devices //------------------------------------------------- -void device_list::static_exit(running_machine &machine) +void device_list::exit() { // first let the debugger save comments - if ((machine.debug_flags & DEBUG_FLAG_ENABLED) != 0) - debug_comment_save(machine); + if ((machine().debug_flags & DEBUG_FLAG_ENABLED) != 0) + debug_comment_save(machine()); // stop all the devices before we go away - const_cast<device_list &>(machine.devicelist()).stop_all(); + stop_all(); // then nuke the devices - const_cast<device_list &>(machine.devicelist()).reset(); + reset(); } diff --git a/src/emu/devintrf.h b/src/emu/devintrf.h index 6481778606d..3260afb9ea6 100644 --- a/src/emu/devintrf.h +++ b/src/emu/devintrf.h @@ -126,7 +126,7 @@ typedef void (*write_line_device_func)(device_t *device, int state); // ======================> tagged_device_list // tagged_device_list is a tagged_list with additional searching based on type -class device_list : public tagged_list<device_t> +class device_list : public tagged_list<device_t>, public bindable_object { typedef tagged_list<device_t> super; @@ -141,7 +141,7 @@ public: void set_machine_all(running_machine &machine); void start_all(); void start_new_devices(); - void reset_all() const; + void reset_all(); void stop_all(); // pull the generic forms forward @@ -163,8 +163,7 @@ public: private: // internal helpers - static void static_reset(running_machine &machine); - static void static_exit(running_machine &machine); + void exit(); static void static_pre_save(running_machine &machine, void *param); static void static_post_load(running_machine &machine, void *param); @@ -177,7 +176,7 @@ private: // ======================> device_t // device_t represents a device -class device_t : public bindable_object +class device_t : public virtual bindable_object { DISABLE_COPYING(device_t); @@ -460,7 +459,7 @@ private: // ======================> device_interface // device_interface represents runtime information for a particular device interface -class device_interface +class device_interface : public virtual bindable_object { DISABLE_COPYING(device_interface); diff --git a/src/emu/diexec.c b/src/emu/diexec.c index 4d1dc501058..704bd42b523 100644 --- a/src/emu/diexec.c +++ b/src/emu/diexec.c @@ -607,7 +607,7 @@ void device_execute_interface::interface_post_reset() screen = device().machine().first_screen(); assert(screen != NULL); - screen->register_vblank_callback(static_on_vblank, NULL); + screen->register_vblank_callback(vblank_state_delegate(FUNC(device_execute_interface::on_vblank), this)); } // reconfigure periodic interrupts @@ -707,46 +707,27 @@ TIMER_CALLBACK( device_execute_interface::static_timed_trigger_callback ) // for this screen //------------------------------------------------- -void device_execute_interface::static_on_vblank(screen_device &screen, void *param, bool vblank_state) +void device_execute_interface::on_vblank(screen_device &screen, bool vblank_state) { - // VBLANK starting - if (vblank_state) - { - device_execute_interface *exec = NULL; - for (bool gotone = screen.machine().devicelist().first(exec); gotone; gotone = exec->next(exec)) - exec->on_vblank_start(screen); - } -} + // ignore VBLANK end + if (!vblank_state) + return; -void device_execute_interface::on_vblank_start(screen_device &screen) -{ // start the interrupt counter if (!suspended(SUSPEND_REASON_DISABLE)) m_iloops = 0; else m_iloops = -1; - // the hack style VBLANK decleration always uses the first screen - bool interested = false; - if (m_vblank_interrupts_per_frame > 1) - interested = true; - - // for new style declaration, we need to compare the tags - else if (m_vblank_interrupt_screen != NULL) - interested = (strcmp(screen.tag(), m_vblank_interrupt_screen) == 0); + // generate the interrupt callback + if (!suspended(SUSPEND_REASON_HALT | SUSPEND_REASON_RESET | SUSPEND_REASON_DISABLE)) + (*m_vblank_interrupt)(&m_device); - // if interested, call the interrupt handler - if (interested) + // if we have more than one interrupt per frame, start the timer now to trigger the rest of them + if (m_vblank_interrupts_per_frame > 1 && !suspended(SUSPEND_REASON_DISABLE)) { - if (!suspended(SUSPEND_REASON_HALT | SUSPEND_REASON_RESET | SUSPEND_REASON_DISABLE)) - (*m_vblank_interrupt)(&m_device); - - // if we have more than one interrupt per frame, start the timer now to trigger the rest of them - if (m_vblank_interrupts_per_frame > 1 && !suspended(SUSPEND_REASON_DISABLE)) - { - m_partial_frame_period = device().machine().primary_screen->frame_period() / m_vblank_interrupts_per_frame; - m_partial_frame_timer->adjust(m_partial_frame_period); - } + m_partial_frame_period = device().machine().primary_screen->frame_period() / m_vblank_interrupts_per_frame; + m_partial_frame_timer->adjust(m_partial_frame_period); } } diff --git a/src/emu/diexec.h b/src/emu/diexec.h index 57e172bfed8..d8096702bad 100644 --- a/src/emu/diexec.h +++ b/src/emu/diexec.h @@ -306,8 +306,7 @@ private: // callbacks static void static_timed_trigger_callback(running_machine &machine, void *ptr, int param); - static void static_on_vblank(screen_device &screen, void *param, bool vblank_state); - void on_vblank_start(screen_device &screen); + void on_vblank(screen_device &screen, bool vblank_state); static void static_trigger_partial_frame_interrupt(running_machine &machine, void *ptr, int param); void trigger_partial_frame_interrupt(); diff --git a/src/emu/emucore.h b/src/emu/emucore.h index 38e042900c4..20f392b1bb8 100644 --- a/src/emu/emucore.h +++ b/src/emu/emucore.h @@ -205,12 +205,6 @@ inline void operator--(_Type &value, int) { value = (_Type)((int)value - 1); } #define FUNC(x) &x, #x #define FUNC_NULL NULL, "(null)" -// this macro wraps a member function 'x' from class 'c' -#define MFUNC(c,x) &c::x, #c "::" #x - -// this macro wraps a member function 'x' from class 'c' using a templatized stub of type 's' -#define MSTUB(s,c,x) s##_stub<c, &c::x>, #c "::" #x - // standard assertion macros #undef assert diff --git a/src/emu/emupal.c b/src/emu/emupal.c index 48556059642..055f925e339 100644 --- a/src/emu/emupal.c +++ b/src/emu/emupal.c @@ -111,7 +111,7 @@ void palette_init(running_machine &machine) /* request cleanup */ machine.palette_data = palette; - machine.add_notifier(MACHINE_NOTIFY_EXIT, palette_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(palette_exit), &machine)); /* reset all our data */ palette->format = format; diff --git a/src/emu/image.c b/src/emu/image.c index 0ca80b9fa83..d4fef313e2c 100644 --- a/src/emu/image.c +++ b/src/emu/image.c @@ -278,7 +278,7 @@ void image_postdevice_init(running_machine &machine) } /* add a callback for when we shut down */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, image_unload_all); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(image_unload_all), &machine)); } /*************************************************************************** INITIALIZATION @@ -291,7 +291,7 @@ void image_postdevice_init(running_machine &machine) void image_init(running_machine &machine) { image_device_init(machine); - config_register(machine, "image_directories", image_dirs_load, image_dirs_save); + config_register(machine, "image_directories", config_saveload_delegate(FUNC(image_dirs_load), &machine), config_saveload_delegate(FUNC(image_dirs_save), &machine)); } diff --git a/src/emu/inptport.c b/src/emu/inptport.c index 2cf3a58c919..7d9e9078b31 100644 --- a/src/emu/inptport.c +++ b/src/emu/inptport.c @@ -984,8 +984,8 @@ time_t input_port_init(running_machine &machine, const input_port_token *tokens, //portdata = machine.input_port_data; /* add an exit callback and a frame callback */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, input_port_exit); - machine.add_notifier(MACHINE_NOTIFY_FRAME, frame_update_callback); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(input_port_exit), &machine)); + machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(frame_update_callback), &machine)); /* initialize the default port info from the OSD */ init_port_types(machine); @@ -1010,7 +1010,7 @@ time_t input_port_init(running_machine &machine, const input_port_token *tokens, init_port_state(machine); /* register callbacks for when we load configurations */ - config_register(machine, "input", load_config_callback, save_config_callback); + config_register(machine, "input", config_saveload_delegate(FUNC(load_config_callback), &machine), config_saveload_delegate(FUNC(save_config_callback), &machine)); /* open playback and record files if specified */ basetime = playback_init(machine); @@ -5051,7 +5051,7 @@ static void setup_keybuffer(running_machine &machine) input_port_private *portdata = machine.input_port_data; portdata->inputx_timer = machine.scheduler().timer_alloc(FUNC(inputx_timerproc)); portdata->keybuffer = auto_alloc_clear(machine, key_buffer); - machine.add_notifier(MACHINE_NOTIFY_EXIT, clear_keybuffer); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(clear_keybuffer), &machine)); } diff --git a/src/emu/input.c b/src/emu/input.c index 21caf086883..6570134b4c3 100644 --- a/src/emu/input.c +++ b/src/emu/input.c @@ -595,7 +595,7 @@ void input_init(running_machine &machine) code_pressed_memory_reset(machine); /* request a per-frame callback for bookkeeping */ - machine.add_notifier(MACHINE_NOTIFY_FRAME, input_frame); + machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(input_frame), &machine)); /* read input enable options */ device_list[DEVICE_CLASS_KEYBOARD].enabled = TRUE; diff --git a/src/emu/machine.c b/src/emu/machine.c index 646e4d9fff4..03bc33a90f4 100644 --- a/src/emu/machine.c +++ b/src/emu/machine.c @@ -264,7 +264,7 @@ void running_machine::start() generic_sound_init(*this); // allocate a soft_reset timer - m_soft_reset_timer = m_scheduler.timer_alloc(MSTUB(timer_expired, running_machine, soft_reset), this); + m_soft_reset_timer = m_scheduler.timer_alloc(timer_expired_delegate(FUNC(running_machine::soft_reset), this)); // init the osd layer m_osd.init(*this); @@ -403,7 +403,7 @@ int running_machine::run(bool firstrun) ui_display_startup_screens(*this, firstrun, !settingsloaded); // perform a soft reset -- this takes us to the running phase - soft_reset(*this); + soft_reset(); // run the CPUs until a reset or exit m_hard_reset_pending = false; @@ -656,7 +656,7 @@ void running_machine::region_free(const char *name) // given type //------------------------------------------------- -void running_machine::add_notifier(machine_notification event, notify_callback callback) +void running_machine::add_notifier(machine_notification event, machine_notify_delegate callback) { assert_always(m_current_phase == MACHINE_PHASE_INIT, "Can only call add_notifier at init time!"); @@ -767,7 +767,7 @@ UINT32 running_machine::rand() void running_machine::call_notifiers(machine_notification which) { for (notifier_callback_item *cb = m_notifier_list[which].first(); cb != NULL; cb = cb->next()) - (*cb->m_func)(*this); + cb->m_func(); } @@ -859,7 +859,7 @@ cancel: // of the system //------------------------------------------------- -void running_machine::soft_reset(running_machine &machine, int param) +void running_machine::soft_reset(void *ptr, INT32 param) { logerror("Soft reset\n"); @@ -927,7 +927,7 @@ memory_region::~memory_region() // notifier_callback_item - constructor //------------------------------------------------- -running_machine::notifier_callback_item::notifier_callback_item(notify_callback func) +running_machine::notifier_callback_item::notifier_callback_item(machine_notify_delegate func) : m_next(NULL), m_func(func) { diff --git a/src/emu/machine.h b/src/emu/machine.h index c52ff0d661e..7e99283db2b 100644 --- a/src/emu/machine.h +++ b/src/emu/machine.h @@ -306,6 +306,8 @@ public: // ======================> running_machine +typedef delegate<void ()> machine_notify_delegate; + // description of the currently-running machine class running_machine : public bindable_object { @@ -314,7 +316,6 @@ class running_machine : public bindable_object friend void debugger_init(running_machine &machine); friend class sound_manager; - typedef void (*notify_callback)(running_machine &machine); typedef void (*logerror_callback)(running_machine &machine, const char *string); // must be at top of member variables @@ -371,7 +372,7 @@ public: int run(bool firstrun); void pause(); void resume(); - void add_notifier(machine_notification event, notify_callback callback); + void add_notifier(machine_notification event, machine_notify_delegate callback); void call_notifiers(machine_notification which); void add_logerror_callback(logerror_callback callback); void set_ui_active(bool active) { m_ui_active = active; } @@ -440,7 +441,7 @@ private: void set_saveload_filename(const char *filename); void fill_systime(system_time &systime, time_t t); void handle_saveload(); - void soft_reset(running_machine &machine, int param = 0); + void soft_reset(void *ptr = NULL, INT32 param = 0); // internal callbacks static void logfile_callback(running_machine &machine, const char *buffer); @@ -499,14 +500,14 @@ private: struct notifier_callback_item { // construction/destruction - notifier_callback_item(notify_callback func); + notifier_callback_item(machine_notify_delegate func); // getters notifier_callback_item *next() const { return m_next; } // state notifier_callback_item * m_next; - notify_callback m_func; + machine_notify_delegate m_func; }; simple_list<notifier_callback_item> m_notifier_list[MACHINE_NOTIFY_COUNT]; diff --git a/src/emu/machine/generic.c b/src/emu/machine/generic.c index 2dddd85a17a..93613f2b46b 100644 --- a/src/emu/machine/generic.c +++ b/src/emu/machine/generic.c @@ -108,17 +108,17 @@ void generic_machine_init(running_machine &machine) state->memcard_inserted = -1; /* register a reset callback and save state for interrupt enable */ - machine.add_notifier(MACHINE_NOTIFY_RESET, interrupt_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(interrupt_reset), &machine)); machine.save().save_item(NAME(state->interrupt_enable)); /* register for configuration */ - config_register(machine, "counters", counters_load, counters_save); + config_register(machine, "counters", config_saveload_delegate(FUNC(counters_load), &machine), config_saveload_delegate(FUNC(counters_save), &machine)); /* for memory cards, request save state and an exit callback */ if (machine.config().m_memcard_handler != NULL) { state_save_register_global(machine, state->memcard_inserted); - machine.add_notifier(MACHINE_NOTIFY_EXIT, memcard_eject); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(memcard_eject), &machine)); } } diff --git a/src/emu/machine/ldcore.c b/src/emu/machine/ldcore.c index 759d7a94a11..2239192f55c 100644 --- a/src/emu/machine/ldcore.c +++ b/src/emu/machine/ldcore.c @@ -287,9 +287,8 @@ static void update_slider_pos(ldcore_data *ldcore, attotime curtime) change of the VBLANK signal -------------------------------------------------*/ -static void vblank_state_changed(screen_device &screen, void *param, bool vblank_state) +static void vblank_state_changed(device_t *device, screen_device &screen, bool vblank_state) { - device_t *device = (device_t *)param; laserdisc_state *ld = get_safe_token(device); ldcore_data *ldcore = ld->core; attotime curtime = screen.machine().time(); @@ -1393,7 +1392,7 @@ static void init_video(device_t *device) int index; /* register for VBLANK callbacks */ - ld->screen->register_vblank_callback(vblank_state_changed, (void *)device); + ld->screen->register_vblank_callback(vblank_state_delegate(FUNC(vblank_state_changed), device)); /* allocate video frames */ for (index = 0; index < ARRAY_LENGTH(ldcore->frame); index++) @@ -1517,7 +1516,7 @@ static DEVICE_START( laserdisc ) init_audio(device); /* register callbacks */ - config_register(device->machine(), "laserdisc", configuration_load, configuration_save); + config_register(device->machine(), "laserdisc", config_saveload_delegate(FUNC(configuration_load), &device->machine()), config_saveload_delegate(FUNC(configuration_save), &device->machine())); } diff --git a/src/emu/output.c b/src/emu/output.c index 31a0f444f95..14ea5227617 100644 --- a/src/emu/output.c +++ b/src/emu/output.c @@ -147,11 +147,11 @@ INLINE output_item *create_new_item(const char *outname, INT32 value) void output_init(running_machine &machine) { /* add pause callback */ - machine.add_notifier(MACHINE_NOTIFY_PAUSE, output_pause); - machine.add_notifier(MACHINE_NOTIFY_RESUME, output_resume); + machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(output_pause), &machine)); + machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(output_resume), &machine)); /* get a callback when done */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, output_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(output_exit), &machine)); /* reset the lists */ memset(itemtable, 0, sizeof(itemtable)); diff --git a/src/emu/render.c b/src/emu/render.c index d6e8c2d875f..10c96700ad5 100644 --- a/src/emu/render.c +++ b/src/emu/render.c @@ -2465,7 +2465,7 @@ render_manager::render_manager(running_machine &machine) m_screen_container_list(machine.respool()) { // register callbacks - config_register(machine, "video", config_load_static, config_save_static); + config_register(machine, "video", config_saveload_delegate(FUNC(render_manager::config_load), this), config_saveload_delegate(FUNC(render_manager::config_save), this)); // create one container per screen for (screen_device *screen = machine.first_screen(); screen != NULL; screen = screen->next_screen()) @@ -2684,11 +2684,6 @@ void render_manager::container_free(render_container *container) // configuration file //------------------------------------------------- -void render_manager::config_load_static(running_machine &machine, int config_type, xml_data_node *parentnode) -{ - machine.render().config_load(config_type, parentnode); -} - void render_manager::config_load(int config_type, xml_data_node *parentnode) { // we only care about game files @@ -2748,11 +2743,6 @@ void render_manager::config_load(int config_type, xml_data_node *parentnode) // file //------------------------------------------------- -void render_manager::config_save_static(running_machine &machine, int config_type, xml_data_node *parentnode) -{ - machine.render().config_save(config_type, parentnode); -} - void render_manager::config_save(int config_type, xml_data_node *parentnode) { // we only care about game files diff --git a/src/emu/render.h b/src/emu/render.h index d14e28f03b0..783c939d690 100644 --- a/src/emu/render.h +++ b/src/emu/render.h @@ -714,7 +714,7 @@ private: // ======================> render_manager // contains machine-global information and operations -class render_manager +class render_manager : public bindable_object { friend class render_target; @@ -761,8 +761,6 @@ private: void container_free(render_container *container); // config callbacks - static void config_load_static(running_machine &machine, int config_type, xml_data_node *parentnode); - static void config_save_static(running_machine &machine, int config_type, xml_data_node *parentnode); void config_load(int config_type, xml_data_node *parentnode); void config_save(int config_type, xml_data_node *parentnode); diff --git a/src/emu/romload.c b/src/emu/romload.c index 8c1875c2920..29e9d940c24 100644 --- a/src/emu/romload.c +++ b/src/emu/romload.c @@ -1513,7 +1513,7 @@ void rom_init(running_machine &machine) machine.romload_data = romdata = auto_alloc_clear(machine, romload_private); /* make sure we get called back on the way out */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, rom_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(rom_exit), &machine)); /* reset the romdata struct */ romdata->m_machine = &machine; diff --git a/src/emu/schedule.c b/src/emu/schedule.c index c3eccffe635..8c17ed7cd31 100644 --- a/src/emu/schedule.c +++ b/src/emu/schedule.c @@ -78,10 +78,8 @@ emu_timer::emu_timer() : m_machine(NULL), m_next(NULL), m_prev(NULL), - m_callback(NULL), m_param(0), m_ptr(NULL), - m_func(NULL), m_enabled(false), m_temporary(false), m_period(attotime::zero), @@ -107,7 +105,7 @@ emu_timer::~emu_timer() // re-allocated as a non-device timer //------------------------------------------------- -emu_timer &emu_timer::init(running_machine &machine, timer_expired_func callback, const char *name, void *ptr, bool temporary) +emu_timer &emu_timer::init(running_machine &machine, timer_expired_delegate callback, void *ptr, bool temporary) { // ensure the entire timer state is clean m_machine = &machine; @@ -116,7 +114,6 @@ emu_timer &emu_timer::init(running_machine &machine, timer_expired_func callback m_callback = callback; m_param = 0; m_ptr = ptr; - m_func = (name != NULL) ? name : "?"; m_enabled = false; m_temporary = temporary; m_period = attotime::never; @@ -146,10 +143,9 @@ emu_timer &emu_timer::init(device_t &device, device_timer_id id, void *ptr, bool m_machine = &device.machine(); m_next = NULL; m_prev = NULL; - m_callback = NULL; + m_callback = timer_expired_delegate(); m_param = 0; m_ptr = ptr; - m_func = NULL; m_enabled = false; m_temporary = temporary; m_period = attotime::never; @@ -274,9 +270,9 @@ void emu_timer::register_save() // for non-device timers, it is an index based on the callback function name if (m_device == NULL) { - name = m_func; + name = m_callback.name(); for (emu_timer *curtimer = machine().scheduler().first_timer(); curtimer != NULL; curtimer = curtimer->next()) - if (!curtimer->m_temporary && curtimer->m_device == NULL && strcmp(curtimer->m_func, m_func) == 0) + if (!curtimer->m_temporary && curtimer->m_device == NULL && strcmp(curtimer->m_callback.name(), m_callback.name()) == 0) index++; } @@ -340,7 +336,7 @@ device_scheduler::device_scheduler(running_machine &machine) : m_quantum_minimum(ATTOSECONDS_IN_NSEC(1) / 1000) { // append a single never-expiring timer so there is always one in the list - m_timer_list = &m_timer_allocator.alloc()->init(machine, NULL, NULL, NULL, true); + m_timer_list = &m_timer_allocator.alloc()->init(machine, timer_expired_delegate(), NULL, true); m_timer_list->adjust(attotime::never); // register global states @@ -532,7 +528,7 @@ void device_scheduler::trigger(int trigid, attotime after) // if we have a non-zero time, schedule a timer if (after != attotime::zero) - timer_set(after, MSTUB(timer_expired, device_scheduler, timed_trigger), trigid, this); + timer_set(after, timer_expired_delegate(FUNC(device_scheduler::timed_trigger), this), trigid); // send the trigger to everyone who cares else @@ -560,9 +556,9 @@ void device_scheduler::boost_interleave(attotime timeslice_time, attotime boost_ // timer and return a pointer //------------------------------------------------- -emu_timer *device_scheduler::timer_alloc(timer_expired_func callback, const char *name, void *ptr) +emu_timer *device_scheduler::timer_alloc(timer_expired_delegate callback, void *ptr) { - return &m_timer_allocator.alloc()->init(machine(), callback, name, ptr, false); + return &m_timer_allocator.alloc()->init(machine(), callback, ptr, false); } @@ -572,9 +568,9 @@ emu_timer *device_scheduler::timer_alloc(timer_expired_func callback, const char // amount of time //------------------------------------------------- -void device_scheduler::timer_set(attotime duration, timer_expired_func callback, const char *name, int param, void *ptr) +void device_scheduler::timer_set(attotime duration, timer_expired_delegate callback, int param, void *ptr) { - m_timer_allocator.alloc()->init(machine(), callback, name, ptr, true).adjust(duration, param); + m_timer_allocator.alloc()->init(machine(), callback, ptr, true).adjust(duration, param); } @@ -584,9 +580,9 @@ void device_scheduler::timer_set(attotime duration, timer_expired_func callback, // frequency //------------------------------------------------- -void device_scheduler::timer_pulse(attotime period, timer_expired_func callback, const char *name, int param, void *ptr) +void device_scheduler::timer_pulse(attotime period, timer_expired_delegate callback, int param, void *ptr) { - m_timer_allocator.alloc()->init(machine(), callback, name, ptr, false).adjust(period, param, period); + m_timer_allocator.alloc()->init(machine(), callback, ptr, false).adjust(period, param, period); } @@ -630,7 +626,7 @@ void device_scheduler::eat_all_cycles() // given amount of time //------------------------------------------------- -void device_scheduler::timed_trigger(running_machine &machine, INT32 param) +void device_scheduler::timed_trigger(void *ptr, INT32 param) { trigger(param); } @@ -874,8 +870,8 @@ void device_scheduler::execute_timers() if (timer.m_device != NULL) timer.m_device->timer_expired(timer, timer.m_id, timer.m_param, timer.m_ptr); - else if (timer.m_callback != NULL) - (*timer.m_callback)(machine(), timer.m_ptr, timer.m_param); + else if (!timer.m_callback.isnull()) + timer.m_callback(timer.m_ptr, timer.m_param); g_profiler.stop(); } diff --git a/src/emu/schedule.h b/src/emu/schedule.h index 56af090538e..eac0b494829 100644 --- a/src/emu/schedule.h +++ b/src/emu/schedule.h @@ -71,6 +71,9 @@ //************************************************************************** // timer callbacks look like this +typedef delegate<void (void *, INT32)> timer_expired_delegate; + +// old-skool callbacks are like this typedef void (*timer_expired_func)(running_machine &machine, void *ptr, INT32 param); // stub for when the ptr parameter points to a class @@ -96,7 +99,7 @@ class emu_timer ~emu_timer(); // allocation and re-use - emu_timer &init(running_machine &machine, timer_expired_func callback, const char *name, void *ptr, bool temporary); + emu_timer &init(running_machine &machine, timer_expired_delegate callback, void *ptr, bool temporary); emu_timer &init(device_t &device, device_timer_id id, void *ptr, bool temporary); emu_timer &release(); @@ -132,10 +135,9 @@ private: running_machine * m_machine; // reference to the owning machine emu_timer * m_next; // next timer in order in the list emu_timer * m_prev; // previous timer in order in the list - timer_expired_func m_callback; // callback function + timer_expired_delegate m_callback; // callback function INT32 m_param; // integer parameter void * m_ptr; // pointer parameter - const char * m_func; // string name of the callback function bool m_enabled; // is the timer enabled? bool m_temporary; // is the timer temporary? attotime m_period; // the repeat frequency of the timer @@ -148,7 +150,7 @@ private: // ======================> device_scheduler -class device_scheduler +class device_scheduler : public bindable_object { friend class device_execute_interface; friend class emu_timer; @@ -172,10 +174,16 @@ public: void boost_interleave(attotime timeslice_time, attotime boost_duration); // timers, specified by callback/name - emu_timer *timer_alloc(timer_expired_func callback, const char *name, void *ptr = NULL); - void timer_set(attotime duration, timer_expired_func callback, const char *name, int param = 0, void *ptr = NULL); - void timer_pulse(attotime period, timer_expired_func callback, const char *name, int param = 0, void *ptr = NULL); - void synchronize(timer_expired_func callback = NULL, const char *name = NULL, int param = 0, void *ptr = NULL) { timer_set(attotime::zero, callback, name, param, ptr); } + emu_timer *timer_alloc(timer_expired_delegate callback, void *ptr = NULL); + void timer_set(attotime duration, timer_expired_delegate callback, int param = 0, void *ptr = NULL); + void timer_pulse(attotime period, timer_expired_delegate callback, int param = 0, void *ptr = NULL); + void synchronize(timer_expired_delegate callback = timer_expired_delegate(), int param = 0, void *ptr = NULL) { timer_set(attotime::zero, callback, param, ptr); } + + // timers with old-skool callbacks + emu_timer *timer_alloc(timer_expired_func callback, const char *name, void *ptr = NULL) { return timer_alloc(timer_expired_delegate(callback, name, &machine()), ptr); } + void timer_set(attotime duration, timer_expired_func callback, const char *name, int param = 0, void *ptr = NULL) { timer_set(duration, timer_expired_delegate(callback, name, &machine()), param, ptr); } + void timer_pulse(attotime period, timer_expired_func callback, const char *name, int param = 0, void *ptr = NULL) { timer_pulse(period, timer_expired_delegate(callback, name, &machine()), param, ptr); } + void synchronize(timer_expired_func callback, const char *name = NULL, int param = 0, void *ptr = NULL) { timer_set(attotime::zero, callback, name, param, ptr); } // timers, specified by device/id; generally devices should use the device_t methods instead emu_timer *timer_alloc(device_t &device, device_timer_id id = 0, void *ptr = NULL); @@ -186,7 +194,7 @@ public: private: // callbacks - void timed_trigger(running_machine &machine, INT32 param); + void timed_trigger(void *ptr, INT32 param); void postload(); // scheduling helpers diff --git a/src/emu/screen.c b/src/emu/screen.c index 896e47c62f4..e3cdb6595a5 100644 --- a/src/emu/screen.c +++ b/src/emu/screen.c @@ -106,8 +106,7 @@ screen_device::screen_device(const machine_config &mconfig, const char *tag, dev m_scanline0_timer(NULL), m_scanline_timer(NULL), m_frame_number(0), - m_partial_updates_this_frame(0), - m_callback_list(NULL) + m_partial_updates_this_frame(0) { m_visarea.min_x = m_visarea.min_y = 0; m_visarea.max_x = m_width - 1; @@ -756,25 +755,20 @@ attotime screen_device::time_until_vblank_end() const // callback //------------------------------------------------- -void screen_device::register_vblank_callback(vblank_state_changed_func vblank_callback, void *param) +void screen_device::register_vblank_callback(vblank_state_delegate vblank_callback) { // validate arguments - assert(vblank_callback != NULL); + assert(!vblank_callback.isnull()); // check if we already have this callback registered - callback_item **itemptr; - for (itemptr = &m_callback_list; *itemptr != NULL; itemptr = &(*itemptr)->m_next) - if ((*itemptr)->m_callback == vblank_callback) + callback_item *item; + for (item = m_callback_list.first(); item != NULL; item = item->next()) + if (item->m_callback == vblank_callback) break; // if not found, register - if (*itemptr == NULL) - { - *itemptr = auto_alloc(machine(), callback_item); - (*itemptr)->m_next = NULL; - (*itemptr)->m_callback = vblank_callback; - (*itemptr)->m_param = param; - } + if (item == NULL) + m_callback_list.append(*global_alloc(callback_item(vblank_callback))); } @@ -790,8 +784,8 @@ void screen_device::vblank_begin_callback() m_vblank_end_time = m_vblank_start_time + attotime(0, m_vblank_period); // call the screen specific callbacks - for (callback_item *item = m_callback_list; item != NULL; item = item->m_next) - (*item->m_callback)(*this, item->m_param, true); + for (callback_item *item = m_callback_list.first(); item != NULL; item = item->next()) + item->m_callback(*this, true); // if this is the primary screen and we need to update now if (this == machine().primary_screen && !(machine().config().m_video_attributes & VIDEO_UPDATE_AFTER_VBLANK)) @@ -816,8 +810,8 @@ void screen_device::vblank_begin_callback() void screen_device::vblank_end_callback() { // call the screen specific callbacks - for (callback_item *item = m_callback_list; item != NULL; item = item->m_next) - (*item->m_callback)(*this, item->m_param, false); + for (callback_item *item = m_callback_list.first(); item != NULL; item = item->next()) + item->m_callback(*this, false); // if this is the primary screen and we need to update now if (this == machine().primary_screen && (machine().config().m_video_attributes & VIDEO_UPDATE_AFTER_VBLANK)) @@ -1100,4 +1094,3 @@ void screen_device::screen_eof() machine().driver_data<driver_device>()->screen_eof(); } } - diff --git a/src/emu/screen.h b/src/emu/screen.h index c5cc935accd..be5cd66967a 100644 --- a/src/emu/screen.h +++ b/src/emu/screen.h @@ -72,7 +72,8 @@ class screen_device; // callback that is called to notify of a change in the VBLANK state -typedef void (*vblank_state_changed_func)(screen_device &device, void *param, bool vblank_state); +typedef delegate<void (screen_device &, bool)> vblank_state_delegate; + typedef UINT32 (*screen_update_func)(screen_device *screen, bitmap_t *bitmap, const rectangle *cliprect); typedef void (*screen_eof_func)(screen_device *screen, running_machine &machine); @@ -147,7 +148,7 @@ public: void update_now(); // additional helpers - void register_vblank_callback(vblank_state_changed_func vblank_callback, void *param); + void register_vblank_callback(vblank_state_delegate vblank_callback); bitmap_t *alloc_compatible_bitmap(int width = 0, int height = 0) { return auto_bitmap_alloc(machine(), (width == 0) ? m_width : width, (height == 0) ? m_height : height, format()); } // internal to the video system @@ -230,13 +231,18 @@ private: UINT64 m_frame_number; // the current frame number UINT32 m_partial_updates_this_frame;// partial update counter this frame - struct callback_item + class callback_item { + public: + callback_item(vblank_state_delegate callback) + : m_next(NULL), + m_callback(callback) { } + callback_item *next() const { return m_next; } + callback_item * m_next; - vblank_state_changed_func m_callback; - void * m_param; + vblank_state_delegate m_callback; }; - callback_item * m_callback_list; // list of VBLANK callbacks + simple_list<callback_item> m_callback_list; // list of VBLANK callbacks }; // device type definition diff --git a/src/emu/sound.c b/src/emu/sound.c index 5b4f49295e2..21eda720ac8 100644 --- a/src/emu/sound.c +++ b/src/emu/sound.c @@ -800,10 +800,10 @@ sound_manager::sound_manager(running_machine &machine) m_wavfile = wav_open(wavfile, machine.sample_rate(), 2); // register callbacks - config_register(machine, "mixer", &sound_manager::config_load, &sound_manager::config_save); - machine.add_notifier(MACHINE_NOTIFY_PAUSE, &sound_manager::pause); - machine.add_notifier(MACHINE_NOTIFY_RESUME, &sound_manager::resume); - machine.add_notifier(MACHINE_NOTIFY_RESET, &sound_manager::reset); + config_register(machine, "mixer", config_saveload_delegate(FUNC(sound_manager::config_load), this), config_saveload_delegate(FUNC(sound_manager::config_save), this)); + machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(sound_manager::pause), this)); + machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(sound_manager::resume), this)); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(sound_manager::reset), this)); // register global states state_save_register_global(machine, m_last_update); @@ -896,11 +896,11 @@ void sound_manager::mute(bool mute, UINT8 reason) // reset - reset all sound chips //------------------------------------------------- -void sound_manager::reset(running_machine &machine) +void sound_manager::reset() { // reset all the sound chips device_sound_interface *sound = NULL; - for (bool gotone = machine.devicelist().first(sound); gotone; gotone = sound->next(sound)) + for (bool gotone = machine().devicelist().first(sound); gotone; gotone = sound->next(sound)) sound->device().reset(); } @@ -909,9 +909,9 @@ void sound_manager::reset(running_machine &machine) // pause - pause sound output //------------------------------------------------- -void sound_manager::pause(running_machine &machine) +void sound_manager::pause() { - machine.sound().mute(true, MUTE_REASON_PAUSE); + mute(true, MUTE_REASON_PAUSE); } @@ -919,9 +919,9 @@ void sound_manager::pause(running_machine &machine) // resume - resume sound output //------------------------------------------------- -void sound_manager::resume(running_machine &machine) +void sound_manager::resume() { - machine.sound().mute(false, MUTE_REASON_PAUSE); + mute(false, MUTE_REASON_PAUSE); } @@ -930,7 +930,7 @@ void sound_manager::resume(running_machine &machine) // configuration file //------------------------------------------------- -void sound_manager::config_load(running_machine &machine, int config_type, xml_data_node *parentnode) +void sound_manager::config_load(int config_type, xml_data_node *parentnode) { // we only care about game files if (config_type != CONFIG_TYPE_GAME) @@ -944,7 +944,7 @@ void sound_manager::config_load(running_machine &machine, int config_type, xml_d for (xml_data_node *channelnode = xml_get_sibling(parentnode->child, "channel"); channelnode != NULL; channelnode = xml_get_sibling(channelnode->next, "channel")) { speaker_input info; - if (machine.sound().indexed_speaker_input(xml_get_attribute_int(channelnode, "index", -1), info)) + if (indexed_speaker_input(xml_get_attribute_int(channelnode, "index", -1), info)) { float defvol = xml_get_attribute_float(channelnode, "defvol", -1000.0); float newvol = xml_get_attribute_float(channelnode, "newvol", -1000.0); @@ -960,7 +960,7 @@ void sound_manager::config_load(running_machine &machine, int config_type, xml_d // file //------------------------------------------------- -void sound_manager::config_save(running_machine &machine, int config_type, xml_data_node *parentnode) +void sound_manager::config_save(int config_type, xml_data_node *parentnode) { // we only care about game files if (config_type != CONFIG_TYPE_GAME) @@ -971,7 +971,7 @@ void sound_manager::config_save(running_machine &machine, int config_type, xml_d for (int mixernum = 0; ; mixernum++) { speaker_input info; - if (!machine.sound().indexed_speaker_input(mixernum, info)) + if (!indexed_speaker_input(mixernum, info)) break; float defvol = info.stream->initial_input_gain(info.inputnum); float newvol = info.stream->input_gain(info.inputnum); diff --git a/src/emu/sound.h b/src/emu/sound.h index dfda66a9395..f655121e0d4 100644 --- a/src/emu/sound.h +++ b/src/emu/sound.h @@ -199,7 +199,7 @@ private: // ======================> sound_manager -class sound_manager +class sound_manager : public bindable_object { friend class sound_stream; @@ -242,11 +242,11 @@ public: private: // internal helpers void mute(bool mute, UINT8 reason); - static void reset(running_machine &machine); - static void pause(running_machine &machine); - static void resume(running_machine &machine); - static void config_load(running_machine &machine, int config_type, xml_data_node *parentnode); - static void config_save(running_machine &machine, int config_type, xml_data_node *parentnode); + void reset(); + void pause(); + void resume(); + void config_load(int config_type, xml_data_node *parentnode); + void config_save(int config_type, xml_data_node *parentnode); static TIMER_CALLBACK( update_static ) { reinterpret_cast<sound_manager *>(ptr)->update(); } void update(); diff --git a/src/emu/tilemap.c b/src/emu/tilemap.c index 450e32214c0..f925d7807d7 100644 --- a/src/emu/tilemap.c +++ b/src/emu/tilemap.c @@ -305,7 +305,7 @@ void tilemap_init(running_machine &machine) if (screen_width != 0 && screen_height != 0) { machine.priority_bitmap = auto_bitmap_alloc(machine, screen_width, screen_height, BITMAP_FORMAT_INDEXED8); - machine.add_notifier(MACHINE_NOTIFY_EXIT, tilemap_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(tilemap_exit), &machine)); } } diff --git a/src/emu/ui.c b/src/emu/ui.c index e5ce63026fd..a9c4911b8e7 100644 --- a/src/emu/ui.c +++ b/src/emu/ui.c @@ -237,7 +237,7 @@ INLINE int is_breakable_char(unicode_char ch) int ui_init(running_machine &machine) { /* make sure we clean up after ourselves */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, ui_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_exit), &machine)); /* initialize the other UI bits */ ui_menu_init(machine); diff --git a/src/emu/uigfx.c b/src/emu/uigfx.c index 2167be8a64b..47bae8c872e 100644 --- a/src/emu/uigfx.c +++ b/src/emu/uigfx.c @@ -109,7 +109,7 @@ void ui_gfx_init(running_machine &machine) int gfx; /* make sure we clean up after ourselves */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, ui_gfx_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_gfx_exit), &machine)); /* initialize our global state */ memset(state, 0, sizeof(*state)); diff --git a/src/emu/uiinput.c b/src/emu/uiinput.c index 1a7af6dda67..623d9347e2c 100644 --- a/src/emu/uiinput.c +++ b/src/emu/uiinput.c @@ -80,7 +80,7 @@ void ui_input_init(running_machine &machine) machine.ui_input_data->current_mouse_y = -1; /* add a frame callback to poll inputs */ - machine.add_notifier(MACHINE_NOTIFY_FRAME, ui_input_frame_update); + machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(FUNC(ui_input_frame_update), &machine)); } diff --git a/src/emu/uimenu.c b/src/emu/uimenu.c index 575a21015cb..823db2e7f3a 100644 --- a/src/emu/uimenu.c +++ b/src/emu/uimenu.c @@ -413,7 +413,7 @@ void ui_menu_init(running_machine &machine) arrow_texture = machine.render().texture_alloc(menu_render_triangle); /* add an exit callback to free memory */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, ui_menu_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ui_menu_exit), &machine)); } diff --git a/src/emu/video.c b/src/emu/video.c index 975149ed561..b04fadc1d01 100644 --- a/src/emu/video.c +++ b/src/emu/video.c @@ -135,7 +135,7 @@ video_manager::video_manager(running_machine &machine) m_movie_frame(0) { // request a callback upon exiting - machine.add_notifier(MACHINE_NOTIFY_EXIT, exit_static); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(video_manager::exit), this)); machine.save().register_postload(state_postload_stub<video_manager, &video_manager::postload>, this); // extract initial execution state from global configuration settings @@ -180,7 +180,7 @@ video_manager::video_manager(running_machine &machine) // if no screens, create a periodic timer to drive updates if (machine.primary_screen == NULL) { - m_screenless_frame_timer = machine.scheduler().timer_alloc(FUNC(screenless_update_callback), this); + m_screenless_frame_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(video_manager::screenless_update_callback), this)); m_screenless_frame_timer->adjust(screen_device::DEFAULT_FRAME_PERIOD, 0, screen_device::DEFAULT_FRAME_PERIOD); } } @@ -535,11 +535,6 @@ void video_manager::add_sound_to_recording(const INT16 *sound, int numsamples) // video_exit - close down the video system //------------------------------------------------- -void video_manager::exit_static(running_machine &machine) -{ - machine.video().exit(); -} - void video_manager::exit() { // stop recording any movie @@ -570,10 +565,10 @@ void video_manager::exit() // when there are no screens to drive it //------------------------------------------------- -TIMER_CALLBACK( video_manager::screenless_update_callback ) +void video_manager::screenless_update_callback(void *ptr, int param) { // force an update - reinterpret_cast<video_manager *>(ptr)->frame_update(false); + frame_update(false); } diff --git a/src/emu/video.h b/src/emu/video.h index ce660ff657c..63439ab65b7 100644 --- a/src/emu/video.h +++ b/src/emu/video.h @@ -70,7 +70,7 @@ typedef struct _avi_file avi_file; // ======================> video_manager -class video_manager +class video_manager : public bindable_object { friend class screen_device; @@ -118,9 +118,8 @@ public: private: // internal helpers - static void exit_static(running_machine &machine); void exit(); - static TIMER_CALLBACK( screenless_update_callback ); + void screenless_update_callback(void *ptr, int param); void postload(); // effective value helpers diff --git a/src/emu/watchdog.c b/src/emu/watchdog.c index b85317e264b..1af78b4b70d 100644 --- a/src/emu/watchdog.c +++ b/src/emu/watchdog.c @@ -41,7 +41,7 @@ void watchdog_init(running_machine &machine) /* allocate a timer for the watchdog */ watchdog_timer = machine.scheduler().timer_alloc(FUNC(watchdog_callback)); - machine.add_notifier(MACHINE_NOTIFY_RESET, watchdog_internal_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(watchdog_internal_reset), &machine)); /* save some stuff in the default tag */ machine.save().save_item(NAME(watchdog_enabled)); @@ -84,7 +84,7 @@ static TIMER_CALLBACK( watchdog_callback ) timers -------------------------------------------------*/ -static void on_vblank(screen_device &screen, void *param, bool vblank_state) +static void on_vblank(running_machine &machine, screen_device &screen, bool vblank_state) { /* VBLANK starting */ if (vblank_state && watchdog_enabled) @@ -118,7 +118,7 @@ void watchdog_reset(running_machine &machine) /* register a VBLANK callback for the primary screen */ if (machine.primary_screen != NULL) - machine.primary_screen->register_vblank_callback(on_vblank, NULL); + machine.primary_screen->register_vblank_callback(vblank_state_delegate(FUNC(on_vblank), &machine)); } /* timer-based watchdog? */ diff --git a/src/mame/drivers/cps3.c b/src/mame/drivers/cps3.c index 071c1053122..6dc3b340a3b 100644 --- a/src/mame/drivers/cps3.c +++ b/src/mame/drivers/cps3.c @@ -2318,7 +2318,7 @@ static void cps3_exit(running_machine &machine) static MACHINE_START( cps3 ) { wd33c93_init(machine, &scsi_intf); - machine.add_notifier(MACHINE_NOTIFY_EXIT, cps3_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(cps3_exit), &machine)); } static MACHINE_RESET( cps3 ) diff --git a/src/mame/drivers/firebeat.c b/src/mame/drivers/firebeat.c index 06f91283341..420322a46a5 100644 --- a/src/mame/drivers/firebeat.c +++ b/src/mame/drivers/firebeat.c @@ -936,7 +936,7 @@ static void atapi_init(running_machine &machine) SCSIAllocInstance( machine, SCSI_DEVICE_CDROM, &state->m_atapi_device_data[0], "scsi0" ); // TODO: the slave drive can be either CD-ROM, DVD-ROM or HDD SCSIAllocInstance( machine, SCSI_DEVICE_CDROM, &state->m_atapi_device_data[1], "scsi1" ); - machine.add_notifier(MACHINE_NOTIFY_EXIT, atapi_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(atapi_exit), &machine)); } static void atapi_reset(running_machine &machine) diff --git a/src/mame/drivers/konamigq.c b/src/mame/drivers/konamigq.c index 611926b304d..dceff524d35 100644 --- a/src/mame/drivers/konamigq.c +++ b/src/mame/drivers/konamigq.c @@ -365,7 +365,7 @@ static MACHINE_START( konamigq ) /* init the scsi controller and hook up it's DMA */ am53cf96_init(machine, &scsi_intf); - machine.add_notifier(MACHINE_NOTIFY_EXIT, konamigq_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(konamigq_exit), &machine)); psx_dma_install_read_handler(machine, 5, scsi_dma_read); psx_dma_install_write_handler(machine, 5, scsi_dma_write); diff --git a/src/mame/drivers/konamigv.c b/src/mame/drivers/konamigv.c index b23540fc1ed..d59c00d1fb6 100644 --- a/src/mame/drivers/konamigv.c +++ b/src/mame/drivers/konamigv.c @@ -306,7 +306,7 @@ static DRIVER_INIT( konamigv ) /* init the scsi controller and hook up it's DMA */ am53cf96_init(machine, &scsi_intf); - machine.add_notifier(MACHINE_NOTIFY_EXIT, konamigv_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(konamigv_exit), &machine)); psx_dma_install_read_handler(machine, 5, scsi_dma_read); psx_dma_install_write_handler(machine, 5, scsi_dma_write); } diff --git a/src/mame/drivers/ksys573.c b/src/mame/drivers/ksys573.c index 91630cd6459..c8e58e06ee0 100644 --- a/src/mame/drivers/ksys573.c +++ b/src/mame/drivers/ksys573.c @@ -1032,7 +1032,7 @@ static void atapi_init(running_machine &machine) state->m_available_cdroms[ i ] = NULL; } } - machine.add_notifier(MACHINE_NOTIFY_EXIT, atapi_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(atapi_exit), &machine)); state->save_item( NAME(state->m_atapi_regs) ); diff --git a/src/mame/drivers/mediagx.c b/src/mame/drivers/mediagx.c index 43cd77be6e3..d6f988b7638 100644 --- a/src/mame/drivers/mediagx.c +++ b/src/mame/drivers/mediagx.c @@ -1264,7 +1264,7 @@ static void install_speedups(running_machine &machine, const speedup_entry *entr machine.device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler(entries[i].offset, entries[i].offset + 3, speedup_handlers[i].func, speedup_handlers[i].name); #ifdef MAME_DEBUG - machine.add_notifier(MACHINE_NOTIFY_EXIT, report_speedups); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(report_speedups), &machine)); #endif } diff --git a/src/mame/drivers/model3.c b/src/mame/drivers/model3.c index 223e3194716..1574bde539a 100644 --- a/src/mame/drivers/model3.c +++ b/src/mame/drivers/model3.c @@ -1197,13 +1197,13 @@ static void configure_fast_ram(running_machine &machine) static MACHINE_START(model3_10) { lsi53c810_init(machine, &scsi_intf); - machine.add_notifier(MACHINE_NOTIFY_EXIT, model3_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model3_exit), &machine)); configure_fast_ram(machine); } static MACHINE_START(model3_15) { lsi53c810_init(machine, &scsi_intf); - machine.add_notifier(MACHINE_NOTIFY_EXIT, model3_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model3_exit), &machine)); configure_fast_ram(machine); } static MACHINE_START(model3_20) diff --git a/src/mame/drivers/saturn.c b/src/mame/drivers/saturn.c index 7c4fd3baae0..c4fe371685b 100644 --- a/src/mame/drivers/saturn.c +++ b/src/mame/drivers/saturn.c @@ -3149,7 +3149,7 @@ static MACHINE_START( stv ) stv_register_protection_savestates(machine); // machine/stvprot.c - machine.add_notifier(MACHINE_NOTIFY_EXIT, stvcd_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(stvcd_exit), &machine)); smpc_ram[0x23] = DectoBCD(systime.local_time.year /100); smpc_ram[0x25] = DectoBCD(systime.local_time.year %100); @@ -3192,7 +3192,7 @@ static MACHINE_START( saturn ) state_save_register_global(machine, smpcSR); state_save_register_global_array(machine, SMEM); - machine.add_notifier(MACHINE_NOTIFY_EXIT, stvcd_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(stvcd_exit), &machine)); } diff --git a/src/mame/drivers/taitosj.c b/src/mame/drivers/taitosj.c index 9eb0ac8016f..b1752e3120d 100644 --- a/src/mame/drivers/taitosj.c +++ b/src/mame/drivers/taitosj.c @@ -2729,7 +2729,7 @@ static void init_common(running_machine &machine) state->save_item(NAME(state->m_dac_out)); state->save_item(NAME(state->m_dac_vol)); - machine.add_notifier(MACHINE_NOTIFY_RESET, reset_common); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(reset_common), &machine)); } static DRIVER_INIT( taitosj ) diff --git a/src/mame/machine/atari.c b/src/mame/machine/atari.c index 73cd3dd633f..edfb2aa3077 100644 --- a/src/mame/machine/atari.c +++ b/src/mame/machine/atari.c @@ -349,10 +349,10 @@ void atari_machine_start(running_machine &machine) gtia_init(machine, >ia_intf); /* pokey */ - machine.add_notifier(MACHINE_NOTIFY_RESET, pokey_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(pokey_reset), &machine)); /* ANTIC */ - machine.add_notifier(MACHINE_NOTIFY_RESET, _antic_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(_antic_reset), &machine)); /* save states */ state_save_register_global_pointer(machine, ((UINT8 *) &antic.r), sizeof(antic.r)); diff --git a/src/mame/machine/fd1089.c b/src/mame/machine/fd1089.c index 17f32117f59..8c99d94033a 100644 --- a/src/mame/machine/fd1089.c +++ b/src/mame/machine/fd1089.c @@ -410,7 +410,7 @@ static void sys16_decrypt(running_machine &machine, const UINT8 *key,int cputype int A; decrypted = auto_alloc_array(machine, UINT16, size/2); - machine.add_notifier(MACHINE_NOTIFY_EXIT, clear_decrypted); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(clear_decrypted), &machine)); space->set_decrypted_region(0x000000, size - 1, decrypted); for (A = 0;A < size;A+=2) diff --git a/src/mame/machine/md_cart.c b/src/mame/machine/md_cart.c index 81061c2e1c5..3b5df422ce4 100644 --- a/src/mame/machine/md_cart.c +++ b/src/mame/machine/md_cart.c @@ -1943,7 +1943,7 @@ static void genesis_machine_stop(running_machine &machine) MACHINE_START( md_sram ) { - machine.add_notifier(MACHINE_NOTIFY_EXIT, genesis_machine_stop); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(genesis_machine_stop), &machine)); } /******* 32X image loading *******/ diff --git a/src/mame/machine/tecmosys.c b/src/mame/machine/tecmosys.c index 1ef4fa20ab3..592761cc8a0 100644 --- a/src/mame/machine/tecmosys.c +++ b/src/mame/machine/tecmosys.c @@ -121,7 +121,7 @@ void tecmosys_prot_init(running_machine &machine, int which) case 2: state->m_device_data = &tkdensha_data; break; } - machine.add_notifier(MACHINE_NOTIFY_RESET, tecmosys_prot_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(tecmosys_prot_reset), &machine)); } READ16_HANDLER(tecmosys_prot_status_r) diff --git a/src/mame/video/gaelco3d.c b/src/mame/video/gaelco3d.c index d6147d87163..d1286e84c7d 100644 --- a/src/mame/video/gaelco3d.c +++ b/src/mame/video/gaelco3d.c @@ -62,7 +62,7 @@ VIDEO_START( gaelco3d ) int width, height; state->m_poly = poly_alloc(machine, 2000, sizeof(poly_extra_data), 0); - machine.add_notifier(MACHINE_NOTIFY_EXIT, gaelco3d_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(gaelco3d_exit), &machine)); state->m_screenbits = machine.primary_screen->alloc_compatible_bitmap(); diff --git a/src/mame/video/galastrm.c b/src/mame/video/galastrm.c index e3c50b270dd..69e3a5377a3 100644 --- a/src/mame/video/galastrm.c +++ b/src/mame/video/galastrm.c @@ -37,7 +37,7 @@ VIDEO_START( galastrm ) state->m_polybitmap = machine.primary_screen->alloc_compatible_bitmap(); state->m_poly = poly_alloc(machine, 16, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); - machine.add_notifier(MACHINE_NOTIFY_EXIT, galastrm_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(galastrm_exit), &machine)); } /************************************************************ diff --git a/src/mame/video/gtia.c b/src/mame/video/gtia.c index 942aaf614e4..b60ee52484c 100644 --- a/src/mame/video/gtia.c +++ b/src/mame/video/gtia.c @@ -68,7 +68,7 @@ void gtia_init(running_machine &machine, const gtia_interface *intf) memset(>ia, 0, sizeof(gtia)); gtia.intf = *intf; - machine.add_notifier(MACHINE_NOTIFY_RESET, gtia_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(gtia_reset), &machine)); /* state saves */ gtia_state(machine); diff --git a/src/mame/video/gticlub.c b/src/mame/video/gticlub.c index 753b6272f44..df7517d178e 100644 --- a/src/mame/video/gticlub.c +++ b/src/mame/video/gticlub.c @@ -220,7 +220,7 @@ void K001005_init(running_machine &machine) K001005_3d_fifo = auto_alloc_array(machine, UINT32, 0x10000); poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); - machine.add_notifier(MACHINE_NOTIFY_EXIT, K001005_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(K001005_exit), &machine)); for (i=0; i < 128; i++) { diff --git a/src/mame/video/jalblend.c b/src/mame/video/jalblend.c index 980631d6598..4dac6cc5f85 100644 --- a/src/mame/video/jalblend.c +++ b/src/mame/video/jalblend.c @@ -29,7 +29,7 @@ void jal_blend_init(running_machine &machine, int enable) if (enable) { jal_blend_table = auto_alloc_array_clear(machine, UINT8, 0xc00); - machine.add_notifier(MACHINE_NOTIFY_RESET, jal_blend_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(jal_blend_reset), &machine)); } else { diff --git a/src/mame/video/midvunit.c b/src/mame/video/midvunit.c index 36a8eda6a5e..2d586b6c7af 100644 --- a/src/mame/video/midvunit.c +++ b/src/mame/video/midvunit.c @@ -68,7 +68,7 @@ VIDEO_START( midvunit ) midvunit_state *state = machine.driver_data<midvunit_state>(); state->m_scanline_timer = machine.scheduler().timer_alloc(FUNC(scanline_timer_cb)); state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); - machine.add_notifier(MACHINE_NOTIFY_EXIT, midvunit_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(midvunit_exit), &machine)); state_save_register_global_array(machine, state->m_video_regs); state_save_register_global_array(machine, state->m_dma_data); diff --git a/src/mame/video/midzeus.c b/src/mame/video/midzeus.c index b4674e24776..0582f503cfd 100644 --- a/src/mame/video/midzeus.c +++ b/src/mame/video/midzeus.c @@ -259,7 +259,7 @@ VIDEO_START( midzeus ) poly = poly_alloc(machine, 10000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); /* we need to cleanup on exit */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, exit_handler); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(exit_handler), &machine)); yoffs = 0; texel_width = 256; diff --git a/src/mame/video/midzeus2.c b/src/mame/video/midzeus2.c index c34dabf0060..c75e6f9d90f 100644 --- a/src/mame/video/midzeus2.c +++ b/src/mame/video/midzeus2.c @@ -273,7 +273,7 @@ VIDEO_START( midzeus2 ) poly = poly_alloc(machine, 10000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); /* we need to cleanup on exit */ - machine.add_notifier(MACHINE_NOTIFY_EXIT, exit_handler); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(exit_handler), &machine)); zbase = 2.0f; yoffs = 0; diff --git a/src/mame/video/model2.c b/src/mame/video/model2.c index f7689932f6b..ba4960aa075 100644 --- a/src/mame/video/model2.c +++ b/src/mame/video/model2.c @@ -2715,7 +2715,7 @@ VIDEO_START(model2) state->m_sys24_bitmap = auto_alloc(machine, bitmap_t(width, height+4, BITMAP_FORMAT_INDEXED16)); state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), 0); - machine.add_notifier(MACHINE_NOTIFY_EXIT, model2_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model2_exit), &machine)); /* initialize the hardware rasterizer */ model2_3d_init( machine, (UINT16*)machine.region("user3")->base() ); diff --git a/src/mame/video/model3.c b/src/mame/video/model3.c index ba3e8b94637..81a88ba2e74 100644 --- a/src/mame/video/model3.c +++ b/src/mame/video/model3.c @@ -120,7 +120,7 @@ VIDEO_START( model3 ) int width, height; state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), 0); - machine.add_notifier(MACHINE_NOTIFY_EXIT, model3_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(model3_exit), &machine)); width = machine.primary_screen->width(); height = machine.primary_screen->height(); diff --git a/src/mame/video/namcos22.c b/src/mame/video/namcos22.c index 6f902024886..b83f3e900f7 100644 --- a/src/mame/video/namcos22.c +++ b/src/mame/video/namcos22.c @@ -2230,8 +2230,8 @@ static VIDEO_START( common ) #else state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), 0); #endif - machine.add_notifier(MACHINE_NOTIFY_RESET, namcos22_reset); - machine.add_notifier(MACHINE_NOTIFY_EXIT, namcos22_exit); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(namcos22_reset), &machine)); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(namcos22_exit), &machine)); gfx_element_set_source(machine.gfx[GFX_CHAR], (UINT8 *)state->m_cgram); } diff --git a/src/mame/video/stvvdp2.c b/src/mame/video/stvvdp2.c index cfbadfb5992..fb66313be62 100644 --- a/src/mame/video/stvvdp2.c +++ b/src/mame/video/stvvdp2.c @@ -5444,7 +5444,7 @@ static void stv_vdp2_exit (running_machine &machine) static int stv_vdp2_start (running_machine &machine) { - machine.add_notifier(MACHINE_NOTIFY_EXIT, stv_vdp2_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(stv_vdp2_exit), &machine)); stv_vdp2_regs = auto_alloc_array_clear(machine, UINT32, 0x040000/4 ); stv_vdp2_vram = auto_alloc_array_clear(machine, UINT32, 0x100000/4 ); // actually we only need half of it since we don't emulate extra 4mbit ram cart. diff --git a/src/mame/video/taitojc.c b/src/mame/video/taitojc.c index f62595fda34..b0d679f6155 100644 --- a/src/mame/video/taitojc.c +++ b/src/mame/video/taitojc.c @@ -177,7 +177,7 @@ VIDEO_START( taitojc ) int width, height; state->m_poly = poly_alloc(machine, 4000, sizeof(poly_extra_data), POLYFLAG_ALLOW_QUADS); - machine.add_notifier(MACHINE_NOTIFY_EXIT, taitojc_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(taitojc_exit), &machine)); /* find first empty slot to decode gfx */ for (state->m_gfx_index = 0; state->m_gfx_index < MAX_GFX_ELEMENTS; state->m_gfx_index++) diff --git a/src/mame/video/tia.c b/src/mame/video/tia.c index e3d50b14cdb..22d5b12c177 100644 --- a/src/mame/video/tia.c +++ b/src/mame/video/tia.c @@ -1995,6 +1995,6 @@ void tia_init(running_machine &machine, const struct tia_interface* ti) tia_reset( machine ); - machine.add_notifier(MACHINE_NOTIFY_RESET, tia_reset); + machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(tia_reset), &machine)); } diff --git a/src/mame/video/ygv608.c b/src/mame/video/ygv608.c index e0c80f8f4e2..f345f2ad87f 100644 --- a/src/mame/video/ygv608.c +++ b/src/mame/video/ygv608.c @@ -544,7 +544,7 @@ VIDEO_START( ygv608 ) tilemap_B = NULL; ygv608_register_state_save(machine); - machine.add_notifier(MACHINE_NOTIFY_EXIT, ygv608_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(ygv608_exit), &machine)); } static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) diff --git a/src/osd/sdl/debugwin.c b/src/osd/sdl/debugwin.c index 1a16bd08f5f..59bee14a8b4 100644 --- a/src/osd/sdl/debugwin.c +++ b/src/osd/sdl/debugwin.c @@ -545,7 +545,7 @@ static void configuration_save(running_machine &machine, int config_type, xml_da void sdl_osd_interface::init_debugger() { /* register callbacks */ - config_register(machine(), "debugger", configuration_load, configuration_save); + config_register(machine(), "debugger", config_saveload_delegate(FUNC(configuration_load), &machine), config_saveload_delegate(FUNC(configuration_save), &machine)); } diff --git a/src/osd/sdl/input.c b/src/osd/sdl/input.c index d29a1071a79..1d1ab95455d 100644 --- a/src/osd/sdl/input.c +++ b/src/osd/sdl/input.c @@ -1105,9 +1105,9 @@ void sdlinput_init(running_machine &machine) app_has_mouse_focus = 1; // we need pause and exit callbacks - machine.add_notifier(MACHINE_NOTIFY_PAUSE, sdlinput_pause); - machine.add_notifier(MACHINE_NOTIFY_RESUME, sdlinput_resume); - machine.add_notifier(MACHINE_NOTIFY_EXIT, sdlinput_exit); + machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(sdlinput_pause), &machine); + machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(sdlinput_resume), &machine)); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(sdlinput_exit), &machine)); // allocate a lock for input synchronizations input_lock = osd_lock_alloc(); diff --git a/src/osd/sdl/output.c b/src/osd/sdl/output.c index 0381ef16e0b..908552b7548 100644 --- a/src/osd/sdl/output.c +++ b/src/osd/sdl/output.c @@ -75,7 +75,7 @@ void sdloutput_init(running_machine &machine) { int fildes; - machine.add_notifier(MACHINE_NOTIFY_EXIT, sdloutput_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(sdloutput_exit), &machine)); fildes = open(SDLMAME_OUTPUT, O_RDWR | O_NONBLOCK); diff --git a/src/osd/sdl/sdlmain.c b/src/osd/sdl/sdlmain.c index cf6f78624ca..c99726cef18 100644 --- a/src/osd/sdl/sdlmain.c +++ b/src/osd/sdl/sdlmain.c @@ -622,7 +622,7 @@ void sdl_osd_interface::init(running_machine &machine) osd_sdl_info(); } // must be before sdlvideo_init! - machine.add_notifier(MACHINE_NOTIFY_EXIT, osd_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(osd_exit), &machine)); defines_verbose(); diff --git a/src/osd/sdl/sound.c b/src/osd/sdl/sound.c index b3eed800f98..e75a4bf50ec 100644 --- a/src/osd/sdl/sound.c +++ b/src/osd/sdl/sound.c @@ -93,7 +93,7 @@ void sdlaudio_init(running_machine &machine) if (sdl_init(machine)) return; - machine.add_notifier(MACHINE_NOTIFY_EXIT, sdl_cleanup_audio); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(sdl_cleanup_audio), &machine)); // set the startup volume machine.osd().set_mastervolume(attenuation); } diff --git a/src/osd/sdl/video.c b/src/osd/sdl/video.c index 89b830821a0..f507a37bf9b 100644 --- a/src/osd/sdl/video.c +++ b/src/osd/sdl/video.c @@ -110,7 +110,7 @@ int sdlvideo_init(running_machine &machine) extract_video_config(machine); // ensure we get called on the way out - machine.add_notifier(MACHINE_NOTIFY_EXIT, video_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(video_exit), &machine)); // set up monitors first init_monitors(); diff --git a/src/osd/sdl/window.c b/src/osd/sdl/window.c index ae9d6f44f97..5753f99a4ae 100644 --- a/src/osd/sdl/window.c +++ b/src/osd/sdl/window.c @@ -213,7 +213,7 @@ int sdlwindow_init(running_machine &machine) main_threadid = SDL_ThreadID(); // ensure we get called on the way out - machine.add_notifier(MACHINE_NOTIFY_EXIT, sdlwindow_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(sdlwindow_exit), &machine)); // if multithreading, create a thread to run the windows if (multithreading_enabled) diff --git a/src/osd/windows/input.c b/src/osd/windows/input.c index c04d67a1f91..e5508117327 100644 --- a/src/osd/windows/input.c +++ b/src/osd/windows/input.c @@ -507,9 +507,9 @@ INLINE INT32 normalize_absolute_axis(INT32 raw, INT32 rawmin, INT32 rawmax) void wininput_init(running_machine &machine) { // we need pause and exit callbacks - machine.add_notifier(MACHINE_NOTIFY_PAUSE, wininput_pause); - machine.add_notifier(MACHINE_NOTIFY_RESUME, wininput_resume); - machine.add_notifier(MACHINE_NOTIFY_EXIT, wininput_exit); + machine.add_notifier(MACHINE_NOTIFY_PAUSE, machine_notify_delegate(FUNC(wininput_pause), &machine)); + machine.add_notifier(MACHINE_NOTIFY_RESUME, machine_notify_delegate(FUNC(wininput_resume), &machine)); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(wininput_exit), &machine)); // allocate a lock for input synchronizations, since messages sometimes come from another thread input_lock = osd_lock_alloc(); @@ -952,7 +952,7 @@ static void win32_init(running_machine &machine) return; // we need an exit callback - machine.add_notifier(MACHINE_NOTIFY_EXIT, win32_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(win32_exit), &machine)); // allocate two lightgun devices for (gunnum = 0; gunnum < 2; gunnum++) @@ -1120,7 +1120,7 @@ static void dinput_init(running_machine &machine) mame_printf_verbose("DirectInput: Using DirectInput %d\n", dinput_version >> 8); // we need an exit callback - machine.add_notifier(MACHINE_NOTIFY_EXIT, dinput_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(dinput_exit), &machine)); // initialize keyboard devices, but only if we don't have any yet if (keyboard_list == NULL) @@ -1660,7 +1660,7 @@ static void rawinput_init(running_machine &machine) HMODULE user32; // we need pause and exit callbacks - machine.add_notifier(MACHINE_NOTIFY_EXIT, rawinput_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(rawinput_exit), &machine)); // look in user32 for the raw input APIs user32 = LoadLibrary(TEXT("user32.dll")); diff --git a/src/osd/windows/output.c b/src/osd/windows/output.c index bd5278583d7..16c06fcabd8 100644 --- a/src/osd/windows/output.c +++ b/src/osd/windows/output.c @@ -119,7 +119,7 @@ void winoutput_init(running_machine &machine) int result; // ensure we get cleaned up - machine.add_notifier(MACHINE_NOTIFY_EXIT, winoutput_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(winoutput_exit), &machine)); // reset globals clientlist = NULL; diff --git a/src/osd/windows/sound.c b/src/osd/windows/sound.c index 1e7dc3e0d6d..413c8fb9e0b 100644 --- a/src/osd/windows/sound.c +++ b/src/osd/windows/sound.c @@ -119,7 +119,7 @@ void winsound_init(running_machine &machine) return; // ensure we get called on the way out - machine.add_notifier(MACHINE_NOTIFY_EXIT, sound_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(sound_exit), &machine)); // attempt to initialize directsound // don't make it fatal if we can't -- we'll just run without sound diff --git a/src/osd/windows/video.c b/src/osd/windows/video.c index d4fde80ed6c..cbe434f0c20 100644 --- a/src/osd/windows/video.c +++ b/src/osd/windows/video.c @@ -111,7 +111,7 @@ void winvideo_init(running_machine &machine) int index; // ensure we get called on the way out - machine.add_notifier(MACHINE_NOTIFY_EXIT, winvideo_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(winvideo_exit), &machine)); // extract data from the options extract_video_config(machine); diff --git a/src/osd/windows/window.c b/src/osd/windows/window.c index 11b66e3f107..d92ee5d05e5 100644 --- a/src/osd/windows/window.c +++ b/src/osd/windows/window.c @@ -230,7 +230,7 @@ void winwindow_init(running_machine &machine) main_threadid = GetCurrentThreadId(); // ensure we get called on the way out - machine.add_notifier(MACHINE_NOTIFY_EXIT, winwindow_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(winwindow_exit), &machine)); // set up window class and register it create_window_class(); diff --git a/src/osd/windows/winmain.c b/src/osd/windows/winmain.c index 7f6541b964c..7c7094918cc 100644 --- a/src/osd/windows/winmain.c +++ b/src/osd/windows/winmain.c @@ -560,7 +560,7 @@ void windows_osd_interface::init(running_machine &machine) SetThreadPriority(GetCurrentThread(), options.priority()); // ensure we get called on the way out - machine.add_notifier(MACHINE_NOTIFY_EXIT, osd_exit); + machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(osd_exit), &machine)); // get number of processors stemp = options.numprocessors(); |