summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/xtal.h
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-06-16 12:47:52 +0200
committer Olivier Galibert <galibert@pobox.com>2025-04-29 23:06:41 +0200
commit45d4cd52a8194f2ef9e0383cfb2e2a35634af6ff (patch)
tree4e8d8fcb7382a5e9e0bce5ec59939bcfbe67155a /src/emu/xtal.h
parent5c14bcdfcb4aefb71b5b62387c4ad05dbeb3814e (diff)
full xtal conversionxtal
Diffstat (limited to 'src/emu/xtal.h')
-rw-r--r--src/emu/xtal.h41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/emu/xtal.h b/src/emu/xtal.h
index b58f00943b2..700e75e730f 100644
--- a/src/emu/xtal.h
+++ b/src/emu/xtal.h
@@ -45,27 +45,47 @@ Usage:
class XTAL {
public:
+ constexpr explicit XTAL() : m_base_clock(0), m_current_clock(0), m_disable_validation(true) {}
- constexpr explicit XTAL(double base_clock) : m_base_clock(base_clock), m_current_clock(base_clock) {}
+ constexpr explicit XTAL(double base_clock) : m_base_clock(base_clock), m_current_clock(base_clock), m_disable_validation(true) {}
constexpr double dvalue() const noexcept { return m_current_clock; }
constexpr u32 value() const noexcept { return u32(m_current_clock + 1e-3); }
constexpr double base() const noexcept { return m_base_clock; }
- template <typename T> constexpr XTAL operator *(T &&mult) const noexcept { return XTAL(m_base_clock, m_current_clock * mult); }
- template <typename T> constexpr XTAL operator /(T &&div) const noexcept { return XTAL(m_base_clock, m_current_clock / div); }
+ template <typename T> constexpr XTAL operator *(T &&mult) const noexcept { return XTAL(m_base_clock, m_current_clock * mult, m_disable_validation); }
+ template <typename T> constexpr XTAL operator /(T &&div) const noexcept { return XTAL(m_base_clock, m_current_clock / div, m_disable_validation); }
friend constexpr XTAL operator *(int mult, const XTAL &xtal);
friend constexpr XTAL operator *(unsigned int mult, const XTAL &xtal);
- friend constexpr XTAL operator *(double mult, const XTAL &xtal);
+ friend constexpr XTAL operator *(const XTAL &xtal, int mult);
+ friend constexpr XTAL operator *(const XTAL &xtal, unsigned int mult);
+ friend constexpr XTAL operator /(const XTAL &xtal, int div);
+ friend constexpr XTAL operator /(const XTAL &xtal, unsigned int div);
+
+ static constexpr XTAL u(unsigned int clock);
void validate(const char *message) const;
void validate(const std::string &message) const;
+ bool disabled() const noexcept { return m_base_clock == 0; }
+ bool enabled() const noexcept { return m_base_clock != 0; }
+
+ bool operator == (const XTAL &clock) const {
+ return clock.m_base_clock == m_base_clock && clock.m_current_clock == m_current_clock;
+ }
+
+ bool operator != (const XTAL &clock) const {
+ return !(*this == clock);
+ }
+
+
private:
+ friend class save_manager;
double m_base_clock, m_current_clock;
+ bool m_disable_validation;
- constexpr XTAL(double base_clock, double current_clock) noexcept : m_base_clock(base_clock), m_current_clock(current_clock) {}
+ constexpr XTAL(double base_clock, double current_clock, bool disable_validation) noexcept : m_base_clock(base_clock), m_current_clock(current_clock), m_disable_validation(disable_validation) {}
static const double known_xtals[];
static double last_correct_value, xtal_error_low, xtal_error_high;
@@ -76,9 +96,14 @@ private:
template <typename T> constexpr auto operator /(T &&div, const XTAL &xtal) { return div / xtal.dvalue(); }
-constexpr XTAL operator *(int mult, const XTAL &xtal) { return XTAL(xtal.base(), mult * xtal.dvalue()); }
-constexpr XTAL operator *(unsigned int mult, const XTAL &xtal) { return XTAL(xtal.base(), mult * xtal.dvalue()); }
-constexpr XTAL operator *(double mult, const XTAL &xtal) { return XTAL(xtal.base(), mult * xtal.dvalue()); }
+constexpr XTAL operator *(int mult, const XTAL &xtal) { return XTAL(xtal.base(), xtal.dvalue() * mult, xtal.m_disable_validation); }
+constexpr XTAL operator *(unsigned int mult, const XTAL &xtal) { return XTAL(xtal.base(), xtal.dvalue() * mult, xtal.m_disable_validation); }
+constexpr XTAL operator *(const XTAL &xtal, int mult) { return XTAL(xtal.base(), xtal.dvalue() * mult, xtal.m_disable_validation); }
+constexpr XTAL operator *(const XTAL &xtal, unsigned int mult) { return XTAL(xtal.base(), xtal.dvalue() * mult, xtal.m_disable_validation); }
+constexpr XTAL operator /(const XTAL &xtal, int div) { return XTAL(xtal.base(), xtal.dvalue() / div, xtal.m_disable_validation); }
+constexpr XTAL operator /(const XTAL &xtal, unsigned int div) { return XTAL(xtal.base(), xtal.dvalue() / div, xtal.m_disable_validation); }
+
+constexpr XTAL XTAL::u(unsigned int clock) { return XTAL(clock, clock, true); }
constexpr XTAL operator ""_Hz_XTAL(long double clock) { return XTAL(double(clock)); }
constexpr XTAL operator ""_kHz_XTAL(long double clock) { return XTAL(double(clock * 1e3)); }