// license:BSD-3-Clause
// copyright-holders:AJR
/**********************************************************************
Dallas DS17x85/DS17x87 Real Time Clocks with extended NVSRAM
***********************************************************************
_____ _____
/PWR 1 |* \_/ | 24 Vcc
(DS17x87: N.C.) X1 2 | | 23 SQW
(DS17x87: N.C.) X2 3 | | 22 Vbaux
AD0 4 | | 21 /RCLR
AD1 5 | DS168x | 20 Vbat (DS17x87: N.C.)
AD2 6 | DS1728x | 19 /IRQ
AD3 7 | DS1748x | 18 /KS
AD4 8 | DS1788x | 17 /RD
AD5 9 | | 16 GND (DS17x87: N.C.)
AD6 10 | | 15 /WR
AD7 11 | | 14 ALE
GND 12 |_____________| 13 /CS
**********************************************************************/
#ifndef MAME_MACHINE_DS17X85_H
#define MAME_MACHINE_DS17X85_H
#pragma once
#include "mc146818.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> ds17x85_device
class ds17x85_device : public mc146818_device
{
protected:
enum
{
REG_EXT_MODEL = 0x40 + 0x40,
REG_EXT_SERIAL1 = 0x40 + 0x41,
REG_EXT_SERIAL2 = 0x40 + 0x42,
REG_EXT_SERIAL3 = 0x40 + 0x43,
REG_EXT_SERIAL4 = 0x40 + 0x44,
REG_EXT_SERIAL5 = 0x40 + 0x45,
REG_EXT_SERIAL6 = 0x40 + 0x46,
REG_EXT_SERIAL_CRC = 0x40 + 0x47,
REG_EXT_CENTURY = 0x40 + 0x48,
REG_EXT_DATE_ALARM = 0x40 + 0x49,
REG_EXT_4A = 0x40 + 0x4a,
REG_EXT_4B = 0x40 + 0x4b,
REG_EXT_SMI_STACK2 = 0x40 + 0x4e,
REG_EXT_SMI_STACK3 = 0x40 + 0x4f,
REG_EXT_RAM_ADDRL = 0x40 + 0x50,
REG_EXT_RAM_ADDRH = 0x40 + 0x51,
REG_EXT_RAM_DATA = 0x40 + 0x53,
REG_EXT_WRITE_COUNTER = 0x40 + 0x5e,
REG_EXT_RAM_BASE = 0x40 + 0x80
};
enum
{
REG_EXT_4A_VRT2 = 0x80,
REG_EXT_4A_INCR = 0x40,
REG_EXT_4A_BME = 0x20,
REG_EXT_4A_PAB = 0x08,
REG_EXT_4A_RF = 0x04,
REG_EXT_4A_WF = 0x02,
REG_EXT_4A_KF = 0x01
};
enum
{
REG_EXT_4B_ABE = 0x80,
REG_EXT_4B_E32k = 0x40,
REG_EXT_4B_CS = 0x20,
REG_EXT_4B_RCE = 0x10,
REG_EXT_4B_PRS = 0x08,
REG_EXT_4B_RIE = 0x04,
REG_EXT_4B_WIE = 0x02,
REG_EXT_4B_KSE = 0x01
};
ds17x85_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 model, u32 extram_size);
// device-specific overrides
virtual void device_start() override;
// device_nvram_interface overrides
virtual void nvram_default() override;
// mc146818_device overrides
virtual int data_size() const override { return REG_EXT_RAM_BASE + m_extram_size; }
virtual int data_logical_size() const override { return 128; }
virtual bool century_count_enabled() const override { return true; }
virtual int get_timer_bypass() const override;
virtual void internal_set_address(uint8_t data) override;
virtual uint8_t internal_read(offs_t offset) override;
virtual void internal_write(offs_t offset, uint8_t data) override;
private:
const u8 m_model;
const u32 m_extram_size;
u8 m_smi_stack1;
};
// ======================> ds1685_device
class ds1685_device : public ds17x85_device
{
public:
// device type constructor
ds1685_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds1687_device
class ds1687_device : public ds17x85_device
{
public:
// device type constructor
ds1687_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds17285_device
class ds17285_device : public ds17x85_device
{
public:
// device type constructor
ds17285_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds17287_device
class ds17287_device : public ds17x85_device
{
public:
// device type constructor
ds17287_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds17485_device
class ds17485_device : public ds17x85_device
{
public:
// device type constructor
ds17485_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds17487_device
class ds17487_device : public ds17x85_device
{
public:
// device type constructor
ds17487_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds17885_device
class ds17885_device : public ds17x85_device
{
public:
// device type constructor
ds17885_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// ======================> ds17887_device
class ds17887_device : public ds17x85_device
{
public:
// device type constructor
ds17887_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
// device type declarations
DECLARE_DEVICE_TYPE(DS1685, ds1685_device)
DECLARE_DEVICE_TYPE(DS1687, ds1687_device)
DECLARE_DEVICE_TYPE(DS17285, ds17285_device)
DECLARE_DEVICE_TYPE(DS17287, ds17287_device)
DECLARE_DEVICE_TYPE(DS17485, ds17485_device)
DECLARE_DEVICE_TYPE(DS17487, ds17487_device)
DECLARE_DEVICE_TYPE(DS17885, ds17885_device)
DECLARE_DEVICE_TYPE(DS17887, ds17887_device)
#endif // MAME_MACHINE_DS17X85_H