From 0e0d75cea81be178a48d50a8aa2eb531be4731ae Mon Sep 17 00:00:00 2001 From: owomomo Date: Wed, 13 Jan 2021 18:32:11 +0800 Subject: [PATCH] Fix Issue #89, Hex Editor features etc (#295) * 1. Fix a bug that VS System, Extend System and Input Device Combobox don't change any value of the header. 2. Add hex preview to iNES Header Editor. * Detail bug fix. * Header Editor Hotfix * ... * ... * Trying to fix Issue #89. * Add array symbolic debug naming feature to Hex Editor. * Separate the focus of Hex Editor cursor in different color, and Tab key to switch between them. * 1. Shift+ArrowKeys to select a range of bytes (Shift+Home/End/PageUp/PageDown currently not supported) 2. Tab to switch between Hex and Text column, and use different color to make it clearer. 3. Sorted out some codes of Hex Editor, they are somehow crowded mess with ambiguous. 4. Detail. * ... * I hope there's no more bugs digging out... * Fix calc bug of GetScreenCoordy(int offset). * Some document says ExtTextOut is a bit faster than TextOut. * Ctrl, Shift with arrow keys * ... * ... * ... --- src/drivers/win/config.cpp | 24 + src/drivers/win/debuggersp.cpp | 28 +- src/drivers/win/debuggersp.h | 1 + src/drivers/win/header_editor.cpp | 73 +- src/drivers/win/memview.cpp | 1106 ++++++++++++++++++----------- src/drivers/win/res.rc | 28 +- 6 files changed, 775 insertions(+), 485 deletions(-) diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index 44f2c99a..3d293793 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -123,6 +123,12 @@ extern int HexBackColorB; extern int HexForeColorR; extern int HexForeColorG; extern int HexForeColorB; +extern int HexHlBackColorR; +extern int HexHlBackColorG; +extern int HexHlBackColorB; +extern int HexHlForeColorR; +extern int HexHlForeColorG; +extern int HexHlForeColorB; extern int HexFreezeColorR; extern int HexFreezeColorG; extern int HexFreezeColorB; @@ -132,6 +138,12 @@ extern int RomFreezeColorB; extern int HexBoundColorR; extern int HexBoundColorG; extern int HexBoundColorB; +extern int HexHlShdBackColorR; +extern int HexHlShdBackColorG; +extern int HexHlShdBackColorB; +extern int HexHlShdForeColorR; +extern int HexHlShdForeColorG; +extern int HexHlShdForeColorB; extern int importBookmarkProps; //adelikat: Hacky fix for Ram Watch recent menu @@ -451,6 +463,18 @@ static CFGSTRUCT fceuconfig[] = AC(HexForeColorR), AC(HexForeColorG), AC(HexForeColorB), + AC(HexHlBackColorR), + AC(HexHlBackColorG), + AC(HexHlBackColorB), + AC(HexHlForeColorR), + AC(HexHlForeColorG), + AC(HexHlForeColorB), + AC(HexHlShdBackColorR), + AC(HexHlShdBackColorG), + AC(HexHlShdBackColorB), + AC(HexHlShdForeColorR), + AC(HexHlShdForeColorG), + AC(HexHlShdForeColorB), AC(HexFreezeColorR), AC(HexFreezeColorG), AC(HexFreezeColorB), diff --git a/src/drivers/win/debuggersp.cpp b/src/drivers/win/debuggersp.cpp index 73e85d44..ffadcac8 100644 --- a/src/drivers/win/debuggersp.cpp +++ b/src/drivers/win/debuggersp.cpp @@ -910,7 +910,9 @@ INT_PTR CALLBACK SymbolicNamingCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPA case WM_INITDIALOG: { CenterWindow(hwndDlg); - unsigned int newAddress = lParam; + unsigned int* range = (unsigned int*)lParam; + unsigned int newAddress = range[0]; + unsigned int arraySize = range[1]; // filename generateNLFilenameForAddress(newAddress); SetDlgItemText(hwndDlg, IDC_SYMBOLIC_FILENAME, NLfilename); @@ -925,20 +927,29 @@ INT_PTR CALLBACK SymbolicNamingCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPA if (node->comment && node->comment[0]) SetDlgItemText(hwndDlg, IDC_SYMBOLIC_COMMENT, node->comment); } - SetDlgItemText(hwndDlg, IDC_EDIT_SYMBOLIC_ARRAY, "10"); SetDlgItemText(hwndDlg, IDC_EDIT_SYMBOLIC_INIT, "0"); // set focus to IDC_SYMBOLIC_NAME SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwndDlg, IDC_SYMBOLIC_NAME), true); //always set the limits SendDlgItemMessage(hwndDlg, IDC_SYMBOLIC_NAME, EM_SETLIMITTEXT, NL_MAX_NAME_LEN, 0); SendDlgItemMessage(hwndDlg, IDC_SYMBOLIC_COMMENT, EM_SETLIMITTEXT, NL_MAX_MULTILINE_COMMENT_LEN, 0); - SendDlgItemMessage(hwndDlg, IDC_EDIT_SYMBOLIC_ARRAY, EM_SETLIMITTEXT, 2, 0); - SendDlgItemMessage(hwndDlg, IDC_EDIT_SYMBOLIC_INIT, EM_SETLIMITTEXT, 2, 0); + SendDlgItemMessage(hwndDlg, IDC_EDIT_SYMBOLIC_ARRAY, EM_SETLIMITTEXT, 4, 0); + SendDlgItemMessage(hwndDlg, IDC_EDIT_SYMBOLIC_INIT, EM_SETLIMITTEXT, 4, 0); DefaultEditCtrlProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_EDIT_SYMBOLIC_ARRAY), GWLP_WNDPROC, (LONG_PTR)FilterEditCtrlProc); DefaultEditCtrlProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_EDIT_SYMBOLIC_INIT), GWLP_WNDPROC, (LONG_PTR)FilterEditCtrlProc); CheckDlgButton(hwndDlg, IDC_CHECK_SYMBOLIC_NAME_OVERWRITE, BST_CHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_SYMBOLIC_COMMENT_ARRAY_HEAD, BST_CHECKED); + if (arraySize != -1) + { + char str[4]; + sprintf(str, "%X", arraySize); + SetDlgItemText(hwndDlg, IDC_EDIT_SYMBOLIC_ARRAY, str); + CheckDlgButton(hwndDlg, IDC_CHECK_SYMBOLIC_ARRAY, BST_CHECKED); + goto symbolic_array; + } else + SetDlgItemText(hwndDlg, IDC_EDIT_SYMBOLIC_ARRAY, "10"); + break; } case WM_CLOSE: @@ -980,6 +991,7 @@ INT_PTR CALLBACK SymbolicNamingCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPA } case IDC_CHECK_SYMBOLIC_ARRAY: { + symbolic_array: bool array_chk = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SYMBOLIC_ARRAY) == BST_CHECKED; bool delete_mode = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SYMBOLIC_DELETE) == BST_CHECKED; bool comment_head_only = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SYMBOLIC_COMMENT_ARRAY_HEAD) == BST_CHECKED; @@ -1054,11 +1066,17 @@ INT_PTR CALLBACK SymbolicNamingCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPA // returns true if user pressed OK, false if Cancel bool DoSymbolicDebugNaming(int offset, HWND parentHWND) +{ + return DoSymbolicDebugNaming(offset, -1, parentHWND); +} + +bool DoSymbolicDebugNaming(int offsetStart, int size, HWND parentHWND) { if (!FCEUI_EmulationPaused()) FCEUI_ToggleEmulationPause(); loadNameFiles(); - if (DialogBoxParam(fceu_hInstance, MAKEINTRESOURCE(IDD_SYMBOLIC_DEBUG_NAMING), parentHWND, SymbolicNamingCallB, offset)) + int range[2] = { offsetStart, size }; + if (DialogBoxParam(fceu_hInstance, MAKEINTRESOURCE(IDD_SYMBOLIC_DEBUG_NAMING), parentHWND, SymbolicNamingCallB, (LPARAM)range)) return true; return false; } diff --git a/src/drivers/win/debuggersp.h b/src/drivers/win/debuggersp.h index b322dbd6..f942e675 100644 --- a/src/drivers/win/debuggersp.h +++ b/src/drivers/win/debuggersp.h @@ -64,6 +64,7 @@ void GoToDebuggerBookmark(HWND hwnd); extern bool IsLetterLegalHex(char c); bool DoSymbolicDebugNaming(int offset, HWND parentHWND); +bool DoSymbolicDebugNaming(int offset, int size, HWND parentHWND); void AddNewSymbolicName(uint16 newAddress, char* newOffset, char* newName, char* newComment, int size, int init, bool nameOverwrite, bool commentHeadOnly, bool commentOverwrite); void DeleteSymbolicName(uint16 address, int size); void WriteNameFileToDisk(const char* filename, Name* node); diff --git a/src/drivers/win/header_editor.cpp b/src/drivers/win/header_editor.cpp index 7d7b056f..1a032428 100644 --- a/src/drivers/win/header_editor.cpp +++ b/src/drivers/win/header_editor.cpp @@ -1085,11 +1085,11 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header) SetFocus(GetDlgItem(hwnd, IDC_PRGROM_COMBO)); SendDlgItemMessage(hwnd, IDC_PRGROM_COMBO, EM_SETSEL, 0, -1); } - return false; } else SetDlgItemText(hwnd, IDC_HEX_HEADER_EDIT, ""); + return false; } } else { @@ -1307,29 +1307,29 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header) if (!fit) { - int result10 = (chr_rom / 1024 / 8 + 1) * 8 * 1024; - if (result10 < result) - result = result10; - char buf2[64]; - if (result % 1024 != 0) - sprintf(buf2, "%dB", result); - else - sprintf(buf2, "%dKB", result / 1024); - sprintf(buf, "CHR ROM size you entered is invalid in iNES 2.0, do you want to set to its nearest value %s?", buf2); - if (MessageBox(hwnd, buf, "Error", MB_YESNO | MB_ICONERROR) == IDYES) - SetDlgItemText(hwnd, IDC_CHRROM_COMBO, buf2); - else + if (header) { - if (header) + int result10 = (chr_rom / 1024 / 8 + 1) * 8 * 1024; + if (result10 < result) + result = result10; + char buf2[64]; + if (result % 1024 != 0) + sprintf(buf2, "%dB", result); + else + sprintf(buf2, "%dKB", result / 1024); + sprintf(buf, "CHR ROM size you entered is invalid in iNES 2.0, do you want to set to its nearest value %s?", buf2); + if (MessageBox(hwnd, buf, "Error", MB_YESNO | MB_ICONERROR) == IDYES) + SetDlgItemText(hwnd, IDC_CHRROM_COMBO, buf2); + else { SetFocus(GetDlgItem(hwnd, IDC_CHRROM_COMBO)); SendDlgItemMessage(hwnd, IDC_CHRROM_COMBO, EM_SETSEL, 0, -1); } - else - SetDlgItemText(hwnd, IDC_HEX_HEADER_EDIT, ""); - - return false; } + else + SetDlgItemText(hwnd, IDC_HEX_HEADER_EDIT, ""); + + return false; } } else { @@ -1657,12 +1657,9 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header) { SetFocus(GetDlgItem(hwnd, IDC_MAPPER_COMBO)); SendDlgItemMessage(hwnd, IDC_MAPPER_COMBO, EM_SETSEL, 0, -1); + return false; } } - else - SetDlgItemText(hwnd, IDC_HEX_HEADER_EDIT, ""); - - return false; } memcpy(_header.ID, "NES\x1A", 4); @@ -1719,30 +1716,30 @@ int GetComboBoxByteSize(HWND hwnd, UINT id, int* value, iNES_HEADER* header) } } - if (header) + if (err) { - switch (err) + if (header) { - case errors::FORMAT_ERR: - sprintf(buf, "%s size you entered is invalid, it should be positive decimal integer followed with unit, e.g. 1024B, 128KB, 4MB", name); - break; - case errors::UNIT_ERR: - sprintf(buf, "The unit of %s size you entered is invalid, it must be B, KB or MB", name); - break; - case errors::MINUS_ERR: - sprintf(buf, "Negative value of %s is not supported by iNES header.", name); - break; - } + switch (err) + { + case errors::FORMAT_ERR: + sprintf(buf, "%s size you entered is invalid, it should be positive decimal integer followed with unit, e.g. 1024B, 128KB, 4MB", name); + break; + case errors::UNIT_ERR: + sprintf(buf, "The unit of %s size you entered is invalid, it must be B, KB or MB", name); + break; + case errors::MINUS_ERR: + sprintf(buf, "Negative value of %s is not supported by iNES header.", name); + break; + } - if (err) - { MessageBox(hwnd, buf, "Error", MB_OK | MB_ICONERROR); SetFocus(GetDlgItem(hwnd, id)); SendDlgItemMessage(hwnd, id, EM_SETSEL, 0, -1); } + else + SetDlgItemText(hwnd, IDC_HEX_HEADER_EDIT, ""); } - else - SetDlgItemText(hwnd, IDC_HEX_HEADER_EDIT, ""); return err; } diff --git a/src/drivers/win/memview.cpp b/src/drivers/win/memview.cpp index 9c416f8f..74983835 100644 --- a/src/drivers/win/memview.cpp +++ b/src/drivers/win/memview.cpp @@ -94,6 +94,18 @@ int HexBackColorB = 255; int HexForeColorR = 0; // Black int HexForeColorG = 0; int HexForeColorB = 0; +int HexHlBackColorR = 0; // Black +int HexHlBackColorG = 0; +int HexHlBackColorB = 0; +int HexHlForeColorR = 255; // White +int HexHlForeColorG = 255; +int HexHlForeColorB = 255; +int HexHlShdBackColorR = 224; // Grey +int HexHlShdBackColorG = 224; +int HexHlShdBackColorB = 224; +int HexHlShdForeColorR = 0; // Black +int HexHlShdForeColorG = 0; +int HexHlShdForeColorB = 0; int HexFreezeColorR = 0; // Blue int HexFreezeColorG = 0; int HexFreezeColorB = 255; @@ -115,16 +127,16 @@ struct } popupmenu[] = { - {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_SYMBOLIC_NAME, "Add symbolic debug name"}, - {0x0000,0x2000, MODE_NES_MEMORY, ID_ADDRESS_FRZ_SUBMENU, "Freeze/Unfreeze This Address"}, - {0x6000,0x7FFF, MODE_NES_MEMORY, ID_ADDRESS_FRZ_SUBMENU, "Freeze/Unfreeze This Address"}, - {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_ADDBP_R, "Add Debugger Read Breakpoint"}, - {0x0000,0x3FFF, MODE_NES_PPU, ID_ADDRESS_ADDBP_R, "Add Debugger Read Breakpoint"}, - {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_ADDBP_W, "Add Debugger Write Breakpoint"}, - {0x0000,0x3FFF, MODE_NES_PPU, ID_ADDRESS_ADDBP_W, "Add Debugger Write Breakpoint"}, - {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_ADDBP_X, "Add Debugger Execute Breakpoint"}, - {0x8000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_SEEK_IN_ROM, "Go Here In ROM File"}, - {0x8000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_CREATE_GG_CODE, "Create Game Genie Code At This Address"} + {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_SYMBOLIC_NAME, "Add symbolic debug name"}, + {0x0000,0x2000, MODE_NES_MEMORY, ID_ADDRESS_FRZ_SUBMENU, "Freeze/Unfreeze This Address"}, + {0x6000,0x7FFF, MODE_NES_MEMORY, ID_ADDRESS_FRZ_SUBMENU, "Freeze/Unfreeze This Address"}, + {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_ADDBP_R, "Add Debugger Read Breakpoint"}, + {0x0000,0x3FFF, MODE_NES_PPU, ID_ADDRESS_ADDBP_R, "Add Debugger Read Breakpoint"}, + {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_ADDBP_W, "Add Debugger Write Breakpoint"}, + {0x0000,0x3FFF, MODE_NES_PPU, ID_ADDRESS_ADDBP_W, "Add Debugger Write Breakpoint"}, + {0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_ADDBP_X, "Add Debugger Execute Breakpoint"}, + {0x8000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_SEEK_IN_ROM, "Go Here In ROM File"}, + {0x8000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_CREATE_GG_CODE, "Create Game Genie Code At This Address"} }; #define POPUPNUM (sizeof popupmenu / sizeof popupmenu[0]) @@ -147,12 +159,11 @@ void OpenFindDialog(); static int GetFileData(uint32 offset); static int WriteFileData(uint32 offset,int data); static void PalettePoke(uint32 addr, uint8 data); +void SwitchEditingText(int editingText); HWND hMemView, hMemFind; -HDC mDC; -//int tempdummy; -//char dummystr[100]; + int CurOffset; int ClientHeight; int NoColors; @@ -171,9 +182,6 @@ static RECT newMemViewRect; static char chartable[256]; -//SCROLLINFO memsi; -//HBITMAP HDataBmp; -//HGDIOBJ HDataObj; HDC HDataDC; int CursorX=2, CursorY=9; int CursorStartAddy, CursorEndAddy = PREVIOUS_VALUE_UNDEFINED; @@ -183,20 +191,26 @@ int TempData = PREVIOUS_VALUE_UNDEFINED; int DataAmount; int MaxSize; -COLORREF *BGColorList; -COLORREF *TextColorList; +COLORREF *CurBGColorList; +COLORREF *CurTextColorList; +COLORREF *DimBGColorList; +COLORREF *DimTextColorList; +COLORREF *HexBGColorList; +COLORREF *HexTextColorList; +COLORREF *AnsiBGColorList; +COLORREF *AnsiTextColorList; + int PreviousCurOffset; int *PreviousValues; // for HighlightActivity feature and for speedhack too unsigned int *HighlightedBytes; -int lbuttondown, lbuttondownx, lbuttondowny; -int mousex, mousey; +int lbuttondown; int FindAsText; int FindDirectionUp; char FindTextBox[60]; -int temp_offset; +// int temp_offset; extern iNES_HEADER head; @@ -265,12 +279,10 @@ void UndoLastPatch(){ } void GotoAddress(HWND hwnd) { - char* gotoaddressstring; + char* gotoaddressstring = (char*)malloc(18); int gotoaddress; - char* gototitle; - - gototitle = (char*)malloc(18); - gotoaddressstring = (char*)malloc(8); + char* gototitle = (char*)malloc(8); + gotoaddressstring[0] = '\0'; sprintf(gototitle, "%s%X%s", "Goto (0-", MaxSize-1, ")"); if(CWin32InputBox::InputBox(gototitle, "Goto which address:", gotoaddressstring, 8, false, hwnd) == IDOK) @@ -465,7 +477,7 @@ void UpdateMemoryView(int draw_all) else SetTextColor(HDataDC, RGB(HexBoundColorR, HexBoundColorG, HexBoundColorB)); //addresses out of bounds sprintf(str, "%06X: :", i); - TextOut(HDataDC, 0, MemLineRow, str, strlen(str)); + ExtTextOut(HDataDC, 0, MemLineRow, NULL, NULL, str, strlen(str), NULL); } for (j = 0; j < 16; j++) { @@ -486,46 +498,46 @@ void UpdateMemoryView(int draw_all) SetTextColor(HDataDC, RGB(255, 0, 0)); str[0] = hex[(byteValue >> 4) & 0xF]; str[1] = 0; - TextOut(HDataDC, MemLinePos, MemLineRow, str, 1); + ExtTextOut(HDataDC, MemLinePos, MemLineRow, NULL, NULL, str, 1, NULL); // 2nd nibble SetBkColor(HDataDC, CForeColor); SetTextColor(HDataDC, CBackColor); str[0] = hex[(byteValue >> 0) & 0xF]; str[1] = 0; - TextOut(HDataDC, MemLinePos + MemFontWidth, MemLineRow, str, 1); + ExtTextOut(HDataDC, MemLinePos + MemFontWidth, MemLineRow, NULL, NULL, str, 1, NULL); } else { // Single Byte highlight // 1st nibble - SetBkColor(HDataDC, RGB(0, 0, 0)); - SetTextColor(HDataDC, RGB(255, 255, 255)); + SetBkColor(HDataDC, EditingText ? RGB(HexHlShdBackColorR, HexHlShdBackColorG, HexHlShdBackColorB) : RGB(HexHlBackColorR, HexHlBackColorG, HexHlBackColorB)); + SetTextColor(HDataDC, EditingText ? RGB(255, 0, 0) : RGB(255, 255, 255)); str[0] = hex[(byteValue >> 4) & 0xF]; str[1] = 0; - TextOut(HDataDC, MemLinePos, MemLineRow, str, 1); + ExtTextOut(HDataDC, MemLinePos, MemLineRow, NULL, NULL, str, 1, NULL); // 2nd nibble - SetBkColor(HDataDC, BGColorList[pos]); - SetTextColor(HDataDC, TextColorList[pos]); + SetBkColor(HDataDC, HexBGColorList[pos]); + SetTextColor(HDataDC, HexTextColorList[pos]); str[0] = hex[(byteValue >> 0) & 0xF]; str[1] = 0; - TextOut(HDataDC, MemLinePos + MemFontWidth, MemLineRow, str, 1); + ExtTextOut(HDataDC, MemLinePos + MemFontWidth, MemLineRow, NULL, NULL, str, 1, NULL); } // single address highlight - right column - SetBkColor(HDataDC, RGB(0, 0, 0)); - SetTextColor(HDataDC, RGB(255, 255, 255)); + SetBkColor(HDataDC, EditingText ? RGB(HexHlBackColorR, HexHlBackColorG, HexHlBackColorB) : RGB(HexHlShdBackColorR, HexHlShdBackColorG, HexHlShdBackColorB)); + SetTextColor(HDataDC, EditingText ? RGB(HexHlForeColorR, HexHlForeColorG, HexHlForeColorB) : RGB(HexHlShdForeColorR, HexHlShdForeColorG, HexHlShdForeColorB)); str[0] = chartable[byteValue]; if ((u8)str[0] < 0x20) str[0] = 0x2E; // if ((u8)str[0] > 0x7e) str[0] = 0x2E; str[1] = 0; - TextOut(HDataDC, (59 + j) * MemFontWidth, MemLineRow, str, 1); + ExtTextOut(HDataDC, (59 + j) * MemFontWidth, MemLineRow, NULL, NULL, str, 1, NULL); PreviousValues[pos] = PREVIOUS_VALUE_UNDEFINED; //set it to redraw this one next time } else if (draw_all || (PreviousValues[pos] != byteValue) || byteHighlightingValue) { - COLORREF tmpcolor = TextColorList[pos]; - SetBkColor(HDataDC, BGColorList[pos]); + COLORREF hexTmpColor = HexTextColorList[pos]; + COLORREF ansiTmpColor = AnsiTextColorList[pos]; // print up normal text if (byteHighlightingValue) { @@ -538,22 +550,31 @@ void UpdateMemoryView(int draw_all) // if the byte was changed in current frame, use brightest color, even if the "fading period" demands different color // also use the last color if byteHighlightingValue points outside the array of predefined colors if (byteHighlightingValue == MemView_HighlightActivity_FadingPeriod - 1 || byteHighlightingValue >= HIGHLIGHT_ACTIVITY_NUM_COLORS) - tmpcolor = highlightActivityColors[HIGHLIGHT_ACTIVITY_NUM_COLORS - 1]; + { + hexTmpColor = highlightActivityColors[HIGHLIGHT_ACTIVITY_NUM_COLORS - 1]; + ansiTmpColor = highlightActivityColors[HIGHLIGHT_ACTIVITY_NUM_COLORS - 1]; + } else - tmpcolor = highlightActivityColors[byteHighlightingValue]; + { + hexTmpColor = highlightActivityColors[byteHighlightingValue]; + ansiTmpColor = highlightActivityColors[byteHighlightingValue]; + } } } - SetTextColor(HDataDC, tmpcolor); + SetBkColor(HDataDC, HexBGColorList[pos]); + SetTextColor(HDataDC, hexTmpColor); str[0] = hex[(byteValue >> 4) & 0xF]; str[1] = hex[(byteValue >> 0) & 0xF]; str[2] = 0; - TextOut(HDataDC, MemLinePos, MemLineRow, str, 2); + ExtTextOut(HDataDC, MemLinePos, MemLineRow, NULL, NULL, str, 2, NULL); + SetBkColor(HDataDC, AnsiBGColorList[pos]); + SetTextColor(HDataDC, ansiTmpColor); str[0] = chartable[byteValue]; if ((u8)str[0] < 0x20) str[0] = 0x2E; // if ((u8)str[0] > 0x7e) str[0] = 0x2E; str[1] = 0; - TextOut(HDataDC, (59 + j) * MemFontWidth, MemLineRow, str, 1); + ExtTextOut(HDataDC, (59 + j) * MemFontWidth, MemLineRow, NULL, NULL, str, 1, NULL); PreviousValues[pos] = byteValue; } @@ -658,20 +679,27 @@ void UpdateColorTable() { if((i+CurOffset >= CursorStartAddy) && (i+CurOffset <= CursorEndAddy)) { - BGColorList[i] = RGB(HexForeColorR,HexForeColorG,HexForeColorB); //Highlighter color bg - 2 columns - TextColorList[i] = RGB(HexBackColorR,HexBackColorG,HexBackColorB); //Highlighter color text - 2 columns + CurBGColorList[i] = RGB(HexHlBackColorR, HexHlBackColorG, HexHlBackColorB); //Highlighter color bg - 2 columns + DimBGColorList[i] = RGB(HexHlShdBackColorR, HexHlShdBackColorG, HexHlShdBackColorB); + CurTextColorList[i] = RGB(HexHlForeColorR, HexHlForeColorG, HexHlForeColorB); //Highlighter color text - 2 columns + DimTextColorList[i] = RGB(HexHlShdForeColorR, HexHlShdForeColorG, HexHlShdForeColorB); continue; } - BGColorList[i] = RGB(HexBackColorR,HexBackColorG,HexBackColorB); //Regular color bb - 2columns - TextColorList[i] = RGB(HexForeColorR,HexForeColorG,HexForeColorB); //Regular color text - 2 columns + CurBGColorList[i] = RGB(HexBackColorR, HexBackColorG, HexBackColorB); //Regular color bb - 2columns + DimBGColorList[i] = RGB(HexBackColorR, HexBackColorG, HexBackColorB); //Regular color bb - 2columns + CurTextColorList[i] = RGB(HexForeColorR, HexForeColorG, HexForeColorB); //Regular color text - 2 columns + DimTextColorList[i] = RGB(HexForeColorR, HexForeColorG, HexForeColorB); //Regular color text - 2 columns } for (j=0;j= CurOffset) && ((int)hexBookmarks[j].address < CurOffset+DataAmount)) - TextColorList[hexBookmarks[j].address - CurOffset] = RGB(0,0xCC,0); // Green for Bookmarks + { + CurTextColorList[hexBookmarks[j].address - CurOffset] = RGB(0, 0xCC, 0); // Green for Bookmarks + DimTextColorList[hexBookmarks[j].address - CurOffset] = RGB(0, 0xCC, 0); // Green for Bookmarks + } } switch (EditingMode) @@ -679,11 +707,15 @@ void UpdateColorTable() case MODE_NES_MEMORY: for (int a = CurOffset; a < CurOffset + DataAmount; ++a) if (FCEUI_FindCheatMapByte(a)) - TextColorList[a - CurOffset] = RGB(HexFreezeColorR, HexFreezeColorG, HexFreezeColorB); + { + CurTextColorList[a - CurOffset] = RGB(HexFreezeColorR, HexFreezeColorG, HexFreezeColorB); + DimTextColorList[a - CurOffset] = RGB(HexFreezeColorR, HexFreezeColorG, HexFreezeColorB); + } break; case MODE_NES_FILE: if (cdloggerdataSize) { + int temp_offset; for (i = 0; i < DataAmount; i++) { temp_offset = CurOffset + i - 16; // (minus iNES header) @@ -695,22 +727,30 @@ void UpdateColorTable() if ((cdloggerdata[temp_offset] & 3) == 3) { // the byte is both Code and Data - green - TextColorList[i] = RGB(0, 190, 0); + CurTextColorList[i] = RGB(0, 190, 0); + DimTextColorList[i] = RGB(0, 190, 0); } else if ((cdloggerdata[temp_offset] & 3) == 1) { // the byte is Code - dark-yellow - TextColorList[i] = RGB(160, 140, 0); + CurTextColorList[i] = RGB(160, 140, 0); + DimTextColorList[i] = RGB(160, 140, 0); } else if ((cdloggerdata[temp_offset] & 3) == 2) { // the byte is Data - blue/cyan if (cdloggerdata[temp_offset] & 0x40) + { // PCM data - cyan - TextColorList[i] = RGB(0, 130, 160); + CurTextColorList[i] = RGB(0, 130, 160); + DimTextColorList[i] = RGB(0, 130, 160); + } else + { // non-PCM data - blue - TextColorList[i] = RGB(0, 0, 210); + CurTextColorList[i] = RGB(0, 0, 210); + DimTextColorList[i] = RGB(0, 0, 210); + } } } else @@ -722,17 +762,20 @@ void UpdateColorTable() if ((cdloggervdata[temp_offset] & 3) == 3) { // the byte was both rendered and read programmatically - light-green - TextColorList[i] = RGB(5, 255, 5); + CurTextColorList[i] = RGB(5, 255, 5); + DimTextColorList[i] = RGB(5, 255, 5); } else if ((cdloggervdata[temp_offset] & 3) == 1) { // the byte was rendered - yellow - TextColorList[i] = RGB(210, 190, 0); + CurTextColorList[i] = RGB(210, 190, 0); + DimTextColorList[i] = RGB(210, 190, 0); } else if ((cdloggervdata[temp_offset] & 3) == 2) { // the byte was read programmatically - light-blue - TextColorList[i] = RGB(15, 15, 255); + CurTextColorList[i] = RGB(15, 15, 255); + DimTextColorList[i] = RGB(15, 15, 255); } } } @@ -746,7 +789,10 @@ void UpdateColorTable() //if((tmp->addr < CurOffset+DataAmount) && (tmp->addr+tmp->size > CurOffset)) for (i = tmp->addr; i < tmp->addr + tmp->size; i++) { if ((i > CurOffset) && (i < CurOffset + DataAmount)) - TextColorList[i - CurOffset] = RGB(RomFreezeColorR, RomFreezeColorG, RomFreezeColorB); + { + CurTextColorList[i - CurOffset] = RGB(RomFreezeColorR, RomFreezeColorG, RomFreezeColorB); + DimTextColorList[i - CurOffset] = RGB(RomFreezeColorR, RomFreezeColorG, RomFreezeColorB); + } } tmp = tmp->last; } @@ -979,49 +1025,9 @@ void InputData(char *input){ UpdateColorTable(); return; } -/* -if(!EditingText){ -if((input >= 'a') && (input <= 'f')) input-=('a'-0xA); -if((input >= 'A') && (input <= 'F')) input-=('A'-0xA); -if((input >= '0') && (input <= '9')) input-='0'; -if(input > 0xF)return; - -if(TempData != -1){ -addr = CursorStartAddy; -data = input|(TempData<<4); -if(EditingMode == MODE_NES_MEMORY)BWrite[addr](addr,data); -if(EditingMode == MODE_NES_PPU){ -addr &= 0x3FFF; -if(addr < 0x2000)VPage[addr>>10][addr] = data; //todo: detect if this is vrom and turn it red if so -if((addr > 0x2000) && (addr < 0x3F00))vnapage[(addr>>10)&0x3][addr&0x3FF] = data; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct? -if((addr > 0x3F00) && (addr < 0x3FFF)) PalettePoke(addr,data); -} -if(EditingMode == MODE_NES_FILE)ApplyPatch(addr,1,(uint8 *)&data); -CursorStartAddy++; -TempData = PREVIOUS_VALUE_UNDEFINED; -} else { -TempData = input; -} -} else { -for(i = 0;i < 256;i++)if(chartable[i] == input)break; -if(i == 256)return; - -addr = CursorStartAddy; -data = i; -if(EditingMode == MODE_NES_MEMORY)BWrite[addr](addr,data); -if(EditingMode == MODE_NES_FILE)ApplyPatch(addr,1,(uint8 *)&data); -CursorStartAddy++; -} -*/ void ChangeMemViewFocus(int newEditingMode, int StartOffset,int EndOffset){ - SCROLLINFO si; - - //if (GameInfo->type==GIT_NSF) { - // FCEUD_PrintError("Sorry, you can't yet use the Memory Viewer with NSFs."); - // return; - //} if(!hMemView)DoMemView(); if(EditingMode != newEditingMode) @@ -1048,11 +1054,13 @@ void ChangeMemViewFocus(int newEditingMode, int StartOffset,int EndOffset){ if(CurOffset < 0)CurOffset = 0; } - SetFocus(hMemView); + SetFocus(hMemView); + + SCROLLINFO si; ZeroMemory(&si, sizeof(SCROLLINFO)); si.fMask = SIF_POS; si.cbSize = sizeof(SCROLLINFO); - si.nPos = CurOffset/16; + si.nPos = CurOffset / 16; SetScrollInfo(hMemView,SB_VERT,&si,TRUE); UpdateCaption(); UpdateColorTable(); @@ -1067,7 +1075,7 @@ int GetHexScreenCoordx(int offset) int GetHexScreenCoordy(int offset) { - return (offset / 16) * (debugSystem->HexeditorFontHeight + HexRowHeightBorder); + return (offset - CurOffset) / 16 * (debugSystem->HexeditorFontHeight + HexRowHeightBorder); } //0000E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : ................ @@ -1135,11 +1143,15 @@ void KillMemView() { if (hMemView) { - ReleaseDC(hMemView, mDC); + ReleaseDC(hMemView, HDataDC); DestroyWindow(hMemView); UnregisterClass("MEMVIEW", fceu_hInstance); hMemView = NULL; hMemFind = NULL; + free(CurTextColorList); + free(DimTextColorList); + free(CurBGColorList); + free(DimBGColorList); if (EditingMode == MODE_NES_MEMORY) ReleaseCheatMap(); } @@ -1160,24 +1172,18 @@ int GetMaxSize(int EditingMode) LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - HDC hdc; - HGLOBAL hGlobal ; - PTSTR pGlobal ; - HMENU hMenu; - POINT point; - PAINTSTRUCT ps ; - TEXTMETRIC tm; - SCROLLINFO si; - int x, y, i, j; - int bank = -1; - int tempAddy; + static PAINTSTRUCT ps; + + // int tempAddy; const int MemFontWidth = debugSystem->HexeditorFontWidth; const int MemFontHeight = debugSystem->HexeditorFontHeight + HexRowHeightBorder; - char c[2]; - char str[100]; +// char str[100]; extern int debuggerWasActive; + static int tmpStartAddy = -1; + static int tmpEndAddy = -1; + switch (message) { case WM_ENTERMENULOOP:return 0; @@ -1194,19 +1200,25 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa SetWindowPos(hwnd,0,MemView_wndx,MemView_wndy,MemViewSizeX,MemViewSizeY,SWP_NOZORDER|SWP_NOOWNERZORDER); debuggerWasActive = 1; - mDC = GetDC(hwnd); - HDataDC = mDC;//deleteme + HDataDC = GetDC(hwnd); SelectObject (HDataDC, debugSystem->hHexeditorFont); SetTextAlign(HDataDC,TA_NOUPDATECP | TA_TOP | TA_LEFT); - GetTextMetrics (HDataDC, &tm); +// TEXTMETRIC textMetric; +// GetTextMetrics (HDataDC, &textMetric); MaxSize = 0x10000; //Allocate Memory for color lists DataAmount = 0x100; //mbg merge 7/18/06 added casts: - TextColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); - BGColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); + CurTextColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); + CurBGColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); + DimTextColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); + DimBGColorList = (COLORREF*)malloc(DataAmount*sizeof(COLORREF)); + HexTextColorList = CurTextColorList; + HexBGColorList = CurBGColorList; + AnsiTextColorList = DimTextColorList; + AnsiBGColorList = DimBGColorList; PreviousValues = (int*)malloc(DataAmount*sizeof(int)); HighlightedBytes = (unsigned int*)malloc(DataAmount*sizeof(unsigned int)); resetHighlightingActivityLog(); @@ -1219,7 +1231,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa UpdateColorTable(); //draw it // update menus - for (i = MODE_NES_MEMORY; i <= MODE_NES_FILE; i++) + for (int i = MODE_NES_MEMORY; i <= MODE_NES_FILE; i++) if(EditingMode == i) { CheckMenuRadioItem(GetMenu(hwnd), MENU_MV_VIEW_RAM, MENU_MV_VIEW_ROM, MENU_MV_VIEW_RAM, MF_BYCOMMAND); break; @@ -1230,85 +1242,302 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa updateBookmarkMenus(GetSubMenu(GetMenu(hwnd), BOOKMARKS_SUBMENU_POS)); return 0; case WM_PAINT: - hdc = BeginPaint(hwnd, &ps); + BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); UpdateMemoryView(1); return 0; case WM_DROPFILES: + { + UINT len; + char *ftmp; + + len=DragQueryFile((HDROP)wParam,0,0,0)+1; + if((ftmp=(char*)malloc(len))) { - UINT len; - char *ftmp; - - len=DragQueryFile((HDROP)wParam,0,0,0)+1; - if((ftmp=(char*)malloc(len))) + DragQueryFile((HDROP)wParam,0,ftmp,len); + string fileDropped = ftmp; + //adelikat: Drag and Drop only checks file extension, the internal functions are responsible for file error checking + //------------------------------------------------------- + //Check if .tbl + //------------------------------------------------------- + if (!(fileDropped.find(".tbl") == string::npos) && (fileDropped.find(".tbl") == fileDropped.length()-4)) { - DragQueryFile((HDROP)wParam,0,ftmp,len); - string fileDropped = ftmp; - //adelikat: Drag and Drop only checks file extension, the internal functions are responsible for file error checking - //------------------------------------------------------- - //Check if .tbl - //------------------------------------------------------- - if (!(fileDropped.find(".tbl") == string::npos) && (fileDropped.find(".tbl") == fileDropped.length()-4)) - { - LoadTable(fileDropped.c_str()); - } - else - { - std::string str = "Could not open " + fileDropped; - MessageBox(hwnd, str.c_str(), "File error", 0); - } - } - } - break; + LoadTable(fileDropped.c_str()); + } + else + { + std::string str = "Could not open " + fileDropped; + MessageBox(hwnd, str.c_str(), "File error", 0); + } + } + } + break; case WM_VSCROLL: - + { + SCROLLINFO si; ZeroMemory(&si, sizeof(SCROLLINFO)); si.fMask = SIF_ALL; si.cbSize = sizeof(SCROLLINFO); - GetScrollInfo(hwnd,SB_VERT,&si); - switch(LOWORD(wParam)) { - case SB_ENDSCROLL: - case SB_TOP: - case SB_BOTTOM: break; - case SB_LINEUP: si.nPos--; break; - case SB_LINEDOWN:si.nPos++; break; - case SB_PAGEUP: si.nPos-=si.nPage; break; - case SB_PAGEDOWN: si.nPos+=si.nPage; break; - case SB_THUMBPOSITION: //break; - case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; + GetScrollInfo(hwnd, SB_VERT, &si); + switch (LOWORD(wParam)) { + case SB_ENDSCROLL: + case SB_TOP: + case SB_BOTTOM: break; + case SB_LINEUP: si.nPos--; break; + case SB_LINEDOWN:si.nPos++; break; + case SB_PAGEUP: si.nPos -= si.nPage; break; + case SB_PAGEDOWN: si.nPos += si.nPage; break; + case SB_THUMBPOSITION: //break; + case SB_THUMBTRACK: si.nPos = si.nTrackPos; break; } if (si.nPos < si.nMin) si.nPos = si.nMin; - if ((si.nPos+(int)si.nPage) > si.nMax) si.nPos = si.nMax-si.nPage; //mbg merge 7/18/06 added cast - CurOffset = si.nPos*16; - SetScrollInfo(hwnd,SB_VERT,&si,TRUE); + if ((si.nPos + (int)si.nPage) > si.nMax) si.nPos = si.nMax - si.nPage; //mbg merge 7/18/06 added cast + CurOffset = si.nPos * 16; + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); UpdateColorTable(); return 0; + } case WM_CHAR: - if(GetKeyState(VK_CONTROL) & 0x8000)return 0; //prevents input when pressing ctrl+c + if(GetKeyState(VK_CONTROL) & 0x8000) return 0; //prevents input when pressing ctrl+c + char c[2]; c[0] = (char)(wParam&0xFF); c[1] = 0; - //sprintf(str,"c[0] = %c c[1] = %c",c[0],c[1]); - //MessageBox(hMemView,str, "debug", MB_OK); InputData(c); UpdateColorTable(); UpdateCaption(); return 0; case WM_KEYDOWN: - //if((wParam >= 0x30) && (wParam <= 0x39))InputData(wParam-0x30); - //if((wParam >= 0x41) && (wParam <= 0x46))InputData(wParam-0x41+0xA); - /*if(!((GetKeyState(VK_LSHIFT) & 0x8000) || (GetKeyState(VK_RSHIFT) & 0x8000))){ - //MessageBox(hMemView,"nobody", "mouse wheel dance!", MB_OK); - CursorShiftPoint = -1; - } - if(((GetKeyState(VK_LSHIFT) & 0x8000) || (GetKeyState(VK_RSHIFT) & 0x8000)) && - (CursorShiftPoint == -1)){ - CursorShiftPoint = CursorStartAddy; - //MessageBox(hMemView,"somebody", "mouse wheel dance!", MB_OK); - }*/ + { - if(GetKeyState(VK_CONTROL) & 0x8000){ + if (wParam == VK_DOWN || wParam == VK_UP || wParam == VK_RIGHT || wParam == VK_LEFT || wParam == VK_PRIOR || wParam == VK_NEXT || wParam == VK_HOME || wParam == VK_END) + { + if (GetKeyState(VK_SHIFT) & 0x8000) + { + // Shift+ArrowKeys to select a range data + if (CursorEndAddy == -1) + { + tmpStartAddy = CursorStartAddy; + tmpEndAddy = CursorStartAddy; + } + if (wParam == VK_RIGHT) + { + if (tmpEndAddy >= MaxSize - 1) + return 0; + ++tmpEndAddy; + } + else if (wParam == VK_LEFT) + { + if (tmpEndAddy <= 0) + return 0; + --tmpEndAddy; + } + else if (wParam == VK_DOWN) + { + if (tmpEndAddy >= MaxSize - 1) + return 0; + tmpEndAddy += 16; + } + else if (wParam == VK_UP) + { + if (tmpEndAddy <= 0) + return 0; + tmpEndAddy -= 16; + } + else if (wParam == VK_PRIOR) + { + if (tmpEndAddy <= 0) + return 0; + tmpEndAddy -= DataAmount; + CurOffset -= DataAmount; + } + else if (wParam == VK_NEXT) + { + if (tmpEndAddy >= MaxSize - 1) + return 0; + tmpEndAddy += DataAmount; + CurOffset += DataAmount; + } + else if (wParam == VK_HOME) + { + if (tmpEndAddy <= 0) + return 0; + if (GetKeyState(VK_CONTROL) & 0x8000) + tmpEndAddy = 0; + else + tmpEndAddy = tmpEndAddy / 16 * 16; + } + else if (wParam == VK_END) + { + if (tmpEndAddy >= MaxSize - 1) + return 0; + if (GetKeyState(VK_CONTROL) & 0x8000) + tmpEndAddy = MaxSize - 1; + else + tmpEndAddy = tmpEndAddy / 16 * 16 + 15; + } + + if (tmpEndAddy < 0) + tmpEndAddy = 0; + else if (tmpEndAddy >= MaxSize) + tmpEndAddy = MaxSize - 1; + if (tmpStartAddy < 0) + tmpStartAddy = 0; + else if (tmpStartAddy >= MaxSize) + tmpStartAddy = MaxSize - 1; + + if (tmpEndAddy < tmpStartAddy) + { + CursorStartAddy = tmpEndAddy; + CursorEndAddy = tmpStartAddy; + if (CursorStartAddy < CurOffset) + CurOffset = CursorStartAddy / 16 * 16; + else if (CursorStartAddy >= CurOffset + DataAmount) + CurOffset = CursorStartAddy / 16 * 16 - DataAmount + 0x10; + } + else if (tmpEndAddy > tmpStartAddy) + { + CursorStartAddy = tmpStartAddy; + CursorEndAddy = tmpEndAddy; + if (CursorEndAddy < CurOffset) + CurOffset = CursorEndAddy / 16 * 16; + else if (CursorEndAddy > CurOffset + DataAmount - 0x10) + CurOffset = CursorEndAddy / 16 * 16 - DataAmount + 0x10; + } + else + { + CursorStartAddy = tmpStartAddy; + CursorEndAddy = -1; + } + } + else if (GetKeyState(VK_CONTROL) & 0x8000) + { + if (wParam == VK_UP) + { + if (CurOffset <= 0) + return 0; + CurOffset -= 16; + if (CursorEndAddy == -1 && CursorStartAddy >= CurOffset + DataAmount) + CursorStartAddy -= 16; + } + else if (wParam == VK_DOWN) + { + if (CurOffset >= (MaxSize - DataAmount) / 16 * 16) + return 0; + CurOffset += 16; + if (CursorEndAddy == -1 && CursorStartAddy < CurOffset) + CursorStartAddy += 16; + } + else if (wParam == VK_PRIOR) + { + if (CurOffset <= 0) + return 0; + CurOffset -= DataAmount; + } + else if (wParam == VK_NEXT) + { + if (CurOffset >= (MaxSize - DataAmount) / 16 * 16) + return 0; + CurOffset += DataAmount; + } + else if (wParam == VK_HOME) + { + if (CursorStartAddy == 0 && CursorEndAddy == -1 && CurOffset == 0) + return 0; + CursorStartAddy = 0; + CursorEndAddy = -1; + CurOffset = 0; + } + else if (wParam == VK_END) + { + if (CursorStartAddy == 0 && CursorEndAddy == -1 && CurOffset ==(MaxSize - DataAmount) / 16 * 16) + return 0; + CurOffset = (MaxSize - DataAmount) / 16 * 16; + CursorStartAddy = MaxSize - 1; + CursorEndAddy = -1; + } + + TempData = PREVIOUS_VALUE_UNDEFINED; + } + else + { + // Move the cursor + + if (wParam == VK_RIGHT) + { + if (CursorStartAddy >= MaxSize - 1) + return 0; + CursorStartAddy++; + } + else if (wParam == VK_DOWN) + { + if (CursorStartAddy >= MaxSize - 1) + return 0; + CursorStartAddy += 16; + } + else if (wParam == VK_UP) + { + if (CursorStartAddy <= 0) + return 0; + CursorStartAddy -= 16; + } + else if (wParam == VK_LEFT) + { + if (CursorStartAddy <= 0) + return 0; + CursorStartAddy--; + } else if (wParam == VK_PRIOR) + { + if (CurOffset <= 0) + return 0; + CurOffset -= DataAmount; + CursorStartAddy -= DataAmount; + } + else if (wParam == VK_NEXT) + { + if (CurOffset >= (MaxSize - DataAmount) / 16 * 16) + return 0; + CurOffset += DataAmount; + CursorStartAddy += DataAmount; + } + else if (wParam == VK_HOME) + { + if (CurOffset <= 0) + return 0; + CurOffset = 0; + CursorStartAddy = 0; + } + else if (wParam == VK_END) { + if (CurOffset >= (MaxSize - DataAmount) / 16 * 16) + CurOffset = (MaxSize - DataAmount) / 16 * 16; + CursorStartAddy = MaxSize - 1; + } + + CursorEndAddy = -1; + if (CursorStartAddy < CurOffset) + CurOffset = (CursorStartAddy / 16) * 16; + if (CursorStartAddy > CurOffset + DataAmount - 0x10) + CurOffset = (CursorStartAddy - DataAmount + 0x10) / 16 * 16; + } + TempData = PREVIOUS_VALUE_UNDEFINED; + + + // Cursor Out of bound check + if (CursorStartAddy < 0) + CursorStartAddy = 0; + if (CursorStartAddy >= MaxSize) + CursorStartAddy = MaxSize - 1; + if (CursorEndAddy >= MaxSize) + CursorEndAddy = MaxSize - 1; + if (CursorEndAddy == CursorStartAddy) + CursorEndAddy = -1; + if (CurOffset + DataAmount >= MaxSize) + CurOffset = (MaxSize - DataAmount) / 16 * 16; + if (CurOffset < 0) + CurOffset = 0; + } + else if (GetKeyState(VK_CONTROL) & 0x8000) { if (wParam >= '0' && wParam <= '9') { @@ -1323,112 +1552,72 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa if (address != -1) { ChangeMemViewFocus(hexBookmarks[hexBookmarks.shortcuts[key_num]].editmode, address, -1); - UpdateColorTable(); + // it stops here to prevent update the scroll info, color table and caption twice, + // because ChangeMemViewFocus already contained those codes. + return 0; } } } - switch(wParam){ + switch (wParam) { case 0x43: //Ctrl+C - MemViewCallB(hMemView,WM_COMMAND,MENU_MV_EDIT_COPY,0); //recursion at work + MemViewCallB(hMemView, WM_COMMAND, MENU_MV_EDIT_COPY, 0); //recursion at work return 0; case 0x56: //Ctrl+V - MemViewCallB(hMemView,WM_COMMAND,MENU_MV_EDIT_PASTE,0); + MemViewCallB(hMemView, WM_COMMAND, MENU_MV_EDIT_PASTE, 0); return 0; case 0x5a: //Ctrl+Z - UndoLastPatch(); break; + UndoLastPatch(); + break; case 0x41: //Ctrl+A - // Fall through to Ctrl+G + // Fall through to Ctrl+G case 0x47: //Ctrl+G - GotoAddress(hwnd); break; + GotoAddress(hwnd); + break; case 0x46: //Ctrl+F - OpenFindDialog(); break; + OpenFindDialog(); + break; + default: + return 0; } } - - //if(CursorShiftPoint == -1){ - if(wParam == VK_LEFT)CursorStartAddy--; - if(wParam == VK_RIGHT)CursorStartAddy++; - if(wParam == VK_UP)CursorStartAddy-=16; - if(wParam == VK_DOWN)CursorStartAddy+=16; - /*} else { - if(wParam == VK_LEFT)CursorShiftPoint--; - if(wParam == VK_RIGHT)CursorShiftPoint++; - if(wParam == VK_UP)CursorShiftPoint-=16; - if(wParam == VK_DOWN)CursorShiftPoint+=16; - if(CursorShiftPoint < CursorStartAddy){ - if(CursorEndAddy == -1)CursorEndAddy = CursorStartAddy; - CursorStartAddy = CursorShiftPoint; - } - //if(CursorShiftPoint > CursorEndAddy)CursorEndAddy = CursorShiftPoint; - }*/ - - //if(CursorStartAddy == CursorEndAddy)CursorEndAddy = -1; - if(CursorStartAddy < 0) CursorStartAddy = 0; - if(CursorStartAddy >= MaxSize) CursorStartAddy = MaxSize-1; - - if((wParam == VK_DOWN) || (wParam == VK_UP) || - (wParam == VK_RIGHT) || (wParam == VK_LEFT)){ - CursorEndAddy = -1; - TempData = PREVIOUS_VALUE_UNDEFINED; - if(CursorStartAddy < CurOffset) CurOffset = (CursorStartAddy/16)*16; - if(CursorStartAddy > CurOffset+DataAmount-0x10)CurOffset = ((CursorStartAddy-DataAmount+0x10)/16)*16; - } - - if(wParam == VK_PRIOR) { CurOffset-=DataAmount; CursorStartAddy-=DataAmount; } - if(wParam == VK_NEXT) { CurOffset+=DataAmount; CursorStartAddy+=DataAmount; } - if(wParam == VK_HOME) { CurOffset=0; CursorStartAddy=0; } - if(wParam == VK_END) { CurOffset = MaxSize-DataAmount; CursorStartAddy=MaxSize-1; } - - if (CurOffset >= MaxSize - DataAmount) CurOffset = MaxSize - DataAmount; - if (CurOffset < 0) CurOffset = 0; - if(wParam == VK_PRIOR || wParam == VK_NEXT || wParam == VK_HOME || wParam == VK_END) + else if (wParam == VK_TAB && (GetKeyState(VK_CONTROL) & 0x8000) == 0 && (GetKeyState(VK_MENU) & 0x8000) == 0) { - CursorEndAddy = -1; + SwitchEditingText(!EditingText); TempData = PREVIOUS_VALUE_UNDEFINED; - if (CursorStartAddy < 0) CursorStartAddy = 0; - if (CursorStartAddy >= MaxSize) CursorStartAddy = MaxSize-1; } - /* - if((wParam == VK_PRIOR) || (wParam == VK_NEXT)){ - ZeroMemory(&si, sizeof(SCROLLINFO)); - si.fMask = SIF_ALL; - si.cbSize = sizeof(SCROLLINFO); - GetScrollInfo(hwnd,SB_VERT,&si); - if(wParam == VK_PRIOR)si.nPos-=si.nPage; - if(wParam == VK_NEXT)si.nPos+=si.nPage; - if (si.nPos < si.nMin) si.nPos = si.nMin; - if ((si.nPos+si.nPage) > si.nMax) si.nPos = si.nMax-si.nPage; - CurOffset = si.nPos*16; - } - */ + else + // Pressed a key without any function, stop + return 0; //This updates the scroll bar to curoffset + SCROLLINFO si; ZeroMemory(&si, sizeof(SCROLLINFO)); si.fMask = SIF_POS; si.cbSize = sizeof(SCROLLINFO); - si.nPos = CurOffset/16; - SetScrollInfo(hwnd,SB_VERT,&si,TRUE); + si.nPos = CurOffset / 16; + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); UpdateColorTable(); UpdateCaption(); return 0; - /* case WM_KEYUP: - if((wParam == VK_LSHIFT) || (wParam == VK_RSHIFT)){ - CursorShiftPoint = -1; - } - return 0;*/ + } case WM_LBUTTONDOWN: - //CursorShiftPoint = -1; SetCapture(hwnd); lbuttondown = 1; - x = GET_X_LPARAM(lParam); - y = GET_Y_LPARAM(lParam); - if((i = GetAddyFromCoord(x,y)) < 0) { CursorDragPoint = -1; return 0; } - if(i > MaxSize) { CursorDragPoint = -1; return 0; } - EditingText = AddyWasText; - lbuttondownx = x; - lbuttondowny = y; - CursorStartAddy = CursorDragPoint = i; + tmpStartAddy = GetAddyFromCoord(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + if(tmpStartAddy < 0) + { + CursorDragPoint = -1; + return 0; + } + if(tmpStartAddy > MaxSize) + { + CursorDragPoint = -1; + return 0; + } + SwitchEditingText(AddyWasText); + CursorStartAddy = tmpStartAddy; + CursorDragPoint = tmpStartAddy; CursorEndAddy = -1; UpdateCaption(); UpdateColorTable(); @@ -1437,13 +1626,11 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa { if (!lbuttondown && CursorEndAddy == -1) { - x = GET_X_LPARAM(lParam); - y = GET_Y_LPARAM(lParam); - i = GetAddyFromCoord(x,y); - if (i >= 0 && i < MaxSize) + int addr = GetAddyFromCoord(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + if (addr >= 0 && addr < MaxSize) { - EditingText = AddyWasText; - CursorStartAddy = i; + SwitchEditingText(AddyWasText); + tmpStartAddy = addr; UpdateCaption(); UpdateColorTable(); return 0; @@ -1452,33 +1639,37 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa break; } case WM_MOUSEMOVE: - if (CursorDragPoint < 0) return 0; - mousex = x = GET_X_LPARAM(lParam); - mousey = y = GET_Y_LPARAM(lParam); + { + if (CursorDragPoint < 0) + return 0; + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); if(lbuttondown){ AutoScrollFromCoord(x,y); - i = GetAddyFromCoord(x,y); - if (i >= MaxSize)i = MaxSize-1; - EditingText = AddyWasText; - if(i >= 0){ - CursorStartAddy = std::min(i,CursorDragPoint); - CursorEndAddy = std::max(i,CursorDragPoint); - if(CursorEndAddy == CursorStartAddy)CursorEndAddy = -1; + tmpEndAddy = GetAddyFromCoord(x,y); + if (tmpEndAddy >= MaxSize) + tmpEndAddy = MaxSize - 1; + SwitchEditingText(AddyWasText); + if(tmpEndAddy >= 0){ + CursorStartAddy = std::min(tmpStartAddy, tmpEndAddy); + CursorEndAddy = std::max(tmpStartAddy, tmpEndAddy); + if(CursorEndAddy == CursorStartAddy) + CursorEndAddy = -1; } UpdateCaption(); UpdateColorTable(); } - //sprintf(str,"%d %d",mousex, mousey); - //SetWindowText(hMemView,str); return 0; + } case WM_LBUTTONUP: lbuttondown = 0; - if(CursorEndAddy == CursorStartAddy)CursorEndAddy = -1; + if (CursorEndAddy == CursorStartAddy) + CursorEndAddy = -1; if((CursorEndAddy < CursorStartAddy) && (CursorEndAddy != -1)){ //this reverses them if they're not right - i = CursorStartAddy; + int tmpAddy = CursorStartAddy; CursorStartAddy = CursorEndAddy; - CursorEndAddy = i; + CursorEndAddy = tmpAddy; } UpdateCaption(); UpdateColorTable(); @@ -1486,23 +1677,52 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa return 0; case WM_CONTEXTMENU: { - point.x = x = GET_X_LPARAM(lParam); - point.y = y = GET_Y_LPARAM(lParam); - ScreenToClient(hMemView,&point); - mousex = point.x; - mousey = point.y; - j = GetAddyFromCoord(mousex,mousey); - bank = getBank(j); - //sprintf(str,"x = %d, y = %d, j = %d",mousex,mousey,j); - //MessageBox(hMemView,str, "mouse wheel dance!", MB_OK); - hMenu = CreatePopupMenu(); - - for(i = 0;i < POPUPNUM;i++) + POINT ptScreen = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + POINT ptClient; + int curAddy; + if (ptScreen.x == -1 && ptScreen.y == -1) { - if((j >= popupmenu[i].minaddress) && (j <= popupmenu[i].maxaddress) && (EditingMode == popupmenu[i].editingmode)) + ptClient.x = GetHexScreenCoordx(CursorStartAddy); + ptClient.y = GetHexScreenCoordy(CursorEndAddy == -1 ? CursorStartAddy + 16 : CursorEndAddy + 16); + ptScreen = ptClient; + ClientToScreen(hMemView, &ptScreen); + curAddy = CursorStartAddy; + } + else + { + ptClient = ptScreen; + ScreenToClient(hMemView, &ptClient); + curAddy = GetAddyFromCoord(ptClient.x, ptClient.y); + } + + int bank = getBank(curAddy); + HMENU hMenu = CreatePopupMenu(); + + char str[128]; + for(int i = 0;i < POPUPNUM;i++) + { + if((curAddy >= popupmenu[i].minaddress) && (curAddy <= popupmenu[i].maxaddress) && (EditingMode == popupmenu[i].editingmode)) { switch(popupmenu[i].id) { + case ID_ADDRESS_SYMBOLIC_NAME: + { + if (curAddy <= CursorEndAddy && curAddy >= CursorStartAddy) + { + if (curAddy >= 0x8000 && bank != -1) + sprintf(str, "Add Symbolic Debug Name For Address %02X:%04X-%02X:%04X", bank, CursorStartAddy, bank, CursorEndAddy); + else + sprintf(str, "Add Symbolic Debug Name For Address %04X-%04X", CursorStartAddy, CursorEndAddy); + } else + { + if (curAddy >= 0x8000 && bank != -1) + sprintf(str, "Add Symbolic Debug Name For Address %02X:%04X", bank, curAddy); + else + sprintf(str, "Add Symbolic Debug Name For Address %04X", curAddy); + } + popupmenu[i].text = str; + break; + } //this will set the text for the menu dynamically based on the id case ID_ADDRESS_FRZ_SUBMENU: { @@ -1514,6 +1734,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa AppendMenu(sub, MF_SEPARATOR, ID_ADDRESS_FRZ_SEP, "-"); AppendMenu(sub, MF_STRING, ID_ADDRESS_FRZ_UNFREEZE_ALL, "Unfreeze all"); + int tempAddy; if (CursorEndAddy == -1) tempAddy = CursorStartAddy; else tempAddy = CursorEndAddy; //This is necessary because CursorEnd = -1 if only 1 address is selected if (tempAddy - CursorStartAddy + FrozenAddressCount > 255) //There is a limit of 256 possible frozen addresses, therefore if the user has selected more than this limit, disable freeze menu items @@ -1526,54 +1747,54 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa case ID_ADDRESS_ADDBP_R: { // We want this to give the address to add the read breakpoint for - if ((j <= CursorEndAddy) && (j >= CursorStartAddy)) + if ((curAddy <= CursorEndAddy) && (curAddy >= CursorStartAddy)) { - if (j >= 0x8000 && bank != -1) + if (curAddy >= 0x8000 && bank != -1) sprintf(str,"Add Read Breakpoint For Address %02X:%04X-%02X:%04X", bank, CursorStartAddy, bank, CursorEndAddy); else sprintf(str,"Add Read Breakpoint For Address %04X-%04X", CursorStartAddy, CursorEndAddy); } else { - if (j >= 0x8000 && bank != -1) - sprintf(str,"Add Read Breakpoint For Address %02X:%04X", bank, j); + if (curAddy >= 0x8000 && bank != -1) + sprintf(str,"Add Read Breakpoint For Address %02X:%04X", bank, curAddy); else - sprintf(str,"Add Read Breakpoint For Address %04X", j); + sprintf(str,"Add Read Breakpoint For Address %04X", curAddy); } popupmenu[i].text = str; break; } case ID_ADDRESS_ADDBP_W: { - if ((j <= CursorEndAddy) && (j >= CursorStartAddy)) + if ((curAddy <= CursorEndAddy) && (curAddy >= CursorStartAddy)) { - if (j >= 0x8000 && bank != -1) + if (curAddy >= 0x8000 && bank != -1) sprintf(str,"Add Write Breakpoint For Address %02X:%04X-%02X:%04X", bank, CursorStartAddy, bank, CursorEndAddy); else sprintf(str,"Add Write Breakpoint For Address %04X-%04X", CursorStartAddy, CursorEndAddy); } else { - if (j >= 0x8000 && bank != -1) - sprintf(str,"Add Write Breakpoint For Address %02X:%04X", bank, j); + if (curAddy >= 0x8000 && bank != -1) + sprintf(str,"Add Write Breakpoint For Address %02X:%04X", bank, curAddy); else - sprintf(str,"Add Write Breakpoint For Address %04X", j); + sprintf(str,"Add Write Breakpoint For Address %04X", curAddy); } popupmenu[i].text = str; break; } case ID_ADDRESS_ADDBP_X: { - if ((j <= CursorEndAddy) && (j >= CursorStartAddy)) + if ((curAddy <= CursorEndAddy) && (curAddy >= CursorStartAddy)) { - if (j >= 0x8000 && bank != -1) + if (curAddy >= 0x8000 && bank != -1) sprintf(str,"Add Execute Breakpoint For Address %02X:%04X-%02X:%04X", bank, CursorStartAddy, bank, CursorEndAddy); else sprintf(str,"Add Execute Breakpoint For Address %04X-%04X", CursorStartAddy, CursorEndAddy); } else { - if (j >= 0x8000 && bank != -1) - sprintf(str,"Add Execute Breakpoint For Address %02X:%04X", bank, j); + if (curAddy >= 0x8000 && bank != -1) + sprintf(str,"Add Execute Breakpoint For Address %02X:%04X", bank, curAddy); else - sprintf(str,"Add Execute Breakpoint For Address %04X", j); + sprintf(str,"Add Execute Breakpoint For Address %04X", curAddy); } popupmenu[i].text = str; break; @@ -1593,35 +1814,30 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa else AppendMenu(hMenu, MF_STRING, ID_ADDRESS_ADD_BOOKMARK, "Add Bookmark"); - - if (i != 0) - i = TrackPopupMenuEx(hMenu, TPM_RETURNCMD | TPM_RIGHTBUTTON, x, y, hMemView, NULL); - switch(i) + int id = TrackPopupMenuEx(hMenu, TPM_RETURNCMD | TPM_RIGHTBUTTON, ptScreen.x, ptScreen.y, hMemView, NULL); + switch(id) { case ID_ADDRESS_FRZ_TOGGLE_STATE: { - int n; - for (n=CursorStartAddy;(CursorEndAddy == -1 && n == CursorStartAddy) || n<=CursorEndAddy;n++) + for (int frzAddr = CursorStartAddy; (CursorEndAddy == -1 && frzAddr == CursorStartAddy) || frzAddr <= CursorEndAddy; frzAddr++) { - FreezeRam(n, 0, n == CursorEndAddy); + FreezeRam(frzAddr, 0, frzAddr == CursorEndAddy); } break; } case ID_ADDRESS_FRZ_FREEZE: { - int n; - for (n=CursorStartAddy;(CursorEndAddy == -1 && n == CursorStartAddy) || n<=CursorEndAddy;n++) + for (int frzAddr = CursorStartAddy; (CursorEndAddy == -1 && frzAddr == CursorStartAddy) || frzAddr <= CursorEndAddy; frzAddr++) { - FreezeRam(n, 1, n == CursorEndAddy); + FreezeRam(frzAddr, 1, frzAddr == CursorEndAddy); } break; } case ID_ADDRESS_FRZ_UNFREEZE: { - int n; - for (n=CursorStartAddy;(CursorEndAddy == -1 && n == CursorStartAddy) || n<=CursorEndAddy;n++) + for (int frzAddr = CursorStartAddy; (CursorEndAddy == -1 && frzAddr == CursorStartAddy) || frzAddr <= CursorEndAddy; frzAddr++) { - FreezeRam(n, -1, n == CursorEndAddy); + FreezeRam(frzAddr, -1, frzAddr == CursorEndAddy); } break; } @@ -1639,20 +1855,20 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa watchpoint[numWPs].flags = WP_E | WP_R; if (EditingMode == MODE_NES_PPU) watchpoint[numWPs].flags |= BT_P; - if ((j <= CursorEndAddy) && (j >= CursorStartAddy)) + if ((curAddy <= CursorEndAddy) && (curAddy >= CursorStartAddy)) { watchpoint[numWPs].address = CursorStartAddy; watchpoint[numWPs].endaddress = CursorEndAddy; } else { - watchpoint[numWPs].address = j; + watchpoint[numWPs].address = curAddy; watchpoint[numWPs].endaddress = 0; } char condition[10] = {0}; if (EditingMode == MODE_NES_MEMORY) { // only break at this Bank - if (j >= 0x8000 && bank != -1) + if (curAddy >= 0x8000 && bank != -1) sprintf(condition, "T==#%02X", bank); } checkCondition(condition, numWPs); @@ -1676,20 +1892,20 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa watchpoint[numWPs].flags = WP_E | WP_W; if (EditingMode == MODE_NES_PPU) watchpoint[numWPs].flags |= BT_P; - if ((j <= CursorEndAddy) && (j >= CursorStartAddy)) + if ((curAddy <= CursorEndAddy) && (curAddy >= CursorStartAddy)) { watchpoint[numWPs].address = CursorStartAddy; watchpoint[numWPs].endaddress = CursorEndAddy; } else { - watchpoint[numWPs].address = j; + watchpoint[numWPs].address = curAddy; watchpoint[numWPs].endaddress = 0; } char condition[10] = {0}; if (EditingMode == MODE_NES_MEMORY) { // only break at this Bank - if (j >= 0x8000 && bank != -1) + if (curAddy >= 0x8000 && bank != -1) sprintf(condition, "T==#%02X", bank); } checkCondition(condition, numWPs); @@ -1709,20 +1925,20 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa if (numWPs < MAXIMUM_NUMBER_OF_BREAKPOINTS) { watchpoint[numWPs].flags = WP_E | WP_X; - if((j <= CursorEndAddy) && (j >= CursorStartAddy)) + if((curAddy <= CursorEndAddy) && (curAddy >= CursorStartAddy)) { watchpoint[numWPs].address = CursorStartAddy; watchpoint[numWPs].endaddress = CursorEndAddy; } else { - watchpoint[numWPs].address = j; + watchpoint[numWPs].address = curAddy; watchpoint[numWPs].endaddress = 0; } char condition[10] = {0}; if (EditingMode == MODE_NES_MEMORY) { // only break at this Bank - if (j >= 0x8000 && bank != -1) + if (curAddy >= 0x8000 && bank != -1) sprintf(condition, "T==#%02X", bank); } checkCondition(condition, numWPs); @@ -1738,10 +1954,10 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa break; } case ID_ADDRESS_SEEK_IN_ROM: - ChangeMemViewFocus(MODE_NES_FILE,GetNesFileAddress(j),-1); + ChangeMemViewFocus(MODE_NES_FILE, GetNesFileAddress(curAddy), -1); break; case ID_ADDRESS_CREATE_GG_CODE: - SetGGConvFocus(j,GetMem(j)); + SetGGConvFocus(curAddy, GetMem(curAddy)); break; case ID_ADDRESS_ADD_BOOKMARK: { @@ -1798,7 +2014,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa break; case ID_ADDRESS_SYMBOLIC_NAME: { - if (DoSymbolicDebugNaming(j, hMemView)) + if (curAddy <= CursorEndAddy && curAddy >= CursorStartAddy ? DoSymbolicDebugNaming(CursorStartAddy, CursorEndAddy - CursorStartAddy + 1, hMemView) : DoSymbolicDebugNaming(curAddy, hMemView)) { // enable "Symbolic Debug" if not yet enabled if (!symbDebugEnabled) @@ -1820,21 +2036,21 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa case WM_MBUTTONDOWN: { if (EditingMode != MODE_NES_MEMORY) return 0; - x = GET_X_LPARAM(lParam); - y = GET_Y_LPARAM(lParam); - i = GetAddyFromCoord(x,y); - if(i < 0) return 0; - FreezeRam(i, 0, 1); + int addr = GetAddyFromCoord(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + if(addr < 0) return 0; + FreezeRam(addr, 0, 1); return 0; } case WM_MOUSEWHEEL: - i = (short)HIWORD(wParam);///WHEEL_DELTA; + { + SCROLLINFO si; + int delta = (short)HIWORD(wParam);///WHEEL_DELTA; ZeroMemory(&si, sizeof(SCROLLINFO)); si.fMask = SIF_ALL; si.cbSize = sizeof(SCROLLINFO); GetScrollInfo(hwnd,SB_VERT,&si); - if(i < 0)si.nPos+=si.nPage; - if(i > 0)si.nPos-=si.nPage; + if(delta < 0)si.nPos+=si.nPage; + if(delta > 0)si.nPos-=si.nPage; if (si.nPos < si.nMin) si.nPos = si.nMin; if ((si.nPos+(int)si.nPage) > si.nMax) si.nPos = si.nMax-si.nPage; //added cast CurOffset = si.nPos*16; @@ -1843,7 +2059,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa SetScrollInfo(hwnd,SB_VERT,&si,TRUE); UpdateColorTable(); return 0; - + } case WM_SIZE: if(wParam == SIZE_RESTORED) //If dialog was resized { @@ -1858,13 +2074,20 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa if (CurOffset >= MaxSize - DataAmount) CurOffset = MaxSize - DataAmount; if (CurOffset < 0) CurOffset = 0; //mbg merge 7/18/06 added casts: - TextColorList = (COLORREF*)realloc(TextColorList,DataAmount*sizeof(COLORREF)); - BGColorList = (COLORREF*)realloc(BGColorList,DataAmount*sizeof(COLORREF)); + CurTextColorList = (COLORREF*)realloc(CurTextColorList, DataAmount*sizeof(COLORREF)); + CurBGColorList = (COLORREF*)realloc(CurBGColorList, DataAmount*sizeof(COLORREF)); + DimTextColorList = (COLORREF*)realloc(DimTextColorList, DataAmount*sizeof(COLORREF)); + DimBGColorList = (COLORREF*)realloc(DimBGColorList, DataAmount*sizeof(COLORREF)); + HexTextColorList = EditingText ? DimTextColorList : CurTextColorList; + HexBGColorList = EditingText ? DimBGColorList : CurBGColorList; + AnsiTextColorList = EditingText ? CurTextColorList : DimTextColorList; + AnsiBGColorList = EditingText ? CurBGColorList : DimBGColorList; PreviousValues = (int*)realloc(PreviousValues,(DataAmount)*sizeof(int)); HighlightedBytes = (unsigned int*)realloc(HighlightedBytes,(DataAmount)*sizeof(unsigned int)); resetHighlightingActivityLog(); } //Set vertical scroll bar range and page size + SCROLLINFO si; ZeroMemory(&si, sizeof(SCROLLINFO)); si.cbSize = sizeof (si) ; si.fMask = (SIF_RANGE|SIF_PAGE) ; @@ -1890,52 +2113,54 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa return 0; case MENU_MV_FILE_LOAD_TBL: - if((i = LoadTableFile()) != -1){ - sprintf(str,"Error Loading Table File At Line %d",i); - MessageBox(hMemView, str, "error", MB_OK); + { + int errLine = LoadTableFile(); + if (errLine != -1) { + char str[128]; + sprintf(str, "Error loading table file at Line %d", errLine); + MessageBox(hMemView, str, "Error", MB_OK | MB_ICONERROR); } UpdateColorTable(); - return 0; - + } + return 0; case MENU_MV_FILE_UNLOAD_TBL: UnloadTableFile(); UpdateColorTable(); return 0; case MENU_MV_FILE_DUMP_RAM: - { - char bar[0x800]; - unsigned int i; - for (i=0;i>10][(i)]; - else if(i < 0x3F00) bar[i] = vnapage[(i>>10)&0x3][i&0x3FF]; - else bar[i] = READPAL_MOTHEROFALL(i & 0x1F); - } - dumpToFile(bar, sizeof(bar)); - return 0; + i &= 0x3FFF; + if(i < 0x2000) bar[i] = VPage[(i)>>10][(i)]; + else if(i < 0x3F00) bar[i] = vnapage[(i>>10)&0x3][i&0x3FF]; + else bar[i] = READPAL_MOTHEROFALL(i & 0x1F); } + dumpToFile(bar, sizeof(bar)); + return 0; + } case MENU_MV_FILE_DUMP_OAM: { char bar[0x100]; @@ -1946,44 +2171,43 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa } case MENU_MV_FILE_LOAD_RAM: + { + char bar[0x800]; + if (loadFromFile(bar, sizeof(bar))) { - char bar[0x800]; - if (loadFromFile(bar, sizeof(bar))) - { - for (uint16 addr=0; addr>10][addr] = v; //todo: detect if this is vrom and turn it red if so - if((addr >= 0x2000) && (addr < 0x3F00)) - vnapage[(addr>>10)&0x3][addr&0x3FF] = v; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct? - if((addr >= 0x3F00) && (addr < 0x3FFF)) - PalettePoke(addr,v); - } + char v = bar[addr]; + if(addr < 0x2000) + VPage[addr>>10][addr] = v; //todo: detect if this is vrom and turn it red if so + if((addr >= 0x2000) && (addr < 0x3F00)) + vnapage[(addr>>10)&0x3][addr&0x3FF] = v; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct? + if((addr >= 0x3F00) && (addr < 0x3FFF)) + PalettePoke(addr,v); } - return 0; } + return 0; + } case MENU_MV_FILE_LOAD_OAM: + { + char bar[0x100]; + if (loadFromFile(bar, sizeof(bar))) { - char bar[0x100]; - if (loadFromFile(bar, sizeof(bar))) - { - for (uint16 addr=0; addr