summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/mc146818.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/mc146818.h')
-rw-r--r--src/devices/machine/mc146818.h56
1 files changed, 40 insertions, 16 deletions
diff --git a/src/devices/machine/mc146818.h b/src/devices/machine/mc146818.h
index 96acaa7fc62..1bee70ec6c9 100644
--- a/src/devices/machine/mc146818.h
+++ b/src/devices/machine/mc146818.h
@@ -16,9 +16,12 @@
#pragma once
+#include "dirtc.h"
+
class mc146818_device : public device_t,
- public device_nvram_interface
+ public device_nvram_interface,
+ public device_rtc_interface
{
public:
// construction/destruction
@@ -31,34 +34,38 @@ public:
// The MC146818 doesn't have century support (some variants do), but when syncing the date & time at startup we can optionally store the century.
void set_century_index(int century_index) { assert(!century_count_enabled()); m_century_index = century_index; }
- // The MC146818 doesn't have UTC support, but when syncing the data & time at startup we can use UTC instead of local time.
- void set_use_utc(bool use_utc) { m_use_utc = use_utc; }
-
void set_binary(bool binary) { m_binary = binary; }
void set_24hrs(bool hour) { m_hour = hour; }
void set_epoch(int epoch) { m_epoch = epoch; }
- void set_binary_year(int bin) { m_binyear = bin; }
// read/write access
- uint8_t read(offs_t offset);
- void write(offs_t offset, uint8_t data);
+ void address_w(uint8_t data);
+ uint8_t data_r();
+ void data_w(uint8_t data);
// direct-mapped read/write access
uint8_t read_direct(offs_t offset);
void write_direct(offs_t offset, uint8_t data);
+ // FIXME: Addresses are read-only on a standard MC146818. Do some chipsets permit readback?
+ uint8_t get_address() const { return m_index; }
+
protected:
mc146818_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_nvram_interface overrides
virtual void nvram_default() override;
- virtual void nvram_read(emu_file &file) override;
- virtual void nvram_write(emu_file &file) override;
+ virtual bool nvram_read(util::read_stream &file) override;
+ virtual bool nvram_write(util::write_stream &file) override;
+
+ // device_rtc_interface overrides
+ virtual bool rtc_feature_y2k() const override { return m_epoch != 0 || m_century_index >= 0; }
+ virtual bool rtc_feature_leap_year() const override { return true; }
+ virtual void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override;
static constexpr unsigned char ALARM_DONTCARE = 0xc0;
static constexpr unsigned char HOURS_PM = 0x80;
@@ -71,6 +78,10 @@ protected:
virtual uint8_t internal_read(offs_t offset);
virtual void internal_write(offs_t offset, uint8_t data);
+ TIMER_CALLBACK_MEMBER(periodic_tick);
+ TIMER_CALLBACK_MEMBER(clock_tick);
+ TIMER_CALLBACK_MEMBER(time_tick);
+
enum
{
REG_SECONDS = 0,
@@ -129,7 +140,6 @@ protected:
// internal helpers
int to_ram(int a) const;
int from_ram(int a) const;
- void set_base_datetime();
void update_irq();
void update_timer();
virtual int get_timer_bypass() const;
@@ -157,10 +167,6 @@ protected:
uint8_t m_index;
std::unique_ptr<uint8_t[]> m_data;
- static const device_timer_id TIMER_CLOCK = 0;
- static const device_timer_id TIMER_UPDATE = 1;
- static const device_timer_id TIMER_PERIODIC = 2;
-
emu_timer *m_clock_timer;
emu_timer *m_update_timer;
emu_timer *m_periodic_timer;
@@ -168,7 +174,7 @@ protected:
devcb_write_line m_write_irq;
devcb_write_line m_write_sqw;
int m_century_index, m_epoch;
- bool m_use_utc, m_binary, m_hour, m_binyear;
+ bool m_binary, m_hour;
bool m_sqw_state;
unsigned m_tuc; // update cycle time
};
@@ -179,8 +185,26 @@ public:
ds1287_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
+class ds1397_device : public mc146818_device
+{
+public:
+ ds1397_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ u8 xram_r(offs_t offset);
+ void xram_w(offs_t offset, u8 data);
+
+protected:
+ virtual int data_size() const override { return 64 + 4096; }
+
+ u8 m_xram_page;
+};
+
// device type definition
DECLARE_DEVICE_TYPE(MC146818, mc146818_device)
DECLARE_DEVICE_TYPE(DS1287, ds1287_device)
+DECLARE_DEVICE_TYPE(DS1397, ds1397_device)
#endif // MAME_MACHINE_MC146818_H