summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/dirtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/dirtc.c')
-rw-r--r--trunk/src/emu/dirtc.c224
1 files changed, 224 insertions, 0 deletions
diff --git a/trunk/src/emu/dirtc.c b/trunk/src/emu/dirtc.c
new file mode 100644
index 00000000000..c230f1eb856
--- /dev/null
+++ b/trunk/src/emu/dirtc.c
@@ -0,0 +1,224 @@
+/***************************************************************************
+
+ dirtc.c
+
+ Device Real Time Clock interfaces.
+
+***************************************************************************/
+
+#include "emu.h"
+
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+static const int DAYS_PER_MONTH[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+
+
+
+//**************************************************************************
+// DEVICE RTC INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_rtc_interface - constructor
+//-------------------------------------------------
+
+device_rtc_interface::device_rtc_interface(const machine_config &mconfig, device_t &device)
+ : device_interface(device)
+{
+}
+
+
+//-------------------------------------------------
+// ~device_rtc_interface - destructor
+//-------------------------------------------------
+
+device_rtc_interface::~device_rtc_interface()
+{
+}
+
+
+//-------------------------------------------------
+// set_time - called to initialize the RTC to
+// a known date/time
+//-------------------------------------------------
+
+void device_rtc_interface::set_time(bool update, int year, int month, int day, int day_of_week, int hour, int minute, int second)
+{
+ if (!rtc_feature_y2k())
+ {
+ year %= 100;
+ }
+
+ set_clock_register(RTC_YEAR, year);
+ set_clock_register(RTC_MONTH, month);
+ set_clock_register(RTC_DAY, day);
+ set_clock_register(RTC_DAY_OF_WEEK, day_of_week);
+ set_clock_register(RTC_HOUR, hour);
+ set_clock_register(RTC_MINUTE, minute);
+ set_clock_register(RTC_SECOND, second);
+
+ if (update)
+ {
+ rtc_clock_updated(m_register[RTC_YEAR], m_register[RTC_MONTH], m_register[RTC_DAY], m_register[RTC_DAY_OF_WEEK],
+ m_register[RTC_HOUR], m_register[RTC_MINUTE], m_register[RTC_SECOND]);
+ }
+}
+
+
+//-------------------------------------------------
+// set_current_time - called to initialize the RTC
+// to the current system time
+//-------------------------------------------------
+
+void device_rtc_interface::set_current_time(running_machine &machine)
+{
+ system_time systime;
+ machine.base_datetime(systime);
+
+ set_time(true, systime.local_time.year, systime.local_time.month + 1, systime.local_time.mday, systime.local_time.weekday + 1,
+ systime.local_time.hour, systime.local_time.minute, systime.local_time.second);
+}
+
+
+//-------------------------------------------------
+// convert_to_bcd -
+//-------------------------------------------------
+
+UINT8 device_rtc_interface::convert_to_bcd(int val)
+{
+ return ((val / 10) << 4) | (val % 10);
+}
+
+
+//-------------------------------------------------
+// bcd_to_integer -
+//-------------------------------------------------
+
+int device_rtc_interface::bcd_to_integer(UINT8 val)
+{
+ return (((val & 0xf0) >> 4) * 10) + (val & 0x0f);
+}
+
+
+//-------------------------------------------------
+// set_clock_register -
+//-------------------------------------------------
+
+void device_rtc_interface::set_clock_register(int reg, int value)
+{
+ m_register[reg] = value;
+}
+
+
+//-------------------------------------------------
+// get_clock_register -
+//-------------------------------------------------
+
+int device_rtc_interface::get_clock_register(int reg)
+{
+ return m_register[reg];
+}
+
+
+//-------------------------------------------------
+// clock_updated -
+//-------------------------------------------------
+
+void device_rtc_interface::clock_updated()
+{
+ rtc_clock_updated(m_register[RTC_YEAR], m_register[RTC_MONTH], m_register[RTC_DAY], m_register[RTC_DAY_OF_WEEK],
+ m_register[RTC_HOUR], m_register[RTC_MINUTE], m_register[RTC_SECOND]);
+}
+
+
+//-------------------------------------------------
+// advance_seconds -
+//-------------------------------------------------
+
+void device_rtc_interface::advance_seconds()
+{
+ m_register[RTC_SECOND]++;
+
+ if (m_register[RTC_SECOND] == 60)
+ {
+ m_register[RTC_SECOND] = 0;
+
+ advance_minutes();
+ }
+ else
+ {
+ clock_updated();
+ }
+}
+
+
+//-------------------------------------------------
+// advance_clock -
+//-------------------------------------------------
+
+void device_rtc_interface::advance_minutes()
+{
+ m_register[RTC_MINUTE]++;
+
+ if (m_register[RTC_MINUTE] == 60)
+ {
+ m_register[RTC_MINUTE] = 0;
+ m_register[RTC_HOUR]++;
+ }
+
+ if (m_register[RTC_HOUR] == 24)
+ {
+ m_register[RTC_HOUR] = 0;
+ m_register[RTC_DAY]++;
+ m_register[RTC_DAY_OF_WEEK]++;
+ }
+
+ if (m_register[RTC_DAY_OF_WEEK] == 8)
+ {
+ m_register[RTC_DAY_OF_WEEK] = 1;
+ }
+
+ if (m_register[RTC_DAY] > DAYS_PER_MONTH[m_register[RTC_MONTH] - 1])
+ {
+ m_register[RTC_DAY] = 1;
+ m_register[RTC_MONTH]++;
+ }
+
+ if (m_register[RTC_MONTH] == 13)
+ {
+ m_register[RTC_MONTH] = 1;
+ m_register[RTC_YEAR]++;
+
+ if (!rtc_feature_y2k() && m_register[RTC_YEAR] == 100)
+ {
+ m_register[RTC_YEAR] = 0;
+ }
+ }
+
+ clock_updated();
+}
+
+
+//-------------------------------------------------
+// adjust_seconds -
+//-------------------------------------------------
+
+void device_rtc_interface::adjust_seconds()
+{
+ int seconds = get_clock_register(RTC_SECOND);
+
+ set_clock_register(RTC_SECOND, 0);
+
+ if (seconds >= 30)
+ {
+ advance_minutes();
+ }
+ else
+ {
+ clock_updated();
+ }
+}