diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index 9636b3fa5..dcdbbb03b 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop Copyright (C) 2007 shash - Copyright (C) 2007-2009 DeSmuME team + Copyright (C) 2007-2010 DeSmuME team This file is part of DeSmuME @@ -2141,6 +2141,8 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val) { mmu_log_debug_ARM9(adr, "(write08) 0x%02X", val); + adr &= 0x0FFFFFFF; + if(adr < 0x02000000) { T1WriteByte(MMU.ARM9_ITCM, adr&0x7FFF, val); @@ -2153,8 +2155,6 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val) return; } - adr &= 0x0FFFFFFF; - if (adr >> 24 == 4) { if(MMU_new.is_dma(adr)) { @@ -2371,6 +2371,8 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val) { mmu_log_debug_ARM9(adr, "(write16) 0x%04X", val); + adr &= 0x0FFFFFFE; + if (adr < 0x02000000) { T1WriteWord(MMU.ARM9_ITCM, adr&0x7FFF, val); @@ -2383,8 +2385,6 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val) return; } - adr &= 0x0FFFFFFF; - if((adr >> 24) == 4) { if(MMU_new.is_dma(adr)) { @@ -2862,6 +2862,8 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) { mmu_log_debug_ARM9(adr, "(write32) 0x%08X", val); + adr &= 0x0FFFFFFC; + if(adr<0x02000000) { T1WriteLong(MMU.ARM9_ITCM, adr&0x7FFF, val); @@ -2879,8 +2881,6 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) int zzz=9; } - adr &= 0x0FFFFFFF; - #if 0 if ((adr & 0xFF800000) == 0x04800000) { // access to non regular hw registers @@ -3288,14 +3288,14 @@ u8 FASTCALL _MMU_ARM9_read08(u32 adr) { mmu_log_debug_ARM9(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF]]); + adr &= 0x0FFFFFFF; + if(adr<0x02000000) return T1ReadByte(MMU.ARM9_ITCM, adr&0x7FFF); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) return addon.read08(adr); - adr &= 0x0FFFFFFF; - if (adr >> 24 == 4) { //Address is an IO register @@ -3329,14 +3329,14 @@ u16 FASTCALL _MMU_ARM9_read16(u32 adr) { mmu_log_debug_ARM9(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF], adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF])); + adr &= 0x0FFFFFFE; + if(adr<0x02000000) return T1ReadWord_guaranteedAligned(MMU.ARM9_ITCM, adr & 0x7FFE); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) return addon.read16(adr); - adr &= 0x0FFFFFFE; - if (adr >> 24 == 4) { if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM9,16,adr); @@ -3419,14 +3419,14 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr) { mmu_log_debug_ARM9(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][(adr>>20)&0xFF], adr&MMU.MMU_MASK[ARMCPU_ARM9][(adr>>20)&0xFF])); + adr &= 0x0FFFFFFC; + if(adr<0x02000000) return T1ReadLong_guaranteedAligned(MMU.ARM9_ITCM, adr&0x7FFC); if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) return addon.read32(adr); - adr &= 0x0FFFFFFC; - // Address is an IO register if((adr >> 24) == 4) { @@ -3529,14 +3529,14 @@ void FASTCALL _MMU_ARM7_write08(u32 adr, u8 val) { mmu_log_debug_ARM7(adr, "(write08) 0x%02X", val); + adr &= 0x0FFFFFFF; + if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { addon.write08(adr, val); return; } - adr &= 0x0FFFFFFF; - if ((adr>=0x04000400)&&(adr<0x0400051D)) { SPU_WriteByte(adr, val); @@ -3594,6 +3594,8 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val) { mmu_log_debug_ARM7(adr, "(write16) 0x%04X", val); + adr &= 0x0FFFFFFE; + if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { addon.write16(adr, val); @@ -3608,8 +3610,6 @@ void FASTCALL _MMU_ARM7_write16(u32 adr, u16 val) return; } - adr &= 0x0FFFFFFF; - if ((adr>=0x04000400)&&(adr<0x0400051D)) { SPU_WriteWord(adr, val); @@ -3891,6 +3891,8 @@ void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) { mmu_log_debug_ARM7(adr, "(write32) 0x%08X", val); + adr &= 0x0FFFFFFC; + if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) { addon.write32(adr, val); @@ -3907,8 +3909,6 @@ void FASTCALL _MMU_ARM7_write32(u32 adr, u32 val) return; } - adr &= 0x0FFFFFFF; - if ((adr>=0x04000400)&&(adr<0x0400051D)) { SPU_WriteLong(adr, val); @@ -4007,6 +4007,8 @@ u8 FASTCALL _MMU_ARM7_read08(u32 adr) { mmu_log_debug_ARM7(adr, "(read08) 0x%02X", MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF][adr&MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF]]); + adr &= 0x0FFFFFFF; + // wifi mac access if ((adr>=0x04800000)&&(adr<0x05000000)) { @@ -4021,8 +4023,6 @@ u8 FASTCALL _MMU_ARM7_read08(u32 adr) if (adr == REG_RTC) return (u8)rtcRead(); - adr &= 0x0FFFFFFF; - if (adr >> 24 == 4) { if(MMU_new.is_dma(adr)) return MMU_new.read_dma(ARMCPU_ARM7,8,adr); @@ -4043,6 +4043,8 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr) { mmu_log_debug_ARM7(adr, "(read16) 0x%04X", T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); + adr &= 0x0FFFFFFE; + //wifi mac access if ((adr>=0x04800000)&&(adr<0x05000000)) return WIFI_read16(adr) ; @@ -4050,8 +4052,6 @@ u16 FASTCALL _MMU_ARM7_read16(u32 adr) if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) return addon.read16(adr); - adr &= 0x0FFFFFFE; - if(adr>>24==4) { //Address is an IO register @@ -4110,6 +4110,8 @@ u32 FASTCALL _MMU_ARM7_read32(u32 adr) { mmu_log_debug_ARM7(adr, "(read32) 0x%08X", T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][(adr>>20)&0xFF], adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr>>20)&0xFF])); + adr &= 0x0FFFFFFC; + //wifi mac access if ((adr>=0x04800000)&&(adr<0x05000000)) return (WIFI_read16(adr) | (WIFI_read16(adr+2) << 16)); @@ -4117,8 +4119,6 @@ u32 FASTCALL _MMU_ARM7_read32(u32 adr) if ( (adr >= 0x08000000) && (adr < 0x0A010000) ) return addon.read32(adr); - adr &= 0x0FFFFFFC; - if((adr >> 24) == 4) { //Address is an IO register diff --git a/desmume/src/MMU.h b/desmume/src/MMU.h index fe1a0872a..e925affda 100644 --- a/desmume/src/MMU.h +++ b/desmume/src/MMU.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop Copyright (C) 2007 shash - Copyright (C) 2007-2009 DeSmuME team + Copyright (C) 2007-2010 DeSmuME team This file is part of DeSmuME @@ -593,6 +593,10 @@ inline void SetupMMU(BOOL debugConsole) { //T1ReadWord(MMU.MMU_MEM[ARMCPU_ARM7][(adr >> 20) & 0xFF], // adr & MMU.MMU_MASK[ARMCPU_ARM7][(adr >> 20) & 0xFF]); +//ALERT!!!!!!!!!!!!!! +//the following inline functions dont do the 0x0FFFFFFF mask. +//this may result in some unexpected behavior + FORCEINLINE u8 _MMU_read08(const int PROCNUM, const MMU_ACCESS_TYPE AT, const u32 addr) { //special handling for DMA: read 0 from TCM diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index 90df7194b..5c03cc8fb 100644 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -1,8 +1,5 @@ /* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - - Copyright (C) 2008-2009 DeSmuME team + Copyright (C) 2008-2010 DeSmuME team This file is part of DeSmuME @@ -1671,7 +1668,7 @@ bool nds_loadstate(EMUFILE* is, int size) //#define LOG_ARM9 //#define LOG_ARM7 -//bool dolog = true; +//bool dolog = false; FORCEINLINE void arm9log() { @@ -1816,6 +1813,9 @@ void NDS_exec(s32 nb) //it should be benign to execute execHardware in the next frame, //since there won't be anything for it to do (everything should be scheduled in the future) + //bail in case the system halted + if(!execute) break; + execHardware_interrupts(); //find next work unit: diff --git a/desmume/src/arm_instructions.cpp b/desmume/src/arm_instructions.cpp index 95ce8d99e..43ae1af65 100644 --- a/desmume/src/arm_instructions.cpp +++ b/desmume/src/arm_instructions.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2006 yopyop Copyright (C) 2006-2007 shash - Copyright (C) 2008-2009 DeSmuME team + Copyright (C) 2008-2010 DeSmuME team This file is part of DeSmuME @@ -6845,8 +6845,13 @@ TEMPLATE static u32 FASTCALL OP_SWI(const u32 i) TEMPLATE static u32 FASTCALL OP_BKPT(const u32 i) { - /*LOG("Stopped (OP_BKPT) \n"); - TRAPUNDEF();*/ + static u32 last_bkpt = 0xFFFFFFFF; + if(i != last_bkpt) + printf("ARM OP_BKPT triggered\n"); + last_bkpt = i; + + //this is not 100% correctly emulated, but it does the job + cpu->next_instruction = cpu->instruct_adr; return 4; } diff --git a/desmume/src/driver.cpp b/desmume/src/driver.cpp index 891573d55..cb14a5914 100644 --- a/desmume/src/driver.cpp +++ b/desmume/src/driver.cpp @@ -1,6 +1,6 @@ /* driver.cpp - Copyright (C) 2009 DeSmuME team + Copyright (C) 2009-2010 DeSmuME team This file is part of DeSmuME @@ -145,12 +145,12 @@ public: const u32 w = texkey->sizeX; const u32 h = texkey->sizeY; u8* const bmpdata = new u8[w*h*4]; - for(int i=0;idecoded[i*4]; bmpdata[i*3+1] = texkey->decoded[i*4+1]; bmpdata[i*3+2] = texkey->decoded[i*4+2]; } - for(int i=0;idecoded[i*4+3]; diff --git a/desmume/src/windows/CWindow.cpp b/desmume/src/windows/CWindow.cpp index 5519c3e88..d5de0beb8 100644 --- a/desmume/src/windows/CWindow.cpp +++ b/desmume/src/windows/CWindow.cpp @@ -1,5 +1,5 @@ /* Copyright (C) 2006 yopyop - Copyright (C) 2006-2009 DeSmuME team + Copyright (C) 2006-2010 DeSmuME team This file is part of DeSmuME @@ -117,7 +117,7 @@ void MakeBitmapPseudoTransparent(HBITMAP hBmp, COLORREF cKeyColor, COLORREF cNew SetDIBits(dc, hBmp, 0, bmp.bmHeight, (LPVOID)bmpdata, &bmpinfo, DIB_RGB_COLORS); DeleteDC(dc); - delete bmpdata; + delete[] bmpdata; } //----------------------------------------------------------------------------- @@ -575,7 +575,7 @@ bool WINCLASS::createEx(LPSTR caption, int x, int y, int width, int height, int bool WINCLASS::setMenu(HMENU menu) { hmenu = menu; - return SetMenu(hwnd, hmenu)==TRUE; + return SetMenu(hwnd, hmenu)!=FALSE; } DWORD WINCLASS::checkMenu(UINT idd, bool check) diff --git a/desmume/src/windows/throttle.cpp b/desmume/src/windows/throttle.cpp index fc4645eb9..d4a3e84fb 100644 --- a/desmume/src/windows/throttle.cpp +++ b/desmume/src/windows/throttle.cpp @@ -220,9 +220,9 @@ int AutoFrameSkip_GetSkipAmount(int min, int max) // limit ongoing skipframes to requested range + 1 on each side if(fSkipFrames < min-1) - fSkipFrames = min-1; + fSkipFrames = (float)min-1; if(fSkipFrames > max+1) - fSkipFrames = max+1; + fSkipFrames = (float)max+1; // printf("%d", rv);