//static STREAM_UPDATE( ym2612_stream_update ) void ym2612_stream_update(UINT8 ChipID, stream_sample_t **outputs, int samples) { //ym2612_state *info = (ym2612_state *)param; ym2612_state *info = &YM2612Data[ChipID]; #ifdef ENABLE_ALL_CORES int i; #endif switch(EMU_CORE) { case EC_MAME: ym2612_update_one(info->chip, outputs, samples); break; #ifdef ENABLE_ALL_CORES case EC_GENS: YM2612_ClearBuffer(GensBuf, samples); YM2612_Update(info->chip, GensBuf, samples); YM2612_DacAndTimers_Update(info->chip, GensBuf, samples); for (i = 0x00; i < samples; i ++) { outputs[0x00][i] = (stream_sample_t)GensBuf[0x00][i]; outputs[0x01][i] = (stream_sample_t)GensBuf[0x01][i]; } break; #endif } }
/* update request from fm.c */ void ym2612_update_request(void *param) { ym2612_state *info = (ym2612_state *)param; //stream_update(info->stream); switch(EMU_CORE) { case EC_MAME: ym2612_update_one(info->chip, DUMMYBUF, 0); break; #ifdef ENABLE_ALL_CORES case EC_GENS: YM2612_Update(info->chip, DUMMYBUF, 0); YM2612_DacAndTimers_Update(info->chip, DUMMYBUF, 0); break; #endif } }
unsigned char *GYM_Next(unsigned char *gym_start, unsigned char *gym_pos, unsigned int gym_size, unsigned int gym_loop) { unsigned char c, c2; unsigned char dac_data[1600]; int *buf[2]; int dacMax = 0, i = 0; int oldPos = 0; double curPos = 0; double dacSize; int step; int *dacBuf[2]; int retCode = 1; YM_Buf[0] = PSG_Buf[0] = buf[0] = Seg_L; YM_Buf[1] = PSG_Buf[1] = buf[1] = Seg_R; YM_Len = PSG_Len = 0; memset(dac_data, 0, sizeof(dac_data)); if (!gym_pos) { return 0; } if ((unsigned int)(gym_pos - gym_start) >= gym_size) { if (gym_loop) { gym_pos = jump_gym_time_pos(gym_start, gym_size, gym_loop - 1); } else { return 0; } } do { c = *gym_pos++; switch(c) { case 0: if (YM2612_Enable) { // if dacMax is zero, dacSize will be NaN - so what, we won't // be using it in that case anyway :p dacSize = (double)Seg_Lenght / dacMax; for (i = 0; i < dacMax; i++) { oldPos = (int)curPos; YM2612_Write(0, 0x2A); YM2612_Write(1, dac_data[i]); if (i == dacMax - 1) { step = Seg_Lenght - oldPos; } else { curPos += dacSize; step = (int)curPos - oldPos; } dacBuf[0] = buf[0] + (int)oldPos; dacBuf[1] = buf[1] + (int)oldPos; YM2612_DacAndTimers_Update(dacBuf, step); } YM2612_Update(buf, Seg_Lenght); } if (PSG_Enable) { if (PSG_Improv) { PSG_Update_SIN(buf, Seg_Lenght); } else { PSG_Update(buf, Seg_Lenght); } } break; case 1: c2 = *gym_pos++; if (c2 == 0x2A) { c2 = *gym_pos++; dac_data[dacMax++] = c2; } else { YM2612_Write(0, c2); c2 = *gym_pos++; YM2612_Write(1, c2); } break; case 2: c2 = *gym_pos++; YM2612_Write(2, c2); c2 = *gym_pos++; YM2612_Write(3, c2); break; case 3: c2 = *gym_pos++; PSG_Write(c2); break; } } while (c); return gym_pos; }