diff options
author | 2022-06-16 12:47:52 +0200 | |
---|---|---|
committer | 2025-04-29 23:06:41 +0200 | |
commit | 45d4cd52a8194f2ef9e0383cfb2e2a35634af6ff (patch) | |
tree | 4e8d8fcb7382a5e9e0bce5ec59939bcfbe67155a /src/emu/xtal.h | |
parent | 5c14bcdfcb4aefb71b5b62387c4ad05dbeb3814e (diff) |
full xtal conversionxtal
Diffstat (limited to 'src/emu/xtal.h')
-rw-r--r-- | src/emu/xtal.h | 41 |
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)); } |