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:
zeromus 2010-01-01 09:03:00 +00:00
parent d781e65e09
commit 4ae597c2f0
7 changed files with 51 additions and 42 deletions

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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;
}

View File

@ -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];

View File

@ -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)

View File

@ -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);