- it is now possible to add Action Replay to the cheats (THIS IS ONLY ADD TO CHEATS and NOT EXECUTE AR CODE)
This commit is contained in:
mtabachenko 2009-04-18 12:46:24 +00:00
parent e585142003
commit 654952bcf8
5 changed files with 497 additions and 41 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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