diff options
| -rw-r--r-- | melonDS.cbp | 47 | ||||
| -rw-r--r-- | src/ARM.cpp | 6 | ||||
| -rw-r--r-- | src/DMA.cpp | 17 | ||||
| -rw-r--r-- | src/GPU3D.cpp | 75 | ||||
| -rw-r--r-- | src/GPU3D.h | 2 | ||||
| -rw-r--r-- | src/GPU3D_Soft.cpp | 4 | 
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; |