* improved FPS display, added a hotkey to toggle it

* Debugger: single click on any address copies this address to the "Seek To" field and "Bookmark Add" field
* Debugger: "Name" button in Bookmarks, total revamp of Bookmarks
* updated docs

[[Split portion of a mixed commit.]]
This commit is contained in:
ansstuff 2012-09-26 20:19:01 +00:00
parent caac39d4d0
commit 84bb3a8d1d
17 changed files with 279 additions and 208 deletions

View File

@ -1,8 +1,10 @@
26-Sep-2012 - AnS - Debugger: "Name" button in Bookmarks, total revamp of Bookmarks
26-Sep-2012 - AnS - Debugger: single click on any address copies this address to the "Seek To" field and "Bookmark Add" field
26-Sep-2012 - AnS - Fixed replay engine bug that doubles the last input of the movie
26-Sep-2012 - AnS - Tracer: RTS instructions output caller address/name
23-Sep-2012 - AnS - Lua: clear previous frame drawings at the beginning of every frame
23-Sep-2012 - AnS - Debugger: fixed mouseover when using Symbolic debugging; mouseover works for the disassembly window too
22-Sep-2012 - AnS - Tracer: added "Symbolic tracing", "Log current Frame number", "Log emulator messages", "Log breakpoint hits" options
23-Sep-2012 - AnS - Debugger: fixed mouseover when using Symbolic debug; mouseover works for the disassembly window too
22-Sep-2012 - AnS - Tracer: added "Symbolic trace", "Log current Frame number", "Log emulator messages", "Log breakpoint hits" options
11-Sep-2012 - AnS - new Lua function: emu.setlagflag()
11-Sep-2012 - AnS - Debugger: deleting a breakpoint leaves selection in the Breakpoints list
06-Sep-2012 - AnS - added "Use Custom Palette" checkbox to Palette config

View File

@ -885,23 +885,11 @@ void EditBreakList() {
SendDlgItemMessage(hDebug,IDC_DEBUGGER_BP_LIST,LB_SETCURSEL,WP_edit,0);
}
void FillBreakList(HWND hwndDlg) {
int i;
for (i = 0; i < numWPs; i++) {
SendDlgItemMessage(hDebug,IDC_DEBUGGER_BP_LIST,LB_DELETESTRING,i,0);
}
for (i = 0; i < numWPs; i++) {
SendDlgItemMessage(hwndDlg,IDC_DEBUGGER_BP_LIST,LB_INSERTSTRING,-1,(LPARAM)(LPSTR)BreakToText(i));
}
}
void ClearBreakList(HWND hwndDlg) {
void FillBreakList(HWND hwndDlg)
{
SendDlgItemMessage(hwndDlg,IDC_DEBUGGER_BP_LIST,LB_RESETCONTENT,0,0);
numWPs = 0;
for (int i = 0; i < numWPs; i++)
SendDlgItemMessage(hwndDlg,IDC_DEBUGGER_BP_LIST,LB_INSERTSTRING,-1,(LPARAM)(LPSTR)BreakToText(i));
}
void EnableBreak(int sel)
@ -1232,38 +1220,13 @@ BOOL CALLBACK DebuggerEnumWindowsProc(HWND hwnd, LPARAM lParam)
return TRUE;
}
void LoadGameDebuggerData(HWND hwndDlg = hDebug) {
extern int loadDebugDataFailed;
void LoadGameDebuggerData(HWND hwndDlg = hDebug)
{
if (!hwndDlg)
return;
if (!loadDebugDataFailed)
{
ClearDebuggerBookmarkListbox(hwndDlg);
if (bookmarks)
{
unsigned int i;
for (i=0;i<bookmarks;i++)
{
char buffer[5];
sprintf(buffer, "%X", bookmarkData[i]);
AddDebuggerBookmark2(hwndDlg, buffer);
}
}
ClearBreakList(hwndDlg);
numWPs = myNumWPs;
}
else
{
bookmarks = 0;
}
numWPs = myNumWPs;
FillDebuggerBookmarkListbox(hwndDlg);
FillBreakList(hwndDlg);
}
@ -1273,17 +1236,15 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w
{
case WM_LBUTTONDBLCLK:
{
// set the selection cursor
CallWindowProc(IDC_DEBUGGER_DISASSEMBLY_oldWndProc, hwndDlg, WM_LBUTTONDOWN, wParam, lParam);
// debug_str contains the text in the disassembly window
int sel_start, sel_end;
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
// find the ":" or "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 5; i--)
for (; i > sel_start - 6; i--)
if (i >= 0 && debug_str[i] == ':' || debug_str[i] == '$')
break;
if (i > sel_start - 5)
if (i > sel_start - 6)
{
char offsetBuffer[5];
strncpy(offsetBuffer, debug_str + i + 1, 4);
@ -1309,6 +1270,44 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w
}
return 0;
}
case WM_LBUTTONUP:
{
// debug_str contains the text in the disassembly window
int sel_start, sel_end;
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
// only continue if there's no selection in the Disassembly window
if (sel_start == sel_end)
{
// find the ":" or "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 6; i--)
if (i >= 0 && debug_str[i] == ':' || debug_str[i] == '$')
break;
if (i > sel_start - 6)
{
char offsetBuffer[5] = {0};
strncpy(offsetBuffer, debug_str + i + 1, 4);
offsetBuffer[4] = 0;
// truncate the string if a space or \r is found
char* firstspace = strstr(offsetBuffer, " ");
if (!firstspace)
firstspace = strstr(offsetBuffer, "\r");
if (firstspace)
firstspace[0] = 0;
unsigned int offset;
if (sscanf(offsetBuffer, "%4X", &offset) != EOF)
{
// select the text
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_SETSEL, (WPARAM)(i + 1), (LPARAM)(i + 1 + strlen(offsetBuffer)));
// send the address to "Seek To" field
SetDlgItemText(hDebug, IDC_DEBUGGER_VAL_PCSEEK, offsetBuffer);
// send the address to "Bookmark Add" field
SetDlgItemText(hDebug, IDC_DEBUGGER_BOOKMARK, offsetBuffer);
}
}
}
break;
}
case WM_MOUSEMOVE:
{
char str[256] = {0}, *ptr, dotdot[4];
@ -1869,6 +1868,7 @@ BOOL CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
}
case IDC_DEBUGGER_BOOKMARK_ADD: AddDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_BOOKMARK_DEL: DeleteDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_BOOKMARK_NAME: NameDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_ENABLE_SYMBOLIC: UpdateDebugger(false); break;
// ################################## End of SP CODE ###########################

View File

@ -41,6 +41,9 @@ char NLfilename[2048];
char symbDebugEnabled = 0;
int debuggerWasActive = 0;
extern BOOL CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern char bookmarkDescription[];
/**
* Tests whether a char is a valid hexadecimal character.
*
@ -640,6 +643,10 @@ void decorateAddress(unsigned int addr, char* str)
}
}
// bookmarks
std::vector<unsigned int> bookmarks_addr;
std::vector<std::string> bookmarks_name;
/**
* Returns the bookmark address of a CPU bookmark identified by its index.
* The caller must make sure that the index is valid.
@ -647,38 +654,12 @@ void decorateAddress(unsigned int addr, char* str)
* @param hwnd HWND of the debugger window
* @param index Index of the bookmark
**/
unsigned int getBookmarkAddress(HWND hwnd, unsigned int index)
unsigned int getBookmarkAddress(unsigned int index)
{
int n;
char buffer[5] = {0};
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_GETTEXT, index, (LPARAM)buffer);
n = offsetStringToInt(BT_C, buffer);
return n;
}
unsigned int bookmarks;
unsigned short* bookmarkData = 0;
/**
* Stores all CPU bookmarks in a simple array to be able to store
* them between debugging sessions.
*
* @param hwnd HWND of the debugger window.
**/
void dumpBookmarks(HWND hwnd)
{
unsigned int i;
if (bookmarkData)
free(bookmarkData);
bookmarks = SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_GETCOUNT, 0, 0);
bookmarkData = (unsigned short*)malloc(bookmarks * sizeof(unsigned short));
for (i=0;i<bookmarks;i++)
{
bookmarkData[i] = getBookmarkAddress(hwnd, i);
}
if (index < bookmarks_addr.size())
return bookmarks_addr[index];
else
return 0;
}
/**
@ -687,17 +668,16 @@ void dumpBookmarks(HWND hwnd)
* @param hwnd HWMD of the debugger window
* @param buffer Text of the debugger bookmark
**/
void AddDebuggerBookmark2(HWND hwnd, char* buffer)
void AddDebuggerBookmark2(HWND hwnd, unsigned int addr)
{
if (!buffer)
{
MessageBox(0, "Error: Invalid parameter \"buffer\" in function AddDebuggerBookmark2", "Error", MB_OK | MB_ICONERROR);
return;
}
int index = bookmarks_addr.size();
bookmarks_addr.push_back(addr);
bookmarks_name.push_back("");
char buffer[256];
sprintf(buffer, "%04X %s", bookmarks_addr[index], bookmarks_name[index].c_str());
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_ADDSTRING, 0, (LPARAM)buffer);
dumpBookmarks(hwnd);
// select this item
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, index, 0);
}
/**
@ -719,7 +699,7 @@ void AddDebuggerBookmark(HWND hwnd)
MessageBox(hwnd, "Invalid offset", "Error", MB_OK | MB_ICONERROR);
return;
}
AddDebuggerBookmark2(hwnd, buffer);
AddDebuggerBookmark2(hwnd, n);
}
/**
@ -736,28 +716,75 @@ void DeleteDebuggerBookmark(HWND hwnd)
{
MessageBox(hwnd, "Please select a bookmark from the list", "Error", MB_OK | MB_ICONERROR);
return;
}
else
} else
{
// Remove the selected bookmark
// Erase the selected bookmark
bookmarks_addr.erase(bookmarks_addr.begin() + selectedItem);
bookmarks_name.erase(bookmarks_name.begin() + selectedItem);
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_DELETESTRING, selectedItem, 0);
dumpBookmarks(hwnd);
// Select next item
if (selectedItem >= (bookmarks_addr.size() - 1))
// select last item
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, bookmarks_addr.size() - 1, 0);
else
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, selectedItem, 0);
}
}
/**
* Removes all debugger bookmarks
*
* @param hwnd HWND of the debugger window
**/
void ClearDebuggerBookmarkListbox(HWND hwnd)
void NameDebuggerBookmark(HWND hwnd)
{
// Get the selected bookmark
int selectedItem = SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_GETCURSEL, 0, 0);
if (selectedItem == LB_ERR || selectedItem >= (int)bookmarks_name.size())
{
MessageBox(hwnd, "Please select a bookmark from the list", "Error", MB_OK | MB_ICONERROR);
return;
} else
{
strcpy(bookmarkDescription, bookmarks_name[selectedItem].c_str());
// try to find the same address in bookmarks
for (int i = bookmarks_addr.size() - 1; i>= 0; i--)
{
if (i != selectedItem && bookmarks_addr[i] == bookmarks_addr[selectedItem])
{
strcpy(bookmarkDescription, bookmarks_name[i].c_str());
break;
}
}
// Show the bookmark name dialog
if (DialogBox(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB))
{
// Rename the selected bookmark
bookmarks_name[selectedItem] = bookmarkDescription;
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_DELETESTRING, selectedItem, 0);
char buffer[256];
sprintf(buffer, "%04X %s", bookmarks_addr[selectedItem], bookmarks_name[selectedItem].c_str());
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_INSERTSTRING, selectedItem, (LPARAM)buffer);
// Reselect the item (selection disappeared when it was deleted)
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_SETCURSEL, selectedItem, 0);
}
}
}
void DeleteAllDebuggerBookmarks()
{
bookmarks_addr.resize(0);
bookmarks_name.resize(0);
}
void FillDebuggerBookmarkListbox(HWND hwnd)
{
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_RESETCONTENT, 0, 0);
//dumpBookmarks(hwnd);
char buffer[256];
for (unsigned int i = 0; i < bookmarks_addr.size(); ++i)
{
sprintf(buffer, "%04X %s", bookmarks_addr[i], bookmarks_name[i].c_str());
SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_ADDSTRING, 0, (LPARAM)buffer);
}
}
void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr);
extern void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr);
/**
* Shows the code at the bookmark address in the disassembly window
@ -766,13 +793,9 @@ void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr);
**/
void GoToDebuggerBookmark(HWND hwnd)
{
unsigned int n;
int selectedItem = SendDlgItemMessage(hwnd, LIST_DEBUGGER_BOOKMARKS, LB_GETCURSEL, 0, 0);
// If no bookmark is selected just return
if (selectedItem == LB_ERR) return;
n = getBookmarkAddress(hwnd, selectedItem);
unsigned int n = getBookmarkAddress(selectedItem);
Disassemble(hwnd, IDC_DEBUGGER_DISASSEMBLY, IDC_DEBUGGER_DISASSEMBLY_VSCR, n);
}

View File

@ -33,8 +33,8 @@ struct Name
};
extern char symbDebugEnabled;
extern unsigned int bookmarks;
extern unsigned short* bookmarkData;
extern std::vector<unsigned int> bookmarks_addr;
extern std::vector<std::string> bookmarks_name;
extern int debuggerWasActive;
int checkCondition(const char* buffer, int num);
@ -42,10 +42,11 @@ void loadNameFiles();
void decorateAddress(unsigned int addr, char* str);
void replaceNames(Name* list, char* str);
void AddDebuggerBookmark(HWND hwnd);
void AddDebuggerBookmark2(HWND hwnd, char* buffer);
void AddDebuggerBookmark2(HWND hwnd, unsigned int addr);
void DeleteDebuggerBookmark(HWND hwnd);
void ClearDebuggerBookmarkListbox(HWND hwnd);
void NameDebuggerBookmark(HWND hwnd);
void DeleteAllDebuggerBookmarks();
void FillDebuggerBookmarkListbox(HWND hwnd);
void GoToDebuggerBookmark(HWND hwnd);
void dumpBookmarks(HWND hwmd);
int isHex(char c);

Binary file not shown.

View File

@ -70,8 +70,6 @@ BOOL CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
break;
case WM_CLOSE:
case WM_QUIT:
// Update the bookmark description
GetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, bookmarkDescription, 50);
EndDialog(hwndDlg, 0);
break;
case WM_COMMAND:
@ -81,10 +79,15 @@ BOOL CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
switch(LOWORD(wParam))
{
case IDOK:
SendMessage(hwndDlg, WM_QUIT, 0, 0);
{
// Update the bookmark description
GetDlgItemText(hwndDlg, IDC_BOOKMARK_DESCRIPTION, bookmarkDescription, 50);
EndDialog(hwndDlg, 1);
break;
}
}
}
break;
}
return FALSE;
@ -101,8 +104,8 @@ int addBookmark(HWND hwnd, unsigned int address)
{
sprintf(bookmarkDescription, "%04X", address);
// Show the bookmark name dialog
DialogBox(fceu_hInstance,"NAMEBOOKMARKDLG",hwnd,nameBookmarkCallB);
// Show the bookmark name dialog
DialogBox(fceu_hInstance, "NAMEBOOKMARKDLG", hwnd, nameBookmarkCallB);
// Update the bookmark description
hexBookmarks[nextBookmark].address = address;

View File

@ -22,10 +22,10 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "debuggersp.h"
#include "memviewsp.h"
#include "common.h"
#include "debugger.h"
#include "debuggersp.h"
#include "memviewsp.h"
#include "../../debug.h"
extern bool break_on_cycles;
@ -44,15 +44,25 @@ extern char symbDebugEnabled;
int storeDebuggerPreferences(FILE* f)
{
int i;
unsigned int size, len;
uint8 tmp;
// Flag that says whether symbolic debugging should be enabled
if (fwrite(&symbDebugEnabled, 1, 1, f) != 1) return 1;
// Write the number of active CPU bookmarks
if (fwrite(&bookmarks, sizeof(unsigned int), 1, f) != 1) return 1;
// Write the addresses of those bookmarks
if (fwrite(bookmarkData, sizeof(unsigned short), bookmarks, f) != bookmarks) return 1;
// Write the number of CPU bookmarks
size = bookmarks_addr.size();
bookmarks_name.resize(size);
if (fwrite(&size, sizeof(unsigned int), 1, f) != 1) return 1;
// Write the data of those bookmarks
char buffer[256];
for (i = 0; i < (int)size; ++i)
{
if (fwrite(&bookmarks_addr[i], sizeof(unsigned int), 1, f) != 1) return 1;
len = bookmarks_name[i].size();
if (fwrite(&len, sizeof(unsigned int), 1, f) != 1) return 1;
if (fwrite(bookmarks_name[i].c_str(), 1, len, f) != len) return 1;
}
// Write all breakpoints
for (i=0;i<65;i++)
@ -204,18 +214,11 @@ int storePreferences(char* romname)
void DoDebuggerDataReload()
{
if (debuggerSaveLoadDEBFiles == false) {
if (debuggerSaveLoadDEBFiles == false)
return;
}
extern HWND hDebug;
LoadGameDebuggerData(hDebug);
// if (wasinDebugger){
// DebuggerExit();
// DoDebug(0);
// }
}
int myNumWPs = 0;
@ -229,25 +232,29 @@ int loadDebugDataFailed = 0;
**/
int loadDebuggerPreferences(FILE* f)
{
unsigned int i;
unsigned int i, size, len;
uint8 tmp;
// Read flag that says if symbolic debugging is enabled
if (fread(&symbDebugEnabled, sizeof(symbDebugEnabled), 1, f) != 1) return 1;
// Read the number of CPU bookmarks
if (fread(&bookmarks, sizeof(bookmarks), 1, f) != 1) return 1;
bookmarkData = (unsigned short*)malloc(bookmarks * sizeof(unsigned short));
// Read the offsets of the bookmarks
for (i=0;i<bookmarks;i++)
if (fread(&size, sizeof(unsigned int), 1, f) != 1) return 1;
bookmarks_addr.resize(size);
bookmarks_name.resize(size);
// Read the data of those bookmarks
char buffer[256];
for (i = 0; i < (int)size; ++i)
{
if (fread(&bookmarkData[i], sizeof(bookmarkData[i]), 1, f) != 1) return 1;
if (fread(&bookmarks_addr[i], 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 (fread(&buffer, 1, len, f) != len) return 1;
buffer[len] = 0;
bookmarks_name[i] = buffer;
}
myNumWPs = 0;
// Ugetab:
// This took far too long to figure out...
// Nullifying the data is better than using free(), because
@ -349,7 +356,8 @@ int loadHexPreferences(FILE* f)
int i;
// Read number of bookmarks
fread(&nextBookmark, sizeof(nextBookmark), 1, f);
if (fread(&nextBookmark, sizeof(nextBookmark), 1, f) != 1) return 1;
if (nextBookmark >= 64) return 1;
for (i=0;i<nextBookmark;i++)
{
@ -391,10 +399,22 @@ int loadPreferences(char* romname)
f = fopen(filename, "rb");
free(filename);
result = f ? loadDebuggerPreferences(f) || loadHexPreferences(f) : 0;
if (f) {
if (f)
{
result = loadDebuggerPreferences(f) || loadHexPreferences(f);
if (result)
{
// there was error when loading the .deb, reset the data to default
DeleteAllDebuggerBookmarks();
myNumWPs = 0;
break_on_instructions = break_on_cycles = FCEUI_Debugger().badopbreak = false;
break_instructions_limit = break_cycles_limit = 0;
nextBookmark = 0;
}
fclose(f);
} else
{
result = 0;
}
// This prevents information from traveling between debugger interations.

View File

@ -1076,27 +1076,27 @@ BEGIN
PUSHBUTTON "<",MEMW_EXPANDCOLLAPSE,1,259,11,10
END
DEBUGGER DIALOGEX 54, 74, 540, 321
DEBUGGER DIALOGEX 54, 74, 541, 321
STYLE DS_SETFONT | DS_3DLOOK | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "6502 Debugger"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
EDITTEXT IDC_DEBUGGER_DISASSEMBLY,15,5,318,300,ES_MULTILINE | ES_NOHIDESEL | ES_READONLY | WS_HSCROLL
SCROLLBAR IDC_DEBUGGER_DISASSEMBLY_VSCR,334,5,11,300,SBS_VERT
GROUPBOX "Status Flags",401,433,139,101,35,WS_TABSTOP
CONTROL "N",IDC_DEBUGGER_FLAG_N,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,439,148,18,12
CONTROL "V",IDC_DEBUGGER_FLAG_V,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,463,148,18,12
CONTROL "U",IDC_DEBUGGER_FLAG_U,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,487,148,18,12
CONTROL "B",IDC_DEBUGGER_FLAG_B,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,510,148,18,12
CONTROL "D",IDC_DEBUGGER_FLAG_D,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,439,160,18,12
CONTROL "I",IDC_DEBUGGER_FLAG_I,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,463,160,18,12
CONTROL "Z",IDC_DEBUGGER_FLAG_Z,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,487,160,18,12
CONTROL "C",IDC_DEBUGGER_FLAG_C,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,510,160,18,12
GROUPBOX "Breakpoints",IDC_DEBUGGER_BREAKPOINTS,433,3,101,135,WS_TABSTOP
LISTBOX IDC_DEBUGGER_BP_LIST,437,13,93,91,LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL
PUSHBUTTON "Add",IDC_DEBUGGER_BP_ADD,437,107,30,15
PUSHBUTTON "Delete",IDC_DEBUGGER_BP_DEL,469,107,30,15,WS_DISABLED
PUSHBUTTON "Edit",IDC_DEBUGGER_BP_EDIT,501,107,29,15,WS_DISABLED
GROUPBOX "Status Flags",401,433,140,103,35,WS_TABSTOP
CONTROL "N",IDC_DEBUGGER_FLAG_N,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,439,149,18,12
CONTROL "V",IDC_DEBUGGER_FLAG_V,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,464,149,18,12
CONTROL "U",IDC_DEBUGGER_FLAG_U,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,488,149,18,12
CONTROL "B",IDC_DEBUGGER_FLAG_B,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,512,149,18,12
CONTROL "D",IDC_DEBUGGER_FLAG_D,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,439,161,18,12
CONTROL "I",IDC_DEBUGGER_FLAG_I,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,464,161,18,12
CONTROL "Z",IDC_DEBUGGER_FLAG_Z,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,488,161,18,12
CONTROL "C",IDC_DEBUGGER_FLAG_C,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,512,161,18,12
GROUPBOX "Breakpoints",IDC_DEBUGGER_BREAKPOINTS,433,2,103,138,WS_TABSTOP
LISTBOX IDC_DEBUGGER_BP_LIST,437,11,95,96,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL
PUSHBUTTON "Add",IDC_DEBUGGER_BP_ADD,437,109,31,15
PUSHBUTTON "Delete",IDC_DEBUGGER_BP_DEL,470,109,31,15,WS_DISABLED
PUSHBUTTON "Edit",IDC_DEBUGGER_BP_EDIT,502,109,31,15,WS_DISABLED
PUSHBUTTON "Run",IDC_DEBUGGER_RUN,350,5,38,14
PUSHBUTTON "Step Into",IDC_DEBUGGER_STEP_IN,391,5,39,14
PUSHBUTTON "Step Out",IDC_DEBUGGER_STEP_OUT,350,21,38,14
@ -1114,30 +1114,30 @@ BEGIN
PUSHBUTTON "Seek PC",IDC_DEBUGGER_SEEK_PC,391,71,39,14
PUSHBUTTON "Seek To:",IDC_DEBUGGER_SEEK_TO,350,54,38,14
EDITTEXT IDC_DEBUGGER_VAL_PCSEEK,391,55,38,12,ES_UPPERCASE | ES_WANTRETURN
LTEXT "PPU:",65531,352,179,17,10
LTEXT "Sprite:",65530,352,191,20,10
LTEXT "Scanline:",IDC_STATIC,352,203,31,8
LTEXT "Pixel:",IDC_STATIC,352,216,17,8
EDITTEXT IDC_DEBUGGER_VAL_PPU,371,179,25,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_SPR,374,191,15,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_SLINE,383,203,14,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_PPUPIXEL,372,216,14,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
GROUPBOX "",IDC_DEBUGGER_VAL_S2,349,174,50,53,WS_TABSTOP
EDITTEXT IDC_DEBUGGER_VAL_CYCLES_COUNT,442,179,46,10,ES_NOHIDESEL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_CYCLES_COUNT2,489,179,51,10,ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_INSTRUCTIONS_COUNT,441,204,46,10,ES_NOHIDESEL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_INSTRUCTIONS_COUNT2,489,204,51,10,ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
LTEXT "PPU:",65531,353,179,17,10
LTEXT "Sprite:",65530,353,191,20,10
LTEXT "Scanline:",IDC_STATIC,353,203,31,8
LTEXT "Pixel:",IDC_STATIC,353,216,17,8
EDITTEXT IDC_DEBUGGER_VAL_PPU,372,179,25,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_SPR,375,191,15,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_SLINE,384,203,14,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_PPUPIXEL,373,216,14,10,ES_UPPERCASE | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
GROUPBOX "",IDC_DEBUGGER_VAL_S2,349,174,51,53,WS_TABSTOP
EDITTEXT IDC_DEBUGGER_VAL_CYCLES_COUNT,443,179,46,10,ES_NOHIDESEL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_CYCLES_COUNT2,490,179,51,10,ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_INSTRUCTIONS_COUNT,442,204,46,10,ES_NOHIDESEL | ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
EDITTEXT IDC_DEBUGGER_VAL_INSTRUCTIONS_COUNT2,490,204,51,10,ES_READONLY | ES_WANTRETURN | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
CONTROL "",IDC_DEBUGGER_ADDR_LINE,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,4,308,341,11
CONTROL "Break on Bad Opcode",IDC_DEBUGGER_BREAK_ON_BAD_OP,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,438,125,89,10
CONTROL "Symbolic debugging",IDC_DEBUGGER_ENABLE_SYMBOLIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,442,261,80,10
PUSHBUTTON "Reload Symbols",IDC_DEBUGGER_RELOAD_SYMS,441,272,62,14
GROUPBOX "Address Bookmarks",45535,349,228,84,76
LISTBOX LIST_DEBUGGER_BOOKMARKS,353,238,44,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_DEBUGGER_BOOKMARK,400,238,29,14,ES_AUTOHSCROLL
PUSHBUTTON "Add",IDC_DEBUGGER_BOOKMARK_ADD,399,254,31,14
PUSHBUTTON "Delete",IDC_DEBUGGER_BOOKMARK_DEL,399,270,31,14
PUSHBUTTON "Rom Patcher",IDC_DEBUGGER_ROM_PATCHER,441,288,62,14
CONTROL "Break on Bad Opcodes",IDC_DEBUGGER_BREAK_ON_BAD_OP,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,439,126,90,10
CONTROL "Symbolic debug",IDC_DEBUGGER_ENABLE_SYMBOLIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,470,261,62,10
PUSHBUTTON "Reload Symbols",IDC_DEBUGGER_RELOAD_SYMS,470,272,62,14
GROUPBOX "Address Bookmarks",45535,349,228,113,76
LISTBOX LIST_DEBUGGER_BOOKMARKS,353,238,74,63,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
EDITTEXT IDC_DEBUGGER_BOOKMARK,430,238,28,14,ES_AUTOHSCROLL
PUSHBUTTON "Add",IDC_DEBUGGER_BOOKMARK_ADD,429,255,30,14
PUSHBUTTON "Delete",IDC_DEBUGGER_BOOKMARK_DEL,429,271,30,14
PUSHBUTTON "Rom Patcher",IDC_DEBUGGER_ROM_PATCHER,470,288,62,14
CONTROL "",IDC_DEBUGGER_ICONTRAY,"Static",SS_BLACKFRAME,4,5,11,300
PUSHBUTTON "",IDC_DEBUGGER_RESTORESIZE,349,307,13,10
LTEXT "Default window size",IDC_STATIC,364,308,68,9
@ -1145,16 +1145,17 @@ BEGIN
PUSHBUTTON "128 Lines",IDC_DEBUGGER_RUN_FRAME2,391,37,39,14
CONTROL ".DEB files",DEBUGLOADDEB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,489,306,46,13
CONTROL "Auto-open",DEBUGAUTOLOAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,438,306,47,13
LTEXT "CPU cycles:",IDC_STATIC,402,179,39,8
PUSHBUTTON "Reset counters",IDC_DEBUGGER_RESET_COUNTERS,471,229,64,14
CONTROL "Break when exceed",IDC_DEBUGGER_BREAK_ON_CYCLES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,403,191,77,10
EDITTEXT IDC_DEBUGGER_CYCLES_EXCEED,481,190,53,12,ES_UPPERCASE | ES_NOHIDESEL | ES_WANTRETURN | ES_NUMBER
LTEXT "Instructions:",IDC_STATIC,402,204,40,8
LTEXT "CPU cycles:",IDC_STATIC,403,179,39,8
PUSHBUTTON "Reset counters",IDC_DEBUGGER_RESET_COUNTERS,467,229,68,14
CONTROL "Break when exceed",IDC_DEBUGGER_BREAK_ON_CYCLES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,404,191,77,10
EDITTEXT IDC_DEBUGGER_CYCLES_EXCEED,482,190,53,12,ES_UPPERCASE | ES_NOHIDESEL | ES_WANTRETURN | ES_NUMBER
LTEXT "Instructions:",IDC_STATIC,403,204,40,8
CONTROL "Break when exceed",IDC_DEBUGGER_BREAK_ON_INSTRUCTIONS,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,403,216,77,10
EDITTEXT IDC_DEBUGGER_INSTRUCTIONS_EXCEED,481,215,53,12,ES_UPPERCASE | ES_NOHIDESEL | ES_WANTRETURN | ES_NUMBER
GROUPBOX "",IDC_STATIC,437,242,97,63
CONTROL "Display ROM offsets",IDC_DEBUGGER_ROM_OFFSETS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,442,249,82,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,404,216,77,10
EDITTEXT IDC_DEBUGGER_INSTRUCTIONS_EXCEED,482,215,53,12,ES_UPPERCASE | ES_NOHIDESEL | ES_WANTRETURN | ES_NUMBER
GROUPBOX "",IDC_STATIC,466,241,70,64
CONTROL "ROM offsets",IDC_DEBUGGER_ROM_OFFSETS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,470,249,62,10
PUSHBUTTON "Name",IDC_DEBUGGER_BOOKMARK_NAME,429,287,30,14
END
TRACER DIALOGEX 65527, 65513, 403, 332
@ -1189,7 +1190,7 @@ BEGIN
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,261,243,119,10
CONTROL "Log current Frame number",IDC_CHECK_LOG_FRAME_NUMBER,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,18,256,102,10
CONTROL "Symbolic tracing",IDC_CHECK_SYMBOLIC_TRACING,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,18,270,72,10
CONTROL "Symbolic trace",IDC_CHECK_SYMBOLIC_TRACING,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,18,270,72,10
CONTROL "Log emulator messages",IDC_CHECK_LOG_MESSAGES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,148,256,94,10
CONTROL "Log breakpoint hits",IDC_CHECK_LOG_BREAKPOINTS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,261,256,82,10
END
@ -1554,11 +1555,11 @@ BEGIN
END
NAMEBOOKMARKDLG DIALOGEX 0, 0, 186, 73
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Bookmark description..."
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Bookmark name"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "Bookmark description",-1,58,14,70,8
LTEXT "Bookmark name",IDC_BOOKMARK_NAME_TEXT,68,14,58,8
EDITTEXT IDC_BOOKMARK_DESCRIPTION,7,28,172,14,ES_AUTOHSCROLL
DEFPUSHBUTTON "&OK",IDOK,67,52,50,14
END

View File

@ -153,6 +153,8 @@
#define CHEAT_CONTEXT_POKECHEATVALUE 118
#define IDC_DEBUGGER_RESET_ON_BP0 118
#define IDC_CHECK_LOG_STATUSES_TO_THE_LEFT 118
#define IDC_DEBUGGER_BOOKMARK_DEL2 118
#define IDC_DEBUGGER_BOOKMARK_NAME 118
#define CHEAT_CONTEXT_GOTOINHEXEDITOR 119
#define IDC_DEBUGGER_BREAK_ON_INSTRUCTIONS 119
#define IDC_CHECK_LOG_FRAME_NUMBER 119
@ -1140,6 +1142,7 @@
#define IDC_DEBUGGER_ICONTRAY 55535
#define MW_ValueLabel2 65423
#define MW_ValueLabel1 65426
#define IDC_BOOKMARK_NAME_TEXT 65535
// Next default values for new objects
//

View File

@ -1912,8 +1912,13 @@ LRESULT APIENTRY ListWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
int delta = zDelta / WHEEL_DELTA;
if (delta < -1 || delta > 1)
delta *= PLAYBACK_WHEEL_BOOST;
int destination_frame = currFrameCounter - delta;
if (destination_frame < 0) destination_frame = 0;
int destination_frame;
if (FCEUI_EmulationPaused() || playback.GetPauseFrame() < 0)
destination_frame = currFrameCounter - delta;
else
destination_frame = playback.GetPauseFrame() - delta;
if (destination_frame < 0)
destination_frame = 0;
int lastCursor = currFrameCounter;
playback.jump(destination_frame);
if (lastCursor != currFrameCounter)

View File

@ -51,7 +51,7 @@ TASEDITOR_CONFIG::TASEDITOR_CONFIG()
view_branches_tree = false;
branch_scr_hud = true;
restore_position = false;
adjust_input_due_to_lag = true;
adjust_input_due_to_lag = false;
greenzone_capacity = GREENZONE_CAPACITY_DEFAULT;
undo_levels = UNDO_LEVELS_DEFAULT;
autosave_period = AUTOSAVE_PERIOD_DEFAULT;

View File

@ -1842,7 +1842,7 @@ LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
FCEUD_ToggleStatusIcon();
break;
case ID_DISPLAY_FPS:
FCEUI_SetShowFPS(FCEUI_ShowFPS() ^ 1);
FCEUI_ToggleShowFPS();
break;
case MENU_DISPLAY_BG:
case MENU_DISPLAY_OBJ:
@ -2851,6 +2851,11 @@ void UpdateMenuHotkeys()
combined = "&Movie status icon\t" + combo;
ChangeMenuItemText(ID_DISPLAY_MOVIESTATUSICON, combined);
//FPS counter
combo = GetKeyComboName(FCEUD_CommandMapping[EMUCMD_FPS_DISPLAY_TOGGLE]);
combined = "FPS\t" + combo;
ChangeMenuItemText(ID_DISPLAY_FPS, combined);
//Graphics: BG
combo = GetKeyComboName(FCEUD_CommandMapping[EMUCMD_MISC_DISPLAY_BG_TOGGLE]);
combined = "Graphics: &BG\t" + combo;

View File

@ -662,6 +662,7 @@ void ToggleFullscreen();
static void TaseditorRewindOn(void);
static void TaseditorRewindOff(void);
static void TaseditorCommand(void);
extern void FCEUI_ToggleShowFPS();
struct EMUCMDTABLE FCEUI_CommandTable[]=
{
@ -792,6 +793,7 @@ struct EMUCMDTABLE FCEUI_CommandTable[]=
{ EMUCMD_TASEDITOR_SWITCH_AUTORESTORING, EMUCMDTYPE_TASEDITOR, TaseditorCommand, 0, 0, "Switch Auto-restore last position", EMUCMDFLAG_TASEDITOR },
{ EMUCMD_TASEDITOR_SWITCH_MULTITRACKING, EMUCMDTYPE_TASEDITOR, TaseditorCommand, 0, 0, "Switch current Multitracking mode", EMUCMDFLAG_TASEDITOR },
{ EMUCMD_TASEDITOR_RUN_MANUAL_LUA, EMUCMDTYPE_TASEDITOR, TaseditorCommand, 0, 0, "Run Manual Lua function", EMUCMDFLAG_TASEDITOR },
{ EMUCMD_FPS_DISPLAY_TOGGLE, EMUCMDTYPE_MISC, FCEUI_ToggleShowFPS, 0, 0, "Toggle FPS Display", EMUCMDFLAG_TASEDITOR },
};
#define NUM_EMU_CMDS (sizeof(FCEUI_CommandTable)/sizeof(FCEUI_CommandTable[0]))

View File

@ -237,9 +237,10 @@ enum EMUCMD
EMUCMD_TASEDITOR_CANCEL_SEEKING,
EMUCMD_TASEDITOR_SWITCH_AUTORESTORING,
EMUCMD_TASEDITOR_SWITCH_MULTITRACKING,
EMUCMD_TASEDITOR_RUN_MANUAL_LUA,
//-----------------------------
//keep adding these in order of newness or else the hotkey binding configs will get messed up...
EMUCMD_TASEDITOR_RUN_MANUAL_LUA,
EMUCMD_FPS_DISPLAY_TOGGLE,
EMUCMD_MAX
};

View File

@ -742,11 +742,15 @@ bool Show_FPS = false;
bool FCEUI_ShowFPS()
{
return Show_FPS;
}
}
void FCEUI_SetShowFPS(bool showFPS)
{
Show_FPS = showFPS;
}
}
void FCEUI_ToggleShowFPS()
{
Show_FPS ^= 1;
}
static uint64 boop[60];
static int boopcount = 0;
@ -760,8 +764,8 @@ void ShowFPS(void)
int booplimit = PAL?50:60;
boop[boopcount] = FCEUD_GetTime();
sprintf(fpsmsg, "%7.1f",(double)booplimit / ((double)da / FCEUD_GetTimeFreq()));
DrawTextTrans(ClipSidesOffset + XBuf + ((256 - 2 * ClipSidesOffset) - 7 * 8) + (FSettings.FirstSLine+4)*256, 256, (uint8*)fpsmsg, 7);
sprintf(fpsmsg, "%.1f", (double)booplimit / ((double)da / FCEUD_GetTimeFreq()));
DrawTextTrans(XBuf + ((256 - ClipSidesOffset) - 40) + (FSettings.FirstSLine + 4) * 256, 256, (uint8*)fpsmsg, 0xA0);
// It's not averaging FPS over exactly 1 second, but it's close enough.
boopcount = (boopcount + 1) % booplimit;
}

View File

@ -33,6 +33,7 @@ std::string FCEUI_GetSnapshotAsName();
void FCEUI_SetSnapshotAsName(std::string name);
bool FCEUI_ShowFPS();
void FCEUI_SetShowFPS(bool showFPS);
void FCEUI_ToggleShowFPS();
void ShowFPS();
void snapAVI();
#endif

Binary file not shown.