aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--melonDS.cbp47
-rw-r--r--src/ARM.cpp6
-rw-r--r--src/DMA.cpp17
-rw-r--r--src/GPU3D.cpp75
-rw-r--r--src/GPU3D.h2
-rw-r--r--src/GPU3D_Soft.cpp4
6 files changed, 109 insertions, 42 deletions
diff --git a/melonDS.cbp b/melonDS.cbp
index c1c7f27..bc0ee38 100644
--- a/melonDS.cbp
+++ b/melonDS.cbp
@@ -51,12 +51,12 @@
<Option type="1" />
<Option compiler="gcc" />
<Compiler>
- <Add option="-O2" />
+ <Add option="-O3" />
<Add option="-m64" />
- <Add option="-D_FILE_OFFSET_BITS=64" />
- <Add option="-D__WXMSW__" />
<Add option="-I$(TARGET_COMPILER_DIR)/lib/wx/include/msw-unicode-static-3.0" />
<Add option="-I$(TARGET_COMPILER_DIR)/include/wx-3.0" />
+ <Add option="-D_FILE_OFFSET_BITS=64" />
+ <Add option="-D__WXMSW__" />
</Compiler>
<Linker>
<Add option="-s" />
@@ -116,6 +116,45 @@
<Add option="-m64" />
</Linker>
</Target>
+ <Target title="Profile Windows">
+ <Option platforms="Windows;" />
+ <Option output="bin/Release/melonDS" prefix_auto="1" extension_auto="1" />
+ <Option object_output="obj/Release/" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-O2" />
+ <Add option="-m64" />
+ <Add option="-g" />
+ <Add option="-I$(TARGET_COMPILER_DIR)/lib/wx/include/msw-unicode-static-3.0" />
+ <Add option="-I$(TARGET_COMPILER_DIR)/include/wx-3.0" />
+ <Add option="-D_FILE_OFFSET_BITS=64" />
+ <Add option="-D__WXMSW__" />
+ </Compiler>
+ <Linker>
+ <Add option="-m64" />
+ <Add library=":libwx_mswu_core-3.0.a" />
+ <Add library=":libwx_baseu-3.0.a" />
+ <Add library="SDL2" />
+ <Add library=":libpng.a" />
+ <Add library=":libjpeg.a" />
+ <Add library=":libtiff.a" />
+ <Add library=":libz.a" />
+ <Add library="rpcrt4" />
+ <Add library="oleaut32" />
+ <Add library="ole32" />
+ <Add library="uuid" />
+ <Add library="winspool" />
+ <Add library="winmm" />
+ <Add library="shell32" />
+ <Add library="comctl32" />
+ <Add library="comdlg32" />
+ <Add library="advapi32" />
+ <Add library="wsock32" />
+ <Add library="oleacc" />
+ <Add library="gdi32" />
+ </Linker>
+ </Target>
</Build>
<Compiler>
<Add option="-Wall" />
@@ -126,6 +165,7 @@
<Option compilerVar="WINDRES" />
<Option target="Debug Windows" />
<Option target="Release Windows" />
+ <Option target="Profile Windows" />
</Unit>
<Unit filename="src/ARM.cpp" />
<Unit filename="src/ARM.h" />
@@ -176,6 +216,7 @@
<Unit filename="xp.manifest">
<Option target="Debug Windows" />
<Option target="Release Windows" />
+ <Option target="Profile Windows" />
</Unit>
<Extensions>
<code_completion />
diff --git a/src/ARM.cpp b/src/ARM.cpp
index 6bed1b5..73e94a0 100644
--- a/src/ARM.cpp
+++ b/src/ARM.cpp
@@ -332,7 +332,7 @@ s32 ARM::Execute()
else if (NDS::HaltInterrupted(Num))
{
Halted = 0;
- if (NDS::IME[Num]&1)
+ if (NDS::IME[Num] & 0x1)
TriggerIRQ();
}
else
@@ -403,9 +403,9 @@ s32 ARM::Execute()
Cycles = CyclesToRun;
break;
}
- if (NDS::HaltInterrupted(Num))
+ if (NDS::IF[Num] & NDS::IE[Num])
{
- if (NDS::IME[Num]&1)
+ if (NDS::IME[Num] & 0x1)
TriggerIRQ();
}
}
diff --git a/src/DMA.cpp b/src/DMA.cpp
index 8e2a460..335ad2c 100644
--- a/src/DMA.cpp
+++ b/src/DMA.cpp
@@ -233,6 +233,23 @@ s32 DMA::Run(s32 cycles)
}
else
{
+ // optimized path for typical GXFIFO DMA
+ if (CPU == 0 && (CurSrcAddr>>24) == 0x02 && CurDstAddr == 0x04000400 && DstAddrInc == 0)
+ {
+ while (IterCount > 0 && cycles > 0)
+ {
+ GPU3D::WriteToGXFIFO(*(u32*)&NDS::MainRAM[CurSrcAddr&0x3FFFFF]);
+
+ s32 c = (Waitstates[1][0x2] + Waitstates[1][0x4]);
+ cycles -= c;
+ NDS::RunTimingCriticalDevices(0, c);
+
+ CurSrcAddr += SrcAddrInc<<2;
+ IterCount--;
+ RemCount--;
+ }
+ }
+
u32 (*readfn)(u32) = CPU ? NDS::ARM7Read32 : NDS::ARM9Read32;
void (*writefn)(u32,u32) = CPU ? NDS::ARM7Write32 : NDS::ARM9Write32;
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index dc08841..b98c4fc 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -1807,6 +1807,45 @@ u32* GetLine(int line)
}
+void WriteToGXFIFO(u32 val)
+{
+ if (NumCommands == 0)
+ {
+ NumCommands = 4;
+ CurCommand = val;
+ ParamCount = 0;
+ TotalParams = CmdNumParams[CurCommand & 0xFF];
+
+ if (TotalParams > 0) return;
+ }
+ else
+ ParamCount++;
+
+ for (;;)
+ {
+ if ((CurCommand & 0xFF) || (NumCommands == 4 && CurCommand == 0))
+ {
+ CmdFIFOEntry entry;
+ entry.Command = CurCommand & 0xFF;
+ entry.Param = val;
+ CmdFIFOWrite(entry);
+ }
+
+ if (ParamCount >= TotalParams)
+ {
+ CurCommand >>= 8;
+ NumCommands--;
+ if (NumCommands == 0) break;
+
+ ParamCount = 0;
+ TotalParams = CmdNumParams[CurCommand & 0xFF];
+ }
+ if (ParamCount < TotalParams)
+ break;
+ }
+}
+
+
u8 Read8(u32 addr)
{
printf("unknown GPU3D read8 %08X\n", addr);
@@ -2012,41 +2051,7 @@ void Write32(u32 addr, u32 val)
if (addr >= 0x04000400 && addr < 0x04000440)
{
- if (NumCommands == 0)
- {
- NumCommands = 4;
- CurCommand = val;
- ParamCount = 0;
- TotalParams = CmdNumParams[CurCommand & 0xFF];
-
- if (TotalParams > 0) return;
- }
- else
- ParamCount++;
-
- for (;;)
- {
- if ((CurCommand & 0xFF) || (NumCommands == 4 && CurCommand == 0))
- {
- CmdFIFOEntry entry;
- entry.Command = CurCommand & 0xFF;
- entry.Param = val;
- CmdFIFOWrite(entry);
- }
-
- if (ParamCount >= TotalParams)
- {
- CurCommand >>= 8;
- NumCommands--;
- if (NumCommands == 0) break;
-
- ParamCount = 0;
- TotalParams = CmdNumParams[CurCommand & 0xFF];
- }
- if (ParamCount < TotalParams)
- break;
- }
-
+ WriteToGXFIFO(val);
return;
}
diff --git a/src/GPU3D.h b/src/GPU3D.h
index a78639e..81856a7 100644
--- a/src/GPU3D.h
+++ b/src/GPU3D.h
@@ -85,6 +85,8 @@ void VBlank();
void VCount215();
u32* GetLine(int line);
+void WriteToGXFIFO(u32 val);
+
u8 Read8(u32 addr);
u16 Read16(u32 addr);
u32 Read32(u32 addr);
diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp
index 965428a..eb38ee7 100644
--- a/src/GPU3D_Soft.cpp
+++ b/src/GPU3D_Soft.cpp
@@ -541,7 +541,6 @@ bool DepthTest(s32 oldz, s32 z)
u32 RenderPixel(Polygon* polygon, u8 vr, u8 vg, u8 vb, s16 s, s16 t)
{
- u32 attr = polygon->Attr;
u8 r, g, b, a;
u32 blendmode = (polygon->Attr >> 4) & 0x3;
@@ -910,7 +909,10 @@ void RenderPolygon(Polygon* polygon)
// wireframe polygons. really ugly, but works
if (wireframe && edge==0)
+ {
+ x = r_edgestart + 1;
continue;
+ }
u32 pixeladdr = (y*256) + x;
u32 attr = polygon->Attr & 0x3F008000;