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