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