fix some warnings, move alignment masks ahead of other logic in the main mmu routines (fixes potential crashes when accessing totally terrible addresses), crudely emulate OP_BKPT
This commit is contained in:
parent
d781e65e09
commit
4ae597c2f0
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;i<w*h;i++) {
|
||||
for(u32 i=0;i<w*h;i++) {
|
||||
bmpdata[i*3] = texkey->decoded[i*4];
|
||||
bmpdata[i*3+1] = texkey->decoded[i*4+1];
|
||||
bmpdata[i*3+2] = texkey->decoded[i*4+2];
|
||||
}
|
||||
for(int i=0;i<w*h;i++)
|
||||
for(u32 i=0;i<w*h;i++)
|
||||
bmpdata[w*h*3+i] = texkey->decoded[i*4+3];
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue