int PsndSyncZ80(int nCycles) { while (nSyncNext < nCycles) { PsmUpdate(nSyncNext * nBurnSoundLen / nCpsZ80Cycles); ZetRun(nSyncNext - ZetTotalCycles()); nSyncNext += nSyncPeriod; } nCyclesDone = ZetRun(nCycles - ZetTotalCycles()); return 0; }
void QsndEndFrame() { BurnTimerEndFrame(nCpsZ80Cycles); if (pBurnSoundOut) QscUpdate(nBurnSoundLen); nQsndCyclesExtra = ZetTotalCycles() - nCpsZ80Cycles; QUARK_LOG_VAR(nBurnSoundLen); QUARK_LOG_VAR(ZetTotalCycles()); QUARK_LOG_VAR(nCpsZ80Cycles); QUARK_LOG_VAR(nQsndCyclesExtra); ZetClose(); }
void QsndEndFrame() { BurnTimerEndFrame(nCpsZ80Cycles); if (pBurnSoundOut) QscUpdate(nBurnSoundLen); nQsndCyclesExtra = ZetTotalCycles() - nCpsZ80Cycles; }
static inline void cpu_sync() // sync z80 & 68k { int t = ((SekTotalCycles() * 3) / 10) - ZetTotalCycles(); if (t > 0) { BurnTimerUpdate(t); } }
void QsndSyncZ80() { int nCycles = (long long)SekTotalCycles() * nCpsZ80Cycles / nCpsCycles; QUARK_LOG_VAR(nCycles); QUARK_LOG_VAR(nCpsZ80Cycles); QUARK_LOG_VAR(nCpsCycles); QUARK_LOG_VAR(SekTotalCycles()); QUARK_LOG_VAR(nSekCyclesTotal); QUARK_LOG_VAR(nSekCyclesToDo); QUARK_LOG_VAR(ZetTotalCycles()); if (nCycles <= ZetTotalCycles()) { return; } BurnTimerUpdate(nCycles); }
void QsndSyncZ80() { int nCycles = (long long)SekTotalCycles() * nCpsZ80Cycles / nCpsCycles; if (nCycles <= ZetTotalCycles()) { return; } BurnTimerUpdate(nCycles); }
void hcastle_write(UINT16 address, UINT8 data) { if ((address & 0xfff8) == 0x0000) { playfield_write(address, data, DrvPf1Ctrl, DrvSprRAM1, DrvSprBuf1); return; } if ((address & 0xfff8) == 0x0200) { playfield_write(address, data, DrvPf2Ctrl, DrvSprRAM2, DrvSprBuf2); return; } if ((address & 0xff00) == 0x0000) { DrvKonRAM0[address & 0xff] = data; return; } if ((address & 0xff00) == 0x0200) { DrvKonRAM1[address & 0xff] = data; return; } switch (address) { case 0x0400: bankswitch(data); return; case 0x0404: *soundlatch = data; return; case 0x0408: { float t = konamiTotalCycles() * 1.19318167; t -= ZetTotalCycles(); if (t > 1) ZetRun((INT32)t); ZetSetIRQLine(0, ZET_IRQSTATUS_ACK); } return; case 0x040c: watchdog = 0; return; case 0x0410: return; case 0x0418: *gfxbank = data; return; } }
inline void toaplan1SynchroniseZ80(int nExtraCycles) { int nCycles = ((long long)SekTotalCycles() * nCyclesTotal[1] / nCyclesTotal[0]) + nExtraCycles; if (nCycles <= ZetTotalCycles()) { return; } nToa1Cycles68KSync = nCycles - nExtraCycles; BurnTimerUpdate(nCycles); }
void Sf2mdtSoundCommand(UINT16 d) { INT32 nCyclesToDo = ((INT64)SekTotalCycles() * nCpsZ80Cycles / nCpsCycles) - ZetTotalCycles(); INT32 nEnd = Sf2mdtSoundPos + (INT64)Sf2mdtMSM5205Interleave * nCyclesToDo / nCpsZ80Cycles; for (INT32 i = Sf2mdtSoundPos; i < nEnd; i++) { ZetRun(Sf2mdtCyclesPerSegment); MSM5205Update(); Sf2mdtSoundPos = i; } Sf2mdtSoundLatch = d & 0xff; ZetSetIRQLine(0, ZET_IRQSTATUS_ACK); }
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 SupermanFrame() { if (SupermanReset) { // Reset machine SupermanDoReset(); } SupermanInpMake(); SekNewFrame(); ZetNewFrame(); SekOpen(0); ZetOpen(0); SekIdle(nCyclesDone[0]); ZetIdle(nCyclesDone[1]); nCyclesTotal[0] = 8000000 / 60; nCyclesTotal[1] = 4000000 / 60; SekRun(nCyclesTotal[0] - SekTotalCycles()); SekSetIRQLine(6, SEK_IRQSTATUS_AUTO); nCycles68KSync = SekTotalCycles(); BurnTimerEndFrame(nCyclesTotal[1]); BurnYM2610Update(nBurnSoundLen); nCyclesDone[0] = SekTotalCycles() - nCyclesTotal[0]; nCyclesDone[1] = ZetTotalCycles() - nCyclesTotal[1]; ZetClose(); SekClose(); if (pBurnDraw) { SupermanDraw(); // Draw screen if needed } return 0; }
/* Run the virtual console emulation for one frame */ void system_frame(int skip_render) { static int iline_table[] = {0xC0, 0xE0, 0xF0}; int lpf = (sms.display == DISPLAY_NTSC) ? 262 : 313; int iline, z80cnt = 0;; INT32 nSoundBufferPos = 0; /* Debounce pause key */ if(input.system & INPUT_PAUSE) { if(!sms.paused) { sms.paused = 1; ZetNmi(); } } else { sms.paused = 0; } ZetNewFrame(); text_counter = 0; /* End of frame, parse sprites for line 0 on line 261 (VCount=$FF) */ if(vdp.mode <= 7) parse_line(0); for(vdp.line = 0; vdp.line < lpf;) { iline = iline_table[vdp.extended]; z80cnt = 0; if(!skip_render) { render_line(vdp.line); } if(vdp.line <= iline) { vdp.left -= 1; if(vdp.left == -1) { vdp.left = vdp.reg[0x0A]; vdp.hint_pending = 1; if(vdp.reg[0x00] & 0x10) { if (!(ZetTotalCycles() % CYCLES_PER_LINE)) { ZetRun(1); z80cnt++; } ZetSetIRQLine(0, CPU_IRQSTATUS_ACK); } } } else { vdp.left = vdp.reg[0x0A]; } ZetRun(228 - z80cnt); if(vdp.line == iline) { vdp.status |= 0x80; vdp.vint_pending = 1; if(vdp.reg[0x01] & 0x20) { ZetSetIRQLine(0, CPU_IRQSTATUS_ACK); } } // Render Sound Segment if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen / lpf; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); SN76496Update(0, pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } ++vdp.line; if(vdp.mode <= 7) parse_line(vdp.line); } // Make sure the buffer is entirely filled. if (pBurnSoundOut) { INT32 nSegmentLength = nBurnSoundLen - nSoundBufferPos; INT16* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { SN76496Update(0, pSoundBuf, nSegmentLength); } } }
int toaplan1SynchroniseStream(int nSoundRate) { return (long long)ZetTotalCycles() * nSoundRate / 3500000; }
static double SupermanGetTime() { return (double)ZetTotalCycles() / 4000000.0; }
static int SupermanSynchroniseStream(int nSoundRate) { return (long long)ZetTotalCycles() * nSoundRate / 4000000; }
static INT32 DrvSynchroniseStream(INT32 nSoundRate) { return (INT64)ZetTotalCycles() * nSoundRate / 4000000; }
static double DrvGetTime() { return (double)ZetTotalCycles() / 4000000.0; }
inline static double DrvGetTime() { return (double)ZetTotalCycles() / 3072000.0; }
inline static INT32 pipibibsSynchroniseStream(INT32 nSoundRate) { return (INT64)ZetTotalCycles() * nSoundRate / 3375000; }
inline static INT32 Sf2mdtSynchroniseStream(INT32 nSoundRate) { return (INT64)((double)ZetTotalCycles() * nSoundRate / 3579540); }
inline static int DrvSynchroniseStream(int nSoundRate) { return (long long)ZetTotalCycles() * nSoundRate / 3072000; }
inline static INT32 Wc90b1SynchroniseStream(INT32 nSoundRate) { return (INT64)(double)ZetTotalCycles() * nSoundRate / 5000000; }
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; }
inline static double Wc90b1GetTime() { return (double)ZetTotalCycles() / 5000000; }