/* audio DMA */ static TIMER_CALLBACK( vidc_audio_tick ) { address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); UINT8 ulaw_comp; INT16 res; UINT8 ch; static const char *const dac_port[8] = { "dac0", "dac1", "dac2", "dac3", "dac4", "dac5", "dac6", "dac7" }; for(ch=0;ch<8;ch++) { ulaw_comp = (space->read_byte(vidc_sndstart+vidc_sndcur + ch)); res=1<<((ulaw_comp>>5)+4); res+=(((ulaw_comp>>1)&0xF)<<(ulaw_comp>>5)); if (ulaw_comp&1) res=-res; dac_signed_data_16_w(space->machine().device(dac_port[ch & 7]), res); } vidc_sndcur+=8; if (vidc_sndcur >= (vidc_sndend-vidc_sndstart)+0x10) { vidc_sndcur = 0; archimedes_request_irq_b(machine, ARCHIMEDES_IRQB_SOUND_EMPTY); if(!audio_dma_on) { snd_timer->adjust(attotime::never); for(ch=0;ch<8;ch++) dac_signed_data_16_w(space->machine().device(dac_port[ch & 7]), 0x8000); } } }
static TIMER_CALLBACK(ip22_dma) { //ip22_state *state = machine.driver_data<ip22_state>(); machine.scheduler().timer_set(attotime::never, FUNC(ip22_dma)); #if 0 if( state->m_PBUS_DMA.nActive ) { UINT16 temp16 = ( state->m_mainram[(state->m_PBUS_DMA.nCurPtr - 0x08000000)/4] & 0xffff0000 ) >> 16; INT16 stemp16 = (INT16)((temp16 >> 8) | (temp16 << 8)); dac_signed_data_16_w(machine.device("dac"), stemp16 ^ 0x8000); state->m_PBUS_DMA.nCurPtr += 4; state->m_PBUS_DMA.nWordsLeft -= 4; if( state->m_PBUS_DMA.nWordsLeft == 0 ) { if( state->m_PBUS_DMA.nNextPtr != 0 ) { state->m_PBUS_DMA.nDescPtr = state->m_PBUS_DMA.nNextPtr; state->m_PBUS_DMA.nCurPtr = state->m_mainram[(state->m_PBUS_DMA.nDescPtr - 0x08000000)/4]; state->m_PBUS_DMA.nWordsLeft = state->m_mainram[(state->m_PBUS_DMA.nDescPtr - 0x08000000)/4+1]; state->m_PBUS_DMA.nNextPtr = state->m_mainram[(state->m_PBUS_DMA.nDescPtr - 0x08000000)/4+2]; } else { state->m_PBUS_DMA.nActive = 0; return; } } machine.scheduler().timer_set(attotime::from_hz(44100), FUNC(ip22_dma)); }
static WRITE8_DEVICE_HANDLER( voice_w ) { dac_signed_data_16_w(device, data ? (data + 1) * 0x100 : 0x8000); }