1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /***************************************************************************
4 
5     atarijsa.h
6 
7     Functions to emulate the Atari "JSA" audio boards
8 
9 ***************************************************************************/
10 
11 #ifndef MAME_AUDIO_ATARI_JSA_H
12 #define MAME_AUDIO_ATARI_JSA_H
13 
14 #pragma once
15 
16 #include "cpu/m6502/m6502.h"
17 #include "sound/tms5220.h"
18 #include "sound/ym2151.h"
19 #include "sound/okim6295.h"
20 #include "sound/pokey.h"
21 #include "machine/atariscom.h"
22 
23 
24 //**************************************************************************
25 //  GLOBAL VARIABLES
26 //**************************************************************************
27 
DECLARE_DEVICE_TYPE(ATARI_JSA_I,atari_jsa_i_device)28 DECLARE_DEVICE_TYPE(ATARI_JSA_I,    atari_jsa_i_device)
29 DECLARE_DEVICE_TYPE(ATARI_JSA_II,   atari_jsa_ii_device)
30 DECLARE_DEVICE_TYPE(ATARI_JSA_III,  atari_jsa_iii_device)
31 DECLARE_DEVICE_TYPE(ATARI_JSA_IIIS, atari_jsa_iiis_device)
32 
33 
34 //**************************************************************************
35 //  I/O PORT BIT HELPERS
36 //**************************************************************************
37 
38 #define PORT_ATARI_JSA_SOUND_TO_MAIN_READY(_tag) \
39 	PORT_READ_LINE_DEVICE_MEMBER(_tag, atari_jsa_base_device, sound_to_main_ready)
40 
41 #define PORT_ATARI_JSA_MAIN_TO_SOUND_READY(_tag) \
42 	PORT_READ_LINE_DEVICE_MEMBER(_tag, atari_jsa_base_device, main_to_sound_ready)
43 
44 
45 
46 //**************************************************************************
47 //  TYPE DEFINITIONS
48 //**************************************************************************
49 
50 // ======================> atari_jsa_base_device
51 
52 class atari_jsa_base_device :   public device_t,
53 								public device_mixer_interface
54 {
55 protected:
56 	// construction/destruction
57 	atari_jsa_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner, uint32_t clock, int channels);
58 
59 public:
60 	// configuration
61 	auto test_read_cb() { return m_test_read_cb.bind(); }
62 	auto main_int_cb() { return m_main_int_cb.bind(); }
63 
64 	// getters
65 	m6502_device &soundcpu() const { return *m_jsacpu; }
66 	DECLARE_READ_LINE_MEMBER(main_to_sound_ready) { return m_soundcomm->main_to_sound_ready(); }
67 	DECLARE_READ_LINE_MEMBER(sound_to_main_ready) { return m_soundcomm->sound_to_main_ready(); }
68 
69 	// main cpu accessors
70 	void main_command_w(uint8_t data);
71 	uint8_t main_response_r();
72 	void sound_reset_w(uint16_t data);
73 
74 	// read/write handlers
75 	void ym2151_port_w(uint8_t data);
76 	DECLARE_READ_LINE_MEMBER(main_test_read_line);
77 
78 	// I/O lines
79 	DECLARE_WRITE_LINE_MEMBER(main_int_write_line);
80 
81 	// 6502 interrupt handlers
82 	INTERRUPT_GEN_MEMBER(sound_irq_gen);
83 	void sound_irq_ack_w(u8 data = 0);
84 	u8 sound_irq_ack_r();
85 	DECLARE_WRITE_LINE_MEMBER(ym2151_irq_gen);
86 
87 protected:
88 	// device-level overrides
89 	virtual void device_start() override;
90 	virtual void device_reset() override;
91 
92 	// internal helpers
93 	virtual void update_all_volumes() = 0;
94 	void update_sound_irq();
95 
96 	// devices
97 	required_device<atari_sound_comm_device> m_soundcomm;
98 	required_device<m6502_device> m_jsacpu;
99 	required_device<ym2151_device> m_ym2151;
100 
101 	// memory regions
102 	required_memory_region m_cpu_region;
103 
104 	// memory banks
105 	required_memory_bank m_cpu_bank;
106 
107 	// configuration state
108 	devcb_read_line    m_test_read_cb;
109 	devcb_write_line   m_main_int_cb;
110 
111 	// internal state
112 	bool                m_timed_int;
113 	bool                m_ym2151_int;
114 	double              m_ym2151_volume;
115 	uint8_t             m_ym2151_ct1;
116 	uint8_t             m_ym2151_ct2;
117 };
118 
119 
120 // ======================> atari_jsa_oki_base_device
121 
122 class atari_jsa_oki_base_device : public atari_jsa_base_device
123 {
124 protected:
125 	// derived construction/destruction
126 	atari_jsa_oki_base_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner, uint32_t clock, int channels);
127 
128 public:
129 	// read/write handlers
130 	uint8_t oki_r(offs_t offset);
131 	void oki_w(offs_t offset, uint8_t data);
132 	void wrio_w(uint8_t data);
133 	void mix_w(uint8_t data);
134 	void overall_volume_w(uint8_t data);
135 
136 protected:
137 	// device level overrides
138 	virtual void device_start() override;
139 	virtual void device_reset() override;
140 
141 	// internal helpers
142 	virtual void update_all_volumes() override;
143 
144 	// devices
145 	optional_device<okim6295_device> m_oki1;
146 	optional_device<okim6295_device> m_oki2;    // JSA IIIs only
147 
148 	// memory regions
149 	optional_memory_region m_oki1_region;
150 	optional_memory_region m_oki2_region;
151 
152 	// memory banks
153 	optional_memory_bank m_oki1_banklo;         // JSA III(s) only
154 	optional_memory_bank m_oki1_bankhi;         // JSA III(s)
155 	optional_memory_bank m_oki2_banklo;         // JSA IIIs only
156 	optional_memory_bank m_oki2_bankhi;         // JSA IIIs only
157 
158 	// internal state
159 	double              m_oki6295_volume;
160 	double              m_overall_volume;       // JSA III(s) only
161 };
162 
163 
164 // ======================> atari_jsa_i_device
165 
166 class atari_jsa_i_device : public atari_jsa_base_device
167 {
168 public:
169 	// construction/destruction
170 	atari_jsa_i_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
171 
172 	// read/write handlers
173 	uint8_t rdio_r();
174 	void wrio_w(uint8_t data);
175 	void mix_w(uint8_t data);
176 	void tms5220_voice(uint8_t data);
177 	uint8_t pokey_r(offs_t offset);
178 	void pokey_w(offs_t offset, uint8_t data);
179 
180 	void atarijsa1_map(address_map &map);
181 protected:
182 	// device level overrides
183 	virtual void device_add_mconfig(machine_config &config) override;
184 	virtual ioport_constructor device_input_ports() const override;
185 	virtual void device_start() override;
186 	virtual void device_reset() override;
187 
188 	// internal helpers
189 	virtual void update_all_volumes() override;
190 
191 	// devices
192 	optional_device<pokey_device> m_pokey;
193 	optional_device<tms5220_device> m_tms5220;
194 	required_ioport m_jsai;
195 
196 	// internal state
197 	double              m_pokey_volume;
198 	double              m_tms5220_volume;
199 };
200 
201 
202 // ======================> atari_jsa_ii_device
203 
204 class atari_jsa_ii_device : public atari_jsa_oki_base_device
205 {
206 public:
207 	// construction/destruction
208 	atari_jsa_ii_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
209 
210 	// read/write handlers
211 	uint8_t rdio_r();
212 
213 	void atarijsa2_map(address_map &map);
214 protected:
215 	// device level overrides
216 	virtual void device_add_mconfig(machine_config &config) override;
217 	virtual ioport_constructor device_input_ports() const override;
218 
219 	required_ioport m_jsaii;
220 };
221 
222 
223 // ======================> atari_jsa_iii_device
224 
225 class atari_jsa_iii_device : public atari_jsa_oki_base_device
226 {
227 public:
228 	// construction/destruction
229 	atari_jsa_iii_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
230 
231 	void atarijsa3_map(address_map &map);
232 	void jsa3_oki1_map(address_map &map);
233 protected:
234 	// derived construction/destruction
235 	atari_jsa_iii_device(const machine_config &mconfig, device_type devtype, const char *tag, device_t *owner, uint32_t clock, int channels);
236 
237 public:
238 	// read/write handlers
239 	uint8_t rdio_r();
240 
241 protected:
242 	// device level overrides
243 	virtual void device_add_mconfig(machine_config &config) override;
244 	virtual ioport_constructor device_input_ports() const override;
245 
246 	required_ioport m_jsaiii;
247 };
248 
249 
250 // ======================> atari_jsa_iiis_device
251 
252 class atari_jsa_iiis_device : public atari_jsa_iii_device
253 {
254 public:
255 	// construction/destruction
256 	atari_jsa_iiis_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
257 
258 	void jsa3_oki2_map(address_map &map);
259 protected:
260 	// device level overrides
261 	virtual void device_add_mconfig(machine_config &config) override;
262 };
263 
264 
265 #endif // MAME_AUDIO_ATARI_JSA_H
266