static int DrvFrame() { int nInterleave = 10; int nSoundBufferPos = 0; if (DrvReset) DrvDoReset(); DrvMakeInputs(); nCyclesTotal[0] = 28638000 / 60; nCyclesDone[0] = 0; for (int i = 0; i < nInterleave; i++) { int nCurrentCPU, nNext; nCurrentCPU = 0; Sh2Open(0); nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; nCyclesDone[nCurrentCPU] += Sh2Run(nCyclesSegment); if (i == 5) Sh2SetIRQLine(1, SH2_IRQSTATUS_AUTO); if (i == 9) Sh2SetIRQLine(5, SH2_IRQSTATUS_AUTO); Sh2Close(); } if (pBurnDraw) DrvDraw(); return 0; }
static int DrvFrame() { if (DrvReset) DrvDoReset(); if (bRecalcPalette) { for (int i=0;i<(0x1000/2); i++) RamCurPal[i] = CalcCol( RamPal[i] ); bRecalcPalette = 0; } DrvInput[0] = 0x00; // Joy1 DrvInput[1] = 0x00; // Joy2 DrvInput[2] = 0x00; // Buttons for (int i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[2] |= (DrvButton[i] & 1) << i; } SekNewFrame(); SekOpen(0); #if 0 int nCyclesDone = 0; int nCyclesNext = 0; for(int i=0; i<10; i++) { nCyclesNext += (16000000 / 60 / 10); nCyclesDone += SekRun( nCyclesNext - nCyclesDone ); } #else SekRun(16000000 / 60); #endif SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); SekClose(); if (pBurnDraw) DrvDraw(); if (pBurnSoundOut) { memset(pBurnSoundOut, 0, nBurnSoundLen * 4); MSM6295Render(0, pBurnSoundOut, nBurnSoundLen); MSM6295Render(1, pBurnSoundOut, nBurnSoundLen); } return 0; }
static int DrvFrame() { if (DrvReset) { DrvDoReset(); } ZetOpen(0); ZetRun(4000000 / 60); ZetRaiseIrq(0); ZetClose(); if (pBurnDraw) { DrvDraw(); } return 0; }
static int DrvFrame() { if (DrvReset) { DrvDoReset(); } m6502Open(0); m6502Run(4000000 / 60); m6502SetIRQ(M6502_IRQ); m6502Close(); if (pBurnSoundOut) { int nSample; int nSegmentLength = nBurnSoundLen; short* pSoundBuf = pBurnSoundOut; if (nSegmentLength) { AY8910Update(0, &pAY8910Buffer[0], nSegmentLength); for (int n = 0; n < nSegmentLength; n++) { nSample = pAY8910Buffer[0][n]; nSample += pAY8910Buffer[1][n]; nSample += pAY8910Buffer[2][n]; nSample /= 4; if (nSample < -32768) { nSample = -32768; } else { if (nSample > 32767) { nSample = 32767; } } pSoundBuf[(n << 1) + 0] = nSample; pSoundBuf[(n << 1) + 1] = nSample; } } } if (pBurnDraw) { DrvDraw(); } return 0; }
static INT32 DrvFrame() { if (DrvReset) { DrvDoReset(); } { memset (DrvInputs, 0xff, 2 * sizeof(INT16)); for (INT32 i = 0; i < 16; i++) { DrvInputs[0] ^= (DrvJoy1[i] & 1) << i; DrvInputs[1] ^= (DrvJoy2[i] & 1) << i; } } INT32 nInterleave = 256; INT32 nCyclesTotal[1] = { 12000000 / 60 }; INT32 nCyclesDone[1] = { 0 }; SekOpen(0); for (INT32 i = 0; i < nInterleave; i++) { nCyclesDone[0] += SekRun(nCyclesTotal[0] / nInterleave); if (control_data & 0x800) { if (i == 0) SekSetIRQLine(4, CPU_IRQSTATUS_AUTO); if (i == 240) SekSetIRQLine(3, CPU_IRQSTATUS_AUTO); } } if (pBurnSoundOut) { YMZ280BRender(pBurnSoundOut, nBurnSoundLen); } SekClose(); if (pBurnDraw) { DrvDraw(); } return 0; }
static INT32 DrvFrame() { if (DrvReset) { DrvDoReset(); } { memset (DrvInputs, 0xff, 3); for (INT32 i = 0; i < 8; i++) { DrvInputs[0] ^= DrvJoy1[i] << i; DrvInputs[1] ^= DrvJoy2[i] << i; DrvInputs[2] ^= DrvJoy3[i] << i; } } INT32 nInterleave = 10; INT32 nCyclesTotal[2] = { 6000000 / 60, 6000000 / 60 }; INT32 nCyclesDone[2] = { 0, 0 }; for (INT32 i = 0; i < nInterleave; i++) { INT32 nSegment; ZetOpen(0); nSegment = nCyclesTotal[0] / nInterleave; nCyclesDone[0] += ZetRun(nSegment); if (i == (nInterleave - 1)) ZetSetIRQLine(0, CPU_IRQSTATUS_AUTO); ZetClose(); ZetOpen(1); nCyclesDone[1] += ZetRun(nSegment); ZetClose(); } if (pBurnSoundOut) { MSM6295Render(0,pBurnSoundOut, nBurnSoundLen); } if (pBurnDraw) { DrvDraw(); } return 0; }
static int s1945iiFrame() { if (DrvReset) // Reset machine DrvDoReset(); if (bRecalcPalette) { // for(int i=0;i<0x4000;i++) CalcCol(i); bRecalcPalette = 0; } Sh2Run(28636350 / 60); // Sh2SetIRQLine(4, SH2_IRQSTATUS_AUTO); // Sh2SetIRQLine(12, SH2_IRQSTATUS_AUTO); // bprintf(0, _T("PC: %08x\n"), Sh2GetPC(0)); //Sh2Run(1000); if (pBurnDraw) DrvDraw(); return 0; }
static INT32 DrvFrame() { INT32 nInterleave = 4; if (DrvReset) { DrvDoReset(); } memset (DrvInputs, 0, 3); for (INT32 i = 0; i < 8; i++) { DrvInputs[0] |= (DrvJoy1[i] & 1) << i; DrvInputs[1] |= (DrvJoy2[i] & 1) << i; DrvInputs[2] |= (DrvJoy3[i] & 1) << i; } ToaClearOpposites(&DrvInputs[0]); ToaClearOpposites(&DrvInputs[1]); SekNewFrame(); ZetNewFrame(); SekOpen(0); ZetOpen(0); SekIdle(nCyclesDone[0]); ZetIdle(nCyclesDone[1]); nCyclesTotal[0] = (INT32)((INT64)10000000 * nBurnCPUSpeedAdjust / (0x0100 * REFRESHRATE)); nCyclesTotal[1] = INT32(28000000.0 / 8 / REFRESHRATE); SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; for (INT32 i = 0; i < nInterleave; i++) { INT32 nNext; // Run 68000 nNext = (i + 1) * nCyclesTotal[0] / nInterleave; // Trigger VBlank interrupt if (nNext > nToaCyclesVBlankStart) { if (SekTotalCycles() < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - SekTotalCycles(); SekRun(nCyclesSegment); } if (pBurnDraw) { DrvDraw(); } memcpy (DrvSprBuf, DrvSprRAM, 0x1000); bVBlank = true; if (bEnableInterrupts) { SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); } } nCyclesSegment = nNext - SekTotalCycles(); if (bVBlank || (!CheckSleep(0))) { SekRun(nCyclesSegment); } else { SekIdle(nCyclesSegment); } BurnTimerUpdateYM3812(i * (nCyclesTotal[1] / nInterleave)); } nToa1Cycles68KSync = SekTotalCycles(); BurnTimerEndFrameYM3812(nCyclesTotal[1]); if (pBurnSoundOut) BurnYM3812Update(pBurnSoundOut, nBurnSoundLen); nCyclesDone[0] = SekTotalCycles() - nCyclesTotal[0]; SekClose(); ZetClose(); return 0; }
static int DrvFrame() { if (DrvReset) { DrvDoReset(); } ZetNewFrame(); { memset (DrvInputs, 0xff, 3); for (int i = 0; i < 8; i++) { DrvInputs[0] ^= (DrvJoy1[i] & 1) << i; DrvInputs[1] ^= (DrvJoy2[i] & 1) << i; DrvInputs[2] ^= (DrvJoy3[i] & 1) << i; } // Clear opposites if ((DrvInputs[1] & 0x03) == 0) DrvInputs[1] |= 0x03; if ((DrvInputs[1] & 0x0c) == 0) DrvInputs[1] |= 0x0c; if ((DrvInputs[2] & 0x03) == 0) DrvInputs[1] |= 0x03; if ((DrvInputs[2] & 0x0c) == 0) DrvInputs[1] |= 0x0c; } int nInterleave = 100; int nSoundBufferPos = 0; int nCyclesTotal[2] = { 3072000 / 60, 3072000 / 60 }; M6809Open(0); ZetOpen(0); for (int i = 0; i < nInterleave; i++) { M6809Run(nCyclesTotal[0] / nInterleave); BurnTimerUpdate(i * (nCyclesTotal[1] / nInterleave)); if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2203Update(pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } } BurnTimerEndFrame(nCyclesTotal[1]); if (*irq_enable) M6809SetIRQ(0, M6809_IRQSTATUS_AUTO); if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { BurnYM2203Update(pSoundBuf, nSegmentLength); } } ZetClose(); M6809Close(); if (pBurnDraw) { DrvDraw(); } return 0; }
static int DrvFrame() { int nInterleave = 4; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0x00; // Buttons DrvInput[1] = 0x00; // Player 1 DrvInput[2] = 0x00; // Player 2 for (int i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[2] |= (DrvButton[i] & 1) << i; } ToaClearOpposites(&DrvInput[0]); ToaClearOpposites(&DrvInput[1]); SekNewFrame(); nCyclesTotal[0] = (int)((long long)16000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesDone[0] = 0; SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; SekOpen(0); for (int i = 0; i < nInterleave; i++) { int nCurrentCPU; int nNext; // Run 68000 nCurrentCPU = 0; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; // Trigger VBlank interrupt if (!bVBlank && nNext > nToaCyclesVBlankStart) { if (nCyclesDone[nCurrentCPU] < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - nCyclesDone[nCurrentCPU]; nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } bVBlank = true; ToaBufferGP9001Sprites(); // Trigger VBlank interrupt SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (bVBlank || (!CheckSleep(nCurrentCPU))) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } } SekClose(); if (pBurnDraw) { DrvDraw(); // Draw screen if needed } return 0; }
static INT32 DrvFrame() { INT32 nInterleave = 10; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0x00; // Buttons DrvInput[1] = 0x00; // Player 1 DrvInput[2] = 0x00; // Player 2 for (INT32 i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[2] |= (DrvButton[i] & 1) << i; } ToaClearOpposites(&DrvInput[0]); ToaClearOpposites(&DrvInput[1]); SekNewFrame(); VezNewFrame(); INT32 nSoundBufferPos = 0; nCyclesTotal[0] = (INT32)((INT64)16000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesTotal[1] = (INT32)((INT64)8000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesDone[0] = 0; nCyclesDone[1] = 0; SekOpen(0); SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; VezOpen(0); for (INT32 i = 0; i < nInterleave; i++) { INT32 nCurrentCPU; INT32 nNext; // Run 68000 nCurrentCPU = 0; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; // Trigger VBlank interrupt if (!bVBlank && nNext > nToaCyclesVBlankStart) { if (nCyclesDone[nCurrentCPU] < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - nCyclesDone[nCurrentCPU]; nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } bVBlank = true; ToaBufferGP9001Sprites(); // Trigger VBlank interrupt SekSetIRQLine(4, CPU_IRQSTATUS_AUTO); } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (bVBlank || (!CheckSleep(nCurrentCPU))) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } nCyclesDone[1] += VezRun(nCyclesTotal[1] / nInterleave); if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen / nInterleave; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } } if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos; if (nSegmentLength) { INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); } } VezClose(); SekClose(); if (pBurnDraw) { DrvDraw(); // Draw screen if needed } return 0; }
static int DrvFrame() { int nCyclesVBlank; int nInterleave = 8; int nCyclesTotal[2]; int nCyclesDone[2]; int nCyclesSegment; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0x0000; // Player 1 DrvInput[1] = 0x0000; // Player 2 for (int i = 0; i < 10; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; } CaveClearOpposites(&DrvInput[0]); CaveClearOpposites(&DrvInput[1]); SekNewFrame(); nCyclesTotal[0] = (int)((long long)16000000 * nBurnCPUSpeedAdjust / (0x0100 * CAVE_REFRESHRATE)); nCyclesDone[0] = 0; nCyclesVBlank = nCyclesTotal[0] - (int)((nCyclesTotal[0] * CAVE_VBLANK_LINES) / 271.5); bVBlank = false; int nSoundBufferPos = 0; SekOpen(0); for (int i = 1; i <= nInterleave; i++) { int nCurrentCPU = 0; int nNext = i * nCyclesTotal[nCurrentCPU] / nInterleave; // Run 68000 // See if we need to trigger the VBlank interrupt if (!bVBlank && nNext > nCyclesVBlank) { if (nCyclesDone[nCurrentCPU] < nCyclesVBlank) { nCyclesSegment = nCyclesVBlank - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } } if (pBurnDraw != NULL) { DrvDraw(); // Draw screen if needed } bVBlank = true; nVideoIRQ = 0; UpdateIRQStatus(); } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } } // Make sure the buffer is entirely filled. { if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { MSM6295Render(0, pSoundBuf, nSegmentLength); MSM6295Render(1, pSoundBuf, nSegmentLength); } } } SekClose(); return 0; }
static INT32 DrvFrame() { INT32 nInterleave = 4; if (DrvReset) { DrvDoReset(); } memset (DrvInputs, 0, 3); for (INT32 i = 0; i < 8; i++) { DrvInputs[0] |= (DrvJoy1[i] & 1) << i; DrvInputs[1] |= (DrvJoy2[i] & 1) << i; DrvInputs[2] |= (DrvJoy3[i] & 1) << i; } ToaClearOpposites(&DrvInputs[0]); ToaClearOpposites(&DrvInputs[1]); SekNewFrame(); SekOpen(0); SekIdle(nCyclesDone[0]); nCyclesTotal[0] = (INT32)((INT64)10000000 * nBurnCPUSpeedAdjust / (0x0100 * REFRESHRATE)); SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; for (INT32 i = 0; i < nInterleave; i++) { INT32 nNext; // Run 68000 nNext = (i + 1) * nCyclesTotal[0] / nInterleave; // Trigger VBlank interrupt if (nNext > nToaCyclesVBlankStart) { if (SekTotalCycles() < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - SekTotalCycles(); SekRun(nCyclesSegment); } if (pBurnDraw) { DrvDraw(); } ToaBufferFCU2Sprites(); bVBlank = true; if (bEnableInterrupts) { SekSetIRQLine(4, CPU_IRQSTATUS_AUTO); } } nCyclesSegment = nNext - SekTotalCycles(); if (bVBlank || (!CheckSleep(0))) { SekRun(nCyclesSegment); } else { SekIdle(nCyclesSegment); } } nToa1Cycles68KSync = SekTotalCycles(); // BurnTimerEndFrameYM3812(nCyclesTotal[1]); // BurnYM3812Update(pBurnSoundOut, nBurnSoundLen); if (pBurnSoundOut) { BurnSampleRender(pBurnSoundOut, nBurnSoundLen); #ifdef TOAPLAN_SOUND_SAMPLES_HACK if (Start > 0) Wait++; if (Wait >= (108 + Start2)) { StopSamplesChannel0(); SetVolumeSamplesChannel0(1.00); BurnSamplePlay(0x07); Start = 0; Start2 = 1; Wait = 0; } if (Start2 == 0) ESEFadeout2(); #endif } nCyclesDone[0] = SekTotalCycles() - nCyclesTotal[0]; // bprintf(PRINT_NORMAL, _T(" %i\n"), nCyclesDone[0]); ToaBufferFCU2Sprites(); SekSetIRQLine(2, CPU_IRQSTATUS_AUTO); // sprite buffer finished... SekClose(); return 0; }
static INT32 DrvFrame() { INT32 nCyclesVBlank; INT32 nInterleave = 8; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0; // Player 1 DrvInput[1] = 0; // Player 2 for (INT32 i = 0; i < 16; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; } CaveClearOpposites(&DrvInput[0]); CaveClearOpposites(&DrvInput[1]); DrvInput[0] ^= 0xffff; DrvInput[1] ^= 0xffff; SekNewFrame(); nCyclesTotal[0] = (INT32)((INT64)16000000 * nBurnCPUSpeedAdjust / (0x0100 * CAVE_REFRESHRATE)); nCyclesDone[0] = 0; nCyclesVBlank = nCyclesTotal[0] - (INT32)((nCyclesTotal[0] * CAVE_VBLANK_LINES) / 271.5); bVBlank = false; INT32 nSoundBufferPos = 0; SekOpen(0); for (INT32 i = 1; i <= nInterleave; i++) { INT32 nNext; // Render sound segment if ((i & 1) == 0) { if (pBurnSoundOut) { INT32 nSegmentEnd = nBurnSoundLen * i / nInterleave; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); YMZ280BRender(pSoundBuf, nSegmentEnd - nSoundBufferPos); nSoundBufferPos = nSegmentEnd; } } // Run 68000 nCurrentCPU = 0; nNext = i * nCyclesTotal[nCurrentCPU] / nInterleave; // See if we need to trigger the VBlank interrupt if (!bVBlank && nNext > nCyclesVBlank) { if (nCyclesDone[nCurrentCPU] < nCyclesVBlank) { nCyclesSegment = nCyclesVBlank - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } } if (pBurnDraw != NULL) { DrvDraw(); // Draw screen if needed } bVBlank = true; nVideoIRQ = 0; UpdateIRQStatus(); } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } nCurrentCPU = -1; } { // Make sure the buffer is entirely filled. if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { YMZ280BRender(pSoundBuf, nSegmentLength); } } } SekClose(); return 0; }
static INT32 DrvFrame() { INT32 nInterleave = 8; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0x00; // Buttons DrvInput[1] = 0x00; // Player 1 DrvInput[2] = 0x00; // Player 2 for (INT32 i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[2] |= (DrvButton[i] & 1) << i; } ToaClearOpposites(&DrvInput[0]); ToaClearOpposites(&DrvInput[1]); SekNewFrame(); nCyclesTotal[0] = (INT32)((INT64)16000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesTotal[1] = TOA_Z80_SPEED / 60; nCyclesDone[0] = nCyclesDone[1] = 0; SekOpen(0); SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; INT32 nSoundBufferPos = 0; ZetOpen(0); for (INT32 i = 1; i <= nInterleave; i++) { INT32 nCurrentCPU; INT32 nNext; // Run 68000 nCurrentCPU = 0; nNext = i * nCyclesTotal[nCurrentCPU] / nInterleave; // Trigger VBlank interrupt if (!bVBlank && nNext > nToaCyclesVBlankStart) { if (nCyclesDone[nCurrentCPU] < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } } nIRQPending = 1; SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); ToaBufferGP9001Sprites(); if (pBurnDraw) { DrvDraw(); // Draw screen if needed } bVBlank = true; } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); nIRQPending = 0; } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } if ((i & 1) == 0) { // Run Z80 nCurrentCPU = 1; nNext = i * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; nCyclesDone[nCurrentCPU] += ZetRun(nCyclesSegment); // Render sound segment if (pBurnSoundOut) { INT32 nSegmentLength = (nBurnSoundLen * i / nInterleave) - nSoundBufferPos; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } } } SekClose(); { // Make sure the buffer is entirely filled. if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); } } } ZetClose(); return 0; }
static INT32 DrvFrame() { INT32 nInterleave = 4; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0x00; // Buttons DrvInput[1] = 0x00; // Player 1 DrvInput[4] = 0x00; // Player 2 for (INT32 i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[4] |= (DrvButton[i] & 1) << i; } ToaClearOpposites(&DrvInput[0]); ToaClearOpposites(&DrvInput[1]); SekNewFrame(); ZetNewFrame(); SekOpen(0); ZetOpen(0); SekIdle(nCyclesDone[0]); ZetIdle(nCyclesDone[1]); nCyclesTotal[0] = (INT32)((INT64)10000000 * nBurnCPUSpeedAdjust / (0x0100 * REFRESHRATE)); nCyclesTotal[1] = INT32(28000000.0 / 8 / REFRESHRATE); SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; for (INT32 i = 0; i < nInterleave; i++) { INT32 nNext; // Run 68000 nNext = (i + 1) * nCyclesTotal[0] / nInterleave; // Trigger VBlank interrupt if (nNext > nToaCyclesVBlankStart) { if (SekTotalCycles() < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - SekTotalCycles(); SekRun(nCyclesSegment); } if (pBurnDraw) { DrvDraw(); // Draw screen if needed } ToaBufferFCU2Sprites(); bVBlank = true; if (bEnableInterrupts) { SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); } } nCyclesSegment = nNext - SekTotalCycles(); if (bVBlank || (!CheckSleep(0))) { // See if this CPU is busywaiting SekRun(nCyclesSegment); } else { SekIdle(nCyclesSegment); } BurnTimerUpdateYM3812(i * (nCyclesTotal[1] / nInterleave)); } nToa1Cycles68KSync = SekTotalCycles(); BurnTimerEndFrameYM3812(nCyclesTotal[1]); if (pBurnSoundOut) BurnYM3812Update(pBurnSoundOut, nBurnSoundLen); nCyclesDone[0] = SekTotalCycles() - nCyclesTotal[0]; nCyclesDone[1] = ZetTotalCycles() - nCyclesTotal[1]; // bprintf(PRINT_NORMAL, _T(" %i\n"), nCyclesDone[0]); ZetClose(); SekClose(); // ToaBufferFCU2Sprites(); return 0; }
static int DrvFrame() { int nInterleave = 4; if (DrvReset) { DrvDoReset(); } memset (DrvInputs, 0, 3); for (int i = 0; i < 8; i++) { DrvInputs[0] |= (DrvJoy1[i] & 1) << i; DrvInputs[1] |= (DrvJoy2[i] & 1) << i; DrvInputs[2] |= (DrvJoy3[i] & 1) << i; } ToaClearOpposites(&DrvInputs[0]); ToaClearOpposites(&DrvInputs[1]); SekOpen(0); SekNewFrame(); SekIdle(nCyclesDone[0]); nCyclesTotal[0] = (int)((long long)10000000 * nBurnCPUSpeedAdjust / (0x0100 * REFRESHRATE)); SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; for (int i = 0; i < nInterleave; i++) { int nNext; // Run 68000 nNext = (i + 1) * nCyclesTotal[0] / nInterleave; // Trigger VBlank interrupt if (nNext > nToaCyclesVBlankStart) { if (SekTotalCycles() < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - SekTotalCycles(); SekRun(nCyclesSegment); } if (pBurnDraw) { DrvDraw(); } ToaBufferFCU2Sprites(); bVBlank = true; if (bEnableInterrupts) { SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); } } nCyclesSegment = nNext - SekTotalCycles(); if (bVBlank || (!CheckSleep(0))) { SekRun(nCyclesSegment); } else { SekIdle(nCyclesSegment); } } nToa1Cycles68KSync = SekTotalCycles(); // BurnTimerEndFrameYM3812(nCyclesTotal[1]); // BurnYM3812Update(pBurnSoundOut, nBurnSoundLen); nCyclesDone[0] = SekTotalCycles() - nCyclesTotal[0]; // bprintf(PRINT_NORMAL, _T(" %i\n"), nCyclesDone[0]); ToaBufferFCU2Sprites(); SekSetIRQLine(2, SEK_IRQSTATUS_AUTO); // sprite buffer finished... SekClose(); return 0; }
static int DrvFrame() { int nInterleave = 4; if (DrvReset) { // Reset machine DrvDoReset(); } // Compile digital inputs DrvInput[0] = 0x00; // Buttons DrvInput[1] = 0x00; // Player 1 DrvInput[2] = 0x00; // Player 2 DrvInput[6] = 0x00; DrvInput[7] = 0x00; for (int i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[2] |= (DrvButton[i] & 1) << i; DrvInput[6] |= (DrvJoy3[i] & 1) << i; DrvInput[7] |= (DrvJoy4[i] & 1) << i; } ToaClearOpposites(&DrvInput[0]); ToaClearOpposites(&DrvInput[1]); ToaClearOpposites(&DrvInput[6]); ToaClearOpposites(&DrvInput[7]); SekNewFrame(); nCyclesTotal[0] = (int)((long long)16000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesDone[0] = 0; SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; int nSoundBufferPos = 0; SekOpen(0); for (int i = 0; i < nInterleave; i++) { int nCurrentCPU; int nNext; // Run 68000 nCurrentCPU = 0; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; // Trigger VBlank interrupt if (!bVBlank && nNext > nToaCyclesVBlankStart) { if (nCyclesDone[nCurrentCPU] < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - nCyclesDone[nCurrentCPU]; nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } bVBlank = true; ToaBufferGP9001Sprites(); SekSetIRQLine(4, SEK_IRQSTATUS_AUTO); } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (bVBlank || (!CheckSleep(nCurrentCPU))) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } { // Render sound segment if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen / nInterleave; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); 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); MSM6295Render(0, pSoundBuf, nSegmentLength); } } } SekClose(); if (pBurnDraw != NULL) { DrvDraw(); // Draw screen if needed } return 0; }