165 lines
4.4 KiB
C
165 lines
4.4 KiB
C
|
/*
|
||
|
* TilEm II
|
||
|
*
|
||
|
* Copyright (c) 2010-2011 Thibault Duponchelle
|
||
|
* Copyright (c) 2011 Benjamin Moody
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful, but
|
||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
typedef struct _TilemDebugBreakpoint {
|
||
|
enum {
|
||
|
TILEM_DB_BREAK_LOGICAL,
|
||
|
TILEM_DB_BREAK_PHYSICAL,
|
||
|
TILEM_DB_BREAK_PORT,
|
||
|
TILEM_DB_BREAK_OPCODE
|
||
|
} type;
|
||
|
|
||
|
enum {
|
||
|
TILEM_DB_BREAK_READ = 4,
|
||
|
TILEM_DB_BREAK_WRITE = 2,
|
||
|
TILEM_DB_BREAK_EXEC = 1
|
||
|
} mode;
|
||
|
|
||
|
dword start;
|
||
|
dword end;
|
||
|
dword mask;
|
||
|
|
||
|
int disabled;
|
||
|
int id[3];
|
||
|
} TilemDebugBreakpoint;
|
||
|
|
||
|
typedef struct _TilemDebugger {
|
||
|
struct _TilemCalcEmulator *emu;
|
||
|
struct _TilemDisasm *dasm;
|
||
|
|
||
|
/* Debugger widgets */
|
||
|
GtkWidget *window; /* Main debugger window */
|
||
|
|
||
|
GtkWidget *disasm_view; /* Disassembly view */
|
||
|
GtkWidget *mem_view; /* Memory view */
|
||
|
GtkWidget *stack_view; /* Stack view */
|
||
|
|
||
|
GtkWidget *regbox; /* Box containing registers */
|
||
|
GtkWidget *reg_entries[14]; /* Entries for registers */
|
||
|
GtkWidget *iff_checkbox; /* Checkbox for IFF */
|
||
|
GtkWidget *flag_buttons[8]; /* Buttons for flags */
|
||
|
|
||
|
/* Action groups */
|
||
|
GtkActionGroup *run_actions;
|
||
|
GtkActionGroup *paused_actions;
|
||
|
GtkActionGroup *misc_actions;
|
||
|
|
||
|
/* Memory settings */
|
||
|
int mem_rowsize;
|
||
|
int mem_start;
|
||
|
gboolean mem_logical;
|
||
|
|
||
|
/* Stack navigation */
|
||
|
GtkAction *prev_stack_action;
|
||
|
int stack_index;
|
||
|
|
||
|
/* Breakpoints */
|
||
|
GSList *breakpoints;
|
||
|
int last_bp_type;
|
||
|
int last_bp_mode;
|
||
|
|
||
|
/* Temporary breakpoint info */
|
||
|
int step_bp; /* Breakpoint ID */
|
||
|
dword step_next_addr; /* Target address */
|
||
|
|
||
|
dword lastwrite;
|
||
|
dword lastsp;
|
||
|
dword lastpc;
|
||
|
gboolean paused;
|
||
|
gboolean refreshing;
|
||
|
gboolean delayed_refresh;
|
||
|
|
||
|
/* Other windows */
|
||
|
struct _TilemKeypadDialog *keypad_dialog;
|
||
|
} TilemDebugger;
|
||
|
|
||
|
/* Create a new TilemDebugger. */
|
||
|
TilemDebugger *tilem_debugger_new(TilemCalcEmulator *emu);
|
||
|
|
||
|
/* Free a TilemDebugger. */
|
||
|
void tilem_debugger_free(TilemDebugger *dbg);
|
||
|
|
||
|
/* Show debugger, and pause emulator if not already paused. */
|
||
|
void tilem_debugger_show(TilemDebugger *dbg);
|
||
|
|
||
|
/* Hide debugger, and resume emulation if not already running. */
|
||
|
void tilem_debugger_hide(TilemDebugger *dbg);
|
||
|
|
||
|
/* New calculator loaded. */
|
||
|
void tilem_debugger_calc_changed(TilemDebugger *dbg);
|
||
|
|
||
|
/* Update display. */
|
||
|
void tilem_debugger_refresh(TilemDebugger *dbg, gboolean updatemem);
|
||
|
|
||
|
/* Add a new breakpoint. */
|
||
|
TilemDebugBreakpoint * tilem_debugger_add_breakpoint(TilemDebugger *dbg,
|
||
|
const TilemDebugBreakpoint *bp);
|
||
|
|
||
|
/* Remove an existing breakpoint. */
|
||
|
void tilem_debugger_remove_breakpoint(TilemDebugger *dbg,
|
||
|
TilemDebugBreakpoint *bp);
|
||
|
|
||
|
/* Modify an existing breakpoint. */
|
||
|
void tilem_debugger_change_breakpoint(TilemDebugger *dbg,
|
||
|
TilemDebugBreakpoint *bp,
|
||
|
const TilemDebugBreakpoint *newbp);
|
||
|
|
||
|
/* Show a dialog letting the user add, remove, and edit breakpoints. */
|
||
|
void tilem_debugger_edit_breakpoints(TilemDebugger *dbg);
|
||
|
|
||
|
|
||
|
/* Memory view */
|
||
|
|
||
|
/* Create the memory view */
|
||
|
GtkWidget *tilem_debugger_mem_view_new(TilemDebugger *dbg);
|
||
|
|
||
|
/* Set memory view settings */
|
||
|
void tilem_debugger_mem_view_configure(GtkWidget *mem_view,
|
||
|
TilemCalcEmulator *emu,
|
||
|
int rowsize, int start,
|
||
|
gboolean logical);
|
||
|
|
||
|
|
||
|
/* Keypad dialog */
|
||
|
|
||
|
typedef struct _TilemKeypadDialog {
|
||
|
TilemDebugger *dbg;
|
||
|
|
||
|
gboolean refreshing;
|
||
|
|
||
|
GtkWidget *window;
|
||
|
GtkWidget *output[7];
|
||
|
GtkWidget *keys[7][8];
|
||
|
GtkWidget *input[8];
|
||
|
} TilemKeypadDialog;
|
||
|
|
||
|
/* Create a new TilemKeypadDialog. */
|
||
|
TilemKeypadDialog *tilem_keypad_dialog_new(TilemDebugger *dbg);
|
||
|
|
||
|
/* Free a TilemKeypadDialog. */
|
||
|
void tilem_keypad_dialog_free(TilemKeypadDialog *kpdlg);
|
||
|
|
||
|
/* New calculator loaded. */
|
||
|
void tilem_keypad_dialog_calc_changed(TilemKeypadDialog *kpdlg);
|
||
|
|
||
|
/* Refresh key states. */
|
||
|
void tilem_keypad_dialog_refresh(TilemKeypadDialog *kpdlg);
|
||
|
|