diff --git a/src/frontend/qt_sdl/CLI.cpp b/src/frontend/qt_sdl/CLI.cpp index 5e352cae..4e74015b 100644 --- a/src/frontend/qt_sdl/CLI.cpp +++ b/src/frontend/qt_sdl/CLI.cpp @@ -44,6 +44,13 @@ CommandLineOptions* ManageArgs(QApplication& melon) parser.addOption(QCommandLineOption({"b", "boot"}, "Whether to boot firmware on startup. Defaults to \"auto\" (boot if NDS rom given)", "auto/always/never", "auto")); parser.addOption(QCommandLineOption({"f", "fullscreen"}, "Start melonDS in fullscreen mode")); +#ifdef GDBSTUB_ENABLED + parser.addOption(QCommandLineOption("break-arm9", "Yield ARM9 execution to the GDB stub immediately on startup")); + parser.addOption(QCommandLineOption("break-arm7", "Yield ARM7 execution to the GDB stub immediately on startup")); + parser.addOption(QCommandLineOption("no-break-arm9", "Do not wait for GDB on ARM9 startup, even if the option to do so is enabled")); + parser.addOption(QCommandLineOption("no-break-arm7", "Do not wait for GDB on ARM9 startup, even if the option to do so is enabled")); +#endif + #ifdef ARCHIVE_SUPPORT_ENABLED parser.addOption(QCommandLineOption({"a", "archive-file"}, "Specify file to load inside an archive given (NDS)", "rom")); parser.addOption(QCommandLineOption({"A", "archive-file-gba"}, "Specify file to load inside an archive given (GBA)", "rom")); @@ -55,6 +62,25 @@ CommandLineOptions* ManageArgs(QApplication& melon) options->fullscreen = parser.isSet("fullscreen"); +#ifdef GDBSTUB_ENABLED + if (parser.isSet("break-arm9")) + { + options->arm9BreakOnStart = true; + } + if (parser.isSet("no-break-arm9")) + { + options->arm9BreakOnStart = false; + } + if (parser.isSet("break-arm7")) + { + options->arm7BreakOnStart = true; + } + if (parser.isSet("no-break-arm7")) + { + options->arm7BreakOnStart = false; + } +#endif + QStringList posargs = parser.positionalArguments(); switch (posargs.size()) { diff --git a/src/frontend/qt_sdl/CLI.h b/src/frontend/qt_sdl/CLI.h index beb120bf..ec575f1c 100644 --- a/src/frontend/qt_sdl/CLI.h +++ b/src/frontend/qt_sdl/CLI.h @@ -34,6 +34,10 @@ struct CommandLineOptions std::optional gbaRomArchivePath; bool fullscreen; bool boot; +#ifdef GDBSTUB_ENABLED + std::optional arm9BreakOnStart; + std::optional arm7BreakOnStart; +#endif }; extern CommandLineOptions* ManageArgs(QApplication& melon); diff --git a/src/frontend/qt_sdl/EmuInstance.cpp b/src/frontend/qt_sdl/EmuInstance.cpp index 75db0018..2223b79d 100644 --- a/src/frontend/qt_sdl/EmuInstance.cpp +++ b/src/frontend/qt_sdl/EmuInstance.cpp @@ -64,7 +64,12 @@ const string kWifiSettingsPath = "wfcsettings.bin"; extern Net net; -EmuInstance::EmuInstance(int inst) : deleting(false), +EmuInstance::EmuInstance(int inst, InstanceStartupOptions options) : +#ifdef GDBSTUB_ENABLED + overrideArm9BreakOnStart(options.arm9BreakOnStart), + overrideArm7BreakOnStart(options.arm7BreakOnStart), +#endif + deleting(false), instanceID(inst), globalCfg(Config::GetGlobalTable()), localCfg(Config::GetLocalTable(inst)) @@ -150,6 +155,12 @@ EmuInstance::EmuInstance(int inst) : deleting(false), } } +EmuInstance::EmuInstance(int inst) : + EmuInstance(inst, {}) +{ + +} + EmuInstance::~EmuInstance() { deleting = true; @@ -1287,8 +1298,8 @@ bool EmuInstance::updateConsole() noexcept GDBArgs _gdbargs { static_cast(gdbopt.GetInt("ARM7.Port")), static_cast(gdbopt.GetInt("ARM9.Port")), - gdbopt.GetBool("ARM7.BreakOnStartup"), - gdbopt.GetBool("ARM9.BreakOnStartup"), + overrideArm7BreakOnStart.value_or(gdbopt.GetBool("ARM7.BreakOnStartup")), + overrideArm9BreakOnStart.value_or(gdbopt.GetBool("ARM9.BreakOnStartup")), }; auto gdbargs = gdbopt.GetBool("Enabled") ? std::make_optional(_gdbargs) : std::nullopt; #else diff --git a/src/frontend/qt_sdl/EmuInstance.h b/src/frontend/qt_sdl/EmuInstance.h index 48e4e5b9..85353cbd 100644 --- a/src/frontend/qt_sdl/EmuInstance.h +++ b/src/frontend/qt_sdl/EmuInstance.h @@ -21,6 +21,12 @@ #include +struct InstanceStartupOptions +{ + std::optional arm9BreakOnStart; + std::optional arm7BreakOnStart; +}; + #include "main.h" #include "NDS.h" #include "EmuThread.h" @@ -79,6 +85,7 @@ class EmuInstance { public: EmuInstance(int inst); + EmuInstance(int inst, InstanceStartupOptions options); ~EmuInstance(); int getInstanceID() { return instanceID; } @@ -271,6 +278,11 @@ private: bool changeGBACart; std::unique_ptr nextGBACart; +#ifdef GDBSTUB_ENABLED + std::optional overrideArm9BreakOnStart = std::nullopt; + std::optional overrideArm7BreakOnStart = std::nullopt; +#endif + // HACK public: std::unique_ptr ndsSave; diff --git a/src/frontend/qt_sdl/Window.cpp b/src/frontend/qt_sdl/Window.cpp index a156a993..398121fd 100644 --- a/src/frontend/qt_sdl/Window.cpp +++ b/src/frontend/qt_sdl/Window.cpp @@ -1743,7 +1743,7 @@ void MainWindow::onOpenTitleManager() void MainWindow::onMPNewInstance() { - createEmuInstance(); + createEmuInstance({}); } void MainWindow::onLANStartHost() diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index d940340a..0d5b1644 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -118,7 +118,7 @@ void NetInit() } -bool createEmuInstance() +bool createEmuInstance(InstanceStartupOptions options) { int id = -1; for (int i = 0; i < kMaxEmuInstances; i++) @@ -133,7 +133,7 @@ bool createEmuInstance() if (id == -1) return false; - auto inst = new EmuInstance(id); + auto inst = new EmuInstance(id, options); emuInstances[id] = inst; return true; @@ -349,7 +349,12 @@ int main(int argc, char** argv) NetInit(); - createEmuInstance(); + InstanceStartupOptions instanceOptions; +#ifdef GDBSTUB_ENABLED + instanceOptions.arm9BreakOnStart = options->arm9BreakOnStart; + instanceOptions.arm7BreakOnStart = options->arm7BreakOnStart; +#endif + createEmuInstance(instanceOptions); { MainWindow* win = emuInstances[0]->getMainWindow(); diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index e0d38963..d5d56c4b 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -54,7 +54,7 @@ extern QString emuDirectory; extern QElapsedTimer sysTimer; -bool createEmuInstance(); +bool createEmuInstance(InstanceStartupOptions options); void deleteEmuInstance(int id); void deleteAllEmuInstances(int first = 0); int numEmuInstances();