static inline void DrvMakeInputs() { // Reset Inputs DrvInput[0] = DrvInput[1] = DrvInput[2] = 0x00; // Compile Digital Inputs for (int i = 0; i < 8; i++) { DrvInput[0] |= (DrvInputPort0[i] & 1) << i; DrvInput[1] |= (DrvInputPort1[i] & 1) << i; DrvInput[2] |= (DrvInputPort2[i] & 1) << i; } // Clear Opposites DrvClearOpposites(&DrvInput[0]); DrvClearOpposites(&DrvInput[1]); }
static int DrvFrame() { int 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 (int i = 0; i < 8; i++) { DrvInput[0] |= (DrvJoy1[i] & 1) << i; DrvInput[1] |= (DrvJoy2[i] & 1) << i; DrvInput[4] |= (DrvButton[i] & 1) << i; } DrvClearOpposites(&DrvInput[0]); DrvClearOpposites(&DrvInput[1]); SekOpen(0); ZetOpen(0); SekNewFrame(); ZetNewFrame(); SekIdle(nCyclesDone[0]); ZetIdle(nCyclesDone[1]); nCyclesTotal[0] = (int)((long long)10000000 * nBurnCPUSpeedAdjust / (0x0100 * REFRESHRATE)); nCyclesTotal[1] = int(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 (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(); // 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); } } nToa1Cycles68KSync = SekTotalCycles(); BurnTimerEndFrameYM3812(nCyclesTotal[1]); 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 = 8; 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; } DrvClearOpposites(&drvInput[0]); DrvClearOpposites(&drvInput[1]); SekNewFrame(); nCyclesTotal[0] = (int)((long long)16000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesTotal[1] = TOA_Z80_SPEED / 60; nCyclesDone[0] = nCyclesDone[1] = 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 = 1; i <= nInterleave; i++) { int nCurrentCPU; int 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); } } ToaBufferGP9001Sprites(); if (pBurnDraw) { // Draw screen if needed drvDraw(); } nIRQPending = 1; SekSetIRQLine(2, SEK_IRQSTATUS_ACK); bVBlank = true; } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } 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) { int nSegmentLength = (nBurnSoundLen * i / nInterleave) - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); MSM6295Render(1, pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } } } SekClose(); { // 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); MSM6295Render(1, pSoundBuf, nSegmentLength); } } } 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; } DrvClearOpposites(&DrvInput[0]); DrvClearOpposites(&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 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; } DrvClearOpposites(&DrvInputs[0]); DrvClearOpposites(&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; }