static void PCFX_Reset(void) { const uint32 timestamp = PCFX_V810.v810_timestamp; //printf("Reset: %d\n", timestamp); // Make sure all devices are synched to current timestamp before calling their Reset()/Power()(though devices should already do this sort of thing on their // own, but it's not implemented for all of them yet, and even if it was all implemented this is also INSURANCE). ForceEventUpdates(timestamp); PCFX_Event_Reset(); RAM_LPA = 0; ExBusReset = 0; BackupControl = 0; Last_VDC_AR[0] = 0; Last_VDC_AR[1] = 0; memset(RAM, 0x00, 2048 * 1024); for(int i = 0; i < 2; i++) { int32 dummy_ne MDFN_NOWARN_UNUSED; dummy_ne = fx_vdc_chips[i]->Reset(); } KING_Reset(timestamp); // SCSICD_Power() is called from KING_Reset() SoundBox_Reset(timestamp); RAINBOW_Reset(); if(WantHuC6273) HuC6273_Reset(); PCFXIRQ_Reset(); FXTIMER_Reset(); PCFX_V810.Reset(); // Force device updates so we can get new next event timestamp values. ForceEventUpdates(timestamp); }
static void CPUHandler(const v810_timestamp_t timestamp, uint32 PC) { std::vector<PCFX_BPOINT>::iterator bpit; for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) { if(PC >= bpit->A[0] && PC <= bpit->A[1]) { FoundBPoint = TRUE; break; } } fx_vdc_chips[0]->ResetSimulate(); fx_vdc_chips[1]->ResetSimulate(); PCFX_V810.CheckBreakpoints(PCFXDBG_CheckBP, mem_peekhword, NULL); // FIXME: mem_peekword if(PCFX_LoggingOn) { // FIXME: There is a little race condition if a user turns on logging right between jump instruction and the first // instruction at 0xFFF0000C, in which case the call-from address will be wrong. static uint32 lastPC = ~0; if(PC == 0xFFF0000C) { static const char *font_sizes[6] = { "KANJI16x16", "KANJI12x12", "ANK8x16", "ANK6x12", "ANK8x8", "ANK8x12" }; // FIXME, overflow possible and speed PCFXDBG_DoLog("ROMFONT", "0x%08x->0xFFF0000C, PR7=0x%08x=%s, PR6=0x%04x = %s", lastPC, PCFX_V810.GetPR(7), (PCFX_V810.GetPR(7) > 5) ? "?" : font_sizes[PCFX_V810.GetPR(7)], PCFX_V810.GetPR(6) & 0xFFFF, PCFXDBG_ShiftJIS_to_UTF8(PCFX_V810.GetPR(6) & 0xFFFF)); setvbuf(stdout, NULL, _IONBF, 0); printf("%s", PCFXDBG_ShiftJIS_to_UTF8(PCFX_V810.GetPR(6) & 0xFFFF)); } else if(PC == 0xFFF00008) DoSyscallLog(); lastPC = PC; } CPUHookContinuous |= FoundBPoint; if(CPUHookContinuous && CPUHook) { ForceEventUpdates(timestamp); CPUHook(PC, FoundBPoint); } FoundBPoint = false; }
static void CPUHandler(const v810_timestamp_t timestamp, uint32 PC) { std::vector<VB_BPOINT>::iterator bpit; for(bpit = BreakPointsPC.begin(); bpit != BreakPointsPC.end(); bpit++) { if(PC >= bpit->A[0] && PC <= bpit->A[1]) { FoundBPoint = TRUE; break; } } VB_V810->CheckBreakpoints(VBDBG_CheckBP, MemPeek16, NULL); CPUHookContinuous |= FoundBPoint; if(CPUHook && CPUHookContinuous) { ForceEventUpdates(timestamp); CPUHook(PC, FoundBPoint); } FoundBPoint = false; }
static void Emulate(EmulateSpecStruct *espec) { //printf("%d\n", PCFX_V810.v810_timestamp); FXINPUT_Frame(); MDFNMP_ApplyPeriodicCheats(); if(espec->VideoFormatChanged) KING_SetPixelFormat(espec->surface->format); //.Rshift, espec->surface->format.Gshift, espec->surface->format.Bshift); if(espec->SoundFormatChanged) SoundBox_SetSoundRate(espec->SoundRate); KING_StartFrame(fx_vdc_chips, espec); //espec->surface, &espec->DisplayRect, espec->LineWidths, espec->skip); v810_timestamp_t v810_timestamp; v810_timestamp = PCFX_V810.Run(pcfx_event_handler); PCFX_FixNonEvents(); // Call before resetting v810_timestamp ForceEventUpdates(v810_timestamp); // // Call KING_EndFrame() before SoundBox_Flush(), otherwise CD-DA audio distortion will occur due to sound data being updated // after it was needed instead of before. // KING_EndFrame(v810_timestamp); // // new_base_ts is guaranteed to be <= v810_timestamp // v810_timestamp_t new_base_ts; espec->SoundBufSize = SoundBox_Flush(v810_timestamp, &new_base_ts, espec->SoundBuf, espec->SoundBufMaxSize); KING_ResetTS(new_base_ts); FXTIMER_ResetTS(new_base_ts); FXINPUT_ResetTS(new_base_ts); SoundBox_ResetTS(new_base_ts); // Call this AFTER all the EndFrame/Flush/ResetTS stuff RebaseTS(v810_timestamp, new_base_ts); espec->MasterCycles = v810_timestamp - new_base_ts; PCFX_V810.ResetTS(new_base_ts); // // // if(BackupSignalDirty) { BackupSaveDelay = 120; BackupSignalDirty = false; } else if(BackupSaveDelay) { BackupSaveDelay--; if(!BackupSaveDelay) { //puts("SAVE"); try { SaveBackupMemory(); } catch(std::exception &e) { MDFN_PrintError(_("Error saving save-game memory: %s"), e.what()); MDFN_DispMessage(_("Error saving save-game memory: %s"), e.what()); BackupSaveDelay = 60 * 60; // Try it again in about 60 seconds emulated time(unless more writes occur to the backup memory before then, then the regular delay // will be used from that time). } } } }