static void Emulate(EmulateSpecStruct *espec) { INPUT_Frame(); MDFNMP_ApplyPeriodicCheats(); /*if(unlikely(espec->VideoFormatChanged)) VDC_SetPixelFormat(espec->surface->format); //.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift); if(unlikely(espec->SoundFormatChanged)) { for(int y = 0; y < 2; y++) { sbuf[y].set_sample_rate(espec->SoundRate ? espec->SoundRate : 44100, 50); sbuf[y].clock_rate((long)(PCE_MASTER_CLOCK / 3)); sbuf[y].bass_freq(20); } }*/ int usedSubSurfaces = 0; vdcRunFunc(espec->surface, &espec->DisplayRect, espec->subSurface, IsHES ? 1 : espec->skip, usedSubSurfaces); if(!espec->skip && espec->commitVideo) MDFND_commitVideoFrame({espec->DisplayRect, espec->subSurface, usedSubSurfaces}); if(PCE_IsCD) { int32 dummy_ne; dummy_ne = PCECD_Run(HuCPU.timestamp * 3); } psg->EndFrame(HuCPU.timestamp / pce_overclocked); if(espec->SoundBuf) { for(int y = 0; y < 2; y++) { sbuf[y].end_frame(HuCPU.timestamp / pce_overclocked); espec->SoundBufSize = sbuf[y].read_samples(espec->SoundBuf + y, espec->SoundBufMaxSize, 1); } } espec->MasterCycles = HuCPU.timestamp * 3; INPUT_FixTS(); HuC6280_ResetTS(); if(PCE_IsCD) PCECD_ResetTS(); if(IsHES && !espec->skip) HES_Draw(espec->surface, &espec->DisplayRect, espec->SoundBuf, espec->SoundBufSize); }
void PCECD_Power(uint32 timestamp) { if((int32)timestamp != lastts) (void)PCECD_Run(timestamp); IRQCB(0); PCECD_Drive_Power(timestamp); pcecd_drive_ne = 0x7fffffff; bBRAMEnabled = false; memset(_Port, 0, sizeof(_Port)); ACKStatus = 0; ClearACKDelay = 0; memset(ADPCM.RAM, 0x00, 65536); ADPCM.ReadPending = ADPCM.WritePending = 0; ADPCM.ReadBuffer = 0; ADPCM.PlayBuffer = 0; ADPCM.LastCmd = 0; MSM5205.SetSample(0x800); MSM5205.SetSSI(0); ADPCM.SampleFreq = 0; ADPCM.LPF_SampleFreq = 0; ADPCM.bigdiv = ADPCM.bigdivacc * (16 - ADPCM.SampleFreq); RedoLPF(ADPCM.LPF_SampleFreq); ADPCM.Addr = 0; ADPCM.ReadAddr = 0; ADPCM.WriteAddr = 0; ADPCM.LengthCount = 0; ADPCM.LastCmd = 0; ADPCM.HalfReached = false; ADPCM.EndReached = false; ADPCM.Playing = false; ADPCM.PlayNibble = 0; UpdateADPCMIRQState(); Fader.Command = 0x00; Fader.Volume = 0; Fader.CycleCounter = 0; Fader.CountValue = 0; Fader.Clocked = false; }
static void Emulate(EmulateSpecStruct *espec) { INPUT_Frame(); MDFNMP_ApplyPeriodicCheats(); #if 0 { static bool firstcat = true; MDFN_PixelFormat nf; nf.bpp = 16; nf.colorspace = MDFN_COLORSPACE_RGB; nf.Rshift = 11; nf.Gshift = 5; nf.Bshift = 0; nf.Ashift = 16; nf.Rprec = 5; nf.Gprec = 6; nf.Bprec = 5; nf.Aprec = 8; espec->surface->SetFormat(nf, false); espec->VideoFormatChanged = firstcat; firstcat = false; } #endif #if 0 static bool firstcat = true; MDFN_PixelFormat tmp_pf; tmp_pf.Rshift = 0; tmp_pf.Gshift = 0; tmp_pf.Bshift = 0; tmp_pf.Ashift = 8; tmp_pf.Rprec = 6; tmp_pf.Gprec = 6; tmp_pf.Bprec = 6; tmp_pf.Aprec = 0; tmp_pf.bpp = 8; tmp_pf.colorspace = MDFN_COLORSPACE_RGB; espec->surface->SetFormat(tmp_pf, false); espec->VideoFormatChanged = firstcat; firstcat = false; #endif /*if(unlikely(espec->VideoFormatChanged)) VDC_SetPixelFormat(espec->surface->format); //.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift); if(unlikely(espec->SoundFormatChanged)) { for(int y = 0; y < 2; y++) { sbuf[y].set_sample_rate(espec->SoundRate ? espec->SoundRate : 44100, 50); sbuf[y].clock_rate((long)(PCE_MASTER_CLOCK / 3)); sbuf[y].bass_freq(10); } }*/ VDC_RunFrame(espec, IsHES); if(!espec->skip) MDFND_commitVideoFrame(espec); if(PCE_IsCD) { PCECD_Run(HuCPU.timestamp * 3); } psg->EndFrame(HuCPU.timestamp / pce_overclocked); if(espec->SoundBuf) { for(int y = 0; y < 2; y++) { sbuf[y].end_frame(HuCPU.timestamp / pce_overclocked); espec->SoundBufSize = sbuf[y].read_samples(espec->SoundBuf + y, espec->SoundBufMaxSize, 1); } } espec->MasterCycles = HuCPU.timestamp * 3; INPUT_FixTS(); HuC6280_ResetTS(); if(PCE_IsCD) PCECD_ResetTS(); if(IsHES && !espec->skip) HES_Draw(espec->surface, &espec->DisplayRect, espec->SoundBuf, espec->SoundBufSize); }
MDFN_FASTCALL uint8 PCECD_Read(uint32 timestamp, uint32 A) { uint8 ret = 0; if((A & 0x18c0) == 0x18c0) { switch (A & 0x18cf) { case 0x18c1: ret = 0xaa; break; case 0x18c2: ret = 0x55; break; case 0x18c3: ret = 0x00; break; case 0x18c5: ret = 0xaa; break; case 0x18c6: ret = 0x55; break; case 0x18c7: ret = 0x03; break; } } else { PCECD_Run(timestamp); switch(A & 0xf) { case 0x0: ret = 0; ret |= PCECD_Drive_GetBSY() ? 0x80 : 0x00; ret |= PCECD_Drive_GetREQ() ? 0x40 : 0x00; ret |= PCECD_Drive_GetMSG() ? 0x20 : 0x00; ret |= PCECD_Drive_GetCD() ? 0x10 : 0x00; ret |= PCECD_Drive_GetIO() ? 0x08 : 0x00; break; case 0x1: ret = PCECD_Drive_GetDB(); break; case 0x2: ret = _Port[2]; break; case 0x3: bBRAMEnabled = false; /* switch left/right of digitized cd playback */ ret = _Port[0x3]; _Port[0x3] ^= 2; break; case 0x4: ret = _Port[4]; break; case 0x5: if(_Port[0x3] & 0x2) ret = RawPCMVolumeCache[1] & 0xff; // Right else ret = RawPCMVolumeCache[0] & 0xff; // Left break; case 0x6: if(_Port[0x3] & 0x2) ret = ((uint16)RawPCMVolumeCache[1]) >> 8; // Right else ret = ((uint16)RawPCMVolumeCache[0]) >> 8; // Left break; case 0x7: if(SubChannelFIFO.CanRead() > 0) ret = SubChannelFIFO.ReadByte(); else ret = 0x00; // Not sure if it's 0, 0xFF, the last byte read, or something else. if(SubChannelFIFO.CanRead() == 0) { _Port[0x3] &= ~0x10; update_irq_state(); } break; case 0x8: ret = read_1808(timestamp); break; case 0xa: ADPCM_DEBUG("ReadBuffer\n"); ADPCM.ReadPending = 19 * 3; //24 * 3; ret = ADPCM.ReadBuffer; break; case 0xb: ret = _Port[0xb]; break; case 0xc: //printf("ADPCM Status Read: %d\n", timestamp); ret = 0x00; ret |= (ADPCM.EndReached) ? 0x01 : 0x00; ret |= (ADPCM.Playing) ? 0x08 : 0x00; ret |= (ADPCM.WritePending > 0) ? 0x04 : 0x00; ret |= (ADPCM.ReadPending > 0) ? 0x80 : 0x00; break; case 0xd: ret = ADPCM.LastCmd; break; } }