winport:
- 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:
parent
e585142003
commit
654952bcf8
|
@ -28,6 +28,8 @@
|
||||||
#include "MMU.h"
|
#include "MMU.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
//#define AR_DISASM 1
|
||||||
|
|
||||||
static CHEATS_LIST cheats[MAX_CHEAT_LIST];
|
static CHEATS_LIST cheats[MAX_CHEAT_LIST];
|
||||||
static u16 cheatsNum = 0;
|
static u16 cheatsNum = 0;
|
||||||
static u8 cheatFilename[MAX_PATH];
|
static u8 cheatFilename[MAX_PATH];
|
||||||
|
@ -83,14 +85,207 @@ BOOL cheatsUpdate(u8 size, u32 address, u32 val, char *description, BOOL enabled
|
||||||
return TRUE;
|
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)
|
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)
|
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)
|
BOOL cheatsRemove(u32 pos)
|
||||||
|
@ -157,9 +352,10 @@ BOOL cheatsSave()
|
||||||
|
|
||||||
if (cheats[i].num > 0)
|
if (cheats[i].num > 0)
|
||||||
{
|
{
|
||||||
|
fprintf(fcheat, "Data=");
|
||||||
for (int t = 0; t < cheats[i].num; t++)
|
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);
|
if (t < (cheats[i].num - 1)) fputs(",", fcheat);
|
||||||
}
|
}
|
||||||
fputs("\n", fcheat);
|
fputs("\n", fcheat);
|
||||||
|
@ -230,6 +426,8 @@ BOOL cheatsLoad()
|
||||||
offs+=8;
|
offs+=8;
|
||||||
strncpy(tmp_buf, (char *)buf+offs, 8);
|
strncpy(tmp_buf, (char *)buf+offs, 8);
|
||||||
sscanf_s(tmp_buf, "%x", &cheats[last].lo[j]);
|
sscanf_s(tmp_buf, "%x", &cheats[last].lo[j]);
|
||||||
|
offs+=8;
|
||||||
|
if (buf[offs] != ',') continue; //error
|
||||||
offs++; // skip comma
|
offs++; // skip comma
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,6 +503,7 @@ void cheatsProcess()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: // Action Replay
|
case 1: // Action Replay
|
||||||
|
cheats_ARparser(cheats[i]);
|
||||||
break;
|
break;
|
||||||
case 2: // Codebreaker
|
case 2: // Codebreaker
|
||||||
break;
|
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
|
// ========================================== search
|
||||||
u8 *searchStatMem = NULL;
|
u8 *searchStatMem = NULL;
|
||||||
u8 *searchMem = NULL;
|
u8 *searchMem = NULL;
|
||||||
|
|
|
@ -45,7 +45,9 @@ extern void cheatsInit(char *path);
|
||||||
extern BOOL cheatsAdd(u8 size, u32 address, u32 val, char *description, BOOL enabled);
|
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 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 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 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 BOOL cheatsRemove(u32 pos);
|
||||||
extern void cheatsGetListReset();
|
extern void cheatsGetListReset();
|
||||||
extern BOOL cheatsGetList(CHEATS_LIST *cheat);
|
extern BOOL cheatsGetList(CHEATS_LIST *cheat);
|
||||||
|
@ -57,6 +59,7 @@ extern BOOL cheatsPush();
|
||||||
extern BOOL cheatsPop();
|
extern BOOL cheatsPop();
|
||||||
extern void cheatsStackClear();
|
extern void cheatsStackClear();
|
||||||
extern void cheatsProcess();
|
extern void cheatsProcess();
|
||||||
|
extern void cheatGetXXcodeString(CHEATS_LIST cheat, char *res_buf);
|
||||||
|
|
||||||
// ==================================================== cheat search
|
// ==================================================== cheat search
|
||||||
extern void cheatsSearchInit(u8 type, u8 size, u8 sign);
|
extern void cheatsSearchInit(u8 type, u8 size, u8 sign);
|
||||||
|
|
|
@ -45,6 +45,8 @@ static u8 searchAddFreeze = 1;
|
||||||
static u8 searchAddSize = 0;
|
static u8 searchAddSize = 0;
|
||||||
static char editBuf[3][75] = { 0 };
|
static char editBuf[3][75] = { 0 };
|
||||||
static u32 cheatEditPos = 0;
|
static u32 cheatEditPos = 0;
|
||||||
|
static u8 cheatXXtype = 0;
|
||||||
|
static u8 cheatXXaction = 0;
|
||||||
|
|
||||||
static HWND searchWnd = NULL;
|
static HWND searchWnd = NULL;
|
||||||
static HWND searchListView = NULL;
|
static HWND searchListView = NULL;
|
||||||
|
@ -447,6 +449,155 @@ BOOL CALLBACK CheatsEditProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
|
||||||
}
|
}
|
||||||
return FALSE;
|
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)
|
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";
|
lvi.pszText= "X";
|
||||||
else
|
else
|
||||||
lvi.pszText= "";
|
lvi.pszText= "";
|
||||||
|
switch (tempCheat.type)
|
||||||
|
{
|
||||||
|
case 0: // Internal
|
||||||
|
{
|
||||||
u32 row = ListView_InsertItem(cheatListView, &lvi);
|
u32 row = ListView_InsertItem(cheatListView, &lvi);
|
||||||
wsprintf(buf, "0x02%06X", tempCheat.hi[0]);
|
wsprintf(buf, "0x02%06X", tempCheat.hi[0]);
|
||||||
ListView_SetItemText(cheatListView, row, 1, buf);
|
ListView_SetItemText(cheatListView, row, 1, buf);
|
||||||
ltoa(tempCheat.lo[0], buf, 10);
|
ltoa(tempCheat.lo[0], buf, 10);
|
||||||
ListView_SetItemText(cheatListView, row, 2, buf);
|
ListView_SetItemText(cheatListView, row, 2, buf);
|
||||||
ListView_SetItemText(cheatListView, row, 3, tempCheat.description);
|
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);
|
SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)TRUE,0);
|
||||||
|
|
||||||
|
@ -592,14 +768,67 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar
|
||||||
}
|
}
|
||||||
return TRUE;
|
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:
|
case IDC_BEDIT:
|
||||||
{
|
{
|
||||||
cheatEditPos = ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED);
|
cheatEditPos = ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED);
|
||||||
if (cheatEditPos > cheatsGetSize()) return TRUE;
|
if (cheatEditPos > cheatsGetSize()) return TRUE;
|
||||||
|
|
||||||
|
cheatsGet(&tempCheat, cheatEditPos);
|
||||||
|
|
||||||
|
switch (tempCheat.type)
|
||||||
|
{
|
||||||
|
case 0: // internal
|
||||||
if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD), dialog, (DLGPROC) CheatsEditProc))
|
if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD), dialog, (DLGPROC) CheatsEditProc))
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
cheatsGet(&tempCheat, cheatEditPos);
|
cheatsGet(&tempCheat, cheatEditPos);
|
||||||
|
if (tempCheat.enabled)
|
||||||
|
ListView_SetItemText(cheatListView, cheatEditPos, 0, "X");
|
||||||
wsprintf(buf, "0x02%06X", tempCheat.hi[0]);
|
wsprintf(buf, "0x02%06X", tempCheat.hi[0]);
|
||||||
ListView_SetItemText(cheatListView, cheatEditPos, 1, buf);
|
ListView_SetItemText(cheatListView, cheatEditPos, 1, buf);
|
||||||
ltoa(tempCheat.lo[0], buf, 10);
|
ltoa(tempCheat.lo[0], buf, 10);
|
||||||
|
@ -607,6 +836,38 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar
|
||||||
ListView_SetItemText(cheatListView, cheatEditPos, 3, tempCheat.description);
|
ListView_SetItemText(cheatListView, cheatEditPos, 3, tempCheat.description);
|
||||||
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
|
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;
|
return TRUE;
|
||||||
|
|
||||||
|
|
|
@ -155,6 +155,7 @@
|
||||||
#define IDD_EMULATIONSETTINGS 916
|
#define IDD_EMULATIONSETTINGS 916
|
||||||
#define IDD_WIFISETTINGS 918
|
#define IDD_WIFISETTINGS 918
|
||||||
#define IDD_MEM_VIEW 920
|
#define IDD_MEM_VIEW 920
|
||||||
|
#define IDD_CHEAT_ADD_XX_CODE 921
|
||||||
#define IDC_BGMAP_SEL 1000
|
#define IDC_BGMAP_SEL 1000
|
||||||
#define IDC_BRIDGEADAPTER 1000
|
#define IDC_BRIDGEADAPTER 1000
|
||||||
#define IDC_EDIT03 1000
|
#define IDC_EDIT03 1000
|
||||||
|
@ -370,9 +371,7 @@
|
||||||
#define IDC_LIGHT_VIEWER_LIGHT1COLOR_COLORCTRL 1312
|
#define IDC_LIGHT_VIEWER_LIGHT1COLOR_COLORCTRL 1312
|
||||||
#define IDD_CHEAT_SEARCH 1312
|
#define IDD_CHEAT_SEARCH 1312
|
||||||
#define IDC_LIGHT_VIEWER_LIGHT1COLOR_EDIT 1313
|
#define IDC_LIGHT_VIEWER_LIGHT1COLOR_EDIT 1313
|
||||||
#define IDD_CHEAT_ADD_AR_CODE 1313
|
|
||||||
#define IDC_LIGHT_VIEWER_LIGHT1VECTOR_EDIT 1314
|
#define IDC_LIGHT_VIEWER_LIGHT1VECTOR_EDIT 1314
|
||||||
#define IDD_CHEAT_ADD_BC_CODE 1314
|
|
||||||
#define IDC_LIGHT_VIWER_LIGHT2_GROUP 1321
|
#define IDC_LIGHT_VIWER_LIGHT2_GROUP 1321
|
||||||
#define IDC_LIGHT_VIEWER_LIGHT2COLOR_COLORCTRL 1322
|
#define IDC_LIGHT_VIEWER_LIGHT2COLOR_COLORCTRL 1322
|
||||||
#define IDC_LIGHT_VIEWER_LIGHT2COLOR_EDIT 1323
|
#define IDC_LIGHT_VIEWER_LIGHT2COLOR_EDIT 1323
|
||||||
|
|
|
@ -720,32 +720,15 @@ FONT 8, "MS Shell Dlg", 400, 0, 1
|
||||||
|
|
||||||
|
|
||||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
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
|
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
|
||||||
CAPTION "Add Action Replay code"
|
CAPTION "Add Action Replay code"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 1
|
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
|
EDITTEXT IDC_EDIT3, 7, 124, 107, 30, ES_MULTILINE
|
||||||
AUTOCHECKBOX "turn on code", IDC_CHECK1, 47, 159, 67, 10, BS_AUTOCHECKBOX
|
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
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
PUSHBUTTON "Cancel", IDCANCEL, 64, 172, 50, 14, BS_PUSHBUTTON
|
PUSHBUTTON "Cancel", IDCANCEL, 64, 172, 50, 14, BS_PUSHBUTTON
|
||||||
LTEXT "Code:", -1, 7, 7, 20, 8, SS_LEFT
|
LTEXT "Code:", -1, 7, 7, 20, 8, SS_LEFT
|
||||||
LTEXT "Description:", -1, 9, 116, 39, 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
|
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 "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 "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 "Edit", IDC_BEDIT, 245, 113, 64, 14, WS_DISABLED | BS_PUSHBUTTON
|
||||||
PUSHBUTTON "Remove", IDC_BREMOVE, 246, 129, 63, 14, WS_DISABLED | BS_PUSHBUTTON
|
PUSHBUTTON "Remove", IDC_BREMOVE, 246, 129, 63, 14, WS_DISABLED | BS_PUSHBUTTON
|
||||||
|
|
Loading…
Reference in New Issue