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
|
// 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 ATTR_COLD;
// 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
|