Previous 199869 Revisions Next

r19119 Friday 23rd November, 2012 at 21:36:08 UTC by O. Galibert
es5503: Make the number of output channels configurable [O. Galibert]
[src/emu/sound]es5503.c es5503.h
[src/mame/drivers]mquake.c
[src/mess/drivers]apple2gs.c esq1.c mirage.c

trunk/src/mame/drivers/mquake.c
r19118r19119
370370   MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
371371   MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
372372
373   MCFG_ES5503_ADD("es5503", 7159090, NULL, NULL)      /* ES5503 is likely mono due to channel strobe used as bank select */
373   MCFG_ES5503_ADD("es5503", 7159090, 1, NULL, NULL)      /* ES5503 is likely mono due to channel strobe used as bank select */
374374   MCFG_DEVICE_ADDRESS_MAP(AS_0, mquake_es5503_map)
375375   MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
376376   MCFG_SOUND_ROUTE(0, "rspeaker", 0.50)
377   MCFG_SOUND_ROUTE(1, "lspeaker", 0.50)
378   MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
379377
380378   /* cia */
381379   MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf)
trunk/src/emu/sound/es5503.c
r19118r19119
8686//  the IRQ callback
8787//-------------------------------------------------
8888
89void es5503_device::static_set_channels(device_t &device, int channels)
90{
91   es5503_device &es5503 = downcast<es5503_device &>(device);
92   es5503.output_channels = channels;
93}
94
8995void es5503_device::static_set_irqf(device_t &device, void (*irqf)(device_t *device, int state))
9096{
9197   es5503_device &es5503 = downcast<es5503_device &>(device);
r19118r19119
160166
161167void es5503_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
162168{
163   static INT32 mix[(44100/60)*4];
169   static INT32 mix[(44100/60)*2*8];
164170   INT32 *mixp;
165171   int osc, snum, i;
166172   UINT32 ramptr;
r19118r19119
168174   assert(samples < (44100/60)*2);
169175   memset(mix, 0, sizeof(mix));
170176
171   for (osc = 0; osc < (oscsenabled+1); osc++)
177   for (int chan = 0; chan < output_channels; chan++)
172178   {
173      ES5503Osc *pOsc = &oscillators[osc];
174
175      mixp = &mix[0];
176
177      if (!(pOsc->control & 1))
179      for (osc = 0; osc < (oscsenabled+1); osc++)
178180      {
179         UINT32 wtptr = pOsc->wavetblpointer & wavemasks[pOsc->wavetblsize], altram;
180         UINT32 acc = pOsc->accumulator;
181         UINT16 wtsize = pOsc->wtsize - 1;
182         UINT8 ctrl = pOsc->control;
183         UINT16 freq = pOsc->freq;
184         INT16 vol = pOsc->vol;
185         INT8 data = -128;
186         int resshift = resshifts[pOsc->resolution] - pOsc->wavetblsize;
187         UINT32 sizemask = accmasks[pOsc->wavetblsize];
181         ES5503Osc *pOsc = &oscillators[osc];
188182
189         for (snum = 0; snum < samples; snum++)
183         if (!(pOsc->control & 1) && ((pOsc->control >> 4) & (output_channels - 1)) == chan)
190184         {
191            altram = acc >> resshift;
192            ramptr = altram & sizemask;
185            UINT32 wtptr = pOsc->wavetblpointer & wavemasks[pOsc->wavetblsize], altram;
186            UINT32 acc = pOsc->accumulator;
187            UINT16 wtsize = pOsc->wtsize - 1;
188            UINT8 ctrl = pOsc->control;
189            UINT16 freq = pOsc->freq;
190            INT16 vol = pOsc->vol;
191            INT8 data = -128;
192            int resshift = resshifts[pOsc->resolution] - pOsc->wavetblsize;
193            UINT32 sizemask = accmasks[pOsc->wavetblsize];
194            mixp = &mix[0] + chan;
193195
194            acc += freq;
196            for (snum = 0; snum < samples; snum++)
197            {
198               altram = acc >> resshift;
199               ramptr = altram & sizemask;
195200
196            // channel strobe is always valid when reading; this allows potentially banking per voice
197            m_channel_strobe = (ctrl>>4) & 0xf;
198            data = (INT32)m_direct->read_raw_byte(ramptr + wtptr) ^ 0x80;
201               acc += freq;
199202
200            if (m_direct->read_raw_byte(ramptr + wtptr) == 0x00)
201            {
202               halt_osc(osc, 1, &acc, resshift);
203            }
204            else
205            {
206               if (pOsc->control & 0x10)
203               // channel strobe is always valid when reading; this allows potentially banking per voice
204               m_channel_strobe = (ctrl>>4) & 0xf;
205               data = (INT32)m_direct->read_raw_byte(ramptr + wtptr) ^ 0x80;
206
207               if (m_direct->read_raw_byte(ramptr + wtptr) == 0x00)
207208               {
208                  *mixp++ += (data * vol);
209                  mixp++;
209                  halt_osc(osc, 1, &acc, resshift);
210210               }
211211               else
212212               {
213                  mixp++;
214                  *mixp++ += (data * vol);
213                  *mixp += data * vol;
214                  mixp += output_channels;
215
216                  if (altram >= wtsize)
217                  {
218                     halt_osc(osc, 0, &acc, resshift);
219                  }
215220               }
216221
217               if (altram >= wtsize)
222               // if oscillator halted, we've got no more samples to generate
223               if (pOsc->control & 1)
218224               {
219                  halt_osc(osc, 0, &acc, resshift);
225                  ctrl |= 1;
226                  break;
220227               }
221228            }
222229
223            // if oscillator halted, we've got no more samples to generate
224            if (pOsc->control & 1)
225            {
226               ctrl |= 1;
227               break;
228            }
230            pOsc->control = ctrl;
231            pOsc->accumulator = acc;
232            pOsc->data = data ^ 0x80;
229233         }
230
231         pOsc->control = ctrl;
232         pOsc->accumulator = acc;
233         pOsc->data = data ^ 0x80;
234234      }
235235   }
236236
237237   mixp = &mix[0];
238238   for (i = 0; i < samples; i++)
239   {
240      outputs[0][i] = (*mixp++)>>1;
241      outputs[1][i] = (*mixp++)>>1;
242   }
239      for (int chan = 0; chan < output_channels; chan++)
240         outputs[chan][i] = (*mixp++)>>1;
243241}
244242
245243
r19118r19119
267265   }
268266
269267   output_rate = (clock()/8)/34;   // (input clock / 8) / # of oscs. enabled + 2
270   m_stream = machine().sound().stream_alloc(*this, 0, 2, output_rate, this);
268   m_stream = machine().sound().stream_alloc(*this, 0, output_channels, output_rate, this);
271269
272270   m_timer = timer_alloc(0, NULL);
273271   m_timer->adjust(attotime::from_hz(output_rate), 0, attotime::from_hz(output_rate));
trunk/src/emu/sound/es5503.h
r19118r19119
33#ifndef __ES5503_H__
44#define __ES5503_H__
55
6#define MCFG_ES5503_ADD(_tag, _clock, _irqf, _adcf) \
6// channels must be a power of two
7
8#define MCFG_ES5503_ADD(_tag, _clock, _channels, _irqf, _adcf)   \
79   MCFG_DEVICE_ADD(_tag, ES5503, _clock) \
10   MCFG_ES5503_OUTPUT_CHANNELS(_channels) \
811   MCFG_ES5503_IRQ_FUNC(_irqf) \
912   MCFG_ES5503_ADC_FUNC(_adcf)
1013
11#define MCFG_ES5503_REPLACE(_tag, _clock, _irqf, _adcf) \
14#define MCFG_ES5503_REPLACE(_tag, _clock, _channels, _irqf, _adcf) \
1215   MCFG_DEVICE_REPLACE(_tag, ES5503, _clock) \
16   MCFG_ES5503_OUTPUT_CHANNELS(_channels) \
1317   MCFG_ES5503_IRQ_FUNC(_irqf) \
1418   MCFG_ES5503_ADC_FUNC(_adcf)
1519
20#define MCFG_ES5503_OUTPUT_CHANNELS(_channels) \
21   es5503_device::static_set_channels(*device, _channels); \
22
1623#define MCFG_ES5503_IRQ_FUNC(_irqf) \
1724   es5503_device::static_set_irqf(*device, _irqf); \
1825
r19118r19119
2936    // construction/destruction
3037   es5503_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
3138
39   static void static_set_channels(device_t &device, int channels);
3240    static void static_set_irqf(device_t &device, void (*irqf)(device_t *device, int state));
3341    static void static_set_adcf(device_t &device, UINT8 (*adcf)(device_t *device));
3442
r19118r19119
8997
9098    UINT8 m_channel_strobe;
9199
100   int output_channels;
92101    UINT32 output_rate;
93102
94103    emu_timer *m_timer;
trunk/src/mess/drivers/mirage.c
r19118r19119
262262   MCFG_SCREEN_VISIBLE_AREA(0, 319, 1, 239)
263263
264264   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
265   MCFG_ES5503_ADD("es5503", 7000000, mirage_doc_irq, mirage_adc_read)
265   MCFG_ES5503_ADD("es5503", 7000000, 2, mirage_doc_irq, mirage_adc_read)
266266   MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
267267   MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
268268
trunk/src/mess/drivers/apple2gs.c
r19118r19119
256256   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
257257   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
258258
259   MCFG_ES5503_ADD("es5503", APPLE2GS_7M, apple2gs_doc_irq, apple2gs_adc_read)
259   MCFG_ES5503_ADD("es5503", APPLE2GS_7M, 2, apple2gs_doc_irq, apple2gs_adc_read)
260260   MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
261261   MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
262262
trunk/src/mess/drivers/esq1.c
r19118r19119
6363
6464#define WD1772_TAG      "wd1772"
6565
66#define KEYBOARD_HACK   (0)
66#define KEYBOARD_HACK   (1)
6767
6868class esq1_state : public driver_device
6969{
r19118r19119
160160   AM_RANGE(0x4000, 0x5fff) AM_RAM               // SEQRAM
161161   AM_RANGE(0x6000, 0x63ff) AM_DEVREADWRITE("es5503", es5503_device, read, write)
162162   AM_RANGE(0x6400, 0x640f) AM_DEVREADWRITE_LEGACY("duart", duart68681_r, duart68681_w)
163   AM_RANGE(0x6800, 0x68ff) AM_NOP   
164
163165   AM_RANGE(0x7000, 0x7fff) AM_ROMBANK("osbank")
164166   AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("osrom", 0x8000)   // OS "high" ROM is always mapped here
165167ADDRESS_MAP_END
r19118r19119
272274    MCFG_ESQ2x40_ADD("vfd")
273275
274276   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
275   MCFG_ES5503_ADD("es5503", 7000000, esq1_doc_irq, esq1_adc_read)
277   MCFG_ES5503_ADD("es5503", 7000000, 8, esq1_doc_irq, esq1_adc_read)
276278   MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
277279   MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
280   MCFG_SOUND_ROUTE(2, "lspeaker", 1.0)
281   MCFG_SOUND_ROUTE(3, "rspeaker", 1.0)
282   MCFG_SOUND_ROUTE(4, "lspeaker", 1.0)
283   MCFG_SOUND_ROUTE(5, "rspeaker", 1.0)
284   MCFG_SOUND_ROUTE(6, "lspeaker", 1.0)
285   MCFG_SOUND_ROUTE(7, "rspeaker", 1.0)
278286MACHINE_CONFIG_END
279287
280288static MACHINE_CONFIG_DERIVED(sq80, esq1)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team