Merge branch 'master' of ../TasVideo/fceux

This commit is contained in:
Matthew Budd 2020-07-19 10:12:20 -04:00
commit b846ed31db
9 changed files with 301 additions and 84 deletions

View File

@ -1,6 +1,7 @@
To compile and install FCEUX for SDL, follow the instructions in the README-SDL.md file. To compile and install FCEUX for SDL, follow the instructions in the README-SDL.md file.
Users of Microsoft Visual Studio can use the solution files within the vc directory. Users of Microsoft Visual Studio can use the solution files within the vc directory. The Windows XP toolset is required to open and build this solution. If it
is not installed, go to "Tools" > "Get Tools and Features". Select "Individual Components" and then install "C++ Windows XP Support for VS 2017 (v141) tools".
These solution files will compile FCEUX and some included libraries for full functionality. These solution files will compile FCEUX and some included libraries for full functionality.
The SDL port build tool of choice has come full circle back to Cmake. The cmake build tool will compile the new Qt version of the SDL GUI. The SDL port build tool of choice has come full circle back to Cmake. The cmake build tool will compile the new Qt version of the SDL GUI.

View File

@ -751,8 +751,7 @@ void loadNameFiles()
} }
// bookmarks // bookmarks
std::vector<unsigned int> bookmarks_addr; std::vector <std::pair<unsigned int, std::string>> bookmarks; // first:address second:name
std::vector<std::string> bookmarks_name;
/** /**
* Returns the bookmark address of a CPU bookmark identified by its index. * Returns the bookmark address of a CPU bookmark identified by its index.
@ -763,8 +762,8 @@ std::vector<std::string> bookmarks_name;
**/ **/
unsigned int getBookmarkAddress(unsigned int index) unsigned int getBookmarkAddress(unsigned int index)
{ {
if (index < bookmarks_addr.size()) if (index < bookmarks.size())
return bookmarks_addr[index]; return bookmarks[index].first;
else else
return 0; return 0;
} }
@ -777,18 +776,15 @@ unsigned int getBookmarkAddress(unsigned int index)
**/ **/
void AddDebuggerBookmark2(HWND hwnd, unsigned int addr) void AddDebuggerBookmark2(HWND hwnd, unsigned int addr)
{ {
int index = bookmarks_addr.size(); int index = bookmarks.size();
bookmarks_addr.push_back(addr);
// try to find Symbolic name for this address // try to find Symbolic name for this address
Name* node = findNode(getNamesPointerForAddress(addr), addr); Name* node = findNode(getNamesPointerForAddress(addr), addr);
if (node && node->name) std::pair<unsigned int, std::string> bookmark(addr, node && node->name ? node->name : "");
bookmarks_name.push_back(node->name); bookmarks.push_back(bookmark);
else
bookmarks_name.push_back("");
// add new item to ListBox // add new item to ListBox
char buffer[256]; char buffer[256];
sprintf(buffer, "%04X %s", bookmarks_addr[index], bookmarks_name[index].c_str()); sprintf(buffer, "%04X %s", bookmark.first, bookmark.second.c_str());
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_ADDSTRING, 0, (LPARAM)buffer); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_ADDSTRING, 0, (LPARAM)buffer);
// select this item // select this item
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, index, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, index, 0);
@ -833,13 +829,12 @@ void DeleteDebuggerBookmark(HWND hwnd)
} else } else
{ {
// Erase the selected bookmark // Erase the selected bookmark
bookmarks_addr.erase(bookmarks_addr.begin() + selectedItem); bookmarks.erase(bookmarks.begin() + selectedItem);
bookmarks_name.erase(bookmarks_name.begin() + selectedItem);
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_DELETESTRING, selectedItem, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_DELETESTRING, selectedItem, 0);
// Select next item // Select next item
if (selectedItem >= (bookmarks_addr.size() - 1)) if (selectedItem >= (bookmarks.size() - 1))
// select last item // select last item
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, bookmarks_addr.size() - 1, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, bookmarks.size() - 1, 0);
else else
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, selectedItem, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, selectedItem, 0);
@ -850,36 +845,33 @@ void NameDebuggerBookmark(HWND hwnd)
{ {
// Get the selected bookmark // Get the selected bookmark
int selectedItem = SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_GETCURSEL, 0, 0); int selectedItem = SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_GETCURSEL, 0, 0);
if (selectedItem == LB_ERR || selectedItem >= (int)bookmarks_name.size()) if (selectedItem == LB_ERR || selectedItem >= (int)bookmarks.size())
{ {
MessageBox(hwnd, "Please select a bookmark from the list", "Error", MB_OK | MB_ICONERROR); MessageBox(hwnd, "Please select a bookmark from the list", "Error", MB_OK | MB_ICONERROR);
return; return;
} else } else
{ {
char bookmarkDescription[51] = { 0 }; std::pair<unsigned int, std::string> bookmark = bookmarks[selectedItem];
if (bookmarks_name[selectedItem].size()) if (!bookmark.second.size())
strcpy(bookmarkDescription, bookmarks_name[selectedItem].c_str());
else
{ {
bookmarkDescription[0] = 0;
// try to find the same address in bookmarks // try to find the same address in bookmarks
for (int i = bookmarks_addr.size() - 1; i>= 0; i--) for (int i = bookmarks.size() - 1; i>= 0; i--)
{ {
if (i != selectedItem && bookmarks_addr[i] == bookmarks_addr[selectedItem] && bookmarks_name[i].size()) if (i != selectedItem && bookmarks[i].first == bookmarks[selectedItem].first && bookmarks[i].second.size())
{ {
strcpy(bookmarkDescription, bookmarks_name[i].c_str()); bookmark.second = bookmarks[i].second;
break; break;
} }
} }
} }
// Show the bookmark name dialog // Show the bookmark name dialog
if (DialogBoxParam(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB, (LPARAM)bookmarkDescription)) if (DialogBoxParam(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB, (LPARAM)&bookmark))
{ {
// Rename the selected bookmark // Rename the selected bookmark
bookmarks_name[selectedItem] = bookmarkDescription; bookmarks[selectedItem] = bookmark;
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_DELETESTRING, selectedItem, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_DELETESTRING, selectedItem, 0);
char buffer[256]; char buffer[256];
sprintf(buffer, "%04X %s", bookmarks_addr[selectedItem], bookmarks_name[selectedItem].c_str()); sprintf(buffer, "%04X %s", bookmarks[selectedItem].first, bookmarks[selectedItem].second.c_str());
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_INSERTSTRING, selectedItem, (LPARAM)buffer); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_INSERTSTRING, selectedItem, (LPARAM)buffer);
// Reselect the item (selection disappeared when it was deleted) // Reselect the item (selection disappeared when it was deleted)
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, selectedItem, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, selectedItem, 0);
@ -889,17 +881,16 @@ void NameDebuggerBookmark(HWND hwnd)
void DeleteAllDebuggerBookmarks() void DeleteAllDebuggerBookmarks()
{ {
bookmarks_addr.resize(0); bookmarks.resize(0);
bookmarks_name.resize(0);
} }
void FillDebuggerBookmarkListbox(HWND hwnd) void FillDebuggerBookmarkListbox(HWND hwnd)
{ {
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_RESETCONTENT, 0, 0); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_RESETCONTENT, 0, 0);
char buffer[256]; char buffer[256];
for (unsigned int i = 0; i < bookmarks_addr.size(); ++i) for (unsigned int i = 0; i < bookmarks.size(); ++i)
{ {
sprintf(buffer, "%04X %s", bookmarks_addr[i], bookmarks_name[i].c_str()); sprintf(buffer, "%04X %s", bookmarks[i].first, bookmarks[i].second.c_str());
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_ADDSTRING, 0, (LPARAM)buffer); SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_ADDSTRING, 0, (LPARAM)buffer);
} }
} }

View File

@ -41,8 +41,7 @@ struct MemoryMappedRegister
extern bool symbDebugEnabled; extern bool symbDebugEnabled;
extern bool symbRegNames; extern bool symbRegNames;
extern std::vector<unsigned int> bookmarks_addr; extern std::vector<std::pair<unsigned int, std::string>> bookmarks;
extern std::vector<std::string> bookmarks_name;
extern int debuggerWasActive; extern int debuggerWasActive;
int checkCondition(const char* buffer, int num); int checkCondition(const char* buffer, int num);

View File

@ -1409,13 +1409,19 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
if (wParam >= '0' && wParam <= '9') if (wParam >= '0' && wParam <= '9')
{ {
int bookmark = wParam - '0'; char buf[3];
int newValue = handleBookmarkMenu(bookmark); sprintf(buf, "%c", wParam);
int key_num;
if (newValue != -1) sscanf(buf, "%d", &key_num);
key_num = (key_num + 9) % 10;
if (hexBookmarkShortcut[key_num] != -1)
{ {
ChangeMemViewFocus(hexBookmarks[bookmark].editmode,newValue,-1); int address = hexBookmarks[hexBookmarkShortcut[key_num]].address;
UpdateColorTable(); if (address != -1)
{
ChangeMemViewFocus(hexBookmarks[hexBookmarkShortcut[key_num]].editmode, address, -1);
UpdateColorTable();
}
} }
} }

View File

@ -27,6 +27,8 @@
#include "common.h" #include "common.h"
HexBookmark hexBookmarks[64]; HexBookmark hexBookmarks[64];
int hexBookmarkShortcut[10] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
int numHexBookmarkShortcut = 0;
int nextBookmark = 0; int nextBookmark = 0;
/// Finds the bookmark for a given address /// Finds the bookmark for a given address
@ -55,23 +57,84 @@ int findBookmark(unsigned int address, int editmode)
BOOL CenterWindow(HWND hwndDlg); BOOL CenterWindow(HWND hwndDlg);
/// Callback function for the name bookmark dialog /// Callback function for the name bookmark dialog
/*
TODO: The bookmarks of Debugger and Hex Editor uses the same dialog box,
but different bookmark systems, either decouple their callback into separate
functions or unify them to use the same bookmark system.
*/
INT_PTR CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) INT_PTR CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
static char* description; // For Hex Editor
static HexBookmarkMsg* hexBookmarkMsg;
static int dlgShortcutRadioCheck[10] = { IDC_RADIO_SHORTCUT0, IDC_RADIO_SHORTCUT1, IDC_RADIO_SHORTCUT2, IDC_RADIO_SHORTCUT3, IDC_RADIO_SHORTCUT4, IDC_RADIO_SHORTCUT5, IDC_RADIO_SHORTCUT6, IDC_RADIO_SHORTCUT7, IDC_RADIO_SHORTCUT8, IDC_RADIO_SHORTCUT9 };
// For Debugger
extern HWND hDebug;
static std::pair<unsigned int, std::string>* debuggerBookmark;
switch (uMsg) switch (uMsg)
{ {
case WM_INITDIALOG: case WM_INITDIALOG:
{
// Limit bookmark descriptions to 50 characters // Limit bookmark descriptions to 50 characters
SendDlgItemMessage(hwndDlg,IDC_BOOKMARK_DESCRIPTION,EM_SETLIMITTEXT,50,0); SendDlgItemMessage(hwndDlg, IDC_BOOKMARK_DESCRIPTION, EM_SETLIMITTEXT, 50, 0);
// Put the current bookmark description into the edit field // Put the current bookmark description into the edit field
// and set focus to that edit field. HWND parent = GetParent(hwndDlg);
description = (char*)lParam; char addr[5];
const char* description;
// Called from Hex Editor
if (parent == hMemView)
{
hexBookmarkMsg = (HexBookmarkMsg*)lParam;
HexBookmark* hexBookmark = hexBookmarkMsg->bookmark;
sprintf(addr, "%04X", hexBookmark->address);
description = hexBookmark->description;
bool shortcut_assigned = hexBookmarkMsg->shortcut_index != -1;
if (shortcut_assigned)
{
CheckDlgButton(hwndDlg, IDC_CHECK_SHORTCUT, BST_CHECKED);
CheckDlgButton(hwndDlg, dlgShortcutRadioCheck[hexBookmarkMsg->shortcut_index], BST_CHECKED);
}
else
EnableWindow(GetDlgItem(hwndDlg, IDC_BOOKMARK_SHORTCUT_PREFIX_TEXT), FALSE);
for (int i = 0; i < 10; ++i)
if (!shortcut_assigned || hexBookmarkShortcut[i] != -1 && hexBookmarkShortcut[i] != hexBookmarkMsg->bookmark_index)
// the shortcut number is occupied but it doesn't belongs to this bookmark, or the bookmark doesn't have a shortcut
EnableWindow(GetDlgItem(hwndDlg, dlgShortcutRadioCheck[i]), FALSE);
if (!shortcut_assigned && numHexBookmarkShortcut >= 10)
{
// all the shortcuts are occupied and this one doesn't have a shortcut, it's impossible to assign a new shortcut
EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_SHORTCUT), FALSE);
EnableWindow(GetDlgItem(hwndDlg, IDC_BOOKMARK_SHORTCUT_PREFIX_TEXT), FALSE);
}
}
// Called from Debugger
else if (parent == hDebug)
{
debuggerBookmark = (std::pair<unsigned int, std::string>*)lParam;
sprintf(addr, "%04X", debuggerBookmark->first);
description = debuggerBookmark->second.c_str();
// Hide the shortcut panel since it doesn't support jump to address shortcut keys.
ShowWindow(GetDlgItem(hwndDlg, IDC_CHECK_SHORTCUT), SW_HIDE);
ShowWindow(GetDlgItem(hwndDlg, IDC_BOOKMARK_SHORTCUT_PREFIX_TEXT), SW_HIDE);
for (int i = 0; i < 10; ++i)
ShowWindow(GetDlgItem(hwndDlg, dlgShortcutRadioCheck[i]), SW_HIDE);
}
// Set address and description
SetDlgItemText(hwndDlg, IDC_BOOKMARK_ADDRESS, addr);
SetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, description); SetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, description);
// and set focus to that edit field.
SetFocus(GetDlgItem(hwndDlg, IDC_BOOKMARK_DESCRIPTION)); SetFocus(GetDlgItem(hwndDlg, IDC_BOOKMARK_DESCRIPTION));
break; break;
}
case WM_CLOSE: case WM_CLOSE:
case WM_QUIT: case WM_QUIT:
EndDialog(hwndDlg, 0); EndDialog(hwndDlg, 0);
@ -82,10 +145,47 @@ INT_PTR CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
case BN_CLICKED: case BN_CLICKED:
switch(LOWORD(wParam)) switch(LOWORD(wParam))
{ {
case IDC_CHECK_SHORTCUT:
{
UINT shortcut_assigned = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SHORTCUT);
EnableWindow(GetDlgItem(hwndDlg, IDC_BOOKMARK_SHORTCUT_PREFIX_TEXT), shortcut_assigned);
for (int i = 0; i < 10; ++i)
EnableWindow(GetDlgItem(hwndDlg, dlgShortcutRadioCheck[i]), shortcut_assigned && (hexBookmarkShortcut[i] == -1 || hexBookmarkShortcut[i] == hexBookmarkMsg->bookmark_index));
}
break;
case IDOK: case IDOK:
{ {
// Update the bookmark description HWND parent = GetParent(hwndDlg);
GetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, description, 50); // Called from Hex Editor
if (parent == hMemView)
{
// Update the bookmark description
GetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, hexBookmarkMsg->bookmark->description, 50);
// Update the shortcut key
if (hexBookmarkMsg->shortcut_index != -1 && hexBookmarkShortcut[hexBookmarkMsg->shortcut_index] != -1)
{
hexBookmarkShortcut[hexBookmarkMsg->shortcut_index] = -1;
--numHexBookmarkShortcut;
}
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SHORTCUT))
for (int i = 0; i < 10; ++i)
if(IsDlgButtonChecked(hwndDlg, dlgShortcutRadioCheck[i]))
{
// Update the shortcut index
hexBookmarkShortcut[i] = hexBookmarkMsg->bookmark_index;
++numHexBookmarkShortcut;
break;
}
}
else if (parent == hDebug)
{
char description[51];
GetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, description, 50);
debuggerBookmark->second = description;
}
EndDialog(hwndDlg, 1); EndDialog(hwndDlg, 1);
break; break;
} }
@ -107,21 +207,39 @@ int addBookmark(HWND hwnd, unsigned int address, int editmode)
// Enforce a maximum of 64 bookmarks // Enforce a maximum of 64 bookmarks
if (nextBookmark < 64) if (nextBookmark < 64)
{ {
char description[51] = { 0 }; hexBookmarks[nextBookmark].address = address;
sprintf(description, "%s %04X", EditString[editmode], address); hexBookmarks[nextBookmark].editmode = editmode;
sprintf(hexBookmarks[nextBookmark].description, "%s %04X", EditString[editmode], address);
HexBookmarkMsg msg;
// Pre-define a shortcut if possible
for (int i = 0; i < 10; ++i)
if (hexBookmarkShortcut[i] == -1)
{
msg.shortcut_index = i;
break;
}
msg.bookmark = &hexBookmarks[nextBookmark];
msg.bookmark_index = nextBookmark;
// Show the bookmark name dialog // Show the bookmark name dialog
if (DialogBoxParam(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB, (LPARAM)description)) if (DialogBoxParam(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB, (LPARAM)&msg))
{ {
// Add the bookmark
hexBookmarks[nextBookmark].address = address;
hexBookmarks[nextBookmark].editmode = editmode;
strcpy(hexBookmarks[nextBookmark].description, description);
nextBookmark++; nextBookmark++;
return 0; return 0;
} }
else else
{
if (msg.shortcut_index != -1)
{
if (hexBookmarkShortcut[msg.shortcut_index] != -1)
--numHexBookmarkShortcut;
hexBookmarkShortcut[msg.shortcut_index] = -1;
}
return 1; return 1;
}
} }
else else
return -1; return -1;
@ -135,16 +253,21 @@ int editBookmark(HWND hwnd, unsigned int index)
{ {
if (index >= 64) return -1; if (index >= 64) return -1;
char description[51] = { 0 }; HexBookmarkMsg msg;
strcpy(description, hexBookmarks[index].description); msg.bookmark = &hexBookmarks[index];
msg.bookmark_index = index;
// find its shortcut index
for (int i = 0; i < 10; ++i)
if (index == hexBookmarkShortcut[i])
{
msg.shortcut_index = i;
break;
}
// Show the bookmark name dialog // Show the bookmark name dialog
if (DialogBoxParam(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB, (LPARAM)description)) if (DialogBoxParam(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB, (LPARAM)&msg))
{
// Update the bookmark information
strcpy(hexBookmarks[index].description, description);
return 0; return 0;
}
else else
return 1; return 1;
@ -158,6 +281,20 @@ int removeBookmark(unsigned int index)
{ {
if (index >= 64) return -1; if (index >= 64) return -1;
// remove its related shortcut
for (int i = 0; i < 10; ++i)
{
// all the indexes after the deleted one sould decrease by 1
if (hexBookmarkShortcut[i] != -1 && hexBookmarkShortcut[i] > index)
--hexBookmarkShortcut[i];
else if (hexBookmarkShortcut[i] == index)
{
// delete the shortcut index itself
hexBookmarkShortcut[i] = -1;
--numHexBookmarkShortcut;
}
}
// At this point it's necessary to move the content of the bookmark list // At this point it's necessary to move the content of the bookmark list
for (int i=index;i<nextBookmark - 1;i++) for (int i=index;i<nextBookmark - 1;i++)
{ {
@ -206,10 +343,22 @@ void updateBookmarkMenus(HMENU menu)
{ {
// Get the text of the menu // Get the text of the menu
char buffer[0x100]; char buffer[0x100];
sprintf(buffer, i < 10 ? "&%d. $%04X - %s\tCtrl+%d" : "%d. $%04X - %s",i, hexBookmarks[i].address, hexBookmarks[i].description, i); sprintf(buffer, i < 10 ? "&%d. $%04X - %s" : "%d. $%04X - %s",i, hexBookmarks[i].address, hexBookmarks[i].description);
AppendMenu(menu, MF_STRING, ID_FIRST_BOOKMARK + i, buffer); AppendMenu(menu, MF_STRING, ID_FIRST_BOOKMARK + i, buffer);
} }
for (int i = 0; i < 10; ++i)
{
if (hexBookmarkShortcut[i] != -1)
{
char buffer[0x100];
GetMenuString(menu, ID_FIRST_BOOKMARK + hexBookmarkShortcut[i], buffer, 50, MF_BYCOMMAND);
sprintf(&buffer[strlen(buffer)], "\tCtrl+%d\0", (i + 1) % 10);
ModifyMenu(menu, ID_FIRST_BOOKMARK + hexBookmarkShortcut[i], MF_BYCOMMAND, ID_FIRST_BOOKMARK + hexBookmarkShortcut[i], buffer);
}
}
} }
} }
@ -237,4 +386,7 @@ void removeAllBookmarks(HMENU menu)
RemoveMenu(menu, ID_BOOKMARKLIST_SEP, MF_BYCOMMAND); RemoveMenu(menu, ID_BOOKMARKLIST_SEP, MF_BYCOMMAND);
nextBookmark = 0; nextBookmark = 0;
numHexBookmarkShortcut = 0;
for (int i = 0; i < 10; ++i)
hexBookmarkShortcut[i] = -1;
} }

View File

@ -30,7 +30,16 @@ typedef struct
int editmode; int editmode;
} HexBookmark; } HexBookmark;
typedef struct
{
HexBookmark* bookmark;
int bookmark_index;
int shortcut_index = -1;
} HexBookmarkMsg;
extern HexBookmark hexBookmarks[64]; extern HexBookmark hexBookmarks[64];
extern int hexBookmarkShortcut[10];
extern int numHexBookmarkShortcut;
extern int nextBookmark; extern int nextBookmark;
int findBookmark(unsigned int address, int editmode); int findBookmark(unsigned int address, int editmode);

View File

@ -47,16 +47,16 @@ int storeDebuggerPreferences(FILE* f)
uint8 tmp; uint8 tmp;
// Write the number of CPU bookmarks // Write the number of CPU bookmarks
size = bookmarks_addr.size(); size = bookmarks.size();
bookmarks_name.resize(size); bookmarks.resize(size);
if (fwrite(&size, sizeof(unsigned int), 1, f) != 1) return 1; if (fwrite(&size, sizeof(unsigned int), 1, f) != 1) return 1;
// Write the data of those bookmarks // Write the data of those bookmarks
for (i = 0; i < (int)size; ++i) for (i = 0; i < (int)size; ++i)
{ {
if (fwrite(&bookmarks_addr[i], sizeof(unsigned int), 1, f) != 1) return 1; if (fwrite(&bookmarks[i].first, sizeof(unsigned int), 1, f) != 1) return 1;
len = bookmarks_name[i].size(); len = bookmarks[i].second.size();
if (fwrite(&len, sizeof(unsigned int), 1, f) != 1) return 1; if (fwrite(&len, sizeof(unsigned int), 1, f) != 1) return 1;
if (fwrite(bookmarks_name[i].c_str(), 1, len, f) != len) return 1; if (fwrite(bookmarks[i].second.c_str(), 1, len, f) != len) return 1;
} }
// Write all breakpoints // Write all breakpoints
@ -143,6 +143,18 @@ int storeHexPreferences(FILE* f)
if (fwrite(hexBookmarks[i].description, 1, len, f) != len) return 1; if (fwrite(hexBookmarks[i].description, 1, len, f) != len) return 1;
} }
// optional section: save bookmark shortcut matches
if (numHexBookmarkShortcut)
{
fwrite(&numHexBookmarkShortcut, sizeof(numHexBookmarkShortcut), 1, f);
for (int i = 0; i < 10; ++i)
if (hexBookmarkShortcut[i] != -1)
{
fwrite(&hexBookmarkShortcut[i], sizeof(hexBookmarkShortcut[i]), 1, f);
fwrite(&i, sizeof(i), 1, f);
}
}
return 0; return 0;
} }
@ -229,18 +241,17 @@ int loadDebuggerPreferences(FILE* f)
// Read the number of CPU bookmarks // Read the number of CPU bookmarks
if (fread(&size, sizeof(unsigned int), 1, f) != 1) return 1; if (fread(&size, sizeof(unsigned int), 1, f) != 1) return 1;
bookmarks_addr.resize(size); bookmarks.resize(size);
bookmarks_name.resize(size);
// Read the data of those bookmarks // Read the data of those bookmarks
char buffer[256]; char buffer[256];
for (i = 0; i < (int)size; ++i) for (i = 0; i < (int)size; ++i)
{ {
if (fread(&bookmarks_addr[i], sizeof(unsigned int), 1, f) != 1) return 1; if (fread(&bookmarks[i].first, sizeof(unsigned int), 1, f) != 1) return 1;
if (fread(&len, sizeof(unsigned int), 1, f) != 1) return 1; if (fread(&len, sizeof(unsigned int), 1, f) != 1) return 1;
if (len >= 256) return 1; if (len >= 256) return 1;
if (fread(&buffer, 1, len, f) != len) return 1; if (fread(&buffer, 1, len, f) != len) return 1;
buffer[len] = 0; buffer[len] = 0;
bookmarks_name[i] = buffer; bookmarks[i].second = buffer;
} }
myNumWPs = 0; myNumWPs = 0;
@ -359,6 +370,26 @@ int loadHexPreferences(FILE* f)
if (fread(hexBookmarks[i].description, 1, len, f) != len) return 1; if (fread(hexBookmarks[i].description, 1, len, f) != len) return 1;
} }
// optional section: read bookmark shortcut matches
// read number of shortcuts
// older versions of .deb file don't have this section, so the file would reach the end.
if (fread(&numHexBookmarkShortcut, sizeof(numHexBookmarkShortcut), 1, f) != EOF)
{
unsigned int bookmark_index, shortcut_index;
// read the matching index list of the shortcuts
for (unsigned int i = 0; i < numHexBookmarkShortcut; ++i)
if (fread(&bookmark_index, sizeof(bookmark_index), 1, f) != EOF && fread(&shortcut_index, sizeof(shortcut_index), 1, f) != EOF)
hexBookmarkShortcut[shortcut_index % 10] = bookmark_index;
else
break;
}
else {
// use the default configruation based on the order of the bookmark list
numHexBookmarkShortcut = nextBookmark > 10 ? 10 : nextBookmark;
for (int i = 0; i < numHexBookmarkShortcut; ++i)
hexBookmarkShortcut[i] = i;
}
return 0; return 0;
} }

View File

@ -1901,14 +1901,28 @@ BEGIN
LISTBOX IDC_ASSEMBLER_PATCH_DISASM,7,50,188,59,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | LBS_NOSEL | WS_VSCROLL | WS_TABSTOP LISTBOX IDC_ASSEMBLER_PATCH_DISASM,7,50,188,59,LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | LBS_NOSEL | WS_VSCROLL | WS_TABSTOP
END END
NAMEBOOKMARKDLG DIALOGEX 0, 0, 186, 73 NAMEBOOKMARKDLG DIALOGEX 0, 0, 269, 79
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Bookmark name" CAPTION "Bookmark name"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
LTEXT "Bookmark name",IDC_BOOKMARK_NAME_TEXT,68,14,58,8 LTEXT "&Address:",IDC_BOOKMARK_ADDRESS_TEXT,7,10,30,8
EDITTEXT IDC_BOOKMARK_DESCRIPTION,7,28,172,14,ES_AUTOHSCROLL EDITTEXT IDC_BOOKMARK_ADDRESS,42,7,48,14,ES_UPPERCASE | ES_AUTOHSCROLL | ES_READONLY
DEFPUSHBUTTON "&OK",IDOK,67,52,50,14 LTEXT "&Name:",IDC_BOOKMARK_NAME_TEXT,7,27,23,8
EDITTEXT IDC_BOOKMARK_DESCRIPTION,42,25,220,14,ES_AUTOHSCROLL
DEFPUSHBUTTON "&OK",IDOK,107,58,50,14
CONTROL "&Shortcut:",IDC_CHECK_SHORTCUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,44,46,10
LTEXT "Ctrl+",IDC_BOOKMARK_SHORTCUT_PREFIX_TEXT,54,45,17,8
CONTROL "&1",IDC_RADIO_SHORTCUT0,"Button",BS_AUTORADIOBUTTON,73,44,18,10
CONTROL "&2",IDC_RADIO_SHORTCUT1,"Button",BS_AUTORADIOBUTTON,92,44,18,10
CONTROL "&3",IDC_RADIO_SHORTCUT2,"Button",BS_AUTORADIOBUTTON,111,44,18,10
CONTROL "&4",IDC_RADIO_SHORTCUT3,"Button",BS_AUTORADIOBUTTON,130,44,18,10
CONTROL "&5",IDC_RADIO_SHORTCUT4,"Button",BS_AUTORADIOBUTTON,149,44,18,10
CONTROL "&6",IDC_RADIO_SHORTCUT5,"Button",BS_AUTORADIOBUTTON,168,44,18,10
CONTROL "&7",IDC_RADIO_SHORTCUT6,"Button",BS_AUTORADIOBUTTON,187,44,18,10
CONTROL "&8",IDC_RADIO_SHORTCUT7,"Button",BS_AUTORADIOBUTTON,206,44,18,10
CONTROL "&9",IDC_RADIO_SHORTCUT8,"Button",BS_AUTORADIOBUTTON,225,44,18,10
CONTROL "&0",IDC_RADIO_SHORTCUT9,"Button",BS_AUTORADIOBUTTON,244,44,18,10
END END
CDLOGGER DIALOGEX 0, 0, 307, 254 CDLOGGER DIALOGEX 0, 0, 307, 254
@ -2589,9 +2603,9 @@ BEGIN
"NAMEBOOKMARKDLG", DIALOG "NAMEBOOKMARKDLG", DIALOG
BEGIN BEGIN
LEFTMARGIN, 7 LEFTMARGIN, 7
RIGHTMARGIN, 179 RIGHTMARGIN, 262
TOPMARGIN, 7 TOPMARGIN, 7
BOTTOMMARGIN, 66 BOTTOMMARGIN, 72
END END
"CDLOGGER", DIALOG "CDLOGGER", DIALOG
@ -2948,7 +2962,7 @@ IDB_BITMAP_SELECTED17 BITMAP "res\\te_17_selected.bmp"
IDB_BITMAP_SELECTED18 BITMAP "res\\te_18_selected.bmp" IDB_BITMAP_SELECTED18 BITMAP "res\\te_18_selected.bmp"
IDB_BITMAP_SELECTED19 BITMAP "res\\te_19_selected.bmp" IDB_BITMAP_SELECTED19 BITMAP "res\\te_19_selected.bmp"
IDB_BRANCH_SPRITESHEET BITMAP "res\\branch_spritesheet.bmp" IDB_BRANCH_SPRITESHEET BITMAP "res\\branch_spritesheet.bmp"
#endif // English(United States) resources #endif // English (United States) resources
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////

View File

@ -472,6 +472,7 @@
#define MW_ADDR00 1001 #define MW_ADDR00 1001
#define IDC_MEMVIEWFIND_TYPE_HEX 1001 #define IDC_MEMVIEWFIND_TYPE_HEX 1001
#define IDC_NTVIEW_MIRROR_HORIZONTAL 1001 #define IDC_NTVIEW_MIRROR_HORIZONTAL 1001
#define IDC_BOOKMARK_ADDRESS 1001
#define IDC_CHECK_STOPMOVIE 1002 #define IDC_CHECK_STOPMOVIE 1002
#define IDC_GAME_GENIE_COMP 1002 #define IDC_GAME_GENIE_COMP 1002
#define IDC_MEMVIEWFIND_TYPE_TEXT 1002 #define IDC_MEMVIEWFIND_TYPE_TEXT 1002
@ -508,6 +509,7 @@
#define MW_ADDR04 1013 #define MW_ADDR04 1013
#define IDC_CHECK1 1013 #define IDC_CHECK1 1013
#define IDC_CHEAT_AUTOLOADSAVE 1013 #define IDC_CHEAT_AUTOLOADSAVE 1013
#define IDC_CHECK_SHORTCUT 1013
#define IDC_RESTORE_BUTTON 1014 #define IDC_RESTORE_BUTTON 1014
#define MW_VAL04 1014 #define MW_VAL04 1014
#define MW_NAME05 1015 #define MW_NAME05 1015
@ -629,6 +631,16 @@
#define IDC_GAME_GENIE_LABEL 1097 #define IDC_GAME_GENIE_LABEL 1097
#define IDC_CHEAT_GAME_GENIE_TEXT 1098 #define IDC_CHEAT_GAME_GENIE_TEXT 1098
#define IDC_CHECK2 1099 #define IDC_CHECK2 1099
#define IDC_RADIO_SHORTCUT1 1100
#define IDC_RADIO_SHORTCUT2 1101
#define IDC_RADIO_SHORTCUT3 1102
#define IDC_RADIO_SHORTCUT4 1103
#define IDC_RADIO_SHORTCUT5 1104
#define IDC_RADIO_SHORTCUT6 1105
#define IDC_RADIO_SHORTCUT7 1106
#define IDC_RADIO_SHORTCUT8 1107
#define IDC_RADIO_SHORTCUT9 1108
#define IDC_RADIO_SHORTCUT0 1109
#define BTN_ALLOW_LRUD 1117 #define BTN_ALLOW_LRUD 1117
#define IDC_PRGROM_EDIT 1118 #define IDC_PRGROM_EDIT 1118
#define IDC_CHRROM_EDIT 1119 #define IDC_CHRROM_EDIT 1119
@ -1142,15 +1154,17 @@
#define MW_VALUELABEL1 65426 #define MW_VALUELABEL1 65426
#define IDC_STATIC_SLASHTEXT 65442 #define IDC_STATIC_SLASHTEXT 65442
#define IDC_BOOKMARK_NAME_TEXT 65532 #define IDC_BOOKMARK_NAME_TEXT 65532
#define IDC_BOOKMARK_ADDRESS_TEXT 65533
#define IDC_NTVIEW_SCANLINE_TEXT 65534 #define IDC_NTVIEW_SCANLINE_TEXT 65534
#define IDC_BOOKMARK_SHORTCUT_PREFIX_TEXT 65534
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 305 #define _APS_NEXT_RESOURCE_VALUE 306
#define _APS_NEXT_COMMAND_VALUE 40002 #define _APS_NEXT_COMMAND_VALUE 40002
#define _APS_NEXT_CONTROL_VALUE 1100 #define _APS_NEXT_CONTROL_VALUE 1101
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif
#endif #endif