summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-05-17 10:13:11 +0200
committer GitHub <noreply@github.com>2022-05-17 10:13:11 +0200
commit77df4095aa879981e3a3f5c21f167b2d0691ed62 (patch)
tree30d207242bfdf39e271e3b6123e0c378c6454860 /src/emu
parentc5b07e0fe76e452a1e0b14b09c8b70a9620a7412 (diff)
diexec: optionally resynchronize to the implicit clock domain on clock frequency change (#9726)
apple3: resync on clock change to keep the correct phase relationship with the diskiii
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/device.cpp10
-rw-r--r--src/emu/device.h11
-rw-r--r--src/emu/diexec.cpp6
-rw-r--r--src/emu/diexec.h2
4 files changed, 17 insertions, 12 deletions
diff --git a/src/emu/device.cpp b/src/emu/device.cpp
index 90441ceebd8..6a4b0d4b685 100644
--- a/src/emu/device.cpp
+++ b/src/emu/device.cpp
@@ -365,7 +365,7 @@ void device_t::reset()
// unscaled clock
//-------------------------------------------------
-void device_t::set_unscaled_clock(u32 clock)
+void device_t::set_unscaled_clock(u32 clock, bool sync_on_new_clock_domain)
{
// do nothing if no actual change
if (clock == m_unscaled_clock)
@@ -381,7 +381,7 @@ void device_t::set_unscaled_clock(u32 clock)
// if the device has already started, make sure it knows about the new clock
if (m_started)
- notify_clock_changed();
+ notify_clock_changed(sync_on_new_clock_domain);
}
@@ -716,11 +716,11 @@ void device_t::post_load()
// that the clock has changed
//-------------------------------------------------
-void device_t::notify_clock_changed()
+void device_t::notify_clock_changed(bool sync_on_new_clock_domain)
{
// first notify interfaces
for (device_interface &intf : interfaces())
- intf.interface_clock_changed();
+ intf.interface_clock_changed(sync_on_new_clock_domain);
// then notify the device
device_clock_changed();
@@ -1202,7 +1202,7 @@ void device_interface::interface_post_load()
// implementation
//-------------------------------------------------
-void device_interface::interface_clock_changed()
+void device_interface::interface_clock_changed(bool sync_on_new_clock_domain)
{
// do nothing by default
}
diff --git a/src/emu/device.h b/src/emu/device.h
index 9b97f21c8ea..4ea1a940320 100644
--- a/src/emu/device.h
+++ b/src/emu/device.h
@@ -696,9 +696,10 @@ public:
// clock/timing accessors
u32 clock() const { return m_clock; }
u32 unscaled_clock() const { return m_unscaled_clock; }
- void set_unscaled_clock(u32 clock);
- void set_unscaled_clock(const XTAL &xtal) { set_unscaled_clock(xtal.value()); }
- void set_unscaled_clock_int(u32 clock) { set_unscaled_clock(clock); } // non-overloaded name because binding to overloads is ugly
+ void set_unscaled_clock(u32 clock, bool sync_on_new_clock_domain = false);
+ void set_unscaled_clock(const XTAL &xtal, bool sync_on_new_clock_domain = false) { set_unscaled_clock(xtal.value(), sync_on_new_clock_domain); }
+ void set_unscaled_clock_int(u32 clock) { set_unscaled_clock(clock, false); } // non-overloaded name because binding to overloads is ugly
+ void set_unscaled_clock_int_sync(u32 clock) { set_unscaled_clock(clock, true); } // non-overloaded name because binding to overloads is ugly
double clock_scale() const { return m_clock_scale; }
void set_clock_scale(double clockscale);
attotime clocks_to_attotime(u64 clocks) const noexcept;
@@ -834,7 +835,7 @@ protected:
void debug_setup();
void pre_save();
void post_load();
- void notify_clock_changed();
+ void notify_clock_changed(bool sync_on_new_clock_domain = false);
finder_base *register_auto_finder(finder_base &autodev);
void register_callback(devcb_base &callback);
@@ -1182,7 +1183,7 @@ public:
/// \sa interface_pre_save device_t::device_post_load
virtual void interface_post_load() ATTR_COLD;
- virtual void interface_clock_changed();
+ virtual void interface_clock_changed(bool sync_on_new_clock_domain);
virtual void interface_debug_setup();
private:
diff --git a/src/emu/diexec.cpp b/src/emu/diexec.cpp
index 1ff53672470..0e9074fe3b2 100644
--- a/src/emu/diexec.cpp
+++ b/src/emu/diexec.cpp
@@ -475,7 +475,7 @@ void device_execute_interface::interface_post_reset()
// information for this device
//-------------------------------------------------
-void device_execute_interface::interface_clock_changed()
+void device_execute_interface::interface_clock_changed(bool sync_on_new_clock_domain)
{
// a clock of zero disables the device
if (device().clock() == 0)
@@ -492,6 +492,10 @@ void device_execute_interface::interface_clock_changed()
m_cycles_per_second = clocks_to_cycles(device().clock());
m_attoseconds_per_cycle = HZ_TO_ATTOSECONDS(m_cycles_per_second);
+ // resynchronize the localtime to the clock domain when asked to
+ if (sync_on_new_clock_domain)
+ m_localtime = attotime::from_ticks(m_localtime.as_ticks(device().clock())+1, device().clock());
+
// update the device's divisor
s64 attos = m_attoseconds_per_cycle;
m_divshift = 0;
diff --git a/src/emu/diexec.h b/src/emu/diexec.h
index 065248a9046..1490c20389d 100644
--- a/src/emu/diexec.h
+++ b/src/emu/diexec.h
@@ -216,7 +216,7 @@ protected:
virtual void interface_post_start() override;
virtual void interface_pre_reset() override;
virtual void interface_post_reset() override;
- virtual void interface_clock_changed() override;
+ virtual void interface_clock_changed(bool sync_on_new_clock_domain) override;
// for use by devcpu for now...
int current_input_state(unsigned i) const { return m_input[i].m_curstate; }