summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/machine/upd1990a.h
blob: 7078ed9569e91df9705403cc42c2d09b6ee99b55 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**********************************************************************

    NEC uPD1990AC Serial I/O Calendar & Clock emulation

    Copyright MESS Team.
    Visit http://mamedev.org for licensing and usage restrictions.

**********************************************************************
                            _____   _____
                    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

**********************************************************************/

#pragma once

#ifndef __UPD1990A__
#define __UPD1990A__

#include "emu.h"



//**************************************************************************
//  MACROS / CONSTANTS
//**************************************************************************




//**************************************************************************
//  INTERFACE CONFIGURATION MACROS
//**************************************************************************

#define MCFG_UPD1990A_ADD(_tag, _clock, _config) \
	MCFG_DEVICE_ADD((_tag), UPD1990A, _clock)   \
	MCFG_DEVICE_CONFIG(_config)

#define UPD1990A_INTERFACE(name) \
	const upd1990a_interface (name) =



//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************

// ======================> upd1990a_interface

struct upd1990a_interface
{
	devcb_write_line        m_out_data_cb;
	devcb_write_line        m_out_tp_cb;
};


// ======================> upd1990a_device

class upd1990a_rtc_device : public device_t,
							public device_rtc_interface,
							public upd1990a_interface
{
public:
	// construction/destruction
	upd1990a_rtc_device(const machine_config &mconfig, device_type type, const char* name, const char *tag, device_t *owner, UINT32 clock);

	DECLARE_WRITE_LINE_MEMBER( oe_w );
	DECLARE_WRITE_LINE_MEMBER( cs_w );
	DECLARE_WRITE_LINE_MEMBER( stb_w );
	DECLARE_WRITE_LINE_MEMBER( clk_w );
	DECLARE_WRITE_LINE_MEMBER( c0_w );
	DECLARE_WRITE_LINE_MEMBER( c1_w );
	DECLARE_WRITE_LINE_MEMBER( c2_w );
	DECLARE_WRITE_LINE_MEMBER( data_in_w );
	DECLARE_READ_LINE_MEMBER( data_out_r );
	DECLARE_READ_LINE_MEMBER( tp_r );

protected:
	// device-level overrides
	virtual void device_config_complete();
	virtual void device_start();
	virtual void device_reset();
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);

	// 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);
	enum {
			TYPE_UPD1990A = 0,
			TYPE_UPD4990A
	};
	int m_device_type;

private:
	static const device_timer_id TIMER_CLOCK = 0;
	static const device_timer_id TIMER_TP = 1;
	static const device_timer_id TIMER_DATA_OUT = 2;
	static const device_timer_id TIMER_TEST_MODE = 3;

	devcb_resolved_write_line   m_out_data_func;
	devcb_resolved_write_line   m_out_tp_func;

	UINT8 m_time_counter[5];    // time counter
	UINT8 m_shift_reg[5];       // shift 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;                    // command
	int m_clk;                  // shift clock
	int m_tp;                   // time pulse
	int m_c_unlatched;          // command waiting for STB

	// timers
	emu_timer *m_timer_clock;
	emu_timer *m_timer_tp;
	emu_timer *m_timer_data_out;
	emu_timer *m_timer_test_mode;
};

class upd1990a_device : public upd1990a_rtc_device
{
public:
	upd1990a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};


class upd4990a_device : public upd1990a_rtc_device
{
public:
	upd4990a_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};

// device type definition
extern const device_type UPD1990A;
extern const device_type UPD4990A;

#endif