- add checks savestate ROM header data with loaded ROM header;
This commit is contained in:
parent
997be2f2a2
commit
42b51f4e45
|
@ -399,7 +399,7 @@ void CHEATS::ARparser(CHEATS_LIST& list)
|
||||||
_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(hi+t, tmp);
|
_MMU_write08<ARMCPU_ARM9,MMU_AT_DEBUG>(hi+t, tmp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: PROGINFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break;
|
default: PROGINFO("AR: ERROR unknown command 0x%2X at %08X:%08X\n", type, hi, lo); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -278,39 +278,6 @@ SFORMAT SF_MOVIE[]={
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mmu_savestate(EMUFILE* os)
|
|
||||||
{
|
|
||||||
u32 version = 8;
|
|
||||||
write32le(version,os);
|
|
||||||
|
|
||||||
//version 2:
|
|
||||||
MMU_new.backupDevice.save_state(os);
|
|
||||||
|
|
||||||
//version 3:
|
|
||||||
MMU_new.gxstat.savestate(os);
|
|
||||||
for(int i=0;i<2;i++)
|
|
||||||
for(int j=0;j<4;j++)
|
|
||||||
MMU_new.dma[i][j].savestate(os);
|
|
||||||
|
|
||||||
MMU_timing.arm9codeFetch.savestate(os, version);
|
|
||||||
MMU_timing.arm9dataFetch.savestate(os, version);
|
|
||||||
MMU_timing.arm7codeFetch.savestate(os, version);
|
|
||||||
MMU_timing.arm7dataFetch.savestate(os, version);
|
|
||||||
MMU_timing.arm9codeCache.savestate(os, version);
|
|
||||||
MMU_timing.arm9dataCache.savestate(os, version);
|
|
||||||
|
|
||||||
//version 4:
|
|
||||||
MMU_new.sqrt.savestate(os);
|
|
||||||
MMU_new.div.savestate(os);
|
|
||||||
|
|
||||||
//version 6:
|
|
||||||
MMU_new.dsi_tsc.save_state(os);
|
|
||||||
|
|
||||||
//version 8:
|
|
||||||
os->write32le(MMU.fw.size);
|
|
||||||
os->fwrite(MMU.fw.data,MMU.fw.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: integrate the new wifi state variables once everything is settled
|
// TODO: integrate the new wifi state variables once everything is settled
|
||||||
SFORMAT SF_WIFI[]={
|
SFORMAT SF_WIFI[]={
|
||||||
{ "W000", 4, 1, &wifiMac.powerOn},
|
{ "W000", 4, 1, &wifiMac.powerOn},
|
||||||
|
@ -388,6 +355,47 @@ SFORMAT SF_WIFI[]={
|
||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern SFORMAT SF_RTC[];
|
||||||
|
|
||||||
|
static u8 reserveVal = 0;
|
||||||
|
SFORMAT reserveChunks[] = {
|
||||||
|
{ "RESV", 1, 1, &reserveVal},
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static void mmu_savestate(EMUFILE* os)
|
||||||
|
{
|
||||||
|
u32 version = 8;
|
||||||
|
write32le(version,os);
|
||||||
|
|
||||||
|
//version 2:
|
||||||
|
MMU_new.backupDevice.save_state(os);
|
||||||
|
|
||||||
|
//version 3:
|
||||||
|
MMU_new.gxstat.savestate(os);
|
||||||
|
for(int i=0;i<2;i++)
|
||||||
|
for(int j=0;j<4;j++)
|
||||||
|
MMU_new.dma[i][j].savestate(os);
|
||||||
|
|
||||||
|
MMU_timing.arm9codeFetch.savestate(os, version);
|
||||||
|
MMU_timing.arm9dataFetch.savestate(os, version);
|
||||||
|
MMU_timing.arm7codeFetch.savestate(os, version);
|
||||||
|
MMU_timing.arm7dataFetch.savestate(os, version);
|
||||||
|
MMU_timing.arm9codeCache.savestate(os, version);
|
||||||
|
MMU_timing.arm9dataCache.savestate(os, version);
|
||||||
|
|
||||||
|
//version 4:
|
||||||
|
MMU_new.sqrt.savestate(os);
|
||||||
|
MMU_new.div.savestate(os);
|
||||||
|
|
||||||
|
//version 6:
|
||||||
|
MMU_new.dsi_tsc.save_state(os);
|
||||||
|
|
||||||
|
//version 8:
|
||||||
|
os->write32le(MMU.fw.size);
|
||||||
|
os->fwrite(MMU.fw.data,MMU.fw.size);
|
||||||
|
}
|
||||||
|
|
||||||
static bool mmu_loadstate(EMUFILE* is, int size)
|
static bool mmu_loadstate(EMUFILE* is, int size)
|
||||||
{
|
{
|
||||||
//read version
|
//read version
|
||||||
|
@ -924,8 +932,6 @@ bool savestate_save (const char *file_name)
|
||||||
} else return false;
|
} else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern SFORMAT SF_RTC[];
|
|
||||||
|
|
||||||
static void writechunks(EMUFILE* os) {
|
static void writechunks(EMUFILE* os) {
|
||||||
savestate_WriteChunk(os,1,SF_ARM9);
|
savestate_WriteChunk(os,1,SF_ARM9);
|
||||||
savestate_WriteChunk(os,2,SF_ARM7);
|
savestate_WriteChunk(os,2,SF_ARM7);
|
||||||
|
@ -945,6 +951,13 @@ static void writechunks(EMUFILE* os) {
|
||||||
savestate_WriteChunk(os,110,SF_WIFI);
|
savestate_WriteChunk(os,110,SF_WIFI);
|
||||||
savestate_WriteChunk(os,120,SF_RTC);
|
savestate_WriteChunk(os,120,SF_RTC);
|
||||||
savestate_WriteChunk(os,130,SF_NDS_HEADER);
|
savestate_WriteChunk(os,130,SF_NDS_HEADER);
|
||||||
|
// reserved for future versions
|
||||||
|
savestate_WriteChunk(os,140,reserveChunks);
|
||||||
|
savestate_WriteChunk(os,150,reserveChunks);
|
||||||
|
savestate_WriteChunk(os,160,reserveChunks);
|
||||||
|
savestate_WriteChunk(os,170,reserveChunks);
|
||||||
|
savestate_WriteChunk(os,180,reserveChunks);
|
||||||
|
// ============================
|
||||||
savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);
|
savestate_WriteChunk(os,0xFFFFFFFF,(SFORMAT*)0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -964,8 +977,8 @@ static bool ReadStateChunks(EMUFILE* is, s32 totalsize)
|
||||||
|
|
||||||
while(totalsize > 0)
|
while(totalsize > 0)
|
||||||
{
|
{
|
||||||
uint32 size;
|
u32 size = 0;
|
||||||
u32 t;
|
u32 t = 0;
|
||||||
if(!read32le(&t,is)) { ret=false; break; }
|
if(!read32le(&t,is)) { ret=false; break; }
|
||||||
if(t == 0xFFFFFFFF) break;
|
if(t == 0xFFFFFFFF) break;
|
||||||
if(!read32le(&size,is)) { ret=false; break; }
|
if(!read32le(&size,is)) { ret=false; break; }
|
||||||
|
@ -989,12 +1002,23 @@ static bool ReadStateChunks(EMUFILE* is, s32 totalsize)
|
||||||
case 110: if(!ReadStateChunk(is,SF_WIFI,size)) ret=false; break;
|
case 110: if(!ReadStateChunk(is,SF_WIFI,size)) ret=false; break;
|
||||||
case 120: if(!ReadStateChunk(is,SF_RTC,size)) ret=false; break;
|
case 120: if(!ReadStateChunk(is,SF_RTC,size)) ret=false; break;
|
||||||
case 130: if(!ReadStateChunk(is,SF_HEADER,size)) ret=false; else haveInfo=true; break;
|
case 130: if(!ReadStateChunk(is,SF_HEADER,size)) ret=false; else haveInfo=true; break;
|
||||||
|
// reserved for future versions
|
||||||
|
case 140:
|
||||||
|
case 150:
|
||||||
|
case 160:
|
||||||
|
case 170:
|
||||||
|
case 180:
|
||||||
|
if(!ReadStateChunk(is,reserveChunks,size)) ret=false;
|
||||||
|
break;
|
||||||
|
// ============================
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if(!ret)
|
if(!ret)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (haveInfo)
|
if (haveInfo)
|
||||||
{
|
{
|
||||||
char buf[14] = {0};
|
char buf[14] = {0};
|
||||||
|
@ -1008,7 +1032,8 @@ static bool ReadStateChunks(EMUFILE* is, s32 totalsize)
|
||||||
printf("\tCRC16: %04Xh\n", header.CRC16);
|
printf("\tCRC16: %04Xh\n", header.CRC16);
|
||||||
printf("\tHeader CRC16: %04Xh\n", header.headerCRC16);
|
printf("\tHeader CRC16: %04Xh\n", header.headerCRC16);
|
||||||
|
|
||||||
// TODO: compare loaded rom header with savestate
|
if (gameInfo.romsize != romsize || memcmp(&gameInfo.header, &header, sizeof(header)) != 0)
|
||||||
|
msgbox->warn("The savestate you are loading does not match the ROM you are running.\nYou should find the correct ROM");
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -252,29 +252,29 @@ using namespace std;
|
||||||
void msgWndInfo(const char *fmt, ...)
|
void msgWndInfo(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
MSG_ARG;
|
MSG_ARG;
|
||||||
printf("Info: %s\n", msg_buf);
|
printf("[INFO] %s\n", msg_buf);
|
||||||
MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_OK | MB_ICONINFORMATION);
|
MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_OK | MB_ICONINFORMATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool msgWndConfirm(const char *fmt, ...)
|
bool msgWndConfirm(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
MSG_ARG;
|
MSG_ARG;
|
||||||
printf("Confirm: %s\n", msg_buf);
|
printf("[CONF] %s\n", msg_buf);
|
||||||
return (MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_YESNO | MB_ICONQUESTION) == IDYES);
|
return (MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_YESNO | MB_ICONQUESTION) == IDYES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void msgWndError(const char *fmt, ...)
|
void msgWndError(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
MSG_ARG;
|
MSG_ARG;
|
||||||
printf("Error: %s\n", msg_buf);
|
printf("[ERR] %s\n", msg_buf);
|
||||||
MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_OK | MB_ICONERROR);
|
MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_OK | MB_ICONERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void msgWndWarn(const char *fmt, ...)
|
void msgWndWarn(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
MSG_ARG;
|
MSG_ARG;
|
||||||
printf("Warning: %s\n", msg_buf);
|
printf("[WARN] %s\n", msg_buf);
|
||||||
MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_YESNO | MB_ICONWARNING);
|
MessageBox(MainWindow->getHWnd(), msg_buf, EMU_DESMUME_NAME_AND_VERSION(), MB_OK | MB_ICONWARNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
msgBoxInterface msgBoxWnd = {
|
msgBoxInterface msgBoxWnd = {
|
||||||
|
@ -2379,8 +2379,11 @@ static BOOL LoadROM(const char * filename, const char * physicalName, const char
|
||||||
//if (strcmp(filename,"")!=0) INFO("Attempting to load ROM: %s\n",filename);
|
//if (strcmp(filename,"")!=0) INFO("Attempting to load ROM: %s\n",filename);
|
||||||
|
|
||||||
video.clear();
|
video.clear();
|
||||||
osd->addFixed(100, 100, "Loading ROM...");
|
osd->clear();
|
||||||
osd->addFixed(100, 120, "Please, wait...");
|
osd->addFixed(90, 80, "Loading ROM.");
|
||||||
|
osd->addFixed(90, 100, "Please, wait...");
|
||||||
|
osd->addFixed(90, 192 + 80, "Loading ROM.");
|
||||||
|
osd->addFixed(90, 192 + 100, "Please, wait...");
|
||||||
displayProc(true);
|
displayProc(true);
|
||||||
if (NDS_LoadROM(filename, physicalName, logicalName) > 0)
|
if (NDS_LoadROM(filename, physicalName, logicalName) > 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue