1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4
5 williams.h
6
7 Functions to emulate general the various Williams/Midway sound cards.
8
9 ****************************************************************************/
10
11 #include "machine/6821pia.h"
12 #include "cpu/m6809/m6809.h"
13 #include "sound/ym2151.h"
14 #include "sound/okim6295.h"
15 #include "sound/hc55516.h"
16
17
18
19 //**************************************************************************
20 // GLOBAL VARIABLES
21 //**************************************************************************
22
DECLARE_DEVICE_TYPE(WILLIAMS_CVSD_SOUND,williams_cvsd_sound_device)23 DECLARE_DEVICE_TYPE(WILLIAMS_CVSD_SOUND, williams_cvsd_sound_device)
24 DECLARE_DEVICE_TYPE(WILLIAMS_NARC_SOUND, williams_narc_sound_device)
25 DECLARE_DEVICE_TYPE(WILLIAMS_ADPCM_SOUND, williams_adpcm_sound_device)
26
27
28
29 //**************************************************************************
30 // TYPE DEFINITIONS
31 //**************************************************************************
32
33 // ======================> williams_cvsd_sound_device
34
35 class williams_cvsd_sound_device : public device_t,
36 public device_mixer_interface
37 {
38 public:
39 // construction/destruction
40 williams_cvsd_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
41
42 // read/write
43 void write(u16 data);
44 DECLARE_WRITE_LINE_MEMBER(reset_write);
45
46 // internal communications
47 void bank_select_w(u8 data);
48 void cvsd_digit_clock_clear_w(u8 data);
49 void cvsd_clock_set_w(u8 data);
50
51 void williams_cvsd_map(address_map &map);
52
53 mc6809e_device *get_cpu() { return m_cpu; }
54
55 protected:
56 // device-level overrides
57 virtual void device_add_mconfig(machine_config &config) override;
58 virtual void device_start() override;
59 virtual void device_reset() override;
60 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
61
62 private:
63 // devices
64 required_device<mc6809e_device> m_cpu;
65 required_device<pia6821_device> m_pia;
66 required_device<ym2151_device> m_ym2151;
67 required_device<hc55516_device> m_hc55516;
68
69 required_memory_bank m_rombank;
70
71 // internal state
72 u8 m_talkback;
73
74 void talkback_w(u8 data);
75 };
76
77
78 // ======================> williams_narc_sound_device
79
80 class williams_narc_sound_device : public device_t,
81 public device_mixer_interface
82 {
83 public:
84 // construction/destruction
85 williams_narc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
86
87 // read/write
88 u16 read();
89 void write(u16 data);
90 DECLARE_WRITE_LINE_MEMBER(reset_write);
91
92 // internal communications
93 void master_bank_select_w(u8 data);
94 void slave_bank_select_w(u8 data);
95 u8 command_r();
96 void command2_w(u8 data);
97 u8 command2_r();
98 void master_talkback_w(u8 data);
99 void master_sync_w(u8 data);
100 void slave_talkback_w(u8 data);
101 void slave_sync_w(u8 data);
102 void cvsd_digit_clock_clear_w(u8 data);
103 void cvsd_clock_set_w(u8 data);
104
105 void williams_narc_master_map(address_map &map);
106 void williams_narc_slave_map(address_map &map);
107
get_cpu()108 mc6809e_device *get_cpu() { return m_cpu[0]; }
109
110 protected:
111 // device-level overrides
112 virtual void device_add_mconfig(machine_config &config) override;
113 virtual void device_start() override;
114 virtual void device_reset() override;
115 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
116
117 private:
118 // timer IDs
119 enum
120 {
121 TID_MASTER_COMMAND,
122 TID_SLAVE_COMMAND,
123 TID_SYNC_CLEAR
124 };
125
126 // devices
127 required_device_array<mc6809e_device, 2> m_cpu;
128 required_device<hc55516_device> m_hc55516;
129
130 required_memory_bank m_masterbank;
131 required_memory_bank m_slavebank;
132
133 // internal state
134 u8 m_latch;
135 u8 m_latch2;
136 u8 m_talkback;
137 u8 m_audio_sync;
138 u8 m_sound_int_state;
139 };
140
141
142 // ======================> williams_adpcm_sound_device
143
144 class williams_adpcm_sound_device : public device_t,
145 public device_mixer_interface
146 {
147 public:
148 // construction/destruction
149 williams_adpcm_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
150
151 // read/write
152 void write(u16 data);
153 DECLARE_WRITE_LINE_MEMBER(reset_write);
154 DECLARE_READ_LINE_MEMBER(irq_read);
155
156 // internal communications
157 void bank_select_w(u8 data);
158 void oki6295_bank_select_w(u8 data);
159 u8 command_r();
160 void talkback_w(u8 data);
161
162 void williams_adpcm_map(address_map &map);
163 void williams_adpcm_oki_map(address_map &map);
164
get_cpu()165 mc6809e_device *get_cpu() { return m_cpu; }
166
167 protected:
168 // timer IDs
169 enum
170 {
171 TID_COMMAND,
172 TID_IRQ_CLEAR
173 };
174
175 // device-level overrides
176 virtual void device_add_mconfig(machine_config &config) override;
177 virtual void device_start() override;
178 virtual void device_reset() override;
179 virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
180
181 private:
182 // devices
183 required_device<mc6809e_device> m_cpu;
184
185 required_memory_bank m_rombank;
186 required_memory_bank m_okibank;
187
188 // internal state
189 u8 m_latch;
190 u8 m_talkback;
191 u8 m_sound_int_state;
192 };
193