Merge pull request #98 from owomomo/master

Add Multiple RAM Watches At Once In Edit Watch Window
This commit is contained in:
CaH4e3 2020-05-03 22:28:19 +03:00 committed by GitHub
commit d89ead783e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 1475 additions and 1143 deletions

View File

@ -39,7 +39,6 @@ using namespace std;
static uint8 *CheatRPtrs[64];
vector<uint16> FrozenAddresses; //List of addresses that are currently frozen
void UpdateFrozenList(void); //Function that populates the list of frozen addresses
unsigned int FrozenAddressCount = 0; //Keeps up with the Frozen address count, necessary for using in other dialogs (such as hex editor)
void FCEU_CheatResetRAM(void)
@ -64,6 +63,7 @@ CHEATF_SUBFAST SubCheats[256] = { 0 };
uint32 numsubcheats = 0;
int globalCheatDisabled = 0;
int disableAutoLSCheats = 0;
static _8BYTECHEATMAP* cheatMap = NULL;
struct CHEATF *cheats = 0, *cheatsl = 0;
@ -102,11 +102,17 @@ void RebuildSubCheats(void)
{
uint32 x;
struct CHEATF *c = cheats;
for(x = 0; x < numsubcheats; x++)
for (x = 0; x < numsubcheats; x++)
{
SetReadHandler(SubCheats[x].addr, SubCheats[x].addr, SubCheats[x].PrevRead);
if (cheatMap)
FCEUI_SetCheatMapByte(SubCheats[x].addr, false);
}
numsubcheats = 0;
if (!globalCheatDisabled)
{
while(c)
{
if(c->type == 1 && c->status && GetReadHandler(c->addr) != SubCheatsRead)
@ -116,27 +122,32 @@ void RebuildSubCheats(void)
SubCheats[numsubcheats].val = c->val;
SubCheats[numsubcheats].compare = c->compare;
SetReadHandler(c->addr, c->addr, SubCheatsRead);
if (cheatMap)
FCEUI_SetCheatMapByte(SubCheats[numsubcheats].addr, true);
numsubcheats++;
}
c = c->next;
}
}
FrozenAddressCount = numsubcheats; //Update the frozen address list
UpdateFrozenList();
}
void FCEU_PowerCheats()
{
numsubcheats = 0; /* Quick hack to prevent setting of ancient read addresses. */
if (cheatMap)
FCEUI_RefreshCheatMap();
RebuildSubCheats();
}
int FCEU_CalcCheatAffectedBytes(uint32 address, uint32 size) {
uint32 count = 0;
for (uint32 i = 0; i < numsubcheats && count < size; ++i)
if (SubCheats[i].addr >= address && SubCheats[i].addr < address + size)
++count;
if (cheatMap)
for (uint32 i = 0; i < size; ++i)
if (FCEUI_FindCheatMapByte(address + i))
++count;
return count;
}
@ -195,9 +206,12 @@ void FCEU_LoadGameCheats(FILE *override, int override_existing)
int tc = 0;
char *fn;
savecheats = 0;
if (override_existing)
{
numsubcheats = 0;
if (cheatMap)
FCEUI_RefreshCheatMap();
}
if(override)
fp = override;
@ -870,22 +884,6 @@ void FCEU_CheatSetByte(uint32 A, uint8 V)
BWrite[A](A, V);
}
void UpdateFrozenList(void)
{
//The purpose of this function is to keep an up to date list of addresses that are currently frozen
//and make these accessible to other dialogs that deal with memory addresses such as
//memwatch, hex editor, ramfilter, etc.
uint32 x;
FrozenAddresses.clear(); //Clear vector and repopulate
for(x = 0; x < numsubcheats; x++)
{
FrozenAddresses.push_back(SubCheats[x].addr);
//FCEU_printf("Address %d: %d \n",x,FrozenAddresses[x]); //Debug
}
//FCEUI_DispMessage("FrozenCount: %d",0,FrozenAddressCount);//Debug
}
// disable all cheats
int FCEU_DisableAllCheats(){
int count = 0;
@ -902,3 +900,36 @@ int FCEU_DisableAllCheats(){
RebuildSubCheats();
return count;
}
inline int FCEUI_FindCheatMapByte(uint16 address)
{
return cheatMap[address / 8] >> (address % 8) & 1;
}
inline void FCEUI_SetCheatMapByte(uint16 address, bool cheat)
{
cheat ? cheatMap[address / 8] |= (1 << address % 8) : cheatMap[address / 8] ^= (1 << address % 8);
}
inline void FCEUI_CreateCheatMap()
{
if (!cheatMap)
cheatMap = (unsigned char*)malloc(CHEATMAP_SIZE);
FCEUI_RefreshCheatMap();
}
inline void FCEUI_RefreshCheatMap()
{
memset(cheatMap, 0, CHEATMAP_SIZE);
for (int i = 0; i < numsubcheats; ++i)
FCEUI_SetCheatMapByte(SubCheats[i].addr, true);
}
inline void FCEUI_ReleaseCheatMap()
{
if (cheatMap)
{
free(cheatMap);
cheatMap = NULL;
}
}

View File

@ -11,6 +11,16 @@ void FCEU_ApplyPeriodicCheats(void);
void FCEU_PowerCheats(void);
int FCEU_CalcCheatAffectedBytes(uint32 address, uint32 size);
// Trying to find a more efficient way for determining if an address has a cheat
// each bit of 1 byte represents to 8 bytes in NES
typedef unsigned char _8BYTECHEATMAP;
#define CHEATMAP_SIZE 0x10000 / 8
extern int FCEUI_FindCheatMapByte(uint16 address);
extern void FCEUI_SetCheatMapByte(uint16 address, bool cheat);
extern void FCEUI_CreateCheatMap();
extern void FCEUI_RefreshCheatMap();
extern void FCEUI_ReleaseCheatMap();
int FCEU_CheatGetByte(uint32 A);
void FCEU_CheatSetByte(uint32 A, uint8 V);
@ -55,10 +65,4 @@ struct SEARCHPOSSIBLE {
#define FCEU_SEARCH_NEWVAL_GT_KNOWN 7
#define FCEU_SEARCH_NEWVAL_LT_KNOWN 8
#define CalcAddressRangeCheatCount(count, address, size) \
count = 0; \
for (int i = 0; i < numsubcheats && count < size; ++i) \
if (SubCheats[i].addr >= address && SubCheats[i].addr < address + size) \
++count
#endif

View File

@ -30,7 +30,8 @@
#include <map>
// static HWND pwindow = 0; // owomomo: removed pwindow because ambiguous, perhaps it is some obseleted early future plan from half developed old FCEUX?
HWND hCheat = 0; //Handle to Cheats dialog
HWND hCheat = 0; //Handle to Cheats dialog
HWND hCheatTip = 0; //Handle to tooltip
HMENU hCheatcontext = 0; //Handle to cheat context menu
bool pauseWhileActive = false; //For checkbox "Pause while active"
@ -40,6 +41,7 @@ extern bool wasPausedByCheats;
int CheatWindow;
int CheatStyle = 1;
int CheatMapUsers = 0; // how many windows using cheatmap
#define GGLISTSIZE 128 //hopefully this is enough for all cases
@ -72,7 +74,7 @@ char* GameGenieLetters = "APZLGITYEOXUKSVN";
// bool dodecode;
HWND hGGConv;
HWND hGGConv = 0;
void EncodeGG(char *str, int a, int v, int c);
void ListGGAddresses(HWND hwndDlg);
@ -352,7 +354,8 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CHEAT_TEXT), GWLP_WNDPROC, (LONG_PTR)FilterEditCtrlProc);
SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_CHEAT_GAME_GENIE_TEXT), GWLP_WNDPROC, (LONG_PTR)FilterEditCtrlProc);
// Create popup to "Auto load / save with game", since it has 3 states and the text need some explanation
SetCheatToolTip(hwndDlg, IDC_CHEAT_AUTOLOADSAVE);
possiTotalCount = 0;
possiItemCount = SendDlgItemMessage(hwndDlg, IDC_CHEAT_LIST_POSSIBILITIES, LVM_GETCOUNTPERPAGE, 0, 0);
@ -395,6 +398,7 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
break;
case WM_QUIT:
case WM_CLOSE:
DestroyWindow(hCheatTip);
if (CheatStyle)
DestroyWindow(hwndDlg);
else
@ -463,7 +467,7 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
break;
case WM_COMMAND:
{
static int editMode = 0;
static int editMode = -1;
switch (HIWORD(wParam))
{
@ -741,12 +745,13 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
}
break;
case IDC_CHEAT_AUTOLOADSAVE:
{
switch (IsDlgButtonChecked(hwndDlg, IDC_CHEAT_AUTOLOADSAVE))
{
case BST_CHECKED: disableAutoLSCheats = 0; break;
case BST_INDETERMINATE: disableAutoLSCheats = 1; break;
case BST_UNCHECKED:
if(MessageBox(hwndDlg, "If this option is unchecked, you must manually save the cheats by yourself, or all the changed you made to the cheat list would be discarded silently without any asking once you close the game!\nDo you really want to do it in this way?", "Cheat warning", MB_YESNO | MB_ICONWARNING) == IDYES)
if(MessageBox(hwndDlg, "If this option is unchecked, you must manually save the cheats by yourself, or all the changes you made to the cheat list would be discarded silently without any asking once you close the game!\nDo you really want to do it in this way?", "Cheat warning", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2) == IDYES)
disableAutoLSCheats = 2;
else
{
@ -754,6 +759,8 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
CheckDlgButton(hwndDlg, IDC_CHEAT_AUTOLOADSAVE, BST_CHECKED);
}
}
SetCheatToolTip(hwndDlg, IDC_CHEAT_AUTOLOADSAVE);
}
}
break;
case EN_SETFOCUS:
@ -764,6 +771,18 @@ INT_PTR CALLBACK CheatConsoleCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA
case IDC_CHEAT_COM: editMode = 0; break;
case IDC_CHEAT_TEXT: editMode = 1; break;
case IDC_CHEAT_GAME_GENIE_TEXT: editMode = 2; break;
default: editMode = -1;
}
break;
case EN_KILLFOCUS:
switch (LOWORD(wParam))
{
case IDC_CHEAT_ADDR:
case IDC_CHEAT_VAL:
case IDC_CHEAT_COM:
case IDC_CHEAT_TEXT:
case IDC_CHEAT_GAME_GENIE_TEXT:
default: editMode = -1; break;
}
break;
case EN_UPDATE:
@ -1046,8 +1065,6 @@ void UpdateCheatsAdded()
INT_PTR CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// int i;
extern void GetUIGGInfo(HWND hwndDlg, uint32* a, uint8* v, int* c);
switch(uMsg) {
case WM_MOVE: {
@ -1227,7 +1244,6 @@ void ListGGAddresses(HWND hwndDlg)
SendDlgItemMessage(hwndDlg, IDC_LIST_GGADDRESSES, LB_RESETCONTENT,0,0);
uint32 a = -1; uint8 v = -1; int c = -1;
extern void GetUIGGInfo(HWND hwnd, uint32* a, uint8* v, int* c);
GetUIGGInfo(hwndDlg, &a, &v, &c);
// also enable/disable the add GG button here
@ -1310,6 +1326,50 @@ inline void GetCheatCodeStr(char* buf, int a, int v, int c)
sprintf(buf, "%04X?%02X:%02X", a, c, v);
}
static void SetCheatToolTip(HWND hwndDlg, UINT id)
{
TOOLINFO info;
memset(&info, 0, sizeof(TOOLINFO));
info.cbSize = sizeof(TOOLINFO);
info.uFlags = TTF_SUBCLASS | TTF_IDISHWND;
info.hwnd = hwndDlg;
info.lpszText = GetCheatToolTipStr(hwndDlg, id);
info.uId = (UINT_PTR)GetDlgItem(hwndDlg, id);
if (hCheatTip)
SendMessage(hCheatTip, TTM_UPDATETIPTEXT, 0, (LPARAM)&info);
else
{
if (hCheatTip = CreateWindow(TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndDlg, NULL, fceu_hInstance, NULL)) {
SendMessage(hCheatTip, TTM_ADDTOOL, 0, (LPARAM)&info);
SendMessage(hCheatTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, 30000);
SendMessage(hCheatTip, TTM_SETMAXTIPWIDTH, 0, 8000);
}
}
}
char* GetCheatToolTipStr(HWND hwndDlg, UINT id)
{
switch (id)
{
case IDC_CHEAT_AUTOLOADSAVE:
switch (disableAutoLSCheats)
{
case 0: return "Automatically load/save cheat file along with the game.";
case 1: return
"Don't add cheat on game load, but prompt for saving on game closes.\r\n"
"You must manually import cht file when it's needed.";
case 2: return
"Don't add cheat on game load, and don't save cheat on game closes.\r\n"
"You must manually import/export cht file by yourself,\nor all your changes to cheat will be lost!";
default:
return "Mysterious undocumented state.";
}
}
return NULL;
}
void GetUICheatInfo(HWND hwndDlg, char* name, uint32* a, uint8* v, int* c)
{
char buf[16];
@ -1356,24 +1416,22 @@ void UpdateCheatRelatedWindow()
// ram search
extern HWND RamSearchHWnd;
if (RamSearchHWnd)
{
// if ram search is open then update the ram list.
SendDlgItemMessage(RamSearchHWnd, IDC_RAMLIST, LVM_REDRAWITEMS,
SendDlgItemMessage(RamSearchHWnd, IDC_RAMLIST, LVM_GETTOPINDEX, 0, 0),
SendDlgItemMessage(RamSearchHWnd, IDC_RAMLIST, LVM_GETTOPINDEX, 0, 0) +
SendDlgItemMessage(RamSearchHWnd, IDC_RAMLIST, LVM_GETCOUNTPERPAGE, 0, 0) + 1);
}
// ram watch
extern void UpdateWatchCheats();
UpdateWatchCheats();
extern HWND RamWatchHWnd;
if (RamWatchHWnd)
{
// if ram watch is open then update the ram list.
SendDlgItemMessage(RamWatchHWnd, IDC_WATCHLIST, LVM_REDRAWITEMS,
SendDlgItemMessage(RamWatchHWnd, IDC_WATCHLIST, LVM_GETTOPINDEX, 0, 0),
SendDlgItemMessage(RamSearchHWnd, IDC_RAMLIST, LVM_GETTOPINDEX, 0, 0) +
SendDlgItemMessage(RamWatchHWnd, IDC_WATCHLIST, LVM_GETCOUNTPERPAGE, 0, 0) + 1);
}
}
@ -1484,3 +1542,19 @@ void DeleteCheatFont()
hNewFont = NULL;
}
}
void CreateCheatMap()
{
if (!CheatMapUsers)
FCEUI_CreateCheatMap();
++CheatMapUsers;
}
void ReleaseCheatMap()
{
--CheatMapUsers;
// printf("CheatMapUsers: %d\n", CheatMapUsers);
if (!CheatMapUsers)
FCEUI_ReleaseCheatMap();
}

View File

@ -19,11 +19,13 @@ void UpdateCheatListGroupBoxUI();
void UpdateCheatsAdded();
void ToggleCheatInputMode(HWND hwndDlg, int modeId);
void GetUICheatInfo(HWND hwndDlg, char* name, uint32* a, uint8* v, int* c);
void GetUIGGInfo(HWND hwndDlg, uint32* a, uint8* v, int* c);
inline void GetCheatStr(char* buf, int a, int v, int c);
inline void GetCheatCodeStr(char* buf, int a, int v, int c);
static void SetCheatToolTip(HWND hwndDlg, UINT id);
char* GetCheatToolTipStr(HWND hwndDlg, UINT id);
extern unsigned int FrozenAddressCount;
extern std::vector<uint16> FrozenAddresses;
//void ConfigAddCheat(HWND wnd); //bbit edited:commented out this line
extern struct CHEATF* cheats;
extern char* GameGenieLetters;
@ -38,6 +40,10 @@ void SetupCheatFont(HWND hDlg);
void DeleteCheatFont();
extern POINT CalcSubWindowPos(HWND hDlg, POINT* conf);
void CreateCheatMap();
void ReleaseCheatMap();
extern int CheatMapUsers;
extern INT_PTR CALLBACK GGConvCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern LRESULT APIENTRY FilterEditCtrlProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP);
extern WNDPROC DefaultEditCtrlProc;

View File

@ -371,13 +371,13 @@ INT_PTR CALLBACK AddbpCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
break;
}
if ((tmp=AddBreak(hwndDlg)) == TOO_MANY_BREAKPOINTS) {
MessageBox(hwndDlg, "Too many breakpoints, please delete one and try again", "Breakpoint Error", MB_OK);
MessageBox(hwndDlg, "Too many breakpoints, please delete one and try again", "Breakpoint Error", MB_OK | MB_ICONERROR);
goto endaddbrk;
}
if (tmp == 2) goto endaddbrk;
else if (tmp == INVALID_BREAKPOINT_CONDITION)
{
MessageBox(hwndDlg, "Invalid breakpoint condition", "Error", MB_OK);
MessageBox(hwndDlg, "Invalid breakpoint condition", "Error", MB_OK | MB_ICONERROR);
break;
}
EndDialog(hwndDlg,1);
@ -1296,7 +1296,7 @@ INT_PTR CALLBACK AssemblerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
saved = 1;
applied = 0;
}
else MessageBox(hwndDlg, "Unable to save changes to file", "Error saving to file", MB_OK);
else MessageBox(hwndDlg, "Unable to save changes to file", "Error saving to file", MB_OK | MB_ICONERROR);
}
}
break;
@ -1335,7 +1335,7 @@ INT_PTR CALLBACK AssemblerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM l
count += opsize[patchdata[i][0]];
}
if (count > 0x10000) { //note: don't use 0xFFFF!
MessageBox(hwndDlg, "Patch data cannot exceed address 0xFFFF", "Address error", MB_OK);
MessageBox(hwndDlg, "Patch data cannot exceed address 0xFFFF", "Address error", MB_OK | MB_ICONERROR);
break;
}
SetDlgItemText(hwndDlg,IDC_ASSEMBLER_HISTORY,"");
@ -1400,11 +1400,11 @@ INT_PTR CALLBACK PatcherCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
else
iapoffset = GetNesFileAddress(GetEditHex(hwndDlg,IDC_ROMPATCHER_OFFSET));
if((iapoffset < 16) && (iapoffset != -1)){
MessageBox(hDebug, "Sorry, iNes Header editing isn't supported", "Error", MB_OK);
MessageBox(hDebug, "Sorry, iNES Header editing isn't supported by this tool. If you want to edit the header, please use iNES Header Editor", "Error", MB_OK | MB_ICONASTERISK);
iapoffset = -1;
}
if((iapoffset > PRGsize[0]) && (iapoffset != -1)){
MessageBox(hDebug, "Error: .Nes offset outside of PRG rom", "Error", MB_OK);
MessageBox(hDebug, "Error: .Nes offset outside of PRG rom", "Error", MB_OK | MB_ICONERROR);
iapoffset = -1;
}
UpdatePatcher(hwndDlg);
@ -1421,7 +1421,7 @@ INT_PTR CALLBACK PatcherCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
break;
case IDC_ROMPATCHER_BTN_SAVE:
if (!iNesSave())
MessageBox(NULL, "Error Saving", "Error", MB_OK);
MessageBox(NULL, "Error Saving", "Error", MB_OK | MB_ICONERROR);
break;
}
break;
@ -2450,7 +2450,7 @@ void DoPatcher(int address, HWND hParent)
if (GameInterface == iNESGI)
DialogBox(fceu_hInstance, "ROMPATCHER", hParent, PatcherCallB);
else
MessageBox(hDebug, "Sorry, The Patcher only works on INES rom images", "Error", MB_OK);
MessageBox(hDebug, "Sorry, The Patcher only works on INES rom images", "Error", MB_OK | MB_ICONASTERISK);
UpdateDebugger(false);
}

View File

@ -27,7 +27,7 @@ void CloseDirectoriesDialog(HWND hwndDlg)
for(unsigned int curr_dir = 0; curr_dir < NUMBER_OF_DIRECTORIES; curr_dir++)
{
LONG len;
len = SendDlgItemMessage(hwndDlg, EDIT_ROMS + curr_dir, WM_GETTEXTLENGTH, 0, 0);
len = SendDlgItemMessage(hwndDlg, edit_id[curr_dir], WM_GETTEXTLENGTH, 0, 0);
if(len <= 0)
{
@ -47,7 +47,7 @@ void CloseDirectoriesDialog(HWND hwndDlg)
continue;
}
if(!GetDlgItemText(hwndDlg, EDIT_ROMS + curr_dir, directory_names[curr_dir], len))
if(!GetDlgItemText(hwndDlg, edit_id[curr_dir], directory_names[curr_dir], len))
{
free(directory_names[curr_dir]);
directory_names[curr_dir] = 0;
@ -98,7 +98,7 @@ static INT_PTR CALLBACK DirConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR
// Initialize the directories textboxes
for(unsigned int curr_dir = 0; curr_dir < NUMBER_OF_DIRECTORIES; curr_dir++)
{
SetDlgItemText(hwndDlg, EDIT_ROMS + curr_dir, directory_names[curr_dir]);
SetDlgItemText(hwndDlg, edit_id[curr_dir], directory_names[curr_dir]);
}
// Check the screenshot naming checkbox if necessary
@ -119,48 +119,54 @@ static INT_PTR CALLBACK DirConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR
break;
case WM_COMMAND:
if( !(wParam >> 16) )
switch (HIWORD(wParam))
{
if( (wParam & 0xFFFF) >= BUTTON_ROMS && (wParam & 0xFFFF) <= BUTTON_ROMS + NUMBER_OF_DIRECTORIES)
{
// If a directory selection button was pressed, ask the
// user for a directory.
static char *helpert[14] = {
"Roms",
"Battery Saves",
"Save States",
"FDS Bios Rom",
"Screenshots",
"Cheats",
"Movies",
"Memory Watch",
"Basic Bot",
"Macro files",
"Input Presets",
"Lua Scripts",
"Avi Directory",
"Base Directory",
};
char name[MAX_PATH];
char path[MAX_PATH];
GetDlgItemText(hwndDlg, EDIT_ROMS + ((wParam & 0xFFFF) - BUTTON_ROMS), path, MAX_PATH);
if(BrowseForFolder(hwndDlg, helpert[ ( (wParam & 0xFFFF) - BUTTON_ROMS)], name, path))
case BN_CLICKED:
switch(LOWORD(wParam))
{
SetDlgItemText(hwndDlg, EDIT_ROMS + ((wParam & 0xFFFF) - BUTTON_ROMS), name);
case CLOSE_BUTTON:
CloseDirectoriesDialog(hwndDlg);
break;
case BTN_CANCEL:
EndDialog(hwndDlg, 0);
break;
default:
static char *helpert[14] = {
"Roms",
"Battery Saves",
"Save States",
"FDS Bios Rom",
"Screenshots",
"Cheats",
"Movies",
"Memory Watch",
"Basic Bot",
"Macro files",
"Input Presets",
"Lua Scripts",
"Avi output",
"Base",
};
for (int i = 0; i < NUMBER_OF_DIRECTORIES; ++i)
{
if (browse_btn_id[i] == LOWORD(wParam))
{
// If a directory selection button was pressed, ask the
// user for a directory.
char name[MAX_PATH];
char path[MAX_PATH];
char caption[256];
GetDlgItemText(hwndDlg, edit_id[i], path, MAX_PATH);
sprintf(caption, "Select a directory for %s.", helpert[i]);
if (BrowseForFolder(hwndDlg, caption, name, path))
SetDlgItemText(hwndDlg, edit_id[i], name);
break;
}
}
}
}
else switch(wParam & 0xFFFF)
{
case CLOSE_BUTTON:
CloseDirectoriesDialog(hwndDlg);
break;
case BTN_CANCEL:
EndDialog(hwndDlg, 0);
break;
}
}
}

View File

@ -985,8 +985,11 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header)
sprintf(buf, "PRG 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_PRGROM_COMBO, buf2);
SetFocus(GetDlgItem(hwnd, IDC_PRGROM_COMBO));
return false;
else
{
SetFocus(GetDlgItem(hwnd, IDC_PRGROM_COMBO));
return false;
}
}
}
else {
@ -1154,8 +1157,11 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header)
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);
SetFocus(GetDlgItem(hwnd, IDC_CHRROM_COMBO));
return false;
else
{
SetFocus(GetDlgItem(hwnd, IDC_CHRROM_COMBO));
return false;
}
}
}
else {
@ -1344,14 +1350,14 @@ bool WriteHeaderData(HWND hwnd, iNES_HEADER* header)
int misc_roms = 0;
if (sscanf(buf, "%d", &misc_roms) < 1)
{
MessageBox(hwnd, "Invalid miscellanous ROM(s) count. If you don't know what value should be, we recommend to set it to 0.", "ERROR", MB_OK | MB_ICONERROR);
SetFocus(GetDlgItem(hwnd, IDC_MISCELLANEOUS_ROMS_TEXT));
MessageBox(hwnd, "Invalid miscellanous ROM(s) count. If you don't know what value should be, we recommend to set it to 0.", "Error", MB_OK | MB_ICONERROR);
SetFocus(GetDlgItem(hwnd, IDC_MISCELLANEOUS_ROMS_EDIT));
return false;
}
if (misc_roms > 3)
{
MessageBox(hwnd, "Miscellanous ROM(s) count has exceeded the limit of iNES 2.0 (3)", "Error", MB_OK | MB_ICONERROR);
SetFocus(GetDlgItem(hwnd, IDC_MISCELLANEOUS_ROMS_TEXT));
SetFocus(GetDlgItem(hwnd, IDC_MISCELLANEOUS_ROMS_EDIT));
return false;
}
_header.reserved[0] |= misc_roms & 3;

View File

@ -161,8 +161,10 @@ int PauseAfterLoad;
unsigned int skippy = 0; //Frame skip
int frameSkipCounter = 0; //Counter for managing frame skip
// Contains the names of the overridden standard directories
// in the order roms, nonvol, states, fdsrom, snaps, cheats, movies, memwatch, macro, input presets, lua scripts, base
// in the order roms, nonvol, states, fdsrom, snaps, cheats, movies, memwatch, basic bot, macro, input presets, lua scripts, avi, base
char *directory_names[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int edit_id[14] = { EDIT_ROM, EDIT_BATTERY, EDIT_STATE, EDIT_FDSBIOS, EDIT_SCREENSHOT, EDIT_CHEAT, EDIT_MOVIE, EDIT_MEMWATCH, EDIT_BOT, EDIT_MACRO, EDIT_PRESET, EDIT_LUA, EDIT_AVI, EDIT_ROOT };
int browse_btn_id[14] = {BUTTON_ROM, BUTTON_BATTERY, BUTTON_STATE, BUTTON_FDSBIOS, BUTTON_SCREENSHOT, BUTTON_CHEAT, BUTTON_MOVIE, BUTTON_MEMWATCH, BUTTON_BOT, BUTTON_MACRO, BUTTON_PRESET, BUTTON_LUA, BUTTON_AVI, BUTTON_ROOT };
std::string cfgFile = "fceux.cfg";
//Handle of the main window.
HWND hAppWnd = 0;

View File

@ -64,6 +64,8 @@ extern int AutoFireOffset;
extern int vmod;
extern char* directory_names[14];
extern int edit_id[14];
extern int browse_btn_id[14];
char *GetRomName(bool force = false); //Checks if rom is loaded, if so, outputs the Rom name with no directory path or file extension
char *GetRomPath(bool force = false); //Checks if rom is loaded, if so, outputs the Rom path only

View File

@ -669,37 +669,30 @@ void UpdateCaption()
int GetMemViewData(uint32 i)
{
if (EditingMode == MODE_NES_MEMORY)
return GetMem(i);
if (EditingMode == MODE_NES_PPU)
switch (EditingMode)
{
i &= 0x3FFF;
if(i < 0x2000)return VPage[(i)>>10][(i)];
//NSF PPU Viewer crash here (UGETAB) (Also disabled by 'MaxSize = 0x2000')
if (GameInfo->type==GIT_NSF)
{
return (0);
}
else
{
if(i < 0x3F00)
return vnapage[(i >> 10) & 0x3][i & 0x3FF];
return READPAL_MOTHEROFALL(i & 0x1F);
}
}
if (EditingMode == MODE_NES_OAM)
{
return SPRAM[i & 0xFF];
}
if (EditingMode == MODE_NES_FILE)
{
//todo: use getfiledata() here
if(i < 16) return *((unsigned char *)&head+i);
if(i < 16+PRGsize[0])return PRGptr[0][i-16];
if(i < 16+PRGsize[0]+CHRsize[0])return CHRptr[0][i-16-PRGsize[0]];
case MODE_NES_MEMORY:
return GetMem(i);
case MODE_NES_PPU:
i &= 0x3FFF;
if (i < 0x2000)return VPage[(i) >> 10][(i)];
//NSF PPU Viewer crash here (UGETAB) (Also disabled by 'MaxSize = 0x2000')
if (GameInfo->type == GIT_NSF)
return (0);
else
{
if (i < 0x3F00)
return vnapage[(i >> 10) & 0x3][i & 0x3FF];
return READPAL_MOTHEROFALL(i & 0x1F);
}
break;
case MODE_NES_OAM:
return SPRAM[i & 0xFF];
case MODE_NES_FILE:
//todo: use getfiledata() here
if (i < 16) return *((unsigned char *)&head + i);
if (i < 16 + PRGsize[0])return PRGptr[0][i - 16];
if (i < 16 + PRGsize[0] + CHRsize[0])return CHRptr[0][i - 16 - PRGsize[0]];
}
return 0;
}
@ -729,89 +722,88 @@ void UpdateColorTable()
TextColorList[hexBookmarks[j].address - CurOffset] = RGB(0,0xCC,0); // Green for Bookmarks
}
//mbg merge 6/29/06 - added argument
if (EditingMode == MODE_NES_MEMORY)
FCEUI_ListCheats(UpdateCheatColorCallB, 0);
if(EditingMode == MODE_NES_FILE)
switch (EditingMode)
{
if (cdloggerdataSize)
{
for (i = 0; i < DataAmount; i++)
case MODE_NES_MEMORY:
for (uint32 a = CurOffset; a < CurOffset + DataAmount; ++a)
if (FCEUI_FindCheatMapByte(a))
TextColorList[a - CurOffset] = RGB(HexFreezeColorR, HexFreezeColorG, HexFreezeColorB);
break;
case MODE_NES_FILE:
if (cdloggerdataSize)
{
temp_offset = CurOffset + i - 16; // (minus iNES header)
if (temp_offset >= 0)
for (i = 0; i < DataAmount; i++)
{
if ((unsigned int)temp_offset < cdloggerdataSize)
temp_offset = CurOffset + i - 16; // (minus iNES header)
if (temp_offset >= 0)
{
// PRG
if ((cdloggerdata[temp_offset] & 3) == 3)
if ((unsigned int)temp_offset < cdloggerdataSize)
{
// the byte is both Code and Data - green
TextColorList[i]=RGB(0,190,0);
} else if((cdloggerdata[temp_offset] & 3) == 1)
{
// the byte is Code - dark-yellow
TextColorList[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);
else
// non-PCM data - blue
TextColorList[i]=RGB(0,0,210);
// PRG
if ((cdloggerdata[temp_offset] & 3) == 3)
{
// the byte is both Code and Data - green
TextColorList[i] = RGB(0, 190, 0);
}
else if ((cdloggerdata[temp_offset] & 3) == 1)
{
// the byte is Code - dark-yellow
TextColorList[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);
else
// non-PCM data - blue
TextColorList[i] = RGB(0, 0, 210);
}
}
} else
{
temp_offset -= cdloggerdataSize;
if (((unsigned int)temp_offset < cdloggerVideoDataSize))
else
{
// CHR
if ((cdloggervdata[temp_offset] & 3) == 3)
temp_offset -= cdloggerdataSize;
if (((unsigned int)temp_offset < cdloggerVideoDataSize))
{
// the byte was both rendered and read programmatically - light-green
TextColorList[i]=RGB(5,255,5);
} else if ((cdloggervdata[temp_offset] & 3) == 1)
{
// the byte was rendered - yellow
TextColorList[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);
// CHR
if ((cdloggervdata[temp_offset] & 3) == 3)
{
// the byte was both rendered and read programmatically - light-green
TextColorList[i] = RGB(5, 255, 5);
}
else if ((cdloggervdata[temp_offset] & 3) == 1)
{
// the byte was rendered - yellow
TextColorList[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);
}
}
}
}
}
}
}
tmp = undo_list;
while(tmp!= 0)
{
//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);
tmp = undo_list;
while (tmp != 0)
{
//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);
}
tmp = tmp->last;
}
tmp=tmp->last;
}
break;
}
UpdateMemoryView(1); //anytime the colors change, the memory viewer needs to be completely redrawn
}
//mbg merge 6/29/06 - added argument
int UpdateCheatColorCallB(char *name, uint32 a, uint8 v, int compare,int s,int type, void *data) {
if((a >= (uint32)CurOffset) && (a < (uint32)CurOffset+DataAmount)){
if(s)TextColorList[a-CurOffset] = RGB(HexFreezeColorR,HexFreezeColorG,HexFreezeColorB);
}
return 1;
}
int addrtodelete; // This is a very ugly hackish method of doing this
int cheatwasdeleted; // but it works and that is all that matters here.
int DeleteCheatCallB(char *name, uint32 a, uint8 v, int compare,int s,int type, void *data){ //mbg merge 6/29/06 - added arg
@ -1001,29 +993,30 @@ void InputData(char *input){
if (addr >= MaxSize) continue;
if (EditingMode == MODE_NES_MEMORY)
switch(EditingMode)
{
// RAM (system bus)
BWrite[addr](addr,data[i]);
} else if (EditingMode == MODE_NES_PPU)
{
// PPU
addr &= 0x3FFF;
if(addr < 0x2000)
VPage[addr>>10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
if((addr >= 0x2000) && (addr < 0x3F00))
vnapage[(addr>>10)&0x3][addr&0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
if((addr >= 0x3F00) && (addr < 0x3FFF))
PalettePoke(addr,data[i]);
} else if (EditingMode == MODE_NES_OAM)
{
addr &= 0xFF;
SPRAM[addr] = data[i];
} else if (EditingMode == MODE_NES_FILE)
{
// ROM
ApplyPatch(addr,datasize,data);
break;
case MODE_NES_MEMORY:
// RAM (system bus)
BWrite[addr](addr, data[i]);
break;
case MODE_NES_PPU:
// PPU
addr &= 0x3FFF;
if (addr < 0x2000)
VPage[addr >> 10][addr] = data[i]; //todo: detect if this is vrom and turn it red if so
if ((addr >= 0x2000) && (addr < 0x3F00))
vnapage[(addr >> 10) & 0x3][addr & 0x3FF] = data[i]; //todo: this causes 0x3000-0x3f00 to mirror 0x2000-0x2f00, is this correct?
if ((addr >= 0x3F00) && (addr < 0x3FFF))
PalettePoke(addr, data[i]);
break;
case MODE_NES_OAM:
addr &= 0xFF;
SPRAM[addr] = data[i];
break;
case MODE_NES_FILE:
// ROM
ApplyPatch(addr, datasize, data);
break;
}
}
CursorStartAddy+=datasize;
@ -1194,6 +1187,8 @@ void KillMemView()
UnregisterClass("MEMVIEW",fceu_hInstance);
hMemView = 0;
hMemFind = 0;
if (EditingMode == MODE_NES_MEMORY)
ReleaseCheatMap();
return;
}
@ -1252,6 +1247,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
resetHighlightingActivityLog();
EditingText = CurOffset = 0;
EditingMode = MODE_NES_MEMORY;
CreateCheatMap();
//set the default table
UnloadTableFile();
@ -1685,8 +1681,10 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
checkCondition(condition, numWPs);
numWPs++;
{ extern int myNumWPs;
myNumWPs++; }
{
extern int myNumWPs;
myNumWPs++;
}
if (hDebug)
AddBreakList();
else
@ -2034,24 +2032,34 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case MENU_MV_VIEW_PPU:
case MENU_MV_VIEW_OAM:
case MENU_MV_VIEW_ROM:
EditingMode = wParam - MENU_MV_VIEW_RAM;
{
int _EditingMode = wParam - MENU_MV_VIEW_RAM;
// Leave NES Memory
if (_EditingMode == MODE_NES_MEMORY && EditingMode != MODE_NES_MEMORY)
CreateCheatMap();
// Enter NES Memory
if (_EditingMode != MODE_NES_MEMORY && EditingMode == MODE_NES_MEMORY)
ReleaseCheatMap();
EditingMode = _EditingMode;
for (i = MODE_NES_MEMORY; i <= MODE_NES_FILE; i++)
if(EditingMode == i)
{
CheckMenuRadioItem(GetMenu(hMemView), MENU_MV_VIEW_RAM, MENU_MV_VIEW_ROM, MENU_MV_VIEW_RAM + i, MF_BYCOMMAND);
break;
}
if (EditingMode == MODE_NES_MEMORY)
MaxSize = 0x10000;
if (EditingMode == MODE_NES_PPU)
switch (EditingMode)
{
if (GameInfo->type==GIT_NSF) {MaxSize = 0x2000;} //Also disabled under GetMemViewData
else {MaxSize = 0x4000;}
case MODE_NES_MEMORY:
MaxSize = 0x10000; break;
case MODE_NES_PPU:
MaxSize = (GameInfo->type == GIT_NSF ? 0x2000 : 0x4000); break;
case MODE_NES_OAM:
MaxSize = 0x100; break;
case MODE_NES_FILE: //todo: add trainer size
MaxSize = 16 + CHRsize[0] + PRGsize[0]; break;
}
if (EditingMode == MODE_NES_OAM)
MaxSize = 0x100;
if (EditingMode == MODE_NES_FILE)
MaxSize = 16+CHRsize[0]+PRGsize[0]; //todo: add trainer size
if (CurOffset >= MaxSize - DataAmount) CurOffset = MaxSize - DataAmount;
if (CurOffset < 0) CurOffset = 0;
if(CursorEndAddy >= MaxSize) CursorEndAddy = -1;
@ -2070,7 +2078,7 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
UpdateColorTable();
UpdateCaption();
return 0;
}
case ID_HIGHLIGHTING_HIGHLIGHT_ACTIVITY:
{
MemView_HighlightActivity ^= 1;

View File

@ -315,17 +315,13 @@ void UpdateMemWatch()
MWRec& mwrec = mwrecs[i];
//Display blue if address is frozen
if (FrozenAddressCount && FrozenAddresses.size())
{
if (FrozenAddressCount)
for (unsigned int x = 0; x < FrozenAddressCount; x++)
{
if (mwrec.addr == FrozenAddresses[x])
{
//SetTextColor(hdc,RGB(0,0,255));
extern int FCEUI_FindCheatMapByte(uint16);
if (FCEUI_FindCheatMapByte(mwrec.addr))
SetTextColor(hdc,GetSysColor(COLOR_HIGHLIGHT));
}
}
}
char* text;
if(mwrec.valid && GameInfo)
@ -816,6 +812,8 @@ static INT_PTR CALLBACK MemWatchCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
editlast[x]= 0;
}
CreateCheatMap();
RamChangeInitialize = true;
break;
@ -834,7 +832,9 @@ static INT_PTR CALLBACK MemWatchCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
case WM_QUIT:
CloseMemoryWatch();
break;
case WM_DESTROY:
ReleaseCheatMap();
break;
case WM_DROPFILES:
{
unsigned int len;

View File

@ -39,6 +39,7 @@
#include <commctrl.h>
#include <list>
#include <vector>
#ifdef WIN32
#include "BaseTsd.h"
typedef INT_PTR intptr_t;
@ -641,6 +642,18 @@ unsigned int HardwareAddressToItemIndex(HWAddressType hardwareAddress)
: functionName<char, type>(p0, p1, p2, p3)) \
: functionName<char, type>(p0, p1, p2, p3))
#define CONV_VAL_TO_STR(sizeTypeID, type, val, buf) (sprintf(buf, type == 's' ? "%d" : type == 'u' ? "%u" : type == 'd' ? "%08X" : type == 'w' ? "%04X" : "%02X", sizeTypeID == 'd' ? (type == 's' ? (long)(val & 0xFFFFFFFF) : (unsigned long)(val & 0xFFFFFFFF)) : sizeTypeID == 'w' ? (type == 's' ? (short)(val & 0xFFFF) : (unsigned short)(val & 0xFFFF)) : (type == 's' ? (char)(val & 0xFF) : (unsigned char)(val & 0xFF))), buf)
#define ConvEditTextNum(hDlg, id, sizeTypeID, type) \
{ \
BOOL success = FALSE; \
int val = ReadControlInt(id, type == 'h', success); \
if (success) \
{ \
char num[11]; \
SetDlgItemText(hDlg, id, CONV_VAL_TO_STR(sizeTypeID, type, val, num)); \
} else SetDlgItemText(hDlg, id, ""); \
}
// basic comparison functions:
template <typename T> inline bool LessCmp (T x, T y, T i) { return x < y; }
template <typename T> inline bool MoreCmp (T x, T y, T i) { return x > y; }
@ -1250,20 +1263,20 @@ LRESULT CustomDraw (LPARAM lParam)
int rv = CDRF_DODEFAULT;
int cheat = CALL_WITH_T_SIZE_TYPES_1(GetNumCheatsFromIndex, rs_type_size, rs_t == 's', noMisalign, lplvcd->nmcd.dwItemSpec);
switch (cheat) {
default:
case 0:
if (lplvcd->nmcd.dwItemSpec % 2)
lplvcd->clrTextBk = RGB(248, 248, 255);
break;
case 1:
lplvcd->clrTextBk = RGB(216, 203, 253); break;
case 2:
lplvcd->clrTextBk = RGB(195, 186, 253); break;
case 3:
lplvcd->clrTextBk = RGB(176, 139, 252); break;
case 4:
lplvcd->clrTextBk = RGB(175, 94, 253);
lplvcd->clrText = RGB(255, 255, 255); break; // use a more visual color in dark background
default:
case 0:
if (lplvcd->nmcd.dwItemSpec % 2)
lplvcd->clrTextBk = RGB(248, 248, 255);
break;
case 1:
lplvcd->clrTextBk = CHEAT_1BYTE_BG; break;
case 2:
lplvcd->clrTextBk = CHEAT_2BYTE_BG; break;
case 3:
lplvcd->clrTextBk = CHEAT_3BYTE_BG; break;
case 4:
lplvcd->clrTextBk = CHEAT_4BYTE_BG;
lplvcd->clrText = CHEAT_4BYTE_TEXT; break; // use a more visual color in dark background
}
if(!IsSatisfied(lplvcd->nmcd.dwItemSpec))
@ -1401,11 +1414,14 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
static int watchIndex=0;
switch(uMsg)
{
case WM_INITDIALOG: {
case WM_INITDIALOG:
{
RamSearchHWnd = hDlg;
CalcSubWindowPos(hDlg, NULL);
CreateCheatMap();
switch(rs_o)
{
case '<':
@ -1435,6 +1451,7 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),true);
break;
}
switch (rs_c)
{
case 'r':
@ -1453,6 +1470,7 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPARECHANGES),true);
break;
}
switch (rs_t)
{
case 's':
@ -1465,6 +1483,7 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
SendDlgItemMessage(hDlg, IDC_HEX, BM_SETCHECK, BST_CHECKED, 0);
break;
}
switch (rs_type_size)
{
case 'b':
@ -1517,8 +1536,16 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
ListView_SetCallbackMask(GetDlgItem(hDlg,IDC_RAMLIST), LVIS_FOCUSED|LVIS_SELECTED);
SendDlgItemMessage(hDlg, IDC_EDIT_COMPAREADDRESS, EM_SETLIMITTEXT, 4, 0);
DefaultEditCtrlProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLongPtr(GetDlgItem(hDlg, IDC_EDIT_MODBY), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLongPtr(GetDlgItem(hDlg, IDC_EDIT_COMPAREVALUE), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowLongPtr(GetDlgItem(hDlg, IDC_EDIT_COMPAREADDRESS), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
return true;
} break;
}
break;
case WM_NOTIFY:
{
LPNMHDR lP = (LPNMHDR) lParam;
@ -1561,28 +1588,12 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
case 1:
{
int i = CALL_WITH_T_SIZE_TYPES_1(GetCurValueFromItemIndex, rs_type_size,rs_t=='s',noMisalign, iNum);
const char* formatString = ((rs_t=='s') ? "%d" : (rs_t=='u') ? "%u" : (rs_type_size=='d' ? "%08X" : rs_type_size=='w' ? "%04X" : "%02X"));
switch (rs_type_size)
{
case 'b':
default: sprintf(num, formatString, rs_t=='s' ? (char)(i&0xff) : (unsigned char)(i&0xff)); break;
case 'w': sprintf(num, formatString, rs_t=='s' ? (short)(i&0xffff) : (unsigned short)(i&0xffff)); break;
case 'd': sprintf(num, formatString, rs_t=='s' ? (long)(i&0xffffffff) : (unsigned long)(i&0xffffffff)); break;
}
Item->item.pszText = num;
Item->item.pszText = CONV_VAL_TO_STR(rs_type_size, rs_t, i, num);
} return true;
case 2:
{
int i = CALL_WITH_T_SIZE_TYPES_1(GetPrevValueFromItemIndex, rs_type_size,rs_t=='s',noMisalign, iNum);
const char* formatString = ((rs_t=='s') ? "%d" : (rs_t=='u') ? "%u" : (rs_type_size=='d' ? "%08X" : rs_type_size=='w' ? "%04X" : "%02X"));
switch (rs_type_size)
{
case 'b':
default: sprintf(num, formatString, rs_t=='s' ? (char)(i&0xff) : (unsigned char)(i&0xff)); break;
case 'w': sprintf(num, formatString, rs_t=='s' ? (short)(i&0xffff) : (unsigned short)(i&0xffff)); break;
case 'd': sprintf(num, formatString, rs_t=='s' ? (long)(i&0xffffffff) : (unsigned long)(i&0xffffffff)); break;
}
Item->item.pszText = num;
Item->item.pszText = CONV_VAL_TO_STR(rs_type_size, rs_t, i, num);
} return true;
case 3:
{
@ -1646,420 +1657,455 @@ INT_PTR CALLBACK RamSearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
// return 0;
//}
}
break;
}
break;
case WM_COMMAND:
{
int rv = false;
switch(LOWORD(wParam))
switch (HIWORD(wParam))
{
case IDC_SIGNED:
rs_t='s';
signal_new_size();
{rv = true; break;}
case IDC_UNSIGNED:
rs_t='u';
signal_new_size();
{rv = true; break;}
case IDC_HEX:
rs_t='h';
signal_new_size();
{rv = true; break;}
case IDC_1_BYTE:
rs_type_size = 'b';
signal_new_size();
{rv = true; break;}
case IDC_2_BYTES:
rs_type_size = 'w';
signal_new_size();
{rv = true; break;}
case IDC_4_BYTES:
rs_type_size = 'd';
signal_new_size();
{rv = true; break;}
case IDC_MISALIGN:
noMisalign = !noMisalign;
//CompactAddrs();
signal_new_size();
{rv = true; break;}
// case IDC_ENDIAN:
//// littleEndian = !littleEndian;
//// signal_new_size();
// {rv = true; break;}
case IDC_LESSTHAN:
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
rs_o = '<';
{rv = true; break;}
case IDC_MORETHAN:
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
rs_o = '>';
{rv = true; break;}
case IDC_NOMORETHAN:
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
rs_o = 'l';
{rv = true; break;}
case IDC_NOLESSTHAN:
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
rs_o = 'm';
{rv = true; break;}
case IDC_EQUALTO:
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
rs_o = '=';
{rv = true; break;}
case IDC_DIFFERENTFROM:
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
rs_o = '!';
{rv = true; break;}
case IDC_DIFFERENTBY:
case BN_CLICKED:
{
rs_o = 'd';
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),true);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),false);
if(!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_DIFFBY);
} {rv = true; break;}
case IDC_MODULO:
{
rs_o = '%';
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_DIFFBY),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_MODBY),true);
if(!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_MODBY);
} {rv = true; break;}
case IDC_PREVIOUSVALUE:
rs_c='r';
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREVALUE),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREADDRESS),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPARECHANGES),false);
{rv = true; break;}
case IDC_SPECIFICVALUE:
{
rs_c = 's';
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREVALUE),true);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREADDRESS),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPARECHANGES),false);
if(!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_COMPAREVALUE);
{rv = true; break;}
}
case IDC_SPECIFICADDRESS:
{
rs_c = 'a';
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREADDRESS),true);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREVALUE),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPARECHANGES),false);
if(!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_COMPAREADDRESS);
} {rv = true; break;}
case IDC_NUMBEROFCHANGES:
{
rs_c = 'n';
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPARECHANGES),true);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREVALUE),false);
EnableWindow(GetDlgItem(hDlg,IDC_EDIT_COMPAREADDRESS),false);
if(!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_COMPARECHANGES);
} {rv = true; break;}
case IDC_C_ADDCHEAT:
{
HWND ramListControl = GetDlgItem(hDlg,IDC_RAMLIST);
int watchItemIndex = ListView_GetNextItem(ramListControl, -1, LVNI_SELECTED);
while (watchItemIndex >= 0)
int rv = true;
bool needRefresh = true;
switch (LOWORD(wParam))
{
unsigned long address = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size,rs_t=='s',noMisalign, watchItemIndex);
unsigned long curvalue = CALL_WITH_T_SIZE_TYPES_1(GetCurValueFromItemIndex, rs_type_size,rs_t=='s',noMisalign, watchItemIndex);
int sizeType = -1;
if(rs_type_size == 'b')
sizeType = 0;
else if(rs_type_size == 'w')
sizeType = 1;
else if(rs_type_size == 'd')
sizeType = 2;
int numberType = -1;
if(rs_t == 's')
numberType = 0;
else if(rs_t == 'u')
numberType = 1;
else if(rs_t == 'h')
numberType = 2;
// Don't open cheat dialog
switch (sizeType) {
case 0:
FCEUI_AddCheat("",address,curvalue, -1, 1);
break;
case 1:
FCEUI_AddCheat("",address,curvalue & 0xFF, -1, 1);
FCEUI_AddCheat("",address + 1,(curvalue & 0xFF00) / 0x100, -1, 1);
break;
case 2:
FCEUI_AddCheat("",address,curvalue & 0xFF,-1,1);
FCEUI_AddCheat("",address + 1,(curvalue & 0xFF00) / 0x100, -1, 1);
FCEUI_AddCheat("",address + 2,(curvalue & 0xFF0000) / 0x10000, -1, 1);
FCEUI_AddCheat("",address + 3,(curvalue & 0xFF000000) / 0x1000000, -1, 1);
break;
}
UpdateCheatsAdded();
UpdateCheatRelatedWindow();
watchItemIndex = ListView_GetNextItem(ramListControl, watchItemIndex, LVNI_SELECTED);
}
} {rv = true; break;}
case IDC_C_SEARCHROM:
ShowROM = SendDlgItemMessage(hDlg, IDC_C_SEARCHROM, BM_GETCHECK, 0, 0) != 0;
case IDC_C_RESET:
{
RamSearchSaveUndoStateIfNotTooBig(RamSearchHWnd);
int prevNumItems = last_rs_possible;
soft_reset_address_info();
if(prevNumItems == last_rs_possible)
SetRamSearchUndoType(RamSearchHWnd, 0); // nothing to undo
ListView_SetItemState(GetDlgItem(hDlg,IDC_RAMLIST), -1, 0, LVIS_SELECTED); // deselect all
//ListView_SetItemCount(GetDlgItem(hDlg,IDC_RAMLIST),ResultCount);
ListView_SetSelectionMark(GetDlgItem(hDlg,IDC_RAMLIST), 0);
RefreshRamListSelectedCountControlStatus(hDlg);
Update_RAM_Search();
{rv = true; break;}
}
case IDC_C_RESET_CHANGES:
memset(s_numChanges, 0, (sizeof(*s_numChanges)*(MAX_RAM_SIZE)));
ListView_Update(GetDlgItem(hDlg,IDC_RAMLIST), -1);
Update_RAM_Search();
//SetRamSearchUndoType(hDlg, 0);
{rv = true; break;}
case IDC_C_UNDO:
if(s_undoType>0)
{
// Clear_Sound_Buffer();
EnterCriticalSection(&s_activeMemoryRegionsCS);
if(s_activeMemoryRegions.size() < tooManyRegionsForUndo)
case IDC_SIGNED:
{
MemoryList tempMemoryList = s_activeMemoryRegions;
s_activeMemoryRegions = s_activeMemoryRegionsBackup;
s_activeMemoryRegionsBackup = tempMemoryList;
LeaveCriticalSection(&s_activeMemoryRegionsCS);
SetRamSearchUndoType(hDlg, 3 - s_undoType);
rs_t = 's';
signal_new_size();
ConvEditTextNum(hDlg, IDC_EDIT_COMPAREVALUE, rs_type_size, rs_t);
ConvEditTextNum(hDlg, IDC_EDIT_DIFFBY, rs_type_size, rs_t);
ConvEditTextNum(hDlg, IDC_EDIT_MODBY, rs_type_size, rs_t);
}
else
break;
case IDC_UNSIGNED:
{
s_activeMemoryRegions = s_activeMemoryRegionsBackup;
LeaveCriticalSection(&s_activeMemoryRegionsCS);
SetRamSearchUndoType(hDlg, -1);
rs_t = 'u';
signal_new_size();
ConvEditTextNum(hDlg, IDC_EDIT_COMPAREVALUE, rs_type_size, rs_t);
ConvEditTextNum(hDlg, IDC_EDIT_DIFFBY, rs_type_size, rs_t);
ConvEditTextNum(hDlg, IDC_EDIT_MODBY, rs_type_size, rs_t);
}
CompactAddrs();
ListView_SetItemState(GetDlgItem(hDlg,IDC_RAMLIST), -1, 0, LVIS_SELECTED); // deselect all
ListView_SetSelectionMark(GetDlgItem(hDlg,IDC_RAMLIST), 0);
RefreshRamListSelectedCountControlStatus(hDlg);
}
{rv = true; break;}
case IDC_C_AUTOSEARCH:
AutoSearch = SendDlgItemMessage(hDlg, IDC_C_AUTOSEARCH, BM_GETCHECK, 0, 0) != 0;
AutoSearchAutoRetry = false;
if (!AutoSearch) {rv = true; break;}
case IDC_C_SEARCH:
{
// Clear_Sound_Buffer();
if(!rs_val_valid && !(rs_val_valid = Set_RS_Val()))
goto invalid_field;
if(ResultCount)
{
RamSearchSaveUndoStateIfNotTooBig(hDlg);
prune(rs_c,rs_o,rs_t=='s',rs_val,rs_param);
RefreshRamListSelectedCountControlStatus(hDlg);
}
if(!ResultCount)
{
MessageBox(RamSearchHWnd,"Resetting search.","Out of results.",MB_OK|MB_ICONINFORMATION);
soft_reset_address_info();
}
{rv = true; break;}
invalid_field:
MessageBox(RamSearchHWnd,"Invalid or out-of-bound entered value.","Error",MB_OK|MB_ICONSTOP);
if(AutoSearch) // stop autosearch if it just started
{
SendDlgItemMessage(hDlg, IDC_C_AUTOSEARCH, BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage(hDlg, WM_COMMAND, IDC_C_AUTOSEARCH, 0);
}
{rv = true; break;}
}
case IDC_C_HEXEDITOR:
{
HWND ramListControl = GetDlgItem(hDlg,IDC_RAMLIST);
int selCount = ListView_GetSelectedCount(ramListControl);
int watchItemIndex = ListView_GetNextItem(ramListControl, -1, LVNI_SELECTED);
if (watchItemIndex >= 0)
{
unsigned int addr = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size, rs_t=='s', noMisalign, watchItemIndex);
ChangeMemViewFocus(0, addr, -1);
}
break;
}
case IDC_C_WATCH:
{
HWND ramListControl = GetDlgItem(hDlg,IDC_RAMLIST);
int selCount = SendMessage(ramListControl, LVM_GETSELECTEDCOUNT, 0, 0);
if (selCount > 0)
{
AddressWatcher tempWatch;
tempWatch.Size = rs_type_size;
tempWatch.Type = rs_t;
tempWatch.WrongEndian = 0; //Replace when I get little endian working
tempWatch.comment = NULL;
bool inserted = false;
AddressWatcher* watches = (AddressWatcher*)malloc(selCount * sizeof(AddressWatcher));
int i = 0;
int watchItemIndex = -1;
while ((watchItemIndex = SendMessage(ramListControl, LVM_GETNEXTITEM, watchItemIndex, LVNI_SELECTED)) >= 0)
break;
case IDC_HEX:
{
tempWatch.Address = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size, rs_t == 's', noMisalign, watchItemIndex);
watches[i] = tempWatch;
++i;
rs_t = 'h';
signal_new_size();
ConvEditTextNum(hDlg, IDC_EDIT_COMPAREVALUE, rs_type_size, rs_t);
ConvEditTextNum(hDlg, IDC_EDIT_DIFFBY, rs_type_size, rs_t);
ConvEditTextNum(hDlg, IDC_EDIT_MODBY, rs_type_size, rs_t);
}
// bring up the ram watch window if it's not already showing so the user knows where the watch went
if ((selCount == 1 ?
InsertWatch(watches[0], hDlg) : InsertWatches(watches, hDlg, selCount))
&& !RamWatchHWnd)
SendMessage(hWnd, WM_COMMAND, ID_RAM_WATCH, 0);
SetForegroundWindow(RamSearchHWnd);
free(watches);
}
{rv = true; break;}
}
// eliminate all selected items
case IDC_C_ELIMINATE:
{
RamSearchSaveUndoStateIfNotTooBig(hDlg);
HWND ramListControl = GetDlgItem(hDlg,IDC_RAMLIST);
int size = (rs_type_size=='b' || !noMisalign) ? 1 : 2;
int selCount = ListView_GetSelectedCount(ramListControl);
int watchIndex = -1;
// time-saving trick #1:
// condense the selected items into an array of address ranges
std::vector<AddrRange> selHardwareAddrs;
for(int i = 0, j = 1024; i < selCount; ++i, --j)
{
watchIndex = ListView_GetNextItem(ramListControl, watchIndex, LVNI_SELECTED);
int addr = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size,rs_t=='s',noMisalign, watchIndex);
if(!selHardwareAddrs.empty() && addr == selHardwareAddrs.back().End())
selHardwareAddrs.back().size += size;
else
selHardwareAddrs.push_back(AddrRange(addr,size));
if(!j) UpdateRamSearchProgressBar(i * 50 / selCount), j = 1024;
}
// now deactivate the ranges
// time-saving trick #2:
// take advantage of the fact that the listbox items must be in the same order as the regions
MemoryList::iterator iter = s_activeMemoryRegions.begin();
int numHardwareAddrRanges = selHardwareAddrs.size();
for(int i = 0, j = 16; i < numHardwareAddrRanges; ++i, --j)
{
int addr = selHardwareAddrs[i].addr;
int size = selHardwareAddrs[i].size;
bool affected = false;
while(iter != s_activeMemoryRegions.end())
break;
case IDC_1_BYTE:
{
MemoryRegion& region = *iter;
int affNow = DeactivateRegion(region, iter, addr, size);
if(affNow)
affected = true;
else if(affected)
needRefresh = false;
rs_type_size = 'b';
signal_new_size();
BOOL success = FALSE;
int val = ReadControlInt(IDC_EDIT_COMPAREVALUE, false, success);
if (success)
{
char num[11];
SetDlgItemText(hDlg, IDC_EDIT_COMPAREVALUE, CONV_VAL_TO_STR(rs_type_size, rs_t, val, num));
}
}
break;
case IDC_2_BYTES:
needRefresh = false;
rs_type_size = 'w';
signal_new_size();
break;
case IDC_4_BYTES:
needRefresh = false;
rs_type_size = 'd';
signal_new_size();
break;
case IDC_MISALIGN:
needRefresh = false;
noMisalign = !noMisalign;
//CompactAddrs();
signal_new_size();
break;
// case IDC_ENDIAN:
// littleEndian = !littleEndian;
// signal_new_size();
// break;
case IDC_LESSTHAN:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
rs_o = '<';
break;
case IDC_MORETHAN:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
rs_o = '>';
break;
case IDC_NOMORETHAN:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
rs_o = 'l';
break;
case IDC_NOLESSTHAN:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
rs_o = 'm';
break;
case IDC_EQUALTO:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
rs_o = '=';
break;
case IDC_DIFFERENTFROM:
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
rs_o = '!';
break;
case IDC_DIFFERENTBY:
{
rs_o = 'd';
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), true);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), false);
if (!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_DIFFBY);
break;
}
case IDC_MODULO:
{
rs_o = '%';
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_DIFFBY), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_MODBY), true);
if (!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_MODBY);
break;
}
case IDC_PREVIOUSVALUE:
rs_c = 'r';
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREVALUE), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREADDRESS), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPARECHANGES), false);
break;
case IDC_SPECIFICVALUE:
{
rs_c = 's';
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREVALUE), true);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREADDRESS), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPARECHANGES), false);
if (!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_COMPAREVALUE);
break;
}
case IDC_SPECIFICADDRESS:
{
rs_c = 'a';
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREADDRESS), true);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREVALUE), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPARECHANGES), false);
if (!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_COMPAREADDRESS);
break;
}
case IDC_NUMBEROFCHANGES:
{
rs_c = 'n';
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPARECHANGES), true);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREVALUE), false);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREADDRESS), false);
if (!SelectingByKeyboard())
SelectEditControl(IDC_EDIT_COMPARECHANGES);
break;
}
case IDC_C_ADDCHEAT:
{
needRefresh = false;
HWND ramListControl = GetDlgItem(hDlg, IDC_RAMLIST);
int watchItemIndex = ListView_GetNextItem(ramListControl, -1, LVNI_SELECTED);
while (watchItemIndex >= 0)
{
unsigned long address = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size, rs_t == 's', noMisalign, watchItemIndex);
unsigned long curvalue = CALL_WITH_T_SIZE_TYPES_1(GetCurValueFromItemIndex, rs_type_size, rs_t == 's', noMisalign, watchItemIndex);
int sizeType = -1;
if (rs_type_size == 'b')
sizeType = 0;
else if (rs_type_size == 'w')
sizeType = 1;
else if (rs_type_size == 'd')
sizeType = 2;
int numberType = -1;
if (rs_t == 's')
numberType = 0;
else if (rs_t == 'u')
numberType = 1;
else if (rs_t == 'h')
numberType = 2;
// Don't open cheat dialog
switch (sizeType) {
case 0:
FCEUI_AddCheat("", address, curvalue, -1, 1);
break;
case 1:
FCEUI_AddCheat("", address, curvalue & 0xFF, -1, 1);
FCEUI_AddCheat("", address + 1, (curvalue & 0xFF00) / 0x100, -1, 1);
break;
case 2:
FCEUI_AddCheat("", address, curvalue & 0xFF, -1, 1);
FCEUI_AddCheat("", address + 1, (curvalue & 0xFF00) / 0x100, -1, 1);
FCEUI_AddCheat("", address + 2, (curvalue & 0xFF0000) / 0x10000, -1, 1);
FCEUI_AddCheat("", address + 3, (curvalue & 0xFF000000) / 0x1000000, -1, 1);
break;
}
UpdateCheatsAdded();
UpdateCheatRelatedWindow();
watchItemIndex = ListView_GetNextItem(ramListControl, watchItemIndex, LVNI_SELECTED);
}
break;
}
case IDC_C_SEARCHROM:
ShowROM = SendDlgItemMessage(hDlg, IDC_C_SEARCHROM, BM_GETCHECK, 0, 0) != 0;
case IDC_C_RESET:
{
needRefresh = false;
RamSearchSaveUndoStateIfNotTooBig(RamSearchHWnd);
int prevNumItems = last_rs_possible;
soft_reset_address_info();
if (prevNumItems == last_rs_possible)
SetRamSearchUndoType(RamSearchHWnd, 0); // nothing to undo
ListView_SetItemState(GetDlgItem(hDlg, IDC_RAMLIST), -1, 0, LVIS_SELECTED); // deselect all
//ListView_SetItemCount(GetDlgItem(hDlg,IDC_RAMLIST),ResultCount);
ListView_SetSelectionMark(GetDlgItem(hDlg, IDC_RAMLIST), 0);
RefreshRamListSelectedCountControlStatus(hDlg);
Update_RAM_Search();
break;
}
case IDC_C_RESET_CHANGES:
needRefresh = false;
memset(s_numChanges, 0, (sizeof(*s_numChanges)*(MAX_RAM_SIZE)));
ListView_Update(GetDlgItem(hDlg, IDC_RAMLIST), -1);
Update_RAM_Search();
//SetRamSearchUndoType(hDlg, 0);
break;
case IDC_C_UNDO:
needRefresh = false;
if (s_undoType > 0)
{
// Clear_Sound_Buffer();
EnterCriticalSection(&s_activeMemoryRegionsCS);
if (s_activeMemoryRegions.size() < tooManyRegionsForUndo)
{
MemoryList tempMemoryList = s_activeMemoryRegions;
s_activeMemoryRegions = s_activeMemoryRegionsBackup;
s_activeMemoryRegionsBackup = tempMemoryList;
LeaveCriticalSection(&s_activeMemoryRegionsCS);
SetRamSearchUndoType(hDlg, 3 - s_undoType);
}
else
{
s_activeMemoryRegions = s_activeMemoryRegionsBackup;
LeaveCriticalSection(&s_activeMemoryRegionsCS);
SetRamSearchUndoType(hDlg, -1);
}
CompactAddrs();
ListView_SetItemState(GetDlgItem(hDlg, IDC_RAMLIST), -1, 0, LVIS_SELECTED); // deselect all
ListView_SetSelectionMark(GetDlgItem(hDlg, IDC_RAMLIST), 0);
RefreshRamListSelectedCountControlStatus(hDlg);
}
break;
case IDC_C_AUTOSEARCH:
needRefresh = false;
AutoSearch = SendDlgItemMessage(hDlg, IDC_C_AUTOSEARCH, BM_GETCHECK, 0, 0) != 0;
AutoSearchAutoRetry = false;
if (!AutoSearch)
break;
if(affNow != 2)
++iter;
else
rv = false;
case IDC_C_SEARCH:
{
needRefresh = false;
// Clear_Sound_Buffer();
if (!rs_val_valid && !(rs_val_valid = Set_RS_Val()))
{
MessageBox(RamSearchHWnd, "Invalid or out-of-bound entered value.", "Error", MB_OK | MB_ICONSTOP);
if (AutoSearch) // stop autosearch if it just started
{
SendDlgItemMessage(hDlg, IDC_C_AUTOSEARCH, BM_SETCHECK, BST_UNCHECKED, 0);
SendMessage(hDlg, WM_COMMAND, IDC_C_AUTOSEARCH, 0);
}
}
else {
if (ResultCount)
{
RamSearchSaveUndoStateIfNotTooBig(hDlg);
prune(rs_c, rs_o, rs_t == 's', rs_val, rs_param);
RefreshRamListSelectedCountControlStatus(hDlg);
}
if (!ResultCount)
{
MessageBox(RamSearchHWnd, "Resetting search.", "Out of results.", MB_OK | MB_ICONINFORMATION);
soft_reset_address_info();
}
}
break;
}
case IDC_C_HEXEDITOR:
{
needRefresh = false;
HWND ramListControl = GetDlgItem(hDlg, IDC_RAMLIST);
int selCount = ListView_GetSelectedCount(ramListControl);
int watchItemIndex = ListView_GetNextItem(ramListControl, -1, LVNI_SELECTED);
if (watchItemIndex >= 0)
{
unsigned int addr = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size, rs_t == 's', noMisalign, watchItemIndex);
ChangeMemViewFocus(0, addr, -1);
}
rv = false;
break;
}
case IDC_C_WATCH:
{
needRefresh = false;
HWND ramListControl = GetDlgItem(hDlg, IDC_RAMLIST);
int selCount = SendMessage(ramListControl, LVM_GETSELECTEDCOUNT, 0, 0);
if (selCount > 0)
{
WatcherMsg msg;
msg.Size = rs_type_size;
msg.Type = rs_t;
msg.WrongEndian = 0; //Replace when I get little endian working
msg.comment = NULL;
bool inserted = false;
msg.Addresses = (unsigned int*)malloc(selCount * sizeof(unsigned int));
int i = 0;
int watchItemIndex = -1;
while ((watchItemIndex = SendMessage(ramListControl, LVM_GETNEXTITEM, watchItemIndex, LVNI_SELECTED)) >= 0)
{
msg.Addresses[i] = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size, rs_t == 's', noMisalign, watchItemIndex);
++i;
}
msg.count = i;
// bring up the ram watch window if it's not already showing so the user knows where the watch went
if (InsertWatches(&msg, hDlg, selCount)
&& !RamWatchHWnd)
SendMessage(hWnd, WM_COMMAND, ID_RAM_WATCH, 0);
SetForegroundWindow(RamSearchHWnd);
if (msg.Addresses) free(msg.Addresses);
if (msg.comment) free(msg.comment);
}
break;
}
if(!j) UpdateRamSearchProgressBar(50 + (i * 50 / selCount)), j = 16;
// eliminate all selected items
case IDC_C_ELIMINATE:
{
needRefresh = false;
RamSearchSaveUndoStateIfNotTooBig(hDlg);
HWND ramListControl = GetDlgItem(hDlg, IDC_RAMLIST);
int size = (rs_type_size == 'b' || !noMisalign) ? 1 : 2;
int selCount = ListView_GetSelectedCount(ramListControl);
int watchIndex = -1;
// time-saving trick #1:
// condense the selected items into an array of address ranges
std::vector<AddrRange> selHardwareAddrs;
for (int i = 0, j = 1024; i < selCount; ++i, --j)
{
watchIndex = ListView_GetNextItem(ramListControl, watchIndex, LVNI_SELECTED);
int addr = CALL_WITH_T_SIZE_TYPES_1(GetHardwareAddressFromItemIndex, rs_type_size, rs_t == 's', noMisalign, watchIndex);
if (!selHardwareAddrs.empty() && addr == selHardwareAddrs.back().End())
selHardwareAddrs.back().size += size;
else
selHardwareAddrs.push_back(AddrRange(addr, size));
if (!j) UpdateRamSearchProgressBar(i * 50 / selCount), j = 1024;
}
// now deactivate the ranges
// time-saving trick #2:
// take advantage of the fact that the listbox items must be in the same order as the regions
MemoryList::iterator iter = s_activeMemoryRegions.begin();
int numHardwareAddrRanges = selHardwareAddrs.size();
for (int i = 0, j = 16; i < numHardwareAddrRanges; ++i, --j)
{
int addr = selHardwareAddrs[i].addr;
int size = selHardwareAddrs[i].size;
bool affected = false;
while (iter != s_activeMemoryRegions.end())
{
MemoryRegion& region = *iter;
int affNow = DeactivateRegion(region, iter, addr, size);
if (affNow)
affected = true;
else if (affected)
break;
if (affNow != 2)
++iter;
}
if (!j) UpdateRamSearchProgressBar(50 + (i * 50 / selCount)), j = 16;
}
UpdateRamSearchTitleBar();
// careful -- if the above two time-saving tricks aren't working,
// the runtime can absolutely explode (seconds -> hours) when there are lots of regions
ListView_SetItemState(ramListControl, -1, 0, LVIS_SELECTED); // deselect all
signal_new_size();
break;
}
default:
rv = false;
needRefresh = false;
break;
}
UpdateRamSearchTitleBar();
// careful -- if the above two time-saving tricks aren't working,
// the runtime can absolutely explode (seconds -> hours) when there are lots of regions
ListView_SetItemState(ramListControl, -1, 0, LVIS_SELECTED); // deselect all
signal_new_size();
{rv = true; break;}
}
}
// check refresh for comparison preview color update
// also, update rs_val if needed
bool needRefresh = false;
switch(LOWORD(wParam))
{
case IDC_LESSTHAN:
case IDC_MORETHAN:
case IDC_NOMORETHAN:
case IDC_NOLESSTHAN:
case IDC_EQUALTO:
case IDC_DIFFERENTFROM:
case IDC_DIFFERENTBY:
case IDC_MODULO:
case IDC_PREVIOUSVALUE:
case IDC_SPECIFICVALUE:
case IDC_SPECIFICADDRESS:
case IDC_NUMBEROFCHANGES:
case IDC_SIGNED:
case IDC_UNSIGNED:
case IDC_HEX:
rs_val_valid = Set_RS_Val();
needRefresh = true;
break;
case IDC_EDIT_COMPAREVALUE:
case IDC_EDIT_COMPAREADDRESS:
case IDC_EDIT_COMPARECHANGES:
case IDC_EDIT_DIFFBY:
case IDC_EDIT_MODBY:
if(HIWORD(wParam) == EN_CHANGE)
if (needRefresh)
{
rs_val_valid = Set_RS_Val();
needRefresh = true;
ListView_Update(GetDlgItem(hDlg, IDC_RAMLIST), -1);
}
break;
return rv;
}
case EN_CHANGE:
{
switch (LOWORD(wParam))
{
case IDC_EDIT_COMPAREVALUE:
case IDC_EDIT_COMPAREADDRESS:
case IDC_EDIT_COMPARECHANGES:
case IDC_EDIT_DIFFBY:
case IDC_EDIT_MODBY:
rs_val_valid = Set_RS_Val();
ListView_Update(GetDlgItem(hDlg, IDC_RAMLIST), -1);
}
}
}
if(needRefresh)
ListView_Update(GetDlgItem(hDlg,IDC_RAMLIST), -1);
return rv;
} break;
}
break;
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
RamSearchHWnd = NULL;
ReleaseCheatMap();
// theApp.modelessCheatDialogIsOpen = false;
break;
}
@ -2067,6 +2113,7 @@ invalid_field:
return false;
}
void UpdateRamSearchTitleBar(int percent)
{
#define HEADER_STR " RAM Search - "

View File

@ -37,4 +37,10 @@ extern POINT CalcSubWindowPos(HWND hDlg, POINT* conf);
// static int CALLBACK RamSearchItemSortFunc(LPARAM lp1, LPARAM lp2, LPARAM lpSort);
// extern void UpdateSortColumnIcon(HWND hwndListView, int sortColumn, bool sortAsc);
#define CHEAT_1BYTE_BG RGB(216, 203, 253)
#define CHEAT_2BYTE_BG RGB(195, 186, 253)
#define CHEAT_3BYTE_BG RGB(176, 139, 252)
#define CHEAT_4BYTE_BG RGB(175, 94, 253)
#define CHEAT_4BYTE_TEXT RGB(255, 255, 255)
#endif

View File

@ -143,45 +143,37 @@ bool InsertWatch(const AddressWatcher& Watch, HWND parent)
int prevWatchCount = WatchCount;
int tmpWatchIndex;
if (parent == RamWatchHWnd)
tmpWatchIndex = WatchCount;
else if (parent == RamSearchHWnd)
tmpWatchIndex = -2;
else if (parent == hCheat)
tmpWatchIndex = -3;
else
tmpWatchIndex = -4;
rswatches[tmpWatchIndex] = Watch;
rswatches[tmpWatchIndex].CurValue = GetCurrentValue(rswatches[tmpWatchIndex]);
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), parent, EditWatchProc, tmpWatchIndex);
rswatches.erase(tmpWatchIndex);
WatcherMsg msg = WatcherMsg::FromAddressWatches(&Watch);
if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), parent, EditWatchProc, (LPARAM)&msg))
{
AddressWatcher* watcher = msg.ToAddressWatches();
InsertWatch(*watcher);
if (watcher->comment)
free(watcher->comment);
free(watcher);
}
if (msg.Addresses) free(msg.Addresses);
if (msg.comment) free(msg.comment);
return WatchCount > prevWatchCount;
}
bool InsertWatches(const AddressWatcher* watches, HWND parent, const int count)
bool InsertWatches(WatcherMsg* msg, HWND parent, int count)
{
if (count == 1)
return InsertWatch(watches[0], parent);
else
bool success = false;
if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), parent, EditWatchProc, (LPARAM)msg))
{
bool success = false;
char comment[256];
rswatches[-1] = watches[0];
rswatches[-1].comment = comment;
if(DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), parent, EditWatchProc, (LPARAM)-1))
for (int i = 0; i < count; ++i)
{
AddressWatcher watcher = watches[i];
watcher.comment = rswatches[-1].comment;
success |= InsertWatch(watcher);
}
rswatches.erase(-1);
return success;
AddressWatcher* watches = msg->ToAddressWatches();
for (int i = 0; i < count; ++i)
{
success |= InsertWatch(watches[i]);
if (watches[i].comment)
free(watches[i].comment);
}
free(watches);
}
return false;
return success;
}
void Update_RAM_Watch()
@ -781,187 +773,253 @@ INT_PTR CALLBACK EditWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
// since there are 3 windows can pops up the add watch dialog, we should store them separately.
// 0 for ram watch, 1 for ram search, 2 for cheat dialog.
static int indexes[4];
static WatcherMsg* msgs[4];
switch(uMsg)
{
case WM_INITDIALOG:
{
HWND parent = GetParent(hDlg);
WatcherMsg* msg = (WatcherMsg*)lParam;
msgs[GetDlgStoreIndex(parent)] = (WatcherMsg*)msg;
RECT r;
GetWindowRect(hDlg, &r);
SetWindowPos(hDlg, NULL, r.left, r.top, NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
char title[128];
UINT addrCtrlID;
switch (msg->msg)
{
RECT r;
GetWindowRect(hWnd, &r);
SetWindowPos(hDlg, NULL, r.left, r.top, NULL, NULL, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);
AddressWatcher& watcher = rswatches[lParam];
if (watcher.Type != 'S') {
char Str_Tmp[1024];
// -1 means batch add
if (lParam != -1)
{
sprintf(Str_Tmp, "%04X", watcher.Address);
SetDlgItemText(hDlg, IDC_EDIT_COMPAREADDRESS, Str_Tmp);
} else
// Add multiple watches
SetDlgItemText(hDlg, IDC_EDIT_COMPAREADDRESS, "(multiple)");
switch (watcher.Size)
{
case 'b':
SendDlgItemMessage(hDlg, IDC_1_BYTE, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'w':
SendDlgItemMessage(hDlg, IDC_2_BYTES, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'd':
SendDlgItemMessage(hDlg, IDC_4_BYTES, BM_SETCHECK, BST_CHECKED, 0);
break;
}
switch (watcher.Type)
{
case 's':
SendDlgItemMessage(hDlg, IDC_SIGNED, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'u':
SendDlgItemMessage(hDlg, IDC_UNSIGNED, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'h':
SendDlgItemMessage(hDlg, IDC_HEX, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'b':
SendDlgItemMessage(hDlg, IDC_BINARY, BM_SETCHECK, BST_CHECKED, 0);
break;
}
} else
SetDlgItemText(hDlg, IDC_EDIT_COMPAREADDRESS, "---------");
if (watcher.comment != NULL)
SetDlgItemText(hDlg, IDC_PROMPT_EDIT, watcher.comment);
HWND parent = GetParent(hDlg);
indexes[GetDlgStoreIndex(parent)] = lParam;
if (watcher.Type == 'S' || parent == RamSearchHWnd || parent == hCheat)
{
EnableWindow(GetDlgItem(hDlg, IDC_SPECIFICADDRESS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DATATYPE_GROUPBOX), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DATASIZE_GROUPBOX), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_COMPAREADDRESS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_SIGNED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_UNSIGNED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_HEX), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BINARY), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_1_BYTE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_2_BYTES), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_4_BYTES), FALSE);
SetFocus(GetDlgItem(hDlg, IDC_PROMPT_EDIT));
}
case WATCHER_MSG_EDIT:
// Editing multiple watch is currently not supported
addrCtrlID = IDC_EDIT_COMPAREADDRESS;
// limit the length to 4 since currently doesn't support batch editing
SendDlgItemMessage(hDlg, addrCtrlID, EM_SETLIMITTEXT, 4, 0);
strcpy(title, "Edit ");
break;
case WATCHER_MSG_ADD:
strcpy(title, "Add ");
addrCtrlID = IDC_EDIT_COMPAREADDRESSES;
break;
case WATCHER_MSG_DUP:
default:
strcpy(title, "Duplicate ");
addrCtrlID = IDC_EDIT_COMPAREADDRESSES;
break;
}
return true;
break;
// The information is needed to fill to the UI, and separetor doesn't have them
if (msg->Type != 'S')
{
strcat(title, "Watch");
if (msg->Addresses != NULL)
{
// fill the information refers to the message provided
char str_addr[7];
char str_addrs[1024] = { 0 };
// In case more than one watches to be batch added
if (msg->count > 0)
{
// Don't worry about editing a watch since currently doesn't support multiple watch editing, the msg->count would always be 1 in edit mode.
for (int i = 0; i < msg->count; ++i)
{
sprintf(str_addr, "%04X, ", msg->Addresses[i]);
strcat(str_addrs, str_addr);
}
str_addrs[strlen(str_addrs) - 2] = 0;
}
// Set address(es) to the edit control
SetDlgItemText(hDlg, addrCtrlID, str_addrs);
switch (msg->Size)
{
case 'b':
SendDlgItemMessage(hDlg, IDC_1_BYTE, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'w':
SendDlgItemMessage(hDlg, IDC_2_BYTES, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'd':
SendDlgItemMessage(hDlg, IDC_4_BYTES, BM_SETCHECK, BST_CHECKED, 0);
break;
}
switch (msg->Type)
{
case 's':
SendDlgItemMessage(hDlg, IDC_SIGNED, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'u':
SendDlgItemMessage(hDlg, IDC_UNSIGNED, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'h':
SendDlgItemMessage(hDlg, IDC_HEX, BM_SETCHECK, BST_CHECKED, 0);
break;
case 'b':
SendDlgItemMessage(hDlg, IDC_BINARY, BM_SETCHECK, BST_CHECKED, 0);
break;
}
}
}
else
strcat(title, "Separator");
// Set the comment
if (msg->comment != NULL)
SetDlgItemText(hDlg, IDC_PROMPT_EDIT, msg->comment);
// show the proper edit control
ShowWindow(GetDlgItem(hDlg, addrCtrlID), SW_SHOW);
ShowWindow(GetDlgItem(hDlg, IDC_SPECIFICADDRESS), SW_SHOW);
// Adjust the dialog to proper state when editing/adding separator or adding watch from windows other than RAM Watch
if (msg->Type == 'S' || parent != RamWatchHWnd)
{
// same part
EnableWindow(GetDlgItem(hDlg, IDC_DATATYPE_GROUPBOX), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DATASIZE_GROUPBOX), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_SIGNED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_UNSIGNED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_HEX), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BINARY), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_1_BYTE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_2_BYTES), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_4_BYTES), FALSE);
// When it is a separator, focus on the comment
if (msg->Type == 'S')
SetFocus(GetDlgItem(hDlg, IDC_PROMPT_EDIT));
// When it is from RAM Search or Cheat Window, all the information required was already given, make the addresses read-only
if (parent != RamWatchHWnd)
{
EnableWindow(GetDlgItem(hDlg, addrCtrlID), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_SPECIFICADDRESS), TRUE);
SetFocus(GetDlgItem(hDlg, IDC_PROMPT_EDIT));
SendDlgItemMessage(hDlg, addrCtrlID, EM_SETREADONLY, TRUE, 0);
}
}
else
{
EnableWindow(GetDlgItem(hDlg, addrCtrlID), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_SPECIFICADDRESS), TRUE);
SetFocus(GetDlgItem(hDlg, addrCtrlID));
}
// limit the text
DefaultEditCtrlProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(hDlg, addrCtrlID), GWL_WNDPROC, (LONG)FilterEditCtrlProc);
SetWindowText(hDlg, title);
}
return false;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
{
char Str_Tmp[256];
HWND parent = GetParent(hDlg);
int index = indexes[GetDlgStoreIndex(parent)];
WatcherMsg* msg = msgs[GetDlgStoreIndex(parent)];
UINT addrCtrlID;
// not a single watch editing operation
if (index != -1)
switch (msg->msg)
{
// a normal watch, copy it to a temporary one
AddressWatcher watcher = rswatches[index];
// if (watcher.comment != NULL)
// watcher.comment = strcpy((char*)malloc(strlen(watcher.comment) + 2), watcher.comment);
case WATCHER_MSG_EDIT:
addrCtrlID = IDC_EDIT_COMPAREADDRESS;
break;
case WATCHER_MSG_ADD:
case WATCHER_MSG_DUP:
addrCtrlID = IDC_EDIT_COMPAREADDRESSES;
break;
}
// It's from ram watch window, not a separator
// When it's from ram search or cheat window, all the information required is already set,
// so this is also unecessary
if (RamWatchHWnd && RamWatchHWnd == GetParent(hDlg) && watcher.Type != 'S')
{
GetDlgItemText(hDlg, IDC_PROMPT_EDIT, Str_Tmp, 256);
// The information is needed to parse from the UI, and separetor doesn't need them
if (parent == RamWatchHWnd && msg->Type != 'S')
{
// Don't worry about editing mode because it always has only 1 address in the edit control
// type
if (SendDlgItemMessage(hDlg, IDC_SIGNED, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Type = 's';
else if (SendDlgItemMessage(hDlg, IDC_UNSIGNED, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Type = 'u';
else if (SendDlgItemMessage(hDlg, IDC_HEX, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Type = 'h';
else if (SendDlgItemMessage(hDlg, IDC_BINARY, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Type = 'b';
else {
MessageBox(hDlg, "Type must be specified.", "Error", MB_OK | MB_ICONERROR);
return true;
}
// Do the always same part first.
// size
if (SendDlgItemMessage(hDlg, IDC_1_BYTE, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Size = 'b';
else if (SendDlgItemMessage(hDlg, IDC_2_BYTES, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Size = 'w';
else if (SendDlgItemMessage(hDlg, IDC_4_BYTES, BM_GETCHECK, 0, 0) == BST_CHECKED)
watcher.Size = 'd';
else {
MessageBox(hDlg, "Size must be specified.", "Error", MB_OK | MB_ICONERROR);
return true;
}
if (watcher.Type == 'b' && (watcher.Size == 'd' || watcher.Size == 'w'))
{
MessageBox(hDlg, "Only 1 byte is supported on binary format.", "Error", MB_OK | MB_ICONERROR);
return true;
}
// address
GetDlgItemText(hDlg, IDC_EDIT_COMPAREADDRESS, Str_Tmp, 1024);
char *addrstr = Str_Tmp;
if (strlen(Str_Tmp) > 8)
addrstr = &Str_Tmp[strlen(Str_Tmp) - 9];
for (int i = 0; addrstr[i]; ++i)
if (toupper(addrstr[i]) == 'O')
addrstr[i] = '0';
sscanf(addrstr, "%04X", &watcher.Address);
if ((watcher.Address & ~0xFFFFFF) == ~0xFFFFFF)
watcher.Address &= 0xFFFFFF;
if (!IsHardwareAddressValid(watcher.Address))
{
MessageBox(hDlg, "Invalid Address.", "Error", MB_OK | MB_ICONERROR);
return true;
}
// get the type
if (SendDlgItemMessage(hDlg, IDC_SIGNED, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Type = 's';
else if (SendDlgItemMessage(hDlg, IDC_UNSIGNED, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Type = 'u';
else if (SendDlgItemMessage(hDlg, IDC_HEX, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Type = 'h';
else if (SendDlgItemMessage(hDlg, IDC_BINARY, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Type = 'b';
else {
MessageBox(hDlg, "Type must be specified.", "Error", MB_OK | MB_ICONERROR);
return true;
}
// comment
GetDlgItemText(hDlg, IDC_PROMPT_EDIT, Str_Tmp, 80);
watcher.comment = Str_Tmp;
// get the size
if (SendDlgItemMessage(hDlg, IDC_1_BYTE, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Size = 'b';
else if (SendDlgItemMessage(hDlg, IDC_2_BYTES, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Size = 'w';
else if (SendDlgItemMessage(hDlg, IDC_4_BYTES, BM_GETCHECK, 0, 0) == BST_CHECKED)
msg->Size = 'd';
else {
MessageBox(hDlg, "Size must be specified.", "Error", MB_OK | MB_ICONERROR);
return true;
}
// finallly update the watch list
if (index >= 0 && index < WatchCount)
// it's a watch editing operation.
// Only ram watch window can edit a watch, the ram search window and cheat window only add watch.
EditWatch(index, watcher);
if (msg->Type == 'b' && (msg->Size == 'd' || msg->Size == 'w'))
{
MessageBox(hDlg, "Only 1 byte is supported on binary format.", "Error", MB_OK | MB_ICONERROR);
return true;
}
// get the address(es)
char str_addrs[1024];
GetDlgItemText(hDlg, addrCtrlID, str_addrs, 1024);
char* next = strtok(str_addrs, ",");
int i = 0;
unsigned int addrSize = 4;
if (msg->Addresses)
msg->Addresses = (unsigned int*)malloc(sizeof(int) * addrSize);
else
InsertWatch(watcher);
if (RamWatchHWnd)
ListView_SetItemCount(GetDlgItem(RamWatchHWnd, IDC_WATCHLIST), WatchCount);
}
else {
// a multiple watches insert operation, just asking for a comment
AddressWatcher& watcher = rswatches[index];
// comment
GetDlgItemText(hDlg, IDC_PROMPT_EDIT, Str_Tmp, 80);
strcpy(watcher.comment, Str_Tmp);
}
EndDialog(hDlg, true);
msg->Addresses = (unsigned int*)realloc(msg->Addresses, sizeof(int) * addrSize);
RWfileChanged = true;
return true;
break;
do {
sscanf(next, "%04X", &msg->Addresses[i]);
// When an invalid address is in it
if (!IsHardwareAddressValid(msg->Addresses[i]))
{
MessageBox(hDlg, "You have entered an invalid address.", "Error", MB_ICONERROR | MB_OK);
// Comment out, leave it unfreed until next ID_OK event or close the dialog
// free(msg->Addresses);
// msg->Addresses = NULL;
char* start = next + strspn(next, ", ");
char* end = start + strcspn(start, ", ");
SendDlgItemMessage(hDlg, addrCtrlID, EM_SETSEL, start - str_addrs, end - str_addrs);
SetFocus(GetDlgItem(hDlg, addrCtrlID));
return true;
}
++i;
if (i == addrSize)
msg->Addresses = (unsigned int*)realloc(msg->Addresses, sizeof(unsigned int) * (addrSize += 4));
} while (next = strtok(NULL, ","));
msg->count = i;
}
// get the new comment, every AddressWatcher would have a comment, no matter what type it is
if (msg->comment)
msg->comment = (char*)realloc(msg->comment, 1024 * sizeof(char));
else
msg->comment = (char*)malloc(1024 * sizeof(char));
GetDlgItemText(hDlg, IDC_PROMPT_EDIT, msg->comment, 1024);
EndDialog(hDlg, true);
return false;
}
case IDCANCEL:
EndDialog(hDlg, false);
@ -1053,6 +1111,7 @@ INT_PTR CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
rwrecentmenu=CreateMenu();
UpdateRW_RMenu(rwrecentmenu, RAMMENU_FILE_RECENT, RW_MENU_FIRST_RECENT_FILE);
CreateCheatMap();
const char* names[3] = {"Address","Value","Notes"};
int widths[3] = {78,64,160};
init_list_box(GetDlgItem(hDlg,IDC_WATCHLIST),names,3,widths);
@ -1213,14 +1272,14 @@ INT_PTR CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_DODEFAULT);
return TRUE;
case 1:
lplvcd->clrTextBk = RGB(216, 203, 253); break;
lplvcd->clrTextBk = CHEAT_1BYTE_BG; break;
case 2:
lplvcd->clrTextBk = RGB(195, 186, 253); break;
lplvcd->clrTextBk = CHEAT_2BYTE_BG; break;
case 3:
lplvcd->clrTextBk = RGB(176, 139, 252); break;
lplvcd->clrTextBk = CHEAT_3BYTE_BG; break;
case 4:
lplvcd->clrTextBk = RGB(175, 94, 253);
lplvcd->clrText = RGB(255, 255, 255); break; // use a more visual color in dark background
lplvcd->clrTextBk = CHEAT_4BYTE_BG;
lplvcd->clrText = CHEAT_4BYTE_TEXT; break; // use a more visual color in dark background
}
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, CDRF_NEWFONT);
}
@ -1301,19 +1360,43 @@ INT_PTR CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
watchIndex = ListView_GetSelectionMark(GetDlgItem(hDlg,IDC_WATCHLIST));
if(watchIndex != -1)
{
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, watchIndex);
SetFocus(GetDlgItem(hDlg,IDC_WATCHLIST));
WatcherMsg msg = WatcherMsg::FromAddressWatches(&rswatches[watchIndex]);
msg.msg = WATCHER_MSG_EDIT;
if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, (LPARAM)&msg))
{
AddressWatcher watcher = msg.ToAddressWatches()[0];
EditWatch(watchIndex, watcher);
SetFocus(GetDlgItem(hDlg, IDC_WATCHLIST));
if (watcher.comment)
free(watcher.comment);
}
if (msg.Addresses)
free(msg.Addresses);
if (msg.comment)
free(msg.comment);
}
return true;
case IDC_C_WATCH:
{
AddressWatcher& target = rswatches[WatchCount];
target.Address = 0;
target.WrongEndian = 0;
target.Size = 'b';
target.Type = 's';
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, WatchCount);
SetFocus(GetDlgItem(hDlg, IDC_WATCHLIST));
WatcherMsg msg;
msg.Addresses = (unsigned int*)calloc(1, sizeof(unsigned int));
msg.WrongEndian = 0;
msg.Size = 'b';
msg.Type = 's';
if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, (LPARAM)&msg))
{
AddressWatcher* target = msg.ToAddressWatches();
for (int i = 0; i < msg.count; ++i)
InsertWatch(target[i]);
SetFocus(GetDlgItem(hDlg, IDC_WATCHLIST));
if (target->comment)
free(target->comment);
free(target);
}
if (msg.Addresses)
free(msg.Addresses);
if (msg.comment)
free(msg.comment);
return true;
}
case IDC_C_WATCH_DUPLICATE:
@ -1321,27 +1404,46 @@ INT_PTR CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
watchIndex = ListView_GetSelectionMark(GetDlgItem(hDlg, IDC_WATCHLIST));
if (watchIndex != -1)
{
char str_tmp[1024];
AddressWatcher* target = &rswatches[WatchCount];
AddressWatcher* source = &rswatches[watchIndex];
memcpy(target, source, sizeof(AddressWatcher));
target->comment = strcpy(str_tmp, source->comment);
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, WatchCount);
SetFocus(GetDlgItem(hDlg, IDC_WATCHLIST));
WatcherMsg msg = WatcherMsg::FromAddressWatches(&rswatches[watchIndex]);
msg.msg = WATCHER_MSG_DUP;
if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, (LPARAM)&msg))
{
SetFocus(GetDlgItem(hDlg, IDC_WATCHLIST));
int count;
AddressWatcher* target = msg.ToAddressWatches(&count);
for (int i = 0; i < count; ++i)
{
InsertWatch(target[i]);
if (target[i].comment)
free(target[i].comment);
}
}
if(msg.Addresses)
free(msg.Addresses);
if(msg.comment)
free(msg.comment);
}
return true;
}
case IDC_C_WATCH_SEPARATE:
{
AddressWatcher* target = &rswatches[WatchCount];
target->Address = 0;
target->WrongEndian = false;
target->Size = 'S';
target->Type = 'S';
WatcherMsg msg;
msg.WrongEndian = 0;
msg.Size = 'S';
msg.Type = 'S';
msg.msg = WATCHER_MSG_ADD;
msg.count = 1;
DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, (LPARAM)WatchCount);
if (DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EDITWATCH), hDlg, EditWatchProc, (LPARAM)&msg))
{
AddressWatcher* sep = msg.ToAddressWatches();
InsertWatch(*sep);
if (sep->comment)
free(sep->comment);
}
if (msg.comment)
free(msg.comment);
// InsertWatch(separator, "----------------------------");
SetFocus(GetDlgItem(hDlg, IDC_WATCHLIST));
return true;
}
@ -1500,6 +1602,8 @@ INT_PTR CALLBACK RamWatchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
// release the hdc related objects
SeparatorCache::DeInit();
// release cheatmap
ReleaseCheatMap();
break;
case WM_DROPFILES:
@ -1584,3 +1688,59 @@ SeparatorCache::SeparatorCache(HWND hwnd, char* text) {
labelOffY = 0;
}
}
AddressWatcher* WatcherMsg::ToAddressWatches(int* _count)
{
AddressWatcher* watches = (AddressWatcher*)malloc(count * sizeof(AddressWatcher));
int i = 0;
while(i < count)
{
AddressWatcher watcher;
watcher.Size = Size;
if (Type != 'S')
watcher.Address = Addresses[i];
watcher.Type = Type;
watcher.WrongEndian = 0;
if (comment)
{
watcher.comment = (char*)malloc(strlen(comment) * sizeof(char) + 1);
strcpy(watcher.comment, comment);
}
else
watcher.comment = NULL;
watches[i] = watcher;
++i;
}
if (_count)
*_count = i;
return watches;
}
WatcherMsg WatcherMsg::FromAddressWatches(const AddressWatcher* watches, int count)
{
WatcherMsg msg;
if (watches[0].comment)
{
msg.comment = (char*)malloc(strlen(watches[0].comment) + 1);
strcpy(msg.comment, watches[0].comment);
}
msg.count = count;
msg.Size = watches->Size;
msg.Type = watches->Type;
msg.WrongEndian = watches->WrongEndian;
// Because currently doesn't support adding multiple separators at once,
// and a separator doesn't have address values,
// so when add separator, there's only 1 item in the list
if (watches->Type != 'S')
{
msg.Addresses = (unsigned int*)malloc(count * sizeof(unsigned int));
for (int i = 0; i < count; ++i)
msg.Addresses[i] = watches[i].Address;
}
return msg;
}

View File

@ -39,6 +39,7 @@ struct SeparatorCache
};
#define MAX_WATCH_COUNT 256
extern int WatchCount; // number of valid items in rswatches
extern char Watch_Dir[1024];
@ -58,9 +59,28 @@ struct AddressWatcher
short Cheats; // how many bytes are affected by cheat
};
// the struct for communicating with add watch window
#define WATCHER_MSG_ADD 0
#define WATCHER_MSG_EDIT 1
#define WATCHER_MSG_DUP 2
struct WatcherMsg {
int msg = WATCHER_MSG_ADD;
int count = 0; // how many addresses are there
unsigned int* Addresses = NULL; // Address list
char* comment = NULL;
bool WrongEndian;
char Size;
char Type;
AddressWatcher* ToAddressWatches(int* _count = NULL);
static WatcherMsg FromAddressWatches(const AddressWatcher* watches, int count = 1);
};
bool InsertWatch(const AddressWatcher& Watch);
bool InsertWatch(const AddressWatcher& Watch, HWND parent); // asks user for comment
bool InsertWatches(const AddressWatcher* watches, HWND parent, const int count);
bool InsertWatches(WatcherMsg* msg, HWND parent, int count);
bool InsertWatch(int watchIndex, const AddressWatcher& watcher);
bool EditWatch(int watchIndex, const AddressWatcher& watcher);
bool RemoveWatch(int watchIndex);

View File

@ -50,14 +50,10 @@ END
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON3 ICON "res/taseditor-icon.ico"
IDI_ICON4 ICON "res/taseditor-icon32.ico"
ICON_1 ICON "res/ICON_1.ico"
ICON_2 ICON "res/ICON_2.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Menu
@ -713,44 +709,44 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTIO
CAPTION "Directories Configuration"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Base &Directory",IDC_STATIC,10,10,47,8
EDITTEXT EDIT_ROOT,71,9,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_ROOT,239,8,56,14
LTEXT "&Roms",IDC_STATIC,10,28,19,8
EDITTEXT EDIT_ROM,71,27,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_ROM,239,26,56,14
LTEXT "&Battery Saves",IDC_STATIC,10,46,45,8
EDITTEXT EDIT_BATTERY,71,45,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_BATTERY,239,44,56,14
LTEXT "&Save States",IDC_STATIC,10,64,41,9
EDITTEXT EDIT_STATE,71,63,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_STATE,239,62,56,14
LTEXT "&FDS Bios Rom",IDC_STATIC,10,82,47,8
EDITTEXT EDIT_FDSBIOS,71,81,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_FDSBIOS,239,80,56,14
LTEXT "Screens&hots",IDC_STATIC,10,100,40,8
EDITTEXT EDIT_SCREENSHOT,71,99,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_SCREENSHOT,239,98,56,14
LTEXT "Chea&ts",IDC_STATIC,10,118,23,8
EDITTEXT EDIT_CHEAT,71,117,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_CHEAT,239,116,56,14
LTEXT "&Movies",IDC_STATIC,10,136,24,8
EDITTEXT EDIT_MOVIE,71,135,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_MOVIE,239,134,56,14
LTEXT "Memory &Watch",IDC_STATIC,10,154,52,9
EDITTEXT EDIT_MEMWATCH,71,153,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_MEMWATCH,239,152,56,14
LTEXT "&Input Presets",IDC_STATIC,10,172,42,8
EDITTEXT EDIT_PRESET,71,171,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",210,239,170,56,14
LTEXT "&Lua Scripts",IDC_STATIC,10,190,36,8
EDITTEXT EDIT_LUA,71,189,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",211,239,188,56,14
LTEXT "A&vi Output",IDC_STATIC,10,208,34,8
EDITTEXT EDIT_AVI,71,207,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",BUTTON_AVI,239,206,56,14
DEFPUSHBUTTON "OK",CLOSE_BUTTON,175,230,56,14
PUSHBUTTON "Cancel",BTN_CANCEL,239,230,56,14
EDITTEXT 113,71,9,158,12,ES_AUTOHSCROLL
EDITTEXT EDIT_ROMS,71,27,158,12,ES_AUTOHSCROLL
EDITTEXT 101,71,45,158,12,ES_AUTOHSCROLL
EDITTEXT 102,71,63,158,12,ES_AUTOHSCROLL
EDITTEXT 103,71,81,158,12,ES_AUTOHSCROLL
EDITTEXT 104,71,99,158,12,ES_AUTOHSCROLL
EDITTEXT 105,71,117,158,12,ES_AUTOHSCROLL
EDITTEXT 106,71,135,158,12,ES_AUTOHSCROLL
EDITTEXT 107,71,153,158,12,ES_AUTOHSCROLL
EDITTEXT 110,71,171,158,12,ES_AUTOHSCROLL
EDITTEXT 111,71,189,158,12,ES_AUTOHSCROLL
EDITTEXT 112,71,207,158,12,ES_AUTOHSCROLL
PUSHBUTTON "Browse...",213,239,8,56,14
PUSHBUTTON "Browse...",BUTTON_ROMS,239,26,56,14
PUSHBUTTON "Browse...",201,239,44,56,14
PUSHBUTTON "Browse...",202,239,62,56,14
PUSHBUTTON "Browse...",203,239,80,56,14
PUSHBUTTON "Browse...",204,239,98,56,14
PUSHBUTTON "Browse...",205,239,116,56,14
PUSHBUTTON "Browse...",206,239,134,56,14
PUSHBUTTON "Browse...",207,239,152,56,14
PUSHBUTTON "Browse...",210,239,170,56,14
PUSHBUTTON "Browse...",211,239,188,56,14
PUSHBUTTON "Browse...",212,239,206,56,14
LTEXT "Base Directory",IDC_STATIC,10,10,47,8
LTEXT "Roms",IDC_STATIC,10,28,19,8
LTEXT "Battery Saves",IDC_STATIC,10,46,45,8
LTEXT "Save States",IDC_STATIC,10,64,41,9
LTEXT "FDS Bios Rom",IDC_STATIC,10,82,47,8
LTEXT "Screenshots",IDC_STATIC,10,100,40,8
LTEXT "Cheats",IDC_STATIC,10,118,23,8
LTEXT "Movies",IDC_STATIC,10,136,24,8
LTEXT "Memory Watch",IDC_STATIC,10,154,52,9
LTEXT "Input Presets",IDC_STATIC,10,172,42,8
LTEXT "Lua Scripts",IDC_STATIC,10,190,36,8
LTEXT "Avi Output",IDC_STATIC,10,208,34,8
END
DWBDIALOG DIALOG 33, 99, 250, 56
@ -880,7 +876,6 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTIO
CAPTION "GUI Configuration"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "Close",BTN_CLOSE,65,136,56,14
CONTROL "Load ""File Open"" dialog when FCEUX starts.",CB_LOAD_FILE_OPEN,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,8,168,12
CONTROL "Automatically hide menu on game load.",CB_AUTO_HIDE_MENU,
@ -895,6 +890,7 @@ BEGIN
CONTROL "Partially disable Visual Themes (Requires restart)",CB_PARTIALVISUALTHEME,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,100,168,12
CONTROL "Single Instance Mode",IDC_SINGLEINSTANCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,117,167,10
DEFPUSHBUTTON "Close",BTN_CLOSE,65,136,56,14
END
INPUTCONFIG DIALOGEX 122, 105, 349, 199
@ -950,7 +946,6 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTIO
CAPTION "mahjong"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "Close",BTN_CLOSE,277,91,56,14
GROUPBOX "",321,8,8,324,73,WS_GROUP
PUSHBUTTON "A",300,14,42,16,12
PUSHBUTTON "B",301,36,42,16,12
@ -973,6 +968,7 @@ BEGIN
PUSHBUTTON " ",318,212,58,16,12
PUSHBUTTON " ",319,234,58,16,12
PUSHBUTTON " ",320,256,58,16,12
DEFPUSHBUTTON "Close",BTN_CLOSE,277,91,56,14
END
MAPINPUT DIALOGEX 0, 0, 318, 294
@ -984,8 +980,8 @@ BEGIN
PUSHBUTTON "Cancel",BTN_CANCEL,205,274,50,14
CONTROL "List2",LV_MAPPING,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,7,7,304,243
PUSHBUTTON "Restore Defaults",BTN_RESTORE_DEFAULTS,7,274,75,14
COMBOBOX COMBO_FILTER,32,255,279,193,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Filter:",65484,6,255,21,12,SS_CENTERIMAGE | NOT WS_GROUP
COMBOBOX COMBO_FILTER,32,255,279,193,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
END
MESSAGELOG DIALOGEX 33, 38, 197, 229
@ -1035,31 +1031,31 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTIO
CAPTION "Palette Configuration"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "Close",BUTTON_CLOSE,162,195,56,14
GROUPBOX "NES Palette",302,10,8,102,81,WS_GROUP
DEFPUSHBUTTON "&Load Palette...",BTN_PALETTE_LOAD,18,39,58,14
CONTROL "Enabled",CHECK_PALETTE_ENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,122,22,87,12
CTEXT "Tint",65463,123,34,85,8,WS_DISABLED
CONTROL "Tint",CTL_TINT_TRACKBAR,"msctls_trackbar32",WS_DISABLED | WS_TABSTOP,121,44,91,11
GROUPBOX "NTSC Color Emulation",101,115,8,103,81,WS_GROUP
CONTROL "Hue",CTL_HUE_TRACKBAR,"msctls_trackbar32",WS_DISABLED | WS_TABSTOP,121,69,91,11
CTEXT "Hue",64395,124,59,85,8,WS_DISABLED
CTEXT "Tint",65463,123,34,85,8,WS_DISABLED
CONTROL "Hue",CTL_HUE_TRACKBAR,"msctls_trackbar32",WS_DISABLED | WS_TABSTOP,121,69,91,11
CONTROL "Force Grayscale",CHECK_PALETTE_GRAYSCALE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,57,85,12
CONTROL "Use Custom Palette",CHECK_PALETTE_CUSTOM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,22,85,12
GROUPBOX "PAL Emulation",IDC_STATIC,10,89,208,66,WS_DISABLED
CONTROL "",CTL_PALSAT_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,78,110,70,15
LTEXT "Saturation:",STATIC_SATVALUE,83,100,58,8,WS_DISABLED
CONTROL "",CTL_PALSAT_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,78,110,70,15
PUSHBUTTON "Reset",BTN_PALETTE_RESET,161,132,50,14,WS_DISABLED
CONTROL "",CTL_PALNOTCH_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,11,110,68,15
LTEXT "Notch:",STATIC_NOTCHVALUE,16,100,46,8,WS_DISABLED
CONTROL "",CTL_PALSHARP_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,156,109,61,15
CONTROL "",CTL_PALNOTCH_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,11,110,68,15
LTEXT "Sharpness:",STATIC_SHARPVALUE,161,99,50,8,WS_DISABLED
CONTROL "",CTL_PALSHARP_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,156,109,61,15
LTEXT "NTSC Color Emulation overrides Internal default Palette.\nIndividual Game Palette overrides Internal+NTSC Palettes.\nCustom Palette overrides all of the above.\nPAL Emulation overrides other choices when PAL filter is selected",IDC_STATIC,10,159,208,33
CONTROL "",CTL_PALCONTRAST_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,11,134,67,15
LTEXT "Contrast: ",STATIC_CONTRASTVALUE,16,126,55,8,WS_DISABLED
CONTROL "",CTL_PALBRIGHT_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,78,133,70,15
CONTROL "",CTL_PALCONTRAST_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,11,134,67,15
LTEXT "Brightness: ",STATIC_BRIGHTVALUE,83,125,61,8,WS_DISABLED
CONTROL "",CTL_PALBRIGHT_TRACKBAR,"msctls_trackbar32",TBS_NOTICKS | WS_DISABLED | WS_TABSTOP,78,133,70,15
CONTROL "De-emphasis bit swap",CHECK_DEEMPH_SWAP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,73,83,10
DEFPUSHBUTTON "Close",BUTTON_CLOSE,162,195,56,14
END
POWERPADDIALOG DIALOG 30, 123, 131, 119
@ -1280,16 +1276,16 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIB
CAPTION "Timing Configuration"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "Close",1,137,87,56,14
CONTROL "Disable speed throttling used when sound is disabled.",CB_DISABLE_SPEED_THROTTLING,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,8,183,12
CONTROL "Set high-priority thread.",CB_SET_HIGH_PRIORITY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,24,102,12
CONTROL "Overclocking (old PPU only).",CB_OVERCLOCKING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,41,101,10
EDITTEXT IDC_EXTRA_SCANLINES,104,55,84,14,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED
LTEXT "Post-render scanlines:",IDC_EXTRA_SCANLINES_TEXT,21,57,74,8,WS_DISABLED
EDITTEXT IDC_EXTRA_SCANLINES,104,55,84,14,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED
CONTROL "Don't overclock 7-bit samples.",CB_SKIP_7BIT,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,10,87,111,10
EDITTEXT IDC_VBLANK_SCANLINES,104,68,84,14,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED
LTEXT "VBlank scanlines:",IDC_VBLANK_SCANLINES_TEXT,21,71,76,8,WS_DISABLED
EDITTEXT IDC_VBLANK_SCANLINES,104,68,84,14,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED
DEFPUSHBUTTON "Close",1,137,87,56,14
END
MOVIEOPTIONS DIALOGEX 65520, 76, 147, 222
@ -1297,7 +1293,6 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTIO
CAPTION "Movie Options"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "Close",IDC_MOVIE_CLOSE,48,200,49,14,BS_CENTER
CONTROL "Pause after playback",IDC_MOVIE_PAUSEAFTERPLAYBACK,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,26,110,10
CONTROL "Bind savestates to movies",IDC_MOVIE_BINDSAVESTATES,
@ -1317,6 +1312,7 @@ BEGIN
CONTROL "Always suggest Read-Only replay",IDC_MOVIE_SUGGEST_READONLY,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,8,125,10
LTEXT "(VBA-rr and SNES9x style)",IDC_STATIC,25,184,93,8
DEFPUSHBUTTON "Close",IDC_MOVIE_CLOSE,48,200,49,14,BS_CENTER
END
DWBDIALOGSIMPLE DIALOGEX 33, 99, 250, 39
@ -1546,8 +1542,8 @@ CAPTION "Add Breakpoint..."
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "&Address:",-1,14,6,30,10
EDITTEXT IDC_ADDBP_ADDR_START,48,4,30,12,ES_UPPERCASE | ES_WANTRETURN
CTEXT "-",65534,78,6,8,8
EDITTEXT IDC_ADDBP_ADDR_START,48,4,30,12,ES_UPPERCASE | ES_WANTRETURN
EDITTEXT IDC_ADDBP_ADDR_END,87,4,30,12,ES_UPPERCASE | ES_WANTRETURN
CONTROL "&Forbid",IDC_ADDBP_MODE_F,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154,6,33,12
GROUPBOX "",112,3,18,185,50,WS_TABSTOP
@ -1596,7 +1592,7 @@ BEGIN
END
ROMPATCHER DIALOGEX 84, 67, 304, 135
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Rom Data Editor"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
@ -1690,16 +1686,16 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPT
CAPTION "Find"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "Find &What:",-1,7,9,38,8
EDITTEXT IDC_MEMVIEWFIND_WHAT,47,7,171,14,ES_AUTOHSCROLL
LTEXT "Find What:",-1,7,9,38,8
GROUPBOX "Type",-1,83,29,187,45
CONTROL "Hex",IDC_MEMVIEWFIND_TYPE_HEX,"Button",BS_AUTORADIOBUTTON | WS_GROUP,93,43,29,10
CONTROL "Text (Uses Currently Loaded Table as Reference)",IDC_MEMVIEWFIND_TYPE_TEXT,
CONTROL "&Hex",IDC_MEMVIEWFIND_TYPE_HEX,"Button",BS_AUTORADIOBUTTON | WS_GROUP,93,43,29,10
CONTROL "&Text (Uses Currently Loaded Table as Reference)",IDC_MEMVIEWFIND_TYPE_TEXT,
"Button",BS_AUTORADIOBUTTON,93,56,172,10
GROUPBOX "Direction",-1,9,29,65,44
CONTROL "Up",IDC_MEMVIEWFIND_DIR_UP,"Button",BS_AUTORADIOBUTTON | WS_GROUP,18,43,25,10
CONTROL "Down",IDC_MEMVIEWFIND_DIR_DOWN,"Button",BS_AUTORADIOBUTTON,18,56,35,10
DEFPUSHBUTTON "Find Next",IDC_MEMVIEWFIND_NEXT,225,7,50,14
CONTROL "&Up",IDC_MEMVIEWFIND_DIR_UP,"Button",BS_AUTORADIOBUTTON | WS_GROUP,18,43,25,10
CONTROL "&Down",IDC_MEMVIEWFIND_DIR_DOWN,"Button",BS_AUTORADIOBUTTON,18,56,35,10
DEFPUSHBUTTON "&Find Next",IDC_MEMVIEWFIND_NEXT,225,7,50,14
END
IDD_RECORDINP DIALOGEX 0, 0, 276, 86
@ -1707,16 +1703,16 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTI
CAPTION "Record input"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",1,167,66,50,14
GROUPBOX "",65501,3,0,269,60
RTEXT "File:",65500,28,11,24,10,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_RIGHT
PUSHBUTTON "Cancel",2,221,66,50,14
RTEXT "&File:",65500,28,11,24,10,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_RIGHT
EDITTEXT IDC_EDIT_FILENAME,55,10,189,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_BUTTON_BROWSEFILE,249,10,18,14
RTEXT "&Record From:",65498,9,27,43,8,0,WS_EX_RIGHT
COMBOBOX IDC_COMBO_RECORDFROM,55,25,189,154,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
RTEXT "Record From:",65498,9,27,43,8,0,WS_EX_RIGHT
RTEXT "&Author:",65502,18,43,34,10,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_RIGHT
EDITTEXT IDC_EDIT_AUTHOR,55,41,189,14,ES_AUTOHSCROLL
RTEXT "Author:",65502,18,43,34,10,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_RIGHT
DEFPUSHBUTTON "OK",1,167,66,50,14
PUSHBUTTON "Cancel",2,221,66,50,14
END
IDD_REPLAYINP DIALOGEX 0, 0, 300, 202
@ -1724,36 +1720,36 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTI
CAPTION "Play Movie"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
DEFPUSHBUTTON "OK",1,189,183,50,14
GROUPBOX "",65497,3,0,293,180
RTEXT "File:",65498,8,11,24,10,SS_CENTERIMAGE | NOT WS_GROUP
COMBOBOX IDC_COMBO_FILENAME,35,10,257,128,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Cancel",2,243,183,50,14
RTEXT "Length:",64397,10,67,59,8
EDITTEXT IDC_LABEL_LENGTH,76,67,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "Frames:",65496,10,78,59,8
EDITTEXT IDC_LABEL_FRAMES,76,78,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "Record Count:",65495,10,89,59,8
EDITTEXT IDC_LABEL_UNDOCOUNT,76,89,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "ROM Used:",65493,10,111,59,8
EDITTEXT IDC_LABEL_ROMUSED,76,111,187,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "ROM Checksum:",65492,10,122,59,8
EDITTEXT IDC_LABEL_ROMCHECKSUM,76,122,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "Recorded From:",65491,10,100,59,8
EDITTEXT IDC_LABEL_RECORDEDFROM,76,100,123,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "Emulator Used:",65490,10,144,59,8
EDITTEXT IDC_LABEL_EMULATORUSED,76,144,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "Current ROM Sum:",65489,8,133,61,8
EDITTEXT IDC_LABEL_CURRCHECKSUM,76,133,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
CONTROL "Pause movie at frame",IDC_CHECK_STOPMOVIE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,49,83,10
EDITTEXT IDC_EDIT_STOPFRAME,103,47,39,12,ES_AUTOHSCROLL | ES_NUMBER
GROUPBOX "Parameters",IDC_STATIC,13,25,278,40
PUSHBUTTON "Metadata...",IDC_BUTTON_METADATA,239,71,50,14
EDITTEXT IDC_LABEL_EMULATORUSED,76,144,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_LABEL_CURRCHECKSUM,76,133,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_LABEL_ROMCHECKSUM,76,122,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_LABEL_ROMUSED,76,111,187,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_LABEL_RECORDEDFROM,76,100,123,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
CONTROL "Open &Read-Only",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,36,69,10
EDITTEXT IDC_LABEL_UNDOCOUNT,76,89,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_LABEL_FRAMES,76,78,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
EDITTEXT IDC_LABEL_LENGTH,76,67,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "Pal:",65494,10,155,59,8
EDITTEXT IDC_LABEL_PALUSED,76,155,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
RTEXT "New PPU:",65499,10,166,59,8
EDITTEXT IDC_LABEL_NEWPPUUSED,76,166,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
DEFPUSHBUTTON "OK",1,189,183,50,14
PUSHBUTTON "Cancel",2,243,183,50,14
END
TASEDITOR DIALOGEX 0, 0, 326, 348
@ -1825,16 +1821,16 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTI
CAPTION "Create New Project"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,7,80,50,14
PUSHBUTTON "Cancel",IDCANCEL,114,80,50,14
CONTROL " Copy current Input",IDC_COPY_INPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,14,75,10
CONTROL " 1 player",IDC_RADIO_1PLAYER,"Button",BS_AUTORADIOBUTTON,16,14,45,10
CONTROL " 2 players",IDC_RADIO_2PLAYERS,"Button",BS_AUTORADIOBUTTON,16,27,45,10
CONTROL " Fourscore",IDC_RADIO_FOURSCORE,"Button",BS_AUTORADIOBUTTON,16,40,45,10
CONTROL " Copy current Markers",IDC_COPY_MARKERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,80,27,83,10
GROUPBOX "Input type",IDC_STATIC,5,3,67,52,BS_CENTER
EDITTEXT IDC_EDIT_AUTHOR,36,61,127,13,ES_AUTOHSCROLL
LTEXT "Author:",IDC_STATIC,8,63,26,9
EDITTEXT IDC_EDIT_AUTHOR,36,61,127,13,ES_AUTOHSCROLL
DEFPUSHBUTTON "OK",IDOK,7,80,50,14
PUSHBUTTON "Cancel",IDCANCEL,114,80,50,14
END
IDD_TASEDITOR_EXPORT DIALOGEX 0, 0, 158, 86
@ -1842,13 +1838,13 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIB
CAPTION "Export to FM2"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "Export",IDOK,7,66,50,14
PUSHBUTTON "Cancel",IDCANCEL,100,66,50,14
CONTROL " 1 player",IDC_RADIO_1PLAYER,"Button",BS_AUTORADIOBUTTON | WS_GROUP,8,8,47,10
CONTROL " 2 players",IDC_RADIO_2PLAYERS,"Button",BS_AUTORADIOBUTTON,8,21,47,10
CONTROL " Fourscore",IDC_RADIO_FOURSCORE,"Button",BS_AUTORADIOBUTTON,8,35,47,10
CONTROL " Convert Marker Notes to Movie Subtitles",IDC_NOTES_TO_SUBTITLES,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,50,146,10
DEFPUSHBUTTON "Export",IDOK,7,66,50,14
PUSHBUTTON "Cancel",IDCANCEL,100,66,50,14
END
IDD_TASEDITOR_FINDNOTE DIALOGEX 0, 0, 228, 49
@ -2085,16 +2081,16 @@ CAPTION "Lua Script"
MENU LUAWINDOW_MENU
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "&Browse...",IDC_BUTTON_LUABROWSE,7,31,48,16
PUSHBUTTON "&Run",IDC_BUTTON_LUARUN,213,31,50,16
PUSHBUTTON "&Stop",IDC_BUTTON_LUASTOP,160,31,50,16
EDITTEXT IDC_EDIT_LUAPATH,7,16,256,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT_LUAARGS,47,50,216,14,ES_AUTOHSCROLL
EDITTEXT IDC_LUACONSOLE,7,80,256,60,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
LTEXT "Output Console:",IDC_STATIC,7,70,56,8
LTEXT "Script File:",IDC_STATIC,7,7,36,8
LTEXT "Arguments:",IDC_STATIC,7,52,40,8
EDITTEXT IDC_EDIT_LUAPATH,7,16,256,14,ES_AUTOHSCROLL
PUSHBUTTON "&Browse...",IDC_BUTTON_LUABROWSE,7,31,48,16
PUSHBUTTON "Edit",IDC_BUTTON_LUAEDIT,58,31,46,16
PUSHBUTTON "&Stop",IDC_BUTTON_LUASTOP,160,31,50,16
PUSHBUTTON "&Run",IDC_BUTTON_LUARUN,213,31,50,16
LTEXT "Output Console:",IDC_STATIC,7,70,56,8
EDITTEXT IDC_LUACONSOLE,7,80,256,60,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL
LTEXT "Arguments:",IDC_STATIC,7,52,40,8
EDITTEXT IDC_EDIT_LUAARGS,47,50,216,14,ES_AUTOHSCROLL
END
VIDEOCONFIG DIALOGEX 65520, 76, 511, 170
@ -2134,12 +2130,12 @@ BEGIN
COMBOBOX IDC_VIDEOCONFIG_SYNC_METHOD_WIN,236,106,103,47,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Drawing Area",65494,351,50,154,65,WS_GROUP
LTEXT "First line:",65436,367,68,40,9
LTEXT "Last line:",65435,367,84,40,9
CTEXT "NTSC",65434,413,57,27,8
CTEXT "PAL/Dendy",65433,455,57,48,8
EDITTEXT IDC_SCANLINE_FIRST_NTSC,414,66,27,12,ES_RIGHT | ES_NUMBER
EDITTEXT IDC_SCANLINE_LAST_NTSC,414,83,27,12,ES_RIGHT | ES_NUMBER
CTEXT "PAL/Dendy",65433,455,57,48,8
EDITTEXT IDC_SCANLINE_FIRST_PAL,465,66,27,12,ES_RIGHT | ES_NUMBER
LTEXT "Last line:",65435,367,84,40,9
EDITTEXT IDC_SCANLINE_LAST_NTSC,414,83,27,12,ES_RIGHT | ES_NUMBER
EDITTEXT IDC_SCANLINE_LAST_PAL,465,83,27,12,ES_RIGHT | ES_NUMBER
CONTROL "Clip left and right sides (8 px on each)",IDC_VIDEOCONFIG_CLIPSIDES,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,357,98,140,12
@ -2158,8 +2154,8 @@ BEGIN
EDITTEXT IDC_TVASPECT_Y,458,28,41,12,ES_AUTOHSCROLL | WS_DISABLED
CTEXT "/",IDC_STATIC_SLASHTEXT,449,31,8,8,WS_DISABLED
LTEXT "DirectDraw:",65454,11,126,46,10
LTEXT "DirectDraw:",65455,188,125,46,10
COMBOBOX IDC_VIDEOCONFIG_DIRECTDRAW_FS,59,123,105,50,CBS_DROPDOWNLIST | WS_TABSTOP
LTEXT "DirectDraw:",65455,188,125,46,10
COMBOBOX IDC_VIDEOCONFIG_DIRECTDRAW_WIN,236,123,103,47,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
END
@ -2192,7 +2188,7 @@ BEGIN
CONTROL "Number of Changes:",IDC_NUMBEROFCHANGES,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,121,212,76,10
EDITTEXT IDC_EDIT_COMPAREVALUE,203,187,63,12,ES_UPPERCASE | ES_AUTOHSCROLL | WS_DISABLED
EDITTEXT IDC_EDIT_COMPAREADDRESS,203,199,63,12,ES_UPPERCASE | ES_AUTOHSCROLL | WS_DISABLED
EDITTEXT IDC_EDIT_COMPARECHANGES,203,211,63,12,ES_UPPERCASE | ES_AUTOHSCROLL | WS_DISABLED
EDITTEXT IDC_EDIT_COMPARECHANGES,203,211,63,12,ES_UPPERCASE | ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED
GROUPBOX "Data Type / Display",IDC_STATIC,196,228,75,45,0,WS_EX_TRANSPARENT
CONTROL "Signed",IDC_SIGNED,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,200,238,67,9
CONTROL "Unsigned",IDC_UNSIGNED,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,200,249,67,9
@ -2232,8 +2228,9 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM
CAPTION " Edit Watch"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
CTEXT "&Address:",IDC_SPECIFICADDRESS,15,12,30,8
EDITTEXT IDC_EDIT_COMPAREADDRESS,48,10,65,12,ES_UPPERCASE | ES_AUTOHSCROLL
CTEXT "&Address:",IDC_SPECIFICADDRESS,15,12,30,8,NOT WS_VISIBLE | WS_DISABLED
EDITTEXT IDC_EDIT_COMPAREADDRESS,48,10,65,12,ES_UPPERCASE | ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED
EDITTEXT IDC_EDIT_COMPAREADDRESSES,48,10,65,12,ES_UPPERCASE | ES_AUTOHSCROLL | NOT WS_VISIBLE | WS_DISABLED
CTEXT "&Notes:",IDC_PROMPT_TEXT,23,24,22,8
EDITTEXT IDC_PROMPT_EDIT,48,22,119,12,ES_AUTOHSCROLL
GROUPBOX "Data Type",IDC_DATATYPE_GROUPBOX,14,37,75,53,0,WS_EX_TRANSPARENT
@ -2245,8 +2242,8 @@ BEGIN
CONTROL "&1 byte",IDC_1_BYTE,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,98,47,61,11
CONTROL "&2 bytes",IDC_2_BYTES,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,98,57,61,11
CONTROL "&4 bytes",IDC_4_BYTES,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,98,67,61,11
DEFPUSHBUTTON "&OK",IDOK,66,93,50,14
PUSHBUTTON "&Cancel",IDCANCEL,118,93,50,14
DEFPUSHBUTTON "OK",IDOK,66,93,50,14
PUSHBUTTON "Cancel",IDCANCEL,118,93,50,14
END
DLG_SNESPAD DIALOGEX 4, 109, 243, 121
@ -2306,16 +2303,16 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM
CAPTION "Symbolic Debug Naming"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,132,62,50,14
PUSHBUTTON "Cancel",IDCANCEL,189,62,50,14
LTEXT "File",IDC_STATIC,7,7,15,9
EDITTEXT IDC_SYMBOLIC_ADDRESS,38,24,33,13,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP
EDITTEXT IDC_SYMBOLIC_FILENAME,24,6,215,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP
LTEXT "Address",IDC_STATIC,6,26,30,10
EDITTEXT IDC_SYMBOLIC_NAME,107,24,132,13,ES_AUTOHSCROLL
EDITTEXT IDC_SYMBOLIC_ADDRESS,38,24,33,13,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP
LTEXT "Name",IDC_STATIC,83,26,22,10
EDITTEXT IDC_SYMBOLIC_NAME,107,24,132,13,ES_AUTOHSCROLL
LTEXT "Comment",IDC_STATIC,6,45,37,10
EDITTEXT IDC_SYMBOLIC_COMMENT,45,43,194,13,ES_AUTOHSCROLL
EDITTEXT IDC_SYMBOLIC_FILENAME,24,6,215,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP
DEFPUSHBUTTON "OK",IDOK,132,62,50,14
PUSHBUTTON "Cancel",IDCANCEL,189,62,50,14
END
IDD_REPLAY_METADATA DIALOGEX 0, 0, 325, 250
@ -2324,7 +2321,7 @@ CAPTION "Movie Metadata"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "Close",IDCANCEL,268,229,50,14
CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,311,214
CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,7,311,214
END
IDD_EDIT_HEADER DIALOGEX 0, 0, 321, 258
@ -2775,6 +2772,11 @@ BEGIN
0
END
IDD_RAMSEARCH AFX_DIALOG_LAYOUT
BEGIN
0
END
/////////////////////////////////////////////////////////////////////////////
//
@ -2843,214 +2845,110 @@ END
//
IDB_BITMAP0 BITMAP "res\\te_0.bmp"
IDB_BITMAP1 BITMAP "res\\te_1.bmp"
IDB_BITMAP2 BITMAP "res\\te_2.bmp"
IDB_BITMAP3 BITMAP "res\\te_3.bmp"
IDB_BITMAP4 BITMAP "res\\te_4.bmp"
IDB_BITMAP5 BITMAP "res\\te_5.bmp"
IDB_BITMAP6 BITMAP "res\\te_6.bmp"
IDB_BITMAP7 BITMAP "res\\te_7.bmp"
IDB_BITMAP8 BITMAP "res\\te_8.bmp"
IDB_BITMAP9 BITMAP "res\\te_9.bmp"
IDB_BITMAP10 BITMAP "res\\te_10.bmp"
IDB_BITMAP11 BITMAP "res\\te_11.bmp"
IDB_BITMAP12 BITMAP "res\\te_12.bmp"
IDB_BITMAP13 BITMAP "res\\te_13.bmp"
IDB_BITMAP14 BITMAP "res\\te_14.bmp"
IDB_BITMAP15 BITMAP "res\\te_15.bmp"
IDB_BITMAP16 BITMAP "res\\te_16.bmp"
IDB_BITMAP17 BITMAP "res\\te_17.bmp"
IDB_BITMAP18 BITMAP "res\\te_18.bmp"
IDB_BITMAP19 BITMAP "res\\te_19.bmp"
IDB_TE_ARROW BITMAP "res\\te_arrow.bmp"
IDB_TE_GREEN_ARROW BITMAP "res\\te_green_arrow.bmp"
IDB_TE_GREEN_BLUE_ARROW BITMAP "res\\te_green_blue_arrow.bmp"
IDB_PIANO_0 BITMAP "res\\te_piano_0.bmp"
IDB_PIANO_1 BITMAP "res\\te_piano_1.bmp"
IDB_PIANO_2 BITMAP "res\\te_piano_2.bmp"
IDB_PIANO_3 BITMAP "res\\te_piano_3.bmp"
IDB_PIANO_4 BITMAP "res\\te_piano_4.bmp"
IDB_PIANO_5 BITMAP "res\\te_piano_5.bmp"
IDB_PIANO_6 BITMAP "res\\te_piano_6.bmp"
IDB_PIANO_7 BITMAP "res\\te_piano_7.bmp"
IDB_PIANO_8 BITMAP "res\\te_piano_8.bmp"
IDB_PIANO_9 BITMAP "res\\te_piano_9.bmp"
IDB_PIANO_10 BITMAP "res\\te_piano_10.bmp"
IDB_PIANO_11 BITMAP "res\\te_piano_11.bmp"
IDB_PIANO_12 BITMAP "res\\te_piano_12.bmp"
IDB_PIANO_13 BITMAP "res\\te_piano_13.bmp"
IDB_PIANO_14 BITMAP "res\\te_piano_14.bmp"
IDB_PIANO_15 BITMAP "res\\te_piano_15.bmp"
IDB_PIANO_16 BITMAP "res\\te_piano_16.bmp"
IDB_PIANO_17 BITMAP "res\\te_piano_17.bmp"
IDB_PIANO_18 BITMAP "res\\te_piano_18.bmp"
IDB_PIANO_19 BITMAP "res\\te_piano_19.bmp"
IDB_PIANO_PLAYBACK_0 BITMAP "res\\te_piano_0_playback.bmp"
IDB_PIANO_PLAYBACK_1 BITMAP "res\\te_piano_1_playback.bmp"
IDB_PIANO_PLAYBACK_2 BITMAP "res\\te_piano_2_playback.bmp"
IDB_PIANO_PLAYBACK_3 BITMAP "res\\te_piano_3_playback.bmp"
IDB_PIANO_PLAYBACK_4 BITMAP "res\\te_piano_4_playback.bmp"
IDB_PIANO_PLAYBACK_5 BITMAP "res\\te_piano_5_playback.bmp"
IDB_PIANO_PLAYBACK_6 BITMAP "res\\te_piano_6_playback.bmp"
IDB_PIANO_PLAYBACK_7 BITMAP "res\\te_piano_7_playback.bmp"
IDB_PIANO_PLAYBACK_8 BITMAP "res\\te_piano_8_playback.bmp"
IDB_PIANO_PLAYBACK_9 BITMAP "res\\te_piano_9_playback.bmp"
IDB_PIANO_PLAYBACK_10 BITMAP "res\\te_piano_10_playback.bmp"
IDB_PIANO_PLAYBACK_11 BITMAP "res\\te_piano_11_playback.bmp"
IDB_PIANO_PLAYBACK_12 BITMAP "res\\te_piano_12_playback.bmp"
IDB_PIANO_PLAYBACK_13 BITMAP "res\\te_piano_13_playback.bmp"
IDB_PIANO_PLAYBACK_14 BITMAP "res\\te_piano_14_playback.bmp"
IDB_PIANO_PLAYBACK_15 BITMAP "res\\te_piano_15_playback.bmp"
IDB_PIANO_PLAYBACK_16 BITMAP "res\\te_piano_16_playback.bmp"
IDB_PIANO_PLAYBACK_17 BITMAP "res\\te_piano_17_playback.bmp"
IDB_PIANO_PLAYBACK_18 BITMAP "res\\te_piano_18_playback.bmp"
IDB_PIANO_PLAYBACK_19 BITMAP "res\\te_piano_19_playback.bmp"
IDB_PIANO_LOSTPOS_0 BITMAP "res\\te_piano_0_lostpos.bmp"
IDB_PIANO_LOSTPOS_1 BITMAP "res\\te_piano_1_lostpos.bmp"
IDB_PIANO_LOSTPOS_2 BITMAP "res\\te_piano_2_lostpos.bmp"
IDB_PIANO_LOSTPOS_3 BITMAP "res\\te_piano_3_lostpos.bmp"
IDB_PIANO_LOSTPOS_4 BITMAP "res\\te_piano_4_lostpos.bmp"
IDB_PIANO_LOSTPOS_5 BITMAP "res\\te_piano_5_lostpos.bmp"
IDB_PIANO_LOSTPOS_6 BITMAP "res\\te_piano_6_lostpos.bmp"
IDB_PIANO_LOSTPOS_7 BITMAP "res\\te_piano_7_lostpos.bmp"
IDB_PIANO_LOSTPOS_8 BITMAP "res\\te_piano_8_lostpos.bmp"
IDB_PIANO_LOSTPOS_9 BITMAP "res\\te_piano_9_lostpos.bmp"
IDB_PIANO_LOSTPOS_10 BITMAP "res\\te_piano_10_lostpos.bmp"
IDB_PIANO_LOSTPOS_11 BITMAP "res\\te_piano_11_lostpos.bmp"
IDB_PIANO_LOSTPOS_12 BITMAP "res\\te_piano_12_lostpos.bmp"
IDB_PIANO_LOSTPOS_13 BITMAP "res\\te_piano_13_lostpos.bmp"
IDB_PIANO_LOSTPOS_14 BITMAP "res\\te_piano_14_lostpos.bmp"
IDB_PIANO_LOSTPOS_15 BITMAP "res\\te_piano_15_lostpos.bmp"
IDB_PIANO_LOSTPOS_16 BITMAP "res\\te_piano_16_lostpos.bmp"
IDB_PIANO_LOSTPOS_17 BITMAP "res\\te_piano_17_lostpos.bmp"
IDB_PIANO_LOSTPOS_18 BITMAP "res\\te_piano_18_lostpos.bmp"
IDB_PIANO_LOSTPOS_19 BITMAP "res\\te_piano_19_lostpos.bmp"
IDB_BITMAP_SELECTED0 BITMAP "res\\te_0_selected.bmp"
IDB_BITMAP_SELECTED1 BITMAP "res\\te_1_selected.bmp"
IDB_BITMAP_SELECTED2 BITMAP "res\\te_2_selected.bmp"
IDB_BITMAP_SELECTED3 BITMAP "res\\te_3_selected.bmp"
IDB_BITMAP_SELECTED4 BITMAP "res\\te_4_selected.bmp"
IDB_BITMAP_SELECTED5 BITMAP "res\\te_5_selected.bmp"
IDB_BITMAP_SELECTED6 BITMAP "res\\te_6_selected.bmp"
IDB_BITMAP_SELECTED7 BITMAP "res\\te_7_selected.bmp"
IDB_BITMAP_SELECTED8 BITMAP "res\\te_8_selected.bmp"
IDB_BITMAP_SELECTED9 BITMAP "res\\te_9_selected.bmp"
IDB_BITMAP_SELECTED10 BITMAP "res\\te_10_selected.bmp"
IDB_BITMAP_SELECTED11 BITMAP "res\\te_11_selected.bmp"
IDB_BITMAP_SELECTED12 BITMAP "res\\te_12_selected.bmp"
IDB_BITMAP_SELECTED13 BITMAP "res\\te_13_selected.bmp"
IDB_BITMAP_SELECTED14 BITMAP "res\\te_14_selected.bmp"
IDB_BITMAP_SELECTED15 BITMAP "res\\te_15_selected.bmp"
IDB_BITMAP_SELECTED16 BITMAP "res\\te_16_selected.bmp"
IDB_BITMAP_SELECTED17 BITMAP "res\\te_17_selected.bmp"
IDB_BITMAP_SELECTED18 BITMAP "res\\te_18_selected.bmp"
IDB_BITMAP_SELECTED19 BITMAP "res\\te_19_selected.bmp"
IDB_BRANCH_SPRITESHEET BITMAP "res\\branch_spritesheet.bmp"
#endif // English (United States) resources
#endif // English(United States) resources
/////////////////////////////////////////////////////////////////////////////

View File

@ -1,12 +1,12 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file
// for res.rc
// Microsoft Visual C++ 生成的包含文件。
// 供 res.rc 使用
//
#define CLOSE_BUTTON 1
#define BUTTON_CLOSE 1
#define BTN_CLOSE 1
#define MENU_OPEN_FILE 100
#define EDIT_ROMS 100
#define EDIT_ROM 100
#define LBL_LOG_TEXT 100
#define LBL_KEY_COMBO 100
#define LBL_CDLOGGER_CODECOUNT 100
@ -31,6 +31,7 @@
#define IDC_ROMPATCHER_DOTNES_OFFSET 101
#define IDC_NTVIEW_TABLE_BOX 101
#define IDC_ASSEMBLER_DISASSEMBLY 101
#define EDIT_BATTERY 101
#define MENU_RECENT_FILES 102
#define CB_LOAD_FILE_OPEN 102
#define LBL_CDLOGGER_UNDEFCOUNT 102
@ -46,6 +47,7 @@
#define IDC_NTVIEW_SCANLINE 102
#define IDC_ASSEMBLER_PATCH_DISASM 102
#define CHECK_PALETTE_GRAYSCALE 102
#define EDIT_STATE 102
#define BTN_CDLOGGER_RESET 103
#define LBL_PPUVIEW_TILE1 103
#define IDC_CHEAT_VAL 103
@ -56,6 +58,7 @@
#define IDC_ROMPATCHER_BTN_EDIT 103
#define IDC_NTVIEW_PROPERTIES_LINE_1 103
#define IDC_VIDEOCONFIG_HIDEMOUSE 103
#define EDIT_FDSBIOS 103
#define CB_AUTO_HIDE_MENU 104
#define COMBO_PAD1 104
#define BTN_CDLOGGER_LOAD 104
@ -69,6 +72,7 @@
#define IDC_ROMPATCHER_CURRENT_DATA_BOX 104
#define IDC_NTVIEW_PROPERTIES_LINE_2 104
#define CHECK_PALETTE_CUSTOM 104
#define EDIT_SCREENSHOT 104
#define COMBO_PAD2 105
#define CB_SET_HIGH_PRIORITY 105
#define BTN_CDLOGGER_START_PAUSE 105
@ -81,6 +85,7 @@
#define IDC_ADDBP_MEM_CPU 105
#define IDC_ROMPATCHER_CURRENT_DATA 105
#define IDC_NTVIEW_PROPERTIES_LINE_3 105
#define EDIT_CHEAT 105
#define BTN_PORT1 106
#define BTN_CDLOGGER_SAVE_AS 106
#define IDC_CHEAT_LIST_POSSIBILITIES 106
@ -89,18 +94,21 @@
#define IDC_ADDBP_MEM_PPU 106
#define IDC_NTVIEW_PROPERTIES_LINE_4 106
#define IDC_TEXT_LINES_TO_THIS_WINDOW 106
#define EDIT_MOVIE 106
#define BTN_PORT2 107
#define BTN_CDLOGGER_SAVE 107
#define IDC_DEBUGGER_STEP_OVER 107
#define IDC_ADDBP_MEM_SPR 107
#define IDC_ROMPATCHER_DISASSEMBLY 107
#define IDC_VIDEOCONFIG_BESTFIT 107
#define EDIT_MEMWATCH 107
#define IDR_ACCELERATOR1 108
#define BTN_CDLOGGER_SAVE_STRIPPED 108
#define IDC_CHEAT_VAL_NE_BY 108
#define IDC_DEBUGGER_SEEK_PC 108
#define IDR_TASEDITOR_ACCELERATORS 108
#define IDC_VIDEOCONFIG_CONSOLE_BGCOLOR 108
#define EDIT_BOT 108
#define IDC_CHEAT_VAL_GT_BY 109
#define IDC_DEBUGGER_SEEK_TO 109
#define IDC_ROMPATCHER_PATCH_DATA 109
@ -108,6 +116,7 @@
#define BTN_CDLOGGER_SAVE_UNUSED 109
#define IDC_VIDEOCONFIG_TVASPECT 109
#define IDC_GROUP_LOG_OPTIONS 109
#define EDIT_MACRO 109
#define IDC_CHEAT_VAL_LT_BY 110
#define MENU_SAVE_STATE 110
#define CB_ASK_EXIT 110
@ -118,6 +127,7 @@
#define IDC_ROMPATCHER_BTN_APPLY 110
#define LBL_CDLOGGER_RENDERCOUNT 110
#define IDC_VIDEOCONFIG_SQUARE_PIXELS 110
#define EDIT_PRESET 110
#define MENU_LOAD_STATE 111
#define CB_DISABLE_SCREEN_SAVER 111
#define BTN_FAM 111
@ -126,12 +136,15 @@
#define IDC_ROMPATCHER_BTN_SAVE 111
#define IDC_CHEAT_COM 111
#define IDC_VIDEOCONFIG_DIRECTDRAW_FS 111
#define EDIT_LUA 111
#define BTN_AUTO_HOLD 112
#define IDC_BTN_LOG_BROWSE 112
#define IDC_DEBUGGER_BOOKMARK_ADD 112
#define IDC_VIDEOCONFIG_DIRECTDRAW_WIN 112
#define EDIT_AVI 112
#define IDC_DEBUGGER_BOOKMARK_DEL 113
#define IDC_EXTRA_LOG_OPTIONS 113
#define EDIT_ROOT 113
#define BTN_CLEAR_AH 114
#define IDC_CHECK_LOG_NEW_INSTRUCTIONS 114
#define IDC_DEBUGGER_RUN_LINE 114
@ -203,7 +216,7 @@
#define IDD_TASEDITOR_FINDNOTE 198
#define IDD_TASEDITOR_ABOUT 199
#define MENU_RESET 200
#define BUTTON_ROMS 200
#define BUTTON_ROM 200
#define TXT_PAD1 200
#define BTN_RESTORE_DEFAULTS 200
#define BTN_CLEAR 200
@ -232,6 +245,7 @@
#define IDC_ASSEMBLER_APPLY 201
#define IDI_ICON4 201
#define BTN_OK 201
#define BUTTON_BATTERY 201
#define MENU_EJECT_DISK 202
#define TXT_FAM 202
#define MENU_MV_EDIT_PASTE 202
@ -241,6 +255,7 @@
#define IDC_ASSEMBLER_SAVE 202
#define IDD_TASEDITOR_NEWPROJECT 202
#define IDC_GROUPBOX_CHEATSEARCH 202
#define BUTTON_STATE 202
#define MENU_SWITCH_DISK 203
#define IDC_NETMOO_NICK 203
#define IDC_CHEAT_BOX_POSSIBILITIES 203
@ -248,24 +263,35 @@
#define IDC_DEBUGGER_FLAG_B 203
#define IDC_ADDBP_NAME 203
#define IDC_ASSEMBLER_UNDO 203
#define BUTTON_FDSBIOS 203
#define MENU_INSERT_COIN 204
#define COMBO_NETMOO_LOCAL_PLAYERS 204
#define IDC_DEBUGGER_FLAG_D 204
#define IDC_GROUP_PREV_COM 204
#define BUTTON_SCREENSHOT 204
#define IDC_NETMOO_KEY 205
#define IDC_DEBUGGER_FLAG_I 205
#define IDB_TE_GREEN_ARROW 205
#define BUTTON_CHEAT 205
#define IDC_NETMOO_PASS 206
#define IDC_DEBUGGER_FLAG_Z 206
#define BUTTON_MOVIE 206
#define IDC_DEBUGGER_FLAG_C 207
#define BUTTON_MEMWATCH 207
#define IDC_DEBUGGER_ENABLE_SYMBOLIC 208
#define IDB_TE_GREEN_BLUE_ARROW 208
#define BUTTON_BOT 208
#define IDB_PIANO_0 209
#define IDC_DEBUGGER_ROM_OFFSETS 209
#define BUTTON_MACRO 209
#define IDB_PIANO_1 210
#define BUTTON_PRESET 210
#define IDB_PIANO_2 211
#define BUTTON_LUA 211
#define IDB_PIANO_3 212
#define BUTTON_AVI 212
#define IDB_PIANO_4 213
#define BUTTON_ROOT 213
#define IDB_PIANO_5 214
#define IDB_PIANO_6 215
#define IDB_PIANO_7 216
@ -739,6 +765,7 @@
#define IDC_EDIT_COMPAREVALUE 1225
#define IDC_EDIT_COMPAREADDRESS 1226
#define IDC_EDIT_COMPARECHANGES 1227
#define IDC_EDIT_COMPAREADDRESSES 1227
#define IDC_SIGNED 1228
#define IDC_UNSIGNED 1229
#define IDC_HEX 1230

View File

@ -3272,7 +3272,7 @@ LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)
case WM_PASTE:
{
bool(*IsLetterLegal)(char) = GetIsLetterLegal(GetDlgCtrlID(hwnd));
bool (*IsLetterLegal)(char) = GetIsLetterLegal(GetDlgCtrlID(hwnd));
if (IsLetterLegal)
{
@ -3293,13 +3293,12 @@ LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)
{
through = false;
// Show Edit control tip, just like the control with ES_NUMBER do
ShowLetterIllegalError(hwnd, IsLetterLegal);
ShowLetterIllegalBalloonTip(hwnd, IsLetterLegal);
break;
}
}
GlobalUnlock(handle);
CloseClipboard();
}
}
}
@ -3308,9 +3307,9 @@ LRESULT APIENTRY FilterEditCtrlProc(HWND hwnd, UINT msg, WPARAM wP, LPARAM lP)
case WM_CHAR:
{
bool(*IsLetterLegal)(char) = GetIsLetterLegal(GetDlgCtrlID(hwnd));
through = IsInputLegal(GetIsLetterLegal(GetDlgCtrlID(hwnd)), wP);
through = IsInputLegal(IsLetterLegal, wP);
if (!through)
ShowLetterIllegalError(hwnd, IsLetterLegal);
ShowLetterIllegalBalloonTip(hwnd, IsLetterLegal);
}
}
@ -3322,9 +3321,6 @@ bool inline (*GetIsLetterLegal(UINT id))(char letter)
{
switch (id)
{
// owomomo TODO: RAM Search is a bit complicated,
// I'll handle it in later development
// Game genie text in Cheat and Game Genie Encoder/Decoder
case IDC_CHEAT_GAME_GENIE_TEXT:
@ -3342,10 +3338,6 @@ bool inline (*GetIsLetterLegal(UINT id))(char letter)
// Debugger -> Add breakpoint
case IDC_ADDBP_ADDR_START: case IDC_ADDBP_ADDR_END:
// RAM Watch / RAM Search / Cheat -> Add watch
// TODO: Some other features
// case IDC_EDIT_COMPAREADDRESS:
// Address, Value, Compare, Known Value, Note equal, Greater than and Less than in Cheat
case IDC_CHEAT_ADDR: case IDC_CHEAT_VAL: case IDC_CHEAT_COM:
case IDC_CHEAT_VAL_KNOWN: case IDC_CHEAT_VAL_NE_BY:
@ -3361,8 +3353,15 @@ bool inline (*GetIsLetterLegal(UINT id))(char letter)
case MW_ADDR12: case MW_ADDR13: case MW_ADDR14: case MW_ADDR15:
case MW_ADDR16: case MW_ADDR17: case MW_ADDR18: case MW_ADDR19:
case MW_ADDR20: case MW_ADDR21: case MW_ADDR22: case MW_ADDR23:
case IDC_EDIT_COMPAREADDRESS:
return IsLetterLegalHex;
// Specific Address in RAM Search
// RAM Watch / RAM Search / Cheat -> Add watch (current only in adding watch operation)
case IDC_EDIT_COMPAREADDRESSES:
return IsLetterLegalHexList;
// Size multiplier and TV Aspect in Video Config
case IDC_WINSIZE_MUL_X: case IDC_WINSIZE_MUL_Y:
case IDC_TVASPECT_X: case IDC_TVASPECT_Y:
@ -3372,67 +3371,87 @@ bool inline (*GetIsLetterLegal(UINT id))(char letter)
case IDC_CHEAT_TEXT:
return IsLetterLegalCheat;
// PRG ROM, PRG RAM, PRG NVRAM, CHR ROM, CHR RAM, CHR NVRAM in iNES Header Editor
// PRG ROM, PRG RAM, PRG NVRAM, CHR ROM, CHR RAM and CHR NVRAM in iNES Header Editor
case IDC_PRGROM_EDIT: case IDC_PRGRAM_EDIT: case IDC_PRGNVRAM_EDIT:
case IDC_CHRROM_EDIT: case IDC_CHRRAM_EDIT: case IDC_CHRNVRAM_EDIT:
return IsLetterLegalSize;
// Specific value, Different by and Modulo in RAM search
case IDC_EDIT_COMPAREVALUE:
case IDC_EDIT_DIFFBY:
case IDC_EDIT_MODBY:
{
extern char rs_t;
switch (rs_t)
{
case 's': return IsLetterLegalDecHexMixed;
case 'u': return IsLetterLegalUnsignedDecHexMixed;
case 'h': return IsLetterLegalHex;
}
}
}
return NULL;
}
inline void ShowLetterIllegalError(HWND hwnd, bool(*IsLetterLegal)(char letter), bool balloon)
{
(balloon ? ShowLetterIllegalBalloonTip : ShowLetterIllegalMessageBox)(hwnd, IsLetterLegal);
}
void ShowLetterIllegalBalloonTip(HWND hwnd, bool(*IsLetterLegal)(char letter))
{
char* title = "Unacceptable Character";
int uLen = MultiByteToWideChar(CP_ACP, NULL, title, -1, NULL, 0);
wchar_t* titleW = (wchar_t*)malloc(sizeof(wchar_t) * uLen);
MultiByteToWideChar(CP_ACP, 0, title, -1, (LPWSTR)titleW, uLen);
char* msg = GetLetterIllegalErrMsg(IsLetterLegal);
uLen = MultiByteToWideChar(CP_ACP, NULL, msg, -1, NULL, 0);
wchar_t* msgW = (wchar_t*)malloc(sizeof(wchar_t) * uLen);
MultiByteToWideChar(CP_ACP, 0, msg, -1, (LPWSTR)msgW, uLen);
wchar_t* title = L"Unacceptable Character";
wchar_t* msg = GetLetterIllegalErrMsg(IsLetterLegal);
EDITBALLOONTIP tip;
tip.cbStruct = sizeof(EDITBALLOONTIP);
tip.pszText = msgW;
tip.pszTitle = titleW;
tip.pszText = msg;
tip.pszTitle = title;
tip.ttiIcon = TTI_ERROR;
SendMessage(hwnd, EM_SHOWBALLOONTIP, 0, (LPARAM)&tip);
free(titleW);
free(msgW);
// make a sound
MessageBeep(0xFFFFFFFF);
}
inline void ShowLetterIllegalMessageBox(HWND hwnd, bool(*IsLetterLegal)(char letter))
{
MessageBox(hwnd, GetLetterIllegalErrMsg(IsLetterLegal), "Unacceptable Character", MB_OK | MB_ICONERROR);
}
inline char* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter))
inline wchar_t* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter))
{
if (IsLetterLegal == IsLetterLegalGG)
return "You can only type Game Genie characters:\nA P Z L G I T Y E O X U K S V N";
return L"You can only type Game Genie characters:\nA P Z L G I T Y E O X U K S V N";
if (IsLetterLegal == IsLetterLegalHex)
return "You can only type characters for hexadecimal number (0-9,A-F).";
return L"You can only type characters for hexadecimal number (0-9,A-F).";
if (IsLetterLegal == IsLetterLegalHexList)
return L"You can only type characters for hexademical number (0-9,A-F), each number is separated by a comma (,)";
if (IsLetterLegal == IsLetterLegalCheat)
return
"The cheat code comes into the following 2 formats:\n"
L"The cheat code comes into the following 2 formats:\n"
"AAAA:VV freezes the value in Address $AAAA to $VV.\n"
"AAAA?CC:VV changes the value in Address $AAAA to $VV only when it's $CC.\n"
"All the characters are hexadecimal number (0-9,A-F).\n";
if (IsLetterLegal == IsLetterLegalFloat)
return "You can only type decimal number (decimal point is acceptable).";
return L"You can only type decimal number (decimal point is acceptable).";
if (IsLetterLegal == IsLetterLegalSize)
return "You can only type decimal number followed with B, KB or MB.";
return L"You can only type decimal number followed with B, KB or MB.";
if (IsLetterLegal == IsLetterLegalDec)
return "You can only type decimal number (minus is acceptable).";
return L"You can only type decimal number (sign character is acceptable).";
if (IsLetterLegal == IsLetterLegalDecHexMixed)
return
L"You can only type decimal or hexademical number\n"
"(sign character is acceptable).\n\n"
"When your number contains letter A-F,\n"
"it is regarded as hexademical number,\n"
"however, if you want to express a heademical number\n"
"but all the digits are in 0-9,\n"
"you must add a $ prefix to prevent ambiguous.\n"
"eg. 10 is a decimal number,\n"
"$10 means a hexademical number that is 16 in decimal.";
if (IsLetterLegal == IsLetterLegalUnsignedDecHexMixed)
return
L"You can only type decimal or hexademical number.\n\n"
"When your number contains letter A-F,\n"
"it is regarded as hexademical number,\n"
"however, if you want to express a heademical number\n"
"but all the digits are in 0-9,\n"
"you must add a $ prefix to prevent ambiguous.\n"
"eg. 10 is a decimal number,\n"
"$10 means a hexademical number that is 16 in decimal.";
return "Your input contains invalid characters.";
return L"Your input contains invalid characters.";
}
inline bool IsInputLegal(bool (*IsLetterLegal)(char letter), char letter)
@ -3454,6 +3473,11 @@ inline bool IsLetterLegalHex(char letter)
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f';
}
inline bool IsLetterLegalHexList(char letter)
{
return IsLetterLegalHex(letter) || letter == ',' || letter == ' ';
}
inline bool IsLetterLegalCheat(char letter)
{
return letter >= '0' && letter <= ':' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '?';
@ -3466,10 +3490,20 @@ inline bool IsLetterLegalSize(char letter)
inline bool IsLetterLegalDec(char letter)
{
return letter >= '0' && letter <= '9' || letter == '-';
return letter >= '0' && letter <= '9' || letter == '-' || letter == '+';
}
inline bool IsLetterLegalFloat(char letter)
{
return letter >= '0' && letter <= '9' || letter == '.';
return letter >= '0' && letter <= '9' || letter == '.' || letter == '-' || letter == '+';
}
inline bool IsLetterLegalDecHexMixed(char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '$' || letter == '-' || letter == '+';
}
inline bool IsLetterLegalUnsignedDecHexMixed(char letter)
{
return letter >= '0' && letter <= '9' || letter >= 'A' && letter <= 'F' || letter >= 'a' && letter <= 'f' || letter == '$';
}

View File

@ -129,17 +129,18 @@ void UpdateMenuHotkeys(FCEUMENU_INDEX index);
int GetCurrentContextIndex();
inline bool (*GetIsLetterLegal(UINT id))(char letter);
inline char* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter));
inline void ShowLetterIllegalError(HWND hwnd, bool(*IsLetterLegal)(char letter), bool balloon = true);
inline wchar_t* GetLetterIllegalErrMsg(bool(*IsLetterLegal)(char letter));
void ShowLetterIllegalBalloonTip(HWND hwnd, bool(*IsLetterLegal)(char letter));
inline void ShowLetterIllegalMessageBox(HWND hwnd, bool(*IsLetterLegal)(char letter));
inline bool IsInputLegal(bool(*IsLetterLegal)(char letter), char letter);
inline bool IsLetterLegalGG(char letter);
inline bool IsLetterLegalHex(char letter);
inline bool IsLetterLegalHexList(char letter);
inline bool IsLetterLegalCheat(char letter);
inline bool IsLetterLegalDec(char letter);
inline bool IsLetterLegalSize(char letter);
inline bool IsLetterLegalFloat(char letter);
inline bool IsLetterLegalDecHexMixed(char letter);
inline bool IsLetterLegalUnsignedDecHexMixed(char letter);
extern WNDPROC DefaultEditCtrlProc;
extern LRESULT APIENTRY FilterEditCtrlProc(HWND hDlg, UINT msg, WPARAM wP, LPARAM lP);

View File

@ -1373,7 +1373,7 @@ uint8 FCEU_ReadRomByte(uint32 i) {
void FCEU_WriteRomByte(uint32 i, uint8 value) {
if (i < 16)
#ifdef WIN32
MessageBox(hMemView, "Sorry", "You can't edit the ROM header.", MB_OK);
MessageBox(hMemView, "Sorry", "You can't edit the ROM header.", MB_OK | MB_ICONERROR);
#else
printf("Sorry, you can't edit the ROM header.\n");
#endif