diff --git a/desmume/src/cheatSystem.cpp b/desmume/src/cheatSystem.cpp index b4be260aa..2ed65cea2 100644 --- a/desmume/src/cheatSystem.cpp +++ b/desmume/src/cheatSystem.cpp @@ -28,6 +28,8 @@ #include "MMU.h" #include "debug.h" +//#define AR_DISASM 1 + static CHEATS_LIST cheats[MAX_CHEAT_LIST]; static u16 cheatsNum = 0; static u8 cheatFilename[MAX_PATH]; @@ -83,14 +85,207 @@ BOOL cheatsUpdate(u8 size, u32 address, u32 val, char *description, BOOL enabled return TRUE; } +#ifdef AR_DISASM +void cheatsDisassemble_AR(u32 hi, u32 lo) +{ + u8 type = (hi >> 28); + u32 hi_save = hi; + + hi &= 0x0FFFFFFF; + + switch (type) + { + case 0x00: + if (hi==0) + INFO("AR: manual hook\n"); + else + if ((hi==0x0000AA99) && (lo=0)) + INFO("AR: parameter bytes 9..10 for above code (padded with 00s)\n"); + else + INFO("AR: word [%07X+%07X] = %08X\n", hi, 0, lo); + break; + case 0x01: INFO("AR: half [%07X+%07X] = %04X\n", hi, 0, lo); break; + case 0x02: INFO("AR: byte [%07X+%07X] = %02X\n", hi, 0, lo); break; + case 0x03: INFO("AR: IF %08X > word[%07X] ; unsigned\n", lo, hi); break; + case 0x04: + { + if ((hi == 04332211) && (lo == 88776655)) + { + INFO("AR: parameter bytes 1..8 for above code (example)\n"); + } + else + INFO("AR: IF %08X < word[%07X] ; unsigned\n", lo, hi); + } + break; + case 0x05: INFO("AR: IF %08X = word[%07X]\n", lo, hi); break; + case 0x06: INFO("AR: IF %08X <> word[%07X]\n", lo, hi); break; + case 0x07: INFO("AR: IF %04X > ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break; + case 0x08: INFO("AR: IF %04X < ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break; + case 0x09: INFO("AR: IF %04X = ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break; + case 0x0A: INFO("AR: IF %04X <> ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break; + case 0x0B: INFO("AR: offset = word[%07X + %07X]\n", hi, 0); break; + case 0x0C: + { + switch (hi >> 24) + { + case 0x0:INFO("AR: FOR loopcount=0 to %08X ;execute %08X times\n", lo, (lo+1)); break; + case 0x2:INFO("AR: offset = address of the C4000000 code ???\n");break; + case 0x5:INFO("AR: counter=counter+1, IF (counter AND YYY) = XXX\n");break; + case 0x6:INFO("AR: [%07X]=%07 (offset)\n", hi, 0);break; + default: INFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break; + } + } + break; + + case 0x0D: + { + switch (hi >> 24) + { + case 0x0:INFO("AR: ENDIF\n");break; + case 0x1:INFO("AR: NEXT loopcount\n");break; + case 0x2:INFO("AR: NEXT loopcount & Flush\n");break; + case 0x3:INFO("AR: offset = %07X\n", hi);break; + case 0x4:INFO("AR: datareg = datareg + %07X\n", hi);break; + case 0x5:INFO("AR: datareg = %07X\n",hi);break; + case 0x6:INFO("AR: \n");break; + case 0x7:INFO("AR: \n");break; + case 0x8:INFO("AR: \n");break; + case 0x9:INFO("AR: \n");break; + case 0xA:INFO("AR: \n");break; + case 0xB:INFO("AR: \n");break; + case 0xC:INFO("AR: \n");break; + default: INFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break; + } + } + break; + case 0x0E: INFO("AR: copy %08X parameter bytes to [%08X + %07X...]\n", lo, hi, 0); break; + case 0x0F: INFO("AR: copy %08X bytes from [%07X...] to [%07X...]\n", lo, 0, hi); break; + default: INFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break; + } +} +#endif + +void cheats_ARparser(CHEATS_LIST cheat) +{ + for (int i=0; i < cheat.num; i++) + { +#ifdef AR_DISASM + cheatsDisassemble_AR(cheat.hi[i], cheat.lo[i]); +#endif + } +} + +BOOL cheatsXXcodePreparser(CHEATS_LIST *cheat, char *code) +{ + u16 count = 0; + u16 t = 0; + char tmp_buf[sizeof(cheat->hi)+sizeof(cheat->lo)]; + + memset(tmp_buf, 0, sizeof(tmp_buf)); + // remove wrong chars + for (int i=0; i < strlen(code); i++) + { + switch (code[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'a': + case 'B': + case 'b': + case 'C': + case 'c': + case 'D': + case 'd': + case 'E': + case 'e': + case 'F': + case 'f': + tmp_buf[t] = code[i]; + t++; + break; + } + } + + if ((strlen(tmp_buf) % 8) != 0) return FALSE; // error + if ((strlen(tmp_buf) % 16) != 0) return FALSE; // error + + // TODO: syntax check + count = (strlen(tmp_buf) / 16); + for (int i=0; i < count; i++) + { + char buf[8] = {0}; + strncpy(buf, tmp_buf+(i*16), 8); + sscanf_s(buf, "%x", &cheat->hi[i]); + strncpy(buf, tmp_buf+(i*16) + 8, 8); + sscanf_s(buf, "%x", &cheat->lo[i]); + } + + cheat->num = count; + cheat->size = 0; + return TRUE; +} + BOOL cheatsAdd_AR(char *code, char *description, BOOL enabled) { - return FALSE; + if (cheatsNum == MAX_CHEAT_LIST) return FALSE; + + if (!cheatsXXcodePreparser(&cheats[cheatsNum], code)) return FALSE; + + cheats[cheatsNum].type = 1; + + strcpy(cheats[cheatsNum].description, description); + cheats[cheatsNum].enabled = enabled; + cheatsNum++; + return TRUE; +} + +BOOL cheatsUpdate_AR(char *code, char *description, BOOL enabled, u32 pos) +{ + if (pos > cheatsNum) return FALSE; + + if (!cheatsXXcodePreparser(&cheats[pos], code)) return FALSE; + + cheats[pos].type = 1; + + strcpy(cheats[pos].description, description); + cheats[pos].enabled = enabled; + return TRUE; } BOOL cheatsAdd_CB(char *code, char *description, BOOL enabled) { - return FALSE; + if (cheatsNum == MAX_CHEAT_LIST) return FALSE; + + if (!cheatsXXcodePreparser(&cheats[cheatsNum], code)) return FALSE; + + cheats[cheatsNum].type = 2; + + strcpy(cheats[cheatsNum].description, description); + cheats[cheatsNum].enabled = enabled; + cheatsNum++; + return TRUE; +} + +BOOL cheatsUpdate_CB(char *code, char *description, BOOL enabled, u32 pos) +{ + if (pos > cheatsNum) return FALSE; + + if (!cheatsXXcodePreparser(&cheats[pos], code)) return FALSE; + + cheats[pos].type = 2; + + strcpy(cheats[pos].description, description); + cheats[pos].enabled = enabled; + return TRUE; } BOOL cheatsRemove(u32 pos) @@ -157,9 +352,10 @@ BOOL cheatsSave() if (cheats[i].num > 0) { + fprintf(fcheat, "Data="); for (int t = 0; t < cheats[i].num; t++) { - fprintf(fcheat, "Data=%08X%08X", cheats[i].hi[t], cheats[i].lo[t]); + fprintf(fcheat, "%08X%08X", cheats[i].hi[t], cheats[i].lo[t]); if (t < (cheats[i].num - 1)) fputs(",", fcheat); } fputs("\n", fcheat); @@ -230,6 +426,8 @@ BOOL cheatsLoad() offs+=8; strncpy(tmp_buf, (char *)buf+offs, 8); sscanf_s(tmp_buf, "%x", &cheats[last].lo[j]); + offs+=8; + if (buf[offs] != ',') continue; //error offs++; // skip comma } } @@ -305,6 +503,7 @@ void cheatsProcess() break; case 1: // Action Replay + cheats_ARparser(cheats[i]); break; case 2: // Codebreaker break; @@ -313,6 +512,17 @@ void cheatsProcess() } } +void cheatGetXXcodeString(CHEATS_LIST cheat, char *res_buf) +{ + char buf[50] = { 0 }; + + for (int i=0; i < cheat.num; i++) + { + sprintf(buf, "%08X %08X\n", cheat.hi[i], cheat.lo[i]); + strcat(res_buf, buf); + } +} + // ========================================== search u8 *searchStatMem = NULL; u8 *searchMem = NULL; diff --git a/desmume/src/cheatSystem.h b/desmume/src/cheatSystem.h index a9fb62333..616de6a5c 100644 --- a/desmume/src/cheatSystem.h +++ b/desmume/src/cheatSystem.h @@ -45,7 +45,9 @@ extern void cheatsInit(char *path); extern BOOL cheatsAdd(u8 size, u32 address, u32 val, char *description, BOOL enabled); extern BOOL cheatsUpdate(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos); extern BOOL cheatsAdd_AR(char *code, char *description, BOOL enabled); +extern BOOL cheatsUpdate_AR(char *code, char *description, BOOL enabled, u32 pos); extern BOOL cheatsAdd_CB(char *code, char *description, BOOL enabled); +extern BOOL cheatsUpdate_CB(char *code, char *description, BOOL enabled, u32 pos); extern BOOL cheatsRemove(u32 pos); extern void cheatsGetListReset(); extern BOOL cheatsGetList(CHEATS_LIST *cheat); @@ -57,6 +59,7 @@ extern BOOL cheatsPush(); extern BOOL cheatsPop(); extern void cheatsStackClear(); extern void cheatsProcess(); +extern void cheatGetXXcodeString(CHEATS_LIST cheat, char *res_buf); // ==================================================== cheat search extern void cheatsSearchInit(u8 type, u8 size, u8 sign); diff --git a/desmume/src/windows/cheatsWin.cpp b/desmume/src/windows/cheatsWin.cpp index bd04d9b5d..085b61841 100644 --- a/desmume/src/windows/cheatsWin.cpp +++ b/desmume/src/windows/cheatsWin.cpp @@ -45,6 +45,8 @@ static u8 searchAddFreeze = 1; static u8 searchAddSize = 0; static char editBuf[3][75] = { 0 }; static u32 cheatEditPos = 0; +static u8 cheatXXtype = 0; +static u8 cheatXXaction = 0; static HWND searchWnd = NULL; static HWND searchListView = NULL; @@ -447,6 +449,155 @@ BOOL CALLBACK CheatsEditProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam) } return FALSE; } +//============================================================================== Action Replay +BOOL CALLBACK CheatsAdd_XX_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + SendMessage(GetDlgItem(dialog, IDC_EDIT2), EM_FMTLINES, (WPARAM)TRUE, (LPARAM)0); + + if (cheatXXtype == 0) + { + if (cheatXXaction == 0) // add + { + SetWindowText(dialog, "Add Action Replay code"); + tempCheat.enabled = TRUE; + } + else // edit + { + SetWindowText(dialog, "Edit Action Replay code"); + } + } + else + { + if (cheatXXaction == 0) // add + { + SetWindowText(dialog, "Add Codebreaker code"); + tempCheat.enabled = TRUE; + } + else // edit + { + SetWindowText(dialog, "Edit Codebreaker code"); + } + } + + if (cheatXXaction != 0) + { + char buf[sizeof(tempCheat.hi)+sizeof(tempCheat.lo)] = { 0 }; + memset(buf, 0, sizeof(buf)); + + cheatGetXXcodeString(tempCheat, buf); + SetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf); + SetWindowText(GetDlgItem(dialog, IDC_EDIT3), tempCheat.description); + + EnableWindow(GetDlgItem(dialog, IDOK), (strlen(buf) > 16)?TRUE:FALSE); + SetWindowText(GetDlgItem(dialog, IDOK), "Update"); + } + CheckDlgButton(dialog, IDC_CHECK1, tempCheat.enabled?BST_CHECKED:BST_UNCHECKED); + + SendMessage(GetDlgItem(dialog, IDC_EDIT2), EM_SETLIMITTEXT, sizeof(tempCheat.hi)+sizeof(tempCheat.lo), 0); + SendMessage(GetDlgItem(dialog, IDC_EDIT3), EM_SETLIMITTEXT, sizeof(tempCheat.description), 0); + } + return TRUE; + + case WM_COMMAND: + { + switch (LOWORD(wparam)) + { + case IDOK: + { + char buf[sizeof(tempCheat.hi)+sizeof(tempCheat.lo)] = { 0 }; + + memset(buf, 0, sizeof(buf)); + GetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf, sizeof(buf)); + + if (cheatXXtype == 0) // Action Replay + { + if (cheatXXaction == 0) // add + { + if (!cheatsAdd_AR(buf, tempCheat.description, tempCheat.enabled)) + { + MessageBox(dialog, "Syntax error in Action Replay code.\nTry again", "DeSmuME", + MB_OK | MB_ICONERROR); + return FALSE; + } + } + else // edit + { + if (!cheatsUpdate_AR(buf, tempCheat.description, tempCheat.enabled, cheatEditPos)) + { + MessageBox(dialog, "Syntax error in Action Replay code.\nTry again", "DeSmuME", + MB_OK | MB_ICONERROR); + return FALSE; + } + } + } + else + { + if (cheatXXaction == 0) // add + { + if (!cheatsAdd_CB(buf, tempCheat.description, tempCheat.enabled)) + { + MessageBox(dialog, "Syntax error in Codebreaker code.\nTry again", "DeSmuME", + MB_OK | MB_ICONERROR); + return FALSE; + } + } + else // edit + { + if (!cheatsUpdate_CB(buf, tempCheat.description, tempCheat.enabled, cheatEditPos)) + { + MessageBox(dialog, "Syntax error in Codebreaker code.\nTry again", "DeSmuME", + MB_OK | MB_ICONERROR); + return FALSE; + } + } + } + EndDialog(dialog, TRUE); + } + return TRUE; + + case IDCANCEL: + EndDialog(dialog, FALSE); + return TRUE; + + case IDC_EDIT2: // code + if (HIWORD(wparam) == EN_UPDATE) + { + char buf[sizeof(tempCheat.hi)+sizeof(tempCheat.lo)] = { 0 }; + + memset(buf, 0, sizeof(buf)); + GetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf, sizeof(buf)); + if (strlen(buf) < 18) // min size of code "CXXXXXXX YYYYYYYY" + { + EnableWindow(GetDlgItem(dialog, IDOK), FALSE); + return TRUE; + } + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + } + return TRUE; + + case IDC_EDIT3: // description + if (HIWORD(wparam) == EN_UPDATE) + { + memset(tempCheat.description, 0, sizeof(tempCheat.description)); + GetWindowText(GetDlgItem(dialog, IDC_EDIT3), tempCheat.description, sizeof(tempCheat.description)); + } + return TRUE; + + case IDC_CHECK1: + if (IsDlgButtonChecked(dialog, IDC_CHECK1) == BST_CHECKED) + tempCheat.enabled = 1; + else + tempCheat.enabled = 0; + return TRUE; + } + } + } + return FALSE; +} //============================================================================== BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam) { @@ -496,12 +647,37 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar 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); + switch (tempCheat.type) + { + case 0: // Internal + { + 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); + break; + } + + case 1: // Action Replay + { + u32 row = ListView_InsertItem(cheatListView, &lvi); + ListView_SetItemText(cheatListView, row, 1, "Action"); + ListView_SetItemText(cheatListView, row, 2, "Replay"); + ListView_SetItemText(cheatListView, row, 3, tempCheat.description); + break; + } + + case 2: // Codebreaker + { + u32 row = ListView_InsertItem(cheatListView, &lvi); + ListView_SetItemText(cheatListView, row, 1, "Code"); + ListView_SetItemText(cheatListView, row, 2, "breaker"); + ListView_SetItemText(cheatListView, row, 3, tempCheat.description); + break; + } + } } SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)TRUE,0); @@ -592,20 +768,105 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar } return TRUE; + case IDC_BADD_AR: + { + if (LOWORD(wparam) == IDC_BADD_AR) + { + cheatXXtype = 0; + } + else + if (LOWORD(wparam) == IDC_BADD_CB) + { + cheatXXtype = 1; + } + else + return TRUE; + cheatXXaction = 0; // 0 = add + + if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD_XX_CODE), dialog, (DLGPROC) CheatsAdd_XX_Proc)) + { + LVITEM lvi; + + memset(&lvi,0,sizeof(LVITEM)); + lvi.mask = LVIF_TEXT|LVIF_STATE; + lvi.iItem = INT_MAX; + + if (tempCheat.enabled) + lvi.pszText= "X"; + else + lvi.pszText= " "; + u32 row = ListView_InsertItem(cheatListView, &lvi); + if (cheatXXtype == 0) + { + ListView_SetItemText(cheatListView, row, 1, "Action"); + ListView_SetItemText(cheatListView, row, 2, "Replay"); + } + else + { + ListView_SetItemText(cheatListView, row, 1, "Code"); + ListView_SetItemText(cheatListView, row, 2, "breaker"); + } + ListView_SetItemText(cheatListView, row, 3, tempCheat.description); + + 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)) + + cheatsGet(&tempCheat, cheatEditPos); + + switch (tempCheat.type) { - 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); + case 0: // internal + if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD), dialog, (DLGPROC) CheatsEditProc)) + { + char buf[256]; + cheatsGet(&tempCheat, cheatEditPos); + if (tempCheat.enabled) + ListView_SetItemText(cheatListView, cheatEditPos, 0, "X"); + 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); + } + break; + + case 1: // Action replay + case 2: // Codebreaker + if (tempCheat.type == 1) + cheatXXtype = 0; + else + cheatXXtype = 1; + cheatXXaction = 1; // 1 = edit + + if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD_XX_CODE), dialog, (DLGPROC) CheatsAdd_XX_Proc)) + { + cheatsGet(&tempCheat, cheatEditPos); + if (tempCheat.enabled) + ListView_SetItemText(cheatListView, cheatEditPos, 0, "X"); + + if (cheatXXtype == 0) + { + ListView_SetItemText(cheatListView, cheatEditPos, 1, "Action"); + ListView_SetItemText(cheatListView, cheatEditPos, 2, "Replay"); + } + else + { + ListView_SetItemText(cheatListView, cheatEditPos, 1, "Code"); + ListView_SetItemText(cheatListView, cheatEditPos, 2, "breaker"); + } + + ListView_SetItemText(cheatListView, cheatEditPos, 3, tempCheat.description); + EnableWindow(GetDlgItem(dialog, IDOK), TRUE); + } + break; } } return TRUE; diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index 5f26d4430..205811e3a 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -155,6 +155,7 @@ #define IDD_EMULATIONSETTINGS 916 #define IDD_WIFISETTINGS 918 #define IDD_MEM_VIEW 920 +#define IDD_CHEAT_ADD_XX_CODE 921 #define IDC_BGMAP_SEL 1000 #define IDC_BRIDGEADAPTER 1000 #define IDC_EDIT03 1000 @@ -370,9 +371,7 @@ #define IDC_LIGHT_VIEWER_LIGHT1COLOR_COLORCTRL 1312 #define IDD_CHEAT_SEARCH 1312 #define IDC_LIGHT_VIEWER_LIGHT1COLOR_EDIT 1313 -#define IDD_CHEAT_ADD_AR_CODE 1313 #define IDC_LIGHT_VIEWER_LIGHT1VECTOR_EDIT 1314 -#define IDD_CHEAT_ADD_BC_CODE 1314 #define IDC_LIGHT_VIWER_LIGHT2_GROUP 1321 #define IDC_LIGHT_VIEWER_LIGHT2COLOR_COLORCTRL 1322 #define IDC_LIGHT_VIEWER_LIGHT2COLOR_EDIT 1323 diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index 6b1758a9a..64750c94a 100644 --- a/desmume/src/windows/resources.rc +++ b/desmume/src/windows/resources.rc @@ -720,32 +720,15 @@ FONT 8, "MS Shell Dlg", 400, 0, 1 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDD_CHEAT_ADD_AR_CODE DIALOGEX 0, 0, 121, 193 +IDD_CHEAT_ADD_XX_CODE DIALOGEX 0, 0, 121, 193 STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU CAPTION "Add Action Replay code" FONT 8, "MS Shell Dlg", 400, 0, 1 { - EDITTEXT IDC_EDIT2, 7, 17, 107, 97, ES_AUTOHSCROLL + EDITTEXT IDC_EDIT2, 7, 17, 107, 97, WS_VSCROLL | ES_AUTOVSCROLL | ES_UPPERCASE | ES_MULTILINE | ES_WANTRETURN EDITTEXT IDC_EDIT3, 7, 124, 107, 30, ES_MULTILINE AUTOCHECKBOX "turn on code", IDC_CHECK1, 47, 159, 67, 10, BS_AUTOCHECKBOX - DEFPUSHBUTTON "Add", IDOK, 7, 172, 50, 14, BS_DEFPUSHBUTTON - PUSHBUTTON "Cancel", IDCANCEL, 64, 172, 50, 14, BS_PUSHBUTTON - LTEXT "Code:", -1, 7, 7, 20, 8, SS_LEFT - LTEXT "Description:", -1, 9, 116, 39, 8, SS_LEFT -} - - - -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -IDD_CHEAT_ADD_BC_CODE DIALOGEX 0, 0, 121, 193 -STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU -CAPTION "Add Action Replay code" -FONT 8, "MS Shell Dlg", 400, 0, 1 -{ - EDITTEXT IDC_EDIT2, 7, 17, 107, 97, ES_AUTOHSCROLL - EDITTEXT IDC_EDIT3, 7, 124, 107, 30, ES_MULTILINE - AUTOCHECKBOX "turn on code", IDC_CHECK1, 47, 159, 67, 10, BS_AUTOCHECKBOX - DEFPUSHBUTTON "Add", IDOK, 7, 172, 50, 14, BS_DEFPUSHBUTTON + DEFPUSHBUTTON "Add", IDOK, 7, 172, 50, 14, WS_DISABLED | BS_DEFPUSHBUTTON PUSHBUTTON "Cancel", IDCANCEL, 64, 172, 50, 14, BS_PUSHBUTTON LTEXT "Code:", -1, 7, 7, 20, 8, SS_LEFT LTEXT "Description:", -1, 9, 116, 39, 8, SS_LEFT @@ -761,7 +744,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 1 { CONTROL "", IDC_LIST1, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_REPORT, 7, 7, 302, 103 PUSHBUTTON "internal", IDC_BADD, 10, 125, 50, 14, BS_PUSHBUTTON - PUSHBUTTON "Action Replay", IDC_BADD_AR, 66, 125, 67, 14, WS_DISABLED | BS_PUSHBUTTON + PUSHBUTTON "Action Replay", IDC_BADD_AR, 66, 125, 67, 14, BS_PUSHBUTTON PUSHBUTTON "Codebreaker", IDC_BADD_CB, 139, 125, 67, 14, WS_DISABLED | BS_PUSHBUTTON PUSHBUTTON "Edit", IDC_BEDIT, 245, 113, 64, 14, WS_DISABLED | BS_PUSHBUTTON PUSHBUTTON "Remove", IDC_BREMOVE, 246, 129, 63, 14, WS_DISABLED | BS_PUSHBUTTON