diff --git a/desmume/src/cheatSystem.cpp b/desmume/src/cheatSystem.cpp index bc43bdc41..1a41e9cc4 100644 --- a/desmume/src/cheatSystem.cpp +++ b/desmume/src/cheatSystem.cpp @@ -2,7 +2,6 @@ yopyop156@ifrance.com yopyop156.ifrance.com - Copyright 2009 CrazyMax Copyright 2009 DeSmuME team This file is part of DeSmuME @@ -37,10 +36,6 @@ static u32 cheatsCurrentGet = 0; static u8 *cheatsStack = NULL; static u16 cheatsNumStack = 0; -#ifndef WIN32 -#define sscanf_s sscanf -#endif - static void cheatsClear() { memset(cheats, 0, sizeof(cheats)); @@ -61,10 +56,9 @@ void cheatsInit(char *path) cheatsLoad(); } -BOOL cheatsAdd(u8 proc, u8 size, u32 address, u32 val, char *description, BOOL enabled) +BOOL cheatsAdd(u8 size, u32 address, u32 val, char *description, BOOL enabled) { if (cheatsNum == MAX_CHEAT_LIST) return FALSE; - cheats[cheatsNum].proc = proc; cheats[cheatsNum].hi[0] = address & 0x00FFFFFF; cheats[cheatsNum].lo[0] = val; cheats[cheatsNum].num = 1; @@ -76,6 +70,19 @@ BOOL cheatsAdd(u8 proc, u8 size, u32 address, u32 val, char *description, BOOL e return TRUE; } +BOOL cheatsUpdate(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos) +{ + if (pos > cheatsNum) return FALSE; + cheats[pos].hi[0] = address & 0x00FFFFFF; + cheats[pos].lo[0] = val; + cheats[pos].num = 1; + cheats[pos].type = 0; + cheats[pos].size = size; + strcpy(cheats[pos].description, description); + cheats[pos].enabled = enabled; + return TRUE; +} + BOOL cheatsAdd_AR(char *code, char *description, BOOL enabled) { return FALSE; @@ -89,10 +96,13 @@ BOOL cheatsAdd_CB(char *code, char *description, BOOL enabled) BOOL cheatsRemove(u32 pos) { if (pos > cheatsNum) return FALSE; + if (cheatsNum == 0) return FALSE; + for (int i = pos; i < cheatsNum; i++) memcpy(&cheats[i], &cheats[i+1], sizeof(CHEATS_LIST)); - if (cheatsNum == 0) return FALSE; + memset(&cheats[cheatsNum], 0, sizeof(CHEATS_LIST)); + cheatsNum--; return TRUE; } @@ -119,6 +129,18 @@ BOOL cheatsGetList(CHEATS_LIST *cheat) return TRUE; } +BOOL cheatsGet(CHEATS_LIST *cheat, u32 pos) +{ + if (pos > cheatsNum) return FALSE; + memcpy(cheat, &cheats[pos], sizeof(CHEATS_LIST)); + return TRUE; +} + +u32 cheatsGetSize() +{ + return cheatsNum; +} + BOOL cheatsSave() { FILE *fcheat = fopen((char *)cheatFilename, "w"); @@ -126,13 +148,12 @@ BOOL cheatsSave() if (fcheat) { fprintf(fcheat, "; DeSmuME cheat file. VERSION %i.%03i\n", CHEAT_VERSION_MAJOR, CHEAT_VERSION_MINOR); - fputs("\n", fcheat); fprintf(fcheat, "Name=%s\n", ROMserial); - fputs("\n; cheats list\n", fcheat); + fputs("; cheats list\n", fcheat); for (int i = 0; i < cheatsNum; i++) { fprintf(fcheat, "Desc=%s\n", cheats[i].description); - fprintf(fcheat, "Info=%i,%i,%i,%i,%i\n", cheats[i].type, cheats[i].num, cheats[i].enabled, cheats[i].proc, cheats[i].size); + fprintf(fcheat, "Info=%i,%i,%i,%i\n", cheats[i].type, cheats[i].num, cheats[i].enabled, cheats[i].size); if (cheats[i].num > 0) { @@ -190,9 +211,7 @@ BOOL cheatsLoad() if (buf[8]!=',') continue; // error cheats[last].enabled=atoi(&buf[9]); if (buf[10]!=',') continue; // error - cheats[last].proc=atoi(&buf[11]); - if (buf[12]!=',') continue; // error - cheats[last].size=atoi(&buf[13]); + cheats[last].size=atoi(&buf[11]); fgets(buf, 1024, fcheat); if ( (buf[0] == 'D') && (buf[1] == 'a') && @@ -225,7 +244,7 @@ BOOL cheatsLoad() } fclose(fcheat); - INFO("Loaded %i cheats\n", last); + //INFO("Loaded %i cheats\n", last); cheatsNum = last; return TRUE; } @@ -271,17 +290,17 @@ void cheatsProcess() //INFO("cheat at 0x02|%06X value %i (size %i)\n",cheats[i].hi[0], cheats[i].lo[0], cheats[i].size); switch (cheats[i].size) { - case 0: T1WriteByte(MMU.MMU_MEM[cheats[i].proc][0x20], cheats[i].hi[0], cheats[i].lo[0]); break; - case 1: T1WriteWord(MMU.MMU_MEM[cheats[i].proc][0x20], cheats[i].hi[0], cheats[i].lo[0]); break; + case 0: T1WriteByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], cheats[i].hi[0], cheats[i].lo[0]); break; + case 1: T1WriteWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], cheats[i].hi[0], cheats[i].lo[0]); break; case 2: { - u32 tmp = T1ReadLong(MMU.MMU_MEM[cheats[i].proc][0x20], cheats[i].hi[0]); + u32 tmp = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], cheats[i].hi[0]); tmp &= 0xFF000000; tmp |= (cheats[i].lo[0] & 0x00FFFFFF); - T1WriteLong(MMU.MMU_MEM[cheats[i].proc][0x20], cheats[i].hi[0], tmp); + T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], cheats[i].hi[0], tmp); break; } - case 3: T1WriteLong(MMU.MMU_MEM[cheats[i].proc][0x20], cheats[i].hi[0], cheats[i].lo[0]); break; + case 3: T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], cheats[i].hi[0], cheats[i].lo[0]); break; } break; @@ -295,13 +314,10 @@ void cheatsProcess() } // ========================================== search -u8 *searchStatMemARM9 = NULL; -u8 *searchStatMemARM7 = NULL; -u8 *searchMemARM9 = NULL; -u8 *searchMemARM7 = NULL; +u8 *searchStatMem = NULL; +u8 *searchMem = NULL; u32 searchNumber = 0; u32 searchLastRecord = 0; -u32 searchLastRecordProc = 0; u32 searchType = 0; u32 searchSize = 0; @@ -309,23 +325,17 @@ u32 searchSign = 0; void cheatsSearchInit(u8 type, u8 size, u8 sign) { - if (searchStatMemARM9) return; - if (searchStatMemARM7) return; - if (searchMemARM9) return; - if (searchMemARM7) return; + if (searchStatMem) return; + if (searchMem) return; - searchStatMemARM9 = new u8 [ ( 4 * 1024 * 1024 ) / 8 ]; - searchStatMemARM7 = new u8 [ ( 4 * 1024 * 1024 ) / 8 ]; + searchStatMem = new u8 [ ( 4 * 1024 * 1024 ) / 8 ]; - memset(searchStatMemARM9, 0xFF, ( 4 * 1024 * 1024 ) / 8); - memset(searchStatMemARM7, 0xFF, ( 4 * 1024 * 1024 ) / 8); + memset(searchStatMem, 0xFF, ( 4 * 1024 * 1024 ) / 8); if (type == 1) // comparative search type (need 8Mb RAM !!! (4+4)) { - searchMemARM9 = new u8 [ ( 4 * 1024 * 1024 ) ]; - searchMemARM7 = new u8 [ ( 4 * 1024 * 1024 ) ]; - memcpy(searchMemARM9, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) ); - memcpy(searchMemARM7, MMU.MMU_MEM[1][0x20], ( 4 * 1024 * 1024 ) ); + searchMem = new u8 [ ( 4 * 1024 * 1024 ) ]; + memcpy(searchMem, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) ); } searchType = type; @@ -333,110 +343,98 @@ void cheatsSearchInit(u8 type, u8 size, u8 sign) searchSign = sign; searchNumber = 0; searchLastRecord = 0; - searchLastRecordProc = 0; //INFO("Cheat search system is inited (type %s)\n", type?"comparative":"exact"); } void cheatsSearchClose() { - if (searchStatMemARM9) delete [] searchStatMemARM9; - if (searchStatMemARM7) delete [] searchStatMemARM7; - searchStatMemARM9 = NULL; - searchStatMemARM7 = NULL; + if (searchStatMem) delete [] searchStatMem; + searchStatMem = NULL; - if (searchMemARM9) delete [] searchMemARM9; - if (searchMemARM7) delete [] searchMemARM7; - searchMemARM9 = NULL; - searchMemARM7 = NULL; + if (searchMem) delete [] searchMem; + searchMem = NULL; searchNumber = 0; searchLastRecord = 0; - searchLastRecordProc = 0; //INFO("Cheat search system is closed\n"); } u32 cheatsSearchValue(u32 val) { - u8 *stat[2] = {searchStatMemARM9, searchStatMemARM7}; - searchNumber = 0; switch (searchSize) { case 0: // 1 byte - for (u32 t = 0; t < 2; t++) - for (u32 i = 0; i < (4 * 1024 * 1024); i++) + for (u32 i = 0; i < (4 * 1024 * 1024); i++) + { + u32 addr = (i >> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (1<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (1<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (3<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (3<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (0x7<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (0x7<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (0xF<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (0xF<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (1<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (1< T1ReadByte(mem[t], i)); break; - case 1: res=(T1ReadByte(MMU.MMU_MEM[t][0x20], i) < T1ReadByte(mem[t], i)); break; - case 2: res=(T1ReadByte(MMU.MMU_MEM[t][0x20], i) == T1ReadByte(mem[t], i)); break; - case 3: res=(T1ReadByte(MMU.MMU_MEM[t][0x20], i) != T1ReadByte(mem[t], i)); break; - default: res = FALSE; break; - } - if ( res ) - { - stat[t][addr] |= (1< T1ReadByte(searchMem, i)); break; + case 1: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadByte(searchMem, i)); break; + case 2: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadByte(searchMem, i)); break; + case 3: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadByte(searchMem, i)); break; + default: res = FALSE; break; } + if ( res ) + { + searchStatMem[addr] |= (1<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (3<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (3< T1ReadWord(mem[t], i)); break; - case 1: res=(T1ReadWord(MMU.MMU_MEM[t][0x20], i) < T1ReadWord(mem[t], i)); break; - case 2: res=(T1ReadWord(MMU.MMU_MEM[t][0x20], i) == T1ReadWord(mem[t], i)); break; - case 3: res=(T1ReadWord(MMU.MMU_MEM[t][0x20], i) != T1ReadWord(mem[t], i)); break; - default: res = FALSE; break; - } - if ( res ) - { - stat[t][addr] |= (3< T1ReadWord(searchMem, i)); break; + case 1: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadWord(searchMem, i)); break; + case 2: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadWord(searchMem, i)); break; + case 3: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadWord(searchMem, i)); break; + default: res = FALSE; break; } + if ( res ) + { + searchStatMem[addr] |= (3<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (7<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (7< (T1ReadLong(mem[t], i) & 0x00FFFFFF) ); break; - case 1: res=((T1ReadLong(MMU.MMU_MEM[t][0x20], i) & 0x00FFFFFF) < (T1ReadLong(mem[t], i) & 0x00FFFFFF) ); break; - case 2: res=((T1ReadLong(MMU.MMU_MEM[t][0x20], i) & 0x00FFFFFF) == (T1ReadLong(mem[t], i) & 0x00FFFFFF) ); break; - case 3: res=((T1ReadLong(MMU.MMU_MEM[t][0x20], i) & 0x00FFFFFF) != (T1ReadLong(mem[t], i) & 0x00FFFFFF) ); break; - default: res = FALSE; break; - } - if ( res ) - { - stat[t][addr] |= (7< (T1ReadLong(searchMem, i) & 0x00FFFFFF) ); break; + case 1: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) < (T1ReadLong(searchMem, i) & 0x00FFFFFF) ); break; + case 2: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) == (T1ReadLong(searchMem, i) & 0x00FFFFFF) ); break; + case 3: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) != (T1ReadLong(searchMem, i) & 0x00FFFFFF) ); break; + default: res = FALSE; break; } + if ( res ) + { + searchStatMem[addr] |= (7<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (0xF<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (0xF< T1ReadLong(mem[t], i)); break; - case 1: res=(T1ReadLong(MMU.MMU_MEM[t][0x20], i) < T1ReadLong(mem[t], i)); break; - case 2: res=(T1ReadLong(MMU.MMU_MEM[t][0x20], i) == T1ReadLong(mem[t], i)); break; - case 3: res=(T1ReadLong(MMU.MMU_MEM[t][0x20], i) != T1ReadLong(mem[t], i)); break; - default: res = FALSE; break; - } - if ( res ) - { - stat[t][addr] |= (0xF< T1ReadLong(searchMem, i)); break; + case 1: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) < T1ReadLong(searchMem, i)); break; + case 2: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == T1ReadLong(searchMem, i)); break; + case 3: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) != T1ReadLong(searchMem, i)); break; + default: res = FALSE; break; } + if ( res ) + { + searchStatMem[addr] |= (0xF<> 3); + u32 offs = (i % 8); + if (searchStatMem[addr] & (1<> 3); - u32 offs = (i % 8); - if (stat[t][addr] & (1< 0x400000) + { + EnableWindow(GetDlgItem(dialog, IDOK), FALSE); + return TRUE; + } + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + tempCheat.hi[0] = val; + } + return TRUE; + } + + case IDC_EDIT2: // value + { + if (HIWORD(wparam) == EN_UPDATE) + { + GetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf, 10); + GetWindowText(GetDlgItem(dialog, IDC_EDIT1), buf2, 8); + if ( (strlen(buf2) < 6) || (!strlen(buf)) ) + { + EnableWindow(GetDlgItem(dialog, IDOK), FALSE); + return TRUE; + } + + u32 val = atol(buf); + if (val > searchRange[tempCheat.size][1]) + { + EnableWindow(GetDlgItem(dialog, IDOK), FALSE); + return TRUE; + } + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + tempCheat.lo[0] = val; + } + return TRUE; + } + + case IDC_EDIT3: // description + { + if (HIWORD(wparam) == EN_UPDATE) + GetWindowText(GetDlgItem(dialog, IDC_EDIT3), tempCheat.description, 75); + return TRUE; + } + + case IDC_RADIO1: // 1 byte + tempCheat.size = 0; + return TRUE; + case IDC_RADIO2: // 2 bytes + tempCheat.size = 1; + return TRUE; + case IDC_RADIO3: // 3 bytes + tempCheat.size = 2; + return TRUE; + case IDC_RADIO4: // 4 bytes + tempCheat.size = 3; + return TRUE; + + case IDC_CHECK1: // freeze + { + if (IsDlgButtonChecked(dialog, IDC_CHECK1) == BST_CHECKED) + tempCheat.enabled = 1; + else + tempCheat.enabled = 0; + } + } + } + } + return FALSE; +} //============================================================================== BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam) { @@ -340,79 +455,114 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar case WM_INITDIALOG: { LV_COLUMN lvColumn; - u8 proc = 0; - u32 address = 0; - u32 val = 0; + u32 address = 0; + u32 val = 0; - cheatListView = GetDlgItem(dialog, IDC_LIST1); + cheatListView = GetDlgItem(dialog, IDC_LIST1); - ListView_SetExtendedListViewStyle(cheatListView, LVS_EX_FULLROWSELECT); - - memset(&lvColumn,0,sizeof(LV_COLUMN)); - lvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT; - - lvColumn.fmt=LVCFMT_CENTER; - lvColumn.cx=20; - lvColumn.pszText="X"; - ListView_InsertColumn(cheatListView, 0, &lvColumn); + ListView_SetExtendedListViewStyle(cheatListView, LVS_EX_FULLROWSELECT | LVS_EX_TWOCLICKACTIVATE); + + memset(&lvColumn,0,sizeof(LV_COLUMN)); + lvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT; - lvColumn.fmt=LVCFMT_LEFT; - lvColumn.cx=84; - lvColumn.pszText="Address"; - ListView_InsertColumn(cheatListView, 1, &lvColumn); - lvColumn.cx=100; - lvColumn.pszText="Value"; - ListView_InsertColumn(cheatListView, 2, &lvColumn); - lvColumn.cx=200; - lvColumn.pszText="Description"; - ListView_InsertColumn(cheatListView, 3, &lvColumn); - lvColumn.fmt=LVCFMT_CENTER; - lvColumn.cx=45; - lvColumn.pszText="CPU"; - ListView_InsertColumn(cheatListView, 4, &lvColumn); + lvColumn.fmt=LVCFMT_CENTER; + lvColumn.cx=20; + lvColumn.pszText="X"; + ListView_InsertColumn(cheatListView, 0, &lvColumn); - LVITEM lvi; - memset(&lvi,0,sizeof(LVITEM)); - lvi.mask = LVIF_TEXT|LVIF_STATE; - lvi.iItem = INT_MAX; + lvColumn.fmt=LVCFMT_LEFT; + lvColumn.cx=84; + lvColumn.pszText="Address"; + ListView_InsertColumn(cheatListView, 1, &lvColumn); + lvColumn.cx=100; + lvColumn.pszText="Value"; + ListView_InsertColumn(cheatListView, 2, &lvColumn); + lvColumn.cx=245; + lvColumn.pszText="Description"; + ListView_InsertColumn(cheatListView, 3, &lvColumn); + lvColumn.fmt=LVCFMT_CENTER; - - cheatsGetListReset(); - SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)FALSE,0); - while (cheatsGetList(&tempCheat)) - { - char buf[256]; - if (tempCheat.enabled) - lvi.pszText= "X"; - else - lvi.pszText= ""; - u32 row = ListView_InsertItem(cheatListView, &lvi); - wsprintf(buf, "0x02%06X", tempCheat.hi[0]); - ListView_SetItemText(cheatListView, row, 1, buf); - ltoa(tempCheat.lo[0], buf, 10); - ListView_SetItemText(cheatListView, row, 2, buf); - ListView_SetItemText(cheatListView, row, 3, tempCheat.description); - ListView_SetItemText(cheatListView, row, 4, NAME_CPUs[tempCheat.proc]); - } - SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)TRUE,0); + LVITEM lvi; + memset(&lvi,0,sizeof(LVITEM)); + lvi.mask = LVIF_TEXT|LVIF_STATE; + lvi.iItem = INT_MAX; - ListView_SetItemState(searchListView,0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); - SetFocus(searchListView); + cheatsGetListReset(); + SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)FALSE,0); + while (cheatsGetList(&tempCheat)) + { + char buf[256]; + if (tempCheat.enabled) + lvi.pszText= "X"; + else + lvi.pszText= ""; + u32 row = ListView_InsertItem(cheatListView, &lvi); + wsprintf(buf, "0x02%06X", tempCheat.hi[0]); + ListView_SetItemText(cheatListView, row, 1, buf); + ltoa(tempCheat.lo[0], buf, 10); + ListView_SetItemText(cheatListView, row, 2, buf); + ListView_SetItemText(cheatListView, row, 3, tempCheat.description); + } + SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)TRUE,0); + + ListView_SetItemState(searchListView,0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); + SetFocus(searchListView); return TRUE; } - + + case WM_NOTIFY: + if (wparam == IDC_LIST1) + { + LPNMHDR tmp_msg = (LPNMHDR)lparam; + if ( tmp_msg->code == LVN_ITEMACTIVATE ) + { + cheatEditPos = ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED); + cheatsGet(&tempCheat, cheatEditPos); + tempCheat.enabled = !tempCheat.enabled; + cheatsUpdate(tempCheat.size, tempCheat.hi[0], tempCheat.lo[0], tempCheat.description, tempCheat.enabled, cheatEditPos); + if (tempCheat.enabled) + ListView_SetItemText(cheatListView, cheatEditPos, 0, "X") + else + ListView_SetItemText(cheatListView, cheatEditPos, 0, ""); + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + } + + if ( tmp_msg->code == NM_CLICK ) + { + if (ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED) != -1) + { + EnableWindow(GetDlgItem(dialog, IDC_BEDIT), TRUE); + EnableWindow(GetDlgItem(dialog, IDC_BREMOVE), TRUE); + } + else + { + EnableWindow(GetDlgItem(dialog, IDC_BEDIT), FALSE); + EnableWindow(GetDlgItem(dialog, IDC_BREMOVE), FALSE); + } + } + + return TRUE; + } + return FALSE; + case WM_COMMAND: { switch (LOWORD(wparam)) { case IDOK: + if (cheatsSave()) + { + EndDialog(dialog, TRUE); + } + else + MessageBox(dialog, "Can't save cheats to file","Error",MB_OK); + return TRUE; case IDCANCEL: EndDialog(dialog, FALSE); return TRUE; case IDC_BADD: { - searchAddProc = 0; searchAddAddress = 0;; searchAddValue = 0; searchAddMode = 0; @@ -436,12 +586,44 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar ltoa(searchAddValue, buf, 10); ListView_SetItemText(cheatListView, row, 2, buf); ListView_SetItemText(cheatListView, row, 3, editBuf[2]); - ListView_SetItemText(cheatListView, row, 4, NAME_CPUs[searchAddProc]); EnableWindow(GetDlgItem(dialog, IDOK), TRUE); } } return TRUE; + + case IDC_BEDIT: + { + cheatEditPos = ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED); + if (cheatEditPos > cheatsGetSize()) return TRUE; + if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD), dialog, (DLGPROC) CheatsEditProc)) + { + char buf[256]; + cheatsGet(&tempCheat, cheatEditPos); + wsprintf(buf, "0x02%06X", tempCheat.hi[0]); + ListView_SetItemText(cheatListView, cheatEditPos, 1, buf); + ltoa(tempCheat.lo[0], buf, 10); + ListView_SetItemText(cheatListView, cheatEditPos, 2, buf); + ListView_SetItemText(cheatListView, cheatEditPos, 3, tempCheat.description); + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + } + } + return TRUE; + + case IDC_BREMOVE: + { + int tmp_pos = ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED); + if (tmp_pos != -1) + { + if (cheatsRemove(tmp_pos)) + { + ListView_DeleteItem(cheatListView, tmp_pos); + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + } + } + + } + return TRUE; } break; } @@ -484,6 +666,7 @@ BOOL CALLBACK CheatsSearchExactWnd(HWND dialog, UINT msg,WPARAM wparam,LPARAM lp SetWindowText(GetDlgItem(dialog, IDC_STATIC_RANGE), searchRangeText[searchSign][searchSize]); oldEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(dialog, IDC_EVALUE), GWLP_WNDPROC, (LONG)EditValueProc); char buf[256]; + memset(buf, 0, 256); ltoa(searchNumberResults, buf, 10); SetWindowText(GetDlgItem(dialog, IDC_SNUMBER), buf); SetFocus(GetDlgItem(dialog, IDC_EVALUE)); @@ -588,7 +771,6 @@ BOOL CALLBACK CheatsSearchViewWnd(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpa case WM_INITDIALOG: { LV_COLUMN lvColumn; - u8 proc = 0; u32 address = 0; u32 val = 0; @@ -598,17 +780,13 @@ BOOL CALLBACK CheatsSearchViewWnd(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpa memset(&lvColumn,0,sizeof(LV_COLUMN)); lvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT; - lvColumn.fmt=LVCFMT_CENTER; - lvColumn.cx=40; - lvColumn.pszText="CPU"; - ListView_InsertColumn(searchListView, 0, &lvColumn); lvColumn.fmt=LVCFMT_LEFT; - lvColumn.cx=84; + lvColumn.cx=94; lvColumn.pszText="Address"; - ListView_InsertColumn(searchListView, 1, &lvColumn); - lvColumn.cx=100; + ListView_InsertColumn(searchListView, 0, &lvColumn); + lvColumn.cx=130; lvColumn.pszText="Value"; - ListView_InsertColumn(searchListView, 2, &lvColumn); + ListView_InsertColumn(searchListView, 1, &lvColumn); LVITEM lvi; memset(&lvi,0,sizeof(LVITEM)); @@ -617,16 +795,14 @@ BOOL CALLBACK CheatsSearchViewWnd(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpa cheatSearchGetListReset(); SendMessage(searchListView, WM_SETREDRAW, (WPARAM)FALSE,0); - while (cheatSearchGetList(&proc, &address, &val)) + while (cheatSearchGetList(&address, &val)) { char buf[256]; - char buf2[256]; wsprintf(buf, "0x02%06X", address); - _ltoa(val, buf2, 10); - lvi.pszText= NAME_CPUs[proc]; + lvi.pszText= buf; u32 row = SendMessage(searchListView, LVM_INSERTITEM, 0, (LPARAM)&lvi); + _ltoa(val, buf, 10); ListView_SetItemText(searchListView, row, 1, buf); - ListView_SetItemText(searchListView, row, 2, buf2); } SendMessage(searchListView, WM_SETREDRAW, (WPARAM)TRUE,0); ListView_SetItemState(searchListView,0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); @@ -646,12 +822,10 @@ BOOL CALLBACK CheatsSearchViewWnd(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpa u32 val = 0; char buf[12]; u32 pos = ListView_GetNextItem(searchListView, -1, LVNI_SELECTED|LVNI_FOCUSED); - ListView_GetItemText(searchListView, pos, 0, buf, 4); - searchAddProc = (buf[3] == '7'); - ListView_GetItemText(searchListView, pos, 1, buf, 12); + ListView_GetItemText(searchListView, pos, 0, buf, 12); sscanf_s(buf, "%x", &val); searchAddAddress = val & 0x00FFFFFF; - ListView_GetItemText(searchListView, pos, 2, buf, 12); + ListView_GetItemText(searchListView, pos, 1, buf, 12); searchAddValue = atol(buf); searchAddMode = 1; searchAddSize = searchSize; diff --git a/desmume/src/windows/cheatsWin.h b/desmume/src/windows/cheatsWin.h index 03d8542c0..7dc10bf89 100644 --- a/desmume/src/windows/cheatsWin.h +++ b/desmume/src/windows/cheatsWin.h @@ -2,7 +2,6 @@ yopyop156@ifrance.com yopyop156.ifrance.com - Copyright 2009 CrazyMax Copyright 2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index fe2d9c992..df25c9fec 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -272,7 +272,6 @@ #define IDC_LIST 1069 #define IDC_SNUMBER 1071 #define IDC_CHECK1 1074 -#define IDC_RADIO9 1075 #define IDM_FIRMSETTINGS 1100 #define IDD_FIRMSETTINGS 1101 #define IDC_EDIT1 1102 diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index d6b56fe09..2d87c0bc3 100644 --- a/desmume/src/windows/resources.rc +++ b/desmume/src/windows/resources.rc @@ -1,4 +1,4 @@ -// Generated by ResEdit 1.4.4.18 +// Generated by ResEdit 1.4.4.19 // Copyright (C) 2006-2008 // http://www.resedit.net @@ -667,32 +667,30 @@ END LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDD_CHEAT_ADD DIALOGEX 0, 0, 121, 207 +IDD_CHEAT_ADD DIALOGEX 0, 0, 121, 192 STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Add cheat" FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN EDITTEXT IDC_EDIT1, 26, 17, 88, 14, ES_AUTOHSCROLL - EDITTEXT IDC_EDIT2, 7, 53, 107, 14, ES_AUTOHSCROLL - EDITTEXT IDC_EDIT3, 7, 78, 107, 30, ES_MULTILINE - AUTOCHECKBOX "freeze value", IDC_CHECK1, 47, 112, 67, 10, BS_AUTOCHECKBOX - AUTORADIOBUTTON "1 byte", IDC_RADIO1, 9, 135, 37, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON - AUTORADIOBUTTON "2 bytes", IDC_RADIO2, 9, 145, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON - AUTORADIOBUTTON "3 bytes", IDC_RADIO3, 9, 156, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON - AUTORADIOBUTTON "4 bytes", IDC_RADIO4, 9, 167, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON - DEFPUSHBUTTON "Add", IDOK, 7, 186, 50, 14, WS_DISABLED | BS_DEFPUSHBUTTON - PUSHBUTTON "Cancel", IDCANCEL, 64, 186, 50, 14, BS_PUSHBUTTON - AUTORADIOBUTTON "ARM9", IDC_RADIO8, 23, 34, 35, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON - AUTORADIOBUTTON "ARM7", IDC_RADIO9, 64, 34, 35, 10, WS_TABSTOP | BS_AUTORADIOBUTTON + EDITTEXT IDC_EDIT2, 7, 42, 107, 14, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT3, 7, 67, 107, 30, ES_MULTILINE + AUTOCHECKBOX "freeze value", IDC_CHECK1, 47, 101, 67, 10, BS_AUTOCHECKBOX + AUTORADIOBUTTON "1 byte", IDC_RADIO1, 9, 124, 37, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON + AUTORADIOBUTTON "2 bytes", IDC_RADIO2, 9, 134, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON + AUTORADIOBUTTON "3 bytes", IDC_RADIO3, 9, 145, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON + AUTORADIOBUTTON "4 bytes", IDC_RADIO4, 9, 156, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON + DEFPUSHBUTTON "Add", IDOK, 7, 175, 50, 14, WS_DISABLED | BS_DEFPUSHBUTTON + PUSHBUTTON "Cancel", IDCANCEL, 64, 175, 50, 14, BS_PUSHBUTTON LTEXT "Address:", IDC_STATIC, 9, 9, 30, 8, SS_LEFT - LTEXT "Value:", IDC_STATIC, 9, 45, 21, 8, SS_LEFT - LTEXT "Description:", IDC_STATIC, 9, 70, 39, 8, SS_LEFT + LTEXT "Value:", IDC_STATIC, 9, 34, 21, 8, SS_LEFT + LTEXT "Description:", IDC_STATIC, 9, 59, 39, 8, SS_LEFT LTEXT "0x02", IDC_STATIC, 7, 19, 17, 8, SS_LEFT - GROUPBOX " Select size ", IDC_STATIC, 7, 125, 107, 57 - LTEXT "[0..255]", IDC_STATIC_S1, 53, 135, 60, 8, SS_LEFT - LTEXT "[0..65535]", IDC_STATIC_S2, 53, 145, 60, 8, SS_LEFT - LTEXT "[0..16777215]", IDC_STATIC_S3, 53, 156, 58, 8, SS_LEFT - LTEXT "[0..4294967295]", IDC_STATIC_S4, 53, 166, 59, 8, SS_LEFT + GROUPBOX " Select size ", IDC_STATIC, 7, 114, 107, 57 + LTEXT "[0..255]", IDC_STATIC_S1, 53, 124, 60, 8, SS_LEFT + LTEXT "[0..65535]", IDC_STATIC_S2, 53, 134, 60, 8, SS_LEFT + LTEXT "[0..16777215]", IDC_STATIC_S3, 53, 145, 58, 8, SS_LEFT + LTEXT "[0..4294967295]", IDC_STATIC_S4, 53, 155, 59, 8, SS_LEFT END @@ -804,7 +802,7 @@ BEGIN AUTORADIOBUTTON "3 bytes", IDC_RADIO3, 9, 31, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON AUTORADIOBUTTON "4 bytes", IDC_RADIO4, 9, 42, 40, 10, WS_TABSTOP | BS_AUTORADIOBUTTON AUTORADIOBUTTON "Unsigned", IDC_RADIO5, 9, 74, 45, 10, WS_GROUP | WS_TABSTOP | BS_AUTORADIOBUTTON - AUTORADIOBUTTON "Signed", IDC_RADIO6, 9, 85, 37, 10, WS_TABSTOP | BS_AUTORADIOBUTTON + AUTORADIOBUTTON "Signed", IDC_RADIO6, 9, 85, 37, 10, WS_TABSTOP | WS_DISABLED | BS_AUTORADIOBUTTON GROUPBOX " Select size ", IDC_STATIC, 7, 0, 164, 57 GROUPBOX " Sign ", IDC_STATIC, 7, 62, 164, 37 GROUPBOX " Select search type ", IDC_STATIC, 7, 104, 164, 33