summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commitab254604afa2a933d57c78bb8f5890f6c90a4732 (patch)
tree3aac549d25268fa6aa754f8f6d55f74fff81dd64
parentebf3216c0b21a9900ffc8c1ead690484e162bdab (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.cpp6
-rw-r--r--src/devices/video/zeus2.cpp2
-rw-r--r--src/emu/device.cpp4
-rw-r--r--src/emu/device.h4
-rw-r--r--src/emu/diexec.cpp4
-rw-r--r--src/emu/schedule.cpp83
-rw-r--r--src/emu/schedule.h54
-rw-r--r--src/frontend/mame/luaengine.cpp2
-rw-r--r--src/mame/audio/dcs.cpp42
-rw-r--r--src/mame/audio/dcs.h9
-rw-r--r--src/mame/includes/vectrex.h6
-rw-r--r--src/mame/machine/atarigen.cpp6
-rw-r--r--src/mame/machine/vectrex.cpp22
-rw-r--r--src/mame/video/fmtowns.cpp2
-rw-r--r--src/mame/video/vectrex.cpp8
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 &timeslice_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;
}
}