diff --git a/desmume/src/MMU.c b/desmume/src/MMU.c index 3a7f7128f..2f6add488 100644 --- a/desmume/src/MMU.c +++ b/desmume/src/MMU.c @@ -287,6 +287,28 @@ u32 rom_mask = 0; u32 DMASrc[2][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}}; u32 DMADst[2][4] = {{0, 0, 0, 0}, {0, 0, 0, 0}}; +void MMU_clearMem() +{ + memset(ARM9Mem.ARM9_ABG, 0, 0x80000); + memset(ARM9Mem.ARM9_AOBJ, 0, 0x40000); + memset(ARM9Mem.ARM9_BBG, 0, 0x20000); + memset(ARM9Mem.ARM9_BOBJ, 0, 0x20000); + memset(ARM9Mem.ARM9_DTCM, 0, 0x4000); + memset(ARM9Mem.ARM9_ITCM, 0, 0x8000); + memset(ARM9Mem.ARM9_LCD, 0, 0xA4000); + memset(ARM9Mem.ARM9_OAM, 0, 0x800); + memset(ARM9Mem.ARM9_REG, 0, 0x1000000); + memset(ARM9Mem.ARM9_VMEM, 0, 0x800); + memset(ARM9Mem.ARM9_WRAM, 0, 0x1000000); + memset(ARM9Mem.MAIN_MEM, 0, 0x400000); + //memset(&ARM9, 0, sizeof(ARM9_struct)); + + memset(MMU.ARM7_ERAM, 0, 0x10000); + memset(MMU.ARM7_REG, 0, 0x10000); + + MainScreen.offset = 192; + SubScreen.offset = 0; +} void MMU_setRom(u8 * rom, u32 mask) { @@ -1068,42 +1090,42 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) GPU_setYH(SubScreen.gpu, 3, val); return; case BG0_CR : - GPULOG("MAIN BG0 SETPROP 16B %08X\r\n", val); + //GPULOG("MAIN BG0 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 0, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x8, val); return; case BG1_CR : - GPULOG("MAIN BG1 SETPROP 16B %08X\r\n", val); + //GPULOG("MAIN BG1 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 1, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0xA, val); return; case BG2_CR : - GPULOG("MAIN BG2 SETPROP 16B %08X\r\n", val); + //GPULOG("MAIN BG2 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 2, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0xC, val); return; case BG3_CR : - GPULOG("MAIN BG3 SETPROP 16B %08X\r\n", val); + //GPULOG("MAIN BG3 SETPROP 16B %08X\r\n", val); GPU_setBGProp(MainScreen.gpu, 3, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0xE, val); return; case SUB_BG0_CR : - GPULOG("SUB BG0 SETPROP 16B %08X\r\n", val); + //GPULOG("SUB BG0 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 0, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x1008, val); return; case SUB_BG1_CR : - GPULOG("SUB BG1 SETPROP 16B %08X\r\n", val); + //GPULOG("SUB BG1 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 1, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x100A, val); return; case SUB_BG2_CR : - GPULOG("SUB BG2 SETPROP 16B %08X\r\n", val); + //GPULOG("SUB BG2 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 2, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x100C, val); return; case SUB_BG3_CR : - GPULOG("SUB BG3 SETPROP 16B %08X\r\n", val); + //GPULOG("SUB BG3 SETPROP 16B %08X\r\n", val); GPU_setBGProp(SubScreen.gpu, 3, val); T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x100E, val); return; @@ -1595,13 +1617,13 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) case 0x04000000 : GPU_setVideoProp(MainScreen.gpu, val); - GPULOG("MAIN INIT 32B %08X\r\n", val); + //GPULOG("MAIN INIT 32B %08X\r\n", val); T1WriteLong(MMU.MMU_MEM[proc][0x40], 0, val); return; case 0x04001000 : GPU_setVideoProp(SubScreen.gpu, val); - GPULOG("SUB INIT 32B %08X\r\n", val); + //GPULOG("SUB INIT 32B %08X\r\n", val); T1WriteLong(MMU.MMU_MEM[proc][0x40], 0x1000, val); return; diff --git a/desmume/src/MMU.h b/desmume/src/MMU.h index 7137e67c4..35534e356 100644 --- a/desmume/src/MMU.h +++ b/desmume/src/MMU.h @@ -100,6 +100,8 @@ extern MMU_struct MMU; void MMUInit(void); void MMUDeInit(void); +void MMU_clearMem(); + void MMU_setRom(u8 * rom, u32 mask); void MMU_unsetRom(); diff --git a/desmume/src/NDSSystem.c b/desmume/src/NDSSystem.c index 5d789845c..1f3ce66b0 100644 --- a/desmume/src/NDSSystem.c +++ b/desmume/src/NDSSystem.c @@ -86,6 +86,8 @@ void NDS_DeInit(void) { BOOL NDS_SetROM(u8 * rom, u32 mask) { u32 i; + + MMU_clearMem(); MMU_setRom(rom, mask); diff --git a/desmume/src/mc.c b/desmume/src/mc.c index 8c0a09d31..0f8c9fa1c 100644 --- a/desmume/src/mc.c +++ b/desmume/src/mc.c @@ -83,6 +83,22 @@ void mc_reset_com(memory_chip_t *mc) mc->com = 0; } +void mc_read_file(memory_chip_t *mc, char* filename) +{ + FILE* file = fopen(filename, "rb"); + if(file == NULL) return; + fread (mc->data, mc->size, 1, file); + fclose (file); +} + +void mc_write_file(memory_chip_t *mc, char* filename) +{ + FILE* file = fopen(filename, "wb"); + if(file == NULL) return; + fwrite (mc->data, mc->size, 1, file); + fclose (file); +} + u8 fw_transfer(memory_chip_t *mc, u8 data) { if(mc->com == FW_CMD_READ || mc->com == FW_CMD_PAGEWRITE) /* check if we are in a command that needs 3 bytes address */ @@ -164,6 +180,7 @@ u8 fw_transfer(memory_chip_t *mc, u8 data) u8 bm_transfer(memory_chip_t *mc, u8 data) { + mc_read_file(mc,"test.sav"); if(mc->com == BM_CMD_READLOW || mc->com == BM_CMD_READHIGH || mc->com == BM_CMD_WRITELOW || mc->com == BM_CMD_WRITEHIGH) /* check if we are in a command that needs multiple byte address */ { @@ -258,6 +275,7 @@ u8 bm_transfer(memory_chip_t *mc, u8 data) } } + mc_write_file(mc,"test.sav"); return data; }