Hexeditor: added View->Highlight Activity feature

This commit is contained in:
ansstuff 2013-08-04 17:59:05 +00:00
parent ef132c44e4
commit 7008dfd8d1
4 changed files with 139 additions and 62 deletions

View File

@ -86,6 +86,7 @@ extern int DbgPosX,DbgPosY;
extern int DbgSizeX,DbgSizeY; extern int DbgSizeX,DbgSizeY;
extern int MemViewSizeX,MemViewSizeY; extern int MemViewSizeX,MemViewSizeY;
extern int MemView_wndx, MemView_wndy; extern int MemView_wndx, MemView_wndy;
extern bool MemView_HighlightActivity;
extern int MemFind_wndx, MemFind_wndy; extern int MemFind_wndx, MemFind_wndy;
extern int NTViewPosX,NTViewPosY; extern int NTViewPosX,NTViewPosY;
extern int PPUViewPosX,PPUViewPosY; extern int PPUViewPosX,PPUViewPosY;
@ -285,6 +286,7 @@ static CFGSTRUCT fceuconfig[] =
AC(MemViewSizeY), AC(MemViewSizeY),
AC(MemView_wndx), AC(MemView_wndx),
AC(MemView_wndy), AC(MemView_wndy),
AC(MemView_HighlightActivity),
AC(MemFind_wndx), AC(MemFind_wndx),
AC(MemFind_wndy), AC(MemFind_wndy),
AC(NTViewPosX), AC(NTViewPosX),

View File

@ -67,6 +67,12 @@ using namespace std;
#define ID_ADDRESS_FRZ_SEP 52 #define ID_ADDRESS_FRZ_SEP 52
#define ID_ADDRESS_FRZ_UNFREEZE_ALL 53 #define ID_ADDRESS_FRZ_UNFREEZE_ALL 53
#define HIGHLIGHT_ACTIVITY_MIN_VALUE 0
#define HIGHLIGHT_ACTIVITY_MAX_VALUE 16
#define PREVIOUS_VALUE_UNDEFINED -1
COLORREF highlightActivityColors[HIGHLIGHT_ACTIVITY_MAX_VALUE] = { 0x0, 0x495249, 0x666361, 0x855a45, 0xa13620, 0xbd003f, 0xd6006f, 0xcc008b, 0xba00a1, 0x8b00ad, 0x5c00bf, 0x0003d1, 0x0059d6, 0x0077d9, 0x0096db, 0x00aede };
string memviewhelp = "HexEditor"; //Hex Editor Help Page string memviewhelp = "HexEditor"; //Hex Editor Help Page
int HexRowHeightBorder = 0; //adelikat: This will determine the number of pixels between rows in the hex editor, to alter this, the user can change it in the .cfg file, changing one will revert to the way FCEUX2.1.0 did it int HexRowHeightBorder = 0; //adelikat: This will determine the number of pixels between rows in the hex editor, to alter this, the user can change it in the .cfg file, changing one will revert to the way FCEUX2.1.0 did it
@ -150,6 +156,7 @@ int TableFileLoaded;
int MemView_wndx, MemView_wndy; int MemView_wndx, MemView_wndy;
int MemFind_wndx, MemFind_wndy; int MemFind_wndx, MemFind_wndy;
bool MemView_HighlightActivity = true;
int MemViewSizeX = 580, MemViewSizeY = 248; int MemViewSizeX = 580, MemViewSizeY = 248;
static RECT newMemViewRect; static RECT newMemViewRect;
@ -160,17 +167,18 @@ static char chartable[256];
//HGDIOBJ HDataObj; //HGDIOBJ HDataObj;
HDC HDataDC; HDC HDataDC;
int CursorX=2, CursorY=9; int CursorX=2, CursorY=9;
int CursorStartAddy, CursorEndAddy=-1; int CursorStartAddy, CursorEndAddy = PREVIOUS_VALUE_UNDEFINED;
int CursorDragPoint;//, CursorShiftPoint = -1; int CursorDragPoint;//, CursorShiftPoint = -1;
//int CursorStartNibble=1, CursorEndNibble; //1 means that only half of the byte is selected //int CursorStartNibble=1, CursorEndNibble; //1 means that only half of the byte is selected
int TempData=-1; int TempData = PREVIOUS_VALUE_UNDEFINED;
int DataAmount; int DataAmount;
int MaxSize; int MaxSize;
COLORREF *BGColorList; COLORREF *BGColorList;
COLORREF *TextColorList; COLORREF *TextColorList;
int *OldValues; //this will be used for a speed hack int PreviousCurOffset;
int OldCurOffset; int *PreviousValues; // for HighlightActivity feature and for speedhack too
int *HighlightedBytes;
int lbuttondown, lbuttondownx, lbuttondowny; int lbuttondown, lbuttondownx, lbuttondowny;
int mousex, mousey; int mousex, mousey;
@ -193,6 +201,16 @@ struct UNDOSTRUCT {
struct UNDOSTRUCT *undo_list=0; struct UNDOSTRUCT *undo_list=0;
void resetHighlightingActivityLog()
{
// clear the HighlightActivity data
for (int i = 0; i < DataAmount; ++i)
{
PreviousValues[i] = PREVIOUS_VALUE_UNDEFINED;
HighlightedBytes[i] = HIGHLIGHT_ACTIVITY_MIN_VALUE;
}
}
void ApplyPatch(int addr,int size, uint8* data){ void ApplyPatch(int addr,int size, uint8* data){
UNDOSTRUCT *tmp=(UNDOSTRUCT*)malloc(sizeof(UNDOSTRUCT)); //mbg merge 7/18/06 removed struct qualifiers and added cast UNDOSTRUCT *tmp=(UNDOSTRUCT*)malloc(sizeof(UNDOSTRUCT)); //mbg merge 7/18/06 removed struct qualifiers and added cast
@ -264,7 +282,7 @@ void SetHexEditorAddress(int gotoaddress) {
CursorStartAddy = gotoaddress; CursorStartAddy = gotoaddress;
CursorEndAddy = -1; CursorEndAddy = -1;
ChangeMemViewFocus(EditingMode,CursorStartAddy,-1); ChangeMemViewFocus(EditingMode, CursorStartAddy, -1);
} }
static void FlushUndoBuffer(){ static void FlushUndoBuffer(){
@ -403,7 +421,7 @@ void UnloadTableFile(){
for(i = 0;i < 256;i++){ for(i = 0;i < 256;i++){
j = i; j = i;
if(j < 0x20)j = 0x2E; if(j < 0x20)j = 0x2E;
if(j > 0x7e)j = 0x2E; //if(j > 0x7e)j = 0x2E;
chartable[i] = j; chartable[i] = j;
} }
TableFileLoaded = 0; TableFileLoaded = 0;
@ -416,10 +434,14 @@ void UpdateMemoryView(int draw_all)
int MemFontHeight = debugSystem->HexeditorFontHeight + HexRowHeightBorder; int MemFontHeight = debugSystem->HexeditorFontHeight + HexRowHeightBorder;
int i, j; int i, j;
int byteValue;
//LPVOID lpMsgBuf; //LPVOID lpMsgBuf;
//int curlength; //int curlength;
char str[100]; char str[100];
if (PreviousCurOffset != CurOffset)
resetHighlightingActivityLog();
/* /*
if(draw_all){ if(draw_all){
for(i = CurOffset;i < CurOffset+DataAmount;i+=16){ for(i = CurOffset;i < CurOffset+DataAmount;i+=16){
@ -440,9 +462,9 @@ void UpdateMemoryView(int draw_all)
TextOut(HDataDC,0,0,str,strlen(str)); TextOut(HDataDC,0,0,str,strlen(str));
} }
} else {*/ } else {*/
for(i = CurOffset;i < CurOffset+DataAmount;i+=16) for (i = CurOffset; i < CurOffset + DataAmount; i += 16)
{ {
if((OldCurOffset != CurOffset) || draw_all) if ((PreviousCurOffset != CurOffset) || draw_all)
{ {
MoveToEx(HDataDC,0,MemFontHeight*((i-CurOffset)/16),NULL); MoveToEx(HDataDC,0,MemFontHeight*((i-CurOffset)/16),NULL);
SetTextColor(HDataDC,RGB(HexForeColorR,HexForeColorG,HexForeColorB)); //addresses text color 000 = black, 255255255 = white SetTextColor(HDataDC,RGB(HexForeColorR,HexForeColorG,HexForeColorB)); //addresses text color 000 = black, 255255255 = white
@ -452,12 +474,16 @@ void UpdateMemoryView(int draw_all)
} }
for(j = 0;j < 16;j++) for(j = 0;j < 16;j++)
{ {
if((CursorEndAddy == -1) && (CursorStartAddy == i+j)) byteValue = GetMemViewData(i+j);
if (MemView_HighlightActivity)
if ((PreviousValues[i+j-CurOffset] != byteValue) && (PreviousValues[i+j-CurOffset] != PREVIOUS_VALUE_UNDEFINED))
HighlightedBytes[i+j-CurOffset] = HIGHLIGHT_ACTIVITY_MAX_VALUE;
if ((CursorEndAddy == -1) && (CursorStartAddy == i+j))
{ {
//print up single highlighted text //print up single highlighted text
OldValues[i+j-CurOffset] = -1; //set it to redraw this one next time
MoveToEx(HDataDC, 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16), NULL); MoveToEx(HDataDC, 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16), NULL);
if(TempData != -1) if(TempData != PREVIOUS_VALUE_UNDEFINED)
{ {
// User is typing New Data // User is typing New Data
// 1st nybble // 1st nybble
@ -467,65 +493,78 @@ void UpdateMemoryView(int draw_all)
TextOut(HDataDC,0,0,str,1); TextOut(HDataDC,0,0,str,1);
// 2nd nybble // 2nd nybble
MoveToEx(HDataDC, MemFontWidth + 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16), NULL); MoveToEx(HDataDC, MemFontWidth + 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16), NULL);
sprintf(str,"%X",GetMemViewData(CursorStartAddy) % 16); sprintf(str,"%X", byteValue % 16);
SetTextColor(HDataDC,RGB(HexBackColorR,HexBackColorG,HexBackColorB)); SetTextColor(HDataDC,RGB(HexBackColorR,HexBackColorG,HexBackColorB));
SetBkColor(HDataDC,RGB(HexForeColorR,HexForeColorG,HexForeColorB)); SetBkColor(HDataDC,RGB(HexForeColorR,HexForeColorG,HexForeColorB));
TextOut(HDataDC, 0, 0, str, 1); TextOut(HDataDC, 0, 0, str, 1);
} else } else
{ {
// Selecting a Single Byte // Selecting a Single Byte
sprintf(str,"%X",(int)(GetMemViewData(CursorStartAddy) / 16)); sprintf(str,"%X",(int)(byteValue / 16));
SetTextColor(HDataDC,RGB(255,255,255)); //single address highlight SetTextColor(HDataDC,RGB(255,255,255)); //single address highlight
SetBkColor(HDataDC,RGB(0,0,0)); SetBkColor(HDataDC,RGB(0,0,0));
TextOut(HDataDC,0,0,str,1); TextOut(HDataDC,0,0,str,1);
// 2nd nybble // 2nd nybble
MoveToEx(HDataDC, MemFontWidth + 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16), NULL); MoveToEx(HDataDC, MemFontWidth + 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16), NULL);
sprintf(str,"%X",GetMemViewData(CursorStartAddy) % 16); sprintf(str,"%X", byteValue % 16);
SetTextColor(HDataDC,TextColorList[i+j-CurOffset]); //single address highlight 2nd address SetTextColor(HDataDC,TextColorList[i+j-CurOffset]); //single address highlight 2nd address
SetBkColor(HDataDC,RGB(HexBackColorR,HexBackColorG,HexBackColorB)); SetBkColor(HDataDC,RGB(HexBackColorR,HexBackColorG,HexBackColorB));
TextOut(HDataDC,0,0,str,1); TextOut(HDataDC,0,0,str,1);
} }
//TextOut(HDataDC,0,0," ",1); //TextOut(HDataDC,0,0," ",1);
//single addres highlight - right column // single address highlight - right column
SetTextColor(HDataDC,RGB(255,255,255)); SetTextColor(HDataDC,RGB(255,255,255));
SetBkColor(HDataDC,RGB(0,0,0)); SetBkColor(HDataDC,RGB(0,0,0));
MoveToEx(HDataDC, (59 + j) * MemFontWidth, MemFontHeight * ((i - CurOffset) / 16), NULL); //todo: try moving this above the for loop MoveToEx(HDataDC, (59 + j) * MemFontWidth, MemFontHeight * ((i - CurOffset) / 16), NULL); //todo: try moving this above the for loop
str[0] = chartable[GetMemViewData(i+j)]; str[0] = chartable[byteValue];
if(str[0] < 0x20)str[0] = 0x2E; if(str[0] < 0x20)str[0] = 0x2E;
if(str[0] > 0x7e)str[0] = 0x2E; //if(str[0] > 0x7e)str[0] = 0x2E;
str[1] = 0; str[1] = 0;
TextOut(HDataDC,0,0,str,1); TextOut(HDataDC,0,0,str,1);
continue; PreviousValues[i+j-CurOffset] = PREVIOUS_VALUE_UNDEFINED; //set it to redraw this one next time
} } else if (draw_all || (PreviousValues[i+j-CurOffset] != byteValue) || (HighlightedBytes[i+j-CurOffset]))
if((OldValues[i+j-CurOffset] != GetMemViewData(i+j)) || draw_all)
{ {
MoveToEx(HDataDC, 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16),NULL); // print up normal text
SetTextColor(HDataDC,TextColorList[i+j-CurOffset]);//(8+j*3)*MemFontWidth if (HighlightedBytes[i+j-CurOffset])
{
// fade out 1 step
if (--HighlightedBytes[i+j-CurOffset] > 0)
SetTextColor(HDataDC, highlightActivityColors[HighlightedBytes[i+j-CurOffset]]);//(8+j*3)*MemFontWidth
else
SetTextColor(HDataDC,TextColorList[i+j-CurOffset]);//(8+j*3)*MemFontWidth
} else
{
SetTextColor(HDataDC,TextColorList[i+j-CurOffset]);//(8+j*3)*MemFontWidth
}
SetBkColor(HDataDC,BGColorList[i+j-CurOffset]); SetBkColor(HDataDC,BGColorList[i+j-CurOffset]);
sprintf(str,"%X", (int)(GetMemViewData(i+j) / 16)); MoveToEx(HDataDC, 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16),NULL);
sprintf(str,"%X", (int)(byteValue / 16));
TextOut(HDataDC, 0, 0, str, 1); TextOut(HDataDC, 0, 0, str, 1);
MoveToEx(HDataDC, MemFontWidth + 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16),NULL); MoveToEx(HDataDC, MemFontWidth + 8 * MemFontWidth + (j * 3 * MemFontWidth), MemFontHeight * ((i - CurOffset) / 16),NULL);
sprintf(str,"%X", GetMemViewData(i+j) % 16); sprintf(str,"%X", byteValue % 16);
TextOut(HDataDC, 0, 0, str, 1); TextOut(HDataDC, 0, 0, str, 1);
MoveToEx(HDataDC,(59+j)*MemFontWidth,MemFontHeight*((i-CurOffset)/16),NULL); //todo: try moving this above the for loop MoveToEx(HDataDC,(59+j)*MemFontWidth,MemFontHeight*((i-CurOffset)/16),NULL); //todo: try moving this above the for loop
str[0] = chartable[GetMemViewData(i+j)]; str[0] = chartable[byteValue];
if(str[0] < 0x20)str[0] = 0x2E; if(str[0] < 0x20)str[0] = 0x2E;
if(str[0] > 0x7e)str[0] = 0x2E; //if(str[0] > 0x7e)str[0] = 0x2E;
str[1] = 0; str[1] = 0;
TextOut(HDataDC,0,0,str,1); TextOut(HDataDC,0,0,str,1);
if(CursorStartAddy != i+j)OldValues[i+j-CurOffset] = GetMemViewData(i+j);
PreviousValues[i+j-CurOffset] = byteValue;
} }
} }
if(draw_all) if(draw_all)
{ {
MoveToEx(HDataDC,56*MemFontWidth,MemFontHeight*((i-CurOffset)/16),NULL); MoveToEx(HDataDC,56*MemFontWidth,MemFontHeight*((i-CurOffset)/16),NULL);
SetTextColor(HDataDC,RGB(HexForeColorR,HexForeColorG,HexForeColorB)); //Column separator SetTextColor(HDataDC,RGB(HexForeColorR,HexForeColorG,HexForeColorB)); //Column separator
SetBkColor(HDataDC,RGB(HexBackColorR,HexBackColorG,HexBackColorB)); SetBkColor(HDataDC,RGB(HexBackColorR,HexBackColorG,HexBackColorB));
TextOut(HDataDC,0,0," : ",3); TextOut(HDataDC,0,0," : ",3);
}/* }
/*
for(j = 0;j < 16;j++){ for(j = 0;j < 16;j++){
if((OldValues[i+j-CurOffset] != GetMem(i+j)) || draw_all){ if((OldValues[i+j-CurOffset] != GetMem(i+j)) || draw_all){
MoveToEx(HDataDC,(59+j)*MemFontWidth,MemFontHeight*((i-CurOffset)/16),NULL); //todo: try moving this above the for loop MoveToEx(HDataDC,(59+j)*MemFontWidth,MemFontHeight*((i-CurOffset)/16),NULL); //todo: try moving this above the for loop
@ -538,7 +577,8 @@ void UpdateMemoryView(int draw_all)
TextOut(HDataDC,0,0,str,1); TextOut(HDataDC,0,0,str,1);
if(CursorStartAddy != i+j)OldValues[i+j-CurOffset] = GetMem(i+j); if(CursorStartAddy != i+j)OldValues[i+j-CurOffset] = GetMem(i+j);
} }
}*/ }
*/
} }
// } // }
@ -546,7 +586,7 @@ void UpdateMemoryView(int draw_all)
SetBkColor(HDataDC,RGB(0,0,0)); SetBkColor(HDataDC,RGB(0,0,0));
MoveToEx(HDataDC,0,0,NULL); MoveToEx(HDataDC,0,0,NULL);
OldCurOffset = CurOffset; PreviousCurOffset = CurOffset;
return; return;
} }
@ -613,21 +653,30 @@ void UpdateCaption()
return; return;
} }
int GetMemViewData(uint32 i){ int GetMemViewData(uint32 i)
if(EditingMode == MODE_NES_MEMORY)return GetMem(i); {
if(EditingMode == MODE_NES_PPU){ if (EditingMode == MODE_NES_MEMORY)
return GetMem(i);
if (EditingMode == MODE_NES_PPU)
{
i &= 0x3FFF; i &= 0x3FFF;
if(i < 0x2000)return VPage[(i)>>10][(i)]; if(i < 0x2000)return VPage[(i)>>10][(i)];
//NSF PPU Viewer crash here (UGETAB) (Also disabled by 'MaxSize = 0x2000') //NSF PPU Viewer crash here (UGETAB) (Also disabled by 'MaxSize = 0x2000')
if (GameInfo->type==GIT_NSF) { if (GameInfo->type==GIT_NSF)
{
return (0); return (0);
} } else
else { {
if(i < 0x3F00)return vnapage[(i>>10)&0x3][i&0x3FF]; if(i < 0x3F00)
return vnapage[(i>>10)&0x3][i&0x3FF];
return PALRAM[i&0x1F]; return PALRAM[i&0x1F];
} }
} }
if(EditingMode == MODE_NES_FILE){ //todo: use getfiledata() here
if (EditingMode == MODE_NES_FILE)
{
//todo: use getfiledata() here
if(i < 16) return *((unsigned char *)&head+i); if(i < 16) return *((unsigned char *)&head+i);
if(i < 16+PRGsize[0])return PRGptr[0][i-16]; if(i < 16+PRGsize[0])return PRGptr[0][i-16];
if(i < 16+PRGsize[0]+CHRsize[0])return CHRptr[0][i-16-PRGsize[0]]; if(i < 16+PRGsize[0]+CHRsize[0])return CHRptr[0][i-16-PRGsize[0]];
@ -635,12 +684,15 @@ int GetMemViewData(uint32 i){
return 0; return 0;
} }
void UpdateColorTable(){ void UpdateColorTable()
{
UNDOSTRUCT *tmp; //mbg merge 7/18/06 removed struct qualifier UNDOSTRUCT *tmp; //mbg merge 7/18/06 removed struct qualifier
int i,j; int i,j;
if(!hMemView)return; if(!hMemView)return;
for(i = 0;i < DataAmount;i++){ for(i = 0;i < DataAmount;i++)
if((i+CurOffset >= CursorStartAddy) && (i+CurOffset <= CursorEndAddy)){ {
if((i+CurOffset >= CursorStartAddy) && (i+CurOffset <= CursorEndAddy))
{
BGColorList[i] = RGB(HexForeColorR,HexForeColorG,HexForeColorB); //Highlighter color bg - 2 columns BGColorList[i] = RGB(HexForeColorR,HexForeColorG,HexForeColorB); //Highlighter color bg - 2 columns
TextColorList[i] = RGB(HexBackColorR,HexBackColorG,HexBackColorB); //Highlighter color text - 2 columns TextColorList[i] = RGB(HexBackColorR,HexBackColorG,HexBackColorB); //Highlighter color text - 2 columns
continue; continue;
@ -874,10 +926,12 @@ void InputData(char *input){
if((input[i] >= '0') && (input[i] <= '9')) inputc = input[i]-'0'; if((input[i] >= '0') && (input[i] <= '9')) inputc = input[i]-'0';
if(inputc == -1)continue; if(inputc == -1)continue;
if(TempData != -1){ if(TempData != PREVIOUS_VALUE_UNDEFINED)
{
data[datasize++] = inputc|(TempData<<4); data[datasize++] = inputc|(TempData<<4);
TempData = -1; TempData = PREVIOUS_VALUE_UNDEFINED;
} else { } else
{
TempData = inputc; TempData = inputc;
} }
} else { } else {
@ -927,7 +981,7 @@ void InputData(char *input){
if(CursorStartAddy >= MaxSize)CursorStartAddy = MaxSize-1; if(CursorStartAddy >= MaxSize)CursorStartAddy = MaxSize-1;
free(data); free(data);
ChangeMemViewFocus(EditingMode,CursorStartAddy,-1); ChangeMemViewFocus(EditingMode, CursorStartAddy, -1);
UpdateColorTable(); UpdateColorTable();
return; return;
} }
@ -950,7 +1004,7 @@ if((addr > 0x3F00) && (addr < 0x3FFF))PALRAM[addr&0x1F] = data;
} }
if(EditingMode == MODE_NES_FILE)ApplyPatch(addr,1,(uint8 *)&data); if(EditingMode == MODE_NES_FILE)ApplyPatch(addr,1,(uint8 *)&data);
CursorStartAddy++; CursorStartAddy++;
TempData = -1; TempData = PREVIOUS_VALUE_UNDEFINED;
} else { } else {
TempData = input; TempData = input;
} }
@ -1142,13 +1196,23 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
//mbg merge 7/18/06 added casts: //mbg merge 7/18/06 added casts:
TextColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); TextColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF));
BGColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); BGColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF));
OldValues = (int*)malloc(DataAmount*sizeof(int)); PreviousValues = (int*)malloc(DataAmount*sizeof(int));
HighlightedBytes = (int*)malloc(DataAmount*sizeof(int));
resetHighlightingActivityLog();
EditingText = CurOffset = 0; EditingText = CurOffset = 0;
EditingMode = MODE_NES_MEMORY; EditingMode = MODE_NES_MEMORY;
//set the default table //set the default table
UnloadTableFile(); UnloadTableFile();
UpdateColorTable(); //draw it UpdateColorTable(); //draw it
// update menus
for (i = MODE_NES_MEMORY; i <= MODE_NES_FILE; i++)
{
CheckMenuItem(GetMenu(hwnd), MENU_MV_VIEW_RAM + i, (EditingMode == i) ? MF_CHECKED : MF_UNCHECKED);
}
CheckMenuItem(GetMenu(hwnd), ID_VIEW_HIGHLIGHT_ACTIVITY, (MemView_HighlightActivity) ? MF_CHECKED: MF_UNCHECKED);
updateBookmarkMenus(GetSubMenu(GetMenu(hwnd), 3)); updateBookmarkMenus(GetSubMenu(GetMenu(hwnd), 3));
return 0; return 0;
case WM_PAINT: case WM_PAINT:
@ -1291,7 +1355,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
if((wParam == VK_DOWN) || (wParam == VK_UP) || if((wParam == VK_DOWN) || (wParam == VK_UP) ||
(wParam == VK_RIGHT) || (wParam == VK_LEFT)){ (wParam == VK_RIGHT) || (wParam == VK_LEFT)){
CursorEndAddy = -1; CursorEndAddy = -1;
TempData = -1; TempData = PREVIOUS_VALUE_UNDEFINED;
if(CursorStartAddy < CurOffset) CurOffset = (CursorStartAddy/16)*16; if(CursorStartAddy < CurOffset) CurOffset = (CursorStartAddy/16)*16;
if(CursorStartAddy > CurOffset+DataAmount-0x10)CurOffset = ((CursorStartAddy-DataAmount+0x10)/16)*16; if(CursorStartAddy > CurOffset+DataAmount-0x10)CurOffset = ((CursorStartAddy-DataAmount+0x10)/16)*16;
} }
@ -1690,14 +1754,17 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
MemViewSizeY = newMemViewRect.bottom-newMemViewRect.top; MemViewSizeY = newMemViewRect.bottom-newMemViewRect.top;
} }
ClientHeight = HIWORD (lParam); ClientHeight = HIWORD (lParam);
if(DataAmount != ((ClientHeight/MemFontHeight)*16)){ if (DataAmount != ((ClientHeight/MemFontHeight)*16))
{
DataAmount = ((ClientHeight/MemFontHeight)*16); DataAmount = ((ClientHeight/MemFontHeight)*16);
if(DataAmount+CurOffset > MaxSize)CurOffset = MaxSize-DataAmount; if (CurOffset > MaxSize - DataAmount)
CurOffset = MaxSize - DataAmount;
//mbg merge 7/18/06 added casts: //mbg merge 7/18/06 added casts:
TextColorList = (COLORREF*)realloc(TextColorList,DataAmount*sizeof(COLORREF)); TextColorList = (COLORREF*)realloc(TextColorList,DataAmount*sizeof(COLORREF));
BGColorList = (COLORREF*)realloc(BGColorList,DataAmount*sizeof(COLORREF)); BGColorList = (COLORREF*)realloc(BGColorList,DataAmount*sizeof(COLORREF));
OldValues = (int*)realloc(OldValues,(DataAmount)*sizeof(int)); PreviousValues = (int*)realloc(PreviousValues,(DataAmount)*sizeof(int));
for(i = 0;i < DataAmount;i++)OldValues[i] = -1; HighlightedBytes = (int*)realloc(HighlightedBytes,(DataAmount)*sizeof(int));
resetHighlightingActivityLog();
} }
//Set vertical scroll bar range and page size //Set vertical scroll bar range and page size
ZeroMemory(&si, sizeof(SCROLLINFO)); ZeroMemory(&si, sizeof(SCROLLINFO));
@ -1829,12 +1896,9 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case MENU_MV_VIEW_PPU: case MENU_MV_VIEW_PPU:
case MENU_MV_VIEW_ROM: case MENU_MV_VIEW_ROM:
EditingMode = wParam - MENU_MV_VIEW_RAM; EditingMode = wParam - MENU_MV_VIEW_RAM;
for (i = 0; i < 3; i++) for (i = MODE_NES_MEMORY; i <= MODE_NES_FILE; i++)
{ {
if (EditingMode == i) CheckMenuItem(GetMenu(hMemView), MENU_MV_VIEW_RAM + i, (EditingMode == i) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(GetMenu(hMemView),MENU_MV_VIEW_RAM+i,MF_CHECKED);
else
CheckMenuItem(GetMenu(hMemView),MENU_MV_VIEW_RAM+i,MF_UNCHECKED);
} }
if (EditingMode == MODE_NES_MEMORY) if (EditingMode == MODE_NES_MEMORY)
MaxSize = 0x10000; MaxSize = 0x10000;
@ -1858,12 +1922,18 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
si.nPage = ClientHeight/MemFontHeight; si.nPage = ClientHeight/MemFontHeight;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE); SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
for(i = 0;i < DataAmount;i++)OldValues[i] = -1; resetHighlightingActivityLog();
UpdateColorTable(); UpdateColorTable();
UpdateCaption(); UpdateCaption();
return 0; return 0;
case ID_VIEW_HIGHLIGHT_ACTIVITY:
{
MemView_HighlightActivity ^= 1;
CheckMenuItem(GetMenu(hMemView), ID_VIEW_HIGHLIGHT_ACTIVITY, (MemView_HighlightActivity) ? MF_CHECKED: MF_UNCHECKED);
resetHighlightingActivityLog();
return 0;
}
// ################################## Start of SP CODE ########################### // ################################## Start of SP CODE ###########################
case MENU_MV_BOOKMARKS_RM_ALL: case MENU_MV_BOOKMARKS_RM_ALL:
if (nextBookmark) if (nextBookmark)

View File

@ -340,9 +340,11 @@ BEGIN
END END
POPUP "&View" POPUP "&View"
BEGIN BEGIN
MENUITEM "&NES Memory", MENU_MV_VIEW_RAM, CHECKED MENUITEM "&NES Memory", MENU_MV_VIEW_RAM
MENUITEM "&PPU Memory", MENU_MV_VIEW_PPU MENUITEM "&PPU Memory", MENU_MV_VIEW_PPU
MENUITEM "&ROM File", MENU_MV_VIEW_ROM MENUITEM "&ROM File", MENU_MV_VIEW_ROM
MENUITEM SEPARATOR
MENUITEM "Highlight Activity", ID_VIEW_HIGHLIGHT_ACTIVITY
END END
POPUP "&Bookmarks" POPUP "&Bookmarks"
BEGIN BEGIN

View File

@ -1185,6 +1185,9 @@
#define ID_CONFIG_COMPACTQUICKSAVING 40580 #define ID_CONFIG_COMPACTQUICKSAVING 40580
#define ID_CONFIG_SAVING_OPTIONS 40581 #define ID_CONFIG_SAVING_OPTIONS 40581
#define ID_CDLFILENAME 40582 #define ID_CDLFILENAME 40582
#define ID_VIEW_A 40583
#define ID_VIEW_HIGHLIGHT 40584
#define ID_VIEW_HIGHLIGHT_ACTIVITY 40585
#define IDC_DEBUGGER_ICONTRAY 55535 #define IDC_DEBUGGER_ICONTRAY 55535
#define MW_ValueLabel2 65423 #define MW_ValueLabel2 65423
#define MW_ValueLabel1 65426 #define MW_ValueLabel1 65426
@ -1197,7 +1200,7 @@
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 290 #define _APS_NEXT_RESOURCE_VALUE 290
#define _APS_NEXT_COMMAND_VALUE 40583 #define _APS_NEXT_COMMAND_VALUE 40586
#define _APS_NEXT_CONTROL_VALUE 1289 #define _APS_NEXT_CONTROL_VALUE 1289
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif