Split Core_EnableStepping into Core_Break and Core_Resume

This commit is contained in:
Henrik Rydgård 2024-11-01 22:52:47 +01:00
parent cbd19c967f
commit d3e9398cb3
27 changed files with 108 additions and 90 deletions

View File

@ -333,26 +333,26 @@ bool Core_Run(GraphicsContext *ctx) {
}
}
void Core_EnableStepping(bool step, const char *reason, u32 relatedAddress) {
if (step) {
// Stop the tracer
mipsTracer.stop_tracing();
void Core_Break(const char *reason, u32 relatedAddress) {
// Stop the tracer
mipsTracer.stop_tracing();
Core_UpdateState(CORE_STEPPING);
steppingCounter++;
_assert_msg_(reason != nullptr, "No reason specified for break");
steppingReason = reason;
steppingAddress = relatedAddress;
} else {
// Clear the exception if we resume.
Core_ResetException();
coreState = CORE_RUNNING;
coreStatePending = false;
m_StepCond.notify_all();
}
Core_UpdateState(CORE_STEPPING);
steppingCounter++;
_assert_msg_(reason != nullptr, "No reason specified for break");
steppingReason = reason;
steppingAddress = relatedAddress;
System_Notify(SystemNotification::DEBUG_MODE_CHANGE);
}
void Core_Resume() {
// Clear the exception if we resume.
Core_ResetException();
coreState = CORE_RUNNING;
coreStatePending = false;
m_StepCond.notify_all();
}
bool Core_NextFrame() {
if (coreState == CORE_RUNNING) {
coreState = CORE_NEXTFRAME;
@ -428,7 +428,7 @@ void Core_MemoryException(u32 address, u32 accessSize, u32 pc, MemoryExceptionTy
e.accessSize = accessSize;
e.stackTrace = stackTrace;
e.pc = pc;
Core_EnableStepping(true, "memory.exception", address);
Core_Break("memory.exception", address);
}
}
@ -456,7 +456,7 @@ void Core_MemoryExceptionInfo(u32 address, u32 accessSize, u32 pc, MemoryExcepti
e.accessSize = accessSize;
e.stackTrace = stackTrace;
e.pc = pc;
Core_EnableStepping(true, "memory.exception", address);
Core_Break("memory.exception", address);
}
}
@ -475,10 +475,10 @@ void Core_ExecException(u32 address, u32 pc, ExecExceptionType type) {
e.pc = pc;
// This just records the closest value that could be useful as reference.
e.ra = currentMIPS->r[MIPS_REG_RA];
Core_EnableStepping(true, "cpu.exception", address);
Core_Break("cpu.exception", address);
}
void Core_Break(u32 pc) {
void Core_BreakException(u32 pc) {
ERROR_LOG(Log::CPU, "BREAK!");
MIPSExceptionInfo &e = g_exceptionInfo;
@ -488,7 +488,7 @@ void Core_Break(u32 pc) {
e.pc = pc;
if (!g_Config.bIgnoreBadMemAccess) {
Core_EnableStepping(true, "cpu.breakInstruction", currentMIPS->pc);
Core_Break("cpu.breakInstruction", currentMIPS->pc);
}
}

View File

@ -28,23 +28,36 @@ class GraphicsContext;
// called from emu thread
void UpdateRunLoop(GraphicsContext *ctx);
// For platforms that don't call Core_Run
void Core_SetGraphicsContext(GraphicsContext *ctx);
// Returns false when an UI exit state is detected.
bool Core_Run(GraphicsContext *ctx);
void Core_Stop();
// For platforms that don't call Core_Run
void Core_SetGraphicsContext(GraphicsContext *ctx);
/*
enum class CPUStepType {
None,
Into,
Over,
Out,
};
*/
// called from gui
void Core_EnableStepping(bool step, const char *reason = nullptr, u32 relatedAddress = 0);
// Async, called from gui
void Core_Break(const char *reason, u32 relatedAddress = 0);
// void Core_Step(CPUStepType type); // CPUStepType::None not allowed
void Core_Resume();
// Refactor.
void Core_DoSingleStep();
void Core_UpdateSingleStep();
void Core_ProcessStepping();
bool Core_ShouldRunBehind();
bool Core_MustRunBehind();
bool Core_NextFrame();
void Core_DoSingleStep();
void Core_UpdateSingleStep();
void Core_ProcessStepping();
// Changes every time we enter stepping.
int Core_GetSteppingCounter();
@ -113,7 +126,7 @@ void Core_MemoryException(u32 address, u32 accessSize, u32 pc, MemoryExceptionTy
void Core_MemoryExceptionInfo(u32 address, u32 accessSize, u32 pc, MemoryExceptionType type, std::string_view additionalInfo, bool forceReport);
void Core_ExecException(u32 address, u32 pc, ExecExceptionType type);
void Core_Break(u32 pc);
void Core_BreakException(u32 pc);
// Call when loading save states, etc.
void Core_ResetException();

View File

@ -153,7 +153,7 @@ int RegisterEvent(const char *name, TimedCallback callback) {
void AntiCrashCallback(u64 userdata, int cyclesLate) {
ERROR_LOG(Log::SaveState, "Savestate broken: an unregistered event was called.");
Core_EnableStepping(true, "savestate.crash", 0);
Core_Break("savestate.crash", 0);
}
void RestoreRegisterEvent(int &event_type, const char *name, TimedCallback callback) {

View File

@ -75,7 +75,7 @@ BreakAction MemCheck::Action(u32 addr, bool write, int size, u32 pc, const char
// Conditions have always already been checked if we get here.
Log(addr, write, size, pc, reason);
if ((result & BREAK_ACTION_PAUSE) && coreState != CORE_POWERUP) {
Core_EnableStepping(true, "memory.breakpoint", start);
Core_Break("memory.breakpoint", start);
}
return result;
@ -331,7 +331,7 @@ BreakAction CBreakPoints::ExecBreakPoint(u32 addr) {
}
}
if ((info.result & BREAK_ACTION_PAUSE) && coreState != CORE_POWERUP) {
Core_EnableStepping(true, "cpu.breakpoint", info.addr);
Core_Break("cpu.breakpoint", info.addr);
}
return info.result;
@ -653,7 +653,7 @@ void CBreakPoints::Update(u32 addr) {
if (MIPSComp::jit && addr != -1) {
bool resume = false;
if (Core_IsStepping() == false) {
Core_EnableStepping(true, "cpu.breakpoint.update", addr);
Core_Break("cpu.breakpoint.update", addr);
Core_WaitInactive(200);
resume = true;
}
@ -665,7 +665,7 @@ void CBreakPoints::Update(u32 addr) {
mipsr4k.ClearJitCache();
if (resume)
Core_EnableStepping(false);
Core_Resume();
}
if (anyMemChecks_ && addr != -1)

View File

@ -71,7 +71,7 @@ void WebSocketCPUStepping(DebuggerRequest &req) {
return req.Fail("CPU not started");
}
if (!Core_IsStepping() && Core_IsActive()) {
Core_EnableStepping(true, "cpu.stepping", 0);
Core_Break("cpu.stepping", 0);
}
}
@ -92,7 +92,7 @@ void WebSocketCPUResume(DebuggerRequest &req) {
if (currentMIPS->inDelaySlot) {
Core_DoSingleStep();
}
Core_EnableStepping(false);
Core_Resume();
}
// Request the current CPU status (cpu.status)

View File

@ -64,7 +64,7 @@ static AutoDisabledReplacements LockMemoryAndCPU(uint32_t addr, bool keepReplace
if (Core_IsStepping()) {
result.wasStepping = true;
} else {
Core_EnableStepping(true, "memory.access", addr);
Core_Break("memory.access", addr);
Core_WaitInactive();
}
@ -99,7 +99,7 @@ AutoDisabledReplacements::~AutoDisabledReplacements() {
RestoreSavedReplacements(replacements);
}
if (!wasStepping)
Core_EnableStepping(false);
Core_Resume();
delete lock;
}

View File

@ -93,7 +93,7 @@ void WebSocketSteppingState::Into(DebuggerRequest &req) {
if (!currentDebugMIPS->isAlive())
return req.Fail("CPU not started");
if (!Core_IsStepping()) {
Core_EnableStepping(true, "cpu.stepInto", 0);
Core_Break("cpu.stepInto", 0);
return;
}
@ -119,7 +119,7 @@ void WebSocketSteppingState::Into(DebuggerRequest &req) {
if (cpuDebug != currentDebugMIPS) {
CBreakPoints::AddBreakPoint(breakpointAddress, true);
AddThreadCondition(breakpointAddress, threadID);
Core_EnableStepping(false);
Core_Resume();
}
}
}
@ -173,7 +173,7 @@ void WebSocketSteppingState::Over(DebuggerRequest &req) {
CBreakPoints::AddBreakPoint(breakpointAddress, true);
if (cpuDebug != currentDebugMIPS)
AddThreadCondition(breakpointAddress, threadID);
Core_EnableStepping(false);
Core_Resume();
}
}
@ -222,7 +222,7 @@ void WebSocketSteppingState::Out(DebuggerRequest &req) {
CBreakPoints::AddBreakPoint(breakpointAddress, true);
if (cpuDebug != currentDebugMIPS)
AddThreadCondition(breakpointAddress, threadID);
Core_EnableStepping(false);
Core_Resume();
}
}
@ -248,7 +248,7 @@ void WebSocketSteppingState::RunUntil(DebuggerRequest &req) {
// We may have arrived already if PauseResume() stepped out of a delay slot.
if (currentMIPS->pc != address || wasAtAddress) {
CBreakPoints::AddBreakPoint(address, true);
Core_EnableStepping(false);
Core_Resume();
}
}
@ -264,7 +264,7 @@ void WebSocketSteppingState::HLE(DebuggerRequest &req) {
PrepareResume();
hleDebugBreak();
Core_EnableStepping(false);
Core_Resume();
}
uint32_t WebSocketSteppingState::GetNextAddress(DebugInterface *cpuDebug) {

View File

@ -361,7 +361,7 @@ bool hleExecuteDebugBreak(const HLEFunction &func)
return false;
}
Core_EnableStepping(true, "hle.step", latestSyscallPC);
Core_Break("hle.step", latestSyscallPC);
return true;
}

View File

@ -260,7 +260,7 @@ void Arm64JitBackend::CompIR_System(IRInst inst) {
RestoreRoundingMode(true);
SaveStaticRegisters();
MovFromPC(W0);
QuickCallFunction(SCRATCH2_64, &Core_Break);
QuickCallFunction(SCRATCH2_64, &Core_BreakException);
LoadStaticRegisters();
ApplyRoundingMode(true);
MovFromPC(SCRATCH1);

View File

@ -1196,7 +1196,7 @@ u32 IRInterpret(MIPSState *mips, const IRInst *inst) {
break;
case IROp::Break:
Core_Break(mips->pc);
Core_BreakException(mips->pc);
return mips->pc + 4;
case IROp::Breakpoint:

View File

@ -178,7 +178,7 @@ namespace MIPSInt
void Int_Break(MIPSOpcode op)
{
Reporting::ReportMessage("BREAK instruction hit");
Core_Break(PC);
Core_BreakException(PC);
PC += 4;
}

View File

@ -1004,7 +1004,7 @@ static void RunUntilWithChecks(u64 globalTicks) {
if (hasBPs && CBreakPoints::IsAddressBreakPoint(curMips->pc) && CBreakPoints::CheckSkipFirst() != curMips->pc) {
auto cond = CBreakPoints::GetBreakPointCondition(currentMIPS->pc);
if (!cond || cond->Evaluate()) {
Core_EnableStepping(true, "cpu.breakpoint", curMips->pc);
Core_Break("cpu.breakpoint", curMips->pc);
if (CBreakPoints::IsTempBreakPoint(curMips->pc))
CBreakPoints::RemoveBreakPoint(curMips->pc);
break;

View File

@ -232,7 +232,7 @@ void RiscVJitBackend::CompIR_System(IRInst inst) {
RestoreRoundingMode(true);
SaveStaticRegisters();
MovFromPC(X10);
QuickCallFunction(&Core_Break, SCRATCH2);
QuickCallFunction(&Core_BreakException, SCRATCH2);
LoadStaticRegisters();
ApplyRoundingMode(true);
MovFromPC(SCRATCH1);

View File

@ -109,7 +109,7 @@ static void JitBranchLogMismatch(MIPSOpcode op, u32 pc)
char temp[256];
MIPSDisAsm(op, pc, temp, sizeof(temp), true);
ERROR_LOG(Log::JIT, "Bad jump: %s - int:%08x jit:%08x", temp, currentMIPS->intBranchExit, currentMIPS->jitBranchExit);
Core_EnableStepping(true, "jit.branchdebug", pc);
Core_Break("jit.branchdebug", pc);
}
void Jit::BranchLog(MIPSOpcode op)

View File

@ -255,7 +255,7 @@ void X64JitBackend::CompIR_System(IRInst inst) {
RestoreRoundingMode(true);
SaveStaticRegisters();
MovFromPC(SCRATCH1);
ABI_CallFunctionR((const void *)&Core_Break, SCRATCH1);
ABI_CallFunctionR((const void *)&Core_BreakException, SCRATCH1);
LoadStaticRegisters();
ApplyRoundingMode(true);
MovFromPC(SCRATCH1);

View File

@ -554,7 +554,7 @@ static void raintegration_event_handler(const rc_client_raintegration_event_t *e
break;
case RC_CLIENT_RAINTEGRATION_EVENT_PAUSE:
// The toolkit has hit a breakpoint and wants to pause the emulator. Do so.
Core_EnableStepping(true, "ra_breakpoint");
Core_Break("ra_breakpoint");
break;
case RC_CLIENT_RAINTEGRATION_EVENT_HARDCORE_CHANGED:
// Hardcore mode has been changed (either directly by the user, or disabled through the use of the tools).

View File

@ -426,7 +426,7 @@ namespace SaveState
{
rewindStates.NotifyState();
if (coreState == CoreState::CORE_RUNTIME_ERROR)
Core_EnableStepping(true, "savestate.load", 0);
Core_Break("savestate.load", 0);
Enqueue(Operation(SAVESTATE_LOAD, filename, slot, callback, cbUserData));
}
@ -434,7 +434,7 @@ namespace SaveState
{
rewindStates.NotifyState();
if (coreState == CoreState::CORE_RUNTIME_ERROR)
Core_EnableStepping(true, "savestate.save", 0);
Core_Break("savestate.save", 0);
Enqueue(Operation(SAVESTATE_SAVE, filename, slot, callback, cbUserData));
}
@ -446,7 +446,7 @@ namespace SaveState
void Rewind(Callback callback, void *cbUserData)
{
if (coreState == CoreState::CORE_RUNTIME_ERROR)
Core_EnableStepping(true, "savestate.rewind", 0);
Core_Break("savestate.rewind", 0);
Enqueue(Operation(SAVESTATE_REWIND, Path(), -1, callback, cbUserData));
}

View File

@ -438,10 +438,10 @@ void OSXOpenURL(const char *url) {
std::shared_ptr<I18NCategory> developerUILocalization = GetI18NCategory(I18NCat::DEVELOPER);
#define DEVELOPERUI_LOCALIZED(key) @(developerUILocalization->T_cstr(key))
if (Core_IsStepping()) {
Core_EnableStepping(false, "ui.break");
Core_Resume();
item.title = DESKTOPUI_LOCALIZED("Break");
} else {
Core_EnableStepping(true, "ui.break");
Core_Break("ui.break", 0);
item.title = DEVELOPERUI_LOCALIZED("Resume");
}
}
@ -452,7 +452,7 @@ void OSXOpenURL(const char *url) {
-(void)resetAction: (NSMenuItem *)item {
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
Core_EnableStepping(false);
Core_Resume();
}
-(void)chatAction: (NSMenuItem *)item {

View File

@ -843,7 +843,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
if (ctrl && (k == SDLK_w))
{
if (Core_IsStepping())
Core_EnableStepping(false);
Core_Resume();
Core_Stop();
System_PostUIMessage(UIMessage::REQUEST_GAME_STOP);
// NOTE: Unlike Windows version, this
@ -854,7 +854,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
if (ctrl && (k == SDLK_b))
{
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
Core_EnableStepping(false);
Core_Resume();
}
}
break;

View File

@ -118,7 +118,7 @@ static void __EmuScreenVblank()
if (frameStep_ && lastNumFlips != gpuStats.numFlips)
{
frameStep_ = false;
Core_EnableStepping(true, "ui.frameAdvance", 0);
Core_Break("ui.frameAdvance", 0);
lastNumFlips = gpuStats.numFlips;
}
#ifndef MOBILE_DEVICE
@ -495,7 +495,7 @@ static void AfterSaveStateAction(SaveState::Status status, std::string_view mess
static void AfterStateBoot(SaveState::Status status, std::string_view message, void *ignored) {
AfterSaveStateAction(status, message, ignored);
Core_EnableStepping(false);
Core_Resume();
System_Notify(SystemNotification::DISASSEMBLY);
}
@ -658,7 +658,7 @@ void EmuScreen::onVKey(int virtualKeyCode, bool down) {
case VIRTKEY_FASTFORWARD:
if (down) {
if (coreState == CORE_STEPPING) {
Core_EnableStepping(false);
Core_Resume();
}
PSP_CoreParameter().fastForward = true;
} else {
@ -1452,10 +1452,10 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
// If game is running, pause emulation immediately. Otherwise, advance a single frame.
if (Core_IsStepping()) {
frameStep_ = true;
Core_EnableStepping(false);
Core_Resume();
} else if (!frameStep_) {
lastNumFlips = gpuStats.numFlips;
Core_EnableStepping(true, "ui.frameAdvance", 0);
Core_Break("ui.frameAdvance", 0);
}
}
}

View File

@ -918,7 +918,7 @@ UI::ViewGroup *CreatePadLayout(float xres, float yres, bool *pause, bool showPau
fastForward->SetAngle(180.0f);
fastForward->OnChange.Add([](UI::EventParams &e) {
if (e.a && coreState == CORE_STEPPING) {
Core_EnableStepping(false);
Core_Resume();
}
return UI::EVENT_DONE;
});

View File

@ -427,7 +427,7 @@ void CtrlMemView::onChar(WPARAM wParam, LPARAM lParam) {
bool active = Core_IsActive();
if (active)
Core_EnableStepping(true, "memory.access", curAddress_);
Core_Break("memory.access", curAddress_);
if (asciiSelected_) {
Memory::WriteUnchecked_U8((u8)wParam, curAddress_);
@ -452,7 +452,7 @@ void CtrlMemView::onChar(WPARAM wParam, LPARAM lParam) {
Reporting::NotifyDebugger();
if (active)
Core_EnableStepping(false);
Core_Resume();
}
void CtrlMemView::redraw() {

View File

@ -286,7 +286,7 @@ void CDisasm::stepOver()
}
CBreakPoints::AddBreakPoint(breakpointAddress,true);
Core_EnableStepping(false);
Core_Resume();
Sleep(1);
ptr->gotoAddr(breakpointAddress);
UpdateDialog();
@ -322,7 +322,7 @@ void CDisasm::stepOut() {
ptr->setDontRedraw(true);
CBreakPoints::AddBreakPoint(breakpointAddress,true);
Core_EnableStepping(false);
Core_Resume();
Sleep(1);
ptr->gotoAddr(breakpointAddress);
UpdateDialog();
@ -340,7 +340,7 @@ void CDisasm::runToLine()
lastTicks = CoreTiming::GetTicks();
ptr->setDontRedraw(true);
CBreakPoints::AddBreakPoint(pos,true);
Core_EnableStepping(false);
Core_Resume();
}
BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
@ -418,7 +418,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
bool isRunning = Core_IsActive();
if (isRunning)
{
Core_EnableStepping(true, "cpu.breakpoint.add", 0);
Core_Break("cpu.breakpoint.add", 0);
Core_WaitInactive(200);
}
@ -426,7 +426,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
if (bpw.exec()) bpw.addBreakpoint();
if (isRunning)
Core_EnableStepping(false);
Core_Resume();
view->UnlockPosition();
keepStatusBarText = false;
}
@ -519,7 +519,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
if (!Core_IsStepping()) // stop
{
ptr->setDontRedraw(false);
Core_EnableStepping(true, "ui.break", 0);
Core_Break("ui.break", 0);
Sleep(1); //let cpu catch up
ptr->gotoPC();
UpdateDialog();
@ -529,7 +529,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
// If the current PC is on a breakpoint, the user doesn't want to do nothing.
CBreakPoints::SetSkipFirst(currentMIPS->pc);
Core_EnableStepping(false);
Core_Resume();
}
}
break;
@ -556,7 +556,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
CBreakPoints::SetSkipFirst(currentMIPS->pc);
hleDebugBreak();
Core_EnableStepping(false);
Core_Resume();
}
break;

View File

@ -82,7 +82,7 @@ INT_PTR CALLBACK DumpMemoryWindow::dlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam,
bool priorDumpWasStepping = Core_IsStepping();
if (!priorDumpWasStepping && PSP_IsInited()) {
// If emulator isn't paused force paused state, but wait before locking.
Core_EnableStepping(true, "memory.access", bp->start);
Core_Break("memory.access", bp->start);
Core_WaitInactive();
}
@ -117,7 +117,7 @@ INT_PTR CALLBACK DumpMemoryWindow::dlgFunc(HWND hwnd, UINT iMsg, WPARAM wParam,
fclose(output);
if (!priorDumpWasStepping) {
// If emulator wasn't paused before memory dump resume emulation automatically.
Core_EnableStepping(false);
Core_Resume();
}
MessageBoxA(hwnd, "Done.", "Information", MB_OK);

View File

@ -285,7 +285,7 @@ void MainThreadFunc() {
if (g_Config.bBrowse)
PostMessage(MainWindow::GetHWND(), WM_COMMAND, ID_FILE_LOAD, 0);
Core_EnableStepping(false);
Core_Resume();
if (useEmuThread) {
while (emuThreadState != (int)EmuThreadState::DISABLED) {

View File

@ -841,10 +841,15 @@ namespace MainWindow
}
if (!noFocusPause && g_Config.bPauseOnLostFocus && GetUIState() == UISTATE_INGAME) {
if (pause != Core_IsStepping()) {
if (disasmWindow)
if (disasmWindow) {
SendMessage(disasmWindow->GetDlgHandle(), WM_COMMAND, IDC_STOPGO, 0);
else
Core_EnableStepping(pause, "ui.lost_focus", 0);
} else {
if (pause) {
Core_Break("ui.lost_focus", 0);
} else {
Core_Resume();
}
}
}
}
@ -1018,7 +1023,7 @@ namespace MainWindow
if (DragQueryFile(hdrop, 0, filename, ARRAY_SIZE(filename)) != 0) {
const std::string utf8_filename = ReplaceAll(ConvertWStringToUTF8(filename), "\\", "/");
System_PostUIMessage(UIMessage::REQUEST_GAME_BOOT, utf8_filename);
Core_EnableStepping(false);
Core_Resume();
}
}
DragFinish(hdrop);

View File

@ -330,7 +330,7 @@ namespace MainWindow {
if (GetUIState() == UISTATE_INGAME) {
browsePauseAfter = Core_IsStepping();
if (!browsePauseAfter)
Core_EnableStepping(true, "ui.boot", 0);
Core_Break("ui.boot", 0);
}
auto mm = GetI18NCategory(I18NCat::MAINMENU);
@ -349,7 +349,7 @@ namespace MainWindow {
void BrowseAndBootDone(std::string filename) {
if (GetUIState() == UISTATE_INGAME || GetUIState() == UISTATE_EXCEPTION || GetUIState() == UISTATE_PAUSEMENU) {
Core_EnableStepping(false);
Core_Resume();
}
filename = ReplaceAll(filename, "\\", "/");
System_PostUIMessage(UIMessage::REQUEST_GAME_BOOT, filename);
@ -475,12 +475,12 @@ namespace MainWindow {
if (disasmWindow)
SendMessage(disasmWindow->GetDlgHandle(), WM_COMMAND, IDC_STOPGO, 0);
else
Core_EnableStepping(false);
Core_Resume();
} else {
if (disasmWindow)
SendMessage(disasmWindow->GetDlgHandle(), WM_COMMAND, IDC_STOPGO, 0);
else
Core_EnableStepping(true, "ui.break", 0);
Core_Break("ui.break", 0);
}
noFocusPause = !noFocusPause; // If we pause, override pause on lost focus
break;
@ -491,7 +491,7 @@ namespace MainWindow {
case ID_EMULATION_STOP:
if (Core_IsStepping())
Core_EnableStepping(false);
Core_Resume();
Core_Stop();
System_PostUIMessage(UIMessage::REQUEST_GAME_STOP);
@ -500,7 +500,7 @@ namespace MainWindow {
case ID_EMULATION_RESET:
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
Core_EnableStepping(false);
Core_Resume();
break;
case ID_EMULATION_SWITCH_UMD: