void Sf2mdtSoundFrameEnd() { for (INT32 i = Sf2mdtSoundPos; i < Sf2mdtMSM5205Interleave; i++) { ZetRun(Sf2mdtCyclesPerSegment); MSM5205Update(); Sf2mdtSoundPos = i; } ZetRun(nCpsZ80Cycles - ZetTotalCycles()); if (pBurnSoundOut) { BurnYM2151Render(pBurnSoundOut, nBurnSoundLen); MSM5205Render(0, pBurnSoundOut, nBurnSoundLen); MSM5205Render(1, pBurnSoundOut, nBurnSoundLen); } ZetClose(); }
int rastanFrame() { int nInterleave = 100; rastanInpMake(); if (drvReset) { // Reset machine drvDoReset(); } SekNewFrame(); SekOpen(0); ZetOpen(0); nCyclesTotal[0] = 8000000/60; nCyclesTotal[1] = 4000000/60; rCyclesDone[0] = rCyclesDone[1] = 0; int nSoundBufferPos = 0; for (int i = 0; i < nInterleave; i++) { int nCurrentCPU; int nNext; // Run 68000 nCurrentCPU = 0; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - rCyclesDone[nCurrentCPU]; rCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); // Run Z80 nCurrentCPU = 1; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - rCyclesDone[nCurrentCPU]; nCyclesSegment = ZetRun(nCyclesSegment); rCyclesDone[nCurrentCPU] += nCyclesSegment; { // Render sound segment if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen / nInterleave; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM5205Render(0,pSoundBuf, nSegmentLength); //this wrong?? nSoundBufferPos += nSegmentLength; } } } { // Make sure the buffer is entirely filled. if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { BurnYM2151Render(pSoundBuf, nSegmentLength); MSM5205Render(0,pSoundBuf, nSegmentLength); //this wrong?? } } } SekSetIRQLine(5, SEK_IRQSTATUS_AUTO); SekClose(); ZetClose(); if (pBurnDraw) { rastanDraw(); // Draw screen if needed } return 0; }