Skip to content

Commit ed2175f

Browse files
committed
[debugger] Add option save/load debugger settings
1 parent 7845c8d commit ed2175f

File tree

11 files changed

+294
-0
lines changed

11 files changed

+294
-0
lines changed

platforms/shared/desktop/gui_debug.cpp

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define GUI_DEBUG_IMPORT
2121
#include "gui_debug.h"
2222

23+
#include <fstream>
2324
#include "geargrafx.h"
2425
#include "imgui.h"
2526
#include "gui_debug_disassembler.h"
@@ -125,3 +126,119 @@ void gui_debug_windows(void)
125126
gui_debug_memory_search_window();
126127
}
127128
}
129+
130+
static const char* GGDEBUG_MAGIC = "GGDEBUG1";
131+
static const int GGDEBUG_MAGIC_LEN = 8;
132+
133+
void gui_debug_save_settings(const char* file_path)
134+
{
135+
std::ofstream file(file_path, std::ios::binary);
136+
if (!file.is_open())
137+
{
138+
Log("Failed to open debug settings file for writing: %s", file_path);
139+
return;
140+
}
141+
142+
file.write(GGDEBUG_MAGIC, GGDEBUG_MAGIC_LEN);
143+
144+
GeargrafxCore* core = emu_get_core();
145+
HuC6280* processor = core->GetHuC6280();
146+
147+
std::vector<HuC6280::GG_Breakpoint>* breakpoints = processor->GetBreakpoints();
148+
int bp_count = (int)breakpoints->size();
149+
file.write((const char*)&bp_count, sizeof(int));
150+
for (int i = 0; i < bp_count; i++)
151+
{
152+
HuC6280::GG_Breakpoint& bp = (*breakpoints)[i];
153+
file.write((const char*)&bp.enabled, sizeof(bool));
154+
file.write((const char*)&bp.type, sizeof(int));
155+
file.write((const char*)&bp.address1, sizeof(u16));
156+
file.write((const char*)&bp.address2, sizeof(u16));
157+
file.write((const char*)&bp.read, sizeof(bool));
158+
file.write((const char*)&bp.write, sizeof(bool));
159+
file.write((const char*)&bp.execute, sizeof(bool));
160+
file.write((const char*)&bp.range, sizeof(bool));
161+
}
162+
163+
file.write((const char*)&emu_debug_irq_breakpoints, sizeof(bool));
164+
165+
void* bookmarks_ptr = NULL;
166+
int bookmark_count = gui_debug_get_disassembler_bookmarks(&bookmarks_ptr);
167+
file.write((const char*)&bookmark_count, sizeof(int));
168+
if (bookmark_count > 0 && bookmarks_ptr != NULL)
169+
{
170+
struct DasmBookmark { u16 address; char name[32]; };
171+
std::vector<DasmBookmark>* bm_vec = (std::vector<DasmBookmark>*)bookmarks_ptr;
172+
for (int i = 0; i < bookmark_count; i++)
173+
{
174+
file.write((const char*)&(*bm_vec)[i].address, sizeof(u16));
175+
file.write((*bm_vec)[i].name, 32);
176+
}
177+
}
178+
179+
gui_debug_memory_save_settings(file);
180+
181+
file.close();
182+
183+
Log("Debug settings saved to: %s", file_path);
184+
}
185+
186+
void gui_debug_load_settings(const char* file_path)
187+
{
188+
std::ifstream file(file_path, std::ios::binary);
189+
if (!file.is_open())
190+
{
191+
Log("Failed to open debug settings file for reading: %s", file_path);
192+
return;
193+
}
194+
195+
char magic[8];
196+
file.read(magic, GGDEBUG_MAGIC_LEN);
197+
if (memcmp(magic, GGDEBUG_MAGIC, GGDEBUG_MAGIC_LEN) != 0)
198+
{
199+
Log("Invalid debug settings file: %s", file_path);
200+
file.close();
201+
return;
202+
}
203+
204+
GeargrafxCore* core = emu_get_core();
205+
HuC6280* processor = core->GetHuC6280();
206+
207+
processor->ResetBreakpoints();
208+
int bp_count = 0;
209+
file.read((char*)&bp_count, sizeof(int));
210+
std::vector<HuC6280::GG_Breakpoint>* breakpoints = processor->GetBreakpoints();
211+
for (int i = 0; i < bp_count; i++)
212+
{
213+
HuC6280::GG_Breakpoint bp;
214+
file.read((char*)&bp.enabled, sizeof(bool));
215+
file.read((char*)&bp.type, sizeof(int));
216+
file.read((char*)&bp.address1, sizeof(u16));
217+
file.read((char*)&bp.address2, sizeof(u16));
218+
file.read((char*)&bp.read, sizeof(bool));
219+
file.read((char*)&bp.write, sizeof(bool));
220+
file.read((char*)&bp.execute, sizeof(bool));
221+
file.read((char*)&bp.range, sizeof(bool));
222+
breakpoints->push_back(bp);
223+
}
224+
225+
file.read((char*)&emu_debug_irq_breakpoints, sizeof(bool));
226+
227+
gui_debug_reset_disassembler_bookmarks();
228+
int bookmark_count = 0;
229+
file.read((char*)&bookmark_count, sizeof(int));
230+
for (int i = 0; i < bookmark_count; i++)
231+
{
232+
u16 address;
233+
char name[32];
234+
file.read((char*)&address, sizeof(u16));
235+
file.read(name, 32);
236+
gui_debug_add_disassembler_bookmark(address, name);
237+
}
238+
239+
gui_debug_memory_load_settings(file);
240+
241+
file.close();
242+
243+
Log("Debug settings loaded from: %s", file_path);
244+
}

platforms/shared/desktop/gui_debug.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ EXTERN void gui_debug_destroy(void);
3333
EXTERN void gui_debug_reset(void);
3434
EXTERN void gui_debug_callback(void);
3535
EXTERN void gui_debug_windows(void);
36+
EXTERN void gui_debug_save_settings(const char* file_path);
37+
EXTERN void gui_debug_load_settings(const char* file_path);
3638

3739
#undef GUI_DEBUG_IMPORT
3840
#undef EXTERN

platforms/shared/desktop/gui_debug_disassembler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1978,6 +1978,11 @@ int gui_debug_get_disassembler_bookmarks(void** bookmarks_ptr)
19781978
return (int)bookmarks.size();
19791979
}
19801980

1981+
void gui_debug_reset_disassembler_bookmarks(void)
1982+
{
1983+
bookmarks.clear();
1984+
}
1985+
19811986
int gui_debug_get_symbols(void** symbols_ptr)
19821987
{
19831988
*symbols_ptr = (void*)fixed_symbols;

platforms/shared/desktop/gui_debug_disassembler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ EXTERN void gui_debug_remove_symbol(u8 bank, u16 address);
4949
EXTERN void gui_debug_add_disassembler_bookmark(u16 address, const char* name);
5050
EXTERN void gui_debug_remove_disassembler_bookmark(u16 address);
5151
EXTERN int gui_debug_get_disassembler_bookmarks(void** bookmarks_ptr);
52+
EXTERN void gui_debug_reset_disassembler_bookmarks(void);
5253
EXTERN int gui_debug_get_symbols(void** symbols_ptr);
5354
EXTERN void gui_debug_runtocursor(void);
5455
EXTERN void gui_debug_runto_address(u16 address);

platforms/shared/desktop/gui_debug_memeditor.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,3 +1861,68 @@ void MemEditor::SetGuiFont(ImFont* gui_font)
18611861
{
18621862
m_gui_font = gui_font;
18631863
}
1864+
1865+
void MemEditor::SaveSettings(std::ostream& stream)
1866+
{
1867+
int bookmark_count = (int)m_bookmarks.size();
1868+
stream.write((const char*)&bookmark_count, sizeof(int));
1869+
for (int i = 0; i < bookmark_count; i++)
1870+
{
1871+
stream.write((const char*)&m_bookmarks[i].address, sizeof(int));
1872+
stream.write(m_bookmarks[i].name, sizeof(m_bookmarks[i].name));
1873+
}
1874+
1875+
int watch_count = (int)m_watches.size();
1876+
stream.write((const char*)&watch_count, sizeof(int));
1877+
for (int i = 0; i < watch_count; i++)
1878+
{
1879+
stream.write((const char*)&m_watches[i].address, sizeof(int));
1880+
stream.write(m_watches[i].notes, sizeof(m_watches[i].notes));
1881+
stream.write((const char*)&m_watches[i].size, sizeof(int));
1882+
stream.write((const char*)&m_watches[i].format, sizeof(int));
1883+
}
1884+
1885+
stream.write((const char*)&m_bytes_per_row, sizeof(int));
1886+
stream.write((const char*)&m_preview_data_type, sizeof(int));
1887+
stream.write((const char*)&m_preview_endianess, sizeof(int));
1888+
stream.write((const char*)&m_uppercase_hex, sizeof(bool));
1889+
stream.write((const char*)&m_gray_out_zeros, sizeof(bool));
1890+
}
1891+
1892+
void MemEditor::LoadSettings(std::istream& stream)
1893+
{
1894+
m_bookmarks.clear();
1895+
int bookmark_count = 0;
1896+
stream.read((char*)&bookmark_count, sizeof(int));
1897+
for (int i = 0; i < bookmark_count; i++)
1898+
{
1899+
Bookmark bookmark;
1900+
stream.read((char*)&bookmark.address, sizeof(int));
1901+
stream.read(bookmark.name, sizeof(bookmark.name));
1902+
m_bookmarks.push_back(bookmark);
1903+
}
1904+
1905+
m_watches.clear();
1906+
int watch_count = 0;
1907+
stream.read((char*)&watch_count, sizeof(int));
1908+
for (int i = 0; i < watch_count; i++)
1909+
{
1910+
Watch watch;
1911+
stream.read((char*)&watch.address, sizeof(int));
1912+
stream.read(watch.notes, sizeof(watch.notes));
1913+
stream.read((char*)&watch.size, sizeof(int));
1914+
stream.read((char*)&watch.format, sizeof(int));
1915+
m_watches.push_back(watch);
1916+
}
1917+
1918+
stream.read((char*)&m_bytes_per_row, sizeof(int));
1919+
stream.read((char*)&m_preview_data_type, sizeof(int));
1920+
stream.read((char*)&m_preview_endianess, sizeof(int));
1921+
stream.read((char*)&m_uppercase_hex, sizeof(bool));
1922+
stream.read((char*)&m_gray_out_zeros, sizeof(bool));
1923+
1924+
if (m_bytes_per_row < 4) m_bytes_per_row = 4;
1925+
if (m_bytes_per_row > 32) m_bytes_per_row = 32;
1926+
if (m_preview_data_type < 0 || m_preview_data_type > 5) m_preview_data_type = 0;
1927+
if (m_preview_endianess < 0 || m_preview_endianess > 1) m_preview_endianess = 0;
1928+
}

platforms/shared/desktop/gui_debug_memeditor.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <stdint.h>
2424
#include <stdio.h>
2525
#include <vector>
26+
#include <iostream>
2627
#include "imgui.h"
2728

2829
class MemEditor
@@ -79,6 +80,8 @@ class MemEditor
7980
void SetGuiFont(ImFont* gui_font);
8081
void BookMarkPopup();
8182
void WatchPopup();
83+
void SaveSettings(std::ostream& stream);
84+
void LoadSettings(std::istream& stream);
8285
void StepFrame();
8386
int GetWordBytes();
8487
char* GetTitle();

platforms/shared/desktop/gui_debug_memory.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,3 +493,19 @@ int gui_debug_memory_search(int editor, int op, int compare_type, int compare_va
493493
*results_ptr = (void*)results;
494494
return count;
495495
}
496+
497+
void gui_debug_memory_save_settings(std::ostream& stream)
498+
{
499+
for (int i = 0; i < MEMORY_EDITOR_MAX; i++)
500+
{
501+
mem_edit[i].SaveSettings(stream);
502+
}
503+
}
504+
505+
void gui_debug_memory_load_settings(std::istream& stream)
506+
{
507+
for (int i = 0; i < MEMORY_EDITOR_MAX; i++)
508+
{
509+
mem_edit[i].LoadSettings(stream);
510+
}
511+
}

platforms/shared/desktop/gui_debug_memory.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#ifndef GUI_DEBUG_MEMORY_H
2121
#define GUI_DEBUG_MEMORY_H
2222

23+
#include <iostream>
2324
#include "geargrafx.h"
2425

2526
#ifdef GUI_DEBUG_MEMORY_IMPORT
@@ -69,6 +70,8 @@ EXTERN int gui_debug_memory_get_watches(int editor, void** watches_ptr);
6970
EXTERN void gui_debug_memory_get_selection(int editor, int* start, int* end);
7071
EXTERN void gui_debug_memory_search_capture(int editor);
7172
EXTERN int gui_debug_memory_search(int editor, int op, int compare_type, int compare_value, int data_type, void** results_ptr);
73+
EXTERN void gui_debug_memory_save_settings(std::ostream& stream);
74+
EXTERN void gui_debug_memory_load_settings(std::istream& stream);
7275

7376
#undef GUI_DEBUG_MEMORY_IMPORT
7477
#undef EXTERN

platforms/shared/desktop/gui_filedialogs.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "gui_debug_memory.h"
2525
#include "gui_debug_disassembler.h"
2626
#include "gui_debug_trace_logger.h"
27+
#include "gui_debug.h"
2728
#include "gui_menus.h"
2829
#include "application.h"
2930
#include "config.h"
@@ -471,6 +472,65 @@ void gui_file_dialog_save_log(void)
471472
}
472473
}
473474

475+
void gui_file_dialog_save_debug_settings(void)
476+
{
477+
nfdchar_t *outPath;
478+
nfdfilteritem_t filterItem[1] = { { "Debug Settings Files", "ggdebug" } };
479+
nfdsavedialogu8args_t args = { };
480+
args.filterList = filterItem;
481+
args.filterCount = 1;
482+
args.defaultPath = config_emulator.last_open_path.c_str();
483+
484+
std::string default_name;
485+
GeargrafxCore* core = emu_get_core();
486+
if (core && core->GetMedia() && strlen(core->GetMedia()->GetFileName()) > 0)
487+
{
488+
default_name = core->GetMedia()->GetFileName();
489+
std::string::size_type dot = default_name.find_last_of('.');
490+
if (dot != std::string::npos)
491+
default_name = default_name.substr(0, dot);
492+
default_name += ".ggdebug";
493+
}
494+
495+
args.defaultName = default_name.empty() ? NULL : default_name.c_str();
496+
file_dialog_set_native_window(application_sdl_window, &args.parentWindow);
497+
498+
nfdresult_t result = NFD_SaveDialogU8_With(&outPath, &args);
499+
if (result == NFD_OKAY)
500+
{
501+
gui_debug_save_settings(outPath);
502+
gui_set_status_message("Debug settings saved", 3000);
503+
NFD_FreePath(outPath);
504+
}
505+
else if (result != NFD_CANCEL)
506+
{
507+
Error("Save Debug Settings Error: %s", NFD_GetError());
508+
}
509+
}
510+
511+
void gui_file_dialog_load_debug_settings(void)
512+
{
513+
nfdchar_t *outPath;
514+
nfdfilteritem_t filterItem[1] = { { "Debug Settings Files", "ggdebug" } };
515+
nfdopendialogu8args_t args = { };
516+
args.filterList = filterItem;
517+
args.filterCount = 1;
518+
args.defaultPath = config_emulator.last_open_path.c_str();
519+
file_dialog_set_native_window(application_sdl_window, &args.parentWindow);
520+
521+
nfdresult_t result = NFD_OpenDialogU8_With(&outPath, &args);
522+
if (result == NFD_OKAY)
523+
{
524+
gui_debug_load_settings(outPath);
525+
gui_set_status_message("Debug settings loaded", 3000);
526+
NFD_FreePath(outPath);
527+
}
528+
else if (result != NFD_CANCEL)
529+
{
530+
Error("Load Debug Settings Error: %s", NFD_GetError());
531+
}
532+
}
533+
474534
void gui_file_dialog_load_palette(void)
475535
{
476536
nfdchar_t *outPath;

platforms/shared/desktop/gui_filedialogs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ EXTERN void gui_file_dialog_save_background(int vdc);
4545
EXTERN void gui_file_dialog_save_memory_dump(bool binary);
4646
EXTERN void gui_file_dialog_save_disassembler(bool full);
4747
EXTERN void gui_file_dialog_save_log(void);
48+
EXTERN void gui_file_dialog_save_debug_settings(void);
49+
EXTERN void gui_file_dialog_load_debug_settings(void);
4850
EXTERN void gui_file_dialog_load_palette(void);
4951

5052
#undef GUI_FILEDIALOGS_IMPORT

0 commit comments

Comments
 (0)