// license:BSD-3-Clause
// copyright-holders:Curt Coder, hap
/**********************************************************************
NEC uPD1990AC Serial I/O Calendar & Clock emulation
**********************************************************************
_____ _____
C2 1 |* \_/ | 14 Vdd
C1 2 | | 13 XTAL
C0 3 | | 12 _XTAL
STB 4 | uPD1990AC | 11 OUT ENBL
CS 5 | | 10 TP
DATA IN 6 | | 9 DATA OUT
GND 7 |_____________| 8 CLK
**********************************************************************/
#ifndef MAME_MACHINE_UPD1990A_H
#define MAME_MACHINE_UPD1990A_H
#pragma once
#include "dirtc.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> upd1990a_device
class upd1990a_device : public device_t, public device_rtc_interface
{
public:
// construction/destruction
upd1990a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 32'768);
auto data_callback() { return m_write_data.bind(); }
auto tp_callback() { return m_write_tp.bind(); }
void oe_w(int state);
void cs_w(int state);
void stb_w(int state);
void clk_w(int state);
void c0_w(int state);
void c1_w(int state);
void c2_w(int state);
void data_in_w(int state);
int data_out_r();
int tp_r();
protected:
// device-level overrides
upd1990a_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant);
virtual void device_start() override;
// device_rtc_interface overrides
virtual void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override;
TIMER_CALLBACK_MEMBER(clock_tick);
TIMER_CALLBACK_MEMBER(tp_tick);
TIMER_CALLBACK_MEMBER(data_out_tick);
TIMER_CALLBACK_MEMBER(test_tick);
enum
{
TYPE_1990A = 0,
TYPE_4990A
};
private:
enum
{
MODE_REGISTER_HOLD = 0,
MODE_SHIFT,
MODE_TIME_SET,
MODE_TIME_READ,
MODE_TP_64HZ,
MODE_TP_256HZ,
MODE_TP_2048HZ,
MODE_TP_4096HZ,
MODE_TP_1S_INT,
MODE_TP_10S_INT,
MODE_TP_30S_INT,
MODE_TP_60S_INT,
MODE_INT_RESET_OUTPUT,
MODE_INT_RUN_CLOCK,
MODE_INT_STOP_CLOCK,
MODE_TEST
};
devcb_write_line m_write_data;
devcb_write_line m_write_tp;
uint8_t m_time_counter[6]; // time counter
uint8_t m_shift_reg[7]; // shift register (40 bits, or 48 bits + serial command register)
int m_oe; // output enable
int m_cs; // chip select
int m_stb; // strobe
int m_data_in; // data in
int m_data_out; // data out
int m_c; // latched command
int m_clk; // shift clock
int m_tp; // time pulse
int m_c_unlatched; // command waiting for STB
bool m_testmode; // testmode active
int const m_variant;
// timers
emu_timer *m_timer_clock;
emu_timer *m_timer_tp;
emu_timer *m_timer_data_out;
emu_timer *m_timer_test_mode;
bool is_serial_mode();
int get_data_out();
};
// ======================> upd4990a_device
class upd4990a_device : public upd1990a_device
{
public:
upd4990a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 32'768);
};
// device type definitions
DECLARE_DEVICE_TYPE(UPD1990A, upd1990a_device)
DECLARE_DEVICE_TYPE(UPD4990A, upd4990a_device)
#endif // MAME_MACHINE_UPD1990A_H