diff --git a/src/gba/remote.cpp b/src/gba/remote.cpp
index 83c289ce..b57f27d8 100644
--- a/src/gba/remote.cpp
+++ b/src/gba/remote.cpp
@@ -41,7 +41,7 @@ extern bool debugger;
extern int emulating;
extern void CPUUpdateCPSR();
-int remotePort = 55555;
+int remotePort = 0;
int remoteSignal = 5;
SOCKET remoteSocket = -1;
SOCKET remoteListenSocket = -1;
diff --git a/src/wx/cmdevents.cpp b/src/wx/cmdevents.cpp
index bc124623..3ea73794 100644
--- a/src/wx/cmdevents.cpp
+++ b/src/wx/cmdevents.cpp
@@ -28,6 +28,8 @@ extern "C" {
wxStaticCast(wxGetApp().frame->FindWindowByName(n), wxDialog)
#endif
+void GDBBreak(MainFrame* mf);
+
bool cmditem_lt(const struct cmditem &cmd1, const struct cmditem &cmd2)
{
return wxStrcmp(cmd1.cmd, cmd2.cmd) < 0;
@@ -131,51 +133,71 @@ EVT_HANDLER(RecentFreeze, "Freeze recent ROM list (toggle)")
EVT_HANDLER(wxID_FILE1, "Load recent ROM 1")
{
panel->LoadGame(gopts.recent->GetHistoryFile(0));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE2, "Load recent ROM 2")
{
panel->LoadGame(gopts.recent->GetHistoryFile(1));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE3, "Load recent ROM 3")
{
panel->LoadGame(gopts.recent->GetHistoryFile(2));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE4, "Load recent ROM 4")
{
panel->LoadGame(gopts.recent->GetHistoryFile(3));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE5, "Load recent ROM 5")
{
panel->LoadGame(gopts.recent->GetHistoryFile(4));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE6, "Load recent ROM 6")
{
panel->LoadGame(gopts.recent->GetHistoryFile(5));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE7, "Load recent ROM 7")
{
panel->LoadGame(gopts.recent->GetHistoryFile(6));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE8, "Load recent ROM 8")
{
panel->LoadGame(gopts.recent->GetHistoryFile(7));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE9, "Load recent ROM 9")
{
panel->LoadGame(gopts.recent->GetHistoryFile(8));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
EVT_HANDLER(wxID_FILE10, "Load recent ROM 10")
{
panel->LoadGame(gopts.recent->GetHistoryFile(9));
+ if (gdbBreakOnLoad)
+ GDBBreak(this);
}
static const struct rom_maker {
@@ -1682,88 +1704,115 @@ EVT_HANDLER_MASK(TileViewer, "Tile Viewer...", CMDEN_GB|CMDEN_GBA)
extern int remotePort;
-EVT_HANDLER_MASK(DebugGDB, "Wait for GDB connection...", CMDEN_NGDB_GBA)
+int GetGDBPort(MainFrame* mf)
{
- ModalPause mp;
- int port = wxGetNumberFromUser(
+ ModalPause mp;
+ return wxGetNumberFromUser(
#ifdef __WXMSW__
- wxEmptyString,
+ wxEmptyString,
#else
- _("Set to 0 for pseudo tty"),
+ _("Set to 0 for pseudo tty"),
#endif
- _("Port to wait for connection:"),
- _("GDB Connection"), remotePort,
+ _("Port to wait for connection:"),
+ _("GDB Connection"), gdbPort,
#ifdef __WXMSW__
- 1025,
+ 1025,
#else
- 0,
+ 0,
#endif
- 65535, this);
- if(port < 0)
- return;
- remotePort = port;
- wxString msg;
-#ifndef __WXMSW__
- if(!port) {
- if(!debugOpenPty())
- return;
- msg.Printf(_("Waiting for connection at %s"), debugGetSlavePty().c_str());
- } else
-#endif
- {
- if(!debugStartListen(port))
- return;
- msg.Printf(_("Waiting for connection on port %d"), port);
- }
- wxProgressDialog dlg(_("Waiting for GDB..."), msg, 100, this,
- wxPD_APP_MODAL|wxPD_CAN_ABORT|wxPD_ELAPSED_TIME);
- bool connected = false;
- while(dlg.Pulse()) {
-#ifndef __WXMSW__
- if(!port)
- connected = debugWaitPty();
- else
-#endif
- connected = debugWaitSocket();
- if(connected)
- break;
- // sleep a bit more in case of infinite loop
- wxMilliSleep(10);
- }
- if(!connected)
- remoteCleanUp();
- else {
- debugger = true;
- dbgMain = remoteStubMain;
- dbgSignal = remoteStubSignal;
- dbgOutput = remoteOutput;
- cmd_enable &= ~(CMDEN_NGDB_ANY|CMDEN_NGDB_GBA);
- cmd_enable |= CMDEN_GDB;
- enable_menus();
- }
+ 65535, mf);
}
-EVT_HANDLER_MASK(DebugGDBLoad, "Load and wait for GDB...", CMDEN_NGDB_ANY)
+EVT_HANDLER(DebugGDBPort, "Configure port...")
{
- wxCommandEvent ev;
- ModalPause mp;
- OnwxID_OPEN(ev);
- if(wxGetApp().pending_load.empty())
- return;
- panel->UnloadGame();
- DoDebugGDB();
+ gdbPort = GetGDBPort(this);
+ update_opts();
}
-EVT_HANDLER_MASK(DebugGDBBreak, "Break into GDB", CMDEN_GDB)
+EVT_HANDLER(DebugGDBBreakOnLoad, "Break on load")
{
- if(armState) {
- armNextPC -= 4;
- reg[15].I -= 4;
- } else {
- armNextPC -= 2;
- reg[15].I -= 2;
- }
- debugger = true;
+ update_icheck1("DebugGDBBreakOnLoad", gdbBreakOnLoad, 1);
+ update_opts();
+}
+
+void GDBBreak(MainFrame* mf)
+{
+ ModalPause mp;
+
+ if (gdbPort == 0)
+ {
+ gdbPort = GetGDBPort(mf);
+ update_opts();
+ }
+
+ if (gdbPort != 0) {
+ if (!remotePort)
+ {
+ wxString msg;
+#ifndef __WXMSW__
+ if (!gdbPort) {
+ if (!debugOpenPty())
+ return;
+ msg.Printf(_("Waiting for connection at %s"), debugGetSlavePty().c_str());
+ }
+ else
+#endif
+ {
+ if (!debugStartListen(gdbPort))
+ return;
+ msg.Printf(_("Waiting for connection on port %d"), gdbPort);
+ }
+ wxProgressDialog dlg(_("Waiting for GDB..."), msg, 100, mf,
+ wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME);
+ bool connected = false;
+ while (dlg.Pulse()) {
+#ifndef __WXMSW__
+ if (!gdbPort)
+ connected = debugWaitPty();
+ else
+#endif
+ connected = debugWaitSocket();
+ if (connected)
+ break;
+ // sleep a bit more in case of infinite loop
+ wxMilliSleep(10);
+ }
+
+ if (connected) {
+ remotePort = gdbPort;
+ debugger = true;
+ emulating = 1;
+
+ dbgMain = remoteStubMain;
+ dbgSignal = remoteStubSignal;
+ dbgOutput = remoteOutput;
+ mf->cmd_enable &= ~(CMDEN_NGDB_ANY | CMDEN_NGDB_GBA);
+ mf->cmd_enable |= CMDEN_GDB;
+ mf->enable_menus();
+ }
+ else
+ {
+ remoteCleanUp();
+ }
+ }
+ else
+ {
+ if (armState) {
+ armNextPC -= 4;
+ reg[15].I -= 4;
+ }
+ else {
+ armNextPC -= 2;
+ reg[15].I -= 2;
+ }
+ debugger = true;
+ }
+ }
+}
+
+EVT_HANDLER_MASK(DebugGDBBreak, "Break into GDB", CMDEN_NGDB_GBA | CMDEN_GDB)
+{
+ GDBBreak(this);
}
EVT_HANDLER_MASK(DebugGDBDisconnect, "Disconnect GDB", CMDEN_GDB)
diff --git a/src/wx/opts.cpp b/src/wx/opts.cpp
index a8ac5f1a..2458de27 100644
--- a/src/wx/opts.cpp
+++ b/src/wx/opts.cpp
@@ -212,6 +212,8 @@ opt_desc opts[] = {
INTOPT ("preferences/fullScreen", "Fullscreen", wxTRANSLATE("Enter fullscreen mode at startup"), fullScreen, 0, 1),
INTOPT ("preferences/gbFrameSkip", "", wxTRANSLATE("Skip frames. Values are 0-9 or -1 to skip automatically based on time."), gbFrameSkip, -1, 9),
ENUMOPT("preferences/gbPaletteOption", "", wxTRANSLATE("The palette to use"), gbPaletteOption, wxTRANSLATE("default|user1|user2")),
+ INTOPT ("preferences/gdbBreakOnLoad", "DebugGDBBreakOnLoad", wxTRANSLATE("Break into GDB after loading the game."), gdbBreakOnLoad, 0, 1),
+ INTOPT ("preferences/gdbPort", "DebugGDBPort", wxTRANSLATE("Port to connect GDB to."), gdbPort, 0, 65535),
INTOPT ("preferences/maxScale", "", wxTRANSLATE("Maximum scale factor (0 = no limit)"), maxScale, 0, 100),
INTOPT ("preferences/pauseWhenInactive", "PauseWhenInactive", wxTRANSLATE("Pause game when main window loses focus"), pauseWhenInactive, 0, 1),
INTOPT ("preferences/rtcEnabled", "RTC", wxTRANSLATE("Enable RTC (vba-over.ini override is rtcEnabled"), rtcEnabled, 0, 1),
diff --git a/src/wx/wxvbam.xrc b/src/wx/wxvbam.xrc
index 9a62c6bd..6b9e9569 100644
--- a/src/wx/wxvbam.xrc
+++ b/src/wx/wxvbam.xrc
@@ -410,15 +410,16 @@