diff options
Diffstat (limited to 'src/devices/machine/mc146818.h')
-rw-r--r-- | src/devices/machine/mc146818.h | 56 |
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 |