diff options
Diffstat (limited to 'src/devices/machine/ds1207.h')
-rw-r--r-- | src/devices/machine/ds1207.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/devices/machine/ds1207.h b/src/devices/machine/ds1207.h new file mode 100644 index 00000000000..0af76453178 --- /dev/null +++ b/src/devices/machine/ds1207.h @@ -0,0 +1,122 @@ +// license:BSD-3-Clause +// copyright-holders:Paul-Arnold +/* + * ds1207.h + * + * Time Key + * + */ + +#ifndef MAME_MACHINE_DS1207_H +#define MAME_MACHINE_DS1207_H + +#pragma once + +#include "dirtc.h" + +class ds1207_device : public device_t, public device_nvram_interface, public device_rtc_interface +{ +public: + // construction/destruction + ds1207_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + void write_rst(int state); + void write_clk(int state); + void write_dq(int state); + int read_dq(); + +protected: + // device-level overrides + virtual void device_start() override ATTR_COLD; + virtual void device_reset() override ATTR_COLD; + + // device_nvram_interface overrides + virtual void nvram_default() 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 true; } + 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; + +private: + void new_state(uint8_t state); + void writebit(uint8_t *buffer); + void readbit(uint8_t *buffer); + void set_start_time(); + void adjust_days_left(); + void adjust_time_into_day(); + + enum state_t + { + STATE_STOP, + STATE_PROTOCOL, + STATE_READ_IDENTIFICATION, + STATE_WRITE_IDENTIFICATION, + STATE_WRITE_COMPARE_REGISTER, + STATE_WRITE_SECURITY_MATCH, + STATE_READ_SECURE_MEMORY, + STATE_WRITE_SECURE_MEMORY, + STATE_OUTPUT_GARBLED_DATA, + STATE_READ_DAY_CLOCK, + STATE_READ_DAYS_REMAINING, + STATE_WRITE_DAYS_REMAINING + }; + + enum command_t + { + COMMAND_READ = 0x62, + COMMAND_WRITE = 0x9d, + COMMAND_READ_DAY_CLOCK = 0xf1, + COMMAND_WRITE_DAYS_REMAINING = 0xf2, + COMMAND_READ_DAYS_REMAINING = 0xf3, + COMMAND_STOP_OSCILLATOR = 0xf4, + COMMAND_ARM_OSCILLATOR = 0xf5, + COMMAND_LOCK_DAYS_COUNT = 0xf6 + }; + + enum cycle_t + { + CYCLE_NORMAL = 1, + CYCLE_PROGRAM = 2, + CYCLE_MASK = 3 + }; + + enum device_state_t + { + OSC_ENABLED = 1, + OSC_RUNNING = 2, + DAYS_LOCKED = 4, + DAYS_EXPIRED = 8 + }; + + static const int8_t DQ_HIGH_IMPEDANCE = -1; + + optional_memory_region m_region; + + uint8_t m_rst; + uint8_t m_clk; + uint8_t m_dqw; + int8_t m_dqr; + uint8_t m_state; + uint16_t m_bit; + uint64_t m_startup_time; + uint64_t m_last_update_time; + uint8_t m_command[3]; + uint8_t m_day_clock[3]; + uint8_t m_compare_register[8]; + uint8_t m_unique_pattern[2]; + uint8_t m_identification[8]; + uint8_t m_security_match[8]; + uint8_t m_secure_memory[48]; + uint8_t m_days_left[2]; + uint8_t m_start_time[8]; + uint8_t m_device_state; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(DS1207, ds1207_device) + +#endif // MAME_MACHINE_DS1207_H |