diff --git a/desmume/src/NDSSystem.c b/desmume/src/NDSSystem.c index 7461c1e1b..b305799e5 100644 --- a/desmume/src/NDSSystem.c +++ b/desmume/src/NDSSystem.c @@ -167,7 +167,7 @@ enum ROM_DSGBA }; -int NDS_LoadROM(const char *filename) +int NDS_LoadROM(const char *filename, int bmtype, u32 bmsize) { int i; int type; @@ -247,6 +247,7 @@ int NDS_LoadROM(const char *filename) else strcpy(p+strlen(p)-4, ".sav"); + mc_realloc(&MMU.bupmem, bmtype, bmsize); mc_load_file(&MMU.bupmem, p); free(p); diff --git a/desmume/src/NDSSystem.h b/desmume/src/NDSSystem.h index 58902a470..d698ce5db 100644 --- a/desmume/src/NDSSystem.h +++ b/desmume/src/NDSSystem.h @@ -121,7 +121,7 @@ NDS_header * NDS_getROMHeader(void); void NDS_setTouchPos(u16 x, u16 y); void NDS_releasTouch(void); -int NDS_LoadROM(const char *filename); +int NDS_LoadROM(const char *filename, int bmtype, u32 bmsize); void NDS_FreeROM(void); void NDS_Reset(void); diff --git a/desmume/src/cli/main.c b/desmume/src/cli/main.c index b63baea2a..55ab2ac28 100644 --- a/desmume/src/cli/main.c +++ b/desmume/src/cli/main.c @@ -50,7 +50,7 @@ int main(int argc, char ** argv) { return 1; } - if (NDS_LoadROM(argv[1]) < 0) { + if (NDS_LoadROM(argv[1], MC_TYPE_AUTODETECT, 1) < 0) { fprintf(stderr, "error while loading %s\n", argv[1]); return 2; } diff --git a/desmume/src/gtk/main.c b/desmume/src/gtk/main.c index 73144a811..750c36a7d 100644 --- a/desmume/src/gtk/main.c +++ b/desmume/src/gtk/main.c @@ -186,7 +186,7 @@ void About(GtkWidget* widget, gpointer data) static int Open(const char *filename) { - int i = NDS_LoadROM(filename); + int i = NDS_LoadROM(filename, MC_TYPE_AUTODETECT, 1); return i; } diff --git a/desmume/src/mc.c b/desmume/src/mc.c index 1d6871fd9..ac9f44941 100644 --- a/desmume/src/mc.c +++ b/desmume/src/mc.c @@ -161,6 +161,7 @@ void mc_realloc(memory_chip_t *mc, int type, u32 size) void mc_load_file(memory_chip_t *mc, const char* filename) { long size; + int type; FILE* file = fopen(filename, "rb+"); if(file == NULL) { @@ -172,21 +173,24 @@ void mc_load_file(memory_chip_t *mc, const char* filename) size = ftell(file); fseek(file, 0, SEEK_SET); - if (size == MC_SIZE_4KBITS) - mc->type = MC_TYPE_EEPROM1; - else if (size == MC_SIZE_64KBITS) - mc->type = MC_TYPE_EEPROM2; - else if (size == MC_SIZE_256KBITS) - mc->type = MC_TYPE_FRAM; - else if (size == MC_SIZE_512KBITS) - mc->type = MC_TYPE_EEPROM2; - else if (size >= MC_SIZE_2MBITS) - mc->type = MC_TYPE_FLASH; + if (mc->type == MC_TYPE_AUTODETECT) + { + if (size == MC_SIZE_4KBITS) + type = MC_TYPE_EEPROM1; + else if (size == MC_SIZE_64KBITS) + type = MC_TYPE_EEPROM2; + else if (size == MC_SIZE_256KBITS) + type = MC_TYPE_FRAM; + else if (size == MC_SIZE_512KBITS) + type = MC_TYPE_EEPROM2; + else if (size >= MC_SIZE_2MBITS) + type = MC_TYPE_FLASH; + mc_realloc(mc, type, size); + } - mc->size = size; - - mc_realloc(mc, mc->type, mc->size); - fread (mc->data, 1, mc->size, file); + if (size > mc->size) + size = mc->size; + fread (mc->data, 1, size, file); mc->fp = file; } diff --git a/desmume/src/windows/main.c b/desmume/src/windows/main.c index 2b9356bab..23cdad8e2 100644 --- a/desmume/src/windows/main.c +++ b/desmume/src/windows/main.c @@ -93,6 +93,8 @@ NULL int autoframeskipenab=1; int frameskiprate=0; +static int backupmemorytype=MC_TYPE_AUTODETECT; +static u32 backupmemorysize=1; LRESULT CALLBACK SoundSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -250,7 +252,7 @@ BOOL LoadROM(char * filename) { NDS_Pause(); - if (NDS_LoadROM(filename) > 0) + if (NDS_LoadROM(filename, backupmemorytype, backupmemorysize) > 0) return TRUE; return FALSE; @@ -976,27 +978,39 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM case IDC_SAVETYPE1: saver(MF_CHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED); - mc_realloc(&MMU.bupmem, MC_TYPE_AUTODETECT,1); + backupmemorytype = MC_TYPE_AUTODETECT; + backupmemorysize = 1; + mc_realloc(&MMU.bupmem, backupmemorytype,backupmemorysize); return 0; case IDC_SAVETYPE2: saver(MF_UNCHECKED,MF_CHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED); - mc_realloc(&MMU.bupmem, MC_TYPE_EEPROM1,MC_SIZE_4KBITS); + backupmemorytype = MC_TYPE_EEPROM1; + backupmemorysize = MC_SIZE_4KBITS; + mc_realloc(&MMU.bupmem, backupmemorytype,backupmemorysize); return 0; case IDC_SAVETYPE3: saver(MF_UNCHECKED,MF_UNCHECKED,MF_CHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED); - mc_realloc(&MMU.bupmem, MC_TYPE_EEPROM2,MC_SIZE_64KBITS); + backupmemorytype = MC_TYPE_EEPROM2; + backupmemorysize = MC_SIZE_64KBITS; + mc_realloc(&MMU.bupmem, backupmemorytype,backupmemorysize); return 0; case IDC_SAVETYPE4: saver(MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_CHECKED,MF_UNCHECKED,MF_UNCHECKED); - mc_realloc(&MMU.bupmem, MC_TYPE_EEPROM2,MC_SIZE_512KBITS); + backupmemorytype = MC_TYPE_EEPROM2; + backupmemorysize = MC_SIZE_512KBITS; + mc_realloc(&MMU.bupmem, backupmemorytype,backupmemorysize); return 0; case IDC_SAVETYPE5: saver(MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_CHECKED,MF_UNCHECKED); - mc_realloc(&MMU.bupmem, MC_TYPE_FRAM,MC_SIZE_256KBITS); + backupmemorytype = MC_TYPE_FRAM; + backupmemorysize = MC_SIZE_256KBITS; + mc_realloc(&MMU.bupmem, backupmemorytype,backupmemorysize); return 0; case IDC_SAVETYPE6: saver(MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_UNCHECKED,MF_CHECKED); - mc_realloc(&MMU.bupmem, MC_TYPE_FLASH,MC_SIZE_2MBITS); + backupmemorytype = MC_TYPE_FLASH; + backupmemorysize = MC_SIZE_2MBITS; + mc_realloc(&MMU.bupmem, backupmemorytype,backupmemorysize); return 0; case IDM_RESET: