diff options
author | Aaron Giles <aaron@aarongiles.com> | 2021-03-22 19:56:53 -0700 |
---|---|---|
committer | Aaron Giles <aaron@aarongiles.com> | 2021-03-22 19:56:53 -0700 |
commit | ab254604afa2a933d57c78bb8f5890f6c90a4732 (patch) | |
tree | 3aac549d25268fa6aa754f8f6d55f74fff81dd64 | |
parent | ebf3216c0b21a9900ffc8c1ead690484e162bdab (diff) |
Removed ptr parameter from temporary timers. Fixed a handful of places that used it. Created timer_expired_registered_delegate for registering timer callbacks. Updated the callbacks in dcs.cpp to use them as a testbed.
-rw-r--r-- | src/devices/machine/netlist.cpp | 6 | ||||
-rw-r--r-- | src/devices/video/zeus2.cpp | 2 | ||||
-rw-r--r-- | src/emu/device.cpp | 4 | ||||
-rw-r--r-- | src/emu/device.h | 4 | ||||
-rw-r--r-- | src/emu/diexec.cpp | 4 | ||||
-rw-r--r-- | src/emu/schedule.cpp | 83 | ||||
-rw-r--r-- | src/emu/schedule.h | 54 | ||||
-rw-r--r-- | src/frontend/mame/luaengine.cpp | 2 | ||||
-rw-r--r-- | src/mame/audio/dcs.cpp | 42 | ||||
-rw-r--r-- | src/mame/audio/dcs.h | 9 | ||||
-rw-r--r-- | src/mame/includes/vectrex.h | 6 | ||||
-rw-r--r-- | src/mame/machine/atarigen.cpp | 6 | ||||
-rw-r--r-- | src/mame/machine/vectrex.cpp | 22 | ||||
-rw-r--r-- | src/mame/video/fmtowns.cpp | 2 | ||||
-rw-r--r-- | src/mame/video/vectrex.cpp | 8 |
15 files changed, 198 insertions, 56 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 7c43c35838d..6b0e0d73ea1 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -288,9 +288,7 @@ void netlist_mame_analog_input_device::write(const double val) { m_value_for_device_timer = val * m_mult + m_offset; if (m_value_for_device_timer != (*m_param)()) - { - synchronize(0, 0, &m_value_for_device_timer); -} + synchronize(0); } void netlist_mame_analog_input_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -299,7 +297,7 @@ void netlist_mame_analog_input_device::device_timer(emu_timer &timer, device_tim #if NETLIST_CREATE_CSV nl_owner().log_add(m_param_name, *((double *) ptr), true); #endif - m_param->set(*((double *) ptr)); + m_param->set(m_value_for_device_timer); } void netlist_mame_int_input_device::write(const uint32_t val) diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp index b6626ce933a..1d3e2dd767c 100644 --- a/src/devices/video/zeus2.cpp +++ b/src/devices/video/zeus2.cpp @@ -56,7 +56,7 @@ TIMER_CALLBACK_MEMBER(zeus2_device::display_irq) m_vblank(ASSERT_LINE); /* set a timer for the next off state */ //machine().scheduler().timer_set(screen().time_until_pos(0), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this), 0, this); - machine().scheduler().timer_set(screen().time_until_vblank_end(), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this), 0, this); + machine().scheduler().timer_set(screen().time_until_vblank_end(), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this)); //machine().scheduler().timer_set(attotime::from_hz(30000000), timer_expired_delegate(FUNC(zeus2_device::display_irq_off), this)); } diff --git a/src/emu/device.cpp b/src/emu/device.cpp index 51088b02d4a..1b2e4d22179 100644 --- a/src/emu/device.cpp +++ b/src/emu/device.cpp @@ -473,9 +473,9 @@ emu_timer *device_t::timer_alloc(device_timer_id id, void *ptr) // call our device callback //------------------------------------------------- -void device_t::timer_set(const attotime &duration, device_timer_id id, int param, void *ptr) +void device_t::timer_set(const attotime &duration, device_timer_id id, int param) { - machine().scheduler().timer_set(duration, *this, id, param, ptr); + machine().scheduler().timer_set(duration, *this, id, param); } diff --git a/src/emu/device.h b/src/emu/device.h index 774930690b7..9e941203365 100644 --- a/src/emu/device.h +++ b/src/emu/device.h @@ -608,8 +608,8 @@ public: // timer interfaces emu_timer *timer_alloc(device_timer_id id = 0, void *ptr = nullptr); - void timer_set(const attotime &duration, device_timer_id id = 0, int param = 0, void *ptr = nullptr); - void synchronize(device_timer_id id = 0, int param = 0, void *ptr = nullptr) { timer_set(attotime::zero, id, param, ptr); } + void timer_set(const attotime &duration, device_timer_id id = 0, int param = 0); + void synchronize(device_timer_id id = 0, int param = 0) { timer_set(attotime::zero, id, param); } void timer_expired(emu_timer &timer, device_timer_id id, int param, void *ptr) { device_timer(timer, id, param, ptr); } // state saving interfaces diff --git a/src/emu/diexec.cpp b/src/emu/diexec.cpp index 1f2c521f934..909e506289b 100644 --- a/src/emu/diexec.cpp +++ b/src/emu/diexec.cpp @@ -160,7 +160,7 @@ void device_execute_interface::spin_until_time(const attotime &duration) suspend_until_trigger(TRIGGER_SUSPENDTIME + timetrig, true); // then set a timer for it - m_scheduler->timer_set(duration, timer_expired_delegate(FUNC(device_execute_interface::timed_trigger_callback),this), TRIGGER_SUSPENDTIME + timetrig, this); + m_scheduler->timer_set(duration, timer_expired_delegate(FUNC(device_execute_interface::timed_trigger_callback),this), TRIGGER_SUSPENDTIME + timetrig); timetrig = (timetrig + 1) % 256; } @@ -683,7 +683,7 @@ if (TEMPLOG) printf("setline(%s,%d,%d,%d)\n", m_execute->device().tag(), m_linen // if this is the first one, set the timer if (event_index == 0) - m_execute->scheduler().synchronize(timer_expired_delegate(FUNC(device_execute_interface::device_input::empty_event_queue),this), 0, this); + m_execute->scheduler().synchronize(timer_expired_delegate(FUNC(device_execute_interface::device_input::empty_event_queue),this)); } } diff --git a/src/emu/schedule.cpp b/src/emu/schedule.cpp index 87302978736..742a675a089 100644 --- a/src/emu/schedule.cpp +++ b/src/emu/schedule.cpp @@ -42,6 +42,35 @@ static timer_expired_delegate const s_dummy_delegate(FUNC(dummy_delegate)); //************************************************************************** +// TIMER EXPIRED REGISTERED DELEGATE +//************************************************************************** + +timer_expired_registered_delegate::timer_expired_registered_delegate() : + m_scheduler(nullptr), + m_next(nullptr) +{ +} + +void timer_expired_registered_delegate::enregister(device_t &device, timer_expired_delegate callback) +{ + if (m_next != nullptr) + throw emu_fatalerror("Attempted to re-enregister a timer_expired_registered_delegate"); + m_callback = callback; + m_scheduler = &device.machine().scheduler(); + m_unique_id = device.tag(); + m_unique_id += "/"; + m_unique_id += m_callback.name(); + m_scheduler->register_timer_expired(*this); +} + +void timer_expired_registered_delegate::call_after(const attotime &duration, int param) const +{ + m_scheduler->timer_set(duration, *this, param); +} + + + +//************************************************************************** // EMU TIMER //************************************************************************** @@ -122,7 +151,7 @@ inline emu_timer &emu_timer::init_persistent(device_t &device, device_timer_id i // and expiration time from the outset //------------------------------------------------- -inline emu_timer &emu_timer::init_temporary(running_machine &machine, timer_expired_delegate callback, void *ptr, int param, attotime const &duration) +inline emu_timer &emu_timer::init_temporary(running_machine &machine, timer_expired_delegate callback, int param, attotime const &duration) { // ensure the entire timer state is clean m_machine = &machine; @@ -131,7 +160,7 @@ inline emu_timer &emu_timer::init_temporary(running_machine &machine, timer_expi m_start = machine.time(); m_expire = m_start + duration; m_period = attotime::never; - m_ptr = ptr; + m_ptr = nullptr; m_param = param; m_enabled = true; m_temporary = true; @@ -142,7 +171,7 @@ inline emu_timer &emu_timer::init_temporary(running_machine &machine, timer_expi return *this; } -inline emu_timer &emu_timer::init_temporary(device_t &device, device_timer_id id, void *ptr, int param, attotime const &duration) +inline emu_timer &emu_timer::init_temporary(device_t &device, device_timer_id id, int param, attotime const &duration) { // ensure the entire timer state is clean m_machine = &device.machine(); @@ -151,7 +180,7 @@ inline emu_timer &emu_timer::init_temporary(device_t &device, device_timer_id id m_start = m_machine->time(); m_expire = m_start + duration; m_period = attotime::never; - m_ptr = ptr; + m_ptr = nullptr; m_param = param; m_enabled = true; m_temporary = true; @@ -607,6 +636,7 @@ device_scheduler::device_scheduler(running_machine &machine) : m_execute_list(nullptr), m_basetime(attotime::zero), m_free_timers(nullptr), + m_registered_timers(nullptr), m_callback_timer(nullptr), m_callback_timer_modified(false), m_callback_timer_expire_time(attotime::zero), @@ -875,6 +905,12 @@ template void device_scheduler::timeslice<true>(); template void device_scheduler::timeslice<false>(); +//------------------------------------------------- +// update_basetime - update all the +// basetime_relative times now that the basetime +// has ticked over another second +//------------------------------------------------- + void device_scheduler::update_basetime() { seconds_t base_seconds = m_basetime.seconds(); @@ -966,6 +1002,18 @@ void device_scheduler::timer_reclaim_object(emu_timer &timer) //------------------------------------------------- +// register_timer_expired - register a timer +// expired callback +//------------------------------------------------- + +void device_scheduler::register_timer_expired(timer_expired_registered_delegate &callback) +{ + callback.m_next = m_registered_timers; + m_registered_timers = &callback; +} + + +//------------------------------------------------- // timer_alloc - allocate a global non-device // timer and return a pointer //------------------------------------------------- @@ -984,11 +1032,30 @@ emu_timer *device_scheduler::timer_alloc(timer_expired_delegate callback, void * // amount of time //------------------------------------------------- -void device_scheduler::timer_set(const attotime &duration, timer_expired_delegate callback, int param, void *ptr) +void device_scheduler::timer_set(const attotime &duration, timer_expired_delegate callback, int param) +{ + // temporary timers are implicitly active, so add them directly + // to the active list after creation + emu_timer &timer = timer_alloc_object().init_temporary(machine(), callback, param, duration); + if (m_active_timers.insert_sorted(timer)) + { + update_first_timer_expire(); + abort_timeslice(); + } +} + + +//------------------------------------------------- +// timer_set - allocate an anonymous non-device +// timer and set it to go off after the given +// amount of time +//------------------------------------------------- + +void device_scheduler::timer_set(const attotime &duration, timer_expired_registered_delegate const &callback, int param) { // temporary timers are implicitly active, so add them directly // to the active list after creation - emu_timer &timer = timer_alloc_object().init_temporary(machine(), callback, ptr, param, duration); + emu_timer &timer = timer_alloc_object().init_temporary(machine(), callback.m_callback, param, duration); if (m_active_timers.insert_sorted(timer)) { update_first_timer_expire(); @@ -1016,11 +1083,11 @@ emu_timer *device_scheduler::timer_alloc(device_t &device, device_timer_id id, v // time //------------------------------------------------- -void device_scheduler::timer_set(const attotime &duration, device_t &device, device_timer_id id, int param, void *ptr) +void device_scheduler::timer_set(const attotime &duration, device_t &device, device_timer_id id, int param) { // temporary timers are implicitly active, so add them directly // to the active list after creation - emu_timer &timer = timer_alloc_object().init_temporary(device, id, ptr, param, duration); + emu_timer &timer = timer_alloc_object().init_temporary(device, id, param, duration); if (m_active_timers.insert_sorted(timer)) { update_first_timer_expire(); diff --git a/src/emu/schedule.h b/src/emu/schedule.h index 0cf72c1a072..8da050b236e 100644 --- a/src/emu/schedule.h +++ b/src/emu/schedule.h @@ -24,6 +24,9 @@ #define TIMER_CALLBACK_MEMBER(name) void name(void *ptr, s32 param) +#define REGISTERED_TIMER_CALLBACK_MEMBER(name) \ + timer_expired_registered_delegate *m_##name = nullptr; void name(void *ptr, s32 param) + //************************************************************************** // TYPE DEFINITIONS @@ -32,6 +35,41 @@ // timer callbacks look like this typedef named_delegate<void (void *, s32)> timer_expired_delegate; + +// ======================> timer_expired_registered_delegate + +class timer_expired_registered_delegate +{ + friend class device_scheduler; + +public: + // construction/destruction + timer_expired_registered_delegate(); + + // registration + void enregister(device_t &device, timer_expired_delegate callback); + + template<typename DeviceType, typename FuncType> + void enregister(DeviceType &device, FuncType callback, char const *string) + { + return enregister(device, timer_expired_delegate(callback, string, &device)); + } + + // call the delegate after a set amount of time, with the given parameter + void call_after(const attotime &duration, int param = 0) const; + + // synchronize; essentially, call immediately + void synchronize(int param = 0) const { call_after(attotime::zero, param); } + +private: + // internal state + timer_expired_delegate m_callback; // the full delegate + class device_scheduler *m_scheduler; // pointer to the scheduler + timer_expired_registered_delegate *m_next; // link to the next registered item + std::string m_unique_id; // a unique ID string +}; + + // ======================> emu_timer class emu_timer @@ -46,8 +84,8 @@ class emu_timer // allocation and re-use emu_timer &init_persistent(running_machine &machine, timer_expired_delegate callback, void *ptr); emu_timer &init_persistent(device_t &device, device_timer_id id, void *ptr); - emu_timer &init_temporary(running_machine &machine, timer_expired_delegate callback, void *ptr, int param, attotime const &duration); - emu_timer &init_temporary(device_t &device, device_timer_id id, void *ptr, int param, attotime const &duration); + emu_timer &init_temporary(running_machine &machine, timer_expired_delegate callback, int param, attotime const &duration); + emu_timer &init_temporary(device_t &device, device_timer_id id, int param, attotime const &duration); public: // getters @@ -183,14 +221,19 @@ public: void boost_interleave(const attotime ×lice_time, const attotime &boost_duration); void suspend_resume_changed() { m_suspend_changes_pending = true; } + // register timer callback + void register_timer_expired(timer_expired_registered_delegate &callback); + // timers, specified by callback/name emu_timer *timer_alloc(timer_expired_delegate callback, void *ptr = nullptr); - void timer_set(const attotime &duration, timer_expired_delegate callback, int param = 0, void *ptr = nullptr); - void synchronize(timer_expired_delegate callback = timer_expired_delegate(), int param = 0, void *ptr = nullptr) { timer_set(attotime::zero, callback, param, ptr); } + void timer_set(const attotime &duration, timer_expired_delegate callback, int param = 0); + void timer_set(const attotime &duration, timer_expired_registered_delegate const &callback, int param = 0); + void synchronize(timer_expired_delegate callback = timer_expired_delegate(), int param = 0) { timer_set(attotime::zero, callback, param); } + void synchronize(timer_expired_registered_delegate const &callback, int param = 0) { timer_set(attotime::zero, callback, param); } // 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 = nullptr); - void timer_set(const attotime &duration, device_t &device, device_timer_id id = 0, int param = 0, void *ptr = nullptr); + void timer_set(const attotime &duration, device_t &device, device_timer_id id = 0, int param = 0); // debugging void dump_timers() const; @@ -232,6 +275,7 @@ private: timer_list m_active_timers; // sorted list of active timers timer_list m_inactive_timers; // unsorted list of inactive timers emu_timer * m_free_timers; // simple list of free timers + timer_expired_registered_delegate *m_registered_timers; // list of registered timers // other internal states emu_timer * m_callback_timer; // pointer to the current callback timer diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index c7800f70829..6f55be8a63e 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -794,7 +794,7 @@ void lua_engine::initialize() if (ret == 1) return luaL_error(L, "cannot wait from outside coroutine"); int ref = luaL_ref(L, LUA_REGISTRYINDEX); - engine->machine().scheduler().timer_set(attotime::from_double(lua_tonumber(L, 1)), timer_expired_delegate(FUNC(lua_engine::resume), engine), ref, nullptr); + engine->machine().scheduler().timer_set(attotime::from_double(lua_tonumber(L, 1)), timer_expired_delegate(FUNC(lua_engine::resume), engine), ref); return lua_yield(L, 0); }); emu["lang_translate"] = &lang_translate; diff --git a/src/mame/audio/dcs.cpp b/src/mame/audio/dcs.cpp index 8ce7402b59e..22d1c3f4c96 100644 --- a/src/mame/audio/dcs.cpp +++ b/src/mame/audio/dcs.cpp @@ -794,6 +794,15 @@ void dcs_audio_device::device_start() m_internal_timer = subdevice<timer_device>("dcs_int_timer"); m_reg_timer = subdevice<timer_device>("dcs_reg_timer"); + m_dcs_reset.enregister(*this, FUNC(dcs_audio_device::dcs_reset)); + m_dcs_delayed_data_w_callback.enregister(*this, FUNC(dcs_audio_device::dcs_delayed_data_w_callback)); + m_latch_delayed_w.enregister(*this, FUNC(dcs_audio_device::latch_delayed_w)); + m_delayed_ack_w_callback.enregister(*this, FUNC(dcs_audio_device::delayed_ack_w_callback)); + m_output_control_delayed_w.enregister(*this, FUNC(dcs_audio_device::output_control_delayed_w)); + m_s1_ack_callback2.enregister(*this, FUNC(dcs_audio_device::s1_ack_callback2)); + m_s1_ack_callback1.enregister(*this, FUNC(dcs_audio_device::s1_ack_callback1)); + m_s2_ack_callback.enregister(*this, FUNC(dcs_audio_device::s2_ack_callback)); + /* non-RAM based automatically acks */ m_auto_ack = true; /* register for save states */ @@ -890,6 +899,15 @@ void dcs2_audio_device::device_start() /* we don't do auto-ack by default */ m_auto_ack = false; + m_dcs_reset.enregister(*this, FUNC(dcs_audio_device::dcs_reset)); + m_dcs_delayed_data_w_callback.enregister(*this, FUNC(dcs_audio_device::dcs_delayed_data_w_callback)); + m_latch_delayed_w.enregister(*this, FUNC(dcs_audio_device::latch_delayed_w)); + m_delayed_ack_w_callback.enregister(*this, FUNC(dcs_audio_device::delayed_ack_w_callback)); + m_output_control_delayed_w.enregister(*this, FUNC(dcs_audio_device::output_control_delayed_w)); + m_s1_ack_callback2.enregister(*this, FUNC(dcs_audio_device::s1_ack_callback2)); + m_s1_ack_callback1.enregister(*this, FUNC(dcs_audio_device::s1_ack_callback1)); + m_s2_ack_callback.enregister(*this, FUNC(dcs_audio_device::s2_ack_callback)); + /* install the speedup handler */ install_speedup(); @@ -1486,7 +1504,7 @@ void dcs_audio_device::reset_w(int state) // logerror("%s: DCS reset = %d\n", machine().describe_context(), state); /* just run through the init code again */ - machine().scheduler().synchronize(timer_expired_delegate(FUNC(dcs_audio_device::dcs_reset),this)); + m_dcs_reset.synchronize(); m_cpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); } @@ -1561,7 +1579,7 @@ void dcs_audio_device::data_w(uint16_t data) /* if we are DCS1, set a timer to latch the data */ if (m_sport0_timer == nullptr) - machine().scheduler().synchronize(timer_expired_delegate(FUNC(dcs_audio_device::dcs_delayed_data_w_callback),this), data); + m_dcs_delayed_data_w_callback.synchronize(data); else dcs_delayed_data_w(data); } @@ -1617,7 +1635,7 @@ void dcs_audio_device::output_latch_w(uint16_t data) if (LOG_DCS_IO) logerror("%s output_latch_w(%04X) (empty=%d)\n", machine().describe_context(), data, IS_OUTPUT_EMPTY()); - machine().scheduler().synchronize(timer_expired_delegate(FUNC(dcs_audio_device::latch_delayed_w),this), data>>8); + m_latch_delayed_w.synchronize(data>>8); } void dcs_audio_device::output_latch32_w(uint32_t data) @@ -1626,7 +1644,7 @@ void dcs_audio_device::output_latch32_w(uint32_t data) if (LOG_DCS_IO) logerror("%s output_latch32_w(%04X) (empty=%d)\n", machine().describe_context(), data>>8, IS_OUTPUT_EMPTY()); - machine().scheduler().synchronize(timer_expired_delegate(FUNC(dcs_audio_device::latch_delayed_w),this), data>>8); + m_latch_delayed_w.synchronize(data>>8); } @@ -1646,7 +1664,7 @@ void dcs_audio_device::ack_w() { if (LOG_DCS_IO) logerror("%s:ack_w\n", machine().describe_context()); - machine().scheduler().synchronize(timer_expired_delegate(FUNC(dcs_audio_device::delayed_ack_w_callback),this)); + m_delayed_ack_w_callback.synchronize(); } @@ -1686,7 +1704,7 @@ void dcs_audio_device::output_control_w(uint16_t data) { if (LOG_DCS_IO) logerror("%s output_control_w = %04X\n", machine().describe_context(), data); - machine().scheduler().synchronize(timer_expired_delegate(FUNC(dcs_audio_device::output_control_delayed_w),this), data); + m_output_control_delayed_w.synchronize(data); } @@ -2210,7 +2228,7 @@ TIMER_CALLBACK_MEMBER( dcs_audio_device::s1_ack_callback2 ) /* if the output is full, stall for a usec */ if (IS_OUTPUT_FULL()) { - machine().scheduler().timer_set(attotime::from_usec(1), timer_expired_delegate(FUNC(dcs_audio_device::s1_ack_callback2),this), param); + m_s1_ack_callback2.call_after(attotime::from_usec(1), param); return; } output_latch_w(0x000a); @@ -2222,13 +2240,13 @@ TIMER_CALLBACK_MEMBER( dcs_audio_device::s1_ack_callback1 ) /* if the output is full, stall for a usec */ if (IS_OUTPUT_FULL()) { - machine().scheduler().timer_set(attotime::from_usec(1), timer_expired_delegate(FUNC(dcs_audio_device::s1_ack_callback1),this), param); + m_s1_ack_callback1.call_after(attotime::from_usec(1), param); return; } output_latch_w(param); /* chain to the next word we need to write back */ - machine().scheduler().timer_set(attotime::from_usec(1), timer_expired_delegate(FUNC(dcs_audio_device::s1_ack_callback2),this)); + m_s1_ack_callback2.call_after(attotime::from_usec(1)); } @@ -2346,7 +2364,7 @@ int dcs_audio_device::preprocess_stage_1(uint16_t data) /* if we're done, start a timer to send the response words */ if (transfer.state == 0) - machine().scheduler().timer_set(attotime::from_usec(1), timer_expired_delegate(FUNC(dcs_audio_device::s1_ack_callback1),this), transfer.sum); + m_s1_ack_callback1.call_after(attotime::from_usec(1), transfer.sum); return 1; } break; @@ -2360,7 +2378,7 @@ TIMER_CALLBACK_MEMBER( dcs_audio_device::s2_ack_callback ) /* if the output is full, stall for a usec */ if (IS_OUTPUT_FULL()) { - machine().scheduler().timer_set(attotime::from_usec(1), timer_expired_delegate(FUNC(dcs_audio_device::s2_ack_callback),this), param); + m_s2_ack_callback.call_after(attotime::from_usec(1), param); return; } output_latch_w(param); @@ -2459,7 +2477,7 @@ int dcs_audio_device::preprocess_stage_2(uint16_t data) /* if we're done, start a timer to send the response words */ if (transfer.state == 0) { - machine().scheduler().timer_set(attotime::from_usec(1), timer_expired_delegate(FUNC(dcs_audio_device::s2_ack_callback),this), transfer.sum); + m_s2_ack_callback.call_after(attotime::from_usec(1), transfer.sum); transfer.watchdog->reset(); } return 1; diff --git a/src/mame/audio/dcs.h b/src/mame/audio/dcs.h index 0cebee16dec..e320eca39f2 100644 --- a/src/mame/audio/dcs.h +++ b/src/mame/audio/dcs.h @@ -230,6 +230,15 @@ protected: uint32_t m_timer_period; uint32_t m_timers_fired; + timer_expired_registered_delegate m_dcs_reset; + timer_expired_registered_delegate m_dcs_delayed_data_w_callback; + timer_expired_registered_delegate m_latch_delayed_w; + timer_expired_registered_delegate m_delayed_ack_w_callback; + timer_expired_registered_delegate m_output_control_delayed_w; + timer_expired_registered_delegate m_s1_ack_callback2; + timer_expired_registered_delegate m_s1_ack_callback1; + timer_expired_registered_delegate m_s2_ack_callback; + std::unique_ptr<uint16_t[]> m_sram; uint16_t m_polling_value; uint32_t m_polling32_value; diff --git a/src/mame/includes/vectrex.h b/src/mame/includes/vectrex.h index 93e7a4fd98e..5b057ec9690 100644 --- a/src/mame/includes/vectrex.h +++ b/src/mame/includes/vectrex.h @@ -33,7 +33,10 @@ public: TIMER_LIGHTPEN_TRIGGER, TIMER_VECTREX_REFRESH, TIMER_VECTREX_ZERO_INTEGRATORS, - TIMER_UPDATE_SIGNAL + TIMER_UPDATE_SIGNAL, + TIMER_UPDATE_RAMP, + TIMER_UPDATE_ANALOG, + TIMER_UPDATE_BLANK }; void vectrex_cart(device_slot_interface &device); @@ -64,7 +67,6 @@ protected: virtual void video_start() override; uint32_t screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(vectrex_imager_change_color); - TIMER_CALLBACK_MEMBER(update_level); TIMER_CALLBACK_MEMBER(vectrex_imager_eye); TIMER_CALLBACK_MEMBER(lightpen_trigger); TIMER_CALLBACK_MEMBER(vectrex_refresh); diff --git a/src/mame/machine/atarigen.cpp b/src/mame/machine/atarigen.cpp index 092fe5226cb..6bf9a5fa796 100644 --- a/src/mame/machine/atarigen.cpp +++ b/src/mame/machine/atarigen.cpp @@ -41,7 +41,7 @@ void atarigen_state::device_timer(emu_timer &timer, device_timer_id id, int para { // unhalt the CPU that was passed as a pointer case TID_UNHALT_CPU: - reinterpret_cast<device_t *>(ptr)->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); + m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); break; } } @@ -59,6 +59,8 @@ void atarigen_state::device_timer(emu_timer &timer, device_timer_id id, int para void atarigen_state::halt_until_hblank_0(device_t &device, screen_device &screen) { + assert(&device == m_maincpu); + // halt the CPU until the next HBLANK int hpos = screen.hpos(); int width = screen.width(); @@ -70,7 +72,7 @@ void atarigen_state::halt_until_hblank_0(device_t &device, screen_device &screen // halt and set a timer to wake up device.execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); - timer_set(screen.scan_period() * (hblank - hpos) / width, TID_UNHALT_CPU, 0, (void *)&device); + timer_set(screen.scan_period() * (hblank - hpos) / width, TID_UNHALT_CPU); } diff --git a/src/mame/machine/vectrex.cpp b/src/mame/machine/vectrex.cpp index e314e488ed8..993f22e0bb8 100644 --- a/src/mame/machine/vectrex.cpp +++ b/src/mame/machine/vectrex.cpp @@ -56,7 +56,7 @@ void vectrex_base_state::device_timer(emu_timer &timer, device_timer_id id, int vectrex_imager_change_color(ptr, param); break; case TIMER_UPDATE_LEVEL: - update_level(ptr, param); + m_imager_pinlevel = param; break; case TIMER_VECTREX_IMAGER_EYE: vectrex_imager_eye(ptr, param); @@ -71,7 +71,16 @@ void vectrex_base_state::device_timer(emu_timer &timer, device_timer_id id, int vectrex_zero_integrators(ptr, param); break; case TIMER_UPDATE_SIGNAL: - update_signal(ptr, param); + update_signal(nullptr, param); + break; + case TIMER_UPDATE_RAMP: + update_signal(&m_ramp, param); + break; + case TIMER_UPDATE_BLANK: + update_signal(&m_blank, param); + break; + case TIMER_UPDATE_ANALOG: + update_signal(&m_analog[param >> 8], param & 0xff); break; default: fatalerror("Unknown id in vectrex_base_state::device_timer"); @@ -230,13 +239,6 @@ TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_imager_change_color) } -TIMER_CALLBACK_MEMBER(vectrex_base_state::update_level) -{ - if (ptr) - * (uint8_t *) ptr = param; -} - - TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_imager_eye) { int coffset; @@ -258,7 +260,7 @@ TIMER_CALLBACK_MEMBER(vectrex_base_state::vectrex_imager_eye) m_via6522_0->write_ca1(1); m_via6522_0->write_ca1(0); m_imager_pinlevel |= 0x80; - timer_set(attotime::from_double(rtime / 360.0), TIMER_UPDATE_LEVEL, 0, &m_imager_pinlevel); + timer_set(attotime::from_double(rtime / 360.0), TIMER_UPDATE_LEVEL); } } } diff --git a/src/mame/video/fmtowns.cpp b/src/mame/video/fmtowns.cpp index ef6515700e9..f1f5d29a03d 100644 --- a/src/mame/video/fmtowns.cpp +++ b/src/mame/video/fmtowns.cpp @@ -1488,7 +1488,7 @@ INTERRUPT_GEN_MEMBER(towns_state::towns_vsync_irq) m_pic_slave->ir3_w(1); // IRQ11 = VSync if(IRQ_LOG) logerror("PIC: IRQ11 (VSync) set high\n"); m_video.towns_vblank_flag = 1; - machine().scheduler().timer_set(m_screen->time_until_vblank_end(), timer_expired_delegate(FUNC(towns_state::towns_vblank_end),this), 0, (void*)m_pic_slave); + machine().scheduler().timer_set(m_screen->time_until_vblank_end(), timer_expired_delegate(FUNC(towns_state::towns_vblank_end),this)); if(m_video.towns_tvram_enable) draw_text_layer(); if(m_video.towns_sprite_reg[1] & 0x80) diff --git a/src/mame/video/vectrex.cpp b/src/mame/video/vectrex.cpp index f0fa6031dbc..9bac886def1 100644 --- a/src/mame/video/vectrex.cpp +++ b/src/mame/video/vectrex.cpp @@ -275,7 +275,7 @@ void vectrex_state::video_start() void vectrex_base_state::vectrex_multiplexer(int mux) { - timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_SIGNAL, m_via_out[PORTA], &m_analog[mux]); + timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_ANALOG, m_via_out[PORTA] | (mux << 8)); if (mux == A_AUDIO) m_dac->write(m_via_out[PORTA] ^ 0x80); // not gate shown on schematic @@ -361,7 +361,7 @@ void vectrex_base_state::v_via_pb_w(uint8_t data) vectrex_multiplexer((data >> 1) & 0x3); m_via_out[PORTB] = data; - timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_SIGNAL, data & 0x80, &m_ramp); + timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_RAMP, data & 0x80); } @@ -369,7 +369,7 @@ void vectrex_base_state::v_via_pa_w(uint8_t data) { /* DAC output always goes to Y integrator */ m_via_out[PORTA] = data; - timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_SIGNAL, data, &m_analog[A_Y]); + timer_set(attotime::from_nsec(ANALOG_DELAY), TIMER_UPDATE_ANALOG, data | (A_Y << 8)); if (!(m_via_out[PORTB] & 0x1)) vectrex_multiplexer((m_via_out[PORTB] >> 1) & 0x3); @@ -406,7 +406,7 @@ WRITE_LINE_MEMBER(vectrex_base_state::v_via_cb2_w) } } - timer_set(attotime::zero, TIMER_UPDATE_SIGNAL, state, &m_blank); + timer_set(attotime::zero, TIMER_UPDATE_BLANK, state); m_cb2 = state; } } |