diff options
Diffstat (limited to 'src/devices/machine/bq48x2.h')
-rw-r--r-- | src/devices/machine/bq48x2.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/devices/machine/bq48x2.h b/src/devices/machine/bq48x2.h new file mode 100644 index 00000000000..6a25cc45b5f --- /dev/null +++ b/src/devices/machine/bq48x2.h @@ -0,0 +1,135 @@ +// license:BSD-3-Clause +// copyright-holders:Michael Zapf +/* + Texas Instruments/Benchmarq BQ4842/52 Real-time clock + + See bq48x2.cpp for details. + + Michael Zapf, April 2020 +*/ + +#ifndef MAME_MACHINE_BQ48X2_H +#define MAME_MACHINE_BQ48X2_H + +#pragma once + +#include "dirtc.h" + +// ======================> bq48x2_device + +class bq48x2_device : public device_t, + public device_nvram_interface, + public device_rtc_interface +{ +public: + auto interrupt_cb() { return m_interrupt_cb.bind(); } + auto resetout_cb() { return m_resetout_cb.bind(); } + + virtual uint8_t read(offs_t address); + virtual void write(offs_t address, uint8_t data); + + int intrq_r(); + + // Mainly used to disconnect from oscillator + void connect_osc(bool conn); + +protected: + // construction/destruction (called from the subtypes) + bq48x2_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, int memsize); + + // callback called when interrupt pin state changes (may be nullptr) + devcb_write_line m_interrupt_cb; + + // callback called when watchdog times out changes (may be nullptr) + devcb_write_line m_resetout_cb; + + // Internal memory + std::unique_ptr<u8 []> m_sram; + + // Internal clock registers + // The clock operates on these registers and copies them to the + // registers in the address space + uint8_t m_intreg[16]; + + TIMER_CALLBACK_MEMBER(rtc_clock_cb); + TIMER_CALLBACK_MEMBER(rtc_periodic_cb); + TIMER_CALLBACK_MEMBER(rtc_watchdog_cb); + + void nvram_default() override; + bool nvram_read(util::read_stream &file) override; + bool nvram_write(util::write_stream &file) override; + + void device_start() override; + + void set_watchdog_timer(); + +private: + // Inherited from device_rtc_interface + void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override; + bool rtc_feature_y2k() const override { return false; } + bool rtc_feature_leap_year() const override { return true; } + bool rtc_battery_backed() const override { return true; } + + // Sanity-check BCD number + bool valid_bcd(uint8_t value, uint8_t min, uint8_t max); + + // Increment BCD number + bool increment_bcd(uint8_t& bcdnumber, uint8_t limit, uint8_t min); + + // Fetch register value from SRAM using register number + uint8_t get_register(int number, uint8_t mask); + + // Set a register in SRAM using the register number + void set_register(int number, uint8_t value); + + // Set/Reset one or more bits in the register + void set_register(int number, uint8_t bits, bool set); + + // Check matching registers of time and alarm + bool check_match(int regint, int regalarm, uint8_t mask); + + // Check bits in register + bool is_set(int number, uint8_t flag); + + // Advance + void advance_days_bcd(); + + // Copy register contents from the internal registers to SRAM or back + void transfer_to_int(); + void transfer_to_access(); + + // clock timer: called every second + emu_timer *m_clock_timer; + + // Periodic timer + emu_timer *m_periodic_timer; + + // Watchdog timer + emu_timer *m_watchdog_timer; + + // Set timers + void set_periodic_timer(); + + // Get the delay until the next second + int get_delay(); + + int m_memsize; +}; + +// Special types + +class bq4842_device : public bq48x2_device +{ +public: + bq4842_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + +class bq4852_device : public bq48x2_device +{ +public: + bq4852_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); +}; + +DECLARE_DEVICE_TYPE(BQ4842, bq4842_device) +DECLARE_DEVICE_TYPE(BQ4852, bq4852_device) +#endif |