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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
/**********************************************************************
Zilog Z8536 Counter/Timer and Parallel I/O emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************
_____ _____
D4 1 |* \_/ | 40 D3
D5 2 | | 39 D2
D6 3 | | 38 D1
D7 4 | | 37 D0
_RD 5 | | 36 _CE
_WR 6 | | 35 A1
GND 7 | | 34 A0
PB0 8 | | 33 PA0
PB1 9 | | 32 PA1
PB2 10 | Z8536 | 31 PA2
PB3 11 | | 30 PA3
PB4 12 | | 29 PA4
PB5 13 | | 28 PA5
PB6 14 | | 27 PA6
PB7 15 | | 26 PA7
PCLK 16 | | 25 _INTACK
IEI 17 | | 24 _INT
IEO 18 | | 23 +5 V
PC0 19 | | 22 PC3
PC1 20 |_____________| 21 PC2
**********************************************************************/
#pragma once
#ifndef __Z8536__
#define __Z8536__
#include "emu.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_Z8536_ADD(_tag, _clock, _intrf) \
MCFG_DEVICE_ADD(_tag, Z8536, _clock) \
MCFG_DEVICE_CONFIG(_intrf)
#define Z8536_INTERFACE(name) \
const z8536_interface (name)=
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> z8536_interface
struct z8536_interface
{
devcb_write_line m_out_int_func;
devcb_read8 m_in_pa_func;
devcb_write8 m_out_pa_func;
devcb_read8 m_in_pb_func;
devcb_write8 m_out_pb_func;
devcb_read8 m_in_pc_func;
devcb_write8 m_out_pc_func;
};
// ======================> z8536_device_config
class z8536_device_config : public device_config,
public z8536_interface
{
friend class z8536_device;
// construction/destruction
z8536_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
public:
// allocators
static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
virtual device_t *alloc_device(running_machine &machine) const;
protected:
// device_config overrides
virtual void device_config_complete();
};
// ======================> z8536_device
class z8536_device : public device_t
{
friend class z8536_device_config;
// construction/destruction
z8536_device(running_machine &_machine, const z8536_device_config &_config);
public:
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( intack_w );
DECLARE_WRITE_LINE_MEMBER( pb0_w );
DECLARE_WRITE_LINE_MEMBER( pb1_w );
DECLARE_WRITE_LINE_MEMBER( pb2_w );
DECLARE_WRITE_LINE_MEMBER( pb3_w );
DECLARE_WRITE_LINE_MEMBER( pb4_w );
DECLARE_WRITE_LINE_MEMBER( pb5_w );
DECLARE_WRITE_LINE_MEMBER( pb6_w );
DECLARE_WRITE_LINE_MEMBER( pb7_w );
DECLARE_WRITE_LINE_MEMBER( pc0_w );
DECLARE_WRITE_LINE_MEMBER( pc1_w );
DECLARE_WRITE_LINE_MEMBER( pc2_w );
DECLARE_WRITE_LINE_MEMBER( pc3_w );
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
static const device_timer_id TIMER_1 = 0;
static const device_timer_id TIMER_2 = 1;
static const device_timer_id TIMER_3 = 2;
inline UINT8 read_register(offs_t offset);
inline UINT8 read_register(offs_t offset, UINT8 mask);
inline void write_register(offs_t offset, UINT8 data);
inline void write_register(offs_t offset, UINT8 data, UINT8 mask);
inline void count(device_timer_id id);
inline void trigger(device_timer_id id);
inline void gate(device_timer_id id);
devcb_resolved_write_line m_out_int_func;
devcb_resolved_read8 m_in_pa_func;
devcb_resolved_write8 m_out_pa_func;
devcb_resolved_read8 m_in_pb_func;
devcb_resolved_write8 m_out_pb_func;
devcb_resolved_read8 m_in_pc_func;
devcb_resolved_write8 m_out_pc_func;
int m_state;
UINT8 m_register[48];
UINT8 m_pointer;
UINT8 m_input[3];
UINT8 m_output[3];
UINT8 m_buffer[3];
// timers
emu_timer *m_timer[3];
const z8536_device_config &m_config;
};
// device type definition
extern const device_type Z8536;
#endif
|