blob: a1ecc151331fc0cd48c7f8f959cec48995f82e50 (
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
|
// license:BSD-3-Clause
// copyright-holders:smf,AJR
/***************************************************************************
NEC µPD4701A 2-Axis Incremental Encoder Counter
****************************************************************************
_____ _____
Xa 1 |* \_/ | 24 Vdd
Xb 2 | | 23 D7
RESET X 3 | | 22 D6
Ya 4 | | 21 D5
Yb 5 | | 20 D4
RESET Y 6 | | 19 D3
_RIGHT 7 | uPD4701A | 18 D2
_LEFT 8 | | 17 D1
_MIDDLE 9 | | 16 D0
_SF 10 | | 15 _CS
_CF 11 | | 14 _X/Y
Vss 12 |_____________| 13 U/_L
***************************************************************************/
#ifndef MAME_MACHINE_UPD4701_H
#define MAME_MACHINE_UPD4701_H
#pragma once
class upd4701_device : public device_t
{
public:
upd4701_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
// configuration
template <typename T> void set_portx_tag(T &&tag) { m_portx.set_tag(std::forward<T>(tag)); }
template <typename T> void set_porty_tag(T &&tag) { m_porty.set_tag(std::forward<T>(tag)); }
auto cf_cb() { return m_cf_cb.bind(); }
auto sf_cb() { return m_sf_cb.bind(); }
auto open_bus_cb() { return m_open_bus_cb.bind(); }
void update();
void recalibrate();
void cs_w(int state);
void xy_w(int state);
void ul_w(int state);
void resetx_w(int state);
void resety_w(int state);
u8 reset_x_r();
void reset_x_w(u8 data);
u8 reset_y_r();
void reset_y_w(u8 data);
u8 reset_xy_r();
void reset_xy_w(u8 data);
u8 d_r();
u8 read_x(offs_t offset);
u8 read_y(offs_t offset);
u8 read_xy(offs_t offset);
void left_w(int state);
void right_w(int state);
void middle_w(int state);
int cf_r();
int sf_r();
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
private:
// internal helpers
void x_add(s16 data);
void y_add(s16 data);
void switch_update(u8 mask, bool state);
// control lines
bool m_cs; // chip select (active low)
bool m_xy; // counter select (L = X, H = Y)
bool m_ul; // byte select (L = lower, H = upper)
bool m_resetx; // X-axis counter reset (active high)
bool m_resety; // Y-axis counter reset (active high)
// counter state
optional_ioport m_portx;
optional_ioport m_porty;
s16 m_latchx;
s16 m_latchy;
s16 m_startx;
s16 m_starty;
s16 m_x;
s16 m_y;
u16 m_last_x_read;
u16 m_last_y_read;
// switch state
u8 m_switches;
u8 m_latchswitches;
// flag outputs and callbacks
bool m_cf;
devcb_write_line m_cf_cb;
devcb_write_line m_sf_cb;
devcb_read8 m_open_bus_cb;
};
DECLARE_DEVICE_TYPE(UPD4701A, upd4701_device)
#endif // MAME_MACHINE_UPD4701_H
|