trunk/src/mame/drivers/mquake.c
| r19118 | r19119 | |
| 370 | 370 | MCFG_SOUND_ROUTE(2, "rspeaker", 0.50) |
| 371 | 371 | MCFG_SOUND_ROUTE(3, "lspeaker", 0.50) |
| 372 | 372 | |
| 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 */ |
| 374 | 374 | MCFG_DEVICE_ADDRESS_MAP(AS_0, mquake_es5503_map) |
| 375 | 375 | MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) |
| 376 | 376 | MCFG_SOUND_ROUTE(0, "rspeaker", 0.50) |
| 377 | | MCFG_SOUND_ROUTE(1, "lspeaker", 0.50) |
| 378 | | MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) |
| 379 | 377 | |
| 380 | 378 | /* cia */ |
| 381 | 379 | MCFG_LEGACY_MOS8520_ADD("cia_0", AMIGA_68000_NTSC_CLOCK / 10, 0, cia_0_intf) |
trunk/src/emu/sound/es5503.c
| r19118 | r19119 | |
| 86 | 86 | // the IRQ callback |
| 87 | 87 | //------------------------------------------------- |
| 88 | 88 | |
| 89 | void 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 | |
| 89 | 95 | void es5503_device::static_set_irqf(device_t &device, void (*irqf)(device_t *device, int state)) |
| 90 | 96 | { |
| 91 | 97 | es5503_device &es5503 = downcast<es5503_device &>(device); |
| r19118 | r19119 | |
| 160 | 166 | |
| 161 | 167 | void es5503_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) |
| 162 | 168 | { |
| 163 | | static INT32 mix[(44100/60)*4]; |
| 169 | static INT32 mix[(44100/60)*2*8]; |
| 164 | 170 | INT32 *mixp; |
| 165 | 171 | int osc, snum, i; |
| 166 | 172 | UINT32 ramptr; |
| r19118 | r19119 | |
| 168 | 174 | assert(samples < (44100/60)*2); |
| 169 | 175 | memset(mix, 0, sizeof(mix)); |
| 170 | 176 | |
| 171 | | for (osc = 0; osc < (oscsenabled+1); osc++) |
| 177 | for (int chan = 0; chan < output_channels; chan++) |
| 172 | 178 | { |
| 173 | | ES5503Osc *pOsc = &oscillators[osc]; |
| 174 | | |
| 175 | | mixp = &mix[0]; |
| 176 | | |
| 177 | | if (!(pOsc->control & 1)) |
| 179 | for (osc = 0; osc < (oscsenabled+1); osc++) |
| 178 | 180 | { |
| 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]; |
| 188 | 182 | |
| 189 | | for (snum = 0; snum < samples; snum++) |
| 183 | if (!(pOsc->control & 1) && ((pOsc->control >> 4) & (output_channels - 1)) == chan) |
| 190 | 184 | { |
| 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; |
| 193 | 195 | |
| 194 | | acc += freq; |
| 196 | for (snum = 0; snum < samples; snum++) |
| 197 | { |
| 198 | altram = acc >> resshift; |
| 199 | ramptr = altram & sizemask; |
| 195 | 200 | |
| 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; |
| 199 | 202 | |
| 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) |
| 207 | 208 | { |
| 208 | | *mixp++ += (data * vol); |
| 209 | | mixp++; |
| 209 | halt_osc(osc, 1, &acc, resshift); |
| 210 | 210 | } |
| 211 | 211 | else |
| 212 | 212 | { |
| 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 | } |
| 215 | 220 | } |
| 216 | 221 | |
| 217 | | if (altram >= wtsize) |
| 222 | // if oscillator halted, we've got no more samples to generate |
| 223 | if (pOsc->control & 1) |
| 218 | 224 | { |
| 219 | | halt_osc(osc, 0, &acc, resshift); |
| 225 | ctrl |= 1; |
| 226 | break; |
| 220 | 227 | } |
| 221 | 228 | } |
| 222 | 229 | |
| 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; |
| 229 | 233 | } |
| 230 | | |
| 231 | | pOsc->control = ctrl; |
| 232 | | pOsc->accumulator = acc; |
| 233 | | pOsc->data = data ^ 0x80; |
| 234 | 234 | } |
| 235 | 235 | } |
| 236 | 236 | |
| 237 | 237 | mixp = &mix[0]; |
| 238 | 238 | 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; |
| 243 | 241 | } |
| 244 | 242 | |
| 245 | 243 | |
| r19118 | r19119 | |
| 267 | 265 | } |
| 268 | 266 | |
| 269 | 267 | 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); |
| 271 | 269 | |
| 272 | 270 | m_timer = timer_alloc(0, NULL); |
| 273 | 271 | m_timer->adjust(attotime::from_hz(output_rate), 0, attotime::from_hz(output_rate)); |
trunk/src/emu/sound/es5503.h
| r19118 | r19119 | |
| 3 | 3 | #ifndef __ES5503_H__ |
| 4 | 4 | #define __ES5503_H__ |
| 5 | 5 | |
| 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) \ |
| 7 | 9 | MCFG_DEVICE_ADD(_tag, ES5503, _clock) \ |
| 10 | MCFG_ES5503_OUTPUT_CHANNELS(_channels) \ |
| 8 | 11 | MCFG_ES5503_IRQ_FUNC(_irqf) \ |
| 9 | 12 | MCFG_ES5503_ADC_FUNC(_adcf) |
| 10 | 13 | |
| 11 | | #define MCFG_ES5503_REPLACE(_tag, _clock, _irqf, _adcf) \ |
| 14 | #define MCFG_ES5503_REPLACE(_tag, _clock, _channels, _irqf, _adcf) \ |
| 12 | 15 | MCFG_DEVICE_REPLACE(_tag, ES5503, _clock) \ |
| 16 | MCFG_ES5503_OUTPUT_CHANNELS(_channels) \ |
| 13 | 17 | MCFG_ES5503_IRQ_FUNC(_irqf) \ |
| 14 | 18 | MCFG_ES5503_ADC_FUNC(_adcf) |
| 15 | 19 | |
| 20 | #define MCFG_ES5503_OUTPUT_CHANNELS(_channels) \ |
| 21 | es5503_device::static_set_channels(*device, _channels); \ |
| 22 | |
| 16 | 23 | #define MCFG_ES5503_IRQ_FUNC(_irqf) \ |
| 17 | 24 | es5503_device::static_set_irqf(*device, _irqf); \ |
| 18 | 25 | |
| r19118 | r19119 | |
| 29 | 36 | // construction/destruction |
| 30 | 37 | es5503_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 31 | 38 | |
| 39 | static void static_set_channels(device_t &device, int channels); |
| 32 | 40 | static void static_set_irqf(device_t &device, void (*irqf)(device_t *device, int state)); |
| 33 | 41 | static void static_set_adcf(device_t &device, UINT8 (*adcf)(device_t *device)); |
| 34 | 42 | |
| r19118 | r19119 | |
| 89 | 97 | |
| 90 | 98 | UINT8 m_channel_strobe; |
| 91 | 99 | |
| 100 | int output_channels; |
| 92 | 101 | UINT32 output_rate; |
| 93 | 102 | |
| 94 | 103 | emu_timer *m_timer; |
trunk/src/mess/drivers/esq1.c
| r19118 | r19119 | |
| 63 | 63 | |
| 64 | 64 | #define WD1772_TAG "wd1772" |
| 65 | 65 | |
| 66 | | #define KEYBOARD_HACK (0) |
| 66 | #define KEYBOARD_HACK (1) |
| 67 | 67 | |
| 68 | 68 | class esq1_state : public driver_device |
| 69 | 69 | { |
| r19118 | r19119 | |
| 160 | 160 | AM_RANGE(0x4000, 0x5fff) AM_RAM // SEQRAM |
| 161 | 161 | AM_RANGE(0x6000, 0x63ff) AM_DEVREADWRITE("es5503", es5503_device, read, write) |
| 162 | 162 | AM_RANGE(0x6400, 0x640f) AM_DEVREADWRITE_LEGACY("duart", duart68681_r, duart68681_w) |
| 163 | AM_RANGE(0x6800, 0x68ff) AM_NOP |
| 164 | |
| 163 | 165 | AM_RANGE(0x7000, 0x7fff) AM_ROMBANK("osbank") |
| 164 | 166 | AM_RANGE(0x8000, 0xffff) AM_ROM AM_REGION("osrom", 0x8000) // OS "high" ROM is always mapped here |
| 165 | 167 | ADDRESS_MAP_END |
| r19118 | r19119 | |
| 272 | 274 | MCFG_ESQ2x40_ADD("vfd") |
| 273 | 275 | |
| 274 | 276 | 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) |
| 276 | 278 | MCFG_SOUND_ROUTE(0, "lspeaker", 1.0) |
| 277 | 279 | 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) |
| 278 | 286 | MACHINE_CONFIG_END |
| 279 | 287 | |
| 280 | 288 | static MACHINE_CONFIG_DERIVED(sq80, esq1) |