From 6e2066b7f9be54e91ae59f9a4fa301386a7fe26e Mon Sep 17 00:00:00 2001 From: rheiny Date: Sat, 19 Aug 2006 18:31:18 +0000 Subject: [PATCH] Started to separate debugger code into common code and Windows-specific code --- src/drivers/win/debugger.cpp | 169 +++++++++++++++++++-------------- src/drivers/win/debugger.h | 8 ++ src/drivers/win/debuggersp.cpp | 68 ------------- src/drivers/win/debuggersp.h | 2 +- 4 files changed, 105 insertions(+), 142 deletions(-) diff --git a/src/drivers/win/debugger.cpp b/src/drivers/win/debugger.cpp index 9ca82a60..301726b2 100644 --- a/src/drivers/win/debugger.cpp +++ b/src/drivers/win/debugger.cpp @@ -92,87 +92,110 @@ void CenterWindow(HWND hwndDlg) { MoveWindow(hwndDlg, x, y, width, height, FALSE); } -int NewBreak(HWND hwndDlg, int num, int enable) { - unsigned int brk=0,ppu=0,sprite=0; - char str[5]; - char buffer[201]; +#define START_OFFSET_HANDLE 200 +#define END_OFFSET_HANDLE 201 +#define READ_BREAKPOINT_HANDLE 102 +#define WRITE_BREAKPOINT_HANDLE 103 +#define EXECUTE_BREAKPOINT_HANDLE 104 +#define CPU_BREAKPOINT_HANDLE 105 +#define PPU_BREAKPOINT_HANDLE 106 +#define SPRITE_BREAKPOINT_HANDLE 107 - GetDlgItemText(hwndDlg,200,str,5); - if (IsDlgButtonChecked(hwndDlg,106) == BST_CHECKED) ppu = 1; - else if (IsDlgButtonChecked(hwndDlg,107) == BST_CHECKED) sprite = 1; - if ((!ppu) && (!sprite)) { - if (GI->type == GIT_NSF) { //NSF Breakpoint keywords - if (strcmp(str,"LOAD") == 0) brk = (NSFHeader.LoadAddressLow | (NSFHeader.LoadAddressHigh<<8)); - if (strcmp(str,"INIT") == 0) brk = (NSFHeader.InitAddressLow | (NSFHeader.InitAddressHigh<<8)); - if (strcmp(str,"PLAY") == 0) brk = (NSFHeader.PlayAddressLow | (NSFHeader.PlayAddressHigh<<8)); - } - else if (GI->type == GIT_FDS) { //FDS Breakpoint keywords - if (strcmp(str,"NMI1") == 0) brk = (GetMem(0xDFF6) | (GetMem(0xDFF7)<<8)); - if (strcmp(str,"NMI2") == 0) brk = (GetMem(0xDFF8) | (GetMem(0xDFF9)<<8)); - if (strcmp(str,"NMI3") == 0) brk = (GetMem(0xDFFA) | (GetMem(0xDFFB)<<8)); - if (strcmp(str,"RST") == 0) brk = (GetMem(0xDFFC) | (GetMem(0xDFFD)<<8)); - if ((strcmp(str,"IRQ") == 0) || (strcmp(str,"BRK") == 0)) brk = (GetMem(0xDFFE) | (GetMem(0xDFFF)<<8)); - } - else { //NES Breakpoint keywords - if ((strcmp(str,"NMI") == 0) || (strcmp(str,"VBL") == 0)) brk = (GetMem(0xFFFA) | (GetMem(0xFFFB)<<8)); - if (strcmp(str,"RST") == 0) brk = (GetMem(0xFFFC) | (GetMem(0xFFFD)<<8)); - if ((strcmp(str,"IRQ") == 0) || (strcmp(str,"BRK") == 0)) brk = (GetMem(0xFFFE) | (GetMem(0xFFFF)<<8)); - } +#define INVALID_START_OFFSET 1 +#define INVALID_END_OFFSET 2 + +#define MAX_NAME_SIZE 200 +#define MAX_CONDITION_SIZE 200 +#define CONDITION_HANDLE 202 +#define NAME_HANDLE 203 + +unsigned int NewBreakWindows(HWND hwndDlg, unsigned int num, bool enable) +{ + char startOffsetBuffer[5] = {0}; + char endOffsetBuffer[5] = {0}; + unsigned int type = 0; + + GetDlgItemText(hwndDlg, START_OFFSET_HANDLE, startOffsetBuffer, sizeof(startOffsetBuffer)); + GetDlgItemText(hwndDlg, END_OFFSET_HANDLE, endOffsetBuffer, sizeof(endOffsetBuffer)); + + if (IsDlgButtonChecked(hwndDlg, CPU_BREAKPOINT_HANDLE)) + { + type |= CPU_BREAKPOINT; } - if ((brk == 0) && (sscanf(str,"%4X",&brk) == EOF)) return 1; - if (ppu) brk &= 0x3FFF; - if (sprite) brk &= 0x00FF; - watchpoint[num].address = brk; - - watchpoint[num].endaddress = 0; - GetDlgItemText(hwndDlg,201,str,5); - sscanf(str,"%4X",&brk); - if (ppu) brk &= 0x3FFF; - if (sprite) brk &= 0x00FF; - if ((brk != 0) && (watchpoint[num].address < brk)) watchpoint[num].endaddress = brk; - - watchpoint[num].flags = 0; - if (enable) watchpoint[num].flags|=WP_E; - if (IsDlgButtonChecked(hwndDlg,102) == BST_CHECKED) watchpoint[num].flags|=WP_R; - if (IsDlgButtonChecked(hwndDlg,103) == BST_CHECKED) watchpoint[num].flags|=WP_W; - if (IsDlgButtonChecked(hwndDlg,104) == BST_CHECKED) watchpoint[num].flags|=WP_X; - if (ppu) { - watchpoint[num].flags|=BT_P; - watchpoint[num].flags&=~WP_X; //disable execute flag! + else if (IsDlgButtonChecked(hwndDlg, PPU_BREAKPOINT_HANDLE)) + { + type |= PPU_BREAKPOINT; } - if (sprite) { - watchpoint[num].flags|=BT_S; - watchpoint[num].flags&=~WP_X; //disable execute flag! + else + { + type |= SPRITE_BREAKPOINT; } -// ################################## Start of SP CODE ########################### + if (IsDlgButtonChecked(hwndDlg, READ_BREAKPOINT_HANDLE)) + { + type |= READ_BREAKPOINT; + } - buffer[200] = 0; - GetDlgItemText(hwndDlg, 203, buffer, 200); - - if (watchpoint[num].desc) - free(watchpoint[num].desc); + if (IsDlgButtonChecked(hwndDlg, WRITE_BREAKPOINT_HANDLE)) + { + type |= WRITE_BREAKPOINT; + } - watchpoint[num].desc = (char*)malloc(strlen(buffer)); - strcpy(watchpoint[num].desc, buffer); + if (IsDlgButtonChecked(hwndDlg, EXECUTE_BREAKPOINT_HANDLE)) + { + type |= EXECUTE_BREAKPOINT; + } + + int start = offsetStringToInt(type, startOffsetBuffer); + + if (start == -1) + { + return INVALID_START_OFFSET; + } + + int end = offsetStringToInt(type, endOffsetBuffer); + + if (*endOffsetBuffer && end == -1) + { + return INVALID_END_OFFSET; + } + + // Handle breakpoint conditions + char name[MAX_NAME_SIZE] = {0}; + GetDlgItemText(hwndDlg, NAME_HANDLE, name, MAX_NAME_SIZE); - GetDlgItemText(hwndDlg, 202, buffer, 200); - - return checkCondition(buffer, num); - -// ################################## End of SP CODE ########################### + char condition[MAX_CONDITION_SIZE] = {0}; + GetDlgItemText(hwndDlg, CONDITION_HANDLE, condition, MAX_CONDITION_SIZE); + + return NewBreak(name, start, end, type, condition, num, enable); } -int AddBreak(HWND hwndDlg) { - int val; - if (numWPs == 64) return 1; - val = NewBreak(hwndDlg,numWPs,1); - if (val == 1) return 2; - else if (val == 2) return 3; +/** +* Adds a new breakpoint to the breakpoint list +* +* @param hwndDlg Handle of the debugger window +* @return 0 (success), 1 (Too many breakpoints), 2 (???), 3 (Invalid breakpoint condition) +**/ +unsigned int AddBreak(HWND hwndDlg) +{ + if (numWPs == MAXIMUM_NUMBER_OF_BREAKPOINTS) + { + return TOO_MANY_BREAKPOINTS; + } + + unsigned val = NewBreakWindows(hwndDlg,numWPs,1); + + if (val == 1) + { + return 2; + } + else if (val == 2) + { + return INVALID_BREAKPOINT_CONDITION; + } + numWPs++; -// ################################## Start of SP CODE ########################### myNumWPs++; -// ################################## End of SP CODE ########################### return 0; } @@ -242,8 +265,8 @@ BOOL CALLBACK AddbpCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(LOWORD(wParam)) { case 100: if (WP_edit >= 0) { - int tmp = NewBreak(hwndDlg,WP_edit,(BOOL)(watchpoint[WP_edit].flags&WP_E)); - if (tmp == 2) + int tmp = NewBreakWindows(hwndDlg,WP_edit,(BOOL)(watchpoint[WP_edit].flags&WP_E)); + if (tmp == INVALID_BREAKPOINT_CONDITION) { MessageBox(hwndDlg, "Invalid breakpoint condition", "Error", MB_OK); break; @@ -251,12 +274,12 @@ BOOL CALLBACK AddbpCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) EndDialog(hwndDlg,1); break; } - if ((tmp=AddBreak(hwndDlg)) == 1) { + if ((tmp=AddBreak(hwndDlg)) == TOO_MANY_BREAKPOINTS) { MessageBox(hwndDlg, "Too many breakpoints, please delete one and try again", "Breakpoint Error", MB_OK); goto endaddbrk; } if (tmp == 2) goto endaddbrk; - else if (tmp == 3) + else if (tmp == INVALID_BREAKPOINT_CONDITION) { MessageBox(hwndDlg, "Invalid breakpoint condition", "Error", MB_OK); break; diff --git a/src/drivers/win/debugger.h b/src/drivers/win/debugger.h index b78bed99..37cdd654 100644 --- a/src/drivers/win/debugger.h +++ b/src/drivers/win/debugger.h @@ -5,6 +5,14 @@ #include //#include "debug.h" +// TODO: Maybe change breakpoint array to std::vector +// Maximum number of breakpoints supported +#define MAXIMUM_NUMBER_OF_BREAKPOINTS 64 + +// Return values for AddBreak +#define TOO_MANY_BREAKPOINTS 1 +#define INVALID_BREAKPOINT_CONDITION 3 + //extern volatile int userpause; //mbg merge 7/18/06 removed for merging extern int scanline; //current scanline! :D extern HWND hDebug; diff --git a/src/drivers/win/debuggersp.cpp b/src/drivers/win/debuggersp.cpp index 9ba4f90d..65f4e3f2 100644 --- a/src/drivers/win/debuggersp.cpp +++ b/src/drivers/win/debuggersp.cpp @@ -673,74 +673,6 @@ void decorateAddress(unsigned int addr, char* str, const char* chr, UINT decorat strcat(str, ":"); } -/** -* Checks whether a breakpoint condition is syntactically valid -* and creates a breakpoint condition object if everything's OK. -* -* @param condition Condition to parse -* @param num Number of the breakpoint in the BP list the condition belongs to -* @return 0 in case of an error; 2 if everything went fine -**/ -int checkCondition(char* condition, int num) -{ - char* b = condition; - - // Check if the condition isn't just all spaces. - - int onlySpaces = 1; - - while (*b) - { - if (*b != ' ') - { - onlySpaces = 0; - break; - } - - ++b; - } - - // Remove the old breakpoint condition before - // adding a new condition. - - if (watchpoint[num].cond) - { - freeTree(watchpoint[num].cond); - free(watchpoint[num].condText); - - watchpoint[num].cond = 0; - watchpoint[num].condText = 0; - } - - // If there's an actual condition create the BP condition object now - - if (*condition && !onlySpaces) - { - Condition* c = generateCondition(condition); - - // If the creation of the BP condition object was succesful - // the condition is apparently valid. It can be added to the - // breakpoint now. - - if (c) - { - watchpoint[num].cond = c; - watchpoint[num].condText = (char*)malloc(strlen(condition) + 1); - strcpy(watchpoint[num].condText, condition); - } - else - { - watchpoint[num].cond = 0; - } - - return watchpoint[num].cond == 0 ? 2 : 0; - } - else - { - return 0; - } -} - /** * Returns the bookmark address of a CPU bookmark identified by its index. * The caller must make sure that the index is valid. diff --git a/src/drivers/win/debuggersp.h b/src/drivers/win/debuggersp.h index e744ea3e..f656bdbb 100644 --- a/src/drivers/win/debuggersp.h +++ b/src/drivers/win/debuggersp.h @@ -34,7 +34,7 @@ extern unsigned int bookmarks; extern unsigned short* bookmarkData; extern int debuggerWasActive; -int checkCondition(char* buffer, int num); +int checkCondition(const char* buffer, int num); void loadNameFiles(); void decorateAddress(unsigned int addr, char* str, const char* chr, UINT); void replaceNames(Name* list, char* str);