- many fixes in cheat system (core & winport);

winport:
- added edit, remove & toggle on/off cheat in list;
This commit is contained in:
mtabachenko 2009-03-24 20:16:56 +00:00
parent 2e51fcbf1f
commit ab97b6c349
7 changed files with 510 additions and 364 deletions

View File

@ -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<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (1<<offs))
if ( T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == val )
{
if ( T1ReadByte(MMU.MMU_MEM[t][0x20], i) == val )
{
stat[t][addr] |= (1<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(1<<offs);
searchStatMem[addr] |= (1<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(1<<offs);
}
}
break;
case 1: // 2 bytes
for (u32 t = 0; t < 2; t++)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=2)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=2)
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (3<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (3<<offs))
if ( T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == val )
{
if ( T1ReadWord(MMU.MMU_MEM[t][0x20], i) == val )
{
stat[t][addr] |= (3<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(3<<offs);
searchStatMem[addr] |= (3<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(3<<offs);
}
}
break;
case 2: // 3 bytes
for (u32 t = 0; t < 2; t++)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=3)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=3)
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (0x7<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (0x7<<offs))
if ( (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) == val )
{
if ( (T1ReadLong(MMU.MMU_MEM[t][0x20], i) & 0x00FFFFFF) == val )
{
stat[t][addr] |= (0x7<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(0x7<<offs);
searchStatMem[addr] |= (0x7<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(0x7<<offs);
}
}
break;
case 3: // 4 bytes
for (u32 t = 0; t < 2; t++)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=4)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=4)
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (0xF<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (0xF<<offs))
if ( T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) == val )
{
if ( T1ReadLong(MMU.MMU_MEM[t][0x20], i) == val )
{
stat[t][addr] |= (0xF<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(0xF<<offs);
searchStatMem[addr] |= (0xF<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(0xF<<offs);
}
}
break;
}
@ -445,8 +443,6 @@ u32 cheatsSearchValue(u32 val)
u32 cheatsSearchComp(u8 comp)
{
u8 *mem[2] = {searchMemARM9, searchMemARM7};
u8 *stat[2] = {searchStatMemARM9, searchStatMemARM7};
BOOL res = FALSE;
searchNumber = 0;
@ -454,116 +450,111 @@ u32 cheatsSearchComp(u8 comp)
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<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (1<<offs))
switch (comp)
{
switch (comp)
{
case 0: res=(T1ReadByte(MMU.MMU_MEM[t][0x20], i) > 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<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(1<<offs);
case 0: res=(T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) > 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<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(1<<offs);
}
}
break;
case 1: // 2 bytes
for (u32 t = 0; t < 2; t++)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=2)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=2)
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (3<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (3<<offs))
switch (comp)
{
switch (comp)
{
case 0: res=(T1ReadWord(MMU.MMU_MEM[t][0x20], i) > 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<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(3<<offs);
case 0: res=(T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) > 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<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(3<<offs);
}
}
break;
case 2: // 3 bytes
for (u32 t = 0; t < 2; t++)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=3)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=3)
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (7<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (7<<offs))
switch (comp)
{
switch (comp)
{
case 0: res=((T1ReadLong(MMU.MMU_MEM[t][0x20], i) & 0x00FFFFFF) > (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<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(7<<offs);
case 0: res=((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF) > (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<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(7<<offs);
}
}
break;
case 3: // 4 bytes
for (u32 t = 0; t < 2; t++)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=4)
for (u32 i = 0; i < (4 * 1024 * 1024); i+=4)
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (0xF<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (0xF<<offs))
switch (comp)
{
switch (comp)
{
case 0: res=(T1ReadLong(MMU.MMU_MEM[t][0x20], i) > 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<<offs);
searchNumber++;
continue;
}
stat[t][addr] &= ~(0xF<<offs);
case 0: res=(T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) > 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<<offs);
searchNumber++;
continue;
}
searchStatMem[addr] &= ~(0xF<<offs);
}
}
break;
}
memcpy(searchMemARM9, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) );
memcpy(searchMemARM7, MMU.MMU_MEM[1][0x20], ( 4 * 1024 * 1024 ) );
memcpy(searchMem, MMU.MMU_MEM[0][0x20], ( 4 * 1024 * 1024 ) );
return (searchNumber);
}
@ -573,41 +564,32 @@ u32 cheatSearchNumber()
return (searchNumber);
}
BOOL cheatSearchGetList(u8 *proc, u32 *address, u32 *curVal)
BOOL cheatSearchGetList(u32 *address, u32 *curVal)
{
u8 *stat[2] = {searchStatMemARM9, searchStatMemARM7};
for (u32 t = searchLastRecordProc; t < 2; t++)
for (u32 i = searchLastRecord; i < (4 * 1024 * 1024); i++)
{
for (u32 i = searchLastRecord; i < (4 * 1024 * 1024); i++)
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (searchStatMem[addr] & (1<<offs))
{
u32 addr = (i >> 3);
u32 offs = (i % 8);
if (stat[t][addr] & (1<<offs))
*address = i;
searchLastRecord = i+1;
switch (searchSize)
{
*proc = t;
*address = i;
searchLastRecord = i+1;
switch (searchSize)
{
case 0: *curVal=(u32)T1ReadByte(MMU.MMU_MEM[t][0x20], i); return TRUE;
case 1: *curVal=(u32)T1ReadWord(MMU.MMU_MEM[t][0x20], i); return TRUE;
case 2: *curVal=(u32)T1ReadLong(MMU.MMU_MEM[t][0x20], i) & 0x00FFFFFF; return TRUE;
case 3: *curVal=(u32)T1ReadLong(MMU.MMU_MEM[t][0x20], i); return TRUE;
default: return TRUE;
}
case 0: *curVal=(u32)T1ReadByte(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i); return TRUE;
case 1: *curVal=(u32)T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i); return TRUE;
case 2: *curVal=(u32)T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i) & 0x00FFFFFF; return TRUE;
case 3: *curVal=(u32)T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x20], i); return TRUE;
default: return TRUE;
}
}
searchLastRecordProc = t;
}
searchLastRecord = 0;
searchLastRecordProc = 0;
return FALSE;
}
void cheatSearchGetListReset()
{
searchLastRecord = 0;
searchLastRecordProc = 0;
}

View File

@ -2,7 +2,6 @@
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright 2009 CrazyMax
Copyright 2009 DeSmuME team
This file is part of DeSmuME
@ -25,7 +24,7 @@
#include "common.h"
#define CHEAT_VERSION_MAJOR 1
#define CHEAT_VERSION_MINOR 2
#define CHEAT_VERSION_MINOR 3
#define MAX_CHEAT_LIST 100
typedef struct
@ -34,7 +33,6 @@ typedef struct
// 1 - Action Replay
// 2 - Codebreakers
BOOL enabled;
u8 proc;
u32 hi[255];
u32 lo[255];
char description[75];
@ -44,12 +42,15 @@ typedef struct
} CHEATS_LIST;
extern void cheatsInit(char *path);
extern BOOL cheatsAdd(u8 proc, 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 cheatsAdd_AR(char *code, char *description, BOOL enabled);
extern BOOL cheatsAdd_CB(char *code, char *description, BOOL enabled);
extern BOOL cheatsRemove(u32 pos);
extern void cheatsGetListReset();
extern BOOL cheatsGetList(CHEATS_LIST *cheat);
extern BOOL cheatsGet(CHEATS_LIST *cheat, u32 pos);
extern u32 cheatsGetSize();
extern BOOL cheatsSave();
extern BOOL cheatsLoad();
extern BOOL cheatsPush();
@ -63,5 +64,5 @@ extern void cheatsSearchClose();
extern u32 cheatsSearchValue(u32 val);
extern u32 cheatsSearchComp(u8 comp);
extern u32 cheatSearchNumber();
extern BOOL cheatSearchGetList(u8 *proc, u32 *address, u32 *curVal);
extern BOOL cheatSearchGetList(u32 *address, u32 *curVal);
extern void cheatSearchGetListReset();

View File

@ -58,22 +58,15 @@ extern u8 gba_header_data_0x04[156];
extern void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file);
#define EXPERIMENTAL_GBASLOT 1
// this is experimental and only tested for windows port
// (I can`t test on another ports)
//
// About GBA game in slot (only for use together with NDS + GBA):
// in real BIOS 9 at offset 0x0020 placed compressed logo
// for comparing with logo in header GBA cartridge.
// so, GBA game in slot work now.
// Later need make loading this table in BIOS memory (from gba_header_data_0x04)
//
// in windows ports:
// i added in menu "Emulation" submenu "GBA slot"
#else // non Windows
#define sscanf_s sscanf
#endif
extern u8 reverseBitsInByte(u8 x);
extern void removeCR(char *buf);
extern u32 strlen_ws(char *buf);
extern u8 reverseBitsInByte(u8 x);
extern void removeCR(char *buf);
extern u32 strlen_ws(char *buf);
#endif

View File

@ -2,7 +2,6 @@
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright 2009 CrazyMax
Copyright 2009 DeSmuME team
This file is part of DeSmuME
@ -39,24 +38,22 @@ static HWND hBSearch = NULL;
static u32 exactVal = 0;
static u32 searchNumberResults = 0;
u8 searchAddProc = 0;
u32 searchAddAddress = 0;
u32 searchAddValue = 0;
u8 searchAddMode = 0;
u8 searchAddFreeze = 1;
u8 searchAddSize = 0;
static char editBuf[4][75] = { 0 };
static u32 searchAddAddress = 0;
static u32 searchAddValue = 0;
static u8 searchAddMode = 0;
static u8 searchAddFreeze = 1;
static u8 searchAddSize = 0;
static char editBuf[3][75] = { 0 };
static u32 cheatEditPos = 0;
HWND searchWnd = NULL;
HWND searchListView = NULL;
HWND cheatListView = NULL;
WNDPROC oldEditProc = NULL;
WNDPROC oldEditProcHEX = NULL;
static HWND searchWnd = NULL;
static HWND searchListView = NULL;
static HWND cheatListView = NULL;
static WNDPROC oldEditProc = NULL;
static WNDPROC oldEditProcHEX = NULL;
CHEATS_LIST tempCheat;
static char *NAME_CPUs[2] = { "ARM9", "ARM7" };
u32 searchIDDs[2][4] = {
{ IDD_CHEAT_SEARCH_MAIN, IDD_CHEAT_SEARCH_EXACT, IDD_CHEAT_SEARCH_RESULT, NULL },
{ IDD_CHEAT_SEARCH_MAIN, IDD_CHEAT_SEARCH_RESULT, IDD_CHEAT_SEARCH_COMP, IDD_CHEAT_SEARCH_RESULT}
@ -184,25 +181,17 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
wsprintf(buf, "%i", searchAddValue);
SetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf);
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
if (searchAddProc)
CheckDlgButton(dialog, IDC_RADIO9, BST_CHECKED);
else
CheckDlgButton(dialog, IDC_RADIO8, BST_CHECKED);
EnableWindow(GetDlgItem(dialog, IDC_EDIT1), FALSE);
EnableWindow(GetDlgItem(dialog, IDC_RADIO1), FALSE);
EnableWindow(GetDlgItem(dialog, IDC_RADIO2), FALSE);
EnableWindow(GetDlgItem(dialog, IDC_RADIO3), FALSE);
EnableWindow(GetDlgItem(dialog, IDC_RADIO4), FALSE);
EnableWindow(GetDlgItem(dialog, IDC_RADIO8), FALSE);
EnableWindow(GetDlgItem(dialog, IDC_RADIO9), FALSE);
ltoa(searchAddProc, editBuf[3], 10);
strcpy(editBuf[3], "0");
}
else
{
SetWindowText(GetDlgItem(dialog, IDC_EDIT2), "0");
CheckDlgButton(dialog, IDC_RADIO1, BST_CHECKED);
strcpy(editBuf[3], "0");
}
memset(editBuf, 0, sizeof(editBuf));
@ -214,6 +203,7 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
CheckDlgButton(dialog, searchSizeIDDs[searchAddSize], BST_CHECKED);
}
return TRUE;
case WM_COMMAND:
{
switch (LOWORD(wparam))
@ -222,12 +212,12 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
{
u32 tmp_addr = 0;
sscanf_s(editBuf[0], "%x", &tmp_addr);
oldEditProc = saveOldEditProc;
if (cheatsAdd(atol(editBuf[3]), searchAddSize, tmp_addr, atol(editBuf[1]), editBuf[2], searchAddFreeze))
if (cheatsAdd(searchAddSize, tmp_addr, atol(editBuf[1]), editBuf[2], searchAddFreeze))
{
if (cheatsSave())
if ((searchAddMode == 0) || (cheatsSave() && searchAddMode == 1))
{
oldEditProc = saveOldEditProc;
searchAddAddress = tmp_addr;
searchAddValue = atol(editBuf[1]);
@ -242,12 +232,12 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
EndDialog(dialog, FALSE);
return TRUE;
case IDC_EDIT1:
case IDC_EDIT1: // address
{
if (HIWORD(wparam) == EN_UPDATE)
{
GetWindowText(GetDlgItem(dialog, IDC_EDIT1), editBuf[0], 8);
if (!strlen(editBuf[0]) && !strlen(editBuf[1]))
if ( (strlen(editBuf[0]) < 6) || (!strlen(editBuf[1])) )
{
EnableWindow(GetDlgItem(dialog, IDOK), FALSE);
return TRUE;
@ -266,12 +256,12 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
return TRUE;
}
case IDC_EDIT2:
case IDC_EDIT2: // value
{
if (HIWORD(wparam) == EN_UPDATE)
{
GetWindowText(GetDlgItem(dialog, IDC_EDIT1), editBuf[1], 10);
if (!strlen(editBuf[1]) && !strlen(editBuf[0]))
GetWindowText(GetDlgItem(dialog, IDC_EDIT2), editBuf[1], 10);
if ( (strlen(editBuf[0]) < 6) || (!strlen(editBuf[1])) )
{
EnableWindow(GetDlgItem(dialog, IDOK), FALSE);
return TRUE;
@ -288,25 +278,13 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
return TRUE;
}
case IDC_EDIT3:
case IDC_EDIT3: // description
{
if (HIWORD(wparam) == EN_UPDATE)
GetWindowText(GetDlgItem(dialog, IDC_EDIT3), editBuf[2], 75);
return TRUE;
}
case IDC_RADIO8:
{
strcpy(editBuf[3], "0");
return TRUE;
}
case IDC_RADIO9:
{
strcpy(editBuf[3], "1");
return TRUE;
}
case IDC_RADIO1: // 1 byte
searchAddSize = 0;
return TRUE;
@ -332,6 +310,143 @@ BOOL CALLBACK CheatsAddProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
}
return FALSE;
}
BOOL CALLBACK CheatsEditProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
{
static WNDPROC saveOldEditProc = NULL;
char buf[100] = {0}, buf2[100] = {0};
switch(msg)
{
case WM_INITDIALOG:
{
saveOldEditProc = oldEditProc;
SendMessage(GetDlgItem(dialog, IDC_EDIT1), EM_SETLIMITTEXT, 6, 0);
SendMessage(GetDlgItem(dialog, IDC_EDIT2), EM_SETLIMITTEXT, 10, 0);
SendMessage(GetDlgItem(dialog, IDC_EDIT3), EM_SETLIMITTEXT, 75, 0);
oldEditProcHEX = (WNDPROC)SetWindowLongPtr(GetDlgItem(dialog, IDC_EDIT1), GWLP_WNDPROC, (LONG)EditValueHEXProc);
oldEditProc = (WNDPROC)SetWindowLongPtr(GetDlgItem(dialog, IDC_EDIT2), GWLP_WNDPROC, (LONG)EditValueProc);
cheatsGet(&tempCheat, cheatEditPos);
memset(buf, 0, 100);
memset(buf2, 0, 100);
tempCheat.hi[0] &= 0x00FFFFFF;
wsprintf(buf, "%06X", tempCheat.hi[0]);
SetWindowText(GetDlgItem(dialog, IDC_EDIT1), buf);
wsprintf(buf, "%i", tempCheat.lo[0]);
SetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf);
strcpy(buf, tempCheat.description);
SetWindowText(GetDlgItem(dialog, IDC_EDIT3), buf);
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
CheckDlgButton(dialog, IDC_CHECK1, tempCheat.enabled?BST_CHECKED:BST_UNCHECKED);
CheckDlgButton(dialog, searchSizeIDDs[tempCheat.size], BST_CHECKED);
SetWindowText(GetDlgItem(dialog, IDOK), "Update");
}
return TRUE;
case WM_COMMAND:
{
switch (LOWORD(wparam))
{
case IDOK:
{
if (cheatsUpdate(tempCheat.size, tempCheat.hi[0], tempCheat.lo[0], tempCheat.description, tempCheat.enabled, cheatEditPos))
{
oldEditProc = saveOldEditProc;
EndDialog(dialog, TRUE);
}
}
return TRUE;
case IDCANCEL:
oldEditProc = saveOldEditProc;
EndDialog(dialog, FALSE);
return TRUE;
case IDC_EDIT1: // address
{
if (HIWORD(wparam) == EN_UPDATE)
{
GetWindowText(GetDlgItem(dialog, IDC_EDIT1), buf, 8);
GetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf2, 10);
if ( (strlen(buf) < 6) || (!strlen(buf2)) )
{
EnableWindow(GetDlgItem(dialog, IDOK), FALSE);
return TRUE;
}
u32 val = 0;
sscanf_s(buf, "%x", &val);
val &= 0x00FFFFFF;
if (val > 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;

View File

@ -2,7 +2,6 @@
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright 2009 CrazyMax
Copyright 2009 DeSmuME team
This file is part of DeSmuME

View File

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

View File

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