mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-31 10:09:36 -06:00
Merge UI related projects into the main DolphinWX project.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7136 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -41,7 +41,24 @@ if(wxWidgets_FOUND)
|
||||
Src/WiimoteConfigDiag.cpp
|
||||
Src/MemoryCards/WiiSaveCrypted.cpp
|
||||
Src/WXInputBase.cpp
|
||||
Src/WxUtils.cpp)
|
||||
Src/WxUtils.cpp
|
||||
Src/BreakpointDlg.cpp
|
||||
Src/BreakpointView.cpp
|
||||
Src/BreakpointWindow.cpp
|
||||
Src/CodeView.cpp
|
||||
Src/CodeWindow.cpp
|
||||
Src/CodeWindowFunctions.cpp
|
||||
Src/DebuggerPanel.cpp
|
||||
Src/DebuggerUIUtil.cpp
|
||||
Src/DSPDebugWindow.cpp
|
||||
Src/DSPRegisterView.cpp
|
||||
Src/JitWindow.cpp
|
||||
Src/MemoryCheckDlg.cpp
|
||||
Src/MemoryView.cpp
|
||||
Src/MemoryWindow.cpp
|
||||
Src/RegisterView.cpp
|
||||
Src/RegisterWindow.cpp
|
||||
Src/VideoConfigDiag.cpp)
|
||||
|
||||
set(WXLIBS debwx
|
||||
debugger_ui_util
|
||||
|
@ -131,7 +131,7 @@
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\AudioCommon\Src;..\Core\Src;..\DebuggerWX\Src;..\DebuggerUICommon\Src;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<PostBuildEvent>
|
||||
@ -145,7 +145,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\AudioCommon\Src;..\Core\Src;..\DebuggerWX\Src;..\DebuggerUICommon\Src;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<PostBuildEvent>
|
||||
@ -159,7 +159,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\AudioCommon\Src;..\Core\Src;..\DebuggerWX\Src;..\DebuggerUICommon\Src;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<PostBuildEvent>
|
||||
@ -173,7 +173,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\AudioCommon\Src;..\Core\Src;..\DebuggerWX\Src;..\DebuggerUICommon\Src;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<PostBuildEvent>
|
||||
@ -187,7 +187,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\AudioCommon\Src;..\Core\Src;..\DebuggerWX\Src;..\DebuggerUICommon\Src;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<PostBuildEvent>
|
||||
@ -201,7 +201,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|x64'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\AudioCommon\Src;..\Core\Src;..\DebuggerWX\Src;..\DebuggerUICommon\Src;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\InputUICommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link />
|
||||
<PostBuildEvent>
|
||||
@ -217,8 +217,18 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ClCompile Include="Src\AboutDolphin.cpp" />
|
||||
<ClCompile Include="Src\ARCodeAddEdit.cpp" />
|
||||
<ClCompile Include="Src\BootManager.cpp" />
|
||||
<ClCompile Include="Src\BreakpointDlg.cpp" />
|
||||
<ClCompile Include="Src\BreakpointView.cpp" />
|
||||
<ClCompile Include="Src\BreakpointWindow.cpp" />
|
||||
<ClCompile Include="Src\CheatsWindow.cpp" />
|
||||
<ClCompile Include="Src\CodeView.cpp" />
|
||||
<ClCompile Include="Src\CodeWindow.cpp" />
|
||||
<ClCompile Include="Src\CodeWindowFunctions.cpp" />
|
||||
<ClCompile Include="Src\ConfigMain.cpp" />
|
||||
<ClCompile Include="Src\DebuggerPanel.cpp" />
|
||||
<ClCompile Include="Src\DebuggerUIUtil.cpp" />
|
||||
<ClCompile Include="Src\DSPDebugWindow.cpp" />
|
||||
<ClCompile Include="Src\DSPRegisterView.cpp" />
|
||||
<ClCompile Include="Src\Frame.cpp" />
|
||||
<ClCompile Include="Src\FrameAui.cpp" />
|
||||
<ClCompile Include="Src\FrameTools.cpp" />
|
||||
@ -229,6 +239,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ClCompile Include="Src\InputConfigDiagBitmaps.cpp" />
|
||||
<ClCompile Include="Src\ISOFile.cpp" />
|
||||
<ClCompile Include="Src\ISOProperties.cpp" />
|
||||
<ClCompile Include="Src\JitWindow.cpp" />
|
||||
<ClCompile Include="Src\LogWindow.cpp" />
|
||||
<ClCompile Include="Src\Main.cpp" />
|
||||
<ClCompile Include="Src\MainNoGUI.cpp">
|
||||
@ -242,9 +253,14 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ClCompile Include="Src\MemcardManager.cpp" />
|
||||
<ClCompile Include="Src\MemoryCards\GCMemcard.cpp" />
|
||||
<ClCompile Include="Src\MemoryCards\WiiSaveCrypted.cpp" />
|
||||
<ClCompile Include="Src\MemoryCheckDlg.cpp" />
|
||||
<ClCompile Include="Src\MemoryView.cpp" />
|
||||
<ClCompile Include="Src\MemoryWindow.cpp" />
|
||||
<ClCompile Include="Src\NetWindow.cpp" />
|
||||
<ClCompile Include="Src\PatchAddEdit.cpp" />
|
||||
<ClCompile Include="Src\PHackSettings.cpp" />
|
||||
<ClCompile Include="Src\RegisterView.cpp" />
|
||||
<ClCompile Include="Src\RegisterWindow.cpp" />
|
||||
<ClCompile Include="Src\stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='DebugFast|Win32'">Create</PrecompiledHeader>
|
||||
@ -254,6 +270,7 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\UDPConfigDiag.cpp" />
|
||||
<ClCompile Include="Src\VideoConfigDiag.cpp" />
|
||||
<ClCompile Include="Src\WiimoteConfigDiag.cpp" />
|
||||
<ClCompile Include="Src\WXInputBase.cpp" />
|
||||
<ClCompile Include="Src\WxUtils.cpp" />
|
||||
@ -263,8 +280,17 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ClInclude Include="Src\AboutDolphin.h" />
|
||||
<ClInclude Include="Src\ARCodeAddEdit.h" />
|
||||
<ClInclude Include="Src\BootManager.h" />
|
||||
<ClInclude Include="Src\BreakpointDlg.h" />
|
||||
<ClInclude Include="Src\BreakpointView.h" />
|
||||
<ClInclude Include="Src\BreakpointWindow.h" />
|
||||
<ClInclude Include="Src\CheatsWindow.h" />
|
||||
<ClInclude Include="Src\CodeView.h" />
|
||||
<ClInclude Include="Src\CodeWindow.h" />
|
||||
<ClInclude Include="Src\ConfigMain.h" />
|
||||
<ClInclude Include="Src\DebuggerPanel.h" />
|
||||
<ClInclude Include="Src\DebuggerUIUtil.h" />
|
||||
<ClInclude Include="Src\DSPDebugWindow.h" />
|
||||
<ClInclude Include="Src\DSPRegisterView.h" />
|
||||
<ClInclude Include="Src\Frame.h" />
|
||||
<ClInclude Include="Src\GameListCtrl.h" />
|
||||
<ClInclude Include="Src\GeckoCodeDiag.h" />
|
||||
@ -273,16 +299,23 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ClInclude Include="Src\InputConfigDiag.h" />
|
||||
<ClInclude Include="Src\ISOFile.h" />
|
||||
<ClInclude Include="Src\ISOProperties.h" />
|
||||
<ClInclude Include="Src\JitWindow.h" />
|
||||
<ClInclude Include="Src\LogWindow.h" />
|
||||
<ClInclude Include="Src\Main.h" />
|
||||
<ClInclude Include="Src\MemcardManager.h" />
|
||||
<ClInclude Include="Src\MemoryCards\GCMemcard.h" />
|
||||
<ClInclude Include="Src\MemoryCards\WiiSaveCrypted.h" />
|
||||
<ClInclude Include="Src\MemoryCheckDlg.h" />
|
||||
<ClInclude Include="Src\MemoryView.h" />
|
||||
<ClInclude Include="Src\MemoryWindow.h" />
|
||||
<ClInclude Include="Src\NetWindow.h" />
|
||||
<ClInclude Include="Src\PatchAddEdit.h" />
|
||||
<ClInclude Include="Src\PHackSettings.h" />
|
||||
<ClInclude Include="Src\RegisterView.h" />
|
||||
<ClInclude Include="Src\RegisterWindow.h" />
|
||||
<ClInclude Include="Src\stdafx.h" />
|
||||
<ClInclude Include="Src\UDPConfigDiag.h" />
|
||||
<ClInclude Include="Src\VideoConfigDiag.h" />
|
||||
<ClInclude Include="Src\WiimoteConfigDiag.h" />
|
||||
<ClInclude Include="Src\WXInputBase.h" />
|
||||
<ClInclude Include="Src\WxUtils.h" />
|
||||
@ -335,12 +368,6 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ProjectReference Include="..\Core\Core.vcxproj">
|
||||
<Project>{8c60e805-0da5-4e25-8f84-038db504bb0d}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\DebuggerUICommon\DebuggerUICommon.vcxproj">
|
||||
<Project>{c5a30052-1fc7-4a30-b4a2-6b06da298ab3}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\DebuggerWX\Debugger.vcxproj">
|
||||
<Project>{518f8625-9bfd-402f-aacb-01ce9a1ced8a}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\DiscIO\DiscIO.vcxproj">
|
||||
<Project>{b6398059-ebb6-4c34-b547-95f365b71ff4}</Project>
|
||||
</ProjectReference>
|
||||
@ -350,9 +377,6 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
|
||||
<ProjectReference Include="..\VideoCommon\VideoCommon.vcxproj">
|
||||
<Project>{3e5c4e02-1ba9-4776-bdbe-e3f91ffa34cf}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\VideoUICommon\VideoUICommon.vcxproj">
|
||||
<Project>{281f6001-d032-4c3b-87af-0b00962b4006}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="DolphinWX.rc" />
|
||||
|
@ -87,6 +87,57 @@
|
||||
<ClCompile Include="Src\PHackSettings.cpp">
|
||||
<Filter>GUI</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\DebuggerUIUtil.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\VideoConfigDiag.cpp">
|
||||
<Filter>GUI\Video</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\CodeView.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\MemoryView.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\DebuggerPanel.cpp">
|
||||
<Filter>GUI\Video</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\BreakpointDlg.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\BreakpointWindow.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\CodeWindow.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\CodeWindowFunctions.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\DSPDebugWindow.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\JitWindow.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\MemoryCheckDlg.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\MemoryWindow.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\RegisterWindow.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\RegisterView.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\DSPRegisterView.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Src\BreakpointView.cpp">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Src\Main.h" />
|
||||
@ -165,6 +216,54 @@
|
||||
<ClInclude Include="Src\PHackSettings.h">
|
||||
<Filter>GUI</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\DebuggerUIUtil.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\VideoConfigDiag.h">
|
||||
<Filter>GUI\Video</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\CodeView.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\MemoryView.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\DebuggerPanel.h">
|
||||
<Filter>GUI\Video</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\BreakpointDlg.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\BreakpointWindow.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\CodeWindow.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\DSPDebugWindow.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\JitWindow.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\MemoryCheckDlg.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\MemoryWindow.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\RegisterWindow.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\RegisterView.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\DSPRegisterView.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Src\BreakpointView.h">
|
||||
<Filter>GUI\Debugger</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Src\SConscript" />
|
||||
@ -192,6 +291,12 @@
|
||||
<Filter Include="Resources">
|
||||
<UniqueIdentifier>{9dd3ef96-b03a-4c14-9d35-6a4850acd430}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="GUI\Debugger">
|
||||
<UniqueIdentifier>{8ab1ce40-f5e7-47b8-9706-59c924af4eaa}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="GUI\Video">
|
||||
<UniqueIdentifier>{ff5180be-244f-4c0e-8a35-bd4bffb6a343}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="DolphinWX.rc">
|
||||
|
84
Source/Core/DolphinWX/Src/BreakpointDlg.cpp
Normal file
84
Source/Core/DolphinWX/Src/BreakpointDlg.cpp
Normal file
@ -0,0 +1,84 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
#include "Common.h"
|
||||
#include "Host.h"
|
||||
#include "StringUtil.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "BreakpointWindow.h"
|
||||
#include "BreakpointDlg.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(BreakPointDlg,wxDialog)
|
||||
EVT_CLOSE(BreakPointDlg::OnClose)
|
||||
EVT_BUTTON(ID_OK, BreakPointDlg::OnOK)
|
||||
EVT_BUTTON(ID_CANCEL, BreakPointDlg::OnCancel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
class CBreakPointWindow;
|
||||
|
||||
BreakPointDlg::BreakPointDlg(CBreakPointWindow *_Parent, wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
|
||||
: wxDialog(parent, id, title, position, size, style)
|
||||
, Parent(_Parent)
|
||||
{
|
||||
CreateGUIControls();
|
||||
}
|
||||
|
||||
|
||||
BreakPointDlg::~BreakPointDlg()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void BreakPointDlg::CreateGUIControls()
|
||||
{
|
||||
SetIcon(wxNullIcon);
|
||||
SetSize(8,8,279,121);
|
||||
Center();
|
||||
|
||||
|
||||
m_pButtonOK = new wxButton(this, ID_OK, wxT("OK"), wxPoint(192,64), wxSize(73,25), 0, wxDefaultValidator, wxT("OK"));
|
||||
|
||||
m_pButtonCancel = new wxButton(this, ID_CANCEL, _("Cancel"), wxPoint(112,64), wxSize(73,25), 0, wxDefaultValidator, _("Cancel"));
|
||||
|
||||
m_pEditAddress = new wxTextCtrl(this, ID_ADDRESS, wxT("80000000"), wxPoint(56,24), wxSize(197,20), 0, wxDefaultValidator, wxT("WxEdit1"));
|
||||
}
|
||||
|
||||
|
||||
void BreakPointDlg::OnClose(wxCloseEvent& /*event*/)
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void BreakPointDlg::OnOK(wxCommandEvent& /*event*/)
|
||||
{
|
||||
wxString AddressString = m_pEditAddress->GetLineText(0);
|
||||
u32 Address = 0;
|
||||
if (AsciiToHex(AddressString.mb_str(), Address))
|
||||
{
|
||||
PowerPC::breakpoints.Add(Address);
|
||||
Parent->NotifyUpdate();
|
||||
//Host_UpdateBreakPointView();
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
void BreakPointDlg::OnCancel(wxCommandEvent& /*event*/)
|
||||
{
|
||||
Close();
|
||||
}
|
66
Source/Core/DolphinWX/Src/BreakpointDlg.h
Normal file
66
Source/Core/DolphinWX/Src/BreakpointDlg.h
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __BREAKPOINTDLG_h__
|
||||
#define __BREAKPOINTDLG_h__
|
||||
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/statbox.h>
|
||||
|
||||
class BreakPointDlg : public wxDialog
|
||||
{
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
public:
|
||||
BreakPointDlg(CBreakPointWindow *, wxWindow *parent, wxWindowID id = 1, const wxString &title = _("BreakPoint"),
|
||||
const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
|
||||
long style = wxCAPTION | wxSYSTEM_MENU | wxDIALOG_NO_PARENT | wxCLOSE_BOX);
|
||||
virtual ~BreakPointDlg();
|
||||
|
||||
private:
|
||||
|
||||
CBreakPointWindow *Parent;
|
||||
wxButton *m_pButtonOK;
|
||||
wxButton *m_pButtonCancel;
|
||||
wxTextCtrl *m_pEditAddress;
|
||||
|
||||
private:
|
||||
|
||||
enum
|
||||
{
|
||||
ID_WXSTATICTEXT1 = 1006,
|
||||
ID_OK = 1005,
|
||||
ID_CANCEL = 1004,
|
||||
ID_ADDRESS = 1003,
|
||||
ID_WXSTATICBOX1 = 1001,
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
void CreateGUIControls();
|
||||
void OnClose(wxCloseEvent& event);
|
||||
void OnCancel(wxCommandEvent& event);
|
||||
void OnOK(wxCommandEvent& event);
|
||||
};
|
||||
|
||||
#endif
|
171
Source/Core/DolphinWX/Src/BreakpointView.cpp
Normal file
171
Source/Core/DolphinWX/Src/BreakpointView.cpp
Normal file
@ -0,0 +1,171 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/mstream.h>
|
||||
#include <wx/imaglist.h>
|
||||
|
||||
#include "BreakpointView.h"
|
||||
#include "DebuggerUIUtil.h"
|
||||
#include "Debugger/Debugger_SymbolMap.h"
|
||||
#include "PowerPC/PPCSymbolDB.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "HW/Memmap.h"
|
||||
|
||||
extern "C" {
|
||||
#include "../resources/toolbar_add_breakpoint.c"
|
||||
#include "../resources/toolbar_add_memorycheck.c"
|
||||
#include "../resources/toolbar_delete.c"
|
||||
}
|
||||
|
||||
|
||||
CBreakPointView::CBreakPointView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
|
||||
: wxListCtrl(parent, id, pos, size, style)
|
||||
{
|
||||
SetFont(DebuggerFont);
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void CBreakPointView::Update()
|
||||
{
|
||||
ClearAll();
|
||||
|
||||
InsertColumn(0, _("Active"), wxLIST_FORMAT_LEFT, 50);
|
||||
InsertColumn(1, _("Type"), wxLIST_FORMAT_LEFT, 50);
|
||||
InsertColumn(2, _("Function"), wxLIST_FORMAT_CENTER, 200);
|
||||
InsertColumn(3, _("Address"), wxLIST_FORMAT_LEFT, 100);
|
||||
InsertColumn(4, _("Flags"), wxLIST_FORMAT_CENTER, 100);
|
||||
|
||||
char szBuffer[64];
|
||||
const BreakPoints::TBreakPoints& rBreakPoints = PowerPC::breakpoints.GetBreakPoints();
|
||||
for (size_t i = 0; i < rBreakPoints.size(); i++)
|
||||
{
|
||||
const TBreakPoint& rBP = rBreakPoints[i];
|
||||
if (!rBP.bTemporary)
|
||||
{
|
||||
wxString temp;
|
||||
temp = wxString::FromAscii(rBP.bOn ? "on" : " ");
|
||||
int Item = InsertItem(0, temp);
|
||||
temp = wxString::FromAscii("BP");
|
||||
SetItem(Item, 1, temp);
|
||||
|
||||
Symbol *symbol = g_symbolDB.GetSymbolFromAddr(rBP.iAddress);
|
||||
if (symbol)
|
||||
{
|
||||
temp = wxString::FromAscii(g_symbolDB.GetDescription(rBP.iAddress));
|
||||
SetItem(Item, 2, temp);
|
||||
}
|
||||
|
||||
sprintf(szBuffer, "0x%08x", rBP.iAddress);
|
||||
temp = wxString::FromAscii(szBuffer);
|
||||
SetItem(Item, 3, temp);
|
||||
|
||||
SetItemData(Item, rBP.iAddress);
|
||||
}
|
||||
}
|
||||
|
||||
const MemChecks::TMemChecks& rMemChecks = PowerPC::memchecks.GetMemChecks();
|
||||
for (size_t i = 0; i < rMemChecks.size(); i++)
|
||||
{
|
||||
const TMemCheck& rMemCheck = rMemChecks[i];
|
||||
|
||||
wxString temp;
|
||||
temp = wxString::FromAscii(rMemCheck.Break ? "on" : " ");
|
||||
int Item = InsertItem(0, temp);
|
||||
temp = wxString::FromAscii("MC");
|
||||
SetItem(Item, 1, temp);
|
||||
|
||||
Symbol *symbol = g_symbolDB.GetSymbolFromAddr(rMemCheck.StartAddress);
|
||||
if (symbol)
|
||||
{
|
||||
temp = wxString::FromAscii(g_symbolDB.GetDescription(rMemCheck.StartAddress));
|
||||
SetItem(Item, 2, temp);
|
||||
}
|
||||
|
||||
sprintf(szBuffer, "0x%08x to 0%08x", rMemCheck.StartAddress, rMemCheck.EndAddress);
|
||||
temp = wxString::FromAscii(szBuffer);
|
||||
SetItem(Item, 3, temp);
|
||||
|
||||
size_t c = 0;
|
||||
if (rMemCheck.OnRead) szBuffer[c++] = 'r';
|
||||
if (rMemCheck.OnWrite) szBuffer[c++] = 'w';
|
||||
szBuffer[c] = 0x00;
|
||||
temp = wxString::FromAscii(szBuffer);
|
||||
SetItem(Item, 4, temp);
|
||||
|
||||
SetItemData(Item, rMemCheck.StartAddress);
|
||||
}
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void CBreakPointView::DeleteCurrentSelection()
|
||||
{
|
||||
int Item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
|
||||
if (Item >= 0)
|
||||
{
|
||||
u32 Address = (u32)GetItemData(Item);
|
||||
PowerPC::breakpoints.DeleteByAddress(Address);
|
||||
PowerPC::memchecks.DeleteByAddress(Address);
|
||||
Update();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CBreakPointBar::CBreakPointBar(CBreakPointWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
|
||||
: wxListCtrl((wxWindow*)parent, id, pos, size, style)
|
||||
{
|
||||
BPWindow = parent;
|
||||
|
||||
SetBackgroundColour(wxColour(0x555555));
|
||||
SetForegroundColour(wxColour(0xffffff));
|
||||
|
||||
// load orignal size 48x48
|
||||
wxMemoryInputStream st1(toolbar_delete_png, sizeof(toolbar_delete_png));
|
||||
wxMemoryInputStream st2(toolbar_add_breakpoint_png, sizeof(toolbar_add_breakpoint_png));
|
||||
wxMemoryInputStream st3(toolbar_add_memcheck_png, sizeof(toolbar_add_memcheck_png));
|
||||
m_Bitmaps[Toolbar_Delete] = wxBitmap(wxImage(st1, wxBITMAP_TYPE_ANY, -1).Rescale(24,24), -1);
|
||||
m_Bitmaps[Toolbar_Add_BP] = wxBitmap(wxImage(st2, wxBITMAP_TYPE_ANY, -1).Rescale(24,24), -1);
|
||||
m_Bitmaps[Toolbar_Add_MC] = wxBitmap(wxImage(st3, wxBITMAP_TYPE_ANY, -1).Rescale(24,24), -1);
|
||||
|
||||
m_imageListNormal = new wxImageList(24, 24);
|
||||
m_imageListNormal->Add(m_Bitmaps[Toolbar_Delete]);
|
||||
m_imageListNormal->Add(m_Bitmaps[Toolbar_Add_BP]);
|
||||
m_imageListNormal->Add(m_Bitmaps[Toolbar_Add_MC]);
|
||||
SetImageList(m_imageListNormal, wxIMAGE_LIST_NORMAL);
|
||||
|
||||
PopulateBar();
|
||||
}
|
||||
|
||||
|
||||
void CBreakPointBar::PopulateBar()
|
||||
{
|
||||
InsertItem(IDM_DELETE, _("Delete"), 0);
|
||||
InsertItem(IDM_CLEAR, _("Clear all"), 0);
|
||||
|
||||
InsertItem(IDM_ADD_BREAKPOINT, _("Add BP..."), 1);
|
||||
InsertItem(IDM_ADD_BREAKPOINTMANY, _("Add BPs..."), 1);
|
||||
|
||||
// just add memory breakpoints if you can use them
|
||||
if (Memory::AreMemoryBreakpointsActivated())
|
||||
{
|
||||
InsertItem(IDM_ADD_MEMORYCHECK, _("Add MC..."), 2);
|
||||
InsertItem(IDM_ADD_MEMORYCHECKMANY, _("Add MCs..."), 2);
|
||||
}
|
||||
}
|
61
Source/Core/DolphinWX/Src/BreakpointView.h
Normal file
61
Source/Core/DolphinWX/Src/BreakpointView.h
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __BREAKPOINTVIEW_h__
|
||||
#define __BREAKPOINTVIEW_h__
|
||||
|
||||
#include <wx/listctrl.h>
|
||||
|
||||
#include "Common.h"
|
||||
#include "BreakpointWindow.h"
|
||||
|
||||
class CBreakPointView
|
||||
: public wxListCtrl
|
||||
{
|
||||
public:
|
||||
|
||||
CBreakPointView(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style);
|
||||
|
||||
void Update();
|
||||
void DeleteCurrentSelection();
|
||||
};
|
||||
|
||||
class CBreakPointBar
|
||||
: public wxListCtrl
|
||||
{
|
||||
public:
|
||||
|
||||
CBreakPointBar(CBreakPointWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style);
|
||||
|
||||
void PopulateBar();
|
||||
|
||||
private:
|
||||
void OnSelectItem(wxListEvent& event);
|
||||
|
||||
enum
|
||||
{
|
||||
Toolbar_Delete,
|
||||
Toolbar_Add_BP,
|
||||
Toolbar_Add_MC,
|
||||
Bitmaps_max
|
||||
};
|
||||
|
||||
CBreakPointWindow* BPWindow;
|
||||
wxBitmap m_Bitmaps[Bitmaps_max];
|
||||
};
|
||||
|
||||
#endif
|
265
Source/Core/DolphinWX/Src/BreakpointWindow.cpp
Normal file
265
Source/Core/DolphinWX/Src/BreakpointWindow.cpp
Normal file
@ -0,0 +1,265 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
#include "BreakpointView.h"
|
||||
#include "CodeWindow.h"
|
||||
#include "HW/Memmap.h"
|
||||
#include "BreakpointDlg.h"
|
||||
#include "MemoryCheckDlg.h"
|
||||
#include "Host.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "FileUtil.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(CBreakPointWindow, wxPanel)
|
||||
EVT_LIST_ITEM_ACTIVATED(ID_BPS, CBreakPointWindow::OnActivated)
|
||||
EVT_LIST_ITEM_SELECTED(ID_TOOLBAR, CBreakPointWindow::OnSelectItem)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
CBreakPointWindow::CBreakPointWindow(CCodeWindow* _pCodeWindow, wxWindow* parent,
|
||||
wxWindowID id, const wxString& title, const wxPoint& position,
|
||||
const wxSize& size, long style)
|
||||
: wxPanel(parent, id, position, size, style, title)
|
||||
, m_BreakPointListView(NULL)
|
||||
, m_pCodeWindow(_pCodeWindow)
|
||||
{
|
||||
CreateGUIControls();
|
||||
}
|
||||
|
||||
void CBreakPointWindow::CreateGUIControls()
|
||||
{
|
||||
SetSize(8, 8, 400, 370);
|
||||
Center();
|
||||
|
||||
m_BreakPointBar = new CBreakPointBar(this, ID_TOOLBAR, wxDefaultPosition, wxSize(0, 55),
|
||||
wxLC_ICON | wxSUNKEN_BORDER | wxLC_SINGLE_SEL);
|
||||
m_BreakPointListView = new CBreakPointView(this, ID_BPS, wxDefaultPosition, wxDefaultSize,
|
||||
wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING);
|
||||
|
||||
wxBoxSizer* sizerH = new wxBoxSizer(wxVERTICAL);
|
||||
sizerH->Add(m_BreakPointBar, 0, wxALL | wxEXPAND);
|
||||
sizerH->Add((wxListCtrl*)m_BreakPointListView, 1, wxEXPAND);
|
||||
|
||||
NotifyUpdate();
|
||||
SetSizer(sizerH);
|
||||
}
|
||||
|
||||
void CBreakPointWindow::OnSelectItem(wxListEvent& event)
|
||||
{
|
||||
switch(event.GetItem().GetId())
|
||||
{
|
||||
case IDM_DELETE:
|
||||
OnDelete();
|
||||
m_BreakPointBar->SetItemState(event.GetItem().GetId(), 0, wxLIST_STATE_FOCUSED);
|
||||
break;
|
||||
case IDM_CLEAR:
|
||||
OnClear();
|
||||
m_BreakPointBar->SetItemState(event.GetItem().GetId(), 0, wxLIST_STATE_FOCUSED);
|
||||
break;
|
||||
case IDM_ADD_BREAKPOINT:
|
||||
OnAddBreakPoint();
|
||||
break;
|
||||
case IDM_ADD_BREAKPOINTMANY:
|
||||
OnAddBreakPointMany();
|
||||
break;
|
||||
case IDM_ADD_MEMORYCHECK:
|
||||
OnAddMemoryCheck();
|
||||
break;
|
||||
case IDM_ADD_MEMORYCHECKMANY:
|
||||
OnAddMemoryCheckMany();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CBreakPointWindow::NotifyUpdate()
|
||||
{
|
||||
if (m_BreakPointListView != NULL) m_BreakPointListView->Update();
|
||||
}
|
||||
|
||||
void CBreakPointWindow::OnDelete()
|
||||
{
|
||||
if (m_BreakPointListView)
|
||||
{
|
||||
m_BreakPointListView->DeleteCurrentSelection();
|
||||
}
|
||||
}
|
||||
|
||||
void CBreakPointWindow::OnActivated(wxListEvent& event)
|
||||
{
|
||||
long Index = event.GetIndex();
|
||||
if (Index >= 0)
|
||||
{
|
||||
u32 Address = (u32)m_BreakPointListView->GetItemData(Index);
|
||||
if (m_pCodeWindow != NULL)
|
||||
{
|
||||
m_pCodeWindow->JumpToAddress(Address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Breakpoint actions
|
||||
// ---------------------
|
||||
|
||||
// Clear all breakpoints
|
||||
void CBreakPointWindow::OnClear()
|
||||
{
|
||||
PowerPC::breakpoints.Clear();
|
||||
PowerPC::memchecks.Clear();
|
||||
NotifyUpdate();
|
||||
}
|
||||
|
||||
// Add one breakpoint
|
||||
void CBreakPointWindow::OnAddBreakPoint()
|
||||
{
|
||||
BreakPointDlg bpDlg(this, this);
|
||||
bpDlg.ShowModal();
|
||||
}
|
||||
|
||||
// Load breakpoints from file
|
||||
void CBreakPointWindow::OnAddBreakPointMany()
|
||||
{
|
||||
// load ini
|
||||
IniFile ini;
|
||||
std::string filename = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + "BreakPoints.ini";
|
||||
|
||||
if (ini.Load(filename.c_str())) // check if there is any file there
|
||||
{
|
||||
// get lines from a certain section
|
||||
std::vector<std::string> lines;
|
||||
if (!ini.GetLines("BreakPoints", lines))
|
||||
{
|
||||
wxMessageBox(_("You have no [BreakPoints] line in your file"));
|
||||
return;
|
||||
}
|
||||
|
||||
for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter)
|
||||
{
|
||||
std::string line = StripSpaces(*iter);
|
||||
u32 Address = 0;
|
||||
if (AsciiToHex(line.c_str(), Address))
|
||||
{
|
||||
PowerPC::breakpoints.Add(Address);
|
||||
}
|
||||
}
|
||||
// Only update after we are done with the loop
|
||||
NotifyUpdate();
|
||||
}
|
||||
else
|
||||
{
|
||||
wxMessageBox(_("Couldn't find GameConfig/BreakPoints.ini file"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Memory check actions
|
||||
// ---------------------
|
||||
void
|
||||
CBreakPointWindow::OnAddMemoryCheck()
|
||||
{
|
||||
MemoryCheckDlg memDlg(this);
|
||||
memDlg.ShowModal();
|
||||
}
|
||||
|
||||
// Load memory checks from file
|
||||
void CBreakPointWindow::OnAddMemoryCheckMany()
|
||||
{
|
||||
// load ini
|
||||
IniFile ini;
|
||||
std::string filename = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + "MemoryChecks.ini";
|
||||
|
||||
if (ini.Load(filename.c_str()))
|
||||
{
|
||||
// get lines from a certain section
|
||||
std::vector<std::string> lines;
|
||||
if (!ini.GetLines("MemoryChecks", lines))
|
||||
{
|
||||
wxMessageBox(_("You have no [MemoryChecks] line in your file"));
|
||||
return;
|
||||
}
|
||||
|
||||
for (std::vector<std::string>::const_iterator iter = lines.begin(); iter != lines.end(); ++iter)
|
||||
{
|
||||
std::string line = StripSpaces(*iter);
|
||||
std::vector<std::string> pieces;
|
||||
SplitString(line, ' ', pieces); // split string
|
||||
|
||||
TMemCheck MemCheck;
|
||||
u32 sAddress = 0;
|
||||
u32 eAddress = 0;
|
||||
bool doCommon = false;
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// Decide if we have a range or just one address, and if we should break or not
|
||||
// --------------
|
||||
if (
|
||||
pieces.size() == 1
|
||||
&& AsciiToHex(pieces[0].c_str(), sAddress)
|
||||
&& pieces[0].size() == 8
|
||||
)
|
||||
{
|
||||
// address range
|
||||
MemCheck.StartAddress = sAddress;
|
||||
MemCheck.EndAddress = sAddress;
|
||||
doCommon = true;
|
||||
MemCheck.Break = false;
|
||||
}
|
||||
else if(
|
||||
pieces.size() == 2
|
||||
&& AsciiToHex(pieces[0].c_str(), sAddress) && AsciiToHex(pieces[1].c_str(), eAddress)
|
||||
&& pieces[0].size() == 8 && pieces[1].size() == 8
|
||||
)
|
||||
{
|
||||
// address range
|
||||
MemCheck.StartAddress = sAddress;
|
||||
MemCheck.EndAddress = eAddress;
|
||||
doCommon = true;
|
||||
MemCheck.Break = false;
|
||||
}
|
||||
else if(
|
||||
pieces.size() == 3
|
||||
&& AsciiToHex(pieces[0].c_str(), sAddress) && AsciiToHex(pieces[1].c_str(), eAddress)
|
||||
&& pieces[0].size() == 8 && pieces[1].size() == 8 && pieces[2].size() == 1
|
||||
)
|
||||
{
|
||||
// address range
|
||||
MemCheck.StartAddress = sAddress;
|
||||
MemCheck.EndAddress = eAddress;
|
||||
doCommon = true;
|
||||
MemCheck.Break = true;
|
||||
}
|
||||
|
||||
if (doCommon)
|
||||
{
|
||||
// settings for the memory check
|
||||
MemCheck.OnRead = true;
|
||||
MemCheck.OnWrite = true;
|
||||
MemCheck.Log = true;
|
||||
//MemCheck.Break = false; // this is also what sets Active "on" in the breakpoint window
|
||||
// so don't think it's off because we are only writing this to the log
|
||||
PowerPC::memchecks.Add(MemCheck);
|
||||
}
|
||||
}
|
||||
// Update after we are done with the loop
|
||||
NotifyUpdate();
|
||||
}
|
||||
else
|
||||
{
|
||||
wxMessageBox(_("You have no ") + wxString::FromAscii(File::GetUserPath(D_GAMECONFIG_IDX)) + _("MemoryChecks.ini file"));
|
||||
}
|
||||
}
|
||||
|
83
Source/Core/DolphinWX/Src/BreakpointWindow.h
Normal file
83
Source/Core/DolphinWX/Src/BreakpointWindow.h
Normal file
@ -0,0 +1,83 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __BREAKPOINTWINDOW_h__
|
||||
#define __BREAKPOINTWINDOW_h__
|
||||
|
||||
class CBreakPointView;
|
||||
class CBreakPointBar;
|
||||
class CCodeWindow;
|
||||
class wxListEvent;
|
||||
class IniFile;
|
||||
|
||||
enum
|
||||
{
|
||||
IDM_DELETE = 0,
|
||||
IDM_CLEAR,
|
||||
IDM_ADD_BREAKPOINT,
|
||||
IDM_ADD_BREAKPOINTMANY,
|
||||
IDM_ADD_MEMORYCHECK,
|
||||
IDM_ADD_MEMORYCHECKMANY
|
||||
};
|
||||
|
||||
class CBreakPointWindow
|
||||
: public wxPanel
|
||||
{
|
||||
private:
|
||||
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
public:
|
||||
|
||||
CBreakPointWindow(CCodeWindow* _pCodeWindow,
|
||||
wxWindow* parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
const wxString& title = _("Breakpoints"),
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTAB_TRAVERSAL | wxBORDER_NONE);
|
||||
|
||||
void NotifyUpdate();
|
||||
void OnDelete();
|
||||
void OnClear();
|
||||
void OnAddBreakPoint();
|
||||
void OnAddBreakPointMany();
|
||||
void OnAddMemoryCheck();
|
||||
void OnAddMemoryCheckMany();
|
||||
|
||||
private:
|
||||
|
||||
enum
|
||||
{
|
||||
ID_TOOLBAR = 501,
|
||||
ID_BPS = 1002,
|
||||
};
|
||||
|
||||
CBreakPointBar* m_BreakPointBar;
|
||||
CBreakPointView* m_BreakPointListView;
|
||||
CCodeWindow* m_pCodeWindow;
|
||||
|
||||
// void RecreateToolbar();
|
||||
// void PopulateToolbar(wxToolBar* toolBar);
|
||||
// void InitBitmaps();
|
||||
void CreateGUIControls();
|
||||
|
||||
void OnSelectItem(wxListEvent& event);
|
||||
void OnActivated(wxListEvent& event);
|
||||
};
|
||||
|
||||
#endif
|
594
Source/Core/DolphinWX/Src/CodeView.cpp
Normal file
594
Source/Core/DolphinWX/Src/CodeView.cpp
Normal file
@ -0,0 +1,594 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "Common.h"
|
||||
#include "StringUtil.h"
|
||||
#include "DebuggerUIUtil.h"
|
||||
#include "DebugInterface.h"
|
||||
|
||||
#include "Host.h"
|
||||
#include "CodeView.h"
|
||||
#include "SymbolDB.h"
|
||||
|
||||
#include <wx/event.h>
|
||||
#include <wx/clipbrd.h>
|
||||
#include <wx/textdlg.h>
|
||||
|
||||
DEFINE_EVENT_TYPE(wxEVT_CODEVIEW_CHANGE);
|
||||
|
||||
enum
|
||||
{
|
||||
IDM_GOTOINMEMVIEW = 12000,
|
||||
IDM_COPYADDRESS,
|
||||
IDM_COPYHEX,
|
||||
IDM_COPYCODE,
|
||||
IDM_INSERTBLR, IDM_INSERTNOP,
|
||||
IDM_RUNTOHERE,
|
||||
IDM_JITRESULTS,
|
||||
IDM_FOLLOWBRANCH,
|
||||
IDM_RENAMESYMBOL,
|
||||
IDM_PATCHALERT,
|
||||
IDM_COPYFUNCTION,
|
||||
IDM_ADDFUNCTION,
|
||||
};
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(CCodeView, wxControl)
|
||||
EVT_ERASE_BACKGROUND(CCodeView::OnErase)
|
||||
EVT_PAINT(CCodeView::OnPaint)
|
||||
EVT_LEFT_DOWN(CCodeView::OnMouseDown)
|
||||
EVT_LEFT_UP(CCodeView::OnMouseUpL)
|
||||
EVT_MOTION(CCodeView::OnMouseMove)
|
||||
EVT_RIGHT_DOWN(CCodeView::OnMouseDown)
|
||||
EVT_RIGHT_UP(CCodeView::OnMouseUpR)
|
||||
EVT_MENU(-1, CCodeView::OnPopupMenu)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
CCodeView::CCodeView(DebugInterface* debuginterface, SymbolDB *symboldb, wxWindow* parent, wxWindowID Id, const wxSize& Size)
|
||||
: wxControl(parent, Id, wxDefaultPosition, Size),
|
||||
debugger(debuginterface),
|
||||
symbol_db(symboldb),
|
||||
plain(false),
|
||||
rowHeight(13),
|
||||
selection(0),
|
||||
oldSelection(0),
|
||||
selectionChanged(false),
|
||||
selecting(false),
|
||||
hasFocus(false),
|
||||
showHex(false),
|
||||
lx(-1),
|
||||
ly(-1)
|
||||
{
|
||||
rowHeight = 13;
|
||||
align = debuginterface->getInstructionSize(0);
|
||||
curAddress = debuginterface->getPC();
|
||||
selection = 0;
|
||||
}
|
||||
|
||||
|
||||
wxSize CCodeView::DoGetBestSize() const
|
||||
{
|
||||
wxSize bestSize;
|
||||
bestSize.x = 400;
|
||||
bestSize.y = 800;
|
||||
return(bestSize);
|
||||
}
|
||||
|
||||
|
||||
int CCodeView::YToAddress(int y)
|
||||
{
|
||||
wxRect rc = GetClientRect();
|
||||
int ydiff = y - rc.height / 2 - rowHeight / 2;
|
||||
ydiff = (int)(floorf((float)ydiff / (float)rowHeight)) + 1;
|
||||
return(curAddress + ydiff * align);
|
||||
}
|
||||
|
||||
|
||||
void CCodeView::OnMouseDown(wxMouseEvent& event)
|
||||
{
|
||||
int x = event.m_x;
|
||||
int y = event.m_y;
|
||||
|
||||
if (x > 16)
|
||||
{
|
||||
oldSelection = selection;
|
||||
selection = YToAddress(y);
|
||||
// SetCapture(wnd);
|
||||
bool oldselecting = selecting;
|
||||
selecting = true;
|
||||
|
||||
if (!oldselecting || (selection != oldSelection))
|
||||
{
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ToggleBreakpoint(YToAddress(y));
|
||||
}
|
||||
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CCodeView::ToggleBreakpoint(u32 address)
|
||||
{
|
||||
debugger->toggleBreakpoint(address);
|
||||
redraw();
|
||||
Host_UpdateBreakPointView();
|
||||
}
|
||||
|
||||
|
||||
void CCodeView::OnMouseMove(wxMouseEvent& event)
|
||||
{
|
||||
wxRect rc = GetClientRect();
|
||||
|
||||
if (event.m_leftDown)
|
||||
{
|
||||
if (event.m_x > 16)
|
||||
{
|
||||
if (event.m_y < 0)
|
||||
{
|
||||
curAddress -= align;
|
||||
redraw();
|
||||
}
|
||||
else if (event.m_y > rc.height)
|
||||
{
|
||||
curAddress += align;
|
||||
redraw();
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMouseDown(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
void CCodeView::RaiseEvent()
|
||||
{
|
||||
wxCommandEvent ev(wxEVT_CODEVIEW_CHANGE, GetId());
|
||||
ev.SetEventObject(this);
|
||||
ev.SetInt(selection);
|
||||
GetEventHandler()->ProcessEvent(ev);
|
||||
}
|
||||
|
||||
void CCodeView::OnMouseUpL(wxMouseEvent& event)
|
||||
{
|
||||
if (event.m_x > 16)
|
||||
{
|
||||
curAddress = YToAddress(event.m_y);
|
||||
selecting = false;
|
||||
//ReleaseCapture();
|
||||
redraw();
|
||||
}
|
||||
RaiseEvent();
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
u32 CCodeView::AddrToBranch(u32 addr)
|
||||
{
|
||||
char disasm[256];
|
||||
debugger->disasm(addr, disasm, 256);
|
||||
const char *mojs = strstr(disasm, "->0x");
|
||||
if (mojs)
|
||||
{
|
||||
u32 dest;
|
||||
sscanf(mojs+4,"%08x", &dest);
|
||||
return dest;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CCodeView::InsertBlrNop(int Blr)
|
||||
{
|
||||
// Check if this address has been modified
|
||||
int find = -1;
|
||||
for(u32 i = 0; i < BlrList.size(); i++)
|
||||
{
|
||||
if(BlrList.at(i).Address == selection)
|
||||
{ find = i; break; }
|
||||
}
|
||||
|
||||
// Save the old value
|
||||
if (find >= 0)
|
||||
{
|
||||
debugger->writeExtraMemory(0, BlrList.at(find).OldValue, selection);
|
||||
BlrList.erase(BlrList.begin() + find);
|
||||
}
|
||||
else
|
||||
{
|
||||
BlrStruct Temp;
|
||||
Temp.Address = selection;
|
||||
Temp.OldValue = debugger->readMemory(selection);
|
||||
BlrList.push_back(Temp);
|
||||
if (Blr == 0)
|
||||
debugger->insertBLR(selection, 0x4e800020);
|
||||
else
|
||||
debugger->insertBLR(selection, 0x60000000);
|
||||
}
|
||||
redraw();
|
||||
}
|
||||
|
||||
void CCodeView::OnPopupMenu(wxCommandEvent& event)
|
||||
{
|
||||
#if wxUSE_CLIPBOARD
|
||||
wxTheClipboard->Open();
|
||||
#endif
|
||||
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_GOTOINMEMVIEW:
|
||||
// CMemoryDlg::Goto(selection);
|
||||
break;
|
||||
|
||||
#if wxUSE_CLIPBOARD
|
||||
case IDM_COPYADDRESS:
|
||||
wxTheClipboard->SetData(new wxTextDataObject(wxString::Format(_T("%08x"), selection)));
|
||||
break;
|
||||
|
||||
case IDM_COPYCODE:
|
||||
{
|
||||
char disasm[256];
|
||||
debugger->disasm(selection, disasm, 256);
|
||||
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(disasm))); //Have to manually convert from char* to wxString, don't have to in Windows?
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_COPYHEX:
|
||||
{
|
||||
char temp[24];
|
||||
sprintf(temp, "%08x", debugger->readInstruction(selection));
|
||||
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(temp)));
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case IDM_COPYFUNCTION:
|
||||
{
|
||||
Symbol *symbol = symbol_db->GetSymbolFromAddr(selection);
|
||||
if (symbol) {
|
||||
std::string text;
|
||||
text = text + symbol->name + "\r\n";
|
||||
// we got a function
|
||||
u32 start = symbol->address;
|
||||
u32 end = start + symbol->size;
|
||||
for (u32 addr = start; addr != end; addr += 4) {
|
||||
char disasm[256];
|
||||
debugger->disasm(addr, disasm, 256);
|
||||
text = text + StringFromFormat("%08x: ", addr) + disasm + "\r\n";
|
||||
}
|
||||
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(text.c_str())));
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case IDM_RUNTOHERE:
|
||||
debugger->setBreakpoint(selection);
|
||||
debugger->runToBreakpoint();
|
||||
redraw();
|
||||
break;
|
||||
|
||||
// Insert blr or restore old value
|
||||
case IDM_INSERTBLR:
|
||||
InsertBlrNop(0);
|
||||
redraw();
|
||||
break;
|
||||
case IDM_INSERTNOP:
|
||||
InsertBlrNop(1);
|
||||
redraw();
|
||||
break;
|
||||
|
||||
case IDM_JITRESULTS:
|
||||
debugger->showJitResults(selection);
|
||||
break;
|
||||
|
||||
case IDM_FOLLOWBRANCH:
|
||||
{
|
||||
u32 dest = AddrToBranch(selection);
|
||||
if (dest)
|
||||
Center(dest);
|
||||
RaiseEvent();
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_ADDFUNCTION:
|
||||
{
|
||||
symbol_db->AddFunction(selection);
|
||||
Host_NotifyMapLoaded();
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_RENAMESYMBOL:
|
||||
{
|
||||
Symbol *symbol = symbol_db->GetSymbolFromAddr(selection);
|
||||
if (symbol) {
|
||||
wxTextEntryDialog input_symbol(this, wxString::FromAscii("Rename symbol:"), wxGetTextFromUserPromptStr,
|
||||
wxString::FromAscii(symbol->name.c_str()));
|
||||
if (input_symbol.ShowModal() == wxID_OK) {
|
||||
symbol->name = input_symbol.GetValue().mb_str();
|
||||
redraw(); // Redraw to show the renamed symbol
|
||||
}
|
||||
Host_NotifyMapLoaded();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_PATCHALERT:
|
||||
{
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#if wxUSE_CLIPBOARD
|
||||
wxTheClipboard->Close();
|
||||
#endif
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CCodeView::OnMouseUpR(wxMouseEvent& event)
|
||||
{
|
||||
bool isSymbol = symbol_db->GetSymbolFromAddr(selection) != 0;
|
||||
// popup menu
|
||||
wxMenu* menu = new wxMenu;
|
||||
//menu->Append(IDM_GOTOINMEMVIEW, "&Goto in mem view");
|
||||
menu->Append(IDM_FOLLOWBRANCH, wxString::FromAscii("&Follow branch"))->Enable(AddrToBranch(selection) ? true : false);
|
||||
menu->AppendSeparator();
|
||||
#if wxUSE_CLIPBOARD
|
||||
menu->Append(IDM_COPYADDRESS, wxString::FromAscii("Copy &address"));
|
||||
menu->Append(IDM_COPYFUNCTION, wxString::FromAscii("Copy &function"))->Enable(isSymbol);
|
||||
menu->Append(IDM_COPYCODE, wxString::FromAscii("Copy &code line"));
|
||||
menu->Append(IDM_COPYHEX, wxString::FromAscii("Copy &hex"));
|
||||
menu->AppendSeparator();
|
||||
#endif
|
||||
menu->Append(IDM_RENAMESYMBOL, wxString::FromAscii("Rename &symbol"))->Enable(isSymbol);
|
||||
menu->AppendSeparator();
|
||||
menu->Append(IDM_RUNTOHERE, _("&Run To Here"));
|
||||
menu->Append(IDM_ADDFUNCTION, _("&Add function"));
|
||||
menu->Append(IDM_JITRESULTS, wxString::FromAscii("PPC vs X86"));
|
||||
menu->Append(IDM_INSERTBLR, wxString::FromAscii("Insert &blr"));
|
||||
menu->Append(IDM_INSERTNOP, wxString::FromAscii("Insert &nop"));
|
||||
menu->Append(IDM_PATCHALERT, wxString::FromAscii("Patch alert"));
|
||||
PopupMenu(menu);
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CCodeView::OnErase(wxEraseEvent& event)
|
||||
{}
|
||||
|
||||
|
||||
void CCodeView::OnPaint(wxPaintEvent& event)
|
||||
{
|
||||
// --------------------------------------------------------------------
|
||||
// General settings
|
||||
// -------------------------
|
||||
wxPaintDC dc(this);
|
||||
wxRect rc = GetClientRect();
|
||||
|
||||
dc.SetFont(DebuggerFont);
|
||||
|
||||
struct branch
|
||||
{
|
||||
int src, dst, srcAddr;
|
||||
};
|
||||
|
||||
branch branches[256];
|
||||
int numBranches = 0;
|
||||
// TODO: Add any drawing code here...
|
||||
int width = rc.width;
|
||||
int numRows = (rc.height / rowHeight) / 2 + 2;
|
||||
//numRows=(numRows&(~1)) + 1;
|
||||
// ------------
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Colors and brushes
|
||||
// -------------------------
|
||||
dc.SetBackgroundMode(wxTRANSPARENT); // the text background
|
||||
const wxChar* bgColor = _T("#ffffff");
|
||||
wxPen nullPen(bgColor);
|
||||
wxPen currentPen(_T("#000000"));
|
||||
wxPen selPen(_T("#808080")); // gray
|
||||
nullPen.SetStyle(wxTRANSPARENT);
|
||||
currentPen.SetStyle(wxSOLID);
|
||||
wxBrush currentBrush(_T("#FFEfE8")); // light gray
|
||||
wxBrush pcBrush(_T("#70FF70")); // green
|
||||
wxBrush bpBrush(_T("#FF3311")); // red
|
||||
|
||||
wxBrush bgBrush(bgColor);
|
||||
wxBrush nullBrush(bgColor);
|
||||
nullBrush.SetStyle(wxTRANSPARENT);
|
||||
|
||||
dc.SetPen(nullPen);
|
||||
dc.SetBrush(bgBrush);
|
||||
dc.DrawRectangle(0, 0, 16, rc.height);
|
||||
dc.DrawRectangle(0, 0, rc.width, 5);
|
||||
// ------------
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Walk through all visible rows
|
||||
// -------------------------
|
||||
for (int i = -numRows; i <= numRows; i++)
|
||||
{
|
||||
unsigned int address = curAddress + i * align;
|
||||
|
||||
int rowY1 = rc.height / 2 + rowHeight * i - rowHeight / 2;
|
||||
int rowY2 = rc.height / 2 + rowHeight * i + rowHeight / 2;
|
||||
|
||||
wxString temp = wxString::Format(_T("%08x"), address);
|
||||
u32 col = debugger->getColor(address);
|
||||
wxBrush rowBrush(wxColor(col >> 16, col >> 8, col));
|
||||
dc.SetBrush(nullBrush);
|
||||
dc.SetPen(nullPen);
|
||||
dc.DrawRectangle(0, rowY1, 16, rowY2 - rowY1 + 2);
|
||||
|
||||
if (selecting && (address == selection))
|
||||
dc.SetPen(selPen);
|
||||
else
|
||||
dc.SetPen(i == 0 ? currentPen : nullPen);
|
||||
|
||||
if (address == debugger->getPC())
|
||||
dc.SetBrush(pcBrush);
|
||||
else
|
||||
dc.SetBrush(rowBrush);
|
||||
|
||||
dc.DrawRectangle(16, rowY1, width, rowY2 - rowY1 + 1);
|
||||
dc.SetBrush(currentBrush);
|
||||
if (!plain) {
|
||||
dc.SetTextForeground(_T("#600000")); // the address text is dark red
|
||||
dc.DrawText(temp, 17, rowY1);
|
||||
dc.SetTextForeground(_T("#000000"));
|
||||
}
|
||||
|
||||
// If running
|
||||
if (debugger->isAlive())
|
||||
{
|
||||
char dis[256];
|
||||
debugger->disasm(address, dis, 256);
|
||||
char* dis2 = strchr(dis, '\t');
|
||||
char desc[256] = "";
|
||||
|
||||
// If we have a code
|
||||
if (dis2)
|
||||
{
|
||||
*dis2 = 0;
|
||||
dis2++;
|
||||
// look for hex strings to decode branches
|
||||
const char* mojs = strstr(dis2, "0x8");
|
||||
if (mojs)
|
||||
{
|
||||
for (int k = 0; k < 8; k++)
|
||||
{
|
||||
bool found = false;
|
||||
for (int j = 0; j < 22; j++)
|
||||
{
|
||||
if (mojs[k + 2] == "0123456789ABCDEFabcdef"[j])
|
||||
found = true;
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
mojs = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mojs)
|
||||
{
|
||||
int offs;
|
||||
sscanf(mojs + 2, "%08x", &offs);
|
||||
branches[numBranches].src = rowY1 + rowHeight / 2;
|
||||
branches[numBranches].srcAddr = address / align;
|
||||
branches[numBranches++].dst = (int)(rowY1 + ((s64)(u32)offs - (s64)(u32)address) * rowHeight / align + rowHeight / 2);
|
||||
sprintf(desc, "-->%s", debugger->getDescription(offs).c_str());
|
||||
dc.SetTextForeground(_T("#600060")); // the -> arrow illustrations are purple
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.SetTextForeground(_T("#000000"));
|
||||
}
|
||||
|
||||
dc.DrawText(wxString::FromAscii(dis2), 140, rowY1);
|
||||
// ------------
|
||||
}
|
||||
|
||||
// Show blr as its' own color
|
||||
if (strcmp(dis, "blr"))
|
||||
dc.SetTextForeground(_T("#007000")); // dark green
|
||||
else
|
||||
dc.SetTextForeground(_T("#8000FF")); // purple
|
||||
|
||||
dc.DrawText(wxString::FromAscii(dis), plain ? 25 : 80, rowY1);
|
||||
|
||||
if (desc[0] == 0)
|
||||
{
|
||||
strcpy(desc, debugger->getDescription(address).c_str());
|
||||
}
|
||||
|
||||
if (!plain) {
|
||||
dc.SetTextForeground(_T("#0000FF")); // blue
|
||||
|
||||
//char temp[256];
|
||||
//UnDecorateSymbolName(desc,temp,255,UNDNAME_COMPLETE);
|
||||
if (strlen(desc))
|
||||
{
|
||||
dc.DrawText(wxString::FromAscii(desc), 270, rowY1);
|
||||
}
|
||||
}
|
||||
|
||||
// Show red breakpoint dot
|
||||
if (debugger->isBreakpoint(address))
|
||||
{
|
||||
dc.SetBrush(bpBrush);
|
||||
dc.DrawRectangle(2, rowY1 + 1, 11, 11);
|
||||
}
|
||||
}
|
||||
} // end of for
|
||||
// ------------
|
||||
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Colors and brushes
|
||||
// -------------------------
|
||||
dc.SetPen(currentPen);
|
||||
|
||||
for (int i = 0; i < numBranches; i++)
|
||||
{
|
||||
int x = 370 + (branches[i].srcAddr % 9) * 8;
|
||||
_MoveTo(x-2, branches[i].src);
|
||||
|
||||
if (branches[i].dst < rc.height + 400 && branches[i].dst > -400)
|
||||
{
|
||||
_LineTo(dc, x+2, branches[i].src);
|
||||
_LineTo(dc, x+2, branches[i].dst);
|
||||
_LineTo(dc, x-4, branches[i].dst);
|
||||
|
||||
_MoveTo(x, branches[i].dst - 4);
|
||||
_LineTo(dc, x-4, branches[i].dst);
|
||||
_LineTo(dc, x+1, branches[i].dst+5);
|
||||
}
|
||||
//else
|
||||
//{
|
||||
// This can be re-enabled when there is a scrollbar or
|
||||
// something on the codeview (the lines are too long)
|
||||
|
||||
//_LineTo(dc, x+4, branches[i].src);
|
||||
//_MoveTo(x+2, branches[i].dst-4);
|
||||
//_LineTo(dc, x+6, branches[i].dst);
|
||||
//_LineTo(dc, x+1, branches[i].dst+5);
|
||||
//}
|
||||
|
||||
//_LineTo(dc, x, branches[i].dst+4);
|
||||
//_LineTo(dc, x-2, branches[i].dst);
|
||||
}
|
||||
// ------------
|
||||
}
|
||||
|
||||
|
||||
void CCodeView::_LineTo(wxPaintDC &dc, int x, int y)
|
||||
{
|
||||
dc.DrawLine(lx, ly, x, y);
|
||||
lx = x;
|
||||
ly = y;
|
||||
}
|
||||
|
101
Source/Core/DolphinWX/Src/CodeView.h
Normal file
101
Source/Core/DolphinWX/Src/CodeView.h
Normal file
@ -0,0 +1,101 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef CODEVIEW_H_
|
||||
#define CODEVIEW_H_
|
||||
|
||||
#define wxUSE_XPM_IN_MSW 1
|
||||
#define USE_XPM_BITMAPS 1
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
DECLARE_EVENT_TYPE(wxEVT_CODEVIEW_CHANGE, -1);
|
||||
|
||||
class DebugInterface;
|
||||
class SymbolDB;
|
||||
|
||||
class CCodeView : public wxControl
|
||||
{
|
||||
public:
|
||||
CCodeView(DebugInterface* debuginterface, SymbolDB *symbol_db, wxWindow* parent, wxWindowID Id = -1, const wxSize& Size = wxDefaultSize);
|
||||
wxSize DoGetBestSize() const;
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
void OnErase(wxEraseEvent& event);
|
||||
void OnMouseDown(wxMouseEvent& event);
|
||||
void OnMouseMove(wxMouseEvent& event);
|
||||
void OnMouseUpL(wxMouseEvent& event);
|
||||
void OnMouseUpR(wxMouseEvent& event);
|
||||
void OnPopupMenu(wxCommandEvent& event);
|
||||
void InsertBlrNop(int);
|
||||
|
||||
u32 GetSelection() {return(selection);}
|
||||
void ToggleBreakpoint(u32 address);
|
||||
|
||||
struct BlrStruct // for IDM_INSERTBLR
|
||||
{
|
||||
u32 Address;
|
||||
u32 OldValue;
|
||||
};
|
||||
std::vector<BlrStruct> BlrList;
|
||||
|
||||
void Center(u32 addr)
|
||||
{
|
||||
curAddress = addr;
|
||||
selection = addr;
|
||||
redraw();
|
||||
}
|
||||
|
||||
void SetPlain() {
|
||||
plain = true;
|
||||
}
|
||||
|
||||
private:
|
||||
void RaiseEvent();
|
||||
int YToAddress(int y);
|
||||
|
||||
u32 AddrToBranch(u32 addr);
|
||||
|
||||
void redraw() {Refresh();}
|
||||
|
||||
DebugInterface* debugger;
|
||||
SymbolDB* symbol_db;
|
||||
|
||||
bool plain;
|
||||
|
||||
int curAddress;
|
||||
int align;
|
||||
int rowHeight;
|
||||
|
||||
u32 selection;
|
||||
u32 oldSelection;
|
||||
bool selectionChanged;
|
||||
bool selecting;
|
||||
bool hasFocus;
|
||||
bool showHex;
|
||||
|
||||
int lx, ly;
|
||||
void _MoveTo(int x, int y) {lx = x; ly = y;}
|
||||
void _LineTo(wxPaintDC &dc, int x, int y);
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif /*CODEVIEW_H_*/
|
745
Source/Core/DolphinWX/Src/CodeWindow.cpp
Normal file
745
Source/Core/DolphinWX/Src/CodeWindow.cpp
Normal file
@ -0,0 +1,745 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
// Include
|
||||
#include "Common.h"
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/textdlg.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/thread.h>
|
||||
#include <wx/mstream.h>
|
||||
#include <wx/tipwin.h>
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
#include "RegisterWindow.h"
|
||||
#include "BreakpointWindow.h"
|
||||
#include "MemoryWindow.h"
|
||||
#include "JitWindow.h"
|
||||
|
||||
#include "CodeWindow.h"
|
||||
#include "CodeView.h"
|
||||
|
||||
#include "FileUtil.h"
|
||||
#include "Core.h"
|
||||
#include "HW/Memmap.h"
|
||||
#include "HLE/HLE.h"
|
||||
#include "Boot/Boot.h"
|
||||
#include "LogManager.h"
|
||||
#include "HW/CPU.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "Debugger/PPCDebugInterface.h"
|
||||
#include "Debugger/Debugger_SymbolMap.h"
|
||||
#include "PowerPC/PPCAnalyst.h"
|
||||
#include "PowerPC/Profiler.h"
|
||||
#include "PowerPC/PPCSymbolDB.h"
|
||||
#include "PowerPC/SignatureDB.h"
|
||||
#include "PowerPC/PPCTables.h"
|
||||
#include "PowerPC/JitCommon/JitBase.h"
|
||||
#include "PowerPC/JitCommon/JitCache.h" // for ClearCache()
|
||||
|
||||
#include "ConfigManager.h"
|
||||
|
||||
extern "C" // Bitmaps
|
||||
{
|
||||
#include "../resources/toolbar_play.c"
|
||||
#include "../resources/toolbar_pause.c"
|
||||
#include "../resources/toolbar_add_memorycheck.c"
|
||||
#include "../resources/toolbar_delete.c"
|
||||
#include "../resources/toolbar_add_breakpoint.c"
|
||||
}
|
||||
|
||||
class CPluginInfo;
|
||||
class CPluginManager;
|
||||
|
||||
// -------
|
||||
// Main
|
||||
|
||||
BEGIN_EVENT_TABLE(CCodeWindow, wxPanel)
|
||||
|
||||
// Menu bar
|
||||
EVT_MENU(IDM_AUTOMATICSTART, CCodeWindow::OnCPUMode) // Options
|
||||
EVT_MENU(IDM_BOOTTOPAUSE, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_FONTPICKER, CCodeWindow::OnChangeFont)
|
||||
|
||||
EVT_MENU(IDM_INTERPRETER, CCodeWindow::OnCPUMode) // Jit
|
||||
EVT_MENU(IDM_JITNOBLOCKCACHE, CCodeWindow::OnCPUMode)
|
||||
|
||||
EVT_MENU(IDM_JITOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITLSOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITLSLXZOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITLSLWZOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITLSLBZXOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITLSFOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITLSPOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITFPOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITIOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITPOFF, CCodeWindow::OnCPUMode)
|
||||
EVT_MENU(IDM_JITSROFF, CCodeWindow::OnCPUMode)
|
||||
|
||||
EVT_MENU(IDM_CLEARCODECACHE, CCodeWindow::OnJitMenu)
|
||||
EVT_MENU(IDM_LOGINSTRUCTIONS, CCodeWindow::OnJitMenu)
|
||||
EVT_MENU(IDM_SEARCHINSTRUCTION, CCodeWindow::OnJitMenu)
|
||||
|
||||
EVT_MENU(IDM_CLEARSYMBOLS, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_LOADMAPFILE, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_SCANFUNCTIONS, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_SAVEMAPFILE, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_SAVEMAPFILEWITHCODES, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_CREATESIGNATUREFILE, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_USESIGNATUREFILE, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_PATCHHLEFUNCTIONS, CCodeWindow::OnSymbolsMenu)
|
||||
EVT_MENU(IDM_RENAME_SYMBOLS, CCodeWindow::OnSymbolsMenu)
|
||||
|
||||
EVT_MENU(IDM_PROFILEBLOCKS, CCodeWindow::OnProfilerMenu)
|
||||
EVT_MENU(IDM_WRITEPROFILE, CCodeWindow::OnProfilerMenu)
|
||||
|
||||
// Toolbar
|
||||
EVT_MENU(IDM_STEP, CCodeWindow::OnCodeStep)
|
||||
EVT_MENU(IDM_STEPOVER, CCodeWindow::OnCodeStep)
|
||||
EVT_MENU(IDM_TOGGLE_BREAKPOINT, CCodeWindow::OnCodeStep)
|
||||
EVT_MENU(IDM_SKIP, CCodeWindow::OnCodeStep)
|
||||
EVT_MENU(IDM_SETPC, CCodeWindow::OnCodeStep)
|
||||
EVT_MENU(IDM_GOTOPC, CCodeWindow::OnCodeStep)
|
||||
EVT_TEXT(IDM_ADDRBOX, CCodeWindow::OnAddrBoxChange)
|
||||
|
||||
// Other
|
||||
EVT_LISTBOX(ID_SYMBOLLIST, CCodeWindow::OnSymbolListChange)
|
||||
EVT_LISTBOX(ID_CALLSTACKLIST, CCodeWindow::OnCallstackListChange)
|
||||
EVT_LISTBOX(ID_CALLERSLIST, CCodeWindow::OnCallersListChange)
|
||||
EVT_LISTBOX(ID_CALLSLIST, CCodeWindow::OnCallsListChange)
|
||||
|
||||
EVT_HOST_COMMAND(wxID_ANY, CCodeWindow::OnHostMessage)
|
||||
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Class
|
||||
CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter, CFrame *parent,
|
||||
wxWindowID id, const wxPoint& position, const wxSize& size, long style, const wxString& name)
|
||||
: wxPanel((wxWindow*)parent, id, position, size, style, name)
|
||||
, Parent(parent)
|
||||
, m_RegisterWindow(NULL)
|
||||
, m_BreakpointWindow(NULL)
|
||||
, m_MemoryWindow(NULL)
|
||||
, m_JitWindow(NULL)
|
||||
, m_SoundWindow(NULL)
|
||||
, m_VideoWindow(NULL)
|
||||
, codeview(NULL)
|
||||
{
|
||||
InitBitmaps();
|
||||
|
||||
CreateGUIControls(_LocalCoreStartupParameter);
|
||||
|
||||
// Connect keyboard
|
||||
wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN,
|
||||
wxKeyEventHandler(CCodeWindow::OnKeyDown),
|
||||
(wxObject*)0, this);
|
||||
}
|
||||
|
||||
wxMenuBar *CCodeWindow::GetMenuBar()
|
||||
{
|
||||
return Parent->GetMenuBar();
|
||||
}
|
||||
|
||||
wxAuiToolBar *CCodeWindow::GetToolBar()
|
||||
{
|
||||
return Parent->m_ToolBarDebug;
|
||||
}
|
||||
|
||||
// ----------
|
||||
// Events
|
||||
|
||||
void CCodeWindow::OnKeyDown(wxKeyEvent& event)
|
||||
{
|
||||
if (event.GetKeyCode() == WXK_SPACE && event.GetModifiers() == wxMOD_NONE)
|
||||
SingleStep();
|
||||
else
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void CCodeWindow::OnHostMessage(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_NOTIFYMAPLOADED:
|
||||
NotifyMapLoaded();
|
||||
break;
|
||||
|
||||
case IDM_UPDATEDISASMDIALOG:
|
||||
Update();
|
||||
if (codeview) codeview->Center(PC);
|
||||
if (m_RegisterWindow) m_RegisterWindow->NotifyUpdate();
|
||||
break;
|
||||
|
||||
case IDM_UPDATEBREAKPOINTS:
|
||||
Update();
|
||||
if (m_BreakpointWindow) m_BreakpointWindow->NotifyUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// The Play, Stop, Step, Skip, Go to PC and Show PC buttons go here
|
||||
void CCodeWindow::OnCodeStep(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_STEP:
|
||||
SingleStep();
|
||||
break;
|
||||
|
||||
case IDM_STEPOVER:
|
||||
StepOver();
|
||||
break;
|
||||
|
||||
case IDM_TOGGLE_BREAKPOINT:
|
||||
ToggleBreakpoint();
|
||||
break;
|
||||
|
||||
case IDM_SKIP:
|
||||
PC += 4;
|
||||
Update();
|
||||
break;
|
||||
|
||||
case IDM_SETPC:
|
||||
PC = codeview->GetSelection();
|
||||
Update();
|
||||
break;
|
||||
|
||||
case IDM_GOTOPC:
|
||||
JumpToAddress(PC);
|
||||
break;
|
||||
}
|
||||
|
||||
UpdateButtonStates();
|
||||
// Update all toolbars in the aui manager
|
||||
Parent->UpdateGUI();
|
||||
}
|
||||
|
||||
void CCodeWindow::JumpToAddress(u32 _Address)
|
||||
{
|
||||
codeview->Center(_Address);
|
||||
UpdateLists();
|
||||
}
|
||||
|
||||
void CCodeWindow::OnCodeViewChange(wxCommandEvent &event)
|
||||
{
|
||||
UpdateLists();
|
||||
}
|
||||
|
||||
void CCodeWindow::OnAddrBoxChange(wxCommandEvent& event)
|
||||
{
|
||||
if (!GetToolBar()) return;
|
||||
|
||||
wxTextCtrl* pAddrCtrl = (wxTextCtrl*)GetToolBar()->FindControl(IDM_ADDRBOX);
|
||||
wxString txt = pAddrCtrl->GetValue();
|
||||
|
||||
std::string text(txt.mb_str());
|
||||
text = StripSpaces(text);
|
||||
if (text.size() == 8)
|
||||
{
|
||||
u32 addr;
|
||||
sscanf(text.c_str(), "%08x", &addr);
|
||||
JumpToAddress(addr);
|
||||
}
|
||||
|
||||
event.Skip(1);
|
||||
}
|
||||
|
||||
void CCodeWindow::OnCallstackListChange(wxCommandEvent& event)
|
||||
{
|
||||
int index = callstack->GetSelection();
|
||||
if (index >= 0)
|
||||
{
|
||||
u32 address = (u32)(u64)(callstack->GetClientData(index));
|
||||
if (address)
|
||||
JumpToAddress(address);
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::OnCallersListChange(wxCommandEvent& event)
|
||||
{
|
||||
int index = callers->GetSelection();
|
||||
if (index >= 0)
|
||||
{
|
||||
u32 address = (u32)(u64)(callers->GetClientData(index));
|
||||
if (address)
|
||||
JumpToAddress(address);
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::OnCallsListChange(wxCommandEvent& event)
|
||||
{
|
||||
int index = calls->GetSelection();
|
||||
if (index >= 0)
|
||||
{
|
||||
u32 address = (u32)(u64)(calls->GetClientData(index));
|
||||
if (address)
|
||||
JumpToAddress(address);
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::SingleStep()
|
||||
{
|
||||
if (CCPU::IsStepping())
|
||||
{
|
||||
CCPU::StepOpcode(&sync_event);
|
||||
wxThread::Sleep(20);
|
||||
// need a short wait here
|
||||
JumpToAddress(PC);
|
||||
Update();
|
||||
Host_UpdateLogDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::StepOver()
|
||||
{
|
||||
if (CCPU::IsStepping())
|
||||
{
|
||||
UGeckoInstruction inst = Memory::Read_Instruction(PC);
|
||||
if (inst.LK)
|
||||
{
|
||||
PowerPC::breakpoints.Add(PC + 4, true);
|
||||
CCPU::EnableStepping(false);
|
||||
JumpToAddress(PC);
|
||||
Update();
|
||||
}
|
||||
else
|
||||
SingleStep();
|
||||
|
||||
UpdateButtonStates();
|
||||
// Update all toolbars in the aui manager
|
||||
Parent->UpdateGUI();
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleBreakpoint()
|
||||
{
|
||||
if (CCPU::IsStepping())
|
||||
{
|
||||
if (codeview) codeview->ToggleBreakpoint(codeview->GetSelection());
|
||||
Update();
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::UpdateLists()
|
||||
{
|
||||
callers->Clear();
|
||||
u32 addr = codeview->GetSelection();
|
||||
Symbol *symbol = g_symbolDB.GetSymbolFromAddr(addr);
|
||||
if (!symbol)
|
||||
return;
|
||||
for (int i = 0; i < (int)symbol->callers.size(); i++)
|
||||
{
|
||||
u32 caller_addr = symbol->callers[i].callAddress;
|
||||
Symbol *caller_symbol = g_symbolDB.GetSymbolFromAddr(caller_addr);
|
||||
if (caller_symbol)
|
||||
{
|
||||
int idx = callers->Append(wxString::FromAscii(StringFromFormat
|
||||
("< %s (%08x)", caller_symbol->name.c_str(), caller_addr).c_str()));
|
||||
callers->SetClientData(idx, (void*)caller_addr);
|
||||
}
|
||||
}
|
||||
|
||||
calls->Clear();
|
||||
for (int i = 0; i < (int)symbol->calls.size(); i++)
|
||||
{
|
||||
u32 call_addr = symbol->calls[i].function;
|
||||
Symbol *call_symbol = g_symbolDB.GetSymbolFromAddr(call_addr);
|
||||
if (call_symbol)
|
||||
{
|
||||
int idx = calls->Append(wxString::FromAscii(StringFromFormat
|
||||
("> %s (%08x)", call_symbol->name.c_str(), call_addr).c_str()));
|
||||
calls->SetClientData(idx, (void*)call_addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::UpdateCallstack()
|
||||
{
|
||||
if (Core::GetState() == Core::CORE_STOPPING) return;
|
||||
|
||||
callstack->Clear();
|
||||
|
||||
std::vector<Dolphin_Debugger::CallstackEntry> stack;
|
||||
|
||||
bool ret = Dolphin_Debugger::GetCallstack(stack);
|
||||
|
||||
for (size_t i = 0; i < stack.size(); i++)
|
||||
{
|
||||
int idx = callstack->Append(wxString::FromAscii(stack[i].Name.c_str()));
|
||||
callstack->SetClientData(idx, (void*)(u64)stack[i].vAddress);
|
||||
}
|
||||
|
||||
if (!ret)
|
||||
callstack->Append(wxString::FromAscii("invalid callstack"));
|
||||
}
|
||||
|
||||
void CCodeWindow::CreateGUIControls(const SCoreStartupParameter& _LocalCoreStartupParameter)
|
||||
{
|
||||
// Configure the code window
|
||||
wxBoxSizer* sizerBig = new wxBoxSizer(wxHORIZONTAL);
|
||||
wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
DebugInterface* di = &PowerPC::debug_interface;
|
||||
|
||||
codeview = new CCodeView(di, &g_symbolDB, this, ID_CODEVIEW);
|
||||
sizerBig->Add(sizerLeft, 2, wxEXPAND);
|
||||
sizerBig->Add(codeview, 5, wxEXPAND);
|
||||
|
||||
sizerLeft->Add(callstack = new wxListBox(this, ID_CALLSTACKLIST,
|
||||
wxDefaultPosition, wxSize(90, 100)), 0, wxEXPAND);
|
||||
sizerLeft->Add(symbols = new wxListBox(this, ID_SYMBOLLIST,
|
||||
wxDefaultPosition, wxSize(90, 100), 0, NULL, wxLB_SORT), 1, wxEXPAND);
|
||||
sizerLeft->Add(calls = new wxListBox(this, ID_CALLSLIST, wxDefaultPosition,
|
||||
wxSize(90, 100), 0, NULL, wxLB_SORT), 0, wxEXPAND);
|
||||
sizerLeft->Add(callers = new wxListBox(this, ID_CALLERSLIST, wxDefaultPosition,
|
||||
wxSize(90, 100), 0, NULL, wxLB_SORT), 0, wxEXPAND);
|
||||
|
||||
SetSizer(sizerBig);
|
||||
|
||||
sizerLeft->SetSizeHints(this);
|
||||
sizerLeft->Fit(this);
|
||||
sizerBig->SetSizeHints(this);
|
||||
sizerBig->Fit(this);
|
||||
|
||||
sync_event.Init();
|
||||
}
|
||||
|
||||
// Create CPU Mode menus
|
||||
void CCodeWindow::CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter,
|
||||
wxMenuBar *pMenuBar)
|
||||
{
|
||||
// CPU Mode
|
||||
wxMenu* pCoreMenu = new wxMenu;
|
||||
|
||||
wxMenuItem* interpreter = pCoreMenu->Append(IDM_INTERPRETER, _("&Interpreter core"),
|
||||
wxString::FromAscii("This is necessary to get break points"
|
||||
" and stepping to work as explained in the Developer Documentation. But it can be very"
|
||||
" slow, perhaps slower than 1 fps."),
|
||||
wxITEM_CHECK);
|
||||
interpreter->Check(_LocalCoreStartupParameter.iCPUCore == 0);
|
||||
pCoreMenu->AppendSeparator();
|
||||
|
||||
pCoreMenu->Append(IDM_JITBLOCKLINKING, _("&JIT Block Linking off"),
|
||||
_("Provide safer execution by not linking the JIT blocks."),
|
||||
wxITEM_CHECK);
|
||||
|
||||
pCoreMenu->Append(IDM_JITNOBLOCKCACHE, _("&Disable JIT Cache"),
|
||||
_("Avoid any involuntary JIT cache clearing, this may prevent Zelda TP from crashing.\n[This option must be selected before a game is started.]"),
|
||||
wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_CLEARCODECACHE, _("&Clear JIT cache"));
|
||||
|
||||
pCoreMenu->AppendSeparator();
|
||||
pCoreMenu->Append(IDM_LOGINSTRUCTIONS, _("&Log JIT instruction coverage"));
|
||||
pCoreMenu->Append(IDM_SEARCHINSTRUCTION, _("&Search for an op"));
|
||||
|
||||
pCoreMenu->AppendSeparator();
|
||||
pCoreMenu->Append(IDM_JITOFF, _("&JIT off (JIT core)"),
|
||||
_("Turn off all JIT functions, but still use the JIT core from Jit.cpp"),
|
||||
wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITLSOFF, _("&JIT LoadStore off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITLSLBZXOFF, _(" &JIT LoadStore lbzx off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITLSLXZOFF, _(" &JIT LoadStore lXz off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITLSLWZOFF, _("&JIT LoadStore lwz off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITLSFOFF, _("&JIT LoadStore Floating off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITLSPOFF, _("&JIT LoadStore Paired off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITFPOFF, _("&JIT FloatingPoint off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITIOFF, _("&JIT Integer off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITPOFF, _("&JIT Paired off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
pCoreMenu->Append(IDM_JITSROFF, _("&JIT SystemRegisters off"),
|
||||
wxEmptyString, wxITEM_CHECK);
|
||||
|
||||
pMenuBar->Append(pCoreMenu, _("&JIT"));
|
||||
|
||||
|
||||
// Debug Menu
|
||||
wxMenu* pDebugMenu = new wxMenu;
|
||||
|
||||
pDebugMenu->Append(IDM_STEP, _("Step &Into\tF11"));
|
||||
pDebugMenu->Append(IDM_STEPOVER, _("Step &Over\tF10"));
|
||||
pDebugMenu->Append(IDM_TOGGLE_BREAKPOINT, _("Toggle &Breakpoint\tF9"));
|
||||
|
||||
pMenuBar->Append(pDebugMenu, _("&Debug"));
|
||||
|
||||
CreateMenuSymbols(pMenuBar);
|
||||
}
|
||||
|
||||
void CCodeWindow::CreateMenuOptions(wxMenu* pMenu)
|
||||
{
|
||||
wxMenuItem* boottopause = pMenu->Append(IDM_BOOTTOPAUSE, _("Boot to pause"),
|
||||
_("Start the game directly instead of booting to pause"),
|
||||
wxITEM_CHECK);
|
||||
boottopause->Check(bBootToPause);
|
||||
|
||||
wxMenuItem* automaticstart = pMenu->Append(IDM_AUTOMATICSTART, _("&Automatic start"),
|
||||
wxString::FromAscii(
|
||||
"Automatically load the Default ISO when Dolphin starts, or the last game you loaded,"
|
||||
" if you have not given it an elf file with the --elf command line. [This can be"
|
||||
" convenient if you are bug-testing with a certain game and want to rebuild"
|
||||
" and retry it several times, either with changes to Dolphin or if you are"
|
||||
" developing a homebrew game.]"),
|
||||
wxITEM_CHECK);
|
||||
automaticstart->Check(bAutomaticStart);
|
||||
|
||||
pMenu->Append(IDM_FONTPICKER, _("&Font..."), wxEmptyString, wxITEM_NORMAL);
|
||||
}
|
||||
|
||||
// CPU Mode and JIT Menu
|
||||
void CCodeWindow::OnCPUMode(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_INTERPRETER:
|
||||
PowerPC::SetMode(UseInterpreter() ? PowerPC::MODE_INTERPRETER : PowerPC::MODE_JIT);
|
||||
break;
|
||||
case IDM_BOOTTOPAUSE:
|
||||
bBootToPause = !bBootToPause;
|
||||
return;
|
||||
case IDM_AUTOMATICSTART:
|
||||
bAutomaticStart = !bAutomaticStart;
|
||||
return;
|
||||
case IDM_JITOFF:
|
||||
Core::g_CoreStartupParameter.bJITOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITLSOFF:
|
||||
Core::g_CoreStartupParameter.bJITLoadStoreOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITLSLXZOFF:
|
||||
Core::g_CoreStartupParameter.bJITLoadStorelXzOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITLSLWZOFF:
|
||||
Core::g_CoreStartupParameter.bJITLoadStorelwzOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITLSLBZXOFF:
|
||||
Core::g_CoreStartupParameter.bJITLoadStorelbzxOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITLSFOFF:
|
||||
Core::g_CoreStartupParameter.bJITLoadStoreFloatingOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITLSPOFF:
|
||||
Core::g_CoreStartupParameter.bJITLoadStorePairedOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITFPOFF:
|
||||
Core::g_CoreStartupParameter.bJITFloatingPointOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITIOFF:
|
||||
Core::g_CoreStartupParameter.bJITIntegerOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITPOFF:
|
||||
Core::g_CoreStartupParameter.bJITPairedOff = event.IsChecked();
|
||||
break;
|
||||
case IDM_JITSROFF:
|
||||
Core::g_CoreStartupParameter.bJITSystemRegistersOff = event.IsChecked();
|
||||
break;
|
||||
}
|
||||
|
||||
// Clear the JIT cache to enable these changes
|
||||
if (jit)
|
||||
{
|
||||
jit->ClearCache();
|
||||
}
|
||||
// Update
|
||||
UpdateButtonStates();
|
||||
}
|
||||
|
||||
void CCodeWindow::OnJitMenu(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_LOGINSTRUCTIONS:
|
||||
PPCTables::LogCompiledInstructions();
|
||||
break;
|
||||
|
||||
case IDM_CLEARCODECACHE:
|
||||
jit->ClearCache();
|
||||
break;
|
||||
|
||||
case IDM_SEARCHINSTRUCTION:
|
||||
{
|
||||
wxString str;
|
||||
str = wxGetTextFromUser(_T(""), wxT("Op?"), wxEmptyString, this);
|
||||
for (u32 addr = 0x80000000; addr < 0x80100000; addr += 4)
|
||||
{
|
||||
const char *name = PPCTables::GetInstructionName(Memory::ReadUnchecked_U32(addr));
|
||||
if (name && !strcmp((const char *)str.mb_str(), name))
|
||||
{
|
||||
std::string mb_str(str.mb_str());
|
||||
NOTICE_LOG(POWERPC, "Found %s at %08x", mb_str.c_str(), addr);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Shortcuts
|
||||
bool CCodeWindow::UseInterpreter()
|
||||
{
|
||||
return GetMenuBar()->IsChecked(IDM_INTERPRETER);
|
||||
}
|
||||
|
||||
bool CCodeWindow::BootToPause()
|
||||
{
|
||||
return GetMenuBar()->IsChecked(IDM_BOOTTOPAUSE);
|
||||
}
|
||||
|
||||
bool CCodeWindow::AutomaticStart()
|
||||
{
|
||||
return GetMenuBar()->IsChecked(IDM_AUTOMATICSTART);
|
||||
}
|
||||
|
||||
bool CCodeWindow::JITNoBlockCache()
|
||||
{
|
||||
return GetMenuBar()->IsChecked(IDM_JITNOBLOCKCACHE);
|
||||
}
|
||||
|
||||
bool CCodeWindow::JITBlockLinking()
|
||||
{
|
||||
return GetMenuBar()->IsChecked(IDM_JITBLOCKLINKING);
|
||||
}
|
||||
|
||||
// Toolbar
|
||||
void CCodeWindow::InitBitmaps()
|
||||
{
|
||||
// load original size 48x48
|
||||
m_Bitmaps[Toolbar_DebugGo] = wxGetBitmapFromMemory(toolbar_play_png);
|
||||
m_Bitmaps[Toolbar_Step] = wxGetBitmapFromMemory(toolbar_add_breakpoint_png);
|
||||
m_Bitmaps[Toolbar_StepOver] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
|
||||
m_Bitmaps[Toolbar_Skip] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
|
||||
m_Bitmaps[Toolbar_GotoPC] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
|
||||
m_Bitmaps[Toolbar_SetPC] = wxGetBitmapFromMemory(toolbar_add_memcheck_png);
|
||||
m_Bitmaps[Toolbar_DebugPause] = wxGetBitmapFromMemory(toolbar_pause_png);
|
||||
|
||||
// scale to 24x24 for toolbar
|
||||
for (size_t n = Toolbar_DebugGo; n < ToolbarDebugBitmapMax; n++)
|
||||
m_Bitmaps[n] = wxBitmap(m_Bitmaps[n].ConvertToImage().Scale(24, 24));
|
||||
}
|
||||
|
||||
void CCodeWindow::PopulateToolbar(wxAuiToolBar* toolBar)
|
||||
{
|
||||
int w = m_Bitmaps[Toolbar_DebugGo].GetWidth(),
|
||||
h = m_Bitmaps[Toolbar_DebugGo].GetHeight();
|
||||
|
||||
toolBar->SetToolBitmapSize(wxSize(w, h));
|
||||
toolBar->AddTool(IDM_STEP, _("Step"), m_Bitmaps[Toolbar_Step]);
|
||||
toolBar->AddTool(IDM_STEPOVER, _("Step Over"), m_Bitmaps[Toolbar_StepOver]);
|
||||
toolBar->AddTool(IDM_SKIP, _("Skip"), m_Bitmaps[Toolbar_Skip]);
|
||||
toolBar->AddSeparator();
|
||||
toolBar->AddTool(IDM_GOTOPC, _("Show PC"), m_Bitmaps[Toolbar_GotoPC]);
|
||||
toolBar->AddTool(IDM_SETPC, _("Set PC"), m_Bitmaps[Toolbar_SetPC]);
|
||||
toolBar->AddSeparator();
|
||||
toolBar->AddControl(new wxTextCtrl(toolBar, IDM_ADDRBOX, _T("")));
|
||||
|
||||
toolBar->Realize();
|
||||
}
|
||||
|
||||
// Update GUI
|
||||
void CCodeWindow::Update()
|
||||
{
|
||||
if (!codeview) return;
|
||||
|
||||
codeview->Refresh();
|
||||
UpdateCallstack();
|
||||
UpdateButtonStates();
|
||||
|
||||
// Do not automatically show the current PC position when a breakpoint is hit or
|
||||
// when we pause since this can be called at other times too.
|
||||
//codeview->Center(PC);
|
||||
}
|
||||
|
||||
void CCodeWindow::UpdateButtonStates()
|
||||
{
|
||||
bool Initialized = (Core::GetState() != Core::CORE_UNINITIALIZED);
|
||||
bool Pause = (Core::GetState() == Core::CORE_PAUSE);
|
||||
bool Stepping = CCPU::IsStepping();
|
||||
wxAuiToolBar* ToolBar = GetToolBar();
|
||||
|
||||
// Toolbar
|
||||
if (!ToolBar) return;
|
||||
|
||||
if (!Initialized)
|
||||
{
|
||||
ToolBar->EnableTool(IDM_STEPOVER, false);
|
||||
ToolBar->EnableTool(IDM_SKIP, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!Stepping)
|
||||
{
|
||||
ToolBar->EnableTool(IDM_STEPOVER, false);
|
||||
ToolBar->EnableTool(IDM_SKIP, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ToolBar->EnableTool(IDM_STEPOVER, true);
|
||||
ToolBar->EnableTool(IDM_SKIP, true);
|
||||
}
|
||||
}
|
||||
|
||||
ToolBar->EnableTool(IDM_STEP, Initialized && Stepping);
|
||||
|
||||
if (ToolBar) ToolBar->Realize();
|
||||
|
||||
// Menu bar
|
||||
// ------------------
|
||||
GetMenuBar()->Enable(IDM_INTERPRETER, Pause); // CPU Mode
|
||||
|
||||
GetMenuBar()->Enable(IDM_JITNOBLOCKCACHE, !Initialized);
|
||||
|
||||
GetMenuBar()->Enable(IDM_JITOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITLSOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITLSLXZOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITLSLWZOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITLSLBZXOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITLSFOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITLSPOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITFPOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITIOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITPOFF, Pause);
|
||||
GetMenuBar()->Enable(IDM_JITSROFF, Pause);
|
||||
|
||||
GetMenuBar()->Enable(IDM_CLEARCODECACHE, Pause); // JIT Menu
|
||||
GetMenuBar()->Enable(IDM_SEARCHINSTRUCTION, Initialized);
|
||||
|
||||
GetMenuBar()->Enable(IDM_CLEARSYMBOLS, Initialized); // Symbols menu
|
||||
GetMenuBar()->Enable(IDM_SCANFUNCTIONS, Initialized);
|
||||
GetMenuBar()->Enable(IDM_LOADMAPFILE, Initialized);
|
||||
GetMenuBar()->Enable(IDM_SAVEMAPFILE, Initialized);
|
||||
GetMenuBar()->Enable(IDM_SAVEMAPFILEWITHCODES, Initialized);
|
||||
GetMenuBar()->Enable(IDM_CREATESIGNATUREFILE, Initialized);
|
||||
GetMenuBar()->Enable(IDM_RENAME_SYMBOLS, Initialized);
|
||||
GetMenuBar()->Enable(IDM_USESIGNATUREFILE, Initialized);
|
||||
GetMenuBar()->Enable(IDM_PATCHHLEFUNCTIONS, Initialized);
|
||||
|
||||
// Update Fonts
|
||||
callstack->SetFont(DebuggerFont);
|
||||
symbols->SetFont(DebuggerFont);
|
||||
callers->SetFont(DebuggerFont);
|
||||
calls->SetFont(DebuggerFont);
|
||||
}
|
161
Source/Core/DolphinWX/Src/CodeWindow.h
Normal file
161
Source/Core/DolphinWX/Src/CodeWindow.h
Normal file
@ -0,0 +1,161 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
|
||||
#ifndef CODEWINDOW_H_
|
||||
#define CODEWINDOW_H_
|
||||
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/listbox.h>
|
||||
#include <wx/artprov.h>
|
||||
|
||||
#include "Thread.h"
|
||||
#include "CoreParameter.h"
|
||||
|
||||
// GUI global
|
||||
#include "../../DolphinWX/Src/Globals.h"
|
||||
#include "../../DolphinWX/Src/Frame.h"
|
||||
|
||||
class CFrame;
|
||||
class CRegisterWindow;
|
||||
class CBreakPointWindow;
|
||||
class CMemoryWindow;
|
||||
class CJitWindow;
|
||||
class CCodeView;
|
||||
class DSPDebuggerLLE;
|
||||
class GFXDebuggerPanel;
|
||||
|
||||
class CCodeWindow
|
||||
: public wxPanel
|
||||
{
|
||||
public:
|
||||
|
||||
CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter,
|
||||
CFrame * parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTAB_TRAVERSAL | wxBORDER_NONE,
|
||||
const wxString& name = _("Code")
|
||||
);
|
||||
|
||||
void Load();
|
||||
void Save();
|
||||
|
||||
// Parent interaction
|
||||
CFrame *Parent;
|
||||
wxMenuBar * GetMenuBar();
|
||||
wxAuiToolBar * GetToolBar();
|
||||
wxBitmap m_Bitmaps[ToolbarDebugBitmapMax];
|
||||
|
||||
bool UseInterpreter();
|
||||
bool BootToPause();
|
||||
bool AutomaticStart();
|
||||
bool JITNoBlockCache();
|
||||
bool JITBlockLinking();
|
||||
void JumpToAddress(u32 _Address);
|
||||
|
||||
void Update();
|
||||
void NotifyMapLoaded();
|
||||
void CreateMenu(const SCoreStartupParameter& _LocalCoreStartupParameter,
|
||||
wxMenuBar *pMenuBar);
|
||||
void CreateMenuOptions(wxMenu *pMenu);
|
||||
void CreateMenuSymbols(wxMenuBar *pMenuBar);
|
||||
void RecreateToolbar(wxAuiToolBar*);
|
||||
void PopulateToolbar(wxAuiToolBar* toolBar);
|
||||
void UpdateButtonStates();
|
||||
void OpenPages();
|
||||
void UpdateManager();
|
||||
|
||||
// Menu bar
|
||||
// -------------------
|
||||
void OnCPUMode(wxCommandEvent& event); // CPU Mode menu
|
||||
void OnJITOff(wxCommandEvent& event);
|
||||
|
||||
void ToggleCodeWindow(bool bShow);
|
||||
void ToggleRegisterWindow(bool bShow);
|
||||
void ToggleBreakPointWindow(bool bShow);
|
||||
void ToggleMemoryWindow(bool bShow);
|
||||
void ToggleJitWindow(bool bShow);
|
||||
void ToggleSoundWindow(bool bShow);
|
||||
void ToggleVideoWindow(bool bShow);
|
||||
|
||||
void OnChangeFont(wxCommandEvent& event);
|
||||
|
||||
void OnCodeStep(wxCommandEvent& event);
|
||||
void OnAddrBoxChange(wxCommandEvent& event);
|
||||
void OnSymbolsMenu(wxCommandEvent& event);
|
||||
void OnJitMenu(wxCommandEvent& event);
|
||||
void OnProfilerMenu(wxCommandEvent& event);
|
||||
|
||||
// Sub dialogs
|
||||
CRegisterWindow* m_RegisterWindow;
|
||||
CBreakPointWindow* m_BreakpointWindow;
|
||||
CMemoryWindow* m_MemoryWindow;
|
||||
CJitWindow* m_JitWindow;
|
||||
DSPDebuggerLLE* m_SoundWindow;
|
||||
GFXDebuggerPanel* m_VideoWindow;
|
||||
|
||||
// Settings
|
||||
bool bAutomaticStart; bool bBootToPause;
|
||||
bool bShowOnStart[IDM_VIDEOWINDOW - IDM_LOGWINDOW + 1];
|
||||
int iNbAffiliation[IDM_CODEWINDOW - IDM_LOGWINDOW + 1];
|
||||
|
||||
private:
|
||||
|
||||
enum
|
||||
{
|
||||
// Debugger GUI Objects
|
||||
ID_CODEVIEW,
|
||||
ID_CALLSTACKLIST,
|
||||
ID_CALLERSLIST,
|
||||
ID_CALLSLIST,
|
||||
ID_SYMBOLLIST
|
||||
};
|
||||
|
||||
void OnSymbolListChange(wxCommandEvent& event);
|
||||
void OnSymbolListContextMenu(wxContextMenuEvent& event);
|
||||
void OnCallstackListChange(wxCommandEvent& event);
|
||||
void OnCallersListChange(wxCommandEvent& event);
|
||||
void OnCallsListChange(wxCommandEvent& event);
|
||||
void OnCodeViewChange(wxCommandEvent &event);
|
||||
void OnHostMessage(wxCommandEvent& event);
|
||||
|
||||
// Debugger functions
|
||||
void SingleStep();
|
||||
void StepOver();
|
||||
void ToggleBreakpoint();
|
||||
|
||||
void UpdateLists();
|
||||
void UpdateCallstack();
|
||||
void OnKeyDown(wxKeyEvent& event);
|
||||
|
||||
void InitBitmaps();
|
||||
void CreateGUIControls(const SCoreStartupParameter& _LocalCoreStartupParameter);
|
||||
|
||||
CCodeView* codeview;
|
||||
wxListBox* callstack;
|
||||
wxListBox* symbols;
|
||||
wxListBox* callers;
|
||||
wxListBox* calls;
|
||||
Common::Event sync_event;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif // CODEWINDOW_H_
|
551
Source/Core/DolphinWX/Src/CodeWindowFunctions.cpp
Normal file
551
Source/Core/DolphinWX/Src/CodeWindowFunctions.cpp
Normal file
@ -0,0 +1,551 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "Common.h"
|
||||
#include "CommonPaths.h"
|
||||
|
||||
#include <wx/button.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/textdlg.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/thread.h>
|
||||
#include <wx/mstream.h>
|
||||
#include <wx/tipwin.h>
|
||||
#include <wx/fontdlg.h>
|
||||
|
||||
#include "../../DolphinWX/Src/WxUtils.h"
|
||||
|
||||
#include "Host.h"
|
||||
|
||||
#include "DebuggerUIUtil.h"
|
||||
|
||||
#include "RegisterWindow.h"
|
||||
#include "BreakpointWindow.h"
|
||||
#include "MemoryWindow.h"
|
||||
#include "JitWindow.h"
|
||||
#include "DebuggerPanel.h"
|
||||
#include "DSPDebugWindow.h"
|
||||
#include "FileUtil.h"
|
||||
|
||||
#include "CodeWindow.h"
|
||||
#include "CodeView.h"
|
||||
|
||||
#include "Core.h"
|
||||
#include "HLE/HLE.h"
|
||||
#include "Boot/Boot.h"
|
||||
#include "LogManager.h"
|
||||
#include "HW/CPU.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "Debugger/PPCDebugInterface.h"
|
||||
#include "Debugger/Debugger_SymbolMap.h"
|
||||
#include "PowerPC/PPCAnalyst.h"
|
||||
#include "PowerPC/Profiler.h"
|
||||
#include "PowerPC/PPCSymbolDB.h"
|
||||
#include "PowerPC/SignatureDB.h"
|
||||
#include "PowerPC/PPCTables.h"
|
||||
#include "PowerPC/JitCommon/JitBase.h"
|
||||
#include "PowerPC/JitCommon/JitCache.h" // for ClearCache()
|
||||
|
||||
#include "ConfigManager.h"
|
||||
|
||||
extern "C" // Bitmaps
|
||||
{
|
||||
#include "../resources/toolbar_play.c"
|
||||
#include "../resources/toolbar_pause.c"
|
||||
#include "../resources/toolbar_add_memorycheck.c"
|
||||
#include "../resources/toolbar_delete.c"
|
||||
#include "../resources/toolbar_add_breakpoint.c"
|
||||
}
|
||||
|
||||
// Save and load settings
|
||||
// -----------------------------
|
||||
void CCodeWindow::Load()
|
||||
{
|
||||
IniFile ini;
|
||||
ini.Load(File::GetUserPath(F_DEBUGGERCONFIG_IDX));
|
||||
|
||||
// The font to override DebuggerFont with
|
||||
std::string fontDesc;
|
||||
ini.Get("General", "DebuggerFont", &fontDesc);
|
||||
if (!fontDesc.empty())
|
||||
DebuggerFont.SetNativeFontInfoUserDesc(wxString::FromAscii(fontDesc.c_str()));
|
||||
|
||||
// Boot to pause or not
|
||||
ini.Get("General", "AutomaticStart", &bAutomaticStart, false);
|
||||
ini.Get("General", "BootToPause", &bBootToPause, true);
|
||||
|
||||
const char* SettingName[] = {
|
||||
"Log",
|
||||
"Console",
|
||||
"Registers",
|
||||
"Breakpoints",
|
||||
"Memory",
|
||||
"JIT",
|
||||
"Sound",
|
||||
"Video",
|
||||
"Code"
|
||||
};
|
||||
|
||||
// Decide what windows to show
|
||||
for (int i = 0; i <= IDM_VIDEOWINDOW - IDM_LOGWINDOW; i++)
|
||||
ini.Get("ShowOnStart", SettingName[i], &bShowOnStart[i], false);
|
||||
|
||||
// Get notebook affiliation
|
||||
std::string _Section = "P - " +
|
||||
((Parent->ActivePerspective < Parent->Perspectives.size())
|
||||
? Parent->Perspectives[Parent->ActivePerspective].Name : "Perspective 1");
|
||||
|
||||
for (int i = 0; i <= IDM_CODEWINDOW - IDM_LOGWINDOW; i++)
|
||||
ini.Get(_Section.c_str(), SettingName[i], &iNbAffiliation[i], 0);
|
||||
|
||||
// Get floating setting
|
||||
for (int i = 0; i <= IDM_CODEWINDOW - IDM_LOGWINDOW; i++)
|
||||
ini.Get("Float", SettingName[i], &Parent->bFloatWindow[i], false);
|
||||
}
|
||||
|
||||
void CCodeWindow::Save()
|
||||
{
|
||||
IniFile ini;
|
||||
ini.Load(File::GetUserPath(F_DEBUGGERCONFIG_IDX));
|
||||
|
||||
ini.Set("General", "DebuggerFont",
|
||||
std::string(DebuggerFont.GetNativeFontInfoUserDesc().mb_str()));
|
||||
|
||||
// Boot to pause or not
|
||||
ini.Set("General", "AutomaticStart", GetMenuBar()->IsChecked(IDM_AUTOMATICSTART));
|
||||
ini.Set("General", "BootToPause", GetMenuBar()->IsChecked(IDM_BOOTTOPAUSE));
|
||||
|
||||
const char* SettingName[] = {
|
||||
"Log",
|
||||
"Console",
|
||||
"Registers",
|
||||
"Breakpoints",
|
||||
"Memory",
|
||||
"JIT",
|
||||
"Sound",
|
||||
"Video",
|
||||
"Code"
|
||||
};
|
||||
|
||||
// Save windows settings
|
||||
for (int i = IDM_LOGWINDOW; i <= IDM_VIDEOWINDOW; i++)
|
||||
ini.Set("ShowOnStart", SettingName[i - IDM_LOGWINDOW], GetMenuBar()->IsChecked(i));
|
||||
|
||||
// Save notebook affiliations
|
||||
std::string _Section = "P - " + Parent->Perspectives[Parent->ActivePerspective].Name;
|
||||
for (int i = 0; i <= IDM_CODEWINDOW - IDM_LOGWINDOW; i++)
|
||||
ini.Set(_Section.c_str(), SettingName[i], iNbAffiliation[i]);
|
||||
|
||||
// Save floating setting
|
||||
for (int i = IDM_LOGWINDOW_PARENT; i <= IDM_CODEWINDOW_PARENT; i++)
|
||||
ini.Set("Float", SettingName[i - IDM_LOGWINDOW_PARENT], !!FindWindowById(i));
|
||||
|
||||
ini.Save(File::GetUserPath(F_DEBUGGERCONFIG_IDX));
|
||||
}
|
||||
|
||||
// Symbols, JIT, Profiler
|
||||
// ----------------
|
||||
void CCodeWindow::CreateMenuSymbols(wxMenuBar *pMenuBar)
|
||||
{
|
||||
wxMenu *pSymbolsMenu = new wxMenu;
|
||||
pSymbolsMenu->Append(IDM_CLEARSYMBOLS, _("&Clear symbols"));
|
||||
// pSymbolsMenu->Append(IDM_CLEANSYMBOLS, _("&Clean symbols (zz)"));
|
||||
pSymbolsMenu->Append(IDM_SCANFUNCTIONS, _("&Generate symbol map"));
|
||||
pSymbolsMenu->AppendSeparator();
|
||||
pSymbolsMenu->Append(IDM_LOADMAPFILE, _("&Load symbol map"));
|
||||
pSymbolsMenu->Append(IDM_SAVEMAPFILE, _("&Save symbol map"));
|
||||
pSymbolsMenu->AppendSeparator();
|
||||
pSymbolsMenu->Append(IDM_SAVEMAPFILEWITHCODES, _("Save code"),
|
||||
wxString::FromAscii("Save the entire disassembled code. This may take a several seconds"
|
||||
" and may require between 50 and 100 MB of hard drive space. It will only save code"
|
||||
" that are in the first 4 MB of memory, if you are debugging a game that load .rel"
|
||||
" files with code to memory you may want to increase that to perhaps 8 MB, you can do"
|
||||
" that from SymbolDB::SaveMap().")
|
||||
);
|
||||
|
||||
pSymbolsMenu->AppendSeparator();
|
||||
pSymbolsMenu->Append(IDM_CREATESIGNATUREFILE, _("&Create signature file..."));
|
||||
pSymbolsMenu->Append(IDM_USESIGNATUREFILE, _("&Use signature file..."));
|
||||
pSymbolsMenu->AppendSeparator();
|
||||
pSymbolsMenu->Append(IDM_PATCHHLEFUNCTIONS, _("&Patch HLE functions"));
|
||||
pSymbolsMenu->Append(IDM_RENAME_SYMBOLS, _("&Rename symbols from file..."));
|
||||
pMenuBar->Append(pSymbolsMenu, _("&Symbols"));
|
||||
|
||||
wxMenu *pProfilerMenu = new wxMenu;
|
||||
pProfilerMenu->Append(IDM_PROFILEBLOCKS, _("&Profile blocks"), wxEmptyString, wxITEM_CHECK);
|
||||
pProfilerMenu->AppendSeparator();
|
||||
pProfilerMenu->Append(IDM_WRITEPROFILE, _("&Write to profile.txt, show"));
|
||||
pMenuBar->Append(pProfilerMenu, _("&Profiler"));
|
||||
}
|
||||
|
||||
void CCodeWindow::OnProfilerMenu(wxCommandEvent& event)
|
||||
{
|
||||
if (Core::GetState() == Core::CORE_RUN) {
|
||||
event.Skip();
|
||||
return;
|
||||
}
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_PROFILEBLOCKS:
|
||||
if (jit != NULL) jit->ClearCache();
|
||||
Profiler::g_ProfileBlocks = GetMenuBar()->IsChecked(IDM_PROFILEBLOCKS);
|
||||
break;
|
||||
case IDM_WRITEPROFILE:
|
||||
Profiler::WriteProfileResults("profiler.txt");
|
||||
WxUtils::Launch("profiler.txt");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event)
|
||||
{
|
||||
Parent->ClearStatusBar();
|
||||
|
||||
if (Core::GetState() == Core::CORE_UNINITIALIZED) return;
|
||||
|
||||
std::string mapfile = CBoot::GenerateMapFilename();
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_CLEARSYMBOLS:
|
||||
if(!AskYesNo("Do you want to clear the list of symbol names?")) return;
|
||||
g_symbolDB.Clear();
|
||||
Host_NotifyMapLoaded();
|
||||
break;
|
||||
case IDM_CLEANSYMBOLS:
|
||||
g_symbolDB.Clear("zz");
|
||||
Host_NotifyMapLoaded();
|
||||
break;
|
||||
case IDM_SCANFUNCTIONS:
|
||||
{
|
||||
PPCAnalyst::FindFunctions(0x80000000, 0x81800000, &g_symbolDB);
|
||||
SignatureDB db;
|
||||
if (db.Load((File::GetSysDirectory() + TOTALDB).c_str()))
|
||||
{
|
||||
db.Apply(&g_symbolDB);
|
||||
Parent->StatusBarMessage("Generated symbol names from '%s'", TOTALDB);
|
||||
}
|
||||
else
|
||||
{
|
||||
Parent->StatusBarMessage("'%s' not found, no symbol names generated", TOTALDB);
|
||||
}
|
||||
// HLE::PatchFunctions();
|
||||
// Update GUI
|
||||
NotifyMapLoaded();
|
||||
break;
|
||||
}
|
||||
case IDM_LOADMAPFILE:
|
||||
if (!File::Exists(mapfile.c_str()))
|
||||
{
|
||||
g_symbolDB.Clear();
|
||||
PPCAnalyst::FindFunctions(0x81300000, 0x81800000, &g_symbolDB);
|
||||
SignatureDB db;
|
||||
if (db.Load((File::GetSysDirectory() + TOTALDB).c_str()))
|
||||
db.Apply(&g_symbolDB);
|
||||
Parent->StatusBarMessage("'%s' not found, scanning for common functions instead", mapfile.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
g_symbolDB.LoadMap(mapfile.c_str());
|
||||
Parent->StatusBarMessage("Loaded symbols from '%s'", mapfile.c_str());
|
||||
}
|
||||
HLE::PatchFunctions();
|
||||
NotifyMapLoaded();
|
||||
break;
|
||||
case IDM_SAVEMAPFILE:
|
||||
g_symbolDB.SaveMap(mapfile.c_str());
|
||||
break;
|
||||
case IDM_SAVEMAPFILEWITHCODES:
|
||||
g_symbolDB.SaveMap(mapfile.c_str(), true);
|
||||
break;
|
||||
|
||||
case IDM_RENAME_SYMBOLS:
|
||||
{
|
||||
wxString path = wxFileSelector(
|
||||
_("Apply signature file"), wxEmptyString,
|
||||
wxEmptyString, wxEmptyString,
|
||||
_T("Dolphin Symbol Rename File (*.sym)|*.sym"),
|
||||
wxFD_OPEN | wxFD_FILE_MUST_EXIST, this);
|
||||
if (! path.IsEmpty())
|
||||
{
|
||||
FILE *f = fopen(path.mb_str(), "r");
|
||||
if (!f)
|
||||
return;
|
||||
|
||||
while (!feof(f))
|
||||
{
|
||||
char line[512];
|
||||
fgets(line, 511, f);
|
||||
if (strlen(line) < 4)
|
||||
continue;
|
||||
|
||||
u32 address, type;
|
||||
char name[512];
|
||||
sscanf(line, "%08x %02i %s", &address, &type, name);
|
||||
|
||||
Symbol *symbol = g_symbolDB.GetSymbolFromAddr(address);
|
||||
if (symbol) {
|
||||
symbol->name = line+12;
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
Host_NotifyMapLoaded();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_CREATESIGNATUREFILE:
|
||||
{
|
||||
wxTextEntryDialog input_prefix(
|
||||
this,
|
||||
wxString::FromAscii("Only export symbols with prefix:\n(Blank for all symbols)"),
|
||||
wxGetTextFromUserPromptStr,
|
||||
wxEmptyString);
|
||||
|
||||
if (input_prefix.ShowModal() == wxID_OK)
|
||||
{
|
||||
std::string prefix(input_prefix.GetValue().mb_str());
|
||||
|
||||
wxString path = wxFileSelector(
|
||||
_T("Save signature as"), wxEmptyString, wxEmptyString, wxEmptyString,
|
||||
_T("Dolphin Signature File (*.dsy)|*.dsy;"), wxFD_SAVE,
|
||||
this);
|
||||
if (!path.IsEmpty())
|
||||
{
|
||||
SignatureDB db;
|
||||
db.Initialize(&g_symbolDB, prefix.c_str());
|
||||
std::string filename(path.mb_str());
|
||||
db.Save(path.mb_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case IDM_USESIGNATUREFILE:
|
||||
{
|
||||
wxString path = wxFileSelector(
|
||||
_T("Apply signature file"), wxEmptyString, wxEmptyString, wxEmptyString,
|
||||
_T("Dolphin Signature File (*.dsy)|*.dsy;"), wxFD_OPEN | wxFD_FILE_MUST_EXIST,
|
||||
this);
|
||||
if (!path.IsEmpty())
|
||||
{
|
||||
SignatureDB db;
|
||||
db.Load(path.mb_str());
|
||||
db.Apply(&g_symbolDB);
|
||||
}
|
||||
}
|
||||
NotifyMapLoaded();
|
||||
break;
|
||||
case IDM_PATCHHLEFUNCTIONS:
|
||||
HLE::PatchFunctions();
|
||||
Update();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::NotifyMapLoaded()
|
||||
{
|
||||
if (!codeview) return;
|
||||
|
||||
g_symbolDB.FillInCallers();
|
||||
//symbols->Show(false); // hide it for faster filling
|
||||
symbols->Freeze(); // HyperIris: wx style fast filling
|
||||
symbols->Clear();
|
||||
for (PPCSymbolDB::XFuncMap::iterator iter = g_symbolDB.GetIterator(); iter != g_symbolDB.End(); ++iter)
|
||||
{
|
||||
int idx = symbols->Append(wxString::FromAscii(iter->second.name.c_str()));
|
||||
symbols->SetClientData(idx, (void*)&iter->second);
|
||||
}
|
||||
symbols->Thaw();
|
||||
//symbols->Show(true);
|
||||
Update();
|
||||
}
|
||||
|
||||
void CCodeWindow::OnSymbolListChange(wxCommandEvent& event)
|
||||
{
|
||||
int index = symbols->GetSelection();
|
||||
if (index >= 0) {
|
||||
Symbol* pSymbol = static_cast<Symbol *>(symbols->GetClientData(index));
|
||||
if (pSymbol != NULL)
|
||||
{
|
||||
if(pSymbol->type == Symbol::SYMBOL_DATA)
|
||||
{
|
||||
if(m_MemoryWindow)// && m_MemoryWindow->IsVisible())
|
||||
m_MemoryWindow->JumpToAddress(pSymbol->address);
|
||||
}
|
||||
else
|
||||
{
|
||||
JumpToAddress(pSymbol->address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::OnSymbolListContextMenu(wxContextMenuEvent& event)
|
||||
{
|
||||
}
|
||||
|
||||
// Change the global DebuggerFont
|
||||
void CCodeWindow::OnChangeFont(wxCommandEvent& event)
|
||||
{
|
||||
wxFontData data;
|
||||
data.SetInitialFont(DebuggerFont);
|
||||
|
||||
wxFontDialog dialog(this, data);
|
||||
if ( dialog.ShowModal() == wxID_OK )
|
||||
DebuggerFont = dialog.GetFontData().GetChosenFont();
|
||||
}
|
||||
|
||||
// Toogle windows
|
||||
|
||||
void CCodeWindow::OpenPages()
|
||||
{
|
||||
ToggleCodeWindow(true);
|
||||
if (bShowOnStart[0])
|
||||
Parent->ToggleLogWindow(true);
|
||||
if (bShowOnStart[IDM_CONSOLEWINDOW - IDM_LOGWINDOW])
|
||||
Parent->ToggleConsole(true);
|
||||
if (bShowOnStart[IDM_REGISTERWINDOW - IDM_LOGWINDOW])
|
||||
ToggleRegisterWindow(true);
|
||||
if (bShowOnStart[IDM_BREAKPOINTWINDOW - IDM_LOGWINDOW])
|
||||
ToggleBreakPointWindow(true);
|
||||
if (bShowOnStart[IDM_MEMORYWINDOW - IDM_LOGWINDOW])
|
||||
ToggleMemoryWindow(true);
|
||||
if (bShowOnStart[IDM_JITWINDOW - IDM_LOGWINDOW])
|
||||
ToggleJitWindow(true);
|
||||
if (bShowOnStart[IDM_SOUNDWINDOW - IDM_LOGWINDOW])
|
||||
ToggleSoundWindow(true);
|
||||
if (bShowOnStart[IDM_VIDEOWINDOW - IDM_LOGWINDOW])
|
||||
ToggleVideoWindow(true);
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleCodeWindow(bool bShow)
|
||||
{
|
||||
if (bShow)
|
||||
Parent->DoAddPage(this,
|
||||
iNbAffiliation[IDM_CODEWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_CODEWINDOW - IDM_LOGWINDOW]);
|
||||
else // Hide
|
||||
Parent->DoRemovePage(this);
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleRegisterWindow(bool bShow)
|
||||
{
|
||||
GetMenuBar()->FindItem(IDM_REGISTERWINDOW)->Check(bShow);
|
||||
if (bShow)
|
||||
{
|
||||
if (!m_RegisterWindow)
|
||||
m_RegisterWindow = new CRegisterWindow(Parent, IDM_REGISTERWINDOW);
|
||||
Parent->DoAddPage(m_RegisterWindow,
|
||||
iNbAffiliation[IDM_REGISTERWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_REGISTERWINDOW - IDM_LOGWINDOW]);
|
||||
}
|
||||
else // Close
|
||||
{
|
||||
Parent->DoRemovePage(m_RegisterWindow, false);
|
||||
m_RegisterWindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleBreakPointWindow(bool bShow)
|
||||
{
|
||||
GetMenuBar()->FindItem(IDM_BREAKPOINTWINDOW)->Check(bShow);
|
||||
if (bShow)
|
||||
{
|
||||
if (!m_BreakpointWindow)
|
||||
m_BreakpointWindow = new CBreakPointWindow(this, Parent, IDM_BREAKPOINTWINDOW);
|
||||
Parent->DoAddPage(m_BreakpointWindow,
|
||||
iNbAffiliation[IDM_BREAKPOINTWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_BREAKPOINTWINDOW - IDM_LOGWINDOW]);
|
||||
}
|
||||
else // Close
|
||||
{
|
||||
Parent->DoRemovePage(m_BreakpointWindow, false);
|
||||
m_BreakpointWindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleMemoryWindow(bool bShow)
|
||||
{
|
||||
GetMenuBar()->FindItem(IDM_MEMORYWINDOW)->Check(bShow);
|
||||
if (bShow)
|
||||
{
|
||||
if (!m_MemoryWindow)
|
||||
m_MemoryWindow = new CMemoryWindow(Parent, IDM_MEMORYWINDOW);
|
||||
Parent->DoAddPage(m_MemoryWindow,
|
||||
iNbAffiliation[IDM_MEMORYWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_MEMORYWINDOW - IDM_LOGWINDOW]);
|
||||
}
|
||||
else // Close
|
||||
{
|
||||
Parent->DoRemovePage(m_MemoryWindow, false);
|
||||
m_MemoryWindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleJitWindow(bool bShow)
|
||||
{
|
||||
GetMenuBar()->FindItem(IDM_JITWINDOW)->Check(bShow);
|
||||
if (bShow)
|
||||
{
|
||||
if (!m_JitWindow)
|
||||
m_JitWindow = new CJitWindow(Parent, IDM_JITWINDOW);
|
||||
Parent->DoAddPage(m_JitWindow,
|
||||
iNbAffiliation[IDM_JITWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_JITWINDOW - IDM_LOGWINDOW]);
|
||||
}
|
||||
else // Close
|
||||
{
|
||||
Parent->DoRemovePage(m_JitWindow, false);
|
||||
m_JitWindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CCodeWindow::ToggleSoundWindow(bool bShow)
|
||||
{
|
||||
GetMenuBar()->FindItem(IDM_SOUNDWINDOW)->Check(bShow);
|
||||
if (bShow)
|
||||
{
|
||||
if (!m_SoundWindow)
|
||||
m_SoundWindow = new DSPDebuggerLLE(Parent, IDM_SOUNDWINDOW);
|
||||
Parent->DoAddPage(m_SoundWindow,
|
||||
iNbAffiliation[IDM_SOUNDWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_SOUNDWINDOW - IDM_LOGWINDOW]);
|
||||
}
|
||||
else // Close
|
||||
{
|
||||
Parent->DoRemovePage(m_SoundWindow, false);
|
||||
m_SoundWindow = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void CCodeWindow::ToggleVideoWindow(bool bShow)
|
||||
{
|
||||
GetMenuBar()->FindItem(IDM_VIDEOWINDOW)->Check(bShow);
|
||||
if (bShow)
|
||||
{
|
||||
if (!m_VideoWindow)
|
||||
m_VideoWindow = new GFXDebuggerPanel(Parent, IDM_VIDEOWINDOW);
|
||||
Parent->DoAddPage(m_VideoWindow,
|
||||
iNbAffiliation[IDM_VIDEOWINDOW - IDM_LOGWINDOW],
|
||||
Parent->bFloatWindow[IDM_VIDEOWINDOW - IDM_LOGWINDOW]);
|
||||
}
|
||||
else // Close
|
||||
{
|
||||
Parent->DoRemovePage(m_VideoWindow, false);
|
||||
m_VideoWindow = NULL;
|
||||
}
|
||||
}
|
294
Source/Core/DolphinWX/Src/DSPDebugWindow.cpp
Normal file
294
Source/Core/DolphinWX/Src/DSPDebugWindow.cpp
Normal file
@ -0,0 +1,294 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "Common.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
#include <wx/artprov.h>
|
||||
|
||||
#include "StringUtil.h"
|
||||
#include "DSPDebugWindow.h"
|
||||
#include "DSPRegisterView.h"
|
||||
#include "CodeView.h"
|
||||
#include "MemoryView.h"
|
||||
#include "HW/DSPLLE/DSPSymbols.h"
|
||||
|
||||
DSPDebuggerLLE* m_DebuggerFrame = NULL;
|
||||
|
||||
BEGIN_EVENT_TABLE(DSPDebuggerLLE, wxPanel)
|
||||
EVT_CLOSE(DSPDebuggerLLE::OnClose)
|
||||
EVT_MENU_RANGE(ID_RUNTOOL, ID_SHOWPCTOOL, DSPDebuggerLLE::OnChangeState)
|
||||
EVT_TEXT_ENTER(ID_ADDRBOX, DSPDebuggerLLE::OnAddrBoxChange)
|
||||
EVT_LISTBOX(ID_SYMBOLLIST, DSPDebuggerLLE::OnSymbolListChange)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
DSPDebuggerLLE::DSPDebuggerLLE(wxWindow* parent, wxWindowID id)
|
||||
: wxPanel(parent, id, wxDefaultPosition, wxDefaultSize,
|
||||
wxTAB_TRAVERSAL, _("DSP LLE Debugger"))
|
||||
, m_CachedStepCounter(-1)
|
||||
{
|
||||
m_DebuggerFrame = this;
|
||||
|
||||
// notify wxAUI which frame to use
|
||||
m_mgr.SetManagedWindow(this);
|
||||
m_mgr.SetFlags(wxAUI_MGR_DEFAULT | wxAUI_MGR_LIVE_RESIZE);
|
||||
|
||||
m_Toolbar = new wxAuiToolBar(this, ID_TOOLBAR,
|
||||
wxDefaultPosition, wxDefaultSize, wxAUI_TB_HORZ_TEXT);
|
||||
m_Toolbar->AddTool(ID_RUNTOOL, wxT("Pause"),
|
||||
wxArtProvider::GetBitmap(wxART_TICK_MARK, wxART_OTHER, wxSize(10,10)));
|
||||
m_Toolbar->AddTool(ID_STEPTOOL, wxT("Step"),
|
||||
wxArtProvider::GetBitmap(wxART_GO_DOWN, wxART_OTHER, wxSize(10,10)));
|
||||
m_Toolbar->AddTool(ID_SHOWPCTOOL, wxT("Show PC"),
|
||||
wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_OTHER, wxSize(10,10)));
|
||||
m_Toolbar->AddSeparator();
|
||||
m_Toolbar->AddControl(new wxTextCtrl(m_Toolbar, ID_ADDRBOX, wxEmptyString,
|
||||
wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER));
|
||||
m_Toolbar->Realize();
|
||||
|
||||
m_SymbolList = new wxListBox(this, ID_SYMBOLLIST, wxDefaultPosition,
|
||||
wxSize(140, 100), 0, NULL, wxLB_SORT);
|
||||
|
||||
m_MainNotebook = new wxAuiNotebook(this, wxID_ANY,
|
||||
wxDefaultPosition, wxDefaultSize,
|
||||
wxAUI_NB_TOP | wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_MOVE);
|
||||
|
||||
wxPanel *code_panel = new wxPanel(m_MainNotebook, wxID_ANY);
|
||||
wxBoxSizer *code_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
m_CodeView = new CCodeView(&debug_interface, &DSPSymbols::g_dsp_symbol_db, code_panel);
|
||||
m_CodeView->SetPlain();
|
||||
code_sizer->Add(m_CodeView, 1, wxALL | wxEXPAND);
|
||||
code_panel->SetSizer(code_sizer);
|
||||
code_sizer->SetSizeHints(code_panel);
|
||||
m_MainNotebook->AddPage(code_panel, wxT("Disasm"), true);
|
||||
|
||||
wxPanel *mem_panel = new wxPanel(m_MainNotebook, wxID_ANY);
|
||||
wxBoxSizer *mem_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
// TODO insert memViewer class
|
||||
m_MemView = new CMemoryView(&debug_interface, mem_panel);
|
||||
mem_sizer->Add(m_MemView, 1, wxALL | wxEXPAND);
|
||||
mem_panel->SetSizer(mem_sizer);
|
||||
mem_sizer->SetSizeHints(mem_panel);
|
||||
m_MainNotebook->AddPage(mem_panel, wxT("Mem"));
|
||||
|
||||
m_Regs = new DSPRegisterView(this, ID_DSP_REGS);
|
||||
|
||||
// add the panes to the manager
|
||||
m_mgr.AddPane(m_Toolbar, wxAuiPaneInfo().
|
||||
ToolbarPane().Top().
|
||||
LeftDockable(false).RightDockable(false));
|
||||
|
||||
m_mgr.AddPane(m_SymbolList, wxAuiPaneInfo().
|
||||
Left().CloseButton(false).
|
||||
Caption(wxT("Symbols")).Dockable(true));
|
||||
|
||||
m_mgr.AddPane(m_MainNotebook, wxAuiPaneInfo().
|
||||
Name(wxT("m_MainNotebook")).Center().
|
||||
CloseButton(false).MaximizeButton(true));
|
||||
|
||||
m_mgr.AddPane(m_Regs, wxAuiPaneInfo().Right().
|
||||
CloseButton(false).Caption(wxT("Registers")).
|
||||
Dockable(true));
|
||||
|
||||
UpdateState();
|
||||
|
||||
m_mgr.Update();
|
||||
}
|
||||
|
||||
DSPDebuggerLLE::~DSPDebuggerLLE()
|
||||
{
|
||||
m_mgr.UnInit();
|
||||
m_DebuggerFrame = NULL;
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::OnClose(wxCloseEvent& event)
|
||||
{
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::OnChangeState(wxCommandEvent& event)
|
||||
{
|
||||
if (DSPCore_GetState() == DSPCORE_STOP)
|
||||
return;
|
||||
|
||||
switch (event.GetId())
|
||||
{
|
||||
case ID_RUNTOOL:
|
||||
if (DSPCore_GetState() == DSPCORE_RUNNING)
|
||||
DSPCore_SetState(DSPCORE_STEPPING);
|
||||
else
|
||||
DSPCore_SetState(DSPCORE_RUNNING);
|
||||
break;
|
||||
|
||||
case ID_STEPTOOL:
|
||||
if (DSPCore_GetState() == DSPCORE_STEPPING)
|
||||
{
|
||||
DSPCore_Step();
|
||||
Refresh();
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_SHOWPCTOOL:
|
||||
FocusOnPC();
|
||||
break;
|
||||
}
|
||||
|
||||
UpdateState();
|
||||
m_mgr.Update();
|
||||
}
|
||||
|
||||
void Host_RefreshDSPDebuggerWindow()
|
||||
{
|
||||
if (m_DebuggerFrame)
|
||||
m_DebuggerFrame->Refresh();
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::Refresh()
|
||||
{
|
||||
#if defined __WXGTK__
|
||||
if (!wxIsMainThread())
|
||||
wxMutexGuiEnter();
|
||||
#endif
|
||||
UpdateSymbolMap();
|
||||
UpdateDisAsmListView();
|
||||
UpdateRegisterFlags();
|
||||
UpdateState();
|
||||
m_mgr.Update();
|
||||
#if defined __WXGTK__
|
||||
if (!wxIsMainThread())
|
||||
wxMutexGuiLeave();
|
||||
#endif
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::FocusOnPC()
|
||||
{
|
||||
JumpToAddress(g_dsp.pc);
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::UpdateState()
|
||||
{
|
||||
if (DSPCore_GetState() == DSPCORE_RUNNING)
|
||||
{
|
||||
m_Toolbar->SetToolLabel(ID_RUNTOOL, wxT("Pause"));
|
||||
m_Toolbar->SetToolBitmap(ID_RUNTOOL,
|
||||
wxArtProvider::GetBitmap(wxART_TICK_MARK, wxART_OTHER, wxSize(10,10)));
|
||||
m_Toolbar->EnableTool(ID_STEPTOOL, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Toolbar->SetToolLabel(ID_RUNTOOL, wxT("Run"));
|
||||
m_Toolbar->SetToolBitmap(ID_RUNTOOL,
|
||||
wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_OTHER, wxSize(10,10)));
|
||||
m_Toolbar->EnableTool(ID_STEPTOOL, true);
|
||||
}
|
||||
m_Toolbar->Realize();
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::UpdateDisAsmListView()
|
||||
{
|
||||
if (m_CachedStepCounter == g_dsp.step_counter)
|
||||
return;
|
||||
|
||||
// show PC
|
||||
FocusOnPC();
|
||||
m_CachedStepCounter = g_dsp.step_counter;
|
||||
m_Regs->Update();
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::UpdateSymbolMap()
|
||||
{
|
||||
if (g_dsp.dram == NULL)
|
||||
return;
|
||||
|
||||
m_SymbolList->Freeze(); // HyperIris: wx style fast filling
|
||||
m_SymbolList->Clear();
|
||||
for (SymbolDB::XFuncMap::iterator iter = DSPSymbols::g_dsp_symbol_db.GetIterator();
|
||||
iter != DSPSymbols::g_dsp_symbol_db.End(); ++iter)
|
||||
{
|
||||
int idx = m_SymbolList->Append(wxString::FromAscii(iter->second.name.c_str()));
|
||||
m_SymbolList->SetClientData(idx, (void*)&iter->second);
|
||||
}
|
||||
m_SymbolList->Thaw();
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::OnSymbolListChange(wxCommandEvent& event)
|
||||
{
|
||||
int index = m_SymbolList->GetSelection();
|
||||
if (index >= 0) {
|
||||
Symbol* pSymbol = static_cast<Symbol *>(m_SymbolList->GetClientData(index));
|
||||
if (pSymbol != NULL)
|
||||
{
|
||||
if (pSymbol->type == Symbol::SYMBOL_FUNCTION)
|
||||
{
|
||||
JumpToAddress(pSymbol->address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::UpdateRegisterFlags()
|
||||
{
|
||||
}
|
||||
|
||||
void DSPDebuggerLLE::OnAddrBoxChange(wxCommandEvent& event)
|
||||
{
|
||||
wxTextCtrl* pAddrCtrl = (wxTextCtrl*)m_Toolbar->FindControl(ID_ADDRBOX);
|
||||
wxString txt = pAddrCtrl->GetValue();
|
||||
|
||||
std::string text(txt.mb_str());
|
||||
text = StripSpaces(text);
|
||||
if (text.size())
|
||||
{
|
||||
u32 addr;
|
||||
sscanf(text.c_str(), "%04x", &addr);
|
||||
if (JumpToAddress(addr))
|
||||
pAddrCtrl->SetBackgroundColour(*wxWHITE);
|
||||
else
|
||||
pAddrCtrl->SetBackgroundColour(*wxRED);
|
||||
}
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
bool DSPDebuggerLLE::JumpToAddress(u16 addr)
|
||||
{
|
||||
int page = m_MainNotebook->GetSelection();
|
||||
if (page == 0)
|
||||
{
|
||||
// Center on valid instruction in IRAM/IROM
|
||||
int new_line = DSPSymbols::Addr2Line(addr);
|
||||
if (new_line >= 0) {
|
||||
m_CodeView->Center(new_line);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if (page == 1)
|
||||
{
|
||||
// Center on any location in any valid ROM/RAM
|
||||
int seg = addr >> 12;
|
||||
if (seg == 0 || seg == 1 ||
|
||||
seg == 8 || seg == 0xf)
|
||||
{
|
||||
m_MemView->Center(addr);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
102
Source/Core/DolphinWX/Src/DSPDebugWindow.h
Normal file
102
Source/Core/DolphinWX/Src/DSPDebugWindow.h
Normal file
@ -0,0 +1,102 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef _DSP_DEBUGGER_LLE_H
|
||||
#define _DSP_DEBUGGER_LLE_H
|
||||
|
||||
// general things
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/frame.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/statline.h>
|
||||
#include <wx/aui/aui.h>
|
||||
|
||||
#include "DSP/disassemble.h"
|
||||
#include "DSP/DSPInterpreter.h"
|
||||
#include "DSP/DSPMemoryMap.h"
|
||||
#include "HW/DSPLLE/DSPDebugInterface.h"
|
||||
|
||||
class DSPRegisterView;
|
||||
class CCodeView;
|
||||
class CMemoryView;
|
||||
|
||||
class DSPDebuggerLLE : public wxPanel
|
||||
{
|
||||
public:
|
||||
DSPDebuggerLLE(wxWindow *parent, wxWindowID id = wxID_ANY);
|
||||
virtual ~DSPDebuggerLLE();
|
||||
|
||||
void Refresh();
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
enum
|
||||
{
|
||||
ID_TOOLBAR = 1000,
|
||||
ID_RUNTOOL,
|
||||
ID_STEPTOOL,
|
||||
ID_SHOWPCTOOL,
|
||||
ID_ADDRBOX,
|
||||
ID_SYMBOLLIST,
|
||||
ID_DSP_REGS
|
||||
};
|
||||
|
||||
DSPDebugInterface debug_interface;
|
||||
u64 m_CachedStepCounter;
|
||||
|
||||
// GUI updaters
|
||||
void UpdateDisAsmListView();
|
||||
void UpdateRegisterFlags();
|
||||
void UpdateSymbolMap();
|
||||
void UpdateState();
|
||||
|
||||
// GUI items
|
||||
wxAuiManager m_mgr;
|
||||
wxAuiToolBar* m_Toolbar;
|
||||
CCodeView* m_CodeView;
|
||||
CMemoryView* m_MemView;
|
||||
DSPRegisterView* m_Regs;
|
||||
wxListBox* m_SymbolList;
|
||||
wxAuiNotebook* m_MainNotebook;
|
||||
|
||||
void OnClose(wxCloseEvent& event);
|
||||
void OnChangeState(wxCommandEvent& event);
|
||||
//void OnRightClick(wxListEvent& event);
|
||||
//void OnDoubleClick(wxListEvent& event);
|
||||
void OnAddrBoxChange(wxCommandEvent& event);
|
||||
void OnSymbolListChange(wxCommandEvent& event);
|
||||
|
||||
bool JumpToAddress(u16 addr);
|
||||
|
||||
void FocusOnPC();
|
||||
//void UnselectAll();
|
||||
};
|
||||
|
||||
extern DSPDebuggerLLE* m_DebuggerFrame;
|
||||
|
||||
#endif //_DSP_DEBUGGER_LLE_H
|
94
Source/Core/DolphinWX/Src/DSPRegisterView.cpp
Normal file
94
Source/Core/DolphinWX/Src/DSPRegisterView.cpp
Normal file
@ -0,0 +1,94 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "DSPDebugWindow.h"
|
||||
#include "DSPRegisterView.h"
|
||||
|
||||
|
||||
wxString CDSPRegTable::GetValue(int row, int col)
|
||||
{
|
||||
if (row < 32) // 32 "normal" regs
|
||||
{
|
||||
switch (col)
|
||||
{
|
||||
case 0: return wxString::FromAscii(pdregname(row));
|
||||
case 1: return wxString::Format(wxT("0x%04x"), DSPCore_ReadRegister(row));
|
||||
default: return wxString::FromAscii("");
|
||||
}
|
||||
}
|
||||
return wxString::FromAscii("");
|
||||
}
|
||||
|
||||
void CDSPRegTable::SetValue(int, int, const wxString &)
|
||||
{
|
||||
}
|
||||
|
||||
void CDSPRegTable::UpdateCachedRegs()
|
||||
{
|
||||
if (m_CachedCounter == g_dsp.step_counter)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_CachedCounter = g_dsp.step_counter;
|
||||
|
||||
for (int i = 0; i < 32; ++i)
|
||||
{
|
||||
m_CachedRegHasChanged[i] = (m_CachedRegs[i] != DSPCore_ReadRegister(i));
|
||||
m_CachedRegs[i] = DSPCore_ReadRegister(i);
|
||||
}
|
||||
}
|
||||
|
||||
wxGridCellAttr *CDSPRegTable::GetAttr(int row, int col, wxGridCellAttr::wxAttrKind)
|
||||
{
|
||||
wxGridCellAttr *attr = new wxGridCellAttr();
|
||||
|
||||
attr->SetBackgroundColour(wxColour(wxT("#FFFFFF")));
|
||||
|
||||
switch (col)
|
||||
{
|
||||
case 1:
|
||||
attr->SetAlignment(wxALIGN_CENTER, wxALIGN_CENTER);
|
||||
break;
|
||||
default:
|
||||
attr->SetAlignment(wxALIGN_LEFT, wxALIGN_CENTER);
|
||||
break;
|
||||
}
|
||||
|
||||
if (col == 1)
|
||||
attr->SetTextColour(m_CachedRegHasChanged[row] ? wxColor(wxT("#FF0000")) : wxColor(wxT("#000000")));
|
||||
|
||||
attr->IncRef();
|
||||
return attr;
|
||||
}
|
||||
|
||||
DSPRegisterView::DSPRegisterView(wxWindow *parent, wxWindowID id)
|
||||
: wxGrid(parent, id, wxDefaultPosition, wxSize(130, 120))
|
||||
{
|
||||
SetTable(new CDSPRegTable(), true);
|
||||
SetRowLabelSize(0);
|
||||
SetColLabelSize(0);
|
||||
DisableDragRowSize();
|
||||
|
||||
AutoSizeColumns();
|
||||
}
|
||||
|
||||
void DSPRegisterView::Update()
|
||||
{
|
||||
((CDSPRegTable *)GetTable())->UpdateCachedRegs();
|
||||
ForceRefresh();
|
||||
}
|
56
Source/Core/DolphinWX/Src/DSPRegisterView.h
Normal file
56
Source/Core/DolphinWX/Src/DSPRegisterView.h
Normal file
@ -0,0 +1,56 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __DSPREGISTERVIEW_h__
|
||||
#define __DSPREGISTERVIEW_h__
|
||||
|
||||
#include <wx/grid.h>
|
||||
|
||||
|
||||
class CDSPRegTable : public wxGridTableBase
|
||||
{
|
||||
private:
|
||||
u64 m_CachedCounter;
|
||||
u16 m_CachedRegs[32];
|
||||
bool m_CachedRegHasChanged[32];
|
||||
|
||||
DECLARE_NO_COPY_CLASS(CDSPRegTable);
|
||||
|
||||
public:
|
||||
CDSPRegTable()
|
||||
{
|
||||
memset(m_CachedRegs, 0, sizeof(m_CachedRegs));
|
||||
memset(m_CachedRegHasChanged, 0, sizeof(m_CachedRegHasChanged));
|
||||
}
|
||||
|
||||
int GetNumberCols(void) {return 2;}
|
||||
int GetNumberRows(void) {return 32;}
|
||||
bool IsEmptyCell(int row, int col) {return false;}
|
||||
wxString GetValue(int row, int col);
|
||||
void SetValue(int row, int col, const wxString &);
|
||||
wxGridCellAttr *GetAttr(int, int, wxGridCellAttr::wxAttrKind);
|
||||
void UpdateCachedRegs();
|
||||
};
|
||||
|
||||
class DSPRegisterView : public wxGrid
|
||||
{
|
||||
public:
|
||||
DSPRegisterView(wxWindow* parent, wxWindowID id);
|
||||
void Update();
|
||||
};
|
||||
|
||||
#endif //__DSPREGISTERVIEW_h__
|
344
Source/Core/DolphinWX/Src/DebuggerPanel.cpp
Normal file
344
Source/Core/DolphinWX/Src/DebuggerPanel.cpp
Normal file
@ -0,0 +1,344 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
|
||||
#include "IniFile.h"
|
||||
#include "DebuggerPanel.h"
|
||||
#include "FileUtil.h"
|
||||
#include "../../Core/Src/ConfigManager.h"
|
||||
|
||||
#include "VideoConfig.h"
|
||||
#include "TextureCacheBase.h"
|
||||
#include "PixelShaderGen.h"
|
||||
#include "VertexShaderGen.h"
|
||||
#include "NativeVertexFormat.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(GFXDebuggerPanel, wxPanel)
|
||||
EVT_CLOSE(GFXDebuggerPanel::OnClose)
|
||||
EVT_BUTTON(ID_PAUSE,GFXDebuggerPanel::OnPauseButton)
|
||||
EVT_BUTTON(ID_PAUSE_AT_NEXT,GFXDebuggerPanel::OnPauseAtNextButton)
|
||||
EVT_BUTTON(ID_PAUSE_AT_NEXT_FRAME,GFXDebuggerPanel::OnPauseAtNextFrameButton)
|
||||
EVT_BUTTON(ID_CONT,GFXDebuggerPanel::OnContButton)
|
||||
EVT_BUTTON(ID_DUMP,GFXDebuggerPanel::OnDumpButton)
|
||||
EVT_BUTTON(ID_UPDATE_SCREEN,GFXDebuggerPanel::OnUpdateScreenButton)
|
||||
EVT_BUTTON(ID_CLEAR_SCREEN,GFXDebuggerPanel::OnClearScreenButton)
|
||||
EVT_BUTTON(ID_CLEAR_TEXTURE_CACHE,GFXDebuggerPanel::OnClearTextureCacheButton)
|
||||
EVT_BUTTON(ID_CLEAR_VERTEX_SHADER_CACHE,GFXDebuggerPanel::OnClearVertexShaderCacheButton)
|
||||
EVT_BUTTON(ID_CLEAR_PIXEL_SHADER_CACHE,GFXDebuggerPanel::OnClearPixelShaderCacheButton)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
GFXDebuggerBase *g_pdebugger = NULL;
|
||||
volatile bool GFXDebuggerPauseFlag = false;
|
||||
volatile PauseEvent GFXDebuggerToPauseAtNext = NOT_PAUSE;
|
||||
volatile int GFXDebuggerEventToPauseCount = 0;
|
||||
|
||||
GFXDebuggerPanel::GFXDebuggerPanel(wxWindow *parent, wxWindowID id, const wxPoint &position,
|
||||
const wxSize& size, long style, const wxString &title)
|
||||
: wxPanel(parent, id, position, size, style, title)
|
||||
{
|
||||
g_pdebugger = this;
|
||||
|
||||
CreateGUIControls();
|
||||
|
||||
LoadSettings();
|
||||
}
|
||||
|
||||
GFXDebuggerPanel::~GFXDebuggerPanel()
|
||||
{
|
||||
g_pdebugger = NULL;
|
||||
GFXDebuggerPauseFlag = false;
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnClose(wxCloseEvent& event)
|
||||
{
|
||||
// save the window position when we hide the window
|
||||
SaveSettings();
|
||||
|
||||
event.Skip(); // This means wxDialog's Destroy is used
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::SaveSettings() const
|
||||
{
|
||||
IniFile file;
|
||||
file.Load(File::GetUserPath(F_DEBUGGERCONFIG_IDX));
|
||||
|
||||
// TODO: make this work when we close the entire program too, currently on total close we get
|
||||
// weird values, perhaps because of some conflict with the rendering window
|
||||
// TODO: get the screen resolution and make limits from that
|
||||
if (GetPosition().x < 1000 && GetPosition().y < 1000
|
||||
&& GetSize().GetWidth() < 1000
|
||||
&& GetSize().GetHeight() < 1000)
|
||||
{
|
||||
file.Set("VideoWindow", "x", GetPosition().x);
|
||||
file.Set("VideoWindow", "y", GetPosition().y);
|
||||
file.Set("VideoWindow", "w", GetSize().GetWidth());
|
||||
file.Set("VideoWindow", "h", GetSize().GetHeight());
|
||||
}
|
||||
|
||||
file.Save(File::GetUserPath(F_DEBUGGERCONFIG_IDX));
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::LoadSettings()
|
||||
{
|
||||
IniFile file;
|
||||
file.Load(File::GetUserPath(F_DEBUGGERCONFIG_IDX));
|
||||
|
||||
int x = 100, y = 100, w = 100, h = 100;
|
||||
file.Get("VideoWindow", "x", &x, GetPosition().x);
|
||||
file.Get("VideoWindow", "y", &y, GetPosition().y);
|
||||
file.Get("VideoWindow", "w", &w, GetSize().GetWidth());
|
||||
file.Get("VideoWindow", "h", &h, GetSize().GetHeight());
|
||||
SetSize(x, y, w, h);
|
||||
}
|
||||
|
||||
struct PauseEventMap
|
||||
{
|
||||
PauseEvent event;
|
||||
const wxString ListStr;
|
||||
};
|
||||
|
||||
static PauseEventMap pauseEventMap[] = {
|
||||
{NEXT_FRAME, _("Frame")},
|
||||
{NEXT_FLUSH, _("Flush")},
|
||||
|
||||
{NEXT_PIXEL_SHADER_CHANGE, _("Pixel Shader")},
|
||||
{NEXT_VERTEX_SHADER_CHANGE, _("Vertex Shader")},
|
||||
{NEXT_TEXTURE_CHANGE, _("Texture")},
|
||||
{NEXT_NEW_TEXTURE, _("New Texture")},
|
||||
|
||||
{NEXT_XFB_CMD, _("XFB Cmd")},
|
||||
{NEXT_EFB_CMD, _("EFB Cmd")},
|
||||
|
||||
{NEXT_MATRIX_CMD, _("Matrix Cmd")},
|
||||
{NEXT_VERTEX_CMD, _("Vertex Cmd")},
|
||||
{NEXT_TEXTURE_CMD, _("Texture Cmd")},
|
||||
{NEXT_LIGHT_CMD, _("Light Cmd")},
|
||||
{NEXT_FOG_CMD, _("Fog Cmd")},
|
||||
|
||||
{NEXT_SET_TLUT, _("TLUT Cmd")},
|
||||
|
||||
{NEXT_ERROR, _("Error")}
|
||||
};
|
||||
static const int numPauseEventMap = sizeof(pauseEventMap)/sizeof(PauseEventMap);
|
||||
|
||||
void GFXDebuggerPanel::CreateGUIControls()
|
||||
{
|
||||
// Basic settings
|
||||
CenterOnParent();
|
||||
|
||||
// MainPanel
|
||||
m_MainPanel = new wxPanel(this, ID_MAINPANEL, wxDefaultPosition, wxDefaultSize);
|
||||
|
||||
m_pButtonPause = new wxButton(m_MainPanel, ID_PAUSE, _("Pause"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Pause"));
|
||||
m_pButtonPauseAtNext = new wxButton(m_MainPanel, ID_PAUSE_AT_NEXT, _("Pause At Next"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Pause At Next"));
|
||||
m_pButtonPauseAtNextFrame = new wxButton(m_MainPanel, ID_PAUSE_AT_NEXT_FRAME, _("Next Frame"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Next Frame"));
|
||||
m_pButtonCont = new wxButton(m_MainPanel, ID_CONT, _("Continue"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Continue"));
|
||||
|
||||
m_pPauseAtList = new wxChoice(m_MainPanel, ID_PAUSE_AT_LIST, wxDefaultPosition, wxSize(100,25), 0, NULL,0,wxDefaultValidator, _("PauseAtList"));
|
||||
for (int i=0; i<numPauseEventMap; i++)
|
||||
{
|
||||
m_pPauseAtList->Append(pauseEventMap[i].ListStr);
|
||||
}
|
||||
|
||||
m_pPauseAtList->SetSelection(0);
|
||||
|
||||
m_pButtonDump = new wxButton(m_MainPanel, ID_DUMP, _("Dump"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Dump"));
|
||||
m_pButtonUpdateScreen = new wxButton(m_MainPanel, ID_UPDATE_SCREEN, _("Update Screen"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Update Screen"));
|
||||
m_pButtonClearScreen = new wxButton(m_MainPanel, ID_CLEAR_SCREEN, _("Clear Screen"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Clear Screen"));
|
||||
m_pButtonClearTextureCache = new wxButton(m_MainPanel, ID_CLEAR_TEXTURE_CACHE, _("Clear Textures"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Clear Textures"));
|
||||
m_pButtonClearVertexShaderCache = new wxButton(m_MainPanel, ID_CLEAR_VERTEX_SHADER_CACHE, _("Clear V Shaders"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Clear V Shaders"));
|
||||
m_pButtonClearPixelShaderCache = new wxButton(m_MainPanel, ID_CLEAR_PIXEL_SHADER_CACHE, _("Clear P Shaders"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _("Clear P Shaders"));
|
||||
m_pCount = new wxTextCtrl(m_MainPanel, ID_COUNT, wxT("1"), wxDefaultPosition, wxSize(50,25), 0, wxDefaultValidator, _("Count"));
|
||||
|
||||
m_pDumpList = new wxChoice(m_MainPanel, ID_DUMP_LIST, wxDefaultPosition, wxSize(120,25), 0, NULL,0,wxDefaultValidator, _("DumpList"));
|
||||
m_pDumpList->Insert(_("Pixel Shader"),0);
|
||||
m_pDumpList->Append(_("Vertex Shader"));
|
||||
m_pDumpList->Append(_("Pixel Shader Constants"));
|
||||
m_pDumpList->Append(_("Vertex Shader Constants"));
|
||||
m_pDumpList->Append(_("Textures"));
|
||||
m_pDumpList->Append(_("Frame Buffer"));
|
||||
m_pDumpList->Append(_("Geometry data"));
|
||||
m_pDumpList->Append(_("Vertex Description"));
|
||||
m_pDumpList->Append(_("Vertex Matrices"));
|
||||
m_pDumpList->Append(_("Statistics"));
|
||||
m_pDumpList->SetSelection(0);
|
||||
|
||||
// Layout everything on m_MainPanel
|
||||
wxBoxSizer *sMain = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
sMain->Add(m_pButtonPause, 0, 0, 5);
|
||||
sMain->Add(m_pButtonPauseAtNext, 0, 0, 5);
|
||||
sMain->Add(m_pCount,0,0,5);
|
||||
sMain->Add(m_pPauseAtList, 0, 0, 5);
|
||||
sMain->Add(m_pButtonDump, 0, 0, 5);
|
||||
sMain->Add(m_pDumpList, 0, 0, 5);
|
||||
sMain->Add(m_pButtonUpdateScreen, 0, 0, 5);
|
||||
sMain->Add(m_pButtonClearScreen, 0, 0, 5);
|
||||
sMain->Add(m_pButtonClearTextureCache, 0, 0, 5);
|
||||
sMain->Add(m_pButtonClearVertexShaderCache, 0, 0, 5);
|
||||
sMain->Add(m_pButtonClearPixelShaderCache, 0, 0, 5);
|
||||
sMain->Add(m_pButtonPauseAtNextFrame, 0, 0, 5);
|
||||
sMain->Add(m_pButtonCont, 0, 0, 5);
|
||||
m_MainPanel->SetSizerAndFit(sMain);
|
||||
Fit();
|
||||
|
||||
OnContinue();
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnPause()
|
||||
{
|
||||
m_pButtonDump->Enable(true);
|
||||
m_pButtonUpdateScreen->Enable(true);
|
||||
m_pButtonClearScreen->Enable(true);
|
||||
m_pButtonClearTextureCache->Enable(true);
|
||||
m_pButtonClearVertexShaderCache->Enable(true);
|
||||
m_pButtonClearPixelShaderCache->Enable(true);
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnContinue()
|
||||
{
|
||||
m_pButtonDump->Enable(false);
|
||||
m_pButtonUpdateScreen->Enable(false);
|
||||
m_pButtonClearScreen->Enable(false);
|
||||
m_pButtonClearTextureCache->Enable(false);
|
||||
m_pButtonClearVertexShaderCache->Enable(false);
|
||||
m_pButtonClearPixelShaderCache->Enable(false);
|
||||
}
|
||||
|
||||
|
||||
// General settings
|
||||
void GFXDebuggerPanel::GeneralSettings(wxCommandEvent& event)
|
||||
{
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnPauseButton(wxCommandEvent& event)
|
||||
{
|
||||
GFXDebuggerPauseFlag = true;
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnPauseAtNextButton(wxCommandEvent& event)
|
||||
{
|
||||
GFXDebuggerPauseFlag = false;
|
||||
GFXDebuggerToPauseAtNext = pauseEventMap[m_pPauseAtList->GetSelection()].event;
|
||||
wxString val = m_pCount->GetValue();
|
||||
long value;
|
||||
if (val.ToLong(&value))
|
||||
GFXDebuggerEventToPauseCount = value;
|
||||
else
|
||||
GFXDebuggerEventToPauseCount = 1;
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnPauseAtNextFrameButton(wxCommandEvent& event)
|
||||
{
|
||||
GFXDebuggerPauseFlag = false;
|
||||
GFXDebuggerToPauseAtNext = NEXT_FRAME;
|
||||
GFXDebuggerEventToPauseCount = 1;
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnDumpButton(wxCommandEvent& event)
|
||||
{
|
||||
char dump_path[MAX_PATH];
|
||||
sprintf(dump_path, "%sDebug/%s/", File::GetUserPath(D_DUMP_IDX), SConfig::GetInstance().m_LocalCoreStartupParameter.m_strUniqueID.c_str());
|
||||
if (!File::CreateFullPath(dump_path))
|
||||
return;
|
||||
|
||||
switch (m_pDumpList->GetSelection())
|
||||
{
|
||||
case 0: // Pixel Shader
|
||||
DumpPixelShader(dump_path);
|
||||
break;
|
||||
|
||||
case 1: // Vertex Shader
|
||||
DumpVertexShader(dump_path);
|
||||
break;
|
||||
|
||||
case 2: // Pixel Shader Constants
|
||||
DumpPixelShaderConstants(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 3: // Vertex Shader Constants
|
||||
DumpVertexShaderConstants(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 4: // Textures
|
||||
DumpTextures(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 5: // Frame Buffer
|
||||
DumpFrameBuffer(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 6: // Geometry
|
||||
DumpGeometry(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 7: // Vertex Description
|
||||
DumpVertexDecl(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 8: // Vertex Matrices
|
||||
DumpMatrices(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
|
||||
case 9: // Statistics
|
||||
DumpStats(dump_path);
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnContButton(wxCommandEvent& event)
|
||||
{
|
||||
GFXDebuggerToPauseAtNext = NOT_PAUSE;
|
||||
GFXDebuggerPauseFlag = false;
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnClearScreenButton(wxCommandEvent& event)
|
||||
{
|
||||
// TODO
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnClearTextureCacheButton(wxCommandEvent& event)
|
||||
{
|
||||
TextureCache::Invalidate(false);
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnClearVertexShaderCacheButton(wxCommandEvent& event)
|
||||
{
|
||||
// TODO
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnClearPixelShaderCacheButton(wxCommandEvent& event)
|
||||
{
|
||||
// TODO
|
||||
wxMessageBox(_("Not implemented"), _("Error"), wxOK);
|
||||
}
|
||||
|
||||
void GFXDebuggerPanel::OnUpdateScreenButton(wxCommandEvent& event)
|
||||
{
|
||||
GFXDebuggerUpdateScreen();
|
||||
}
|
105
Source/Core/DolphinWX/Src/DebuggerPanel.h
Normal file
105
Source/Core/DolphinWX/Src/DebuggerPanel.h
Normal file
@ -0,0 +1,105 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef _GFX_DEBUGGER_PANEL_H_
|
||||
#define _GFX_DEBUGGER_PANEL_H_
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/notebook.h>
|
||||
#include "Debugger.h"
|
||||
|
||||
class GFXDebuggerPanel : public wxPanel, public GFXDebuggerBase
|
||||
{
|
||||
public:
|
||||
GFXDebuggerPanel(wxWindow *parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTAB_TRAVERSAL,
|
||||
const wxString &title = _("GFX Debugger"));
|
||||
|
||||
virtual ~GFXDebuggerPanel();
|
||||
|
||||
void SaveSettings() const;
|
||||
void LoadSettings();
|
||||
|
||||
bool bInfoLog;
|
||||
bool bPrimLog;
|
||||
bool bSaveTextures;
|
||||
bool bSaveTargets;
|
||||
bool bSaveShaders;
|
||||
|
||||
void OnPause();
|
||||
void OnContinue();
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
wxPanel *m_MainPanel;
|
||||
|
||||
wxButton *m_pButtonPause;
|
||||
wxButton *m_pButtonPauseAtNext;
|
||||
wxButton *m_pButtonPauseAtNextFrame;
|
||||
wxButton *m_pButtonCont;
|
||||
wxChoice *m_pPauseAtList;
|
||||
wxButton *m_pButtonDump;
|
||||
wxChoice *m_pDumpList;
|
||||
wxButton *m_pButtonUpdateScreen;
|
||||
wxButton *m_pButtonClearScreen;
|
||||
wxButton *m_pButtonClearTextureCache;
|
||||
wxButton *m_pButtonClearVertexShaderCache;
|
||||
wxButton *m_pButtonClearPixelShaderCache;
|
||||
wxTextCtrl *m_pCount;
|
||||
|
||||
|
||||
// TODO: Prefix with GFX_
|
||||
enum
|
||||
{
|
||||
ID_MAINPANEL = 3900,
|
||||
ID_CONT,
|
||||
ID_PAUSE,
|
||||
ID_PAUSE_AT_NEXT,
|
||||
ID_PAUSE_AT_NEXT_FRAME,
|
||||
ID_PAUSE_AT_LIST,
|
||||
ID_DUMP,
|
||||
ID_DUMP_LIST,
|
||||
ID_UPDATE_SCREEN,
|
||||
ID_CLEAR_SCREEN,
|
||||
ID_CLEAR_TEXTURE_CACHE,
|
||||
ID_CLEAR_VERTEX_SHADER_CACHE,
|
||||
ID_CLEAR_PIXEL_SHADER_CACHE,
|
||||
ID_COUNT
|
||||
};
|
||||
|
||||
void OnClose(wxCloseEvent& event);
|
||||
void CreateGUIControls();
|
||||
|
||||
void GeneralSettings(wxCommandEvent& event);
|
||||
void OnPauseButton(wxCommandEvent& event);
|
||||
void OnPauseAtNextButton(wxCommandEvent& event);
|
||||
void OnPauseAtNextFrameButton(wxCommandEvent& event);
|
||||
void OnDumpButton(wxCommandEvent& event);
|
||||
void OnContButton(wxCommandEvent& event);
|
||||
void OnUpdateScreenButton(wxCommandEvent& event);
|
||||
void OnClearScreenButton(wxCommandEvent& event);
|
||||
void OnClearTextureCacheButton(wxCommandEvent& event);
|
||||
void OnClearVertexShaderCacheButton(wxCommandEvent& event);
|
||||
void OnClearPixelShaderCacheButton(wxCommandEvent& event);
|
||||
void OnCountEnter(wxCommandEvent& event);
|
||||
};
|
||||
|
||||
#endif // _GFX_DEBUGGER_PANEL_H_
|
23
Source/Core/DolphinWX/Src/DebuggerUIUtil.cpp
Normal file
23
Source/Core/DolphinWX/Src/DebuggerUIUtil.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
|
||||
#include "DebuggerUIUtil.h"
|
||||
|
||||
// The default font
|
||||
wxFont DebuggerFont = wxFont(9, wxMODERN, wxNORMAL, wxNORMAL, false, wxT("monospace"));
|
||||
|
25
Source/Core/DolphinWX/Src/DebuggerUIUtil.h
Normal file
25
Source/Core/DolphinWX/Src/DebuggerUIUtil.h
Normal file
@ -0,0 +1,25 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef _DEBUGGER_UI_UTIL_H
|
||||
#define _DEBUGGER_UI_UTIL_H
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
extern wxFont DebuggerFont;
|
||||
|
||||
#endif
|
266
Source/Core/DolphinWX/Src/JitWindow.cpp
Normal file
266
Source/Core/DolphinWX/Src/JitWindow.cpp
Normal file
@ -0,0 +1,266 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <wx/button.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/thread.h>
|
||||
#include <wx/listctrl.h>
|
||||
|
||||
#include "JitWindow.h"
|
||||
#include "HW/CPU.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "PowerPC/JitCommon/JitBase.h"
|
||||
#include "PowerPC/JitCommon/JitCache.h"
|
||||
#include "PowerPC/PPCAnalyst.h"
|
||||
#include "PowerPCDisasm.h"
|
||||
#include "Host.h"
|
||||
#include "disasm.h"
|
||||
|
||||
#include "Debugger/PPCDebugInterface.h"
|
||||
#include "Debugger/Debugger_SymbolMap.h"
|
||||
|
||||
#include "Core.h"
|
||||
#include "StringUtil.h"
|
||||
#include "LogManager.h"
|
||||
|
||||
// ugly that this lib included code from the main
|
||||
#include "../../DolphinWX/Src/Globals.h"
|
||||
|
||||
// TODO: Fix this ugly hack
|
||||
namespace {
|
||||
CJitWindow *the_jit_window;
|
||||
}
|
||||
|
||||
enum
|
||||
{
|
||||
IDM_REFRESH_LIST = 23350,
|
||||
IDM_PPC_BOX,
|
||||
IDM_X86_BOX,
|
||||
IDM_NEXT,
|
||||
IDM_PREV,
|
||||
IDM_BLOCKLIST,
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(CJitWindow, wxPanel)
|
||||
//EVT_TEXT(IDM_ADDRBOX, CJitWindow::OnAddrBoxChange)
|
||||
//EVT_LISTBOX(IDM_SYMBOLLIST, CJitWindow::OnSymbolListChange)
|
||||
//EVT_HOST_COMMAND(wxID_ANY, CJitWindow::OnHostMessage)
|
||||
EVT_BUTTON(IDM_REFRESH_LIST, CJitWindow::OnRefresh)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
CJitWindow::CJitWindow(wxWindow* parent, wxWindowID id, const wxPoint& pos,
|
||||
const wxSize& size, long style, const wxString& name)
|
||||
: wxPanel(parent, id, pos, size, style, name)
|
||||
{
|
||||
the_jit_window = this;
|
||||
wxBoxSizer* sizerBig = new wxBoxSizer(wxVERTICAL);
|
||||
wxBoxSizer* sizerSplit = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizerSplit->Add(ppc_box = new wxTextCtrl(this, IDM_PPC_BOX, _T("(ppc)"),
|
||||
wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE), 1, wxEXPAND);
|
||||
sizerSplit->Add(x86_box = new wxTextCtrl(this, IDM_X86_BOX, _T("(x86)"),
|
||||
wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE), 1, wxEXPAND);
|
||||
sizerBig->Add(block_list = new JitBlockList(this, IDM_BLOCKLIST,
|
||||
wxDefaultPosition, wxSize(100, 140),
|
||||
wxLC_REPORT | wxSUNKEN_BORDER | wxLC_ALIGN_LEFT | wxLC_SINGLE_SEL | wxLC_SORT_ASCENDING),
|
||||
0, wxEXPAND);
|
||||
sizerBig->Add(sizerSplit, 2, wxEXPAND);
|
||||
// sizerBig->Add(memview, 5, wxEXPAND);
|
||||
// sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3);
|
||||
sizerBig->Add(button_refresh = new wxButton(this, IDM_REFRESH_LIST, _("&Refresh")));
|
||||
// sizerRight->Add(addrbox = new wxTextCtrl(this, IDM_ADDRBOX, _T("")));
|
||||
// sizerRight->Add(new wxButton(this, IDM_SETPC, _("S&et PC")));
|
||||
|
||||
SetSizer(sizerBig);
|
||||
|
||||
sizerSplit->SetSizeHints(this);
|
||||
sizerSplit->Fit(this);
|
||||
sizerBig->SetSizeHints(this);
|
||||
sizerBig->Fit(this);
|
||||
}
|
||||
|
||||
void CJitWindow::OnRefresh(wxCommandEvent& /*event*/) {
|
||||
block_list->Update();
|
||||
}
|
||||
|
||||
void CJitWindow::ViewAddr(u32 em_address)
|
||||
{
|
||||
if (the_jit_window)
|
||||
{
|
||||
the_jit_window->Show(true);
|
||||
the_jit_window->Compare(em_address);
|
||||
the_jit_window->SetFocus();
|
||||
}
|
||||
else
|
||||
{
|
||||
PanicAlert("Jit window not available");
|
||||
}
|
||||
}
|
||||
|
||||
void CJitWindow::Compare(u32 em_address)
|
||||
{
|
||||
u8 *xDis = new u8[1<<18];
|
||||
memset(xDis, 0, 1<<18);
|
||||
|
||||
disassembler x64disasm;
|
||||
x64disasm.set_syntax_intel();
|
||||
|
||||
int block_num = jit->GetBlockCache()->GetBlockNumberFromStartAddress(em_address);
|
||||
if (block_num < 0)
|
||||
{
|
||||
for (int i = 0; i < 500; i++) {
|
||||
block_num = jit->GetBlockCache()->GetBlockNumberFromStartAddress(em_address - 4 * i);
|
||||
if (block_num >= 0)
|
||||
break;
|
||||
}
|
||||
if (block_num >= 0) {
|
||||
JitBlock *block = jit->GetBlockCache()->GetBlock(block_num);
|
||||
if (!(block->originalAddress <= em_address &&
|
||||
block->originalSize + block->originalAddress >= em_address))
|
||||
block_num = -1;
|
||||
}
|
||||
// Do not merge this "if" with the above - block_num changes inside it.
|
||||
if (block_num < 0) {
|
||||
ppc_box->SetValue(wxString::FromAscii(StringFromFormat("(non-code address: %08x)",
|
||||
em_address).c_str()));
|
||||
x86_box->SetValue(wxString::FromAscii(StringFromFormat("(no translation)").c_str()));
|
||||
delete[] xDis;
|
||||
return;
|
||||
}
|
||||
}
|
||||
JitBlock *block = jit->GetBlockCache()->GetBlock(block_num);
|
||||
|
||||
// 800031f0
|
||||
// == Fill in x86 box
|
||||
|
||||
const u8 *code = (const u8 *)jit->GetBlockCache()->GetCompiledCodeFromBlock(block_num);
|
||||
u64 disasmPtr = (u64)code;
|
||||
int size = block->codeSize;
|
||||
const u8 *end = code + size;
|
||||
char *sptr = (char*)xDis;
|
||||
|
||||
int num_x86_instructions = 0;
|
||||
while ((u8*)disasmPtr < end)
|
||||
{
|
||||
#ifdef _M_X64
|
||||
disasmPtr += x64disasm.disasm64(disasmPtr, disasmPtr, (u8*)disasmPtr, sptr);
|
||||
#else
|
||||
disasmPtr += x64disasm.disasm32(disasmPtr, disasmPtr, (u8*)disasmPtr, sptr);
|
||||
#endif
|
||||
sptr += strlen(sptr);
|
||||
*sptr++ = 13;
|
||||
*sptr++ = 10;
|
||||
num_x86_instructions++;
|
||||
}
|
||||
x86_box->SetValue(wxString::FromAscii((char*)xDis));
|
||||
|
||||
// == Fill in ppc box
|
||||
u32 ppc_addr = block->originalAddress;
|
||||
PPCAnalyst::CodeBuffer code_buffer(32000);
|
||||
PPCAnalyst::BlockStats st;
|
||||
PPCAnalyst::BlockRegStats gpa;
|
||||
PPCAnalyst::BlockRegStats fpa;
|
||||
bool broken_block = false;
|
||||
u32 merged_addresses[32];
|
||||
const int capacity_of_merged_addresses = sizeof(merged_addresses) / sizeof(merged_addresses[0]);
|
||||
int size_of_merged_addresses;
|
||||
if (PPCAnalyst::Flatten(ppc_addr, &size, &st, &gpa, &fpa, broken_block, &code_buffer, size, merged_addresses, capacity_of_merged_addresses, size_of_merged_addresses) != 0xffffffff)
|
||||
{
|
||||
sptr = (char*)xDis;
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
const PPCAnalyst::CodeOp &op = code_buffer.codebuffer[i];
|
||||
char temp[256];
|
||||
DisassembleGekko(op.inst.hex, op.address, temp, 256);
|
||||
sptr += sprintf(sptr, "%08x %s\n", op.address, temp);
|
||||
}
|
||||
|
||||
// Add stats to the end of the ppc box since it's generally the shortest.
|
||||
sptr += sprintf(sptr, "\n");
|
||||
|
||||
// Add some generic analysis
|
||||
if (st.isFirstBlockOfFunction)
|
||||
sptr += sprintf(sptr, "(first block of function)\n");
|
||||
if (st.isLastBlockOfFunction)
|
||||
sptr += sprintf(sptr, "(first block of function)\n");
|
||||
|
||||
sptr += sprintf(sptr, "%i estimated cycles\n", st.numCycles);
|
||||
|
||||
sptr += sprintf(sptr, "Num instr: PPC: %i x86: %i (blowup: %i%%)\n",
|
||||
size, num_x86_instructions, 100 * (num_x86_instructions / size - 1));
|
||||
sptr += sprintf(sptr, "Num bytes: PPC: %i x86: %i (blowup: %i%%)\n",
|
||||
size * 4, block->codeSize, 100 * (block->codeSize / (4 * size) - 1));
|
||||
|
||||
ppc_box->SetValue(wxString::FromAscii((char*)xDis));
|
||||
} else {
|
||||
ppc_box->SetValue(wxString::FromAscii(StringFromFormat(
|
||||
"(non-code address: %08x)", em_address).c_str()));
|
||||
x86_box->SetValue(wxString::FromAscii("---"));
|
||||
}
|
||||
|
||||
delete[] xDis;
|
||||
}
|
||||
|
||||
void CJitWindow::Update()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CJitWindow::OnHostMessage(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_NOTIFYMAPLOADED:
|
||||
//NotifyMapLoaded();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// JitBlockList
|
||||
//================
|
||||
|
||||
enum {
|
||||
COLUMN_ADDRESS,
|
||||
COLUMN_PPCSIZE,
|
||||
COLUMN_X86SIZE,
|
||||
COLUMN_NAME,
|
||||
COLUMN_FLAGS,
|
||||
COLUMN_NUMEXEC,
|
||||
COLUMN_COST, // (estimated as x86size * numexec)
|
||||
};
|
||||
|
||||
JitBlockList::JitBlockList(wxWindow* parent, const wxWindowID id,
|
||||
const wxPoint& pos, const wxSize& size, long style)
|
||||
: wxListCtrl(parent, id, pos, size, style) // | wxLC_VIRTUAL)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
void JitBlockList::Init()
|
||||
{
|
||||
InsertColumn(COLUMN_ADDRESS, _("Address"));
|
||||
InsertColumn(COLUMN_PPCSIZE, _("PPC Size"));
|
||||
InsertColumn(COLUMN_X86SIZE, _("x86 Size"));
|
||||
InsertColumn(COLUMN_NAME, _("Symbol"));
|
||||
InsertColumn(COLUMN_FLAGS, _("Flags"));
|
||||
InsertColumn(COLUMN_NUMEXEC, _("NumExec"));
|
||||
InsertColumn(COLUMN_COST, _("Cost"));
|
||||
}
|
||||
|
||||
void JitBlockList::Update()
|
||||
{
|
||||
}
|
72
Source/Core/DolphinWX/Src/JitWindow.h
Normal file
72
Source/Core/DolphinWX/Src/JitWindow.h
Normal file
@ -0,0 +1,72 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef JITWINDOW_H_
|
||||
#define JITWINDOW_H_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/listbox.h>
|
||||
|
||||
#include "MemoryView.h"
|
||||
#include "Thread.h"
|
||||
#include "CoreParameter.h"
|
||||
|
||||
class JitBlockList : public wxListCtrl
|
||||
{
|
||||
std::vector<int> block_ranking;
|
||||
public:
|
||||
JitBlockList(wxWindow* parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style);
|
||||
void Init();
|
||||
void Update();
|
||||
};
|
||||
|
||||
class CJitWindow : public wxPanel
|
||||
{
|
||||
public:
|
||||
CJitWindow(wxWindow* parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTAB_TRAVERSAL | wxBORDER_NONE,
|
||||
const wxString& name = _("JIT block viewer"));
|
||||
|
||||
static void ViewAddr(u32 em_address);
|
||||
void Update();
|
||||
|
||||
private:
|
||||
void OnRefresh(wxCommandEvent& /*event*/);
|
||||
void Compare(u32 em_address);
|
||||
|
||||
JitBlockList* block_list;
|
||||
wxButton* button_refresh;
|
||||
wxTextCtrl* ppc_box;
|
||||
wxTextCtrl* x86_box;
|
||||
wxListBox* top_instructions;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
void OnSymbolListChange(wxCommandEvent& event);
|
||||
void OnCallstackListChange(wxCommandEvent& event);
|
||||
void OnAddrBoxChange(wxCommandEvent& event);
|
||||
void OnHostMessage(wxCommandEvent& event);
|
||||
};
|
||||
|
||||
#endif /*MEMORYWINDOW_*/
|
102
Source/Core/DolphinWX/Src/MemoryCheckDlg.cpp
Normal file
102
Source/Core/DolphinWX/Src/MemoryCheckDlg.cpp
Normal file
@ -0,0 +1,102 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "MemoryCheckDlg.h"
|
||||
#include "Common.h"
|
||||
#include "StringUtil.h"
|
||||
#include "Host.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
|
||||
BEGIN_EVENT_TABLE(MemoryCheckDlg,wxDialog)
|
||||
EVT_CLOSE(MemoryCheckDlg::OnClose)
|
||||
EVT_BUTTON(ID_OK, MemoryCheckDlg::OnOK)
|
||||
EVT_BUTTON(ID_CANCEL, MemoryCheckDlg::OnCancel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
MemoryCheckDlg::MemoryCheckDlg(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style)
|
||||
: wxDialog(parent, id, title, position, size, style)
|
||||
{
|
||||
CreateGUIControls();
|
||||
}
|
||||
|
||||
MemoryCheckDlg::~MemoryCheckDlg()
|
||||
{
|
||||
}
|
||||
|
||||
void MemoryCheckDlg::CreateGUIControls()
|
||||
{
|
||||
SetIcon(wxNullIcon);
|
||||
SetSize(8,8,415,122);
|
||||
Center();
|
||||
|
||||
m_pButtonCancel = new wxButton(this, ID_CANCEL, _("Cancel"), wxPoint(248,64), wxSize(73,25), 0, wxDefaultValidator, _("Cancel"));
|
||||
|
||||
m_pButtonOK = new wxButton(this, ID_OK, wxT("OK"), wxPoint(328,64), wxSize(73,25), 0, wxDefaultValidator, wxT("OK"));
|
||||
|
||||
m_pReadFlag = new wxCheckBox(this, ID_READ_FLAG, _("Read"), wxPoint(336,33), wxSize(57,15), 0, wxDefaultValidator, _("Read"));
|
||||
|
||||
m_pWriteFlag = new wxCheckBox(this, ID_WRITE_FLAG, _("Write"), wxPoint(336,16), wxSize(57,17), 0, wxDefaultValidator, wxT("WxCheckBox1"));
|
||||
|
||||
new wxStaticBox(this, ID_WXSTATICBOX2, _("Break On"), wxPoint(328,0), wxSize(73,57));
|
||||
|
||||
new wxStaticText(this, ID_WXSTATICTEXT2, _("End"), wxPoint(168,24), wxDefaultSize, 0, wxT("WxStaticText2"));
|
||||
|
||||
new wxStaticText(this, ID_WXSTATICTEXT1, _("Start"), wxPoint(8,24), wxDefaultSize, 0, wxT("WxStaticText1"));
|
||||
|
||||
m_pEditStartAddress = new wxTextCtrl(this, ID_EDIT_START_ADDR, wxT("80000000"), wxPoint(40,24), wxSize(109,20), 0, wxDefaultValidator, wxT("WxEdit1"));
|
||||
|
||||
m_pEditEndAddress = new wxTextCtrl(this, ID_EDIT_END_ADDRESS, wxT("80000000"), wxPoint(200,24), wxSize(109,20), 0, wxDefaultValidator, wxT("WxEdit2"));
|
||||
|
||||
new wxStaticBox(this, ID_WXSTATICBOX1, _("Address Range"), wxPoint(0,0), wxSize(321,57));
|
||||
}
|
||||
|
||||
void MemoryCheckDlg::OnClose(wxCloseEvent& /*event*/)
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void MemoryCheckDlg::OnOK(wxCommandEvent& /*event*/)
|
||||
{
|
||||
wxString StartAddressString = m_pEditStartAddress->GetLineText(0);
|
||||
wxString EndAddressString = m_pEditEndAddress->GetLineText(0);
|
||||
bool OnRead = m_pReadFlag->GetValue();
|
||||
bool OnWrite = m_pWriteFlag->GetValue();
|
||||
|
||||
u32 StartAddress, EndAddress;
|
||||
if (AsciiToHex(StartAddressString.mb_str(), StartAddress) &&
|
||||
AsciiToHex(EndAddressString.mb_str(), EndAddress))
|
||||
{
|
||||
TMemCheck MemCheck;
|
||||
MemCheck.StartAddress = StartAddress;
|
||||
MemCheck.EndAddress = EndAddress;
|
||||
MemCheck.OnRead = OnRead;
|
||||
MemCheck.OnWrite = OnWrite;
|
||||
|
||||
MemCheck.Log = true;
|
||||
MemCheck.Break = true;
|
||||
|
||||
PowerPC::memchecks.Add(MemCheck);
|
||||
Host_UpdateBreakPointView();
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
void MemoryCheckDlg::OnCancel(wxCommandEvent& /*event*/)
|
||||
{
|
||||
Close();
|
||||
}
|
73
Source/Core/DolphinWX/Src/MemoryCheckDlg.h
Normal file
73
Source/Core/DolphinWX/Src/MemoryCheckDlg.h
Normal file
@ -0,0 +1,73 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __MEMORYCHECKDLG_h__
|
||||
#define __MEMORYCHECKDLG_h__
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/statbox.h>
|
||||
|
||||
#undef MemoryCheckDlg_STYLE
|
||||
#define MemoryCheckDlg_STYLE wxCAPTION | wxSYSTEM_MENU | wxSTAY_ON_TOP | wxDIALOG_NO_PARENT | wxCLOSE_BOX
|
||||
|
||||
class MemoryCheckDlg : public wxDialog
|
||||
{
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
public:
|
||||
MemoryCheckDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = _("Memory Check"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = MemoryCheckDlg_STYLE);
|
||||
virtual ~MemoryCheckDlg();
|
||||
|
||||
private:
|
||||
|
||||
wxButton* m_pButtonCancel;
|
||||
wxButton* m_pButtonOK;
|
||||
wxCheckBox* m_pReadFlag;
|
||||
wxCheckBox* m_pWriteFlag;
|
||||
wxTextCtrl* m_pEditEndAddress;
|
||||
wxTextCtrl* m_pEditStartAddress;
|
||||
|
||||
private:
|
||||
|
||||
enum
|
||||
{
|
||||
ID_CANCEL = 1016,
|
||||
ID_OK = 1015,
|
||||
ID_READ_FLAG = 1014,
|
||||
ID_WRITE_FLAG = 1013,
|
||||
ID_WXSTATICBOX2 = 1012,
|
||||
ID_EDIT_END_ADDRESS = 1011,
|
||||
ID_WXSTATICTEXT2 = 1010,
|
||||
ID_WXSTATICTEXT1 = 1009,
|
||||
ID_EDIT_START_ADDR = 1008,
|
||||
ID_WXSTATICBOX1 = 1007,
|
||||
};
|
||||
|
||||
private:
|
||||
void OnClose(wxCloseEvent& event);
|
||||
void OnOK(wxCommandEvent& event);
|
||||
void OnCancel(wxCommandEvent& event);
|
||||
void CreateGUIControls();
|
||||
};
|
||||
|
||||
#endif
|
439
Source/Core/DolphinWX/Src/MemoryView.cpp
Normal file
439
Source/Core/DolphinWX/Src/MemoryView.cpp
Normal file
@ -0,0 +1,439 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "DebuggerUIUtil.h"
|
||||
#include "Common.h"
|
||||
#include "Host.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "HW/Memmap.h"
|
||||
|
||||
#include "MemoryView.h"
|
||||
#include <wx/event.h>
|
||||
#include <wx/clipbrd.h>
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
IDM_GOTOINMEMVIEW = 12000,
|
||||
IDM_COPYADDRESS,
|
||||
IDM_COPYHEX,
|
||||
IDM_COPYCODE,
|
||||
IDM_RUNTOHERE,
|
||||
IDM_DYNARECRESULTS,
|
||||
IDM_TOGGLEMEMORY,
|
||||
IDM_VIEWASFP,
|
||||
IDM_VIEWASASCII,
|
||||
IDM_VIEWASHEX,
|
||||
};
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(CMemoryView, wxControl)
|
||||
EVT_ERASE_BACKGROUND(CMemoryView::OnErase)
|
||||
EVT_PAINT(CMemoryView::OnPaint)
|
||||
EVT_LEFT_DOWN(CMemoryView::OnMouseDownL)
|
||||
EVT_LEFT_UP(CMemoryView::OnMouseUpL)
|
||||
EVT_MOTION(CMemoryView::OnMouseMove)
|
||||
EVT_RIGHT_DOWN(CMemoryView::OnMouseDownR)
|
||||
EVT_MENU(-1, CMemoryView::OnPopupMenu)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
CMemoryView::CMemoryView(DebugInterface* debuginterface, wxWindow* parent, wxWindowID Id, const wxSize& Size)
|
||||
: wxControl(parent, Id, wxDefaultPosition, Size),
|
||||
debugger(debuginterface),
|
||||
rowHeight(13),
|
||||
selection(0),
|
||||
oldSelection(0),
|
||||
selectionChanged(false),
|
||||
selecting(false),
|
||||
hasFocus(false),
|
||||
showHex(false),
|
||||
memory(0),
|
||||
viewAsType(VIEWAS_FP)
|
||||
{
|
||||
rowHeight = 13;
|
||||
align = debuginterface->getInstructionSize(0);
|
||||
curAddress = debuginterface->getPC();
|
||||
}
|
||||
|
||||
|
||||
wxSize CMemoryView::DoGetBestSize() const
|
||||
{
|
||||
wxSize bestSize;
|
||||
bestSize.x = 300;
|
||||
bestSize.y = 300;
|
||||
return(bestSize);
|
||||
}
|
||||
|
||||
|
||||
int CMemoryView::YToAddress(int y)
|
||||
{
|
||||
wxRect rc = GetClientRect();
|
||||
int ydiff = y - rc.height / 2 - rowHeight / 2;
|
||||
ydiff = (int)(floorf((float)ydiff / (float)rowHeight)) + 1;
|
||||
return(curAddress + ydiff * align);
|
||||
}
|
||||
|
||||
|
||||
void CMemoryView::OnMouseDownL(wxMouseEvent& event)
|
||||
{
|
||||
int x = event.m_x;
|
||||
int y = event.m_y;
|
||||
|
||||
if (x > 16)
|
||||
{
|
||||
oldSelection = selection;
|
||||
selection = YToAddress(y);
|
||||
// SetCapture(wnd);
|
||||
bool oldselecting = selecting;
|
||||
selecting = true;
|
||||
|
||||
if (!oldselecting || (selection != oldSelection))
|
||||
{
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debugger->toggleMemCheck(YToAddress(y));
|
||||
|
||||
redraw();
|
||||
Host_UpdateBreakPointView();
|
||||
}
|
||||
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CMemoryView::OnMouseMove(wxMouseEvent& event)
|
||||
{
|
||||
wxRect rc = GetClientRect();
|
||||
|
||||
if (event.m_leftDown)
|
||||
{
|
||||
if (event.m_x > 16)
|
||||
{
|
||||
if (event.m_y < 0)
|
||||
{
|
||||
curAddress -= align;
|
||||
redraw();
|
||||
}
|
||||
else if (event.m_y > rc.height)
|
||||
{
|
||||
curAddress += align;
|
||||
redraw();
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMouseDownL(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CMemoryView::OnMouseUpL(wxMouseEvent& event)
|
||||
{
|
||||
if (event.m_x > 16)
|
||||
{
|
||||
curAddress = YToAddress(event.m_y);
|
||||
selecting = false;
|
||||
//ReleaseCapture();
|
||||
redraw();
|
||||
}
|
||||
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CMemoryView::OnPopupMenu(wxCommandEvent& event)
|
||||
{
|
||||
#if wxUSE_CLIPBOARD
|
||||
wxTheClipboard->Open();
|
||||
#endif
|
||||
|
||||
switch (event.GetId())
|
||||
{
|
||||
#if wxUSE_CLIPBOARD
|
||||
case IDM_COPYADDRESS:
|
||||
{
|
||||
wxTheClipboard->SetData(new wxTextDataObject(wxString::Format(_T("%08x"), selection)));
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_COPYHEX:
|
||||
{
|
||||
char temp[24];
|
||||
sprintf(temp, "%08x", debugger->readExtraMemory(memory, selection));
|
||||
wxTheClipboard->SetData(new wxTextDataObject(wxString::FromAscii(temp)));
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case IDM_TOGGLEMEMORY:
|
||||
memory ^= 1;
|
||||
redraw();
|
||||
break;
|
||||
|
||||
case IDM_VIEWASFP:
|
||||
viewAsType = VIEWAS_FP;
|
||||
redraw();
|
||||
break;
|
||||
|
||||
case IDM_VIEWASASCII:
|
||||
viewAsType = VIEWAS_ASCII;
|
||||
redraw();
|
||||
break;
|
||||
case IDM_VIEWASHEX:
|
||||
viewAsType = VIEWAS_HEX;
|
||||
redraw();
|
||||
break;
|
||||
}
|
||||
|
||||
#if wxUSE_CLIPBOARD
|
||||
wxTheClipboard->Close();
|
||||
#endif
|
||||
event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CMemoryView::OnMouseDownR(wxMouseEvent& event)
|
||||
{
|
||||
// popup menu
|
||||
wxMenu* menu = new wxMenu;
|
||||
//menu.Append(IDM_GOTOINMEMVIEW, "&Goto in mem view");
|
||||
#if wxUSE_CLIPBOARD
|
||||
menu->Append(IDM_COPYADDRESS, wxString::FromAscii("Copy &address"));
|
||||
menu->Append(IDM_COPYHEX, wxString::FromAscii("Copy &hex"));
|
||||
#endif
|
||||
menu->Append(IDM_TOGGLEMEMORY, wxString::FromAscii("Toggle &memory"));
|
||||
|
||||
|
||||
|
||||
wxMenu* viewAsSubMenu = new wxMenu;
|
||||
viewAsSubMenu->Append(IDM_VIEWASFP, wxString::FromAscii("FP value"));
|
||||
viewAsSubMenu->Append(IDM_VIEWASASCII, wxString::FromAscii("ASCII"));
|
||||
viewAsSubMenu->Append(IDM_VIEWASHEX, wxString::FromAscii("Hex"));
|
||||
menu->AppendSubMenu(viewAsSubMenu, wxString::FromAscii("View As:"));
|
||||
|
||||
|
||||
PopupMenu(menu);
|
||||
|
||||
//event.Skip(true);
|
||||
}
|
||||
|
||||
|
||||
void CMemoryView::OnErase(wxEraseEvent& event)
|
||||
{}
|
||||
|
||||
|
||||
void CMemoryView::OnPaint(wxPaintEvent& event)
|
||||
{
|
||||
wxPaintDC dc(this);
|
||||
wxRect rc = GetClientRect();
|
||||
wxFont hFont(_T("Courier"));
|
||||
|
||||
if (viewAsType==VIEWAS_HEX)
|
||||
{
|
||||
hFont.SetFamily(wxFONTFAMILY_TELETYPE);
|
||||
dc.SetFont(hFont);
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.SetFont(DebuggerFont);
|
||||
}
|
||||
//wxFont tempFont(Lucida Console);
|
||||
int fontSize = viewAsType == VIEWAS_HEX ? hFont.GetPointSize() : DebuggerFont.GetPointSize();
|
||||
int textPlacement = 77;
|
||||
struct branch
|
||||
{
|
||||
int src, dst, srcAddr;
|
||||
};
|
||||
|
||||
// TODO: Add any drawing code here...
|
||||
int width = rc.width;
|
||||
int numRows = (rc.height / rowHeight) / 2 + 2;
|
||||
//numRows=(numRows&(~1)) + 1;
|
||||
dc.SetBackgroundMode(wxTRANSPARENT);
|
||||
const wxChar* bgColor = _T("#ffffff");
|
||||
wxPen nullPen(bgColor);
|
||||
wxPen currentPen(_T("#000000"));
|
||||
wxPen selPen(_T("#808080")); // gray
|
||||
nullPen.SetStyle(wxTRANSPARENT);
|
||||
|
||||
wxBrush currentBrush(_T("#FFEfE8")); // light gray
|
||||
wxBrush pcBrush(_T("#70FF70")); // green
|
||||
wxBrush mcBrush(_T("#1133FF")); // blue
|
||||
wxBrush bgBrush(bgColor);
|
||||
wxBrush nullBrush(bgColor);
|
||||
nullBrush.SetStyle(wxTRANSPARENT);
|
||||
|
||||
dc.SetPen(nullPen);
|
||||
dc.SetBrush(bgBrush);
|
||||
dc.DrawRectangle(0, 0, 16, rc.height);
|
||||
dc.DrawRectangle(0, 0, rc.width, 5+8);
|
||||
|
||||
// TODO - clean up this freaking mess!!!!!
|
||||
for (int row = -numRows; row <= numRows; row++)
|
||||
{
|
||||
unsigned int address = curAddress + row * align;
|
||||
|
||||
int rowY1 = rc.height / 2 + rowHeight * row - rowHeight / 2;
|
||||
int rowY2 = rc.height / 2 + rowHeight * row + rowHeight / 2;
|
||||
|
||||
wxString temp = wxString::Format(_T("%08x"), address);
|
||||
u32 col = debugger->getColor(address);
|
||||
wxBrush rowBrush(wxColor(col >> 16, col >> 8, col));
|
||||
dc.SetBrush(nullBrush);
|
||||
dc.SetPen(nullPen);
|
||||
dc.DrawRectangle(0, rowY1, 16, rowY2);
|
||||
|
||||
if (selecting && (address == selection))
|
||||
{
|
||||
dc.SetPen(selPen);
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.SetPen(row == 0 ? currentPen : nullPen);
|
||||
}
|
||||
|
||||
if (address == debugger->getPC())
|
||||
{
|
||||
dc.SetBrush(pcBrush);
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.SetBrush(rowBrush);
|
||||
}
|
||||
|
||||
dc.DrawRectangle(16, rowY1, width, rowY2 - 1);
|
||||
dc.SetBrush(currentBrush);
|
||||
dc.SetTextForeground(_T("#600000"));
|
||||
dc.DrawText(temp, 17, rowY1);
|
||||
|
||||
if (viewAsType != VIEWAS_HEX)
|
||||
{
|
||||
char mem[256];
|
||||
debugger->getRawMemoryString(memory, address, mem, 256);
|
||||
dc.SetTextForeground(_T("#000080"));
|
||||
dc.DrawText(wxString::FromAscii(mem), 17+fontSize*(8), rowY1);
|
||||
dc.SetTextForeground(_T("#000000"));
|
||||
}
|
||||
|
||||
if (debugger->isAlive())
|
||||
{
|
||||
char dis[256] = {0};
|
||||
u32 mem_data = debugger->readExtraMemory(memory, address);
|
||||
|
||||
if (viewAsType == VIEWAS_FP)
|
||||
{
|
||||
float flt = *(float *)(&mem_data);
|
||||
sprintf(dis, "f: %f", flt);
|
||||
}
|
||||
else if (viewAsType == VIEWAS_ASCII)
|
||||
{
|
||||
char a[4] = {(mem_data&0xff000000)>>24,
|
||||
(mem_data&0xff0000)>>16,
|
||||
(mem_data&0xff00)>>8,
|
||||
mem_data&0xff};
|
||||
for (size_t i = 0; i < 4; i++)
|
||||
if (a[i] == '\0')
|
||||
a[i] = ' ';
|
||||
sprintf(dis, "%c%c%c%c", a[0], a[1], a[2], a[3]);
|
||||
}
|
||||
else if (viewAsType == VIEWAS_HEX)
|
||||
{
|
||||
dis[0] = 0;
|
||||
dis[1] = 0;
|
||||
u32 mema[8] = {
|
||||
debugger->readExtraMemory(memory, address),
|
||||
debugger->readExtraMemory(memory, address+4),
|
||||
debugger->readExtraMemory(memory, address+8),
|
||||
debugger->readExtraMemory(memory, address+12),
|
||||
debugger->readExtraMemory(memory, address+16),
|
||||
debugger->readExtraMemory(memory, address+20),
|
||||
debugger->readExtraMemory(memory, address+24),
|
||||
debugger->readExtraMemory(memory, address+28)
|
||||
};
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
char buf[32] = "";
|
||||
switch (dataType)
|
||||
{
|
||||
case 0:
|
||||
sprintf(buf, " %02X %02X %02X %02X",
|
||||
((mema[i]&0xff000000)>>24)&0xFF,
|
||||
((mema[i]&0xff0000)>>16)&0xFF,
|
||||
((mema[i]&0xff00)>>8)&0xFF,
|
||||
mema[i]&0xff);
|
||||
break;
|
||||
case 1:
|
||||
sprintf(buf, " %02X%02X %02X%02X",
|
||||
((mema[i]&0xff000000)>>24)&0xFF,
|
||||
((mema[i]&0xff0000)>>16)&0xFF,
|
||||
((mema[i]&0xff00)>>8)&0xFF,
|
||||
mema[i]&0xff);
|
||||
break;
|
||||
case 2:
|
||||
sprintf(buf, " %02X%02X%02X%02X",
|
||||
((mema[i]&0xff000000)>>24)&0xFF,
|
||||
((mema[i]&0xff0000)>>16)&0xFF,
|
||||
((mema[i]&0xff00)>>8)&0xFF,
|
||||
mema[i]&0xff);
|
||||
break;
|
||||
}
|
||||
strcat(dis, buf);
|
||||
}
|
||||
curAddress += 32;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(dis, "INVALID VIEWAS TYPE");
|
||||
}
|
||||
|
||||
char desc[256] = "";
|
||||
if (viewAsType != VIEWAS_HEX)
|
||||
{
|
||||
dc.DrawText(wxString::FromAscii(dis), textPlacement + fontSize*(8 + 8), rowY1);
|
||||
} else {
|
||||
dc.DrawText(wxString::FromAscii(dis), textPlacement + 8+16, rowY1);
|
||||
}
|
||||
if (desc[0] == 0)
|
||||
{
|
||||
strcpy(desc, debugger->getDescription(address).c_str());
|
||||
}
|
||||
|
||||
dc.SetTextForeground(_T("#0000FF"));
|
||||
|
||||
if (strlen(desc))
|
||||
{
|
||||
dc.DrawText(wxString::FromAscii(desc), 17+fontSize*((8+8+8+30)*2), rowY1);
|
||||
}
|
||||
|
||||
// Show blue memory check dot
|
||||
if (debugger->isMemCheck(address))
|
||||
{
|
||||
dc.SetBrush(mcBrush);
|
||||
dc.DrawRectangle(8, rowY1 + 1, 11, 11);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dc.SetPen(currentPen);
|
||||
}
|
80
Source/Core/DolphinWX/Src/MemoryView.h
Normal file
80
Source/Core/DolphinWX/Src/MemoryView.h
Normal file
@ -0,0 +1,80 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef MEMORYVIEW_H_
|
||||
#define MEMORYVIEW_H_
|
||||
|
||||
#include "DebuggerUIUtil.h"
|
||||
#include "Common.h"
|
||||
#include "DebugInterface.h"
|
||||
|
||||
class CMemoryView : public wxControl
|
||||
{
|
||||
public:
|
||||
CMemoryView(DebugInterface* debuginterface, wxWindow* parent, wxWindowID Id = -1, const wxSize& Size = wxDefaultSize);
|
||||
wxSize DoGetBestSize() const;
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
void OnErase(wxEraseEvent& event);
|
||||
void OnMouseDownL(wxMouseEvent& event);
|
||||
void OnMouseMove(wxMouseEvent& event);
|
||||
void OnMouseUpL(wxMouseEvent& event);
|
||||
void OnMouseDownR(wxMouseEvent& event);
|
||||
void OnPopupMenu(wxCommandEvent& event);
|
||||
|
||||
u32 GetSelection() { return selection ; }
|
||||
int GetMemoryType() { return memory; }
|
||||
|
||||
void Center(u32 addr)
|
||||
{
|
||||
curAddress = addr;
|
||||
redraw();
|
||||
}
|
||||
int dataType; // u8,u16,u32
|
||||
int curAddress; // Will be accessed by parent
|
||||
|
||||
private:
|
||||
int YToAddress(int y);
|
||||
void redraw() {Refresh();}
|
||||
|
||||
DebugInterface* debugger;
|
||||
|
||||
|
||||
int align;
|
||||
int rowHeight;
|
||||
|
||||
u32 selection;
|
||||
u32 oldSelection;
|
||||
bool selectionChanged;
|
||||
bool selecting;
|
||||
bool hasFocus;
|
||||
bool showHex;
|
||||
|
||||
int memory;
|
||||
|
||||
enum EViewAsType
|
||||
{
|
||||
VIEWAS_ASCII = 0,
|
||||
VIEWAS_FP,
|
||||
VIEWAS_HEX,
|
||||
};
|
||||
|
||||
EViewAsType viewAsType;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif /*MEMORYVIEW_H_*/
|
438
Source/Core/DolphinWX/Src/MemoryWindow.cpp
Normal file
438
Source/Core/DolphinWX/Src/MemoryWindow.cpp
Normal file
@ -0,0 +1,438 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <wx/button.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include <wx/thread.h>
|
||||
#include <wx/listctrl.h>
|
||||
#include "MemoryWindow.h"
|
||||
#include "HW/CPU.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "Host.h"
|
||||
#include "FileUtil.h"
|
||||
|
||||
#include "Debugger/PPCDebugInterface.h"
|
||||
#include "PowerPC/PPCSymbolDB.h"
|
||||
|
||||
#include "Core.h"
|
||||
#include "ConfigManager.h"
|
||||
#include "LogManager.h"
|
||||
|
||||
#include "HW/Memmap.h"
|
||||
#include "HW/DSP.h"
|
||||
|
||||
#include "../../DolphinWX/Src/Globals.h"
|
||||
|
||||
enum
|
||||
{
|
||||
IDM_MEM_ADDRBOX = 350,
|
||||
IDM_SYMBOLLIST,
|
||||
IDM_SETVALBUTTON,
|
||||
IDM_DUMP_MEMORY,
|
||||
IDM_DUMP_MEM2,
|
||||
IDM_VALBOX,
|
||||
IDM_U8,
|
||||
IDM_U16,
|
||||
IDM_U32,
|
||||
IDM_SEARCH,
|
||||
IDM_ASCII,
|
||||
IDM_HEX
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(CMemoryWindow, wxPanel)
|
||||
EVT_TEXT(IDM_MEM_ADDRBOX, CMemoryWindow::OnAddrBoxChange)
|
||||
EVT_LISTBOX(IDM_SYMBOLLIST, CMemoryWindow::OnSymbolListChange)
|
||||
EVT_HOST_COMMAND(wxID_ANY, CMemoryWindow::OnHostMessage)
|
||||
EVT_BUTTON(IDM_SETVALBUTTON, CMemoryWindow::SetMemoryValue)
|
||||
EVT_BUTTON(IDM_DUMP_MEMORY, CMemoryWindow::OnDumpMemory)
|
||||
EVT_BUTTON(IDM_DUMP_MEM2, CMemoryWindow::OnDumpMem2)
|
||||
EVT_CHECKBOX(IDM_U8, CMemoryWindow::U8)
|
||||
EVT_CHECKBOX(IDM_U16, CMemoryWindow::U16)
|
||||
EVT_CHECKBOX(IDM_U32, CMemoryWindow::U32)
|
||||
EVT_BUTTON(IDM_SEARCH, CMemoryWindow::onSearch)
|
||||
EVT_CHECKBOX(IDM_ASCII, CMemoryWindow::onAscii)
|
||||
EVT_CHECKBOX(IDM_HEX, CMemoryWindow::onHex)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
CMemoryWindow::CMemoryWindow(wxWindow* parent, wxWindowID id,
|
||||
const wxPoint& pos, const wxSize& size, long style, const wxString& name)
|
||||
: wxPanel(parent, id, pos, size, style, name)
|
||||
{
|
||||
wxBoxSizer* sizerBig = new wxBoxSizer(wxHORIZONTAL);
|
||||
wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL);
|
||||
// Didn't see anything usefull in the left part
|
||||
//wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
DebugInterface* di = &PowerPC::debug_interface;
|
||||
|
||||
//symbols = new wxListBox(this, IDM_SYMBOLLIST, wxDefaultPosition,
|
||||
// wxSize(20, 100), 0, NULL, wxLB_SORT);
|
||||
//sizerLeft->Add(symbols, 1, wxEXPAND);
|
||||
memview = new CMemoryView(di, this, wxID_ANY);
|
||||
memview->dataType = 0;
|
||||
//sizerBig->Add(sizerLeft, 1, wxEXPAND);
|
||||
sizerBig->Add(memview, 20, wxEXPAND);
|
||||
sizerBig->Add(sizerRight, 0, wxEXPAND | wxALL, 3);
|
||||
sizerRight->Add(addrbox = new wxTextCtrl(this, IDM_MEM_ADDRBOX, _T("")));
|
||||
sizerRight->Add(valbox = new wxTextCtrl(this, IDM_VALBOX, _T("")));
|
||||
sizerRight->Add(new wxButton(this, IDM_SETVALBUTTON, _("Set &Value")));
|
||||
|
||||
sizerRight->AddSpacer(5);
|
||||
sizerRight->Add(new wxButton(this, IDM_DUMP_MEMORY, _("&Dump MRAM")));
|
||||
sizerRight->Add(new wxButton(this, IDM_DUMP_MEM2, _("&Dump EXRAM")));
|
||||
|
||||
wxStaticBoxSizer* sizerSearchType = new wxStaticBoxSizer(wxVERTICAL, this, _("Search"));
|
||||
|
||||
sizerSearchType->Add(btnSearch = new wxButton(this, IDM_SEARCH, _("Search")));
|
||||
sizerSearchType->Add(chkAscii = new wxCheckBox(this, IDM_ASCII, _T("&Ascii ")));
|
||||
sizerSearchType->Add(chkHex = new wxCheckBox(this, IDM_HEX, _("&Hex")));
|
||||
sizerRight->Add(sizerSearchType);
|
||||
wxStaticBoxSizer* sizerDataTypes = new wxStaticBoxSizer(wxVERTICAL, this, _("Data Type"));
|
||||
|
||||
sizerDataTypes->SetMinSize(74, 40);
|
||||
sizerDataTypes->Add(chk8 = new wxCheckBox(this, IDM_U8, _T("&U8")));
|
||||
sizerDataTypes->Add(chk16 = new wxCheckBox(this, IDM_U16, _T("&U16")));
|
||||
sizerDataTypes->Add(chk32 = new wxCheckBox(this, IDM_U32, _T("&U32")));
|
||||
sizerRight->Add(sizerDataTypes);
|
||||
SetSizer(sizerBig);
|
||||
chkHex->SetValue(1); //Set defaults
|
||||
chk8->SetValue(1);
|
||||
|
||||
//sizerLeft->SetSizeHints(this);
|
||||
//sizerLeft->Fit(this);
|
||||
sizerRight->SetSizeHints(this);
|
||||
sizerRight->Fit(this);
|
||||
sizerBig->SetSizeHints(this);
|
||||
sizerBig->Fit(this);
|
||||
}
|
||||
|
||||
void CMemoryWindow::Save(IniFile& _IniFile) const
|
||||
{
|
||||
// Prevent these bad values that can happen after a crash or hanging
|
||||
if(GetPosition().x != -32000 && GetPosition().y != -32000)
|
||||
{
|
||||
_IniFile.Set("MemoryWindow", "x", GetPosition().x);
|
||||
_IniFile.Set("MemoryWindow", "y", GetPosition().y);
|
||||
_IniFile.Set("MemoryWindow", "w", GetSize().GetWidth());
|
||||
_IniFile.Set("MemoryWindow", "h", GetSize().GetHeight());
|
||||
}
|
||||
}
|
||||
|
||||
void CMemoryWindow::Load(IniFile& _IniFile)
|
||||
{
|
||||
int x, y, w, h;
|
||||
_IniFile.Get("MemoryWindow", "x", &x, GetPosition().x);
|
||||
_IniFile.Get("MemoryWindow", "y", &y, GetPosition().y);
|
||||
_IniFile.Get("MemoryWindow", "w", &w, GetSize().GetWidth());
|
||||
_IniFile.Get("MemoryWindow", "h", &h, GetSize().GetHeight());
|
||||
SetSize(x, y, w, h);
|
||||
}
|
||||
|
||||
void CMemoryWindow::JumpToAddress(u32 _Address)
|
||||
{
|
||||
memview->Center(_Address);
|
||||
}
|
||||
|
||||
void CMemoryWindow::SetMemoryValue(wxCommandEvent& event)
|
||||
{
|
||||
std::string str_addr = std::string(addrbox->GetValue().mb_str());
|
||||
std::string str_val = std::string(valbox->GetValue().mb_str());
|
||||
u32 addr;
|
||||
u32 val;
|
||||
|
||||
if (!TryParse(std::string("0x") + str_addr, &addr))
|
||||
{
|
||||
PanicAlert("Invalid Address: %s", str_addr.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryParse(std::string("0x") + str_val, &val))
|
||||
{
|
||||
PanicAlert("Invalid Value: %s", str_val.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
Memory::Write_U32(val, addr);
|
||||
memview->Refresh();
|
||||
}
|
||||
|
||||
void CMemoryWindow::OnAddrBoxChange(wxCommandEvent& event)
|
||||
{
|
||||
wxString txt = addrbox->GetValue();
|
||||
if (txt.size())
|
||||
{
|
||||
u32 addr;
|
||||
sscanf(txt.mb_str(), "%08x", &addr);
|
||||
memview->Center(addr & ~3);
|
||||
}
|
||||
|
||||
event.Skip(1);
|
||||
}
|
||||
|
||||
void CMemoryWindow::Update()
|
||||
{
|
||||
memview->Refresh();
|
||||
memview->Center(PC);
|
||||
}
|
||||
|
||||
void CMemoryWindow::NotifyMapLoaded()
|
||||
{
|
||||
symbols->Show(false); // hide it for faster filling
|
||||
symbols->Clear();
|
||||
#if 0
|
||||
#ifdef _WIN32
|
||||
const FunctionDB::XFuncMap &syms = g_symbolDB.Symbols();
|
||||
for (FuntionDB::XFuncMap::iterator iter = syms.begin(); iter != syms.end(); ++iter)
|
||||
{
|
||||
int idx = symbols->Append(iter->second.name.c_str());
|
||||
symbols->SetClientData(idx, (void*)&iter->second);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
symbols->Show(true);
|
||||
Update();
|
||||
}
|
||||
|
||||
void CMemoryWindow::OnSymbolListChange(wxCommandEvent& event)
|
||||
{
|
||||
int index = symbols->GetSelection();
|
||||
if (index >= 0)
|
||||
{
|
||||
Symbol* pSymbol = static_cast<Symbol *>(symbols->GetClientData(index));
|
||||
if (pSymbol != NULL)
|
||||
{
|
||||
memview->Center(pSymbol->address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CMemoryWindow::OnHostMessage(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId())
|
||||
{
|
||||
case IDM_NOTIFYMAPLOADED:
|
||||
NotifyMapLoaded();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Write mram to file
|
||||
void CMemoryWindow::OnDumpMemory( wxCommandEvent& event )
|
||||
{
|
||||
FILE* f = fopen(File::GetUserPath(F_RAMDUMP_IDX), "wb");
|
||||
if (f && Memory::m_pRAM)
|
||||
{
|
||||
fwrite(Memory::m_pRAM, Memory::REALRAM_SIZE, 1, f);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
// Write exram (aram or mem2) to file
|
||||
void CMemoryWindow::OnDumpMem2( wxCommandEvent& event )
|
||||
{
|
||||
FILE* f = NULL;
|
||||
|
||||
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
|
||||
{
|
||||
f = fopen(File::GetUserPath(F_ARAMDUMP_IDX), "wb");
|
||||
if (f && Memory::m_pEXRAM)
|
||||
{
|
||||
fwrite(Memory::m_pEXRAM, Memory::EXRAM_SIZE, 1, f);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
u8* aram = DSP::GetARAMPtr();
|
||||
f = fopen(File::GetUserPath(F_ARAMDUMP_IDX), "wb");
|
||||
if (f && aram)
|
||||
{
|
||||
fwrite(aram, DSP::ARAM_SIZE, 1, f);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CMemoryWindow::U8(wxCommandEvent& event)
|
||||
{
|
||||
chk16->SetValue(0);
|
||||
chk32->SetValue(0);
|
||||
memview->dataType = 0;
|
||||
memview->Refresh();
|
||||
}
|
||||
|
||||
void CMemoryWindow::U16(wxCommandEvent& event)
|
||||
{
|
||||
chk8->SetValue(0);
|
||||
chk32->SetValue(0);
|
||||
memview->dataType = 1;
|
||||
memview->Refresh();
|
||||
}
|
||||
|
||||
void CMemoryWindow::U32(wxCommandEvent& event)
|
||||
{
|
||||
chk16->SetValue(0);
|
||||
chk8->SetValue(0);
|
||||
memview->dataType = 2;
|
||||
memview->Refresh();
|
||||
}
|
||||
|
||||
void CMemoryWindow::onSearch(wxCommandEvent& event)
|
||||
{
|
||||
u8* TheRAM = 0;
|
||||
u32 szRAM = 0;
|
||||
switch (memview->GetMemoryType())
|
||||
{
|
||||
case 0:
|
||||
default:
|
||||
if (Memory::m_pRAM)
|
||||
{
|
||||
TheRAM = Memory::m_pRAM;
|
||||
szRAM = Memory::REALRAM_SIZE;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
u8* aram = DSP::GetARAMPtr();
|
||||
if (aram)
|
||||
{
|
||||
TheRAM = aram;
|
||||
szRAM = DSP::ARAM_SIZE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
//Now we have memory to look in
|
||||
//Are we looking for ASCII string, or hex?
|
||||
//memview->cu
|
||||
wxString rawData = valbox->GetValue();
|
||||
std::vector<u8> Dest; //May need a better name
|
||||
u32 size = 0;
|
||||
int pad = rawData.size()%2; //If it's uneven
|
||||
unsigned int i = 0;
|
||||
long count = 0;
|
||||
char copy[3] = {0};
|
||||
long newsize = 0;
|
||||
unsigned char *tmp2 = 0;
|
||||
char* tmpstr = 0;
|
||||
|
||||
if (chkHex->GetValue())
|
||||
{
|
||||
//We are looking for hex
|
||||
//If it's uneven
|
||||
size = (rawData.size()/2) + pad;
|
||||
Dest.resize(size+32);
|
||||
newsize = rawData.size();
|
||||
|
||||
if (pad)
|
||||
{
|
||||
tmpstr = new char[newsize + 2];
|
||||
memset(tmpstr, 0, newsize + 2);
|
||||
tmpstr[0] = '0';
|
||||
}
|
||||
else
|
||||
{
|
||||
tmpstr = new char[newsize + 1];
|
||||
memset(tmpstr, 0, newsize + 1);
|
||||
}
|
||||
//sprintf(tmpstr, "%s%s", tmpstr, rawData.c_str());
|
||||
//strcpy(&tmpstr[1], rawData.ToAscii());
|
||||
//memcpy(&tmpstr[1], &rawData.c_str()[0], rawData.size());
|
||||
sprintf(tmpstr, "%s%s", tmpstr, (const char *)rawData.mb_str());
|
||||
tmp2 = &Dest.front();
|
||||
count = 0;
|
||||
for(i = 0; i < strlen(tmpstr); i++)
|
||||
{
|
||||
copy[0] = tmpstr[i];
|
||||
copy[1] = tmpstr[i+1];
|
||||
copy[2] = 0;
|
||||
int tmpint;
|
||||
sscanf(copy, "%02x", &tmpint);
|
||||
tmp2[count++] = tmpint;
|
||||
// Dest[count] should now be the hex of what the two chars were!
|
||||
// Also should add a check to make sure it's A-F only
|
||||
//sscanf(copy, "%02x", &tmp2[count++]);
|
||||
i += 1;
|
||||
}
|
||||
delete[] tmpstr;
|
||||
} else {
|
||||
//Looking for an ascii string
|
||||
size = rawData.size();
|
||||
Dest.resize(size+1);
|
||||
tmpstr = new char[size+1];
|
||||
|
||||
tmp2 = &Dest.front();
|
||||
sprintf(tmpstr, "%s", (const char *)rawData.mb_str());
|
||||
|
||||
for(i = 0; i < size; i++)
|
||||
tmp2[i] = tmpstr[i];
|
||||
|
||||
delete[] tmpstr;
|
||||
}
|
||||
|
||||
if(size)
|
||||
{
|
||||
unsigned char* pnt = &Dest.front();
|
||||
unsigned int k = 0;
|
||||
//grab
|
||||
wxString txt = addrbox->GetValue();
|
||||
u32 addr = 0;
|
||||
if (txt.size())
|
||||
{
|
||||
sscanf(txt.mb_str(), "%08x", &addr);
|
||||
}
|
||||
i = addr+4;
|
||||
for( ; i < szRAM; i++)
|
||||
{
|
||||
for(k = 0; k < size; k++)
|
||||
{
|
||||
if(i + k > szRAM) break;
|
||||
if(k > size) break;
|
||||
if(pnt[k] != TheRAM[i+k])
|
||||
{
|
||||
k = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(k == size)
|
||||
{
|
||||
//Match was found
|
||||
wxMessageBox(_("A match was found. Placing viewer at the offset."));
|
||||
wxChar tmpwxstr[128] = {0};
|
||||
wxSprintf(tmpwxstr, _T("%08x"), i);
|
||||
wxString tmpwx(tmpwxstr);
|
||||
addrbox->SetValue(tmpwx);
|
||||
//memview->curAddress = i;
|
||||
//memview->Refresh();
|
||||
OnAddrBoxChange(event);
|
||||
return;
|
||||
}
|
||||
}
|
||||
wxMessageBox(_("No match was found."));
|
||||
}
|
||||
}
|
||||
|
||||
void CMemoryWindow::onAscii(wxCommandEvent& event)
|
||||
{
|
||||
chkHex->SetValue(0);
|
||||
}
|
||||
|
||||
void CMemoryWindow::onHex(wxCommandEvent& event)
|
||||
{
|
||||
chkAscii->SetValue(0);
|
||||
}
|
84
Source/Core/DolphinWX/Src/MemoryWindow.h
Normal file
84
Source/Core/DolphinWX/Src/MemoryWindow.h
Normal file
@ -0,0 +1,84 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef MEMORYWINDOW_H_
|
||||
#define MEMORYWINDOW_H_
|
||||
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/listbox.h>
|
||||
#include "MemoryView.h"
|
||||
#include "Thread.h"
|
||||
#include "StringUtil.h"
|
||||
|
||||
#include "CoreParameter.h"
|
||||
|
||||
class CRegisterWindow;
|
||||
class CBreakPointWindow;
|
||||
|
||||
class CMemoryWindow
|
||||
: public wxPanel
|
||||
{
|
||||
public:
|
||||
|
||||
CMemoryWindow(wxWindow* parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTAB_TRAVERSAL | wxBORDER_NONE,
|
||||
const wxString& name = _("Memory"));
|
||||
|
||||
wxCheckBox* chk8;
|
||||
wxCheckBox* chk16;
|
||||
wxCheckBox* chk32;
|
||||
wxButton* btnSearch;
|
||||
wxCheckBox* chkAscii;
|
||||
wxCheckBox* chkHex;
|
||||
void Save(IniFile& _IniFile) const;
|
||||
void Load(IniFile& _IniFile);
|
||||
|
||||
void Update();
|
||||
void NotifyMapLoaded();
|
||||
|
||||
void JumpToAddress(u32 _Address);
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
CMemoryView* memview;
|
||||
wxListBox* symbols;
|
||||
|
||||
wxButton* buttonGo;
|
||||
wxTextCtrl* addrbox;
|
||||
wxTextCtrl* valbox;
|
||||
|
||||
void U8(wxCommandEvent& event);
|
||||
void U16(wxCommandEvent& event);
|
||||
void U32(wxCommandEvent& event);
|
||||
void onSearch(wxCommandEvent& event);
|
||||
void onAscii(wxCommandEvent& event);
|
||||
void onHex(wxCommandEvent& event);
|
||||
void OnSymbolListChange(wxCommandEvent& event);
|
||||
void OnCallstackListChange(wxCommandEvent& event);
|
||||
void OnAddrBoxChange(wxCommandEvent& event);
|
||||
void OnHostMessage(wxCommandEvent& event);
|
||||
void SetMemoryValue(wxCommandEvent& event);
|
||||
void OnDumpMemory(wxCommandEvent& event);
|
||||
void OnDumpMem2(wxCommandEvent& event);
|
||||
};
|
||||
|
||||
#endif /*MEMORYWINDOW_*/
|
176
Source/Core/DolphinWX/Src/RegisterView.cpp
Normal file
176
Source/Core/DolphinWX/Src/RegisterView.cpp
Normal file
@ -0,0 +1,176 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "DebuggerUIUtil.h"
|
||||
#include "RegisterView.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "HW/ProcessorInterface.h"
|
||||
#include "IniFile.h"
|
||||
|
||||
// F-zero 80005e60 wtf??
|
||||
|
||||
extern const char* GetGPRName(unsigned int index);
|
||||
extern const char* GetFPRName(unsigned int index);
|
||||
|
||||
static const char *special_reg_names[] = {
|
||||
"PC", "LR", "CTR", "CR", "FPSCR", "MSR", "SRR0", "SRR1", "Exceptions", "Int Mask", "Int Cause",
|
||||
};
|
||||
|
||||
static u32 GetSpecialRegValue(int reg) {
|
||||
switch (reg) {
|
||||
case 0: return PowerPC::ppcState.pc;
|
||||
case 1: return PowerPC::ppcState.spr[SPR_LR];
|
||||
case 2: return PowerPC::ppcState.spr[SPR_CTR];
|
||||
case 3: return GetCR();
|
||||
case 4: return PowerPC::ppcState.fpscr;
|
||||
case 5: return PowerPC::ppcState.msr;
|
||||
case 6: return PowerPC::ppcState.spr[SPR_SRR0];
|
||||
case 7: return PowerPC::ppcState.spr[SPR_SRR1];
|
||||
case 8: return PowerPC::ppcState.Exceptions;
|
||||
case 9: return ProcessorInterface::GetMask();
|
||||
case 10: return ProcessorInterface::GetCause();
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
wxString CRegTable::GetValue(int row, int col)
|
||||
{
|
||||
if (row < 32) {
|
||||
switch (col) {
|
||||
case 0: return wxString::FromAscii(GetGPRName(row));
|
||||
case 1: return wxString::Format(wxT("%08x"), GPR(row));
|
||||
case 2: return wxString::FromAscii(GetFPRName(row));
|
||||
case 3: return wxString::Format(wxT("%016llx"), riPS0(row));
|
||||
case 4: return wxString::Format(wxT("%016llx"), riPS1(row));
|
||||
default: return wxString::FromAscii("");
|
||||
}
|
||||
} else {
|
||||
if (row - 32 < NUM_SPECIALS) {
|
||||
switch (col) {
|
||||
case 0: return wxString::FromAscii(special_reg_names[row - 32]);
|
||||
case 1: return wxString::Format(wxT("%08x"), GetSpecialRegValue(row - 32));
|
||||
default: return wxString::FromAscii("");
|
||||
}
|
||||
}
|
||||
}
|
||||
return wxString::FromAscii("");
|
||||
}
|
||||
|
||||
static void SetSpecialRegValue(int reg, u32 value) {
|
||||
switch (reg) {
|
||||
case 0: PowerPC::ppcState.pc = value; break;
|
||||
case 1: PowerPC::ppcState.spr[SPR_LR] = value; break;
|
||||
case 2: PowerPC::ppcState.spr[SPR_CTR] = value; break;
|
||||
case 3: SetCR(value); break;
|
||||
case 4: PowerPC::ppcState.fpscr = value; break;
|
||||
case 5: PowerPC::ppcState.msr = value; break;
|
||||
case 6: PowerPC::ppcState.spr[SPR_SRR0] = value; break;
|
||||
case 7: PowerPC::ppcState.spr[SPR_SRR1] = value; break;
|
||||
case 8: PowerPC::ppcState.Exceptions = value; break;
|
||||
// Should we just change the value, or use ProcessorInterface::SetInterrupt() to make the system aware?
|
||||
// case 9: return ProcessorInterface::GetMask();
|
||||
// case 10: return ProcessorInterface::GetCause();
|
||||
default: return;
|
||||
}
|
||||
}
|
||||
|
||||
void CRegTable::SetValue(int row, int col, const wxString& strNewVal)
|
||||
{
|
||||
u32 newVal = 0;
|
||||
if (TryParse(std::string(strNewVal.mb_str()), &newVal))
|
||||
{
|
||||
if (row < 32) {
|
||||
if (col == 1)
|
||||
GPR(row) = newVal;
|
||||
else if (col == 3)
|
||||
riPS0(row) = newVal;
|
||||
else if (col == 4)
|
||||
riPS1(row) = newVal;
|
||||
} else {
|
||||
if ((row - 32 < NUM_SPECIALS) && (col == 1)) {
|
||||
SetSpecialRegValue(row - 32, newVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CRegTable::UpdateCachedRegs()
|
||||
{
|
||||
for (int i = 0; i < 32; ++i)
|
||||
{
|
||||
m_CachedRegHasChanged[i] = (m_CachedRegs[i] != GPR(i));
|
||||
m_CachedRegs[i] = GPR(i);
|
||||
|
||||
m_CachedFRegHasChanged[i][0] = (m_CachedFRegs[i][0] != riPS0(i));
|
||||
m_CachedFRegs[i][0] = riPS0(i);
|
||||
m_CachedFRegHasChanged[i][1] = (m_CachedFRegs[i][1] != riPS1(i));
|
||||
m_CachedFRegs[i][1] = riPS1(i);
|
||||
}
|
||||
for (int i = 0; i < NUM_SPECIALS; ++i)
|
||||
{
|
||||
m_CachedSpecialRegHasChanged[i] = (m_CachedSpecialRegs[i] != GetSpecialRegValue(i));
|
||||
m_CachedSpecialRegs[i] = GetSpecialRegValue(i);
|
||||
}
|
||||
}
|
||||
|
||||
wxGridCellAttr *CRegTable::GetAttr(int row, int col, wxGridCellAttr::wxAttrKind)
|
||||
{
|
||||
wxGridCellAttr *attr = new wxGridCellAttr();
|
||||
|
||||
attr->SetBackgroundColour(wxColour(wxT("#FFFFFF"))); //wxWHITE
|
||||
attr->SetFont(DebuggerFont);
|
||||
|
||||
switch (col) {
|
||||
case 1:
|
||||
attr->SetAlignment(wxALIGN_CENTER, wxALIGN_CENTER);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
attr->SetAlignment(wxALIGN_RIGHT, wxALIGN_CENTER);
|
||||
break;
|
||||
default:
|
||||
attr->SetAlignment(wxALIGN_LEFT, wxALIGN_CENTER);
|
||||
break;
|
||||
}
|
||||
|
||||
bool red = false;
|
||||
switch (col) {
|
||||
case 1: red = row < 32 ? m_CachedRegHasChanged[row] : m_CachedSpecialRegHasChanged[row-32]; break;
|
||||
case 3:
|
||||
case 4: red = row < 32 ? m_CachedFRegHasChanged[row][col-3] : false; break;
|
||||
}
|
||||
attr->SetTextColour(red ? wxColor(wxT("#FF0000")) : wxColor(wxT("#000000")));
|
||||
attr->IncRef();
|
||||
return attr;
|
||||
}
|
||||
|
||||
CRegisterView::CRegisterView(wxWindow *parent, wxWindowID id)
|
||||
: wxGrid(parent, id)
|
||||
{
|
||||
SetTable(new CRegTable(), true);
|
||||
SetRowLabelSize(0);
|
||||
SetColLabelSize(0);
|
||||
DisableDragRowSize();
|
||||
|
||||
AutoSizeColumns();
|
||||
}
|
||||
|
||||
void CRegisterView::Update()
|
||||
{
|
||||
ForceRefresh();
|
||||
((CRegTable *)GetTable())->UpdateCachedRegs();
|
||||
}
|
82
Source/Core/DolphinWX/Src/RegisterView.h
Normal file
82
Source/Core/DolphinWX/Src/RegisterView.h
Normal file
@ -0,0 +1,82 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __REGISTERVIEW_h__
|
||||
#define __REGISTERVIEW_h__
|
||||
|
||||
#include <wx/grid.h>
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
// New register view:
|
||||
// R0 0x8000000 F0 0.0000 F0_PS1 0.0000
|
||||
// R1 0x8000000 F1 0.0000 F1_PS1 0.0000
|
||||
// R31 0x8000000 F31 0.0000 F31_PS1 0.0000
|
||||
// PC (specials)
|
||||
// LR
|
||||
// CTR
|
||||
// CR0-7
|
||||
// FPSCR
|
||||
// MSR
|
||||
// SRR0
|
||||
// SRR1
|
||||
// Exceptions
|
||||
// Interrupt Mask (PI)
|
||||
// Interrupt Cause(PI)
|
||||
|
||||
class CRegTable : public wxGridTableBase
|
||||
{
|
||||
enum {
|
||||
NUM_SPECIALS = 11,
|
||||
};
|
||||
|
||||
public:
|
||||
CRegTable() {
|
||||
memset(m_CachedRegs, 0, sizeof(m_CachedRegs));
|
||||
memset(m_CachedSpecialRegs, 0, sizeof(m_CachedSpecialRegs));
|
||||
memset(m_CachedFRegs, 0, sizeof(m_CachedFRegs));
|
||||
memset(m_CachedRegHasChanged, 0, sizeof(m_CachedRegHasChanged));
|
||||
memset(m_CachedSpecialRegHasChanged, 0, sizeof(m_CachedSpecialRegHasChanged));
|
||||
memset(m_CachedFRegHasChanged, 0, sizeof(m_CachedFRegHasChanged));
|
||||
}
|
||||
int GetNumberCols(void) {return 5;}
|
||||
int GetNumberRows(void) {return 32 + NUM_SPECIALS;}
|
||||
bool IsEmptyCell(int row, int col) {return row > 31 && col > 2;}
|
||||
wxString GetValue(int row, int col);
|
||||
void SetValue(int row, int col, const wxString &);
|
||||
wxGridCellAttr *GetAttr(int, int, wxGridCellAttr::wxAttrKind);
|
||||
void UpdateCachedRegs();
|
||||
|
||||
private:
|
||||
u32 m_CachedRegs[32];
|
||||
u32 m_CachedSpecialRegs[NUM_SPECIALS];
|
||||
u64 m_CachedFRegs[32][2];
|
||||
bool m_CachedRegHasChanged[32];
|
||||
bool m_CachedSpecialRegHasChanged[NUM_SPECIALS];
|
||||
bool m_CachedFRegHasChanged[32][2];
|
||||
|
||||
DECLARE_NO_COPY_CLASS(CRegTable);
|
||||
};
|
||||
|
||||
class CRegisterView : public wxGrid
|
||||
{
|
||||
public:
|
||||
CRegisterView(wxWindow* parent, wxWindowID id);
|
||||
void Update();
|
||||
};
|
||||
|
||||
#endif
|
56
Source/Core/DolphinWX/Src/RegisterWindow.cpp
Normal file
56
Source/Core/DolphinWX/Src/RegisterWindow.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <wx/wx.h>
|
||||
|
||||
#include "RegisterWindow.h"
|
||||
#include "PowerPC/PowerPC.h"
|
||||
#include "RegisterView.h"
|
||||
|
||||
extern const char* GetGRPName(unsigned int index);
|
||||
|
||||
BEGIN_EVENT_TABLE(CRegisterWindow, wxPanel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
CRegisterWindow::CRegisterWindow(wxWindow* parent, wxWindowID id,
|
||||
const wxPoint& position, const wxSize& size,
|
||||
long style, const wxString& name)
|
||||
: wxPanel(parent, id, position, size, style, name)
|
||||
, m_GPRGridView(NULL)
|
||||
{
|
||||
CreateGUIControls();
|
||||
}
|
||||
|
||||
void CRegisterWindow::CreateGUIControls()
|
||||
{
|
||||
wxBoxSizer *sGrid = new wxBoxSizer(wxVERTICAL);
|
||||
m_GPRGridView = new CRegisterView(this, ID_GPR);
|
||||
sGrid->Add(m_GPRGridView, 1, wxGROW);
|
||||
SetSizer(sGrid);
|
||||
sGrid->SetSizeHints(this);
|
||||
|
||||
NotifyUpdate();
|
||||
}
|
||||
|
||||
void CRegisterWindow::NotifyUpdate()
|
||||
{
|
||||
if (m_GPRGridView != NULL)
|
||||
{
|
||||
m_GPRGridView->Update();
|
||||
}
|
||||
}
|
50
Source/Core/DolphinWX/Src/RegisterWindow.h
Normal file
50
Source/Core/DolphinWX/Src/RegisterWindow.h
Normal file
@ -0,0 +1,50 @@
|
||||
// Copyright (C) 2003 Dolphin Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#ifndef __REGISTERWINDOW_h__
|
||||
#define __REGISTERWINDOW_h__
|
||||
|
||||
class CRegisterView;
|
||||
class IniFile;
|
||||
|
||||
class CRegisterWindow
|
||||
: public wxPanel
|
||||
{
|
||||
public:
|
||||
CRegisterWindow(wxWindow* parent,
|
||||
wxWindowID id = wxID_ANY,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = wxTAB_TRAVERSAL | wxNO_BORDER,
|
||||
const wxString& name = _("Registers"));
|
||||
|
||||
void NotifyUpdate();
|
||||
|
||||
|
||||
private:
|
||||
DECLARE_EVENT_TABLE();
|
||||
|
||||
enum
|
||||
{
|
||||
ID_GPR = 1002
|
||||
};
|
||||
|
||||
CRegisterView* m_GPRGridView;
|
||||
void CreateGUIControls();
|
||||
};
|
||||
|
||||
#endif
|
@ -38,6 +38,23 @@ else:
|
||||
'WiimoteConfigDiag.cpp',
|
||||
'WXInputBase.cpp',
|
||||
'WxUtils.cpp',
|
||||
'BreakpointDlg.cpp',
|
||||
'BreakpointView.cpp',
|
||||
'BreakpointWindow.cpp',
|
||||
'CodeView.cpp',
|
||||
'CodeWindow.cpp',
|
||||
'CodeWindowFunctions.cpp',
|
||||
'DebuggerPanel.cpp',
|
||||
'DebuggerUIUtil.cpp',
|
||||
'DSPDebugWindow.cpp',
|
||||
'DSPRegisterView.cpp',
|
||||
'JitWindow.cpp',
|
||||
'MemoryCheckDlg.cpp',
|
||||
'MemoryView.cpp',
|
||||
'MemoryWindow.cpp',
|
||||
'RegisterView.cpp',
|
||||
'RegisterWindow.cpp',
|
||||
'VideoConfigDiag.cpp',
|
||||
]
|
||||
|
||||
if sys.platform == 'win32':
|
||||
|
464
Source/Core/DolphinWX/Src/VideoConfigDiag.cpp
Normal file
464
Source/Core/DolphinWX/Src/VideoConfigDiag.cpp
Normal file
@ -0,0 +1,464 @@
|
||||
#include "VideoConfigDiag.h"
|
||||
|
||||
#include "FileUtil.h"
|
||||
#include "TextureCacheBase.h"
|
||||
|
||||
#include <wx/intl.h>
|
||||
|
||||
#define _connect_macro_(b, f, c, s) (b)->Connect(wxID_ANY, (c), wxCommandEventHandler( f ), (wxObject*)0, (wxEvtHandler*)s)
|
||||
|
||||
// template instantiation
|
||||
template class BoolSetting<wxCheckBox>;
|
||||
template class BoolSetting<wxRadioButton>;
|
||||
|
||||
template <>
|
||||
SettingCheckBox::BoolSetting(wxWindow* parent, const wxString& label, const wxString& tooltip, bool &setting, bool reverse, long style)
|
||||
: wxCheckBox(parent, -1, label, wxDefaultPosition, wxDefaultSize, style)
|
||||
, m_setting(setting)
|
||||
, m_reverse(reverse)
|
||||
{
|
||||
SetToolTip(tooltip);
|
||||
SetValue(m_setting ^ m_reverse);
|
||||
_connect_macro_(this, SettingCheckBox::UpdateValue, wxEVT_COMMAND_CHECKBOX_CLICKED, this);
|
||||
}
|
||||
|
||||
template <>
|
||||
SettingRadioButton::BoolSetting(wxWindow* parent, const wxString& label, const wxString& tooltip, bool &setting, bool reverse, long style)
|
||||
: wxRadioButton(parent, -1, label, wxDefaultPosition, wxDefaultSize, style)
|
||||
, m_setting(setting)
|
||||
, m_reverse(reverse)
|
||||
{
|
||||
SetToolTip(tooltip);
|
||||
SetValue(m_setting ^ m_reverse);
|
||||
_connect_macro_(this, SettingRadioButton::UpdateValue, wxEVT_COMMAND_RADIOBUTTON_SELECTED, this);
|
||||
}
|
||||
|
||||
SettingChoice::SettingChoice(wxWindow* parent, int &setting, const wxString& tooltip, int num, const wxString choices[])
|
||||
: wxChoice(parent, -1, wxDefaultPosition, wxDefaultSize, num, choices)
|
||||
, m_setting(setting)
|
||||
{
|
||||
SetToolTip(tooltip);
|
||||
Select(m_setting);
|
||||
_connect_macro_(this, SettingChoice::UpdateValue, wxEVT_COMMAND_CHOICE_SELECTED, this);
|
||||
}
|
||||
|
||||
void SettingChoice::UpdateValue(wxCommandEvent& ev)
|
||||
{
|
||||
m_setting = ev.GetInt();
|
||||
ev.Skip();
|
||||
}
|
||||
|
||||
void VideoConfigDiag::Event_ClickClose(wxCommandEvent&)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
void VideoConfigDiag::Event_Close(wxCloseEvent& ev)
|
||||
{
|
||||
g_Config.Save((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str());
|
||||
|
||||
EndModal(wxID_OK);
|
||||
|
||||
TextureCache::InvalidateDefer(); // For settings like hi-res textures/texture format/etc.
|
||||
}
|
||||
|
||||
// TODO: implement some hack to increase the tooltip display duration, because some of these are way too long for anyone to read in 5 seconds.
|
||||
|
||||
wxString adapter_tooltip = wxTRANSLATE("Select a hardware adapter to use.\nWhen in doubt, use the first one");
|
||||
wxString ar_tooltip = wxTRANSLATE("Select what aspect ratio to use when rendering:\nAuto: Use the native aspect ratio (4:3)\nForce 16:9: Stretch the picture to an aspect ratio of 16:9.\nForce 4:3: Stretch the picture to an aspect ratio of 4:3.\nStretch to window: Stretch the picture to the window size.");
|
||||
wxString ws_hack_tooltip = wxTRANSLATE("Force the game to output graphics for widescreen resolutions.\nNote that this might cause graphical glitches");
|
||||
wxString vsync_tooltip = wxTRANSLATE("Wait for vertical blanks.\nReduces tearing but might also decrease performance");
|
||||
wxString af_tooltip = wxTRANSLATE("Enables anisotropic filtering.\nEnhances visual quality of textures that are at oblique viewing angles.");
|
||||
wxString aa_tooltip = wxTRANSLATE("Reduces the amount of aliasing caused by rasterizing 3D graphics.\nThis makes the rendered picture look less blocky but also heavily decreases performance.");
|
||||
wxString native_mips_tooltip = wxTRANSLATE("Loads native mipmaps instead of generating them.\nLoading native mipmaps is the more accurate behavior, but might also decrease performance (your mileage might vary though).");
|
||||
wxString scaled_efb_copy_tooltip = wxTRANSLATE("Uses the high-resolution render buffer for EFB copies instead of scaling them down to native resolution.\nVastly improves visual quality in games which use EFB copies but might cause glitches in some games.");
|
||||
wxString pixel_lighting_tooltip = wxTRANSLATE("Calculates lighting of 3D graphics on a per-pixel basis rather than per vertex.\nThis is the more accurate behavior but reduces performance.");
|
||||
wxString pixel_depth_tooltip = wxT("");
|
||||
wxString force_filtering_tooltip = wxTRANSLATE("Forces bilinear texture filtering even if the game explicitly disabled it.\nImproves texture quality (especially when using a high internal resolution) but causes glitches in some games.");
|
||||
wxString _3d_vision_tooltip = wxT("");
|
||||
wxString internal_res_tooltip = wxTRANSLATE("Specifies the resolution used to render at. A high resolution will improve visual quality but is also quite heavy on performance and might cause glitches in certain games.\nFractional: Uses your display resolution directly instead of the native resolution. The quality scales with your display/window size, as does the performance impact.\nIntegral: This is like Fractional, but rounds up to an integer multiple of the native resolution. Should give a more accurate look but is usually slower.\nThe other options are fixed resolutions for choosing a visual quality independent of your display size.");
|
||||
wxString efb_access_tooltip = wxTRANSLATE("Allows the CPU to read or write to the EFB (render buffer).\nThis is needed for certain gameplay functionality (e.g. star pointer in Super Mario Galaxy) as well as for certain visual effects (e.g. Monster Hunter Tri),\nbut enabling this option can also have a huge negative impact on performance if the game uses this functionality heavily.");
|
||||
wxString efb_emulate_format_changes_tooltip = wxTRANSLATE("Enables reinterpreting the data inside the EFB when the pixel format changes.\nSome games depend on this function for certain effects, so enable it if you're having glitches.\nDepending on how the game uses this function, the speed hits caused by this option range from none to critical.");
|
||||
wxString efb_copy_tooltip = wxTRANSLATE("Enables emulation of Embedded Frame Buffer copies, if the game uses them.\nGames often need this for post-processing or other things, but if you can live without it, you can sometimes get a big speedup.");
|
||||
wxString efb_copy_texture_tooltip = wxTRANSLATE("Emulate frame buffer copies directly to textures.\nThis is not so accurate, but it's good enough for the way many games use framebuffer copies.");
|
||||
wxString efb_copy_ram_tooltip = wxTRANSLATE("Fully emulate embedded frame buffer copies.\nThis is more accurate than EFB Copy to Texture, and some games need this to work properly, but it can also be very slow.");
|
||||
wxString stc_tooltip = wxTRANSLATE("Keeps track of textures based on looking at the actual pixels in the texture.\nCan cause slowdown, but some games need this option enabled to work properly.");
|
||||
wxString stc_speed_tooltip = wxTRANSLATE("Faster variants look at fewer pixels and thus have more potential for errors.\nSlower variants look at more pixels and thus are safer.");
|
||||
wxString wireframe_tooltip = wxTRANSLATE("Render the scene as a wireframe.\nThis is only useful for debugging purposes.");
|
||||
wxString disable_lighting_tooltip = wxTRANSLATE("Disable lighting. Improves performance but causes lighting to disappear in games which use it.");
|
||||
wxString disable_textures_tooltip = wxTRANSLATE("Disable texturing.\nThis is only useful for debugging purposes.");
|
||||
wxString disable_fog_tooltip = wxTRANSLATE("Disable fog. Improves performance but causes glitches in games which rely on proper fog emulation.");
|
||||
wxString disable_alphapass_tooltip = wxTRANSLATE("Disables an alpha-setting pass.\nBreaks certain effects but might help performance.");
|
||||
wxString show_fps_tooltip = wxTRANSLATE("Show the number of frames rendered per second.");
|
||||
wxString show_stats_tooltip = wxTRANSLATE("Show various statistics.\nThis is only useful for debugging purposes.");
|
||||
wxString proj_stats_tooltip = wxTRANSLATE("Show projection statistics.\nThis is only useful for debugging purposes.");
|
||||
wxString texfmt_tooltip = wxTRANSLATE("Modify textures to show the format they're using.\nThis is only useful for debugging purposes.");
|
||||
wxString efb_copy_regions_tooltip = wxT("");
|
||||
wxString xfb_tooltip = wxT("");
|
||||
wxString dump_textures_tooltip = wxTRANSLATE("Dump game textures to User/Dump/Textures/<game id>/");
|
||||
wxString load_hires_textures_tooltip = wxTRANSLATE("Load high-resolution textures from User/Load/Textures/<game id>/");
|
||||
wxString dump_efb_tooltip = wxT("");
|
||||
wxString dump_frames_tooltip = wxT("");
|
||||
wxString free_look_tooltip = wxT("");
|
||||
wxString crop_tooltip = wxT("");
|
||||
wxString opencl_tooltip = wxT("");
|
||||
wxString dlc_tooltip = wxT("");
|
||||
wxString hotkeys_tooltip = wxT("");
|
||||
wxString ppshader_tooltip = wxT("");
|
||||
wxString cache_efb_copies_tooltip = wxTRANSLATE("When using EFB to RAM we very often need to decode RAM data to a VRAM texture, which is a very time-consuming task.\nWith this option enabled, we'll skip decoding a texture if it didn't change.\nThis results in a nice speedup, but possibly causes glitches.\nIf you have any problems with this option enabled you should either try increasing the safety of the texture cache or disable this option.\n(NOTE: The safer the texture cache is adjusted the lower the speedup will be; accurate texture cache set to \"safe\" might actually be slower!)");
|
||||
|
||||
VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, const std::string& _ininame)
|
||||
: wxDialog(parent, -1,
|
||||
wxString::Format(_("Dolphin %s Graphics Configuration"),
|
||||
wxGetTranslation(wxString::From8BitData(title.c_str()))),
|
||||
wxDefaultPosition, wxDefaultSize)
|
||||
, vconfig(g_Config)
|
||||
, ininame(_ininame)
|
||||
{
|
||||
vconfig.Load((File::GetUserPath(D_CONFIG_IDX) + ininame + ".ini").c_str());
|
||||
|
||||
wxNotebook* const notebook = new wxNotebook(this, -1, wxDefaultPosition, wxDefaultSize);
|
||||
|
||||
// -- GENERAL --
|
||||
{
|
||||
wxPanel* const page_general = new wxPanel(notebook, -1, wxDefaultPosition);
|
||||
notebook->AddPage(page_general, _("General"));
|
||||
wxBoxSizer* const szr_general = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
// - basic
|
||||
{
|
||||
wxFlexGridSizer* const szr_basic = new wxFlexGridSizer(2, 5, 5);
|
||||
|
||||
// graphics api
|
||||
//{
|
||||
//const wxString gfxapi_choices[] = { _("Software [not present]"),
|
||||
// _("OpenGL [broken]"), _("Direct3D 9 [broken]"), _("Direct3D 11") };
|
||||
|
||||
//szr_basic->Add(new wxStaticText(page_general, -1, _("Graphics API:")), 1, wxALIGN_CENTER_VERTICAL, 0);
|
||||
//wxChoice* const choice_gfxapi = new SettingChoice(page_general,
|
||||
// g_gfxapi, sizeof(gfxapi_choices)/sizeof(*gfxapi_choices), gfxapi_choices);
|
||||
//szr_basic->Add(choice_gfxapi, 1, 0, 0);
|
||||
// TODO: Connect with Event_Backend()
|
||||
//}
|
||||
|
||||
// adapter // for D3D only
|
||||
if (vconfig.backend_info.Adapters.size())
|
||||
{
|
||||
szr_basic->Add(new wxStaticText(page_general, -1, _("Adapter:")), 1, wxALIGN_CENTER_VERTICAL, 5);
|
||||
wxChoice* const choice_adapter = new SettingChoice(page_general, vconfig.iAdapter, wxGetTranslation(adapter_tooltip));
|
||||
|
||||
std::vector<std::string>::const_iterator
|
||||
it = vconfig.backend_info.Adapters.begin(),
|
||||
itend = vconfig.backend_info.Adapters.end();
|
||||
for (; it != itend; ++it)
|
||||
choice_adapter->AppendString(wxString::FromAscii(it->c_str()));
|
||||
|
||||
choice_adapter->Select(vconfig.iAdapter);
|
||||
|
||||
szr_basic->Add(choice_adapter, 1, 0, 0);
|
||||
}
|
||||
|
||||
// aspect-ratio
|
||||
{
|
||||
const wxString ar_choices[] = { _("Auto [recommended]"),
|
||||
_("Force 16:9"), _("Force 4:3"), _("Stretch to Window") };
|
||||
|
||||
szr_basic->Add(new wxStaticText(page_general, -1, _("Aspect Ratio:")), 1, wxALIGN_CENTER_VERTICAL, 0);
|
||||
wxChoice* const choice_aspect = new SettingChoice(page_general,
|
||||
vconfig.iAspectRatio, wxGetTranslation(ar_tooltip), sizeof(ar_choices)/sizeof(*ar_choices), ar_choices);
|
||||
szr_basic->Add(choice_aspect, 1, 0, 0);
|
||||
}
|
||||
|
||||
// widescreen hack
|
||||
{
|
||||
szr_basic->AddStretchSpacer(1);
|
||||
szr_basic->Add(new SettingCheckBox(page_general, _("Widescreen Hack"), wxGetTranslation(ws_hack_tooltip), vconfig.bWidescreenHack), 1, 0, 0);
|
||||
szr_basic->AddStretchSpacer(1);
|
||||
szr_basic->Add(new SettingCheckBox(page_general, _("V-Sync"), wxGetTranslation(vsync_tooltip), vconfig.bVSync), 1, 0, 0);
|
||||
}
|
||||
|
||||
// enhancements
|
||||
wxFlexGridSizer* const szr_enh = new wxFlexGridSizer(2, 5, 5);
|
||||
|
||||
szr_enh->Add(new wxStaticText(page_general, -1, _("Anisotropic Filtering:")), 1, wxALIGN_CENTER_VERTICAL, 0);
|
||||
const wxString af_choices[] = {wxT("1x"), wxT("2x"), wxT("4x"), wxT("8x"), wxT("16x")};
|
||||
szr_enh->Add(new SettingChoice(page_general, vconfig.iMaxAnisotropy, wxGetTranslation(af_tooltip), 5, af_choices));
|
||||
|
||||
|
||||
wxStaticText* const text_aamode = new wxStaticText(page_general, -1, _("Anti-Aliasing:"));
|
||||
szr_enh->Add(text_aamode, 1, wxALIGN_CENTER_VERTICAL, 0);
|
||||
SettingChoice* const choice_aamode = new SettingChoice(page_general, vconfig.iMultisampleMode, wxGetTranslation(aa_tooltip));
|
||||
|
||||
std::vector<std::string>::const_iterator
|
||||
it = vconfig.backend_info.AAModes.begin(),
|
||||
itend = vconfig.backend_info.AAModes.end();
|
||||
for (; it != itend; ++it)
|
||||
choice_aamode->AppendString(wxGetTranslation(wxString::FromAscii(it->c_str())));
|
||||
|
||||
if (vconfig.backend_info.AAModes.size() <= 1)
|
||||
{
|
||||
choice_aamode->Disable();
|
||||
text_aamode->Disable();
|
||||
}
|
||||
|
||||
choice_aamode->Select(vconfig.iMultisampleMode);
|
||||
szr_enh->Add(choice_aamode);
|
||||
|
||||
|
||||
szr_enh->Add(new SettingCheckBox(page_general, _("Load Native Mipmaps"), wxGetTranslation(native_mips_tooltip), vconfig.bUseNativeMips));
|
||||
szr_enh->Add(new SettingCheckBox(page_general, _("EFB Scaled Copy"), wxGetTranslation(scaled_efb_copy_tooltip), vconfig.bCopyEFBScaled));
|
||||
szr_enh->Add(new SettingCheckBox(page_general, _("Pixel Lighting"), wxGetTranslation(pixel_lighting_tooltip), vconfig.bEnablePixelLigting));
|
||||
szr_enh->Add(new SettingCheckBox(page_general, _("Pixel Depth"), wxGetTranslation(pixel_depth_tooltip), vconfig.bEnablePerPixelDepth));
|
||||
szr_enh->Add(new SettingCheckBox(page_general, _("Force Bi/Trilinear Filtering"), wxGetTranslation(force_filtering_tooltip), vconfig.bForceFiltering));
|
||||
|
||||
if (vconfig.backend_info.bSupports3DVision)
|
||||
{
|
||||
szr_enh->Add(new SettingCheckBox(page_general, _("3D Vision (Requires Fullscreen)"), wxGetTranslation(_3d_vision_tooltip), vconfig.b3DVision));
|
||||
}
|
||||
|
||||
// - EFB
|
||||
// EFB scale
|
||||
wxBoxSizer* const efb_scale_szr = new wxBoxSizer(wxHORIZONTAL);
|
||||
// TODO: give this a label (?)
|
||||
const wxString efbscale_choices[] = { _("Fractional"), _("Integral [recommended]"),
|
||||
wxT("1x"), wxT("2x"), wxT("3x"), wxT("0.75x"), wxT("0.5x"), wxT("0.375x") };
|
||||
|
||||
wxChoice *const choice_efbscale = new SettingChoice(page_general,
|
||||
vconfig.iEFBScale, wxGetTranslation(internal_res_tooltip), sizeof(efbscale_choices)/sizeof(*efbscale_choices), efbscale_choices);
|
||||
|
||||
efb_scale_szr->Add(new wxStaticText(page_general, -1, _("Scale:")), 0, wxALIGN_CENTER_VERTICAL, 5);
|
||||
//efb_scale_szr->AddStretchSpacer(1);
|
||||
efb_scale_szr->Add(choice_efbscale, 0, wxBOTTOM | wxLEFT, 5);
|
||||
|
||||
SettingCheckBox *emulate_efb_format_changes = new SettingCheckBox(page_general, _("Emulate format changes"), wxGetTranslation(efb_emulate_format_changes_tooltip), vconfig.bEFBEmulateFormatChanges);
|
||||
|
||||
if (!vconfig.backend_info.bSupportsFormatReinterpretation)
|
||||
{
|
||||
emulate_efb_format_changes->SetValue(false);
|
||||
emulate_efb_format_changes->Disable();
|
||||
}
|
||||
|
||||
// EFB copy
|
||||
SettingCheckBox* efbcopy_enable = new SettingCheckBox(page_general, _("Enable"), wxGetTranslation(efb_copy_tooltip), vconfig.bEFBCopyEnable);
|
||||
_connect_macro_(efbcopy_enable, VideoConfigDiag::Event_EfbCopy, wxEVT_COMMAND_CHECKBOX_CLICKED, this);
|
||||
efbcopy_texture = new SettingRadioButton(page_general, _("Texture"), wxGetTranslation(efb_copy_texture_tooltip), vconfig.bCopyEFBToTexture, false, wxRB_GROUP);
|
||||
_connect_macro_(efbcopy_texture, VideoConfigDiag::Event_EfbCopyToTexture, wxEVT_COMMAND_RADIOBUTTON_SELECTED, this);
|
||||
efbcopy_ram = new SettingRadioButton(page_general, _("RAM"), wxGetTranslation(efb_copy_ram_tooltip), vconfig.bCopyEFBToTexture, true);
|
||||
_connect_macro_(efbcopy_ram, VideoConfigDiag::Event_EfbCopyToRam, wxEVT_COMMAND_RADIOBUTTON_SELECTED, this);
|
||||
cache_efb_copies = new SettingCheckBox(page_general, _("Enable cache"), wxGetTranslation(cache_efb_copies_tooltip), vconfig.bEFBCopyCacheEnable);
|
||||
wxStaticBoxSizer* const group_efbcopy = new wxStaticBoxSizer(wxHORIZONTAL, page_general, _("Copy"));
|
||||
group_efbcopy->Add(efbcopy_enable, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_efbcopy->AddStretchSpacer(1);
|
||||
group_efbcopy->Add(efbcopy_texture, 0, wxRIGHT, 5);
|
||||
group_efbcopy->Add(efbcopy_ram, 0, wxRIGHT, 5);
|
||||
group_efbcopy->Add(cache_efb_copies, 0, wxRIGHT, 5);
|
||||
|
||||
if (!vconfig.backend_info.bSupportsEFBToRAM)
|
||||
{
|
||||
efbcopy_ram->Disable();
|
||||
vconfig.bCopyEFBToTexture = true;
|
||||
efbcopy_texture->SetValue(true);
|
||||
}
|
||||
if (!vconfig.bEFBCopyEnable)
|
||||
{
|
||||
efbcopy_ram->Disable();
|
||||
efbcopy_texture->Disable();
|
||||
cache_efb_copies->Disable();
|
||||
}
|
||||
else if (vconfig.bCopyEFBToTexture)
|
||||
cache_efb_copies->Disable();
|
||||
|
||||
// - safe texture cache
|
||||
SettingCheckBox* stc_enable = new SettingCheckBox(page_general, _("Enable"), wxGetTranslation(stc_tooltip), vconfig.bSafeTextureCache);
|
||||
_connect_macro_(stc_enable, VideoConfigDiag::Event_Stc, wxEVT_COMMAND_CHECKBOX_CLICKED, this);
|
||||
|
||||
stc_safe = new wxRadioButton(page_general, -1, _("Safe"),
|
||||
wxDefaultPosition, wxDefaultSize, wxRB_GROUP);
|
||||
stc_safe->SetToolTip(wxGetTranslation(stc_speed_tooltip));
|
||||
_connect_macro_(stc_safe, VideoConfigDiag::Event_StcSafe, wxEVT_COMMAND_RADIOBUTTON_SELECTED, this);
|
||||
|
||||
stc_normal = new wxRadioButton(page_general, -1, _("Normal"));
|
||||
stc_normal->SetToolTip(wxGetTranslation(stc_speed_tooltip));
|
||||
_connect_macro_(stc_normal, VideoConfigDiag::Event_StcNormal, wxEVT_COMMAND_RADIOBUTTON_SELECTED, this);
|
||||
|
||||
stc_fast = new wxRadioButton(page_general, -1, _("Fast"));
|
||||
stc_fast->SetToolTip(wxGetTranslation(stc_speed_tooltip));
|
||||
_connect_macro_(stc_fast, VideoConfigDiag::Event_StcFast, wxEVT_COMMAND_RADIOBUTTON_SELECTED, this);
|
||||
|
||||
if (0 == vconfig.iSafeTextureCache_ColorSamples)
|
||||
stc_safe->SetValue(true);
|
||||
|
||||
if (512 == vconfig.iSafeTextureCache_ColorSamples)
|
||||
stc_normal->SetValue(true);
|
||||
|
||||
if (128 == vconfig.iSafeTextureCache_ColorSamples)
|
||||
stc_fast->SetValue(true);
|
||||
|
||||
if (!vconfig.bSafeTextureCache)
|
||||
{
|
||||
stc_safe->Disable();
|
||||
stc_normal->Disable();
|
||||
stc_fast->Disable();
|
||||
}
|
||||
|
||||
wxStaticBoxSizer* const group_basic = new wxStaticBoxSizer(wxVERTICAL, page_general, _("Basic"));
|
||||
szr_general->Add(group_basic, 0, wxEXPAND | wxALL, 5);
|
||||
group_basic->Add(szr_basic, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
wxStaticBoxSizer* const group_enh = new wxStaticBoxSizer(wxVERTICAL, page_general, _("Enhancements"));
|
||||
szr_general->Add(group_enh, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_enh->Add(szr_enh, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
|
||||
wxStaticBoxSizer* const group_efb = new wxStaticBoxSizer(wxVERTICAL, page_general, _("EFB"));
|
||||
szr_general->Add(group_efb, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_efb->Add(efb_scale_szr, 0, wxBOTTOM | wxLEFT, 5);
|
||||
group_efb->Add(new SettingCheckBox(page_general, _("Enable CPU Access"), wxGetTranslation(efb_access_tooltip), vconfig.bEFBAccessEnable), 0, wxBOTTOM | wxLEFT, 5);
|
||||
group_efb->Add(emulate_efb_format_changes, 0, wxBOTTOM | wxLEFT, 5);
|
||||
group_efb->Add(group_efbcopy, 0, wxEXPAND | wxBOTTOM, 5);
|
||||
|
||||
wxStaticBoxSizer* const group_safetex = new wxStaticBoxSizer(wxHORIZONTAL, page_general, _("Accurate Texture Cache"));
|
||||
szr_general->Add(group_safetex, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_safetex->Add(stc_enable, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_safetex->AddStretchSpacer(1);
|
||||
group_safetex->Add(stc_safe, 0, wxRIGHT, 5);
|
||||
group_safetex->Add(stc_normal, 0, wxRIGHT, 5);
|
||||
group_safetex->Add(stc_fast, 0, wxRIGHT, 5);
|
||||
}
|
||||
|
||||
page_general->SetSizerAndFit(szr_general);
|
||||
}
|
||||
|
||||
// -- ADVANCED --
|
||||
{
|
||||
wxPanel* const page_advanced = new wxPanel(notebook, -1, wxDefaultPosition);
|
||||
notebook->AddPage(page_advanced, _("Advanced"));
|
||||
wxBoxSizer* const szr_advanced = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
// - rendering
|
||||
{
|
||||
wxGridSizer* const szr_rendering = new wxGridSizer(2, 5, 5);
|
||||
|
||||
szr_rendering->Add(new SettingCheckBox(page_advanced, _("Enable Wireframe"), wxGetTranslation(wireframe_tooltip), vconfig.bWireFrame));
|
||||
szr_rendering->Add(new SettingCheckBox(page_advanced, _("Disable Lighting"), wxGetTranslation(disable_lighting_tooltip), vconfig.bDisableLighting));
|
||||
szr_rendering->Add(new SettingCheckBox(page_advanced, _("Disable Textures"), wxGetTranslation(disable_textures_tooltip), vconfig.bDisableTexturing));
|
||||
szr_rendering->Add(new SettingCheckBox(page_advanced, _("Disable Fog"), wxGetTranslation(disable_fog_tooltip), vconfig.bDisableFog));
|
||||
szr_rendering->Add(new SettingCheckBox(page_advanced, _("Disable Dest. Alpha Pass"), wxGetTranslation(disable_alphapass_tooltip), vconfig.bDstAlphaPass));
|
||||
|
||||
wxStaticBoxSizer* const group_rendering = new wxStaticBoxSizer(wxVERTICAL, page_advanced, _("Rendering"));
|
||||
szr_advanced->Add(group_rendering, 0, wxEXPAND | wxALL, 5);
|
||||
group_rendering->Add(szr_rendering, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
}
|
||||
|
||||
// - info
|
||||
{
|
||||
wxGridSizer* const szr_info = new wxGridSizer(2, 5, 5);
|
||||
|
||||
szr_info->Add(new SettingCheckBox(page_advanced, _("Show FPS"), wxGetTranslation(show_fps_tooltip), vconfig.bShowFPS));
|
||||
szr_info->Add(new SettingCheckBox(page_advanced, _("Various Statistics"), wxGetTranslation(show_stats_tooltip), vconfig.bOverlayStats));
|
||||
szr_info->Add(new SettingCheckBox(page_advanced, _("Projection Stats"), wxGetTranslation(proj_stats_tooltip), vconfig.bOverlayProjStats));
|
||||
szr_info->Add(new SettingCheckBox(page_advanced, _("Texture Format"), wxGetTranslation(texfmt_tooltip), vconfig.bTexFmtOverlayEnable));
|
||||
szr_info->Add(new SettingCheckBox(page_advanced, _("EFB Copy Regions"), wxGetTranslation(efb_copy_regions_tooltip), vconfig.bShowEFBCopyRegions));
|
||||
szr_info->Add(new SettingCheckBox(page_advanced, _("Show Shader Errors"), wxT(""), vconfig.bShowShaderErrors));
|
||||
|
||||
wxStaticBoxSizer* const group_info = new wxStaticBoxSizer(wxVERTICAL, page_advanced, _("Information"));
|
||||
szr_advanced->Add(group_info, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_info->Add(szr_info, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
}
|
||||
|
||||
// - XFB
|
||||
{
|
||||
SettingCheckBox* enable_xfb = new SettingCheckBox(page_advanced, _("Enable"), wxGetTranslation(xfb_tooltip), vconfig.bUseXFB);
|
||||
_connect_macro_(enable_xfb, VideoConfigDiag::Event_Xfb, wxEVT_COMMAND_CHECKBOX_CLICKED, this);
|
||||
virtual_xfb = new SettingRadioButton(page_advanced, _("Virtual"), wxGetTranslation(xfb_tooltip), vconfig.bUseRealXFB, true, wxRB_GROUP);
|
||||
real_xfb = new SettingRadioButton(page_advanced, _("Real"), wxGetTranslation(xfb_tooltip), vconfig.bUseRealXFB);
|
||||
|
||||
wxStaticBoxSizer* const group_xfb = new wxStaticBoxSizer(wxHORIZONTAL, page_advanced, _("XFB"));
|
||||
szr_advanced->Add(group_xfb, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_xfb->Add(enable_xfb, 0, wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_xfb->AddStretchSpacer(1);
|
||||
group_xfb->Add(virtual_xfb, 0, wxRIGHT, 5);
|
||||
group_xfb->Add(real_xfb, 0, wxRIGHT, 5);
|
||||
|
||||
if (!vconfig.backend_info.bSupportsRealXFB)
|
||||
{
|
||||
real_xfb->Disable();
|
||||
vconfig.bUseRealXFB = false;
|
||||
virtual_xfb->SetValue(true);
|
||||
}
|
||||
|
||||
if (!vconfig.bUseXFB)
|
||||
{
|
||||
real_xfb->Disable();
|
||||
virtual_xfb->Disable();
|
||||
}
|
||||
|
||||
} // xfb
|
||||
|
||||
// - utility
|
||||
{
|
||||
wxGridSizer* const szr_utility = new wxGridSizer(2, 5, 5);
|
||||
|
||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump Textures"), wxGetTranslation(dump_textures_tooltip), vconfig.bDumpTextures));
|
||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Load Hi-Res Textures"), wxGetTranslation(load_hires_textures_tooltip), vconfig.bHiresTextures));
|
||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump EFB Target"), dump_efb_tooltip, vconfig.bDumpEFBTarget));
|
||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Dump Frames"), dump_frames_tooltip, vconfig.bDumpFrames));
|
||||
szr_utility->Add(new SettingCheckBox(page_advanced, _("Free Look"), free_look_tooltip, vconfig.bFreeLook));
|
||||
|
||||
wxStaticBoxSizer* const group_utility = new wxStaticBoxSizer(wxVERTICAL, page_advanced, _("Utility"));
|
||||
szr_advanced->Add(group_utility, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_utility->Add(szr_utility, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
}
|
||||
|
||||
// - misc
|
||||
{
|
||||
wxGridSizer* const szr_misc = new wxGridSizer(2);
|
||||
|
||||
szr_misc->Add(new SettingCheckBox(page_advanced, _("Crop"), crop_tooltip, vconfig.bCrop), 0, wxBOTTOM, 5);
|
||||
szr_misc->Add(new SettingCheckBox(page_advanced, _("Enable OpenCL"), opencl_tooltip, vconfig.bEnableOpenCL), 0, wxLEFT|wxBOTTOM, 5);
|
||||
szr_misc->Add(new SettingCheckBox(page_advanced, _("Enable Display List Caching"), dlc_tooltip, vconfig.bDlistCachingEnable), 0, wxBOTTOM, 5);
|
||||
szr_misc->Add(new SettingCheckBox(page_advanced, _("Enable Hotkeys"), hotkeys_tooltip, vconfig.bOSDHotKey), 0, wxLEFT|wxBOTTOM, 5);
|
||||
|
||||
// postproc shader
|
||||
if (vconfig.backend_info.PPShaders.size())
|
||||
{
|
||||
szr_misc->Add(new wxStaticText(page_advanced, -1, _("Post-Processing Shader:")), 1, wxALIGN_CENTER_VERTICAL, 0);
|
||||
|
||||
wxChoice *const choice_ppshader = new wxChoice(page_advanced, -1, wxDefaultPosition);
|
||||
choice_ppshader->SetToolTip(wxGetTranslation(ppshader_tooltip));
|
||||
choice_ppshader->AppendString(_("(off)"));
|
||||
|
||||
std::vector<std::string>::const_iterator
|
||||
it = vconfig.backend_info.PPShaders.begin(),
|
||||
itend = vconfig.backend_info.PPShaders.end();
|
||||
for (; it != itend; ++it)
|
||||
choice_ppshader->AppendString(wxString::FromAscii(it->c_str()));
|
||||
|
||||
if (vconfig.sPostProcessingShader.empty())
|
||||
choice_ppshader->Select(0);
|
||||
else
|
||||
choice_ppshader->SetStringSelection(wxString::FromAscii(vconfig.sPostProcessingShader.c_str()));
|
||||
|
||||
_connect_macro_(choice_ppshader, VideoConfigDiag::Event_PPShader, wxEVT_COMMAND_CHOICE_SELECTED, this);
|
||||
|
||||
szr_misc->Add(choice_ppshader, 0, wxLEFT, 5);
|
||||
}
|
||||
|
||||
wxStaticBoxSizer* const group_misc = new wxStaticBoxSizer(wxVERTICAL, page_advanced, _("Misc"));
|
||||
szr_advanced->Add(group_misc, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
group_misc->Add(szr_misc, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
|
||||
}
|
||||
|
||||
page_advanced->SetSizerAndFit(szr_advanced);
|
||||
}
|
||||
|
||||
wxButton* const btn_close = new wxButton(this, -1, _("Close"), wxDefaultPosition);
|
||||
_connect_macro_(btn_close, VideoConfigDiag::Event_ClickClose, wxEVT_COMMAND_BUTTON_CLICKED, this);
|
||||
|
||||
Connect(-1, wxEVT_CLOSE_WINDOW, wxCloseEventHandler(VideoConfigDiag::Event_Close), (wxObject*)0, this);
|
||||
|
||||
wxBoxSizer* const szr_main = new wxBoxSizer(wxVERTICAL);
|
||||
szr_main->Add(notebook, 1, wxEXPAND | wxALL, 5);
|
||||
szr_main->Add(btn_close, 0, wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, 5);
|
||||
|
||||
SetSizerAndFit(szr_main);
|
||||
Center();
|
||||
}
|
153
Source/Core/DolphinWX/Src/VideoConfigDiag.h
Normal file
153
Source/Core/DolphinWX/Src/VideoConfigDiag.h
Normal file
@ -0,0 +1,153 @@
|
||||
|
||||
#ifndef _CONFIG_DIAG_H_
|
||||
#define _CONFIG_DIAG_H_
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include "VideoConfig.h"
|
||||
|
||||
#include <wx/wx.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/button.h>
|
||||
#include <wx/stattext.h>
|
||||
#include <wx/combobox.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/panel.h>
|
||||
#include <wx/spinctrl.h>
|
||||
|
||||
template <typename W>
|
||||
class BoolSetting : public W
|
||||
{
|
||||
public:
|
||||
BoolSetting(wxWindow* parent, const wxString& label, const wxString& tooltip, bool &setting, bool reverse = false, long style = 0);
|
||||
|
||||
void UpdateValue(wxCommandEvent& ev)
|
||||
{
|
||||
m_setting = (ev.GetInt() != 0) ^ m_reverse;
|
||||
ev.Skip();
|
||||
}
|
||||
private:
|
||||
bool &m_setting;
|
||||
const bool m_reverse;
|
||||
};
|
||||
|
||||
typedef BoolSetting<wxCheckBox> SettingCheckBox;
|
||||
typedef BoolSetting<wxRadioButton> SettingRadioButton;
|
||||
|
||||
class SettingChoice : public wxChoice
|
||||
{
|
||||
public:
|
||||
SettingChoice(wxWindow* parent, int &setting, const wxString& tooltip, int num = 0, const wxString choices[] = NULL);
|
||||
void UpdateValue(wxCommandEvent& ev);
|
||||
private:
|
||||
int &m_setting;
|
||||
};
|
||||
|
||||
class VideoConfigDiag : public wxDialog
|
||||
{
|
||||
public:
|
||||
VideoConfigDiag(wxWindow* parent, const std::string &title, const std::string& ininame);
|
||||
|
||||
protected:
|
||||
void Event_Backend(wxCommandEvent &ev) { ev.Skip(); } // TODO: Query list of supported AA modes
|
||||
void Event_Adapter(wxCommandEvent &ev) { ev.Skip(); } // TODO
|
||||
|
||||
void Event_EfbCopy(wxCommandEvent &ev)
|
||||
{
|
||||
if (ev.GetInt() == 0)
|
||||
{
|
||||
efbcopy_texture->Disable();
|
||||
efbcopy_ram->Disable();
|
||||
cache_efb_copies->Disable();
|
||||
}
|
||||
else
|
||||
{
|
||||
efbcopy_texture->Enable();
|
||||
if (vconfig.backend_info.bSupportsEFBToRAM)
|
||||
{
|
||||
efbcopy_ram->Enable();
|
||||
if (!vconfig.bCopyEFBToTexture)
|
||||
cache_efb_copies->Enable();
|
||||
}
|
||||
}
|
||||
ev.Skip();
|
||||
}
|
||||
|
||||
void Event_EfbCopyToTexture(wxCommandEvent &ev)
|
||||
{
|
||||
cache_efb_copies->Disable();
|
||||
ev.Skip();
|
||||
}
|
||||
|
||||
void Event_EfbCopyToRam(wxCommandEvent &ev)
|
||||
{
|
||||
cache_efb_copies->Enable();
|
||||
ev.Skip();
|
||||
}
|
||||
|
||||
void Event_Stc(wxCommandEvent &ev)
|
||||
{
|
||||
if (ev.GetInt() == 0)
|
||||
{
|
||||
stc_safe->Disable();
|
||||
stc_normal->Disable();
|
||||
stc_fast->Disable();
|
||||
}
|
||||
else
|
||||
{
|
||||
stc_safe->Enable();
|
||||
stc_normal->Enable();
|
||||
stc_fast->Enable();
|
||||
}
|
||||
ev.Skip();
|
||||
}
|
||||
void Event_StcSafe(wxCommandEvent &ev) { vconfig.iSafeTextureCache_ColorSamples = 0; ev.Skip(); }
|
||||
void Event_StcNormal(wxCommandEvent &ev) { vconfig.iSafeTextureCache_ColorSamples = 512; ev.Skip(); }
|
||||
void Event_StcFast(wxCommandEvent &ev) { vconfig.iSafeTextureCache_ColorSamples = 128; ev.Skip(); }
|
||||
|
||||
void Event_PPShader(wxCommandEvent &ev)
|
||||
{
|
||||
const int sel = ev.GetInt();
|
||||
if (sel)
|
||||
vconfig.sPostProcessingShader = ev.GetString().mb_str();
|
||||
else
|
||||
vconfig.sPostProcessingShader.clear();
|
||||
ev.Skip();
|
||||
}
|
||||
|
||||
void Event_Xfb(wxCommandEvent &ev)
|
||||
{
|
||||
if (ev.GetInt() == 0)
|
||||
{
|
||||
virtual_xfb->Disable();
|
||||
real_xfb->Disable();
|
||||
}
|
||||
else
|
||||
{
|
||||
virtual_xfb->Enable();
|
||||
if(vconfig.backend_info.bSupportsRealXFB) real_xfb->Enable();
|
||||
}
|
||||
ev.Skip();
|
||||
}
|
||||
|
||||
void Event_ClickClose(wxCommandEvent&);
|
||||
void Event_Close(wxCloseEvent&);
|
||||
|
||||
wxRadioButton* stc_safe;
|
||||
wxRadioButton* stc_normal;
|
||||
wxRadioButton* stc_fast;
|
||||
|
||||
SettingRadioButton* efbcopy_texture;
|
||||
SettingRadioButton* efbcopy_ram;
|
||||
SettingCheckBox* cache_efb_copies;
|
||||
|
||||
SettingRadioButton* virtual_xfb;
|
||||
SettingRadioButton* real_xfb;
|
||||
|
||||
VideoConfig &vconfig;
|
||||
std::string ininame;
|
||||
};
|
||||
|
||||
#endif
|
306
Source/Core/DolphinWX/resources/toolbar_add_breakpoint.c
Normal file
306
Source/Core/DolphinWX/resources/toolbar_add_breakpoint.c
Normal file
@ -0,0 +1,306 @@
|
||||
static const unsigned char toolbar_add_breakpoint_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00,
|
||||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
|
||||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b,
|
||||
0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00,
|
||||
0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
|
||||
0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69,
|
||||
0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20,
|
||||
0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00,
|
||||
0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31,
|
||||
0x30, 0x2f, 0x30, 0x34, 0xb6, 0xfa, 0x8a, 0x30, 0x00, 0x00, 0x0d, 0x8f,
|
||||
0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x9a, 0x7b, 0x70, 0x5c, 0xd5,
|
||||
0x79, 0xc0, 0x7f, 0xe7, 0xdc, 0x7b, 0xf7, 0xee, 0x43, 0x4f, 0x5b, 0x46,
|
||||
0xb2, 0x8d, 0xf1, 0x82, 0x4d, 0x31, 0x31, 0x83, 0xd7, 0x35, 0xa4, 0xc0,
|
||||
0x34, 0xb5, 0x30, 0x34, 0x9d, 0x90, 0x92, 0x38, 0x0d, 0x9d, 0x96, 0x86,
|
||||
0x26, 0xea, 0x3f, 0x5a, 0x13, 0xa7, 0x18, 0x93, 0xb4, 0x03, 0x34, 0xc4,
|
||||
0x32, 0xd3, 0xa6, 0xd3, 0x32, 0xc5, 0xf6, 0xd0, 0x92, 0xec, 0x86, 0x06,
|
||||
0x98, 0x4e, 0x4b, 0xa7, 0x21, 0x05, 0x3c, 0x93, 0xc4, 0x34, 0x0c, 0x96,
|
||||
0x0b, 0xc5, 0x6d, 0x20, 0xb0, 0x56, 0x81, 0xd6, 0xef, 0x15, 0x46, 0x92,
|
||||
0x1f, 0xb2, 0xb4, 0x5a, 0x69, 0x1f, 0x77, 0xef, 0xe3, 0xeb, 0x1f, 0x77,
|
||||
0x57, 0x96, 0xfc, 0x80, 0x64, 0xac, 0x94, 0xe9, 0x4c, 0xbf, 0x9d, 0x33,
|
||||
0x7b, 0x57, 0xf7, 0x9e, 0x7b, 0xbe, 0xdf, 0xf9, 0xbe, 0xf3, 0x9d, 0xef,
|
||||
0x9c, 0x23, 0x25, 0x22, 0xfc, 0x5f, 0x16, 0xfd, 0x51, 0x2b, 0x70, 0xb1,
|
||||
0x62, 0x7e, 0xd8, 0x03, 0x6a, 0x93, 0x4a, 0xa2, 0x59, 0x5f, 0x2f, 0x4b,
|
||||
0xd1, 0x24, 0xd1, 0x80, 0x26, 0x8f, 0x62, 0x1f, 0x9a, 0x7e, 0x34, 0x4f,
|
||||
0x49, 0x9f, 0x14, 0x7e, 0xf1, 0xea, 0x9e, 0x47, 0xbf, 0x0b, 0xb9, 0x90,
|
||||
0xfa, 0x8a, 0x6a, 0x43, 0xd3, 0x87, 0x66, 0x53, 0x5d, 0xe1, 0x33, 0x45,
|
||||
0x9d, 0xf5, 0x3b, 0x2c, 0x4f, 0xa3, 0xe9, 0x93, 0x3f, 0x91, 0xfc, 0xff,
|
||||
0x8a, 0xe6, 0x0d, 0x3d, 0xcf, 0x07, 0xa0, 0x36, 0xaa, 0x36, 0x34, 0xbb,
|
||||
0x51, 0xa4, 0xb0, 0x80, 0x76, 0x58, 0x71, 0xc5, 0x0a, 0x6e, 0x5c, 0x7e,
|
||||
0x03, 0xf3, 0xa3, 0xed, 0x58, 0x86, 0xc1, 0xc9, 0xa9, 0x93, 0xbc, 0x79,
|
||||
0xec, 0x0d, 0x0e, 0x0f, 0x1d, 0xa5, 0x58, 0xa8, 0x34, 0x20, 0x0a, 0x68,
|
||||
0xb6, 0xca, 0x03, 0xb2, 0xfd, 0x03, 0x1b, 0xfd, 0xb6, 0xea, 0x01, 0x72,
|
||||
0xb2, 0x41, 0x72, 0xbf, 0x28, 0x80, 0xb7, 0xd0, 0xa4, 0xb0, 0x61, 0xc5,
|
||||
0x9a, 0xab, 0xd8, 0xf6, 0x9b, 0xdb, 0x59, 0xd2, 0xbc, 0x04, 0x8d, 0xc6,
|
||||
0xc0, 0x40, 0xd7, 0x3f, 0x06, 0x06, 0xef, 0x4d, 0x1d, 0xe5, 0x07, 0xf9,
|
||||
0xef, 0x93, 0xdd, 0xf3, 0x14, 0xe3, 0x85, 0xa9, 0x06, 0x48, 0x3f, 0x9a,
|
||||
0xcf, 0xc9, 0x1f, 0xcd, 0x76, 0x2b, 0xf5, 0xd7, 0x2a, 0x89, 0xe6, 0x49,
|
||||
0x14, 0xdd, 0x28, 0x7a, 0x64, 0x83, 0x3c, 0x3d, 0xe7, 0x00, 0x6a, 0x83,
|
||||
0xda, 0x86, 0xe6, 0x5e, 0x2c, 0xf8, 0xcc, 0xed, 0x9f, 0xe1, 0xe1, 0x5b,
|
||||
0x1f, 0xc6, 0xc0, 0xe0, 0xa5, 0xfc, 0x8b, 0x1c, 0x2c, 0xbc, 0xc3, 0xa4,
|
||||
0x3f, 0x86, 0x6d, 0x46, 0xb0, 0x0c, 0x83, 0xcb, 0x9b, 0xaf, 0x64, 0xcd,
|
||||
0xbc, 0x9b, 0xb8, 0xba, 0x79, 0x15, 0xc3, 0xe5, 0x41, 0x1e, 0xdd, 0xf7,
|
||||
0xa7, 0x3c, 0xfb, 0xea, 0x8b, 0xd4, 0x7c, 0x0f, 0x34, 0x39, 0x34, 0x37,
|
||||
0xcb, 0xd7, 0x42, 0x08, 0xb5, 0x43, 0xf5, 0xa1, 0xd8, 0x82, 0x22, 0x74,
|
||||
0x41, 0xe8, 0x93, 0xaf, 0xc8, 0xd6, 0x39, 0x05, 0x50, 0x69, 0x95, 0x42,
|
||||
0xf1, 0x16, 0x1a, 0xae, 0x5b, 0xbb, 0x86, 0xec, 0xef, 0x7c, 0x87, 0x81,
|
||||
0x13, 0xfb, 0xd8, 0xf1, 0xd3, 0x47, 0xa8, 0xa9, 0x49, 0xda, 0xe2, 0x71,
|
||||
0xe2, 0xb6, 0x4d, 0xd4, 0xb2, 0xb0, 0x4c, 0x13, 0x53, 0x6b, 0xb4, 0xd6,
|
||||
0xcc, 0xb7, 0x16, 0x70, 0x5b, 0xe7, 0x9d, 0xdc, 0xd0, 0x7a, 0x2b, 0x4f,
|
||||
0x1e, 0x79, 0x94, 0x87, 0x7f, 0xb0, 0x8d, 0x62, 0xa9, 0x1c, 0x42, 0x28,
|
||||
0xb6, 0xa2, 0xd9, 0x82, 0x22, 0xd5, 0x1a, 0x6d, 0xe5, 0xf7, 0xaf, 0xff,
|
||||
0x3c, 0xff, 0xf4, 0xee, 0xb3, 0x9c, 0x2c, 0x14, 0xb7, 0xcb, 0x26, 0xd9,
|
||||
0x7c, 0xb1, 0x00, 0x67, 0x87, 0xd1, 0x6d, 0x08, 0x90, 0x80, 0xfb, 0x6e,
|
||||
0xfd, 0x2a, 0xbb, 0x0e, 0xff, 0x90, 0x07, 0xfe, 0xf5, 0x3e, 0x5c, 0x35,
|
||||
0xc9, 0xbc, 0xa6, 0x26, 0x9a, 0xa3, 0x51, 0x22, 0xe6, 0x99, 0xc0, 0x65,
|
||||
0x1a, 0x06, 0xf1, 0x48, 0x84, 0x9a, 0x39, 0xc5, 0xce, 0xd3, 0xdf, 0xe1,
|
||||
0x89, 0x91, 0x87, 0xb9, 0x2b, 0xb9, 0x91, 0x17, 0x7a, 0xfe, 0x91, 0xae,
|
||||
0xf6, 0x56, 0x08, 0x48, 0x11, 0xf0, 0x1c, 0x3e, 0xa9, 0x55, 0xf3, 0x57,
|
||||
0xb1, 0xf7, 0x8b, 0xaf, 0xf0, 0xb9, 0x6b, 0x7f, 0x9d, 0x98, 0x69, 0x83,
|
||||
0x47, 0xea, 0x62, 0x95, 0x9f, 0x05, 0xa0, 0xd2, 0x2a, 0x09, 0x74, 0x03,
|
||||
0xdc, 0x7e, 0xcb, 0xed, 0x94, 0xdc, 0x29, 0x76, 0xbc, 0xf1, 0x08, 0x2d,
|
||||
0xb1, 0x18, 0x2d, 0xf1, 0x38, 0x11, 0xd3, 0xa4, 0x52, 0x73, 0xc9, 0x1f,
|
||||
0x3c, 0xc9, 0xbf, 0xbf, 0x7c, 0x88, 0x57, 0x7e, 0xfc, 0x5f, 0x0c, 0xe4,
|
||||
0xde, 0x63, 0xac, 0x50, 0x02, 0x11, 0x2c, 0xd3, 0xe4, 0x7d, 0xef, 0x00,
|
||||
0xdb, 0x8e, 0xdf, 0xc3, 0x92, 0xe8, 0x15, 0x3c, 0x7b, 0xd7, 0x33, 0x2c,
|
||||
0x9c, 0xd7, 0x0e, 0x3e, 0xa4, 0x3a, 0x52, 0xbc, 0x72, 0xd7, 0x1e, 0x96,
|
||||
0x37, 0xad, 0xc0, 0xd0, 0x1a, 0xe5, 0x03, 0xde, 0x5c, 0xa8, 0x3f, 0xdb,
|
||||
0x02, 0x9b, 0x00, 0x94, 0x0d, 0xbf, 0x77, 0xfd, 0x9d, 0x3c, 0xfa, 0x1f,
|
||||
0x7f, 0x41, 0x53, 0x34, 0x4a, 0x73, 0x2c, 0x86, 0x65, 0x18, 0x4c, 0x95,
|
||||
0x2b, 0x1c, 0x7c, 0x7d, 0x84, 0x43, 0xfb, 0x8e, 0x73, 0xfa, 0x54, 0x91,
|
||||
0xd1, 0x53, 0x93, 0xfc, 0xf7, 0x3b, 0x43, 0xbc, 0xf4, 0xe2, 0x00, 0xaf,
|
||||
0xff, 0xf4, 0x30, 0xa5, 0x8a, 0x03, 0x80, 0x23, 0x15, 0xbe, 0x7b, 0xfa,
|
||||
0x61, 0x16, 0x45, 0x92, 0x3c, 0xb2, 0x7e, 0x2b, 0x1f, 0x5f, 0xb4, 0x86,
|
||||
0xfe, 0x2f, 0xbd, 0xcc, 0xa4, 0x1a, 0x65, 0x77, 0xed, 0xef, 0x59, 0xa4,
|
||||
0xae, 0xe4, 0xb2, 0xae, 0x05, 0xe0, 0x87, 0x9d, 0x35, 0x97, 0x00, 0xeb,
|
||||
0x01, 0x16, 0x2e, 0x5b, 0xc4, 0xab, 0xc7, 0x5e, 0x61, 0xd2, 0x2b, 0xd0,
|
||||
0x14, 0x8b, 0x11, 0x8f, 0x44, 0xa8, 0xb8, 0x2e, 0xef, 0xbd, 0x35, 0xca,
|
||||
0xc9, 0xa1, 0x22, 0x4e, 0xd5, 0x23, 0xf0, 0x04, 0xf1, 0x04, 0xaf, 0xe6,
|
||||
0x53, 0x9a, 0xac, 0xf2, 0xce, 0xc0, 0x31, 0x76, 0xbe, 0xf0, 0x3a, 0xc7,
|
||||
0x86, 0x4f, 0x53, 0xf3, 0x3c, 0xa6, 0xdc, 0x49, 0xb2, 0xa3, 0x5b, 0xb8,
|
||||
0xb1, 0xfd, 0x16, 0x76, 0x7d, 0x71, 0x17, 0xb9, 0x5a, 0x3f, 0xdf, 0x2e,
|
||||
0xdc, 0xcf, 0x81, 0xf2, 0x00, 0xae, 0x78, 0x78, 0xae, 0x3f, 0xb7, 0x16,
|
||||
0xa8, 0xbb, 0x4f, 0x12, 0xe0, 0xfa, 0xab, 0xd7, 0xf0, 0xf2, 0xe0, 0xbf,
|
||||
0x90, 0xb0, 0x6d, 0x9a, 0x6c, 0x1b, 0xad, 0x14, 0x85, 0x91, 0x12, 0x85,
|
||||
0xe3, 0x65, 0xbc, 0x9a, 0x0f, 0x01, 0xb3, 0x8a, 0xf8, 0xe0, 0x3a, 0x3e,
|
||||
0xe3, 0x63, 0x25, 0x76, 0xfd, 0xf0, 0x2d, 0x06, 0xde, 0x1e, 0xa4, 0xe2,
|
||||
0xba, 0x4c, 0xd4, 0x8a, 0x3c, 0x33, 0xba, 0x83, 0x17, 0x0a, 0x7f, 0xcb,
|
||||
0x3f, 0x9f, 0x7e, 0x82, 0xc9, 0x72, 0x99, 0xc3, 0x53, 0xfb, 0xd1, 0xd8,
|
||||
0x61, 0x10, 0xf2, 0x41, 0x7d, 0x43, 0x5d, 0xf4, 0x38, 0x68, 0x58, 0x60,
|
||||
0x2d, 0x80, 0x52, 0xa0, 0x62, 0x9a, 0x49, 0x77, 0x9c, 0x44, 0x34, 0x4a,
|
||||
0xdc, 0xb6, 0x11, 0xa0, 0x34, 0x5a, 0xc5, 0x75, 0x3c, 0xf0, 0x81, 0x80,
|
||||
0x1c, 0x3e, 0xc9, 0xcc, 0xb6, 0x5e, 0x95, 0xf9, 0xab, 0x5e, 0x85, 0x4f,
|
||||
0x1f, 0x3e, 0x85, 0xc0, 0x15, 0x9c, 0x8a, 0xcb, 0x4f, 0x5e, 0x3b, 0xc4,
|
||||
0xde, 0xd7, 0xf6, 0xe3, 0xd4, 0x6a, 0xe4, 0x4b, 0x87, 0xf8, 0xb7, 0xf1,
|
||||
0x1f, 0x53, 0xaa, 0x56, 0x99, 0x74, 0x1c, 0x8a, 0x95, 0x0a, 0x45, 0xb7,
|
||||
0x40, 0xa2, 0xc9, 0x0e, 0x2d, 0xe0, 0xd3, 0x7a, 0xb1, 0x00, 0x8d, 0x90,
|
||||
0x12, 0xf6, 0x44, 0xb3, 0x62, 0xb4, 0x7c, 0x82, 0x98, 0x6d, 0x93, 0xb0,
|
||||
0x6d, 0x62, 0x91, 0x08, 0x8e, 0xeb, 0xe2, 0x4c, 0xb8, 0xf8, 0x6e, 0x3d,
|
||||
0xdc, 0x0a, 0x7d, 0xf2, 0x2d, 0x19, 0x9c, 0x7e, 0xc3, 0x36, 0xb6, 0xa6,
|
||||
0x37, 0x65, 0xb7, 0xa3, 0xc8, 0x21, 0x24, 0x03, 0x84, 0x53, 0xc3, 0x93,
|
||||
0x14, 0x27, 0x2a, 0xb4, 0xb4, 0xc6, 0x08, 0x82, 0x00, 0x3f, 0x08, 0xf0,
|
||||
0x7d, 0x9f, 0x40, 0x84, 0x11, 0x67, 0x88, 0x8a, 0x53, 0x6b, 0xb8, 0x50,
|
||||
0x12, 0xd8, 0x73, 0x31, 0x00, 0x0d, 0x0b, 0xa4, 0x00, 0x94, 0x52, 0xe4,
|
||||
0x27, 0x8e, 0x10, 0xb5, 0x2c, 0xe2, 0x91, 0x08, 0xb6, 0x65, 0x21, 0x80,
|
||||
0x37, 0xe5, 0x23, 0x22, 0x20, 0x90, 0xf9, 0x56, 0xef, 0x0b, 0x8d, 0xca,
|
||||
0x59, 0xd2, 0xe1, 0x85, 0xcf, 0x76, 0x15, 0x90, 0x34, 0x95, 0xc1, 0xc2,
|
||||
0x85, 0xed, 0xfc, 0xda, 0x6f, 0xac, 0xa0, 0xbd, 0x3d, 0x81, 0x69, 0x18,
|
||||
0x28, 0xa5, 0x10, 0x11, 0xdc, 0x20, 0xa0, 0xea, 0xba, 0x1c, 0x99, 0xda,
|
||||
0xcf, 0x82, 0xa6, 0x4e, 0x54, 0x00, 0xf8, 0xa1, 0xdb, 0x5e, 0x8c, 0x34,
|
||||
0x2c, 0xd0, 0x06, 0xa0, 0x9b, 0xe1, 0xd2, 0x96, 0xc5, 0x78, 0x56, 0x91,
|
||||
0x68, 0x24, 0x42, 0xc4, 0x34, 0xd1, 0x4a, 0x11, 0x04, 0x17, 0x7e, 0x41,
|
||||
0x7a, 0x43, 0xb6, 0x47, 0x69, 0x7a, 0x4c, 0xc3, 0x60, 0xc9, 0xf2, 0x0e,
|
||||
0x56, 0x5e, 0x77, 0x29, 0x2d, 0x89, 0x38, 0xb6, 0x65, 0x11, 0x88, 0x84,
|
||||
0xca, 0xd7, 0x21, 0x3c, 0xdf, 0xe7, 0x50, 0xf1, 0x00, 0xf3, 0x12, 0x0b,
|
||||
0x42, 0x0b, 0x48, 0xd8, 0xee, 0x5c, 0x00, 0x4c, 0x5b, 0xa0, 0xea, 0x57,
|
||||
0x88, 0xc7, 0x4c, 0x6c, 0xd3, 0xc4, 0x32, 0x8c, 0xfa, 0x6c, 0x7b, 0x01,
|
||||
0xe5, 0xd3, 0xd9, 0x6e, 0xe0, 0x49, 0x02, 0x45, 0xeb, 0xe5, 0x09, 0xe6,
|
||||
0x5d, 0x99, 0xc0, 0x27, 0xa0, 0xe4, 0x38, 0x78, 0x41, 0x50, 0x87, 0x0f,
|
||||
0xc2, 0x22, 0x82, 0x17, 0x04, 0x1c, 0x2a, 0x1e, 0xa4, 0xc3, 0x5a, 0x0c,
|
||||
0x9e, 0x02, 0x91, 0xf3, 0x0e, 0xe2, 0x69, 0xcb, 0xce, 0x90, 0x5e, 0x32,
|
||||
0x1f, 0x08, 0x10, 0x8a, 0x52, 0x8c, 0x56, 0x4f, 0x71, 0x45, 0x6b, 0x27,
|
||||
0x96, 0x61, 0x84, 0x00, 0xa6, 0x89, 0x19, 0x33, 0x50, 0x13, 0x61, 0x2f,
|
||||
0x4e, 0x3f, 0x9a, 0x56, 0x29, 0xe0, 0xb9, 0xf0, 0x97, 0x30, 0x71, 0xa4,
|
||||
0xc4, 0xa1, 0x09, 0x8f, 0x91, 0xe6, 0x02, 0x89, 0x76, 0x1b, 0x3b, 0x62,
|
||||
0x11, 0x6f, 0x8b, 0x60, 0x18, 0x06, 0x66, 0xdc, 0x00, 0x25, 0xd4, 0x3c,
|
||||
0x8f, 0x8a, 0xeb, 0x12, 0x4f, 0xcc, 0x27, 0x92, 0x30, 0x70, 0x26, 0xce,
|
||||
0x8d, 0xa5, 0x59, 0xd2, 0xa4, 0x37, 0x66, 0xdb, 0x08, 0x58, 0x8f, 0x90,
|
||||
0x44, 0x28, 0x00, 0xfd, 0x64, 0xc8, 0x9d, 0x0f, 0x44, 0x89, 0x08, 0x2a,
|
||||
0xad, 0x04, 0x20, 0x72, 0x99, 0x49, 0xd7, 0xd5, 0x6d, 0x2c, 0xeb, 0xec,
|
||||
0x64, 0x49, 0x47, 0x07, 0x09, 0xdb, 0x66, 0x78, 0x6c, 0x8c, 0xd7, 0x5f,
|
||||
0x3e, 0xcc, 0xf1, 0xc3, 0x13, 0x04, 0xa1, 0x2f, 0xad, 0x06, 0xf2, 0xc0,
|
||||
0x6e, 0x98, 0x9d, 0x0e, 0x28, 0xa5, 0x50, 0x4a, 0xa1, 0xf5, 0xec, 0x6f,
|
||||
0x15, 0x26, 0x6f, 0xe8, 0xa8, 0x02, 0x53, 0xe1, 0x2b, 0x1f, 0xb7, 0xe8,
|
||||
0xe1, 0x57, 0x05, 0xc9, 0x88, 0x9a, 0xa5, 0xfc, 0xa6, 0x6c, 0x8a, 0x80,
|
||||
0xe7, 0x14, 0x24, 0x15, 0x0a, 0xf1, 0x01, 0x11, 0x24, 0xa0, 0x1f, 0xd8,
|
||||
0x9a, 0xc9, 0xf4, 0xf6, 0xcf, 0x84, 0x98, 0x0d, 0xb0, 0xd8, 0xa4, 0xf3,
|
||||
0x9a, 0x36, 0xae, 0xec, 0xea, 0x62, 0x69, 0x47, 0x07, 0x4d, 0xb1, 0x18,
|
||||
0xa7, 0x8a, 0x45, 0xde, 0xd8, 0x7b, 0x98, 0xc1, 0xdc, 0x29, 0x5c, 0xd7,
|
||||
0x07, 0xe8, 0x96, 0x8c, 0xec, 0x51, 0x69, 0xb5, 0x94, 0x30, 0x8a, 0xa4,
|
||||
0x08, 0xc7, 0x50, 0x77, 0xfd, 0xfb, 0x82, 0xb1, 0x5d, 0xa9, 0x33, 0xd7,
|
||||
0x0d, 0x63, 0xce, 0x04, 0x50, 0x5f, 0x55, 0x29, 0x02, 0x76, 0x2b, 0x54,
|
||||
0x5b, 0x34, 0x66, 0x11, 0x9d, 0x1f, 0x41, 0x5c, 0xa1, 0x7a, 0xb2, 0x46,
|
||||
0xcd, 0x09, 0x27, 0x50, 0x60, 0x87, 0x64, 0xe4, 0xde, 0x46, 0x9d, 0x86,
|
||||
0x0b, 0xe5, 0x81, 0xa4, 0x94, 0x05, 0x09, 0x02, 0x04, 0x50, 0x5a, 0x63,
|
||||
0x6a, 0x4d, 0xc2, 0xb6, 0x69, 0xee, 0x88, 0x61, 0x18, 0xc6, 0x34, 0x00,
|
||||
0xb0, 0x47, 0x32, 0x32, 0x08, 0x0c, 0x72, 0x26, 0x0c, 0x4e, 0xa7, 0xc6,
|
||||
0x33, 0xe0, 0x1a, 0x25, 0x05, 0xb4, 0x89, 0x9c, 0x9b, 0x3e, 0xa8, 0xb4,
|
||||
0x4a, 0x49, 0x46, 0x72, 0x59, 0xd2, 0xa0, 0x79, 0x52, 0x69, 0xda, 0x6c,
|
||||
0xcb, 0x62, 0xd1, 0xea, 0x79, 0x74, 0x5e, 0xd2, 0x8a, 0x88, 0x30, 0x3a,
|
||||
0x56, 0xe4, 0xf8, 0x3b, 0x13, 0x94, 0x8e, 0x3b, 0x04, 0x5e, 0xb0, 0x49,
|
||||
0xa5, 0x55, 0xab, 0x64, 0xe4, 0x0f, 0xce, 0x05, 0xa8, 0x0a, 0xbe, 0x08,
|
||||
0x41, 0x10, 0x20, 0x22, 0x28, 0xa5, 0x88, 0x47, 0x22, 0xb4, 0xce, 0x8f,
|
||||
0x11, 0x89, 0x18, 0x38, 0x0e, 0x88, 0x90, 0xca, 0x92, 0xbe, 0xe0, 0xa0,
|
||||
0xaa, 0xf7, 0xea, 0xd9, 0x70, 0x33, 0x15, 0x6e, 0xad, 0x03, 0x35, 0xe0,
|
||||
0xc6, 0x01, 0xd2, 0x0f, 0x64, 0xd7, 0x62, 0x90, 0x52, 0x28, 0x12, 0x0b,
|
||||
0x6d, 0x96, 0x2c, 0x9c, 0xc7, 0x65, 0x0b, 0x16, 0x20, 0x22, 0xb4, 0xc4,
|
||||
0xe3, 0x04, 0x26, 0x8c, 0xe8, 0x31, 0x2a, 0x43, 0x35, 0x24, 0xa0, 0x47,
|
||||
0xa5, 0xd5, 0x66, 0xc9, 0x48, 0xa1, 0x01, 0x90, 0x03, 0xba, 0x03, 0x07,
|
||||
0x6a, 0x8e, 0x47, 0xb5, 0x56, 0xa3, 0xe6, 0xba, 0xb8, 0x9e, 0x87, 0x00,
|
||||
0xb6, 0x1d, 0x21, 0xd2, 0x6e, 0xc2, 0xa4, 0x02, 0xce, 0x1f, 0x39, 0x7e,
|
||||
0x56, 0x91, 0x8c, 0x4c, 0xd4, 0xc1, 0x66, 0xc3, 0x69, 0xf2, 0x48, 0xe3,
|
||||
0x52, 0x11, 0x8d, 0x44, 0x68, 0x8e, 0xc5, 0x50, 0x80, 0x1f, 0x04, 0x14,
|
||||
0x9a, 0x9a, 0x28, 0x2c, 0x2d, 0x51, 0x3d, 0xee, 0x21, 0x12, 0x80, 0xf0,
|
||||
0x59, 0xe0, 0xe9, 0x46, 0x80, 0xcc, 0x01, 0x88, 0x04, 0x54, 0x8e, 0x38,
|
||||
0x9c, 0x9e, 0x9a, 0x62, 0xac, 0x54, 0x62, 0xa2, 0x52, 0x61, 0xaa, 0x5a,
|
||||
0xa5, 0xe6, 0xba, 0x88, 0x35, 0xed, 0xc3, 0xc9, 0x74, 0x3a, 0x9b, 0xbc,
|
||||
0x18, 0x88, 0xf3, 0x49, 0xe6, 0xcf, 0x7a, 0x07, 0xd1, 0xe4, 0x45, 0x09,
|
||||
0x4e, 0xd1, 0xc3, 0xa9, 0xb9, 0x68, 0x20, 0x62, 0x9a, 0xd8, 0x96, 0x15,
|
||||
0xce, 0x4b, 0xb6, 0x89, 0x8e, 0x42, 0x7d, 0x55, 0x97, 0x82, 0x33, 0x2e,
|
||||
0xf4, 0x7c, 0x08, 0x00, 0xd5, 0x11, 0x8f, 0x93, 0xba, 0x88, 0x89, 0x66,
|
||||
0xb2, 0x52, 0x41, 0x6b, 0xcd, 0xf1, 0x53, 0x05, 0x2a, 0x27, 0x6a, 0x33,
|
||||
0xc3, 0xe8, 0x52, 0x20, 0xaf, 0xfe, 0x52, 0x25, 0xd1, 0xf4, 0xa0, 0xc8,
|
||||
0xd7, 0x4b, 0x2e, 0xb3, 0xb9, 0xf7, 0x43, 0xb7, 0x57, 0xce, 0xe7, 0x7e,
|
||||
0xbd, 0x64, 0x48, 0xab, 0x6c, 0x4e, 0x20, 0x59, 0xf3, 0x3c, 0x26, 0x0a,
|
||||
0x15, 0x2a, 0x0b, 0xdd, 0xe9, 0xd9, 0x5c, 0x6b, 0x8d, 0xa1, 0x14, 0xca,
|
||||
0x56, 0x50, 0x3e, 0x0b, 0x40, 0x32, 0x32, 0xa1, 0xd2, 0xea, 0x29, 0xa0,
|
||||
0x27, 0x08, 0x02, 0xa6, 0x86, 0xaa, 0xbc, 0x37, 0x3e, 0xca, 0xa9, 0xce,
|
||||
0x22, 0xca, 0xd6, 0x54, 0x86, 0x1d, 0xaa, 0xa5, 0x5a, 0x23, 0x72, 0xe4,
|
||||
0x24, 0x23, 0xa1, 0xf9, 0x0d, 0x5a, 0x51, 0x6c, 0x69, 0x6c, 0xb5, 0x28,
|
||||
0x05, 0xe9, 0xc7, 0xb2, 0x10, 0xba, 0x47, 0x01, 0x21, 0x87, 0x90, 0x47,
|
||||
0xc8, 0x13, 0x90, 0xcf, 0xdc, 0xd7, 0x9b, 0x87, 0xd9, 0x13, 0xd5, 0x2c,
|
||||
0x18, 0x4d, 0x8e, 0x80, 0xf5, 0x7e, 0xe0, 0x33, 0x59, 0xac, 0x50, 0x72,
|
||||
0x1c, 0x62, 0x91, 0x48, 0x38, 0x1e, 0x09, 0x03, 0x8b, 0xb2, 0x55, 0xc3,
|
||||
0x02, 0x49, 0x38, 0x77, 0x4d, 0xbc, 0x0d, 0xb8, 0x17, 0xc2, 0x98, 0x6e,
|
||||
0x18, 0xe1, 0x93, 0xe1, 0x6c, 0x2a, 0x00, 0x05, 0xc2, 0x30, 0xba, 0x6f,
|
||||
0xba, 0xce, 0x76, 0x25, 0x4a, 0x83, 0xb6, 0x34, 0x86, 0xa1, 0xc3, 0xb8,
|
||||
0x5f, 0xbf, 0x27, 0x02, 0xe2, 0x0b, 0x12, 0x08, 0x81, 0x2f, 0xe1, 0xb5,
|
||||
0x2f, 0x39, 0x09, 0x98, 0x40, 0xe8, 0x27, 0xa0, 0x40, 0x40, 0x8e, 0x80,
|
||||
0xbc, 0x3c, 0x24, 0x79, 0xb5, 0x45, 0xad, 0x25, 0xa0, 0x5f, 0xa3, 0x59,
|
||||
0xb8, 0xb8, 0x8d, 0xeb, 0x7e, 0x65, 0x19, 0x8b, 0xdb, 0xdb, 0x29, 0x39,
|
||||
0x0e, 0xef, 0x8d, 0x8e, 0x72, 0xe8, 0xc4, 0x09, 0x4e, 0x1c, 0x2c, 0x50,
|
||||
0x3b, 0xe6, 0x85, 0xa9, 0xfc, 0xe3, 0xa2, 0x66, 0xcd, 0xc4, 0x92, 0x91,
|
||||
0xcd, 0x2a, 0xad, 0x9e, 0x07, 0xfa, 0x44, 0xa4, 0xdb, 0xf3, 0x66, 0xed,
|
||||
0x58, 0xe4, 0x81, 0xf5, 0x33, 0x95, 0x0f, 0x09, 0xc0, 0x30, 0x35, 0xdd,
|
||||
0x57, 0x7d, 0x82, 0xc3, 0x13, 0xef, 0x12, 0xb3, 0x6d, 0x22, 0xa6, 0x19,
|
||||
0x8e, 0x47, 0x01, 0xd7, 0xf5, 0x71, 0x3d, 0x8f, 0xaa, 0xe3, 0x52, 0xad,
|
||||
0xba, 0x54, 0x2a, 0x4e, 0xaa, 0x5a, 0xae, 0xe1, 0xbb, 0xc1, 0xda, 0x19,
|
||||
0x6f, 0xcf, 0xa9, 0xad, 0xaa, 0x1b, 0x28, 0xa0, 0x40, 0x24, 0x4c, 0xcd,
|
||||
0xab, 0xae, 0x8b, 0x1b, 0x04, 0x78, 0xf5, 0x54, 0x64, 0xd6, 0x0e, 0x4a,
|
||||
0xbd, 0x97, 0xce, 0xd9, 0x5a, 0x94, 0x8c, 0xec, 0xc9, 0x92, 0xbe, 0x39,
|
||||
0x9d, 0xce, 0xae, 0xe2, 0xcc, 0xe4, 0x94, 0x07, 0x9e, 0xaf, 0x47, 0x90,
|
||||
0xb3, 0x2a, 0xd0, 0xef, 0xfb, 0xd2, 0x1d, 0x8f, 0x44, 0x68, 0x49, 0x24,
|
||||
0x68, 0x8e, 0x46, 0x69, 0x8a, 0x46, 0xc3, 0x41, 0x67, 0x18, 0x98, 0x86,
|
||||
0x41, 0x20, 0x82, 0xe3, 0xba, 0x14, 0xcb, 0x65, 0x4e, 0x4e, 0x4c, 0x30,
|
||||
0x74, 0x62, 0x9c, 0xf1, 0x93, 0xa5, 0x90, 0x30, 0xb4, 0x6a, 0x8f, 0x6c,
|
||||
0x91, 0x89, 0x2c, 0xe9, 0x7d, 0xe9, 0x87, 0xb2, 0x48, 0x20, 0x78, 0x8e,
|
||||
0x8f, 0xe7, 0x79, 0x78, 0x9e, 0x87, 0xeb, 0xfb, 0x78, 0xf5, 0x74, 0x7c,
|
||||
0x1a, 0x42, 0x2e, 0x00, 0x00, 0xa1, 0x5f, 0xf6, 0x66, 0x32, 0xfb, 0x80,
|
||||
0x7d, 0xe7, 0xbb, 0x3f, 0x4b, 0x82, 0xf0, 0x6d, 0x51, 0xcb, 0x66, 0x55,
|
||||
0xc7, 0x6a, 0x06, 0xcb, 0xfb, 0xd1, 0x4a, 0x61, 0x6a, 0x4d, 0xb4, 0x9e,
|
||||
0x92, 0x6b, 0xa5, 0xc2, 0x75, 0x85, 0xeb, 0x32, 0x59, 0xa8, 0x32, 0x79,
|
||||
0xba, 0x0a, 0x41, 0x98, 0x9e, 0x23, 0xac, 0x97, 0x87, 0x42, 0xab, 0xf6,
|
||||
0x92, 0x21, 0x4d, 0x36, 0x7c, 0xad, 0x1f, 0x26, 0x7f, 0xae, 0xef, 0x53,
|
||||
0x73, 0x5d, 0x6a, 0x75, 0x88, 0xce, 0x96, 0x2e, 0xde, 0x67, 0x68, 0xba,
|
||||
0xf9, 0x8b, 0xdf, 0x9d, 0x0e, 0x57, 0x68, 0x38, 0x6e, 0x99, 0xe5, 0xad,
|
||||
0x57, 0x61, 0x1a, 0x06, 0xa2, 0x14, 0x7e, 0x3d, 0x7d, 0xf6, 0x3c, 0x0f,
|
||||
0xc7, 0x75, 0x99, 0x28, 0x95, 0x79, 0xf7, 0xc0, 0x10, 0x43, 0xc3, 0xe3,
|
||||
0x78, 0x35, 0x0f, 0x09, 0x97, 0xa4, 0x3d, 0x99, 0xaf, 0xf7, 0x4e, 0xcf,
|
||||
0x07, 0x59, 0xd2, 0x0d, 0x28, 0x54, 0x7d, 0xec, 0x39, 0x9e, 0x47, 0xb5,
|
||||
0x0e, 0xef, 0xfa, 0x3e, 0x09, 0xbf, 0xa9, 0xf1, 0x4c, 0x6e, 0x6e, 0x00,
|
||||
0x7c, 0x0a, 0xe2, 0xc3, 0x60, 0xf1, 0x08, 0x97, 0xc6, 0x17, 0x87, 0x6e,
|
||||
0x03, 0x20, 0x82, 0xef, 0xfb, 0x38, 0x9e, 0xc7, 0x58, 0xb1, 0xc4, 0x9b,
|
||||
0x6f, 0x1f, 0x65, 0x68, 0x64, 0x0c, 0xcf, 0x99, 0x56, 0xfe, 0xa9, 0xcc,
|
||||
0xd7, 0x7b, 0x9f, 0x3e, 0x27, 0xa4, 0x06, 0xa0, 0x44, 0x61, 0x46, 0x42,
|
||||
0xd5, 0x6a, 0xae, 0x4b, 0xd9, 0x71, 0xa8, 0xd6, 0x6a, 0xac, 0x9c, 0x7f,
|
||||
0x0d, 0x07, 0x86, 0x0e, 0x34, 0x00, 0x0a, 0x73, 0x05, 0x90, 0xc7, 0x83,
|
||||
0x98, 0x15, 0x61, 0x59, 0xf3, 0x55, 0xc4, 0x6c, 0x1b, 0xdb, 0xb6, 0xb1,
|
||||
0x4c, 0x13, 0xad, 0xc3, 0xa8, 0x14, 0x8d, 0x84, 0xeb, 0x8b, 0xfa, 0x9a,
|
||||
0x3a, 0xac, 0xe3, 0xb3, 0x19, 0xce, 0x84, 0xd4, 0x2c, 0x69, 0xd2, 0x0f,
|
||||
0x66, 0x3f, 0x4b, 0x00, 0x5a, 0x29, 0x22, 0x71, 0x0b, 0xa5, 0x35, 0x95,
|
||||
0x3a, 0x40, 0xb9, 0x56, 0xe3, 0xf2, 0xb6, 0xe5, 0x30, 0x25, 0x73, 0x6c,
|
||||
0x01, 0x8f, 0x3c, 0x3e, 0x04, 0xae, 0xd0, 0x62, 0xb6, 0xd1, 0x1c, 0x8b,
|
||||
0xd1, 0x5c, 0x5f, 0x53, 0x5f, 0xd3, 0xba, 0x9a, 0xae, 0xf8, 0x22, 0x9a,
|
||||
0x62, 0x51, 0x6e, 0x5c, 0x73, 0x15, 0x2b, 0x97, 0x5f, 0x4a, 0x44, 0x9b,
|
||||
0xa8, 0x40, 0x25, 0xf1, 0x39, 0x9a, 0x7e, 0x28, 0xdb, 0x37, 0xad, 0xfc,
|
||||
0x03, 0xd9, 0x24, 0x01, 0x7d, 0x4a, 0xc0, 0x32, 0x4c, 0x5a, 0x3a, 0x62,
|
||||
0x68, 0xa0, 0xec, 0x38, 0x4c, 0x39, 0x0e, 0x95, 0x5a, 0x8d, 0x84, 0x4a,
|
||||
0xd4, 0xd3, 0x6b, 0xa0, 0x9e, 0x3d, 0x7c, 0xe8, 0x01, 0xc7, 0x87, 0x8a,
|
||||
0x1f, 0x9a, 0xd2, 0xad, 0x7a, 0xf8, 0xd4, 0x58, 0xd2, 0xb4, 0x84, 0x62,
|
||||
0x70, 0x9a, 0x75, 0x2d, 0x77, 0xb0, 0xae, 0xe5, 0x0e, 0x86, 0x6b, 0x47,
|
||||
0x79, 0xe2, 0xc4, 0x56, 0x2a, 0x41, 0x89, 0x1b, 0xd6, 0xfc, 0x12, 0x8b,
|
||||
0x3a, 0xdb, 0xd9, 0xbb, 0xf7, 0x00, 0x93, 0x93, 0x95, 0x36, 0x3f, 0x08,
|
||||
0xb6, 0xa4, 0x1f, 0xc8, 0x6e, 0x69, 0xf8, 0x3d, 0x01, 0x68, 0xad, 0x69,
|
||||
0x6b, 0x8f, 0x33, 0xaf, 0xb3, 0x89, 0x00, 0x28, 0x55, 0xab, 0x94, 0x1c,
|
||||
0x87, 0xee, 0xcb, 0x6e, 0x65, 0xe8, 0xc4, 0x70, 0x3d, 0x68, 0x00, 0xd0,
|
||||
0x0f, 0x73, 0x60, 0x01, 0xd9, 0x2a, 0xfb, 0xf0, 0xc1, 0x52, 0x06, 0x11,
|
||||
0x6d, 0xf2, 0xb1, 0xa6, 0x14, 0x1b, 0x3a, 0xb7, 0x72, 0x53, 0xfc, 0xd3,
|
||||
0x6c, 0xda, 0xf9, 0x87, 0x1c, 0x73, 0xf6, 0xd3, 0xd3, 0x79, 0x3f, 0x51,
|
||||
0xcb, 0x22, 0x66, 0x59, 0x2c, 0x4f, 0x2e, 0xe4, 0xf6, 0xdb, 0xd6, 0xb0,
|
||||
0x2c, 0xd9, 0x45, 0xcc, 0xb2, 0x31, 0xd1, 0xa8, 0x00, 0x54, 0x00, 0x96,
|
||||
0x36, 0x68, 0x6f, 0x49, 0xb0, 0xe4, 0x63, 0x1d, 0xc4, 0x22, 0x11, 0xaa,
|
||||
0xae, 0xcb, 0x64, 0xb5, 0x8a, 0x0e, 0x4c, 0xee, 0xb8, 0xfa, 0xb7, 0xe9,
|
||||
0x7f, 0x6d, 0x77, 0xa3, 0xd9, 0x7c, 0x3d, 0xe3, 0x9d, 0x03, 0x0b, 0x00,
|
||||
0x78, 0x30, 0x36, 0x3a, 0xc5, 0xb0, 0x77, 0x90, 0xf5, 0x2d, 0x77, 0x53,
|
||||
0xf5, 0xca, 0x74, 0x3f, 0xbe, 0x8e, 0x81, 0x91, 0x01, 0x76, 0x1d, 0xd9,
|
||||
0xc9, 0xf7, 0x7b, 0x9f, 0x61, 0xe3, 0x25, 0x8f, 0xf0, 0xdd, 0xd3, 0x7d,
|
||||
0x94, 0xfd, 0x12, 0xf3, 0xda, 0x9a, 0x59, 0xb7, 0xee, 0x1a, 0x46, 0x46,
|
||||
0xc6, 0x39, 0xb0, 0x7f, 0x84, 0xe1, 0xc1, 0x71, 0x10, 0xe8, 0x5c, 0xda,
|
||||
0xca, 0xa2, 0xe5, 0xed, 0x44, 0x22, 0x26, 0x15, 0xd7, 0x0d, 0xf7, 0x93,
|
||||
0xaa, 0x55, 0xee, 0xf9, 0xe5, 0xaf, 0xd1, 0xbf, 0xbf, 0x9f, 0xc9, 0xb1,
|
||||
0xa9, 0x46, 0x8b, 0xcf, 0x37, 0x2e, 0xe6, 0x06, 0xc0, 0xa7, 0xdf, 0xa9,
|
||||
0x78, 0xdd, 0x86, 0xd6, 0x54, 0xbc, 0x12, 0x37, 0x3f, 0x76, 0x0b, 0x03,
|
||||
0x23, 0x03, 0x20, 0x30, 0x32, 0x34, 0xce, 0xe7, 0x1f, 0xff, 0x5d, 0xbe,
|
||||
0x77, 0xf7, 0x3f, 0xd0, 0x33, 0xef, 0x21, 0x9e, 0x1d, 0x7b, 0x9c, 0xa1,
|
||||
0xda, 0x51, 0x0c, 0xad, 0xe9, 0xea, 0x6a, 0xa3, 0x6d, 0x7e, 0x82, 0xea,
|
||||
0xf5, 0x2e, 0x35, 0xcf, 0x9b, 0xde, 0x43, 0x2a, 0xd7, 0x6a, 0x94, 0x2a,
|
||||
0x15, 0x8a, 0x95, 0x0a, 0x9b, 0xd7, 0xfc, 0x31, 0x37, 0x2d, 0xf9, 0x55,
|
||||
0x6e, 0xfb, 0xbb, 0xdb, 0x66, 0xb6, 0x38, 0x7d, 0x02, 0x34, 0x37, 0xa7,
|
||||
0x94, 0x5e, 0xb8, 0xc5, 0xb8, 0xf7, 0xe0, 0x4f, 0xe8, 0xde, 0xbe, 0x8e,
|
||||
0x81, 0x63, 0x03, 0x8d, 0x9d, 0x37, 0xf0, 0x61, 0x64, 0xa8, 0xc0, 0x6f,
|
||||
0x3d, 0x76, 0x27, 0x6f, 0x8e, 0xbf, 0xc6, 0xdd, 0x9d, 0x7f, 0xce, 0x27,
|
||||
0x5b, 0xee, 0x42, 0x79, 0x16, 0x8e, 0xe7, 0x21, 0x22, 0x18, 0x5a, 0x63,
|
||||
0x68, 0x4d, 0x20, 0x42, 0xd9, 0x71, 0x28, 0x96, 0xcb, 0xb8, 0x9e, 0xc1,
|
||||
0x83, 0x1f, 0xdf, 0xca, 0xa7, 0x96, 0x7d, 0x9a, 0x2d, 0x3f, 0xfa, 0x06,
|
||||
0x53, 0xc7, 0xa7, 0x7b, 0xbf, 0xbf, 0xe1, 0x3e, 0xf0, 0x01, 0x87, 0x7c,
|
||||
0x3f, 0x8f, 0xa8, 0x7b, 0xce, 0x24, 0x81, 0x33, 0x24, 0x07, 0x6c, 0x21,
|
||||
0x5c, 0x6a, 0xa6, 0x10, 0xb0, 0xa3, 0x26, 0x1b, 0xbf, 0xf0, 0x05, 0xee,
|
||||
0x5e, 0x79, 0x3f, 0x6d, 0x56, 0x07, 0xaf, 0x8d, 0xbf, 0xc4, 0xfe, 0xc9,
|
||||
0x7d, 0x9c, 0x70, 0x8e, 0xf3, 0xf6, 0xd8, 0x5b, 0x2c, 0xb0, 0x2e, 0x45,
|
||||
0x89, 0xc5, 0x8d, 0x97, 0xdc, 0xcc, 0x75, 0x5d, 0x37, 0x12, 0xb7, 0xe2,
|
||||
0x3c, 0xb8, 0xfb, 0x41, 0x76, 0x7e, 0x6f, 0x67, 0xd8, 0x19, 0xa1, 0xa4,
|
||||
0x66, 0x25, 0x93, 0x73, 0x02, 0xf0, 0x65, 0xb5, 0x05, 0xe8, 0x0b, 0x7f,
|
||||
0x00, 0xd0, 0x27, 0x7f, 0x13, 0x1e, 0x1f, 0xa9, 0x2f, 0xab, 0x56, 0xc2,
|
||||
0x88, 0x91, 0x6a, 0xe4, 0x2f, 0x2b, 0xaf, 0xbd, 0x82, 0x8d, 0x9f, 0xda,
|
||||
0xc0, 0x27, 0x16, 0x7e, 0x92, 0x76, 0xbb, 0x83, 0x80, 0x00, 0x1f, 0x7f,
|
||||
0xd6, 0xf7, 0xfb, 0x53, 0xc7, 0xf8, 0xe6, 0xab, 0xdf, 0xe4, 0xe5, 0x5d,
|
||||
0xbb, 0xa1, 0x32, 0xdd, 0xd4, 0x76, 0xc9, 0xcc, 0x3e, 0xd5, 0x99, 0x1b,
|
||||
0x80, 0xb4, 0xfa, 0x12, 0xf0, 0x54, 0x5d, 0xd1, 0x9e, 0x99, 0x26, 0xae,
|
||||
0xdf, 0x6f, 0x25, 0x1c, 0x78, 0xdd, 0x33, 0xff, 0xde, 0xb5, 0xac, 0x8d,
|
||||
0xd5, 0x2b, 0xaf, 0x65, 0xed, 0x8a, 0x75, 0xb8, 0xbe, 0x47, 0x2d, 0xf0,
|
||||
0x70, 0x7d, 0x8f, 0xff, 0x1c, 0x7e, 0x9b, 0x1f, 0xed, 0x7d, 0x91, 0xe0,
|
||||
0xb8, 0xcc, 0xec, 0xf9, 0x9c, 0x64, 0x64, 0xf5, 0x39, 0x6d, 0xcf, 0x11,
|
||||
0xc0, 0x2a, 0x42, 0xd3, 0x7e, 0xe0, 0xa9, 0xa3, 0x4a, 0xab, 0x4d, 0x84,
|
||||
0x96, 0x3a, 0x67, 0x4b, 0x51, 0x9b, 0x0a, 0x1d, 0xd5, 0x78, 0x53, 0xfe,
|
||||
0x39, 0xf5, 0xa8, 0xaf, 0xd9, 0xcf, 0x97, 0x0d, 0xcf, 0x09, 0xc0, 0xcf,
|
||||
0x23, 0xf5, 0x2d, 0x97, 0x3e, 0xa0, 0xe7, 0x67, 0xac, 0xb2, 0x1d, 0xe8,
|
||||
0x3b, 0x6f, 0x2a, 0xcf, 0x47, 0x00, 0x30, 0xdd, 0x70, 0xe8, 0x56, 0x3d,
|
||||
0x84, 0x6e, 0xd5, 0xd8, 0x66, 0x81, 0x70, 0xed, 0x91, 0x27, 0x74, 0xb9,
|
||||
0xe7, 0xcf, 0x76, 0xc7, 0x73, 0xde, 0xf3, 0xff, 0xff, 0xad, 0xf2, 0x11,
|
||||
0xcb, 0xff, 0x00, 0x23, 0xdd, 0xb3, 0x7f, 0xe6, 0x37, 0xca, 0x79, 0x00,
|
||||
0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
239
Source/Core/DolphinWX/resources/toolbar_add_memorycheck.c
Normal file
239
Source/Core/DolphinWX/resources/toolbar_add_memorycheck.c
Normal file
@ -0,0 +1,239 @@
|
||||
static const unsigned char toolbar_add_memcheck_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00,
|
||||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
|
||||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b,
|
||||
0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00,
|
||||
0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
|
||||
0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69,
|
||||
0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20,
|
||||
0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00,
|
||||
0x00, 0x00, 0x15, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x31,
|
||||
0x31, 0x2f, 0x30, 0x34, 0x0e, 0x46, 0xed, 0x55, 0x00, 0x00, 0x0a, 0x6a,
|
||||
0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x5f, 0x8c, 0x5c, 0xd7,
|
||||
0x5d, 0xc7, 0x3f, 0xe7, 0xdc, 0x7b, 0xe7, 0xde, 0x99, 0xd9, 0x3f, 0xb3,
|
||||
0xb1, 0xbd, 0x76, 0xdc, 0x84, 0xac, 0x31, 0xa4, 0x89, 0xe8, 0x9f, 0x15,
|
||||
0x15, 0x22, 0x45, 0x21, 0xb1, 0x1b, 0x25, 0x8a, 0x02, 0x28, 0xe6, 0x89,
|
||||
0x07, 0x5a, 0x39, 0x7d, 0xe1, 0x01, 0x24, 0x12, 0x1e, 0x10, 0x52, 0xd5,
|
||||
0x07, 0xf3, 0x08, 0xa8, 0x28, 0x41, 0x6a, 0xc0, 0x48, 0x34, 0x81, 0x8a,
|
||||
0x06, 0x90, 0x4a, 0x8c, 0x10, 0x14, 0x89, 0x56, 0x5d, 0x22, 0x51, 0xda,
|
||||
0xaa, 0x21, 0x9b, 0xe0, 0xa4, 0x69, 0x12, 0xdb, 0xeb, 0x64, 0xbd, 0xf6,
|
||||
0xee, 0x7a, 0xff, 0xcd, 0xee, 0xcc, 0xce, 0xcc, 0x39, 0xbf, 0xf3, 0xe3,
|
||||
0xe1, 0xdc, 0xd9, 0x5d, 0x68, 0xa5, 0xcc, 0xce, 0x5a, 0xa9, 0x7a, 0xa5,
|
||||
0x9f, 0xe6, 0xce, 0x8e, 0xe6, 0xde, 0xef, 0xe7, 0xfc, 0xbe, 0xe7, 0xf7,
|
||||
0x3b, 0xe7, 0xce, 0x1a, 0x55, 0xe5, 0x27, 0xf9, 0xb0, 0x3f, 0x6e, 0x01,
|
||||
0x07, 0x3d, 0xd2, 0x5b, 0x75, 0xa1, 0xb5, 0xbf, 0xf8, 0x54, 0x43, 0x24,
|
||||
0x9c, 0xf1, 0x5e, 0xce, 0x78, 0x91, 0x8f, 0x3b, 0x2f, 0x53, 0xce, 0x0b,
|
||||
0xde, 0xcb, 0x9c, 0xf3, 0xf2, 0xaa, 0xf7, 0x72, 0xc1, 0x79, 0xb9, 0x70,
|
||||
0xdf, 0x1f, 0xbf, 0xb9, 0x7e, 0xab, 0xee, 0x09, 0x60, 0x6e, 0x85, 0x85,
|
||||
0xda, 0x5f, 0x7a, 0xe4, 0x9c, 0x97, 0xf0, 0xa4, 0xf7, 0xd2, 0xf0, 0x5e,
|
||||
0x70, 0x65, 0xfc, 0xd0, 0xb9, 0x93, 0x75, 0xe7, 0xe5, 0x99, 0xfb, 0xff,
|
||||
0xf4, 0xad, 0x73, 0x07, 0x97, 0x1e, 0x8f, 0x03, 0x01, 0xf8, 0x2f, 0x3f,
|
||||
0xd6, 0xc0, 0x98, 0x17, 0x45, 0xe4, 0xd4, 0x1e, 0x91, 0x38, 0x2f, 0x24,
|
||||
0x63, 0x35, 0xbc, 0x17, 0x36, 0x17, 0xd7, 0x76, 0x20, 0x5c, 0xf9, 0xb9,
|
||||
0xf7, 0x32, 0xe3, 0xbc, 0xfc, 0xfa, 0xc3, 0xcf, 0xce, 0x1d, 0x38, 0x1b,
|
||||
0x43, 0x03, 0x74, 0x9e, 0x7f, 0xb4, 0x91, 0xa5, 0xc9, 0x37, 0x8d, 0x35,
|
||||
0xd3, 0xbe, 0x14, 0x6d, 0x8e, 0x1f, 0xa1, 0x72, 0xd7, 0x31, 0xd2, 0xd1,
|
||||
0xdb, 0x40, 0x2b, 0xe0, 0xba, 0xb0, 0x75, 0x93, 0xce, 0xb5, 0x6b, 0x2c,
|
||||
0x5e, 0x5a, 0xe0, 0xc6, 0xfc, 0x6a, 0x1f, 0x00, 0xe7, 0x65, 0xd6, 0x79,
|
||||
0x7f, 0xfa, 0xb1, 0xbf, 0x9c, 0x3f, 0x10, 0xc4, 0xd0, 0x73, 0x20, 0xa8,
|
||||
0xbe, 0x28, 0x21, 0x4c, 0x13, 0x20, 0xa4, 0x96, 0xe2, 0x97, 0x3f, 0x41,
|
||||
0x32, 0xf9, 0x61, 0x28, 0x7e, 0x1e, 0xd2, 0x11, 0xa0, 0x0b, 0x74, 0x80,
|
||||
0x0e, 0xc5, 0xcf, 0x5c, 0xe3, 0xae, 0x3b, 0xff, 0x8b, 0x89, 0x8b, 0xaf,
|
||||
0xf2, 0xc6, 0xec, 0x55, 0xbc, 0x17, 0x80, 0x69, 0xe0, 0x45, 0xe0, 0xf4,
|
||||
0x41, 0x00, 0x86, 0xca, 0xc0, 0xfa, 0xf9, 0x4f, 0x9d, 0x4d, 0x92, 0xe4,
|
||||
0xf9, 0xc4, 0x1a, 0x4c, 0x96, 0x91, 0x3f, 0xfc, 0x4b, 0xd8, 0xc9, 0x5f,
|
||||
0x05, 0x7b, 0x72, 0x57, 0xf8, 0xf6, 0x65, 0x68, 0x5f, 0x03, 0xe9, 0x40,
|
||||
0x5e, 0x83, 0xf1, 0x06, 0x5c, 0xbb, 0x48, 0xeb, 0x3f, 0xfe, 0x95, 0x57,
|
||||
0x5e, 0xbe, 0x4a, 0xbb, 0xdd, 0xeb, 0xdb, 0xea, 0x89, 0x33, 0xcf, 0x5d,
|
||||
0xff, 0xeb, 0x61, 0x01, 0x86, 0xca, 0x80, 0x48, 0x38, 0x07, 0x10, 0x82,
|
||||
0xa1, 0xfe, 0xe0, 0x2f, 0x60, 0x27, 0x1f, 0x01, 0xfb, 0x51, 0xd0, 0x4d,
|
||||
0xd8, 0xfe, 0x6f, 0xd8, 0xf8, 0x2e, 0xb4, 0x9b, 0xd0, 0xe9, 0x40, 0xb7,
|
||||
0x1b, 0x23, 0x00, 0x77, 0xde, 0x4b, 0xfd, 0x93, 0x0f, 0xf0, 0x91, 0xce,
|
||||
0x37, 0xf8, 0xee, 0xcb, 0x73, 0xf1, 0x62, 0xaa, 0xe7, 0x80, 0xa1, 0x01,
|
||||
0xf6, 0xdd, 0x07, 0x16, 0x9e, 0xbe, 0xff, 0x71, 0x2f, 0x61, 0xca, 0xfb,
|
||||
0x80, 0x99, 0x18, 0x23, 0x3d, 0x7a, 0x0f, 0xd8, 0x7b, 0x41, 0x5b, 0xb0,
|
||||
0xf5, 0x55, 0xd8, 0xfa, 0x0e, 0xf8, 0x0e, 0xa8, 0xc6, 0x08, 0x21, 0xbe,
|
||||
0x8a, 0x83, 0xcb, 0xb3, 0xd0, 0xde, 0xa4, 0x71, 0xcf, 0x49, 0x0e, 0xdd,
|
||||
0x36, 0x82, 0xa2, 0xa8, 0x32, 0xf5, 0x0f, 0xbf, 0x79, 0xe4, 0xf1, 0x0f,
|
||||
0x0c, 0xa0, 0xac, 0xf5, 0x38, 0x2f, 0x54, 0x4e, 0x1c, 0x87, 0xec, 0x6e,
|
||||
0xa0, 0x07, 0x9b, 0xff, 0x08, 0xdb, 0x0b, 0xe0, 0x7d, 0x0c, 0x91, 0x28,
|
||||
0xbe, 0x0f, 0x60, 0x2d, 0x24, 0x09, 0xac, 0xde, 0x00, 0xf1, 0xdc, 0x75,
|
||||
0x47, 0x03, 0x8c, 0x45, 0x55, 0x51, 0xd5, 0x33, 0xc3, 0x02, 0xec, 0xdb,
|
||||
0x42, 0x5e, 0x64, 0xda, 0xaa, 0xc5, 0x06, 0xa5, 0x98, 0x3c, 0x02, 0xf9,
|
||||
0xed, 0xd0, 0x7e, 0x0d, 0xb6, 0xae, 0x44, 0xb1, 0x7d, 0x80, 0x7e, 0xf4,
|
||||
0x01, 0x8c, 0x81, 0x34, 0x8d, 0x20, 0xce, 0x71, 0xf8, 0xe8, 0x38, 0x58,
|
||||
0x4b, 0x88, 0x00, 0xd3, 0xc3, 0x02, 0xec, 0x3b, 0x03, 0x5e, 0xc2, 0xb4,
|
||||
0xf7, 0x42, 0x32, 0x5e, 0x07, 0x33, 0x02, 0xf4, 0xe0, 0xe6, 0x7f, 0xee,
|
||||
0xfa, 0xbd, 0xd7, 0x8b, 0xe1, 0xdc, 0x2e, 0x40, 0x5f, 0x7c, 0xa5, 0x02,
|
||||
0x45, 0x11, 0x23, 0xcb, 0x38, 0xd4, 0x28, 0x50, 0x20, 0x1c, 0x00, 0x60,
|
||||
0xff, 0x19, 0xf0, 0x82, 0x35, 0x06, 0x71, 0x3e, 0xd6, 0x79, 0xb7, 0x0c,
|
||||
0xad, 0x9b, 0xf1, 0x43, 0xd5, 0x68, 0x9d, 0xbd, 0x36, 0x52, 0x8d, 0xd6,
|
||||
0xa9, 0x54, 0x20, 0xcf, 0xe3, 0x39, 0x44, 0x20, 0x63, 0x08, 0x41, 0x09,
|
||||
0x61, 0xf8, 0x66, 0x3a, 0x14, 0x80, 0xb1, 0x06, 0xf1, 0x25, 0x40, 0x6b,
|
||||
0x21, 0x8e, 0x3c, 0xec, 0x99, 0xb0, 0xa5, 0xff, 0xfb, 0x42, 0xb3, 0x0c,
|
||||
0xaa, 0xd5, 0x08, 0x60, 0x4c, 0xcc, 0x0e, 0x10, 0x24, 0x10, 0x42, 0x38,
|
||||
0x10, 0xc0, 0x30, 0x16, 0x9a, 0xf1, 0x3e, 0xb0, 0x71, 0x73, 0x03, 0xb6,
|
||||
0x56, 0x61, 0x6b, 0x61, 0xd7, 0x2e, 0x7b, 0x85, 0x5b, 0x1b, 0x85, 0x17,
|
||||
0x05, 0xd4, 0x6a, 0x31, 0x8a, 0x62, 0x37, 0x03, 0x22, 0xdc, 0xb8, 0xd9,
|
||||
0x8a, 0x00, 0x1a, 0x66, 0x3e, 0x30, 0x00, 0xe7, 0x65, 0xce, 0x97, 0xeb,
|
||||
0x9e, 0xf6, 0xc2, 0x42, 0xbc, 0x42, 0x5f, 0x78, 0xbf, 0xd2, 0xa4, 0x69,
|
||||
0x1c, 0xed, 0x5a, 0x0d, 0xea, 0x75, 0x18, 0x1d, 0x8d, 0x19, 0x48, 0xd3,
|
||||
0x98, 0xa1, 0x6e, 0x97, 0xcd, 0xb5, 0x2d, 0x9c, 0x73, 0x88, 0x28, 0x21,
|
||||
0xe8, 0xdc, 0x07, 0x06, 0xe0, 0xbd, 0xcc, 0xf4, 0xcb, 0xe8, 0xcd, 0x77,
|
||||
0x97, 0x61, 0xe9, 0x52, 0xfc, 0xa0, 0x6f, 0x95, 0xa2, 0x88, 0xa2, 0x47,
|
||||
0x46, 0xa2, 0xf0, 0xd1, 0xd1, 0x08, 0x52, 0xa9, 0x44, 0xf1, 0xbd, 0x1e,
|
||||
0xb4, 0x5a, 0x5c, 0x9d, 0x5b, 0x46, 0x7a, 0x3e, 0x66, 0x40, 0x86, 0xcf,
|
||||
0xc0, 0x30, 0x73, 0xe0, 0x82, 0x31, 0x66, 0xdd, 0x18, 0xd3, 0xb8, 0x3e,
|
||||
0xbf, 0xc2, 0xf1, 0xa5, 0xeb, 0xa4, 0x13, 0xe3, 0xbb, 0xe2, 0xf3, 0x3c,
|
||||
0x9e, 0xf7, 0x81, 0x92, 0x64, 0xd7, 0xf7, 0xdd, 0x2e, 0x6c, 0x6e, 0xe2,
|
||||
0x56, 0xd6, 0x78, 0xeb, 0xf2, 0x12, 0x5e, 0x04, 0x09, 0x61, 0x3d, 0xa8,
|
||||
0x5e, 0x18, 0x16, 0x60, 0xdf, 0x19, 0x78, 0xe0, 0xe9, 0x77, 0x36, 0xbc,
|
||||
0x97, 0x0b, 0xde, 0x0b, 0x9d, 0xed, 0x1e, 0x6f, 0xbf, 0x72, 0x09, 0x36,
|
||||
0x9b, 0x71, 0x0e, 0x18, 0x13, 0x05, 0x67, 0xd9, 0xae, 0x78, 0x88, 0xe2,
|
||||
0xdb, 0x6d, 0x68, 0x36, 0x61, 0x65, 0x85, 0xef, 0x7d, 0xef, 0x32, 0xad,
|
||||
0xcd, 0x0e, 0x22, 0x01, 0x91, 0x70, 0xe1, 0xb7, 0xfe, 0xb9, 0xbd, 0xf1,
|
||||
0x81, 0x01, 0x00, 0x38, 0x91, 0x73, 0xce, 0x0b, 0xbd, 0x9e, 0x67, 0xe1,
|
||||
0xda, 0x1a, 0x8b, 0x97, 0x16, 0x60, 0x63, 0x23, 0x8a, 0xec, 0xf7, 0x00,
|
||||
0xe7, 0x62, 0x6f, 0x68, 0xb5, 0xa2, 0xf0, 0xb5, 0x35, 0x58, 0x5a, 0xe2,
|
||||
0xbd, 0xef, 0xbf, 0xcb, 0xe5, 0xcb, 0x4b, 0x38, 0xe7, 0x11, 0x09, 0x00,
|
||||
0xe7, 0x86, 0x15, 0x3f, 0x34, 0xc0, 0x23, 0xcf, 0x5e, 0xbd, 0xfa, 0xd6,
|
||||
0x68, 0xb8, 0xe0, 0xbd, 0xd0, 0xeb, 0xf6, 0x98, 0x9d, 0x7d, 0x8f, 0xf9,
|
||||
0xd7, 0xaf, 0xc0, 0xf5, 0xeb, 0xb0, 0xb4, 0x04, 0xab, 0xab, 0x51, 0xf0,
|
||||
0xda, 0x1a, 0xac, 0xac, 0xc0, 0x8d, 0x1b, 0x30, 0x3f, 0xcf, 0xa5, 0x57,
|
||||
0xde, 0xe1, 0xa5, 0x6f, 0xbd, 0x4d, 0xb7, 0xeb, 0x10, 0x09, 0x7c, 0xe3,
|
||||
0x28, 0x7c, 0xee, 0xa3, 0x7c, 0xf6, 0x20, 0x00, 0x43, 0x2d, 0xa7, 0x4f,
|
||||
0xbf, 0x70, 0xe2, 0x09, 0x55, 0x7d, 0xee, 0xd3, 0xdf, 0x71, 0x4c, 0x6e,
|
||||
0x29, 0x60, 0xb0, 0x89, 0x61, 0xf2, 0xc8, 0x18, 0x77, 0xff, 0xec, 0x24,
|
||||
0x8d, 0x23, 0xe5, 0x9c, 0x00, 0x70, 0x8e, 0x95, 0xc5, 0x75, 0x2e, 0xbe,
|
||||
0x7e, 0x8d, 0x77, 0xdf, 0x5b, 0xc1, 0x79, 0x41, 0xbc, 0x70, 0xbd, 0x80,
|
||||
0x2f, 0x7e, 0xd8, 0x94, 0x55, 0x28, 0xcc, 0x8a, 0xe8, 0xe9, 0x8d, 0x3f,
|
||||
0xe9, 0xec, 0x7b, 0x73, 0xb3, 0x6f, 0x80, 0x87, 0xfe, 0xfe, 0xa7, 0x9f,
|
||||
0x00, 0x9e, 0x0b, 0x41, 0xc9, 0x7a, 0x81, 0xcf, 0xbe, 0xd4, 0x25, 0x77,
|
||||
0xca, 0xce, 0x55, 0xac, 0xa1, 0x5e, 0x2f, 0xa8, 0xd7, 0x52, 0x42, 0x50,
|
||||
0x9a, 0x9b, 0x5d, 0x36, 0x9a, 0xdb, 0x88, 0xf3, 0x71, 0xd2, 0x4a, 0xa0,
|
||||
0x93, 0xc2, 0xd3, 0x1f, 0x49, 0x68, 0xa1, 0xfd, 0x32, 0x8a, 0x48, 0x98,
|
||||
0x0d, 0x41, 0x4f, 0x6f, 0x7e, 0xa1, 0xbb, 0x2f, 0x88, 0x7d, 0x01, 0x9c,
|
||||
0x7e, 0xe1, 0xc4, 0xb4, 0xb5, 0xe6, 0x9b, 0x40, 0x23, 0x04, 0xc5, 0x26,
|
||||
0x86, 0xa9, 0x4a, 0xca, 0x03, 0x2f, 0x39, 0xf2, 0x1b, 0x4d, 0x50, 0xe2,
|
||||
0xea, 0x12, 0x83, 0x6a, 0x29, 0x4c, 0xc3, 0xff, 0xe9, 0xb8, 0xcb, 0x87,
|
||||
0x2c, 0x5f, 0x7b, 0xb0, 0xc2, 0x7c, 0xaa, 0xb8, 0x05, 0xa1, 0xd7, 0x94,
|
||||
0x72, 0x32, 0x2b, 0x21, 0xe8, 0xcc, 0xe6, 0x17, 0xba, 0xfb, 0xda, 0xa1,
|
||||
0xed, 0x6b, 0x0e, 0x84, 0xa0, 0xcf, 0x89, 0x68, 0x43, 0x44, 0xc9, 0xf2,
|
||||
0x84, 0xa9, 0x7b, 0x1a, 0x3c, 0xfa, 0xc9, 0xdf, 0xe1, 0x57, 0xfe, 0x70,
|
||||
0x86, 0x3b, 0x1e, 0xfe, 0x4c, 0xb9, 0xc3, 0x0a, 0x38, 0xe7, 0x63, 0x78,
|
||||
0x8f, 0x2f, 0xf7, 0xc0, 0x21, 0x28, 0xaf, 0x7e, 0x2c, 0xe7, 0xab, 0xbf,
|
||||
0x56, 0x65, 0xf5, 0x70, 0x4a, 0x3e, 0x9e, 0x51, 0xbd, 0x3b, 0x23, 0xbf,
|
||||
0x33, 0xc3, 0x5a, 0xd3, 0xbf, 0xc5, 0xa9, 0xda, 0x53, 0x95, 0xb3, 0xfb,
|
||||
0xd1, 0x34, 0x70, 0x06, 0xee, 0xff, 0x9b, 0x9f, 0x7a, 0xd2, 0x18, 0xf3,
|
||||
0xb4, 0x31, 0x50, 0x54, 0x53, 0x4e, 0xde, 0x7b, 0x1b, 0x9f, 0xfe, 0xd0,
|
||||
0xe7, 0xf9, 0xc5, 0xb1, 0xc7, 0xe8, 0x69, 0x8f, 0xd7, 0xb7, 0xbe, 0xcd,
|
||||
0xd7, 0xdf, 0xfc, 0x2b, 0xda, 0x5f, 0x9f, 0x61, 0x62, 0x6e, 0x9b, 0xb1,
|
||||
0x1b, 0x3d, 0x82, 0x2a, 0x6b, 0x47, 0x52, 0xae, 0xdf, 0x91, 0xf1, 0xda,
|
||||
0xc7, 0x2a, 0xac, 0xd5, 0xc0, 0xc7, 0xe5, 0x33, 0xc6, 0x58, 0xc0, 0xe2,
|
||||
0x83, 0xd0, 0x5c, 0xec, 0xd0, 0x7e, 0xbb, 0x8b, 0x73, 0x81, 0x10, 0x74,
|
||||
0x3d, 0x84, 0x70, 0xa2, 0xf3, 0x67, 0x7e, 0x20, 0x2b, 0x0d, 0xd4, 0xc8,
|
||||
0xee, 0xfb, 0xd2, 0x1d, 0x0d, 0x63, 0xcc, 0x39, 0x63, 0x20, 0x49, 0x0d,
|
||||
0x47, 0xa7, 0x46, 0x78, 0xe8, 0xd0, 0x67, 0xf8, 0xc4, 0xd8, 0xc3, 0x78,
|
||||
0x1c, 0xff, 0x7e, 0xf3, 0x05, 0xfe, 0x6e, 0xfe, 0x19, 0xbc, 0x0d, 0xf8,
|
||||
0x87, 0xc6, 0x71, 0x32, 0x82, 0x0b, 0x01, 0x2f, 0x01, 0x27, 0x01, 0x1f,
|
||||
0x04, 0x27, 0x01, 0x95, 0x80, 0x86, 0x80, 0xb1, 0x09, 0x49, 0x92, 0x90,
|
||||
0x25, 0x29, 0xd6, 0xe4, 0x98, 0x63, 0x16, 0x59, 0x0b, 0xf8, 0x1b, 0x3d,
|
||||
0x20, 0x34, 0x54, 0x79, 0x9c, 0x01, 0xb7, 0x99, 0x03, 0x01, 0x84, 0xa0,
|
||||
0x67, 0x8d, 0xa1, 0x61, 0x8c, 0xd2, 0x38, 0x52, 0xe3, 0x58, 0xed, 0x04,
|
||||
0xa7, 0x0e, 0xff, 0x06, 0xed, 0xd0, 0xe2, 0xcb, 0xef, 0xfe, 0x11, 0xdf,
|
||||
0x5a, 0xfd, 0x37, 0x24, 0x28, 0x12, 0x02, 0x3e, 0x84, 0xf2, 0x3c, 0x46,
|
||||
0xd0, 0xe8, 0xfd, 0xa0, 0xbb, 0x61, 0x51, 0x52, 0x6b, 0xa9, 0xa4, 0x19,
|
||||
0x79, 0x96, 0x91, 0xa6, 0x09, 0xbd, 0x93, 0x42, 0x67, 0xd5, 0xe1, 0xdb,
|
||||
0x40, 0xec, 0x0d, 0x03, 0x01, 0x0c, 0x34, 0x07, 0x44, 0xf4, 0x29, 0x11,
|
||||
0x85, 0xc4, 0x90, 0x37, 0x12, 0x1e, 0x3d, 0x7a, 0x96, 0x6d, 0x69, 0xf3,
|
||||
0xb5, 0xc5, 0xaf, 0x30, 0xb3, 0xfc, 0x2f, 0x74, 0xbd, 0xa7, 0xe7, 0x3d,
|
||||
0x3d, 0x11, 0x7a, 0x22, 0xb8, 0x20, 0x78, 0x89, 0x30, 0x3e, 0x28, 0x7e,
|
||||
0x07, 0x28, 0x20, 0xaa, 0x44, 0xd7, 0x5a, 0xf2, 0x2c, 0xa5, 0x5e, 0x14,
|
||||
0x8c, 0x55, 0xeb, 0x8c, 0x8f, 0xd6, 0xc8, 0x6f, 0xcf, 0x00, 0x83, 0x2a,
|
||||
0x53, 0xe9, 0x6f, 0xdb, 0x81, 0x36, 0x39, 0xef, 0x9b, 0x81, 0xe9, 0x67,
|
||||
0x8f, 0x4d, 0x1b, 0x63, 0xa6, 0x8c, 0x51, 0xf2, 0xdb, 0x32, 0x3e, 0x54,
|
||||
0xdc, 0xcd, 0xf1, 0xda, 0x49, 0xde, 0xde, 0xba, 0xc8, 0xdf, 0x5e, 0xf9,
|
||||
0x62, 0x7f, 0x63, 0x5e, 0x8e, 0x6e, 0xd8, 0x15, 0x1a, 0xb4, 0x04, 0x08,
|
||||
0x31, 0x33, 0x12, 0x5f, 0x43, 0x09, 0x90, 0x24, 0x96, 0x4a, 0x96, 0x51,
|
||||
0xcb, 0x73, 0x82, 0x2a, 0x1d, 0xef, 0xc8, 0x27, 0x9b, 0xd8, 0x2b, 0x1d,
|
||||
0xbc, 0x57, 0x54, 0x79, 0x10, 0x98, 0x3d, 0x30, 0x80, 0x88, 0x3e, 0x6e,
|
||||
0x4c, 0x5c, 0xe6, 0x68, 0x55, 0xf9, 0xb9, 0xc6, 0x7d, 0xb4, 0xa5, 0xc5,
|
||||
0x57, 0xae, 0xfc, 0x39, 0x1d, 0xe7, 0x50, 0xd8, 0x03, 0x50, 0x46, 0x39,
|
||||
0xd2, 0x7d, 0xf1, 0x12, 0x34, 0x02, 0x94, 0x05, 0xc3, 0x5a, 0x4b, 0x25,
|
||||
0x49, 0xa9, 0x56, 0x72, 0x6a, 0x79, 0x0e, 0x40, 0xd7, 0x79, 0xf2, 0x5a,
|
||||
0x86, 0x29, 0x2c, 0xda, 0x15, 0x54, 0x39, 0x05, 0x3c, 0x73, 0x60, 0x80,
|
||||
0x10, 0xf4, 0x94, 0x31, 0x8a, 0xad, 0x59, 0x9c, 0x06, 0x8e, 0xd5, 0xa6,
|
||||
0xf8, 0x9f, 0xb5, 0x97, 0x79, 0x63, 0xed, 0x22, 0xfd, 0x0a, 0x56, 0xee,
|
||||
0x6b, 0x63, 0xed, 0xd7, 0x5d, 0xef, 0xef, 0xcd, 0x46, 0x28, 0x37, 0xf6,
|
||||
0x59, 0x92, 0x52, 0x54, 0x2a, 0xd4, 0x8a, 0x82, 0xb1, 0x6a, 0x95, 0x91,
|
||||
0xa2, 0x40, 0x24, 0x50, 0xc9, 0x32, 0x2a, 0x69, 0x86, 0xa9, 0x02, 0x1b,
|
||||
0x8a, 0xaa, 0x4e, 0xbd, 0x9f, 0xb6, 0x81, 0x00, 0x44, 0x74, 0xca, 0x18,
|
||||
0x30, 0x05, 0xf8, 0x00, 0x79, 0x5a, 0xe5, 0xdb, 0xf3, 0x2f, 0x11, 0x94,
|
||||
0xb2, 0x51, 0x29, 0xaa, 0x01, 0x51, 0xca, 0xdd, 0x95, 0xee, 0xd8, 0xa4,
|
||||
0x0f, 0x85, 0x31, 0x58, 0x6b, 0x49, 0x93, 0x84, 0x6a, 0xa5, 0x60, 0xac,
|
||||
0x56, 0x67, 0xa2, 0x3e, 0xc2, 0x58, 0xad, 0x4e, 0xad, 0x52, 0xa1, 0xe3,
|
||||
0x1c, 0xa9, 0xb5, 0x24, 0xd6, 0x62, 0xaa, 0xb6, 0x9c, 0x23, 0xdc, 0x9a,
|
||||
0x39, 0x10, 0x42, 0x98, 0x02, 0x83, 0x0d, 0x71, 0xb9, 0xd0, 0xd5, 0x6d,
|
||||
0xde, 0xdb, 0xbe, 0x4c, 0x9a, 0x66, 0x88, 0x04, 0x34, 0x08, 0x12, 0x4c,
|
||||
0xf9, 0xe8, 0x04, 0x50, 0xc5, 0x98, 0x78, 0x1e, 0x17, 0xd3, 0x86, 0xc4,
|
||||
0x5a, 0xb2, 0x34, 0xa5, 0xc8, 0x2a, 0x8c, 0x56, 0x6b, 0x4c, 0x8c, 0x8c,
|
||||
0x70, 0x68, 0x74, 0x94, 0xb1, 0x5a, 0x8d, 0xc4, 0x18, 0x7a, 0xde, 0xef,
|
||||
0xc0, 0x6b, 0xd9, 0xcd, 0x07, 0x3d, 0x06, 0xc9, 0x00, 0xc6, 0x28, 0xbe,
|
||||
0x6b, 0xc1, 0x58, 0x7e, 0xd0, 0xbc, 0x88, 0x37, 0x1d, 0x46, 0x8a, 0x2a,
|
||||
0x12, 0x02, 0x4e, 0x04, 0x5f, 0x56, 0x9d, 0xa0, 0x71, 0xe9, 0x40, 0xf9,
|
||||
0x18, 0xc8, 0x60, 0x49, 0x12, 0xbb, 0x63, 0x9b, 0x7a, 0x5e, 0x30, 0x56,
|
||||
0xab, 0x31, 0x51, 0xaf, 0x33, 0x56, 0xab, 0x92, 0x67, 0x95, 0x58, 0xbd,
|
||||
0xbc, 0x67, 0xdb, 0x39, 0xba, 0xce, 0x21, 0x1d, 0x19, 0x58, 0xfc, 0xa0,
|
||||
0x00, 0x73, 0xc6, 0x30, 0x65, 0xda, 0x42, 0xd7, 0x0b, 0x3f, 0xd8, 0x78,
|
||||
0x8d, 0x6a, 0x25, 0x27, 0x4b, 0x53, 0x8c, 0x31, 0xd1, 0xe3, 0x22, 0x3b,
|
||||
0x15, 0x27, 0x8e, 0x5e, 0xec, 0xb4, 0x89, 0x4d, 0xc8, 0xd2, 0x84, 0x3c,
|
||||
0x8d, 0xd5, 0xa6, 0x9e, 0xe7, 0xd4, 0x8b, 0x9c, 0x5a, 0xf9, 0x7d, 0x09,
|
||||
0x81, 0x76, 0xb7, 0xcb, 0xc6, 0xf6, 0x36, 0x1b, 0xad, 0x16, 0xad, 0x4e,
|
||||
0x07, 0xb7, 0x26, 0x7d, 0x0b, 0xcd, 0xdd, 0x12, 0x80, 0x10, 0xc2, 0x2c,
|
||||
0x98, 0x29, 0xda, 0x81, 0xed, 0xe5, 0x2e, 0x6f, 0xe4, 0xdf, 0xe7, 0x78,
|
||||
0xe3, 0x30, 0x69, 0x92, 0x90, 0x67, 0x29, 0xd6, 0xd8, 0x58, 0xa1, 0xe2,
|
||||
0xaa, 0x1a, 0x00, 0x4b, 0xe9, 0x79, 0x6b, 0x49, 0x92, 0x84, 0x4a, 0x9a,
|
||||
0x92, 0xa5, 0x69, 0x7c, 0x4d, 0x12, 0x4c, 0x69, 0x9b, 0x56, 0xa7, 0xc3,
|
||||
0xca, 0xe6, 0x26, 0xcb, 0xcd, 0x26, 0x8b, 0xcd, 0x26, 0x9b, 0x0b, 0x1d,
|
||||
0x64, 0x3b, 0xf4, 0x6f, 0xfd, 0xbe, 0x25, 0x74, 0x20, 0x00, 0x11, 0xbd,
|
||||
0x00, 0x7a, 0x26, 0x04, 0x08, 0xd7, 0x61, 0x29, 0xdb, 0x40, 0x55, 0x99,
|
||||
0x1c, 0x1f, 0x07, 0x53, 0xa3, 0xc8, 0x2c, 0x59, 0x92, 0x90, 0xd8, 0x84,
|
||||
0xc4, 0x5a, 0xac, 0xd9, 0x23, 0xbe, 0x0c, 0x5b, 0xfe, 0xdd, 0x00, 0xae,
|
||||
0xb4, 0xcc, 0x56, 0xb7, 0xcb, 0xfa, 0xd6, 0x16, 0x8b, 0xcd, 0x26, 0xd7,
|
||||
0x56, 0x57, 0x59, 0x5e, 0xdc, 0x60, 0xfb, 0x52, 0x6f, 0xaf, 0xff, 0x07,
|
||||
0xda, 0x27, 0x0f, 0x04, 0x60, 0x0c, 0xeb, 0x40, 0x43, 0xbb, 0x9e, 0xf4,
|
||||
0x8a, 0xb2, 0xd8, 0x5a, 0xa7, 0x79, 0x7b, 0x87, 0xc3, 0x63, 0x63, 0x4c,
|
||||
0xd4, 0xeb, 0x8c, 0xe4, 0x39, 0x45, 0xa5, 0xb2, 0x33, 0xc2, 0x18, 0x13,
|
||||
0x6b, 0x7e, 0x7f, 0x62, 0x8a, 0x10, 0x42, 0xc0, 0x8b, 0xd0, 0x75, 0x8e,
|
||||
0x56, 0x69, 0x9b, 0x9b, 0xcd, 0x26, 0x8b, 0x1b, 0x1b, 0xac, 0x5c, 0xdb,
|
||||
0xa4, 0xf5, 0x66, 0x87, 0xe0, 0x76, 0x46, 0x7f, 0x7d, 0x50, 0x80, 0x81,
|
||||
0x56, 0xa3, 0x93, 0x9f, 0x1f, 0x79, 0x10, 0x98, 0x31, 0x7d, 0x8b, 0x58,
|
||||
0x43, 0x52, 0x4b, 0x31, 0x93, 0x86, 0x62, 0x22, 0x67, 0xb4, 0x5e, 0x65,
|
||||
0xb4, 0x5a, 0xa5, 0x9e, 0xe7, 0xd4, 0x4a, 0x90, 0x24, 0x49, 0xb0, 0xc4,
|
||||
0x1e, 0xd1, 0x9f, 0xec, 0x9d, 0x5e, 0x8f, 0xad, 0x6e, 0x97, 0xcd, 0x76,
|
||||
0x3b, 0xfa, 0x7e, 0xbd, 0xc5, 0xd6, 0x3b, 0x5d, 0x3a, 0x4b, 0x8e, 0x10,
|
||||
0xc2, 0xde, 0x5b, 0x9e, 0xd1, 0xf3, 0xfa, 0x4f, 0xb7, 0x0c, 0x00, 0xe0,
|
||||
0xf0, 0xe7, 0x6a, 0x67, 0x81, 0xe7, 0x77, 0xbe, 0x68, 0xc0, 0x18, 0x83,
|
||||
0xb5, 0x09, 0x66, 0xdc, 0x60, 0x47, 0x13, 0xb2, 0x7a, 0x42, 0x3a, 0x92,
|
||||
0x90, 0xa5, 0xe9, 0x8e, 0x9d, 0x20, 0xf6, 0x03, 0x27, 0x42, 0xcf, 0x7b,
|
||||
0xba, 0x5b, 0x8e, 0xce, 0x6a, 0x8f, 0xee, 0xb2, 0xa7, 0xb7, 0x1a, 0xf7,
|
||||
0xc6, 0xff, 0x4f, 0xc2, 0x53, 0x7a, 0x5e, 0xdf, 0xb7, 0x03, 0xef, 0x1b,
|
||||
0x00, 0x60, 0xe2, 0x0f, 0xaa, 0x1f, 0x2f, 0x21, 0x76, 0x9a, 0x4c, 0xff,
|
||||
0xc9, 0x79, 0x84, 0x32, 0x3b, 0x11, 0x6a, 0xfd, 0xb6, 0x50, 0x76, 0xe7,
|
||||
0x6d, 0x25, 0x74, 0x04, 0xef, 0xcb, 0xa5, 0xc6, 0x0f, 0x0b, 0x07, 0x78,
|
||||
0x42, 0xcf, 0xeb, 0xbe, 0x7e, 0xad, 0x19, 0x6a, 0x53, 0x3f, 0xfe, 0xfb,
|
||||
0xc5, 0x93, 0xaa, 0x9c, 0x03, 0x1a, 0xa0, 0x3b, 0x42, 0xfa, 0x4d, 0xa8,
|
||||
0x5f, 0x95, 0xfa, 0xef, 0xe3, 0x33, 0xdf, 0x72, 0x59, 0x1d, 0x7e, 0x64,
|
||||
0xa3, 0x9a, 0x2d, 0xc5, 0xbf, 0xba, 0x5f, 0x2d, 0x07, 0xfa, 0x9d, 0xb8,
|
||||
0xfe, 0x7b, 0x95, 0xb3, 0xc0, 0x19, 0xe0, 0x4c, 0xbc, 0xcc, 0x6e, 0x27,
|
||||
0xdd, 0x0b, 0xd0, 0x7f, 0xff, 0x23, 0x9e, 0x42, 0xcf, 0x00, 0xcf, 0xef,
|
||||
0x77, 0xd4, 0xf7, 0x1e, 0xb7, 0xe4, 0x97, 0xfa, 0xe2, 0x77, 0xd3, 0x71,
|
||||
0x55, 0xa6, 0x81, 0x53, 0xaa, 0x9c, 0x2a, 0x05, 0x9f, 0xda, 0x05, 0x51,
|
||||
0x88, 0x8d, 0x69, 0x8e, 0x38, 0xda, 0xb3, 0xc0, 0x8c, 0x9e, 0xd7, 0xab,
|
||||
0x07, 0xbd, 0xf7, 0x2d, 0x01, 0xf8, 0x71, 0x1e, 0x3f, 0xf1, 0xff, 0xad,
|
||||
0xf2, 0xbf, 0xbd, 0x42, 0x09, 0x81, 0x50, 0xaf, 0xf9, 0xba, 0x00, 0x00,
|
||||
0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
244
Source/Core/DolphinWX/resources/toolbar_debugger_delete.c
Normal file
244
Source/Core/DolphinWX/resources/toolbar_debugger_delete.c
Normal file
@ -0,0 +1,244 @@
|
||||
static const unsigned char toolbar_delete_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00,
|
||||
0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
|
||||
0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
|
||||
0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
|
||||
0x00, 0x00, 0x0b, 0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e,
|
||||
0xfc, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xd8, 0x03,
|
||||
0x16, 0x0a, 0x1d, 0x39, 0xad, 0x95, 0x27, 0xb3, 0x00, 0x00, 0x0a, 0xd8,
|
||||
0x49, 0x44, 0x41, 0x54, 0x68, 0xde, 0xd5, 0x99, 0x4b, 0x6c, 0x5c, 0x55,
|
||||
0xb6, 0x86, 0xbf, 0x7d, 0x1e, 0x55, 0x75, 0xaa, 0xec, 0x7a, 0x04, 0x63,
|
||||
0x85, 0x58, 0x76, 0x8c, 0x70, 0x26, 0x0c, 0x88, 0x6f, 0x2c, 0x4b, 0x91,
|
||||
0x12, 0xab, 0x6d, 0xae, 0x10, 0x77, 0x80, 0x44, 0x9a, 0x48, 0x28, 0x19,
|
||||
0x98, 0x38, 0x01, 0xcc, 0x53, 0x10, 0x26, 0x88, 0x47, 0x44, 0xa7, 0xc7,
|
||||
0x48, 0x90, 0x48, 0x4c, 0x91, 0xd3, 0xaa, 0x49, 0x04, 0x12, 0x97, 0x86,
|
||||
0x11, 0x08, 0x70, 0x5a, 0x4c, 0x1c, 0x45, 0xe9, 0xb8, 0x13, 0x84, 0x15,
|
||||
0x24, 0x8c, 0x1f, 0x89, 0x1d, 0x97, 0x53, 0xe5, 0x53, 0xa7, 0xde, 0x8f,
|
||||
0x73, 0xce, 0x1d, 0xdc, 0xda, 0x5b, 0x27, 0x26, 0x49, 0x5f, 0x3b, 0xe9,
|
||||
0xa4, 0xef, 0x96, 0xb6, 0xe4, 0x2a, 0x9f, 0xb3, 0x6b, 0xff, 0x6b, 0xfd,
|
||||
0x6b, 0xad, 0x7f, 0xaf, 0x2d, 0x7c, 0xdf, 0xe7, 0xff, 0xf3, 0x30, 0xee,
|
||||
0xf6, 0x82, 0xcf, 0x3d, 0xf7, 0xdc, 0x30, 0xd0, 0xeb, 0xfb, 0x7e, 0x6f,
|
||||
0xeb, 0xab, 0x69, 0x60, 0x2e, 0x9d, 0x4e, 0x4f, 0xff, 0x2b, 0x00, 0x88,
|
||||
0xbb, 0xe1, 0x81, 0x23, 0x47, 0x8e, 0x0c, 0x03, 0x63, 0xbe, 0xef, 0x3f,
|
||||
0x0d, 0x24, 0x7d, 0xdf, 0x27, 0x38, 0x5b, 0xc3, 0x06, 0xfe, 0x02, 0x9c,
|
||||
0x48, 0xa7, 0xd3, 0x73, 0xff, 0x16, 0x00, 0x5e, 0x78, 0xe1, 0x85, 0x7e,
|
||||
0xe0, 0x63, 0x60, 0x18, 0x50, 0x9b, 0x5d, 0x0f, 0x60, 0x1d, 0x10, 0x80,
|
||||
0x93, 0xc0, 0xf1, 0x74, 0x3a, 0x6d, 0xdf, 0x57, 0x00, 0xe3, 0xe3, 0xe3,
|
||||
0x93, 0x72, 0xf3, 0x72, 0xe3, 0x96, 0x65, 0x11, 0x8f, 0xc7, 0x09, 0x87,
|
||||
0xc3, 0x18, 0x86, 0x81, 0xe7, 0x79, 0x54, 0x2a, 0x15, 0x8a, 0xc5, 0x22,
|
||||
0x6b, 0x6b, 0x6b, 0x78, 0x9e, 0x27, 0x1f, 0x9f, 0x03, 0xfe, 0x78, 0xa7,
|
||||
0xd4, 0xba, 0x23, 0x00, 0x2f, 0xbf, 0xfc, 0xf2, 0x1f, 0x80, 0x33, 0xf2,
|
||||
0x73, 0x34, 0x1a, 0x65, 0x60, 0x60, 0x80, 0xed, 0xdb, 0xb7, 0xd3, 0xd1,
|
||||
0xd1, 0x81, 0x65, 0x59, 0x78, 0x9e, 0x47, 0xb1, 0x58, 0xe4, 0xda, 0xb5,
|
||||
0x6b, 0x5c, 0xbc, 0x78, 0x91, 0x5f, 0x7f, 0xfd, 0x95, 0x62, 0xb1, 0xa8,
|
||||
0x68, 0xa5, 0x69, 0xda, 0xe3, 0xa7, 0x4e, 0x9d, 0xba, 0x70, 0xdf, 0x62,
|
||||
0xe0, 0xd5, 0x57, 0x5f, 0xfd, 0x6f, 0x60, 0x1f, 0x40, 0x22, 0x91, 0xe0,
|
||||
0xcd, 0x37, 0xdf, 0xc4, 0xf7, 0x7d, 0x3c, 0xcf, 0x23, 0x97, 0xcb, 0x61,
|
||||
0x18, 0x86, 0x02, 0x52, 0xab, 0xd5, 0xb8, 0x70, 0xe1, 0x02, 0x53, 0x53,
|
||||
0x53, 0x14, 0x0a, 0x05, 0x49, 0x2d, 0xdb, 0x30, 0x8c, 0xff, 0xfc, 0xf4,
|
||||
0xd3, 0x4f, 0xff, 0x7e, 0x5f, 0x00, 0xbc, 0xfe, 0xfa, 0xeb, 0xdb, 0x5b,
|
||||
0x74, 0xc0, 0xf7, 0x7d, 0x76, 0xed, 0xda, 0x45, 0x28, 0x14, 0x22, 0x97,
|
||||
0xcb, 0xe1, 0xba, 0x2e, 0x9e, 0xe7, 0xa1, 0x69, 0x1a, 0xdb, 0xb6, 0x6d,
|
||||
0xe3, 0xd1, 0x47, 0x1f, 0x25, 0x16, 0x8b, 0x71, 0xee, 0xdc, 0x39, 0xce,
|
||||
0x9d, 0x3b, 0x87, 0x6d, 0xdb, 0x78, 0x9e, 0x87, 0xef, 0xfb, 0x73, 0x89,
|
||||
0x44, 0x62, 0xe0, 0xe4, 0xc9, 0x93, 0xb9, 0x8d, 0xfe, 0xbe, 0x76, 0xbb,
|
||||
0x7f, 0xbe, 0xf4, 0xd2, 0x4b, 0xfd, 0xaf, 0xbc, 0xf2, 0xca, 0xd8, 0xed,
|
||||
0x9e, 0xf9, 0xe4, 0x93, 0x4f, 0xe6, 0x35, 0x4d, 0x3b, 0xa1, 0x69, 0x1a,
|
||||
0x9a, 0xa6, 0x71, 0xe1, 0xc2, 0x05, 0xb2, 0xd9, 0x2c, 0x9a, 0xa6, 0xa1,
|
||||
0xeb, 0x3a, 0x9a, 0xa6, 0xe1, 0xba, 0x2e, 0x0b, 0x0b, 0x0b, 0x7c, 0xf7,
|
||||
0xdd, 0x77, 0xcc, 0xcd, 0xcd, 0x31, 0x38, 0x38, 0xc8, 0xae, 0x5d, 0xbb,
|
||||
0x88, 0xc5, 0x62, 0x98, 0xa6, 0x89, 0xae, 0xeb, 0xbd, 0x8e, 0xe3, 0x7c,
|
||||
0xbc, 0x19, 0x03, 0x6a, 0xb7, 0xdb, 0xbc, 0xa6, 0x69, 0x93, 0x42, 0x88,
|
||||
0x89, 0xd7, 0x5e, 0x7b, 0x6d, 0xdf, 0x6d, 0x17, 0xd1, 0xb4, 0xe3, 0x9a,
|
||||
0xa6, 0xd9, 0x12, 0x84, 0x04, 0x10, 0x9c, 0xba, 0xae, 0x03, 0x70, 0xf1,
|
||||
0xe2, 0x45, 0x16, 0x17, 0x17, 0x19, 0x18, 0x18, 0xa0, 0xa7, 0xa7, 0x07,
|
||||
0xd3, 0x34, 0x31, 0x0c, 0x03, 0xe0, 0xb9, 0x43, 0x87, 0x0e, 0x8d, 0xdc,
|
||||
0x15, 0x00, 0xe3, 0xe3, 0xe3, 0xbd, 0x42, 0x88, 0x49, 0x21, 0x44, 0x52,
|
||||
0x08, 0x81, 0xa6, 0x69, 0x13, 0x6f, 0xbc, 0xf1, 0x46, 0xff, 0xad, 0x16,
|
||||
0x39, 0x71, 0xe2, 0x44, 0x3e, 0xe8, 0x85, 0x7c, 0x3e, 0xaf, 0xa8, 0xb3,
|
||||
0x1e, 0x84, 0x69, 0x9a, 0xcc, 0xcc, 0xcc, 0x60, 0xdb, 0x36, 0x03, 0x03,
|
||||
0x03, 0x24, 0x93, 0x49, 0x0c, 0xc3, 0x40, 0xd7, 0x75, 0x7c, 0xdf, 0xff,
|
||||
0xe0, 0xae, 0x00, 0x10, 0x42, 0x4c, 0xc8, 0xcd, 0xb7, 0x66, 0x52, 0xd3,
|
||||
0xb4, 0x89, 0xb7, 0xde, 0x7a, 0x2b, 0x79, 0xab, 0x85, 0x3e, 0xfa, 0xe8,
|
||||
0xa3, 0x3f, 0x6b, 0x9a, 0x36, 0x27, 0x37, 0xbb, 0xba, 0xba, 0x4a, 0xe0,
|
||||
0x7d, 0x74, 0x5d, 0xc7, 0x30, 0x0c, 0x4c, 0xd3, 0x24, 0x1c, 0x0e, 0x33,
|
||||
0x3b, 0x3b, 0x4b, 0x67, 0x67, 0x27, 0x9d, 0x9d, 0x9d, 0x92, 0x46, 0x08,
|
||||
0x21, 0x86, 0x47, 0x47, 0x47, 0xfb, 0xef, 0x08, 0xc0, 0xf8, 0xf8, 0xf8,
|
||||
0x21, 0x21, 0xc4, 0x70, 0xf0, 0xc7, 0x5b, 0xb3, 0x5f, 0xd3, 0xb4, 0x89,
|
||||
0x7f, 0x42, 0xa5, 0xa3, 0x2d, 0x8f, 0xe1, 0x38, 0x0e, 0xcd, 0x66, 0x13,
|
||||
0xf9, 0x59, 0x08, 0x81, 0x61, 0x18, 0x84, 0x42, 0x21, 0x55, 0x23, 0x32,
|
||||
0x99, 0x0c, 0x7d, 0x7d, 0x7d, 0x41, 0x00, 0x00, 0x87, 0xee, 0x08, 0x80,
|
||||
0x10, 0xe2, 0xb8, 0xdc, 0x74, 0x38, 0x1c, 0xe6, 0xe1, 0x87, 0x1f, 0x0e,
|
||||
0x82, 0xd8, 0xf7, 0xf6, 0xdb, 0x6f, 0xff, 0xe9, 0x56, 0x8b, 0x7d, 0xf8,
|
||||
0xe1, 0x87, 0x7f, 0xd5, 0x34, 0xed, 0x8c, 0x7c, 0x3e, 0x9b, 0xcd, 0xaa,
|
||||
0x77, 0x0d, 0xc3, 0x50, 0x00, 0x22, 0x91, 0x08, 0x91, 0x48, 0x04, 0xc7,
|
||||
0x71, 0x78, 0xe0, 0x81, 0x07, 0x88, 0xc5, 0x62, 0x0a, 0xa4, 0x4c, 0xc9,
|
||||
0x9b, 0x02, 0xf0, 0xe2, 0x8b, 0x2f, 0x0e, 0x03, 0xbd, 0x2d, 0x6b, 0xb2,
|
||||
0x67, 0xcf, 0x1e, 0x0e, 0x1c, 0x38, 0xc0, 0x43, 0x0f, 0x3d, 0x14, 0x04,
|
||||
0x71, 0xfc, 0xdd, 0x77, 0xdf, 0xbd, 0xe5, 0x8f, 0x08, 0x21, 0x7a, 0xe5,
|
||||
0xb3, 0xb6, 0x6d, 0xd3, 0x68, 0x34, 0xd0, 0x75, 0x1d, 0x5d, 0xd7, 0x09,
|
||||
0x85, 0x42, 0xca, 0x03, 0xa1, 0x50, 0x08, 0x5d, 0xd7, 0xa9, 0x54, 0x2a,
|
||||
0x44, 0x22, 0x11, 0x34, 0x4d, 0x6d, 0xa5, 0x77, 0x74, 0x74, 0x34, 0xb9,
|
||||
0x59, 0x0f, 0x3c, 0x2d, 0xff, 0xb0, 0x2c, 0x8b, 0xae, 0xae, 0x2e, 0xc2,
|
||||
0xe1, 0x30, 0x63, 0x63, 0x63, 0x58, 0x96, 0x15, 0x04, 0x31, 0xf1, 0xfe,
|
||||
0xfb, 0xef, 0xff, 0x8e, 0xab, 0xef, 0xbc, 0xf3, 0xce, 0x84, 0x34, 0x80,
|
||||
0x34, 0x42, 0xad, 0x56, 0x43, 0xd3, 0xb4, 0xdf, 0x59, 0x3f, 0x14, 0x0a,
|
||||
0x61, 0x18, 0x06, 0x8d, 0x46, 0x03, 0xd3, 0x34, 0xd7, 0x2f, 0xb5, 0x73,
|
||||
0xb3, 0x00, 0x86, 0x5b, 0x6e, 0x24, 0x14, 0x0a, 0xd1, 0xd5, 0xd5, 0xc5,
|
||||
0xe5, 0xcb, 0x97, 0x29, 0x97, 0xcb, 0x1c, 0x39, 0x72, 0x84, 0x48, 0x24,
|
||||
0x22, 0x9f, 0x4b, 0x0a, 0x21, 0x26, 0x3e, 0xf8, 0xe0, 0x83, 0x24, 0xc0,
|
||||
0xb1, 0x63, 0xc7, 0x86, 0xdf, 0x7b, 0xef, 0xbd, 0x49, 0x60, 0x4c, 0xbe,
|
||||
0x0f, 0xd0, 0xdd, 0xdd, 0x4d, 0x22, 0x91, 0x50, 0x81, 0x1b, 0x89, 0x44,
|
||||
0xb0, 0x2c, 0x8b, 0x70, 0x38, 0x8c, 0x69, 0x9a, 0x68, 0x9a, 0x46, 0xbd,
|
||||
0x5e, 0xbf, 0x99, 0xd8, 0xdb, 0x74, 0x0c, 0xf4, 0xfb, 0xbe, 0x8f, 0x10,
|
||||
0x82, 0x8e, 0x8e, 0x0e, 0x1a, 0x8d, 0x06, 0xe7, 0xcf, 0x9f, 0x67, 0x6a,
|
||||
0x6a, 0x8a, 0x78, 0x3c, 0xce, 0xfe, 0xfd, 0xfb, 0x83, 0x6a, 0xb3, 0xdf,
|
||||
0xf3, 0xbc, 0x0b, 0xc7, 0x8e, 0x1d, 0xfb, 0xcd, 0xf7, 0xfd, 0xc9, 0xa0,
|
||||
0x22, 0xb5, 0x2c, 0x8b, 0x27, 0x9e, 0x78, 0x82, 0xc7, 0x1f, 0x7f, 0x5c,
|
||||
0x59, 0xde, 0xb2, 0x2c, 0x2c, 0xcb, 0x22, 0x12, 0x89, 0x10, 0x0e, 0x87,
|
||||
0x55, 0x5d, 0x28, 0x95, 0x4a, 0x34, 0x9b, 0xcd, 0xa0, 0xc8, 0xdb, 0x1c,
|
||||
0x80, 0xe7, 0x9f, 0x7f, 0xbe, 0xbf, 0xc5, 0x61, 0x00, 0xda, 0xdb, 0xdb,
|
||||
0xb9, 0x74, 0xe9, 0x92, 0xe2, 0xf2, 0xf7, 0xdf, 0x7f, 0x4f, 0x77, 0x77,
|
||||
0x37, 0xfb, 0xf7, 0xef, 0x57, 0x16, 0xf3, 0x3c, 0xaf, 0xd7, 0xf7, 0xfd,
|
||||
0x5e, 0xf9, 0xb9, 0xb3, 0xb3, 0x93, 0xa7, 0x9e, 0x7a, 0x8a, 0xa3, 0x47,
|
||||
0x8f, 0xb2, 0x73, 0xe7, 0x4e, 0x66, 0x66, 0x66, 0x08, 0x87, 0xc3, 0x58,
|
||||
0x96, 0x45, 0x34, 0x1a, 0x25, 0x1a, 0x8d, 0x62, 0x59, 0x96, 0xda, 0xbc,
|
||||
0xe7, 0x79, 0xb8, 0xae, 0x4b, 0xb5, 0x5a, 0xc5, 0x75, 0xdd, 0x4d, 0x79,
|
||||
0x21, 0x78, 0x22, 0x4b, 0x04, 0x02, 0x91, 0xf6, 0xf6, 0x76, 0xae, 0x5e,
|
||||
0xbd, 0xaa, 0xb2, 0x83, 0x6d, 0xdb, 0x9c, 0x3f, 0x7f, 0x9e, 0xdd, 0xbb,
|
||||
0x77, 0x33, 0x34, 0x34, 0xc4, 0x8f, 0x3f, 0xfe, 0xa8, 0x62, 0x65, 0xc7,
|
||||
0x8e, 0x1d, 0x0c, 0x0e, 0x0e, 0xf2, 0xe0, 0x83, 0x0f, 0xe2, 0x79, 0x1e,
|
||||
0x99, 0x4c, 0x86, 0x9f, 0x7e, 0xfa, 0x09, 0xd7, 0x75, 0xb1, 0x2c, 0x8b,
|
||||
0x58, 0x2c, 0x46, 0x2c, 0x16, 0x23, 0x1a, 0x8d, 0x62, 0x18, 0x06, 0xae,
|
||||
0xeb, 0xe2, 0xba, 0x2e, 0xf5, 0x7a, 0x9d, 0x46, 0xa3, 0x41, 0xb1, 0x58,
|
||||
0x54, 0xba, 0x29, 0x20, 0xb5, 0x37, 0x06, 0x20, 0x88, 0x5e, 0x06, 0x9f,
|
||||
0xeb, 0xba, 0x37, 0xe4, 0xe8, 0xf9, 0xf9, 0x79, 0x84, 0x10, 0x0c, 0x0d,
|
||||
0x0d, 0xfd, 0x6f, 0x20, 0x24, 0x93, 0xec, 0xd8, 0xb1, 0x83, 0x70, 0x38,
|
||||
0x8c, 0xef, 0xfb, 0xac, 0xac, 0xac, 0x70, 0xf9, 0xf2, 0x65, 0xd6, 0xd6,
|
||||
0xd6, 0x30, 0x4d, 0x53, 0x59, 0xbd, 0xad, 0xad, 0x8d, 0x58, 0x2c, 0x46,
|
||||
0x28, 0x14, 0xc2, 0xf7, 0x7d, 0xea, 0xf5, 0x3a, 0xf5, 0x7a, 0x9d, 0x5a,
|
||||
0xad, 0x86, 0x6d, 0xdb, 0x54, 0xab, 0xd5, 0xe0, 0xe6, 0xed, 0x74, 0x3a,
|
||||
0x3d, 0xbf, 0x29, 0x00, 0x12, 0x84, 0x10, 0x82, 0x7c, 0x3e, 0xaf, 0xaa,
|
||||
0xa7, 0x4c, 0x83, 0xbe, 0xef, 0x73, 0xf5, 0xea, 0x55, 0x7e, 0xfb, 0xed,
|
||||
0x37, 0xf6, 0xec, 0xd9, 0xa3, 0x16, 0x99, 0x9f, 0x9f, 0x67, 0x7e, 0x7e,
|
||||
0x5e, 0xc9, 0xe7, 0x68, 0x34, 0xaa, 0xa8, 0x23, 0x2d, 0x2f, 0x13, 0x40,
|
||||
0xad, 0x56, 0xa3, 0x5a, 0xad, 0x52, 0xa9, 0x54, 0xa8, 0x56, 0xab, 0x5c,
|
||||
0xbf, 0x7e, 0x9d, 0x46, 0xa3, 0x11, 0xa4, 0xd0, 0x99, 0x4d, 0x51, 0xc8,
|
||||
0xf7, 0xfd, 0xb9, 0xe0, 0xf1, 0x6f, 0x69, 0x69, 0x89, 0x9e, 0x9e, 0x1e,
|
||||
0x55, 0xfe, 0xa5, 0x17, 0x7c, 0xdf, 0xe7, 0xe7, 0x9f, 0x7f, 0xc6, 0x75,
|
||||
0x5d, 0xca, 0xe5, 0x32, 0x2b, 0x2b, 0x2b, 0xd4, 0x6a, 0x35, 0x84, 0x10,
|
||||
0x44, 0xa3, 0x51, 0x95, 0x71, 0x64, 0xd0, 0x46, 0xa3, 0x51, 0x42, 0xa1,
|
||||
0x10, 0x42, 0x08, 0xea, 0xf5, 0x3a, 0xd5, 0x6a, 0x95, 0x72, 0xb9, 0x4c,
|
||||
0xa9, 0x54, 0x62, 0x6d, 0x6d, 0x0d, 0xdb, 0xb6, 0xd7, 0x07, 0xf1, 0x97,
|
||||
0x9b, 0x3e, 0x0f, 0x1c, 0x3e, 0x7c, 0xd8, 0x37, 0x0c, 0x43, 0xa5, 0xbc,
|
||||
0xee, 0xee, 0x6e, 0x52, 0xa9, 0x14, 0x91, 0x48, 0xe4, 0x77, 0x20, 0x5a,
|
||||
0x3a, 0xfe, 0x06, 0xad, 0x63, 0x9a, 0xa6, 0x2a, 0x54, 0xc1, 0x74, 0x09,
|
||||
0xd0, 0x68, 0x34, 0x28, 0x95, 0x4a, 0x38, 0x8e, 0x83, 0x6d, 0xdb, 0xe4,
|
||||
0xf3, 0x79, 0x66, 0x66, 0x66, 0x70, 0x1c, 0x87, 0x5a, 0xad, 0x26, 0xd7,
|
||||
0x5b, 0x4a, 0xa7, 0xd3, 0x5d, 0x9b, 0x4e, 0xa3, 0xbe, 0xef, 0x4f, 0xfb,
|
||||
0xbe, 0xaf, 0x82, 0xcc, 0xb6, 0x6d, 0x5c, 0xd7, 0x05, 0x50, 0x95, 0x34,
|
||||
0x12, 0x89, 0x10, 0x8b, 0xc5, 0x68, 0x6f, 0x6f, 0x27, 0x1e, 0x8f, 0x13,
|
||||
0x8f, 0xc7, 0x49, 0x26, 0x93, 0x37, 0xcc, 0x44, 0x22, 0xa1, 0x2c, 0x0f,
|
||||
0x50, 0xaf, 0xd7, 0x29, 0x97, 0xcb, 0x14, 0x0a, 0x05, 0x1c, 0xc7, 0xa1,
|
||||
0x58, 0x2c, 0xb2, 0xb0, 0xb0, 0x40, 0xb1, 0x58, 0xa4, 0xd1, 0x68, 0x28,
|
||||
0x63, 0x78, 0x9e, 0x97, 0x3c, 0x70, 0xe0, 0x40, 0xff, 0x1d, 0x01, 0x90,
|
||||
0x9b, 0x97, 0x16, 0xcb, 0xe7, 0xf3, 0x8a, 0xa3, 0x42, 0x08, 0x45, 0x11,
|
||||
0x09, 0x22, 0x91, 0x48, 0x28, 0x20, 0x6d, 0x6d, 0x6d, 0x6a, 0xe3, 0xba,
|
||||
0xae, 0xab, 0x14, 0x29, 0xd7, 0xc9, 0xe7, 0xf3, 0x38, 0x8e, 0xc3, 0xf2,
|
||||
0xf2, 0x32, 0x99, 0x4c, 0x86, 0x7a, 0xbd, 0x7e, 0x43, 0xfa, 0x14, 0x42,
|
||||
0x44, 0x75, 0x5d, 0x9f, 0x3c, 0x78, 0xf0, 0x60, 0xff, 0xa6, 0x00, 0x78,
|
||||
0x9e, 0x77, 0xc6, 0xf3, 0x3c, 0x9a, 0xcd, 0x26, 0xcd, 0x66, 0x93, 0x5a,
|
||||
0xad, 0xc6, 0xea, 0xea, 0x2a, 0x85, 0x42, 0x81, 0x5a, 0xad, 0x46, 0xad,
|
||||
0x56, 0xa3, 0xd9, 0x6c, 0xaa, 0x4c, 0x25, 0xe3, 0x43, 0x6a, 0x1c, 0xc3,
|
||||
0x30, 0x10, 0x42, 0xa8, 0xf3, 0xaf, 0xa4, 0xcc, 0xda, 0xda, 0x1a, 0x6b,
|
||||
0x6b, 0x6b, 0xe4, 0xf3, 0x79, 0x56, 0x56, 0x56, 0x58, 0x58, 0x58, 0x50,
|
||||
0x59, 0x2e, 0x98, 0x38, 0x5a, 0x27, 0xb8, 0xa4, 0xa6, 0x69, 0x13, 0x07,
|
||||
0x0f, 0x1e, 0x4c, 0x6e, 0xb4, 0x0e, 0x00, 0x7c, 0xe9, 0x79, 0x1e, 0x42,
|
||||
0x08, 0x1a, 0x8d, 0x06, 0x42, 0x08, 0x4a, 0xa5, 0x12, 0x57, 0xae, 0x5c,
|
||||
0x51, 0xdc, 0xbf, 0x59, 0xaf, 0x47, 0xc6, 0x84, 0x2c, 0x4e, 0x12, 0xbc,
|
||||
0xb4, 0xbe, 0x9c, 0x8b, 0x8b, 0x8b, 0x64, 0x32, 0x19, 0xb5, 0x79, 0x49,
|
||||
0x9d, 0xbd, 0x7b, 0xf7, 0xb2, 0xb4, 0xb4, 0xc4, 0xc2, 0xc2, 0x82, 0x2c,
|
||||
0xa4, 0xfd, 0xbe, 0xef, 0x4f, 0x00, 0x7f, 0xdc, 0xf0, 0xa1, 0x7e, 0x74,
|
||||
0x74, 0xf4, 0x63, 0xe0, 0xa8, 0x4c, 0x9d, 0x41, 0xca, 0x6c, 0xdd, 0xba,
|
||||
0x95, 0x2d, 0x5b, 0xb6, 0x28, 0x49, 0x10, 0x0a, 0x85, 0xd4, 0x91, 0x50,
|
||||
0x5a, 0x5e, 0x16, 0xa8, 0x5a, 0xad, 0xa6, 0x52, 0x65, 0xa1, 0x50, 0x60,
|
||||
0x61, 0x61, 0xe1, 0x06, 0x3a, 0xca, 0xcd, 0x3f, 0xf3, 0xcc, 0x33, 0x3c,
|
||||
0xf9, 0xe4, 0x93, 0x9c, 0x3d, 0x7b, 0x96, 0x6f, 0xbe, 0xf9, 0x86, 0x95,
|
||||
0x95, 0x15, 0x15, 0x83, 0xae, 0xeb, 0x1e, 0x3d, 0x7d, 0xfa, 0xf4, 0xc9,
|
||||
0x8d, 0xf6, 0x46, 0x8f, 0x03, 0xfb, 0x5c, 0xd7, 0xed, 0x0d, 0x48, 0x06,
|
||||
0x5c, 0xd7, 0xa5, 0x56, 0xab, 0xe1, 0x38, 0x0e, 0x9d, 0x9d, 0x9d, 0x2a,
|
||||
0x65, 0xca, 0x3a, 0x11, 0x94, 0x06, 0x8d, 0x46, 0x43, 0xa5, 0xcc, 0xd5,
|
||||
0xd5, 0x55, 0x95, 0x6a, 0x65, 0xba, 0x94, 0xeb, 0xf6, 0xf5, 0xf5, 0x51,
|
||||
0xa9, 0x54, 0x10, 0x42, 0xb0, 0x7b, 0xf7, 0x6e, 0xb2, 0xd9, 0x2c, 0x3f,
|
||||
0xfc, 0xf0, 0x03, 0xa5, 0x52, 0x49, 0x49, 0xf7, 0x67, 0x9f, 0x7d, 0xf6,
|
||||
0xaf, 0x9f, 0x7d, 0xf6, 0xd9, 0xdc, 0x86, 0xda, 0x2a, 0xa3, 0xa3, 0xa3,
|
||||
0x3b, 0x5b, 0x05, 0x45, 0x9e, 0x89, 0x95, 0x37, 0xa4, 0x38, 0x4b, 0x24,
|
||||
0x12, 0xb4, 0xb7, 0xb7, 0x2b, 0x20, 0x92, 0x4a, 0xcd, 0x66, 0x53, 0x05,
|
||||
0x6d, 0x2e, 0x97, 0xa3, 0xd1, 0x68, 0xd0, 0x6c, 0x36, 0x6f, 0xb0, 0xba,
|
||||
0x61, 0x18, 0xf4, 0xf4, 0xf4, 0xd0, 0xd1, 0xd1, 0xa1, 0xfe, 0xde, 0xbb,
|
||||
0x77, 0x2f, 0x8e, 0xe3, 0x70, 0xfa, 0xf4, 0x69, 0x2e, 0x5d, 0xba, 0x14,
|
||||
0xf4, 0xc2, 0xa9, 0xcf, 0x3f, 0xff, 0xfc, 0xf0, 0x86, 0xfb, 0x42, 0x2d,
|
||||
0x10, 0x5f, 0x4a, 0x7d, 0x1f, 0xcc, 0xf7, 0x72, 0x1a, 0x86, 0x11, 0x3c,
|
||||
0x49, 0xe1, 0x79, 0x9e, 0xf2, 0x82, 0x9c, 0xf2, 0x3b, 0xf9, 0x3b, 0xf1,
|
||||
0x78, 0x9c, 0xbe, 0xbe, 0x3e, 0xa5, 0x89, 0xe4, 0xba, 0x83, 0x83, 0x83,
|
||||
0x6c, 0xdb, 0xb6, 0x8d, 0xd9, 0xd9, 0x59, 0xbe, 0xfa, 0xea, 0x2b, 0x32,
|
||||
0x99, 0x4c, 0x70, 0x9d, 0x87, 0xbf, 0xf8, 0xe2, 0x8b, 0xb9, 0x0d, 0xb5,
|
||||
0x55, 0xd2, 0xe9, 0xf4, 0x3f, 0x80, 0x7e, 0x59, 0x19, 0x25, 0x95, 0x9a,
|
||||
0xcd, 0x26, 0x8d, 0x46, 0x43, 0x71, 0x3c, 0x38, 0x65, 0xe0, 0x4a, 0x91,
|
||||
0x26, 0x2d, 0x2f, 0x37, 0xff, 0xd8, 0x63, 0x8f, 0x31, 0x34, 0x34, 0x44,
|
||||
0x32, 0x99, 0x54, 0x31, 0x23, 0xe9, 0x36, 0x35, 0x35, 0x85, 0xe3, 0x38,
|
||||
0xa4, 0x52, 0x29, 0x7a, 0x7b, 0x7b, 0xd7, 0x27, 0x8d, 0x3f, 0xdd, 0x51,
|
||||
0x67, 0x6e, 0x74, 0x74, 0xf4, 0x0f, 0xad, 0xd8, 0x18, 0xde, 0x8c, 0x66,
|
||||
0xef, 0xea, 0xea, 0x62, 0x60, 0x60, 0x80, 0x44, 0x22, 0x41, 0xb5, 0x5a,
|
||||
0xc5, 0x71, 0x1c, 0x1c, 0xc7, 0xa1, 0x52, 0xa9, 0xdc, 0x50, 0xc8, 0x1e,
|
||||
0x79, 0xe4, 0x11, 0xb6, 0x6f, 0xdf, 0xce, 0xf2, 0xf2, 0x32, 0xdf, 0x7e,
|
||||
0xfb, 0x2d, 0xd9, 0x6c, 0x36, 0xe8, 0xd1, 0xd4, 0xd7, 0x5f, 0x7f, 0x6d,
|
||||
0x6f, 0xa8, 0x33, 0x17, 0xf0, 0xc6, 0xdf, 0xd2, 0xe9, 0xf4, 0x48, 0xcb,
|
||||
0x23, 0xa7, 0xfe, 0x2f, 0x72, 0x57, 0x66, 0x9b, 0x54, 0x2a, 0x45, 0x77,
|
||||
0x77, 0xb7, 0xea, 0xd0, 0x49, 0xa9, 0x62, 0x9a, 0xe6, 0xef, 0xbc, 0x30,
|
||||
0x3b, 0x3b, 0xab, 0xce, 0xc8, 0x5b, 0xb6, 0x6c, 0x51, 0xf4, 0x6b, 0x01,
|
||||
0x7c, 0xfa, 0x8e, 0x6f, 0x68, 0x5a, 0xb4, 0x3a, 0xdc, 0xf2, 0xca, 0xf6,
|
||||
0x56, 0x7c, 0xf4, 0x06, 0xce, 0xc1, 0xd3, 0xd9, 0x6c, 0xf6, 0xe5, 0x4a,
|
||||
0xa5, 0xf2, 0x5f, 0xb2, 0xa9, 0x1b, 0x89, 0x44, 0x58, 0x59, 0x59, 0x21,
|
||||
0x1e, 0x8f, 0x63, 0x9a, 0xa6, 0x9a, 0xe1, 0x70, 0x98, 0x4a, 0xa5, 0x02,
|
||||
0xa0, 0xa8, 0x56, 0xad, 0x56, 0xc9, 0x64, 0x32, 0x98, 0xa6, 0x49, 0x22,
|
||||
0x91, 0x40, 0xd7, 0x75, 0x9a, 0xcd, 0xa6, 0xa4, 0xef, 0xbe, 0xd6, 0x05,
|
||||
0xc9, 0xdd, 0xb9, 0x62, 0x6a, 0x69, 0xf6, 0x79, 0xe0, 0x6f, 0xc1, 0xef,
|
||||
0x47, 0x46, 0x46, 0xa6, 0x81, 0x69, 0xd7, 0x75, 0x93, 0xf5, 0x7a, 0x9d,
|
||||
0x62, 0xb1, 0x48, 0x2e, 0x97, 0xe3, 0xfa, 0xf5, 0xeb, 0x4a, 0x95, 0xea,
|
||||
0xba, 0x4e, 0x38, 0x1c, 0x56, 0x20, 0x84, 0x10, 0xaa, 0xfa, 0x2f, 0x2e,
|
||||
0x2e, 0xb2, 0x75, 0xeb, 0x56, 0xf5, 0x6c, 0xc0, 0x03, 0xfd, 0x1b, 0x6e,
|
||||
0xee, 0x6e, 0x66, 0x4c, 0x4e, 0x4e, 0xce, 0x03, 0x27, 0x64, 0x4a, 0x2d,
|
||||
0x97, 0xcb, 0xe4, 0xf3, 0x79, 0x96, 0x96, 0x96, 0xc8, 0xe7, 0xf3, 0x54,
|
||||
0xab, 0x55, 0x7c, 0xdf, 0xc7, 0x34, 0x4d, 0xe5, 0xa1, 0x56, 0x6f, 0x54,
|
||||
0x55, 0xf0, 0x4a, 0xa5, 0x82, 0xe7, 0x79, 0xea, 0x82, 0xa4, 0x35, 0x7b,
|
||||
0xef, 0x09, 0x80, 0x16, 0x88, 0x3f, 0xb7, 0xbc, 0x40, 0xbd, 0x5e, 0xa7,
|
||||
0x50, 0x28, 0x90, 0xcd, 0x66, 0xb9, 0x72, 0xe5, 0x0a, 0x85, 0x42, 0x81,
|
||||
0x4a, 0xa5, 0xa2, 0xea, 0x41, 0xb0, 0x43, 0x21, 0x53, 0xaa, 0x1c, 0x12,
|
||||
0x88, 0x9c, 0xf7, 0x0c, 0x40, 0x6b, 0x8c, 0x01, 0xb6, 0xe4, 0xb6, 0xe3,
|
||||
0x38, 0x5c, 0xbb, 0x76, 0xed, 0x06, 0x10, 0xae, 0xeb, 0xa2, 0x69, 0x9a,
|
||||
0x8a, 0x0b, 0x5d, 0xd7, 0x89, 0xc7, 0xe3, 0x00, 0xe4, 0x72, 0x39, 0xca,
|
||||
0xe5, 0x72, 0x10, 0x80, 0x7d, 0x4f, 0x01, 0x4c, 0x4e, 0x4e, 0xfe, 0x03,
|
||||
0x38, 0x2a, 0xb3, 0x4c, 0xa9, 0x54, 0x22, 0x97, 0xcb, 0xb1, 0xb8, 0xb8,
|
||||
0xc8, 0xfc, 0xfc, 0x3c, 0xb6, 0x6d, 0x53, 0x2a, 0x95, 0xa8, 0xd7, 0xeb,
|
||||
0x48, 0x01, 0x99, 0x4a, 0xa5, 0xb0, 0x2c, 0x8b, 0x72, 0xb9, 0xcc, 0x2f,
|
||||
0xbf, 0xfc, 0xa2, 0x52, 0x68, 0x0b, 0xc0, 0x99, 0x7b, 0x72, 0x4f, 0xbc,
|
||||
0x0e, 0xc4, 0x5f, 0x46, 0x46, 0x46, 0x86, 0x3d, 0xcf, 0x1b, 0x93, 0x20,
|
||||
0xa4, 0xd4, 0x2e, 0x14, 0x0a, 0x74, 0x74, 0x74, 0xa8, 0xe6, 0x56, 0x22,
|
||||
0x91, 0x20, 0x95, 0x4a, 0x91, 0xcd, 0x66, 0x39, 0x7b, 0xf6, 0xac, 0x6a,
|
||||
0xd1, 0x07, 0x54, 0xef, 0x97, 0xff, 0xb2, 0x7b, 0xe2, 0x7f, 0x36, 0x46,
|
||||
0x46, 0x46, 0x26, 0x80, 0xb1, 0x20, 0x5d, 0xe4, 0x19, 0xa2, 0xad, 0xad,
|
||||
0x8d, 0x54, 0x2a, 0x45, 0x28, 0x14, 0x62, 0x69, 0x69, 0x89, 0xe5, 0xe5,
|
||||
0xe5, 0x9b, 0x75, 0xeb, 0xa6, 0x27, 0x27, 0x27, 0xff, 0xe3, 0xbe, 0x01,
|
||||
0x08, 0x82, 0x90, 0xe2, 0x50, 0x0a, 0xc4, 0xa0, 0x64, 0x08, 0xaa, 0xd5,
|
||||
0xc0, 0xb0, 0x81, 0xfe, 0x56, 0x76, 0xbb, 0x7f, 0x00, 0x5a, 0x20, 0x3e,
|
||||
0x06, 0x8e, 0x06, 0x1b, 0x68, 0xeb, 0x8e, 0xb4, 0xeb, 0x5f, 0x99, 0x06,
|
||||
0xc6, 0x5a, 0xf1, 0x74, 0xcf, 0xb3, 0xd0, 0xcd, 0x62, 0xe2, 0xad, 0x96,
|
||||
0x9e, 0x9a, 0xbe, 0xd9, 0x8d, 0xfe, 0xfa, 0x9b, 0x2b, 0x60, 0xf8, 0x76,
|
||||
0x9b, 0xbf, 0xe7, 0x1e, 0x58, 0xe7, 0x8d, 0xa7, 0x5b, 0xa9, 0xb6, 0x3f,
|
||||
0x20, 0x45, 0xce, 0xb4, 0xc0, 0x9d, 0xb8, 0x15, 0x65, 0xfe, 0x6d, 0x00,
|
||||
0xdc, 0xad, 0xf1, 0x3f, 0x1b, 0xc1, 0xe6, 0x81, 0xe7, 0x14, 0x15, 0x38,
|
||||
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
277
Source/Core/DolphinWX/resources/toolbar_debugger_pause.c
Normal file
277
Source/Core/DolphinWX/resources/toolbar_debugger_pause.c
Normal file
@ -0,0 +1,277 @@
|
||||
static const unsigned char toolbar_pause_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00,
|
||||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
|
||||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b,
|
||||
0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00,
|
||||
0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
|
||||
0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69,
|
||||
0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20,
|
||||
0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00,
|
||||
0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x34,
|
||||
0x2f, 0x30, 0x34, 0x79, 0x5e, 0xa3, 0xd5, 0x00, 0x00, 0x0c, 0x2e, 0x49,
|
||||
0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x4b, 0x6c, 0x5d, 0xd7, 0x75,
|
||||
0x86, 0xbf, 0xbd, 0xf7, 0x79, 0xdc, 0x87, 0x28, 0x5d, 0x52, 0x22, 0x29,
|
||||
0x25, 0x96, 0x2c, 0x45, 0xb0, 0x55, 0x35, 0x4e, 0xa4, 0xa2, 0xa3, 0x0c,
|
||||
0x6a, 0x2b, 0x40, 0x50, 0x4f, 0x0a, 0xc8, 0xb3, 0x0e, 0x0c, 0x23, 0xca,
|
||||
0xa4, 0x4a, 0x1c, 0xc0, 0x4a, 0x07, 0x1d, 0x09, 0x45, 0x64, 0x18, 0xa9,
|
||||
0x03, 0x03, 0xae, 0x65, 0xb5, 0x40, 0x91, 0x64, 0xa0, 0x00, 0x0d, 0xa7,
|
||||
0x85, 0xd3, 0x0e, 0xda, 0xa2, 0x69, 0xa1, 0x38, 0x9d, 0x14, 0x28, 0x50,
|
||||
0x39, 0xb1, 0x91, 0x0a, 0xb2, 0x65, 0x3d, 0x28, 0x89, 0x22, 0xef, 0x25,
|
||||
0xef, 0x9b, 0xf7, 0x3c, 0xf6, 0x5e, 0x1d, 0xec, 0x73, 0x1f, 0x94, 0x48,
|
||||
0x89, 0xb2, 0x83, 0x1a, 0xde, 0xc0, 0xc1, 0xb9, 0x8f, 0x7d, 0xcf, 0xf9,
|
||||
0xff, 0xb5, 0xfe, 0xfd, 0xaf, 0xb5, 0x0f, 0xa9, 0x44, 0x84, 0xcf, 0xf3,
|
||||
0xd0, 0x9f, 0x35, 0x80, 0x4f, 0x3b, 0x82, 0xcf, 0xf2, 0xe6, 0xa7, 0x4f,
|
||||
0xff, 0x58, 0x0d, 0x5f, 0xff, 0xe8, 0x47, 0x7f, 0xf6, 0x89, 0xa4, 0xa0,
|
||||
0x7e, 0x57, 0x12, 0xfa, 0xe1, 0x0f, 0xff, 0xe5, 0xa0, 0x88, 0x9c, 0x10,
|
||||
0x71, 0x27, 0x9c, 0x73, 0x07, 0x9d, 0x93, 0x63, 0x22, 0xae, 0xe6, 0x9c,
|
||||
0xc3, 0x39, 0x87, 0x88, 0xbb, 0xee, 0x9c, 0xbb, 0xe1, 0x9c, 0xbb, 0xe4,
|
||||
0x9c, 0x7b, 0xaf, 0xd5, 0xea, 0xff, 0x7c, 0x93, 0xcb, 0x08, 0x3c, 0x1e,
|
||||
0x99, 0x4f, 0x45, 0xe0, 0xcd, 0x37, 0xff, 0xa3, 0x26, 0xe2, 0x5e, 0x10,
|
||||
0x91, 0x33, 0x22, 0x72, 0xdc, 0x03, 0x15, 0x26, 0x40, 0x8f, 0x5e, 0x6f,
|
||||
0x7c, 0x6f, 0x71, 0xce, 0x35, 0x9d, 0x73, 0xff, 0x68, 0xad, 0xfb, 0xfb,
|
||||
0xf5, 0xf5, 0xfc, 0x97, 0x05, 0xf8, 0xe1, 0x01, 0x20, 0xdb, 0x21, 0xf2,
|
||||
0x89, 0x09, 0xbc, 0xf5, 0xd6, 0xa5, 0x73, 0x20, 0x67, 0x9c, 0x93, 0x9a,
|
||||
0x88, 0x50, 0x2a, 0xc5, 0x54, 0xab, 0x55, 0xa6, 0xa6, 0xa6, 0x50, 0x4a,
|
||||
0x11, 0x45, 0xf1, 0x08, 0x6c, 0x96, 0x65, 0xf4, 0xfb, 0x5d, 0xba, 0xdd,
|
||||
0x3e, 0x9d, 0x4e, 0x8b, 0x4e, 0xa7, 0x43, 0x9e, 0x67, 0x93, 0xe4, 0xde,
|
||||
0xb5, 0xd6, 0xfe, 0x45, 0x9a, 0x72, 0xb9, 0x20, 0xe0, 0x86, 0x64, 0x1e,
|
||||
0x45, 0xe2, 0xb1, 0xd7, 0xc0, 0xdb, 0x6f, 0xbf, 0x7b, 0x42, 0x29, 0x75,
|
||||
0x51, 0x6b, 0x7d, 0x50, 0x6b, 0xcd, 0xcc, 0xcc, 0x0c, 0x4f, 0x3e, 0xb9,
|
||||
0x97, 0xdd, 0xbb, 0xcb, 0x54, 0x2a, 0x01, 0x41, 0xa0, 0x09, 0x02, 0x83,
|
||||
0xb5, 0xe0, 0x1c, 0xf4, 0x7a, 0x29, 0xdd, 0x6e, 0x42, 0xab, 0xd5, 0xa7,
|
||||
0xd1, 0x68, 0x33, 0x33, 0x33, 0x4d, 0x9a, 0xa6, 0xb4, 0x5a, 0x6b, 0xdc,
|
||||
0xbd, 0xbb, 0x44, 0x92, 0x24, 0x00, 0xcf, 0x2a, 0xa5, 0xfe, 0x2b, 0x0c,
|
||||
0xed, 0x5f, 0x65, 0x99, 0x7e, 0x0d, 0x50, 0x05, 0x89, 0x21, 0x91, 0x2d,
|
||||
0xc7, 0x63, 0x65, 0xe0, 0xc2, 0x85, 0xff, 0x3c, 0xa7, 0x94, 0xfa, 0x3e,
|
||||
0xc0, 0xdc, 0xdc, 0x2c, 0xcf, 0x3c, 0xb3, 0x9f, 0xb9, 0xb9, 0x98, 0x38,
|
||||
0xd6, 0x38, 0xc7, 0x08, 0xf4, 0xc3, 0x5e, 0x2f, 0x2f, 0x37, 0x59, 0x5c,
|
||||
0x5c, 0xa2, 0xdf, 0x5f, 0xc7, 0xb9, 0x9c, 0x95, 0x95, 0x15, 0x96, 0x97,
|
||||
0x97, 0x47, 0x19, 0x11, 0x71, 0xbf, 0xb2, 0x56, 0xfe, 0x54, 0x24, 0x68,
|
||||
0x00, 0x16, 0x70, 0x0f, 0xcb, 0xc2, 0xb6, 0x33, 0x70, 0xe1, 0xc2, 0xaf,
|
||||
0x2e, 0x6a, 0xad, 0x4f, 0xc5, 0x71, 0xcc, 0x57, 0xbf, 0x7a, 0x84, 0xa7,
|
||||
0x9f, 0xde, 0x41, 0xa9, 0xa4, 0x46, 0xe0, 0xd6, 0xd7, 0x2d, 0xab, 0xab,
|
||||
0x29, 0xed, 0x76, 0xc6, 0x60, 0xe0, 0x0f, 0x6b, 0x2d, 0xce, 0x59, 0xa2,
|
||||
0xc8, 0x10, 0xc7, 0x21, 0xe5, 0x72, 0x4c, 0xad, 0x36, 0xc5, 0xf4, 0x74,
|
||||
0x8d, 0xbb, 0x77, 0x97, 0xf9, 0xf8, 0xe3, 0x1b, 0x4c, 0x4f, 0xcf, 0x50,
|
||||
0x2e, 0x97, 0x59, 0x5c, 0xbc, 0xc5, 0xfa, 0xfa, 0x3a, 0xc0, 0x1f, 0x29,
|
||||
0x25, 0xff, 0x2a, 0x92, 0x3f, 0x0f, 0x41, 0x83, 0x8d, 0xeb, 0xe2, 0x81,
|
||||
0xb1, 0xad, 0x0c, 0xbc, 0xfd, 0xf6, 0xbb, 0x17, 0xb5, 0xd6, 0xa7, 0xaa,
|
||||
0xd5, 0x2a, 0xcf, 0x3e, 0xfb, 0x0c, 0x07, 0x0e, 0x84, 0xa3, 0x88, 0x36,
|
||||
0x1a, 0x96, 0xa5, 0xa5, 0x94, 0x7e, 0x3f, 0xc7, 0x39, 0x8b, 0xb5, 0xae,
|
||||
0x38, 0xdb, 0x89, 0xb3, 0xc3, 0x5a, 0x8b, 0xb5, 0x39, 0x79, 0xee, 0xa8,
|
||||
0xd5, 0x76, 0x30, 0x3f, 0x3f, 0x4f, 0x9a, 0xe6, 0xbc, 0xff, 0xfe, 0x07,
|
||||
0x64, 0x59, 0x82, 0xb5, 0x96, 0xbb, 0x77, 0xef, 0xd0, 0x6a, 0x35, 0x87,
|
||||
0xeb, 0xe2, 0x37, 0x22, 0xea, 0x8f, 0x95, 0x8a, 0xea, 0x80, 0xdd, 0x2a,
|
||||
0x0b, 0x8f, 0x2c, 0x64, 0x6f, 0xbd, 0x75, 0xe9, 0x22, 0x70, 0x6a, 0xd7,
|
||||
0xae, 0x1a, 0xcf, 0x3f, 0xff, 0x15, 0xf6, 0xef, 0x0f, 0x8b, 0x88, 0xc3,
|
||||
0xd5, 0xab, 0x39, 0x8b, 0x8b, 0x39, 0x49, 0x22, 0x28, 0xa5, 0x00, 0x85,
|
||||
0x2a, 0x9c, 0xdd, 0x9f, 0x55, 0x71, 0x8c, 0xe2, 0x05, 0x40, 0xa3, 0xb1,
|
||||
0xc6, 0xaf, 0x7f, 0xfd, 0x3e, 0x6b, 0x6b, 0x6b, 0x1c, 0x3d, 0xfa, 0xfb,
|
||||
0x68, 0x6d, 0x70, 0x4e, 0x98, 0x9b, 0x9b, 0xa7, 0x54, 0xaa, 0x0c, 0x7f,
|
||||
0xf7, 0x15, 0x11, 0xfb, 0x13, 0xc0, 0xdc, 0x77, 0x91, 0xed, 0x13, 0x78,
|
||||
0xf3, 0xcd, 0x7f, 0x3f, 0x23, 0x22, 0xa7, 0x4a, 0xa5, 0x12, 0x5f, 0xff,
|
||||
0xfa, 0x11, 0x66, 0x66, 0x02, 0x9c, 0x83, 0x7a, 0x5d, 0xf8, 0xe8, 0x23,
|
||||
0x61, 0x30, 0x78, 0x14, 0x7d, 0x46, 0x84, 0xfc, 0xeb, 0xf1, 0x1b, 0x11,
|
||||
0xb8, 0x7d, 0x7b, 0x91, 0x0f, 0x3f, 0xfc, 0x90, 0xc3, 0x87, 0x9f, 0x1e,
|
||||
0xd9, 0xef, 0xfc, 0xfc, 0x3c, 0x41, 0x30, 0x52, 0xf6, 0x9f, 0xe4, 0x79,
|
||||
0xef, 0x15, 0x40, 0x4f, 0x16, 0xbd, 0x6d, 0x11, 0x78, 0xe3, 0x8d, 0x7f,
|
||||
0x3b, 0x2e, 0x22, 0xe7, 0x8d, 0x31, 0x7c, 0xed, 0x6b, 0xcf, 0x30, 0x33,
|
||||
0xe3, 0x23, 0x7f, 0xf3, 0xa6, 0xe5, 0xce, 0x1d, 0x6f, 0x7f, 0x20, 0x0c,
|
||||
0x15, 0xb8, 0xb9, 0x14, 0xc7, 0xdf, 0x0f, 0xdf, 0x8f, 0x39, 0xf8, 0xef,
|
||||
0xfa, 0xfd, 0x0e, 0x37, 0x6f, 0x5e, 0x67, 0xdf, 0xbe, 0x2f, 0x22, 0x22,
|
||||
0x28, 0xa5, 0x99, 0x9d, 0x9d, 0x65, 0x42, 0xf6, 0x67, 0xb3, 0xac, 0x7b,
|
||||
0x68, 0x2b, 0x9c, 0x0f, 0xc9, 0x80, 0x5c, 0x14, 0x81, 0xa3, 0x47, 0x9f,
|
||||
0x62, 0xff, 0xfe, 0x32, 0xce, 0xc1, 0x8d, 0x1b, 0x29, 0xab, 0xab, 0x79,
|
||||
0x51, 0x88, 0xec, 0xa8, 0x38, 0x79, 0xf0, 0x82, 0x88, 0x8c, 0x88, 0x8c,
|
||||
0x81, 0x8f, 0x19, 0xf8, 0xcf, 0x64, 0xc3, 0x77, 0x22, 0xd0, 0xe9, 0xb4,
|
||||
0x69, 0x36, 0xd7, 0x08, 0xc3, 0x12, 0x22, 0x8e, 0x38, 0x2e, 0xb1, 0x63,
|
||||
0xc7, 0xd4, 0x70, 0xd2, 0x2e, 0x11, 0xf7, 0x97, 0x6c, 0x21, 0xa3, 0x4d,
|
||||
0x5d, 0xe8, 0xf5, 0xd7, 0xff, 0xf9, 0x9b, 0x5a, 0xeb, 0xe3, 0xbb, 0x76,
|
||||
0xed, 0xe4, 0xa9, 0xa7, 0x76, 0xa3, 0x94, 0xa2, 0x5e, 0xcf, 0x68, 0x34,
|
||||
0x32, 0x94, 0xd2, 0x13, 0x52, 0x10, 0x3e, 0xf8, 0xe0, 0x32, 0x8d, 0x46,
|
||||
0x9d, 0x6e, 0xb7, 0x43, 0xb3, 0xd9, 0xe0, 0xcb, 0x5f, 0x3e, 0xce, 0xe1,
|
||||
0xc3, 0x47, 0x0a, 0x32, 0x7e, 0xd6, 0xb5, 0x6b, 0x57, 0x69, 0xb7, 0xd7,
|
||||
0xe8, 0xf7, 0xfb, 0x74, 0x3a, 0x6d, 0x0e, 0x1c, 0x38, 0xc4, 0xfc, 0xfc,
|
||||
0xbe, 0x11, 0x71, 0xf0, 0x24, 0x94, 0x52, 0x38, 0xe7, 0x3f, 0xab, 0xd5,
|
||||
0xa6, 0x69, 0xb5, 0x5a, 0xc3, 0x80, 0xbc, 0x94, 0x24, 0xcd, 0x57, 0x81,
|
||||
0x8f, 0xb6, 0x45, 0x40, 0x44, 0xce, 0x89, 0x08, 0x47, 0x8f, 0x7e, 0x89,
|
||||
0x9d, 0x3b, 0x23, 0x06, 0x03, 0xc7, 0xe2, 0xe2, 0x3a, 0xce, 0x29, 0x94,
|
||||
0x92, 0x11, 0x81, 0xf7, 0xde, 0xfb, 0x6f, 0xae, 0x5e, 0xfd, 0x0d, 0xdf,
|
||||
0xf8, 0xc6, 0x1f, 0x02, 0x7b, 0x80, 0x43, 0x54, 0xab, 0xf3, 0xa4, 0xa9,
|
||||
0x1b, 0x65, 0xe3, 0xca, 0x95, 0x0f, 0x58, 0x5c, 0xfc, 0xa8, 0x98, 0x33,
|
||||
0x1c, 0x55, 0x96, 0x97, 0x53, 0x44, 0xc0, 0x39, 0x29, 0xf4, 0x2f, 0x38,
|
||||
0x97, 0xe3, 0x9c, 0x43, 0x29, 0x30, 0xc6, 0x50, 0xad, 0x56, 0xe9, 0x76,
|
||||
0xdb, 0x43, 0xc7, 0x7b, 0x05, 0x38, 0xf3, 0x48, 0x02, 0xaf, 0xbd, 0xf6,
|
||||
0x4f, 0x27, 0xb5, 0xd6, 0x07, 0xa7, 0xa7, 0x6b, 0xcc, 0xce, 0x56, 0x71,
|
||||
0x0e, 0x6e, 0xdd, 0xea, 0x93, 0x65, 0x76, 0x14, 0xfd, 0x61, 0x02, 0x96,
|
||||
0x96, 0x6e, 0xf3, 0xf2, 0xcb, 0x27, 0x39, 0x72, 0x64, 0xff, 0xe8, 0xf7,
|
||||
0x69, 0x6a, 0xf9, 0xc5, 0x2f, 0x96, 0x0b, 0x02, 0x8e, 0x46, 0x63, 0xe5,
|
||||
0x81, 0x39, 0x49, 0x92, 0xf3, 0xb3, 0x9f, 0xfd, 0xcf, 0x28, 0x43, 0x9e,
|
||||
0x84, 0xbb, 0x6f, 0x3d, 0x29, 0x2a, 0x95, 0x2a, 0xbd, 0x6e, 0xbb, 0xc8,
|
||||
0x92, 0x3b, 0x79, 0xfa, 0xf4, 0x8f, 0xbf, 0x77, 0xbf, 0x9d, 0x3e, 0xb0,
|
||||
0x06, 0x44, 0xe4, 0x94, 0x88, 0x63, 0xcf, 0x9e, 0xdd, 0x4c, 0x4f, 0x97,
|
||||
0x69, 0xb7, 0x53, 0xd6, 0xd6, 0xd6, 0x27, 0x9a, 0x30, 0xef, 0xf5, 0xd6,
|
||||
0x3a, 0xd6, 0xd6, 0x1a, 0x1b, 0x80, 0x81, 0x77, 0x9a, 0x21, 0x78, 0x11,
|
||||
0xa1, 0xdd, 0x6e, 0x3e, 0x74, 0xce, 0x70, 0x1d, 0xf9, 0x9b, 0x3b, 0x10,
|
||||
0x41, 0x2b, 0x85, 0x42, 0xa8, 0x56, 0xca, 0x80, 0x1a, 0x8a, 0xff, 0xc9,
|
||||
0x5e, 0xaf, 0x7e, 0xfc, 0x7e, 0xbc, 0x1b, 0x08, 0x9c, 0x3b, 0xf7, 0x0f,
|
||||
0x35, 0x11, 0xf7, 0x42, 0x10, 0x84, 0xcc, 0xce, 0xce, 0x14, 0x96, 0x39,
|
||||
0x04, 0xef, 0x8a, 0x82, 0xe4, 0x89, 0x74, 0x3a, 0x2d, 0xe6, 0xe7, 0x6b,
|
||||
0x88, 0x50, 0x48, 0xc1, 0x1f, 0xad, 0xd6, 0xb0, 0x25, 0x10, 0xfa, 0xfd,
|
||||
0x1e, 0x7b, 0xf7, 0x4e, 0x3f, 0x30, 0xa7, 0x5e, 0xef, 0x8f, 0xa4, 0x33,
|
||||
0x5e, 0xf4, 0x5e, 0xfb, 0x4a, 0x15, 0x55, 0xa0, 0x90, 0x51, 0x1c, 0x97,
|
||||
0x40, 0xa9, 0xe2, 0x1a, 0x72, 0xf2, 0x7e, 0x02, 0x1b, 0x24, 0xe4, 0x9c,
|
||||
0x3c, 0xa7, 0xb5, 0x50, 0xad, 0x56, 0xa8, 0x56, 0x23, 0xb2, 0xcc, 0x51,
|
||||
0xaf, 0xf7, 0x0a, 0xcd, 0x7b, 0x8b, 0x1b, 0x46, 0xb0, 0xdb, 0xed, 0xf0,
|
||||
0xc4, 0x13, 0xb3, 0x38, 0x1f, 0xb4, 0x51, 0xfa, 0x93, 0x64, 0xdc, 0x36,
|
||||
0xf7, 0x7a, 0xdd, 0x4d, 0xe7, 0x0c, 0x06, 0x76, 0x43, 0xab, 0x2d, 0x4e,
|
||||
0x0a, 0xd0, 0x0a, 0xa5, 0x14, 0x5a, 0x29, 0x9c, 0x38, 0x9c, 0x40, 0x10,
|
||||
0x18, 0xd4, 0xd8, 0xc9, 0x8e, 0x3d, 0x34, 0x03, 0x22, 0x72, 0x5c, 0xc4,
|
||||
0x51, 0xa9, 0x54, 0x28, 0x95, 0x42, 0xda, 0xed, 0x64, 0x43, 0xe4, 0x27,
|
||||
0xdb, 0x82, 0x7b, 0xf7, 0xee, 0x32, 0x33, 0xb3, 0x13, 0x6b, 0xd9, 0x70,
|
||||
0x34, 0x9b, 0xe9, 0x48, 0x16, 0x8d, 0xc6, 0xca, 0xa6, 0x73, 0xea, 0xf5,
|
||||
0xde, 0xc4, 0xe2, 0x1d, 0xdb, 0xb0, 0x42, 0x11, 0x68, 0x4d, 0x60, 0x34,
|
||||
0x46, 0x1b, 0xb4, 0x86, 0x52, 0x29, 0x9e, 0xc8, 0x10, 0xb5, 0x87, 0x66,
|
||||
0xc0, 0xef, 0xa6, 0x34, 0x41, 0x10, 0x50, 0xa9, 0x94, 0xb8, 0x73, 0x67,
|
||||
0x15, 0xe7, 0x6c, 0x11, 0x99, 0x8d, 0x0b, 0x38, 0x4d, 0x13, 0x0e, 0x1f,
|
||||
0xfe, 0x3d, 0xac, 0x9d, 0xf4, 0x7c, 0x0a, 0x37, 0xf1, 0x04, 0xb2, 0x2c,
|
||||
0xe5, 0xf0, 0xe1, 0xfd, 0x5b, 0xce, 0x19, 0x06, 0x04, 0xf1, 0xe0, 0x8d,
|
||||
0x06, 0xa3, 0x15, 0x46, 0x6b, 0x10, 0x87, 0x28, 0x8d, 0x56, 0x3e, 0xfe,
|
||||
0xc5, 0xef, 0x4f, 0x3c, 0x82, 0x80, 0xd4, 0xc0, 0x11, 0xc7, 0x71, 0xd1,
|
||||
0xcb, 0x0f, 0x0a, 0x5b, 0xdb, 0x68, 0x9f, 0xa0, 0x68, 0x36, 0xd7, 0x28,
|
||||
0x95, 0xe2, 0x07, 0xe4, 0xe1, 0xf5, 0x3d, 0x5c, 0xc0, 0xad, 0x4d, 0xe7,
|
||||
0xdc, 0xb9, 0xd3, 0x2a, 0x9a, 0x3b, 0x87, 0x73, 0x82, 0xc2, 0x61, 0x94,
|
||||
0xf2, 0xe0, 0x8d, 0xc6, 0x68, 0x8d, 0x20, 0x38, 0xbc, 0xa4, 0xfc, 0x5d,
|
||||
0x37, 0x6f, 0x3a, 0xef, 0x5b, 0x03, 0xee, 0xf8, 0x50, 0x87, 0xce, 0x41,
|
||||
0xbb, 0xdd, 0x9b, 0x88, 0xbc, 0xbf, 0xcc, 0xf0, 0xdc, 0xef, 0x77, 0xd9,
|
||||
0xbb, 0x77, 0x6e, 0x14, 0xdd, 0xb1, 0x25, 0x8e, 0x9d, 0x65, 0x7d, 0xbd,
|
||||
0xbf, 0xc5, 0x9c, 0x71, 0xb7, 0x2a, 0x62, 0xd1, 0x4a, 0xa1, 0x15, 0x18,
|
||||
0x6d, 0x08, 0x4d, 0x80, 0x56, 0x3e, 0x4b, 0x5a, 0xb9, 0x91, 0x63, 0x6d,
|
||||
0x8b, 0x80, 0xb7, 0x33, 0x5d, 0x80, 0xa0, 0x88, 0xfe, 0x64, 0xa7, 0x39,
|
||||
0x26, 0x51, 0x2e, 0x07, 0x23, 0x57, 0xd9, 0x4a, 0x42, 0x95, 0x4a, 0xb8,
|
||||
0xe9, 0x9c, 0x3c, 0x9f, 0x94, 0x8f, 0xbf, 0x9e, 0x29, 0xb4, 0x1f, 0x18,
|
||||
0x8d, 0x02, 0x8c, 0x76, 0xe4, 0x4e, 0x91, 0x65, 0xe9, 0x16, 0x7d, 0xd6,
|
||||
0xa6, 0x19, 0x10, 0x94, 0x72, 0x63, 0x02, 0xd6, 0x47, 0x80, 0x22, 0x03,
|
||||
0xe3, 0x16, 0x19, 0x6a, 0xb5, 0x9d, 0xa3, 0xc8, 0x3a, 0x37, 0xbe, 0x46,
|
||||
0xb7, 0x9b, 0x14, 0x91, 0x95, 0x2d, 0xe7, 0xb4, 0x5a, 0x5d, 0xf2, 0xdc,
|
||||
0x4b, 0xc8, 0x28, 0xaf, 0xfb, 0xd0, 0x18, 0xa2, 0x30, 0x20, 0x0c, 0x8c,
|
||||
0x6f, 0xea, 0xac, 0xb7, 0xd2, 0x2c, 0xcb, 0x70, 0x63, 0x02, 0x97, 0x1f,
|
||||
0x99, 0x01, 0x85, 0x22, 0x49, 0x12, 0xda, 0xed, 0x5e, 0x91, 0x91, 0x71,
|
||||
0x4f, 0xef, 0x5b, 0x09, 0x3f, 0x37, 0x0c, 0xcb, 0x1b, 0xa2, 0x3b, 0xbc,
|
||||
0x47, 0x1c, 0x07, 0xf4, 0x7a, 0xeb, 0x88, 0x08, 0xc6, 0xc4, 0x9b, 0xce,
|
||||
0xf1, 0xeb, 0xa2, 0x85, 0xc2, 0xa1, 0x95, 0xf6, 0xe0, 0x83, 0x80, 0x28,
|
||||
0x30, 0x04, 0xc6, 0x90, 0xd9, 0x1c, 0xa5, 0x15, 0x0a, 0x45, 0xaf, 0xd7,
|
||||
0x9d, 0xcc, 0x40, 0xf3, 0x7e, 0x02, 0x1b, 0x6c, 0xd4, 0x39, 0x77, 0x49,
|
||||
0x44, 0x48, 0x93, 0x01, 0xfd, 0xde, 0x3a, 0xc3, 0xdd, 0x9c, 0x12, 0xc1,
|
||||
0x15, 0x05, 0x2c, 0xcf, 0xf3, 0xc2, 0x46, 0x1b, 0x0f, 0xd8, 0xa3, 0x73,
|
||||
0x3e, 0x6a, 0xd6, 0x5a, 0xf2, 0x7c, 0xeb, 0x39, 0xc6, 0x78, 0x97, 0x31,
|
||||
0x4a, 0x11, 0x05, 0x86, 0x52, 0x14, 0x50, 0x8a, 0x43, 0xe2, 0x30, 0xc0,
|
||||
0x14, 0xc0, 0x15, 0x8a, 0x24, 0x4d, 0x8a, 0xe8, 0x8f, 0x08, 0x5c, 0x7a,
|
||||
0x14, 0x81, 0xa6, 0x73, 0x42, 0xaf, 0xd7, 0x61, 0xb5, 0xb1, 0x4a, 0xb9,
|
||||
0x14, 0xa3, 0x47, 0x99, 0x11, 0x10, 0x8b, 0x38, 0x87, 0xcd, 0x73, 0x8c,
|
||||
0x31, 0x9b, 0x6e, 0xda, 0x2b, 0x95, 0x88, 0x3c, 0xcf, 0xc8, 0xf3, 0x14,
|
||||
0xad, 0xf5, 0xa6, 0x73, 0xa6, 0xa7, 0xa7, 0x30, 0x4a, 0x13, 0x87, 0x21,
|
||||
0x95, 0x38, 0xa6, 0x1c, 0x45, 0x94, 0xc2, 0x80, 0x30, 0x08, 0x50, 0xba,
|
||||
0xf0, 0x1c, 0x11, 0xd6, 0x9a, 0x4d, 0xac, 0x95, 0xc9, 0x0c, 0x3c, 0x20,
|
||||
0xa1, 0xfb, 0x0b, 0xd9, 0x65, 0x41, 0xe8, 0x75, 0x7b, 0x0c, 0x06, 0x7d,
|
||||
0xcf, 0x5c, 0x1c, 0x81, 0x02, 0x8d, 0xa0, 0x44, 0xa1, 0xf0, 0x99, 0x78,
|
||||
0xe2, 0x89, 0x27, 0xe9, 0xf7, 0x93, 0x11, 0xb0, 0xe1, 0x39, 0x49, 0x52,
|
||||
0xb2, 0x2c, 0x23, 0xcb, 0x32, 0xe6, 0xe6, 0xf6, 0x6d, 0x3a, 0x27, 0x4f,
|
||||
0x73, 0xe2, 0x30, 0xa0, 0x1c, 0x45, 0x54, 0xe2, 0x88, 0x72, 0x1c, 0x11,
|
||||
0x47, 0x61, 0xe1, 0xff, 0xe0, 0x10, 0xac, 0x38, 0x9a, 0xcd, 0xb5, 0x0d,
|
||||
0x4d, 0xde, 0x76, 0x32, 0xf0, 0x8e, 0x6f, 0x01, 0x7a, 0xd8, 0x3c, 0x27,
|
||||
0x4b, 0x32, 0x8c, 0x02, 0xad, 0x14, 0x81, 0x56, 0x04, 0x5a, 0xd0, 0x80,
|
||||
0x12, 0xa8, 0x96, 0xab, 0x5c, 0xb9, 0x72, 0x9b, 0x5e, 0x6f, 0x0c, 0x70,
|
||||
0x65, 0xa5, 0xc5, 0xb5, 0x6b, 0x77, 0xc9, 0xb2, 0x9c, 0x34, 0xcd, 0x30,
|
||||
0x26, 0xe2, 0xf2, 0xe5, 0x0f, 0xe9, 0x74, 0xd6, 0x47, 0x73, 0xee, 0x2d,
|
||||
0xad, 0xb2, 0xb4, 0x78, 0x8f, 0x6a, 0x29, 0x62, 0xaa, 0x12, 0xb3, 0xa3,
|
||||
0x1c, 0x53, 0x8a, 0x42, 0x02, 0xe3, 0xbd, 0xdf, 0x8a, 0x23, 0xb7, 0x8e,
|
||||
0xc6, 0xea, 0x1a, 0x49, 0x9a, 0x61, 0x9d, 0x1d, 0xc2, 0x7b, 0x67, 0x61,
|
||||
0xe1, 0x6c, 0xeb, 0x7e, 0x02, 0x0f, 0x3c, 0x95, 0x38, 0xf3, 0xca, 0x4f,
|
||||
0x3e, 0x0e, 0xc3, 0xe0, 0xe0, 0x17, 0xf7, 0xed, 0x63, 0xdf, 0xfc, 0x3c,
|
||||
0x51, 0x18, 0x10, 0x68, 0x0d, 0x78, 0x3f, 0xce, 0xad, 0x25, 0xcd, 0x2d,
|
||||
0xb9, 0xf5, 0x87, 0xb5, 0x0e, 0xeb, 0x7c, 0x41, 0xb2, 0x85, 0xfb, 0x88,
|
||||
0x13, 0x9c, 0xf8, 0x1e, 0x87, 0xa2, 0xeb, 0xd4, 0x28, 0x02, 0xa3, 0x08,
|
||||
0x03, 0x53, 0x48, 0x27, 0xa2, 0x1c, 0x85, 0x44, 0x61, 0x80, 0x56, 0x8a,
|
||||
0xdc, 0x39, 0x06, 0x69, 0x46, 0x77, 0x30, 0xa0, 0xb3, 0x3e, 0xe0, 0xb7,
|
||||
0x57, 0xfe, 0x97, 0x6e, 0xbf, 0x47, 0x96, 0xdb, 0xa1, 0x84, 0x5e, 0x58,
|
||||
0x58, 0x38, 0xfb, 0xc0, 0xf3, 0xd4, 0x4d, 0x36, 0x34, 0xf2, 0x73, 0x67,
|
||||
0xdd, 0x99, 0x7a, 0xbd, 0xce, 0x9e, 0x99, 0x3d, 0x44, 0x81, 0x46, 0xa1,
|
||||
0x09, 0xb4, 0x77, 0x23, 0xa3, 0x7c, 0xda, 0xb2, 0x22, 0x7d, 0xf9, 0xf0,
|
||||
0x2c, 0x16, 0xa5, 0x7d, 0x01, 0x14, 0x05, 0x1a, 0x05, 0xc6, 0xb7, 0xc5,
|
||||
0x46, 0x19, 0x8c, 0xd6, 0x44, 0x81, 0x21, 0x0e, 0x03, 0x4a, 0x51, 0x48,
|
||||
0x1c, 0x86, 0x44, 0xa1, 0x41, 0x29, 0x45, 0x5e, 0x04, 0x21, 0xcd, 0x73,
|
||||
0xd2, 0xdc, 0x72, 0xfb, 0xce, 0x22, 0x83, 0x24, 0xc1, 0x8e, 0xfa, 0x24,
|
||||
0xae, 0x6f, 0x06, 0x7e, 0x53, 0x02, 0x22, 0x72, 0xde, 0x3a, 0x7b, 0x26,
|
||||
0xcd, 0x52, 0x56, 0xea, 0xf7, 0x88, 0xbf, 0xf0, 0x05, 0x02, 0xed, 0xdb,
|
||||
0xdc, 0xc0, 0x28, 0x42, 0x09, 0x08, 0x8d, 0x26, 0x37, 0x9a, 0xcc, 0x6a,
|
||||
0xd2, 0x5c, 0x79, 0x4f, 0xd7, 0xca, 0x67, 0x62, 0x18, 0x79, 0x0c, 0x1a,
|
||||
0x30, 0x46, 0x11, 0x68, 0x43, 0x18, 0x68, 0x6f, 0x95, 0x61, 0x40, 0x14,
|
||||
0x04, 0x04, 0xc6, 0x67, 0x35, 0x77, 0x96, 0xdc, 0x59, 0x06, 0x69, 0xc6,
|
||||
0x20, 0xcb, 0x58, 0x69, 0xd4, 0x69, 0xac, 0x36, 0xc9, 0xf2, 0xbc, 0xd8,
|
||||
0x5e, 0x02, 0x70, 0x6e, 0x33, 0xf0, 0x9b, 0x4a, 0x08, 0xe0, 0xbb, 0xdf,
|
||||
0xfd, 0xbb, 0x9f, 0x86, 0x41, 0xf0, 0xcd, 0x52, 0x14, 0xf2, 0xd4, 0x97,
|
||||
0x0e, 0x31, 0xbd, 0xab, 0x46, 0x29, 0x0c, 0x88, 0xc3, 0x80, 0xa0, 0xb0,
|
||||
0x39, 0x27, 0xe2, 0xed, 0xd2, 0xba, 0x09, 0x39, 0x15, 0x1b, 0x19, 0x7c,
|
||||
0xe5, 0xd0, 0xca, 0xf7, 0x36, 0xa1, 0xd1, 0x04, 0xc6, 0x14, 0x47, 0xd1,
|
||||
0xa0, 0x89, 0x90, 0x59, 0x4b, 0x92, 0x65, 0xf4, 0x93, 0x8c, 0x5e, 0x92,
|
||||
0x70, 0xaf, 0x5e, 0xe7, 0xe3, 0x1b, 0xd7, 0x59, 0x4f, 0x92, 0x49, 0x02,
|
||||
0x97, 0x17, 0x16, 0xce, 0xfe, 0xc1, 0x56, 0x04, 0x36, 0xdd, 0x13, 0x87,
|
||||
0x46, 0xbf, 0x9a, 0xe7, 0xd9, 0xc9, 0x14, 0x6a, 0xd7, 0x6f, 0xde, 0x22,
|
||||
0x38, 0x14, 0xa0, 0xa7, 0x76, 0xf8, 0xaa, 0x19, 0x86, 0x18, 0xa3, 0x09,
|
||||
0x14, 0x50, 0x54, 0x4d, 0xe7, 0x1c, 0xae, 0xd8, 0xd7, 0x4e, 0x5a, 0x86,
|
||||
0x2e, 0xaa, 0xb7, 0xd6, 0x1a, 0x53, 0x54, 0x73, 0x41, 0xb0, 0xce, 0x15,
|
||||
0xe0, 0x73, 0xfa, 0x49, 0x46, 0x3f, 0x49, 0x58, 0x69, 0x34, 0xb8, 0x71,
|
||||
0xeb, 0x26, 0x49, 0x9a, 0x93, 0x5b, 0x3b, 0x69, 0x9d, 0xa7, 0xb6, 0x02,
|
||||
0xbf, 0x65, 0x06, 0x00, 0x5e, 0xfe, 0xce, 0xdf, 0xfe, 0xb9, 0x52, 0xfa,
|
||||
0xaf, 0x4b, 0x51, 0x44, 0xb5, 0x5c, 0xe2, 0xf0, 0xa1, 0x83, 0xd4, 0xa6,
|
||||
0xa6, 0x28, 0x47, 0x61, 0x91, 0x09, 0xdf, 0x35, 0x6a, 0xad, 0x46, 0x75,
|
||||
0xc6, 0xc3, 0x2b, 0x46, 0x91, 0x86, 0xd1, 0xf3, 0x0b, 0xf1, 0xc0, 0x73,
|
||||
0xeb, 0xb5, 0xee, 0x23, 0x9f, 0xd2, 0x4f, 0x52, 0x16, 0xef, 0xdc, 0xe5,
|
||||
0xee, 0xf2, 0x12, 0x83, 0x24, 0x25, 0xcd, 0xb2, 0x49, 0xed, 0x7f, 0x6f,
|
||||
0x61, 0xe1, 0xec, 0xdb, 0x9f, 0x88, 0x00, 0xc0, 0xb7, 0x4f, 0x5f, 0x78,
|
||||
0x27, 0x30, 0xe6, 0x64, 0x5c, 0x90, 0x38, 0x78, 0xe0, 0x00, 0xd3, 0x3b,
|
||||
0xc7, 0x24, 0xa2, 0x20, 0xc0, 0x14, 0x44, 0x86, 0x3b, 0xaa, 0x91, 0x7e,
|
||||
0xc4, 0x93, 0x71, 0xe2, 0x1d, 0xca, 0x4b, 0xcd, 0x2f, 0xd2, 0x41, 0x9a,
|
||||
0xb1, 0x9e, 0xa6, 0xb4, 0xbb, 0x5d, 0x6e, 0x2c, 0x2e, 0xd2, 0x6c, 0xb7,
|
||||
0x19, 0x24, 0x29, 0xb9, 0xcd, 0xc9, 0xed, 0x08, 0xfc, 0x4f, 0x17, 0x16,
|
||||
0xce, 0x7e, 0xeb, 0x61, 0xe0, 0xe1, 0x11, 0x4f, 0xa7, 0x03, 0x63, 0x4e,
|
||||
0x25, 0x59, 0x76, 0x49, 0x44, 0x8e, 0x39, 0x67, 0xb9, 0x7a, 0xed, 0x1a,
|
||||
0xf3, 0x7b, 0x66, 0xd9, 0x3b, 0x37, 0x4b, 0x25, 0x8e, 0x89, 0x42, 0x4b,
|
||||
0x14, 0x18, 0x42, 0x63, 0x30, 0x5a, 0xa1, 0x95, 0x46, 0xa9, 0xa2, 0xef,
|
||||
0xa1, 0xb0, 0x56, 0xeb, 0xc8, 0x9d, 0x23, 0xcd, 0xf2, 0xc2, 0x65, 0x72,
|
||||
0xba, 0xfd, 0x75, 0x96, 0x56, 0x96, 0x59, 0xa9, 0xd7, 0xe9, 0x0f, 0x52,
|
||||
0xd2, 0x2c, 0xf5, 0x6b, 0xc8, 0x3d, 0x1e, 0xf8, 0x47, 0x66, 0x00, 0xe0,
|
||||
0xe5, 0x6f, 0xff, 0x4d, 0x2d, 0xcd, 0xf3, 0x4b, 0x81, 0x31, 0xc7, 0x46,
|
||||
0x1e, 0x5e, 0x2e, 0x31, 0xb7, 0x7b, 0x0f, 0x33, 0xb5, 0x1a, 0xe5, 0x52,
|
||||
0x4c, 0x38, 0x5a, 0x9c, 0x9e, 0x00, 0x82, 0x5f, 0x13, 0xe2, 0xb7, 0xa2,
|
||||
0x99, 0xb5, 0xa4, 0x59, 0x4e, 0xab, 0xd3, 0x61, 0xad, 0xd5, 0xa4, 0xbe,
|
||||
0xba, 0xca, 0x7a, 0xe2, 0x81, 0x67, 0x79, 0xb1, 0x37, 0x18, 0x57, 0xdc,
|
||||
0x6d, 0x83, 0xdf, 0x16, 0x01, 0x80, 0xef, 0x9c, 0xbe, 0x50, 0x4b, 0xd2,
|
||||
0xf4, 0x1d, 0xad, 0xf5, 0x73, 0x51, 0x68, 0x08, 0x03, 0xdf, 0xb7, 0x44,
|
||||
0x61, 0xc8, 0xce, 0x1d, 0x3b, 0xa8, 0x56, 0xaa, 0xec, 0xa8, 0x56, 0x88,
|
||||
0xc2, 0x08, 0x63, 0x0c, 0x00, 0xd6, 0xe6, 0x24, 0x69, 0xc6, 0x60, 0x30,
|
||||
0xa0, 0xdb, 0xeb, 0xd2, 0xea, 0x74, 0x48, 0xd2, 0x94, 0x41, 0x9a, 0x91,
|
||||
0xe5, 0x99, 0xb7, 0x5e, 0x67, 0x47, 0x45, 0xb0, 0x18, 0xe7, 0x16, 0x16,
|
||||
0xce, 0xbe, 0xba, 0x5d, 0xf0, 0xdb, 0x26, 0x30, 0x1c, 0xdf, 0x3a, 0xf5,
|
||||
0xc6, 0x39, 0xa5, 0xd4, 0xf7, 0x8d, 0xd6, 0x18, 0xe3, 0x8b, 0x53, 0x50,
|
||||
0x78, 0xba, 0xdf, 0x88, 0x98, 0x91, 0x84, 0xc0, 0x2f, 0x58, 0xe7, 0x86,
|
||||
0x36, 0x9b, 0x8f, 0xec, 0xd6, 0x39, 0x37, 0x92, 0x4b, 0x71, 0xfb, 0xeb,
|
||||
0xc0, 0xa9, 0x85, 0x85, 0xb3, 0xbf, 0x7c, 0x1c, 0xf0, 0x8f, 0x4d, 0x00,
|
||||
0xe0, 0xa5, 0x97, 0x5e, 0x3f, 0xa6, 0x94, 0x3a, 0xaf, 0x95, 0x3a, 0xa1,
|
||||
0x0a, 0xdd, 0x6b, 0xa5, 0xbc, 0x1b, 0xe1, 0xb7, 0x86, 0x30, 0xec, 0xff,
|
||||
0x0b, 0x19, 0x15, 0x51, 0x76, 0x32, 0x7e, 0xe4, 0x58, 0xdc, 0xb6, 0x09,
|
||||
0x9c, 0x7f, 0xdc, 0xa8, 0x7f, 0x2a, 0x02, 0xc3, 0xf1, 0xe2, 0x8b, 0x3f,
|
||||
0x78, 0x4e, 0x29, 0x4e, 0x69, 0xa5, 0x5f, 0x50, 0x4a, 0xd5, 0xb4, 0x1e,
|
||||
0x6e, 0xc0, 0xc7, 0x0f, 0x91, 0x87, 0x80, 0x9d, 0x13, 0x84, 0x0d, 0xc0,
|
||||
0x2f, 0x03, 0xe7, 0xd9, 0xa2, 0x41, 0xfb, 0x7f, 0x21, 0x30, 0x39, 0x5e,
|
||||
0x7c, 0xf1, 0x07, 0x27, 0x81, 0xe3, 0xf8, 0xc7, 0x1e, 0x07, 0x8b, 0x63,
|
||||
0x38, 0x9a, 0x78, 0xc0, 0xd7, 0xf1, 0xed, 0xf0, 0xa5, 0x85, 0x85, 0xb3,
|
||||
0x37, 0x3e, 0xf5, 0x4d, 0x8b, 0xf1, 0x3b, 0xfb, 0x4b, 0xfd, 0x67, 0x35,
|
||||
0x3e, 0xf7, 0xff, 0xec, 0xf1, 0xb9, 0x27, 0xf0, 0x7f, 0xca, 0x8f, 0x08,
|
||||
0x2e, 0x45, 0xb6, 0x8c, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
|
||||
0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
278
Source/Core/DolphinWX/resources/toolbar_debugger_play.c
Normal file
278
Source/Core/DolphinWX/resources/toolbar_debugger_play.c
Normal file
@ -0,0 +1,278 @@
|
||||
static const unsigned char toolbar_play_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00,
|
||||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
|
||||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b,
|
||||
0x12, 0x00, 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00,
|
||||
0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
|
||||
0x72, 0x65, 0x00, 0x4d, 0x61, 0x63, 0x72, 0x6f, 0x6d, 0x65, 0x64, 0x69,
|
||||
0x61, 0x20, 0x46, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20,
|
||||
0x4d, 0x58, 0x20, 0x32, 0x30, 0x30, 0x34, 0x87, 0x76, 0xac, 0xcf, 0x00,
|
||||
0x00, 0x00, 0x14, 0x74, 0x45, 0x58, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x00, 0x39, 0x2f, 0x34,
|
||||
0x2f, 0x30, 0x34, 0x79, 0x5e, 0xa3, 0xd5, 0x00, 0x00, 0x0c, 0x3b, 0x49,
|
||||
0x44, 0x41, 0x54, 0x78, 0x9c, 0xd5, 0x9a, 0x5b, 0x8c, 0x5d, 0xd5, 0x79,
|
||||
0xc7, 0x7f, 0x6b, 0xad, 0xbd, 0xf7, 0x39, 0x67, 0x8e, 0xc7, 0x3e, 0x33,
|
||||
0xe3, 0xb1, 0x31, 0xc1, 0xc6, 0xc4, 0x02, 0xcb, 0x15, 0xc1, 0x6e, 0x22,
|
||||
0x45, 0xb2, 0xaa, 0x82, 0x93, 0x87, 0xf8, 0x05, 0xc5, 0x48, 0x3c, 0x54,
|
||||
0x02, 0xa1, 0x38, 0x8a, 0x5a, 0x72, 0x91, 0xb8, 0x3c, 0xf0, 0xe4, 0x54,
|
||||
0x71, 0x84, 0x52, 0x22, 0x24, 0x0a, 0x76, 0x2b, 0x55, 0x69, 0x1f, 0x8c,
|
||||
0x54, 0xcd, 0x6b, 0x45, 0xda, 0x07, 0xd2, 0x44, 0x45, 0xb6, 0xd3, 0x48,
|
||||
0xb4, 0x02, 0xc9, 0x24, 0x10, 0xf0, 0x05, 0x18, 0xdb, 0x83, 0x2f, 0x33,
|
||||
0x73, 0xe6, 0x7e, 0x2e, 0xfb, 0xb2, 0xbe, 0xaf, 0x0f, 0x7b, 0x9f, 0xcb,
|
||||
0xd8, 0x33, 0xe3, 0x31, 0x44, 0x45, 0x2c, 0x69, 0xe9, 0xdc, 0xf7, 0xfe,
|
||||
0xff, 0xbf, 0xff, 0xb7, 0xfe, 0xdf, 0xb7, 0xd6, 0x8c, 0x51, 0x55, 0xbe,
|
||||
0xc8, 0xc3, 0x7e, 0xde, 0x00, 0x3e, 0xeb, 0x08, 0x3e, 0xcf, 0x9b, 0x3f,
|
||||
0xf9, 0xe4, 0x3f, 0x9b, 0xce, 0xf3, 0x5f, 0xfc, 0xe2, 0x6f, 0x3e, 0x55,
|
||||
0x2a, 0x98, 0x3f, 0x55, 0x0a, 0xfd, 0xfc, 0xe7, 0xbf, 0xda, 0xa9, 0xaa,
|
||||
0x07, 0x54, 0xe5, 0x80, 0x88, 0xec, 0x14, 0xd1, 0xbd, 0xaa, 0x52, 0x13,
|
||||
0x11, 0x44, 0x04, 0x55, 0x19, 0x17, 0x91, 0x8b, 0x22, 0x72, 0x52, 0x44,
|
||||
0xde, 0x99, 0x9f, 0x6f, 0xfe, 0x72, 0x85, 0xcb, 0x28, 0xdc, 0x1e, 0x99,
|
||||
0xcf, 0x44, 0xe0, 0xa5, 0x97, 0xde, 0xa8, 0xa9, 0xca, 0x23, 0xaa, 0xfa,
|
||||
0xb4, 0xaa, 0xee, 0xcb, 0x81, 0x2a, 0x7d, 0xa0, 0xbb, 0xcf, 0x97, 0xbf,
|
||||
0xf6, 0x88, 0xc8, 0x9c, 0x88, 0xfc, 0xbb, 0xf7, 0xf2, 0xaf, 0xad, 0x56,
|
||||
0x76, 0xaa, 0x00, 0xdf, 0x99, 0x00, 0xba, 0x1e, 0x22, 0x9f, 0x9a, 0xc0,
|
||||
0xcb, 0x2f, 0x9f, 0x3c, 0x0a, 0xfa, 0xb4, 0x88, 0xd6, 0x54, 0x95, 0x72,
|
||||
0xb9, 0x44, 0xb5, 0x5a, 0x65, 0x70, 0x70, 0x10, 0x63, 0x0c, 0x51, 0x54,
|
||||
0xea, 0x82, 0x4d, 0xd3, 0x94, 0x66, 0x73, 0x89, 0xa5, 0xa5, 0x26, 0x8b,
|
||||
0x8b, 0xf3, 0x2c, 0x2e, 0x2e, 0x92, 0x65, 0x69, 0x3f, 0xb9, 0xd3, 0xde,
|
||||
0xfb, 0xe7, 0x92, 0x84, 0x33, 0x05, 0x01, 0xe9, 0x90, 0xb9, 0x15, 0x89,
|
||||
0xdb, 0x5e, 0x03, 0xc7, 0x8e, 0x9d, 0x3e, 0x60, 0x8c, 0x39, 0x61, 0xad,
|
||||
0xdd, 0x69, 0xad, 0x65, 0x78, 0x78, 0x98, 0xbb, 0xef, 0xbe, 0x83, 0x91,
|
||||
0x91, 0x0a, 0x03, 0x03, 0x01, 0x41, 0x60, 0x09, 0x02, 0x87, 0xf7, 0x20,
|
||||
0x02, 0x8d, 0x46, 0xc2, 0xd2, 0x52, 0xcc, 0xfc, 0x7c, 0x93, 0x7a, 0x7d,
|
||||
0x81, 0xe1, 0xe1, 0x21, 0x92, 0x24, 0x61, 0x7e, 0x7e, 0x96, 0xab, 0x57,
|
||||
0xaf, 0x11, 0xc7, 0x31, 0xc0, 0x83, 0xc6, 0x98, 0xff, 0x09, 0x43, 0xff,
|
||||
0x77, 0x69, 0x6a, 0x9f, 0x07, 0x4c, 0x41, 0xa2, 0x43, 0x64, 0xd5, 0x71,
|
||||
0x5b, 0x0a, 0x1c, 0x3f, 0xfe, 0xdf, 0x47, 0x8d, 0x31, 0x3f, 0x01, 0xd8,
|
||||
0xb2, 0x65, 0x94, 0xfb, 0xef, 0xdf, 0xce, 0x96, 0x2d, 0x25, 0x4a, 0x25,
|
||||
0x8b, 0x08, 0x5d, 0xd0, 0x6b, 0x3d, 0x9f, 0x9c, 0x9c, 0x63, 0x62, 0xe2,
|
||||
0x1a, 0xcd, 0x66, 0x0b, 0x91, 0x8c, 0xa9, 0xa9, 0x29, 0x26, 0x27, 0x27,
|
||||
0xbb, 0x8a, 0xa8, 0xca, 0x6f, 0xbd, 0xd7, 0xbf, 0x52, 0x0d, 0xea, 0x80,
|
||||
0x07, 0x64, 0x2d, 0x15, 0xd6, 0xad, 0xc0, 0xf1, 0xe3, 0xbf, 0x3d, 0x61,
|
||||
0xad, 0x3d, 0x5c, 0x2a, 0x95, 0x78, 0xe0, 0x81, 0xdd, 0xdc, 0x77, 0xdf,
|
||||
0x06, 0xca, 0x65, 0xd3, 0x05, 0xd7, 0x6a, 0x79, 0x66, 0x66, 0x12, 0x16,
|
||||
0x16, 0x52, 0xda, 0xed, 0x7c, 0x7a, 0xef, 0x11, 0xf1, 0x44, 0x91, 0xa3,
|
||||
0x54, 0x0a, 0xa9, 0x54, 0x4a, 0xd4, 0x6a, 0x83, 0x0c, 0x0d, 0xd5, 0xb8,
|
||||
0x7a, 0x75, 0x92, 0x8f, 0x3f, 0xbe, 0xc8, 0xd0, 0xd0, 0x30, 0x95, 0x4a,
|
||||
0x85, 0x89, 0x89, 0xcb, 0xb4, 0x5a, 0x2d, 0x80, 0xbf, 0x34, 0x46, 0xff,
|
||||
0x53, 0x35, 0x3b, 0x08, 0x41, 0x9d, 0xe5, 0xeb, 0xe2, 0xa6, 0xb1, 0x2e,
|
||||
0x05, 0x8e, 0x1d, 0x3b, 0x7d, 0xc2, 0x5a, 0x7b, 0xb8, 0x5a, 0xad, 0xf2,
|
||||
0xe0, 0x83, 0xf7, 0xb3, 0x63, 0x47, 0xd8, 0x8d, 0x68, 0xbd, 0xee, 0xb9,
|
||||
0x76, 0x2d, 0xa1, 0xd9, 0xcc, 0x10, 0xf1, 0x78, 0x2f, 0xc5, 0xa3, 0xef,
|
||||
0x7b, 0x14, 0xbc, 0xf7, 0x78, 0x9f, 0x91, 0x65, 0x42, 0xad, 0xb6, 0x81,
|
||||
0xad, 0x5b, 0xb7, 0x92, 0x24, 0x19, 0xef, 0xbe, 0xfb, 0x1e, 0x69, 0x1a,
|
||||
0xe3, 0xbd, 0xe7, 0xea, 0xd5, 0x2b, 0xcc, 0xcf, 0xcf, 0x75, 0xd6, 0xc5,
|
||||
0x1f, 0x54, 0xcd, 0xb7, 0x8c, 0x89, 0xa6, 0x01, 0xbf, 0x9a, 0x0a, 0xb7,
|
||||
0x2c, 0x64, 0x2f, 0xbf, 0x7c, 0xf2, 0x04, 0x70, 0x78, 0xd3, 0xa6, 0x1a,
|
||||
0x07, 0x0f, 0x7e, 0x85, 0xed, 0xdb, 0xc3, 0x22, 0xe2, 0x70, 0xfe, 0x7c,
|
||||
0xc6, 0xc4, 0x44, 0x46, 0x1c, 0x2b, 0xc6, 0x18, 0xc0, 0x60, 0x0a, 0x67,
|
||||
0xcf, 0x1f, 0x4d, 0x31, 0xbb, 0xf1, 0x02, 0xa0, 0x5e, 0x9f, 0xe5, 0xf7,
|
||||
0xbf, 0x7f, 0x97, 0xd9, 0xd9, 0x59, 0xf6, 0xec, 0xf9, 0x33, 0xac, 0x75,
|
||||
0x88, 0x28, 0x5b, 0xb6, 0x6c, 0xa5, 0x5c, 0x1e, 0xe8, 0xfc, 0xee, 0x2b,
|
||||
0xaa, 0xfe, 0x5f, 0x00, 0x77, 0xc3, 0x45, 0xd6, 0x4f, 0xe0, 0xa5, 0x97,
|
||||
0xfe, 0xeb, 0x69, 0x55, 0x3d, 0x5c, 0x2e, 0x97, 0xf9, 0xc6, 0x37, 0x76,
|
||||
0x33, 0x3c, 0x1c, 0x20, 0x02, 0xd3, 0xd3, 0xca, 0x87, 0x1f, 0x2a, 0xed,
|
||||
0xf6, 0xad, 0xe8, 0xd3, 0x25, 0x94, 0x3f, 0xef, 0xbd, 0x50, 0x85, 0x4f,
|
||||
0x3e, 0x99, 0xe0, 0xc2, 0x85, 0x0b, 0xec, 0xda, 0x75, 0x5f, 0xd7, 0x7e,
|
||||
0xb7, 0x6e, 0xdd, 0x4a, 0x10, 0x74, 0x33, 0xfb, 0xe1, 0x2c, 0x6b, 0x3c,
|
||||
0x05, 0xd8, 0xfe, 0xa2, 0xb7, 0x2e, 0x02, 0x2f, 0xbe, 0xf8, 0x9b, 0x7d,
|
||||
0xaa, 0xfa, 0x8a, 0x73, 0x8e, 0xfd, 0xfb, 0xef, 0x67, 0x78, 0x38, 0x8f,
|
||||
0xfc, 0xa5, 0x4b, 0x9e, 0x2b, 0x57, 0x72, 0xfb, 0x03, 0xa5, 0x93, 0x81,
|
||||
0x2b, 0xa7, 0x62, 0xef, 0xf3, 0xce, 0xeb, 0x1e, 0x87, 0xfc, 0xb3, 0x66,
|
||||
0x73, 0x91, 0x4b, 0x97, 0xc6, 0xd9, 0xb6, 0xed, 0x4b, 0xa8, 0x2a, 0xc6,
|
||||
0x58, 0x46, 0x47, 0x47, 0xe9, 0x4b, 0xfb, 0x23, 0x69, 0xba, 0x74, 0xcf,
|
||||
0x6a, 0x38, 0xd7, 0x50, 0x40, 0x4f, 0xa8, 0xc2, 0x9e, 0x3d, 0xf7, 0xb2,
|
||||
0x7d, 0x7b, 0x05, 0x11, 0xb8, 0x78, 0x31, 0x61, 0x66, 0x26, 0x2b, 0x0a,
|
||||
0x91, 0xef, 0x16, 0xa7, 0x5f, 0xff, 0xfa, 0x37, 0x34, 0x1a, 0x4b, 0xa8,
|
||||
0x6a, 0x97, 0x48, 0x0f, 0x78, 0x8f, 0x41, 0xfe, 0x9e, 0x2e, 0xfb, 0x4c,
|
||||
0x15, 0x16, 0x17, 0x17, 0x98, 0x9b, 0x9b, 0x25, 0x0c, 0xcb, 0xa8, 0x0a,
|
||||
0xa5, 0x52, 0x99, 0x0d, 0x1b, 0x06, 0x3b, 0x5f, 0xda, 0xa4, 0x2a, 0x7f,
|
||||
0xcb, 0x2a, 0x69, 0xb4, 0x22, 0x81, 0x17, 0x5e, 0x78, 0xfd, 0x3b, 0xaa,
|
||||
0xba, 0x6f, 0xe3, 0xc6, 0x8d, 0xdc, 0x7b, 0xef, 0x08, 0xc6, 0x18, 0xa6,
|
||||
0xa7, 0x53, 0xea, 0xf5, 0x14, 0xef, 0xa5, 0x3b, 0x3b, 0x85, 0xe8, 0xfa,
|
||||
0xf5, 0xeb, 0xbc, 0xfe, 0xfa, 0xaf, 0x38, 0x7b, 0xf6, 0x5c, 0x97, 0x44,
|
||||
0x3e, 0x3b, 0xc0, 0x6f, 0x34, 0x12, 0x2d, 0xc0, 0xf7, 0xde, 0x5f, 0x5c,
|
||||
0x5c, 0x20, 0x4d, 0x63, 0x44, 0xf2, 0xf7, 0x6b, 0xb5, 0x21, 0x54, 0xbb,
|
||||
0xca, 0x3e, 0x11, 0xc7, 0x73, 0x2b, 0xaa, 0xb0, 0x22, 0x01, 0x55, 0x3d,
|
||||
0xaa, 0xaa, 0xec, 0xd9, 0xf3, 0x65, 0x36, 0x6e, 0x8c, 0x68, 0xb7, 0x85,
|
||||
0x89, 0x89, 0x56, 0x5f, 0x1b, 0xd0, 0x53, 0x20, 0x4f, 0x25, 0x38, 0x78,
|
||||
0xf0, 0x01, 0xce, 0x9d, 0xfb, 0x23, 0xa7, 0x4e, 0x9d, 0x5e, 0xa6, 0xc6,
|
||||
0x72, 0x32, 0x5a, 0xa4, 0x89, 0x29, 0xc0, 0xd1, 0x05, 0x2c, 0xa2, 0xa4,
|
||||
0x69, 0xa7, 0x16, 0x28, 0xce, 0x39, 0xaa, 0xd5, 0x2a, 0xc6, 0x74, 0xbe,
|
||||
0xc7, 0x53, 0xeb, 0x22, 0xf0, 0xfc, 0xf3, 0xff, 0x71, 0x48, 0x55, 0x77,
|
||||
0x0e, 0x0d, 0xd5, 0x18, 0x1d, 0xad, 0x22, 0x02, 0x97, 0x2f, 0x37, 0x49,
|
||||
0xd3, 0x1e, 0xe0, 0x0e, 0x81, 0x8e, 0x45, 0x02, 0x3c, 0xfc, 0xf0, 0xd7,
|
||||
0xf8, 0xf1, 0x8f, 0x1f, 0x65, 0x68, 0x28, 0xe2, 0x8d, 0x37, 0x4e, 0xf1,
|
||||
0xe1, 0x87, 0x1f, 0xa1, 0x2a, 0x37, 0x11, 0xe9, 0x57, 0xa4, 0xa3, 0x50,
|
||||
0x4e, 0x42, 0x6e, 0x50, 0xcc, 0x30, 0x30, 0x50, 0x2d, 0xf2, 0x46, 0x01,
|
||||
0x39, 0xb4, 0xd2, 0x42, 0xbe, 0x89, 0x80, 0xaa, 0x1e, 0x56, 0x15, 0x36,
|
||||
0x6f, 0x1e, 0x61, 0x68, 0xa8, 0xc2, 0xc2, 0x42, 0xc2, 0xec, 0x6c, 0xeb,
|
||||
0x06, 0xe0, 0xd2, 0xf5, 0xfb, 0x99, 0x99, 0x3a, 0x77, 0xdd, 0x35, 0x82,
|
||||
0x08, 0x0c, 0x0d, 0x0d, 0xf2, 0xec, 0xb3, 0x0f, 0xf3, 0xd8, 0x63, 0x7f,
|
||||
0xc1, 0x47, 0x1f, 0x5d, 0xe0, 0xcd, 0x37, 0xff, 0x97, 0x66, 0xb3, 0xd9,
|
||||
0x8d, 0x7c, 0x47, 0x89, 0x4e, 0xd4, 0x3b, 0xcd, 0x9d, 0xaa, 0x14, 0x37,
|
||||
0x17, 0x50, 0xc5, 0x1a, 0x83, 0x41, 0xa9, 0x0e, 0x54, 0x00, 0xd3, 0x49,
|
||||
0xfe, 0xbb, 0x1b, 0x8d, 0xe9, 0x7d, 0x6b, 0x12, 0x38, 0x7a, 0xf4, 0xdf,
|
||||
0x6a, 0xaa, 0xf2, 0x48, 0x10, 0x84, 0x8c, 0x8e, 0x0e, 0x17, 0x96, 0xd9,
|
||||
0xa2, 0xbf, 0xa3, 0xec, 0x00, 0xef, 0xa4, 0x50, 0x1c, 0x27, 0x54, 0x2a,
|
||||
0x51, 0xb7, 0xb0, 0x89, 0xc0, 0xd7, 0xbf, 0x7e, 0x1f, 0xcf, 0x3f, 0xff,
|
||||
0x18, 0x77, 0xdd, 0xb5, 0x91, 0xdf, 0xfd, 0xee, 0x4d, 0xc6, 0xc7, 0x2f,
|
||||
0xf5, 0xa9, 0xd1, 0xe9, 0x4a, 0x57, 0x56, 0xc5, 0x98, 0xa2, 0x0a, 0x18,
|
||||
0x70, 0xce, 0x51, 0x2a, 0x95, 0xa1, 0x9b, 0x72, 0x7a, 0xe8, 0x46, 0x02,
|
||||
0xcb, 0x5a, 0x09, 0x11, 0x7d, 0xc8, 0x5a, 0xa5, 0x5a, 0x1d, 0xa0, 0x5a,
|
||||
0x8d, 0x48, 0x53, 0x61, 0x7a, 0xba, 0x51, 0xf8, 0x77, 0x6e, 0x71, 0xd0,
|
||||
0xf3, 0xf3, 0x1e, 0xa0, 0xbc, 0xdf, 0xe9, 0x1f, 0x51, 0x14, 0xf1, 0xbd,
|
||||
0xef, 0x7d, 0x8b, 0xf3, 0xe7, 0xaf, 0x30, 0x36, 0x76, 0x8a, 0xc9, 0xc9,
|
||||
0x29, 0x76, 0xef, 0xbe, 0x97, 0x30, 0x74, 0xcb, 0xa2, 0x2f, 0x22, 0xa8,
|
||||
0x68, 0x01, 0xda, 0x60, 0x8c, 0xc1, 0x1a, 0x83, 0xa8, 0x20, 0x0a, 0x41,
|
||||
0xe0, 0x30, 0x3d, 0x03, 0xd8, 0xbb, 0xa6, 0x02, 0xaa, 0xba, 0x4f, 0x55,
|
||||
0x18, 0x18, 0x18, 0xa0, 0x5c, 0x0e, 0x59, 0x58, 0x88, 0x97, 0x45, 0x7e,
|
||||
0x79, 0x5b, 0xe0, 0xbb, 0xef, 0xe7, 0xe4, 0x57, 0x9e, 0xbb, 0x76, 0xdd,
|
||||
0xc9, 0x73, 0xcf, 0x3d, 0xca, 0xde, 0xbd, 0x3b, 0x78, 0xfb, 0xed, 0x33,
|
||||
0x4c, 0x4c, 0x5c, 0x2d, 0xae, 0xd9, 0x59, 0xbc, 0xd2, 0x8b, 0x3e, 0x86,
|
||||
0xc0, 0x5a, 0x02, 0x67, 0x71, 0xd6, 0x61, 0x2d, 0x94, 0xcb, 0xa5, 0x3e,
|
||||
0x85, 0xa8, 0xdd, 0x82, 0x80, 0x1c, 0x10, 0x51, 0x82, 0x20, 0x60, 0x60,
|
||||
0xa0, 0xcc, 0xc2, 0x42, 0xeb, 0x26, 0xc7, 0x59, 0xee, 0x42, 0x9e, 0x46,
|
||||
0xa3, 0x41, 0xb9, 0x5c, 0xc2, 0x7b, 0x56, 0x9d, 0x51, 0x14, 0xf1, 0xed,
|
||||
0x6f, 0xef, 0xe7, 0xa9, 0xa7, 0x0e, 0x91, 0xa6, 0x0d, 0x3e, 0xf8, 0xe0,
|
||||
0x3c, 0xed, 0x76, 0xdc, 0x33, 0x01, 0xcd, 0xc1, 0x3b, 0x9b, 0xcf, 0xc0,
|
||||
0x5a, 0x9c, 0x31, 0x58, 0x63, 0xb1, 0x26, 0x8f, 0x7f, 0x91, 0x69, 0x07,
|
||||
0x6e, 0xa5, 0x40, 0x2d, 0x2f, 0x24, 0xa5, 0xa2, 0x97, 0x6f, 0xaf, 0xe8,
|
||||
0x3c, 0xbd, 0x5a, 0xe0, 0x69, 0x36, 0x1b, 0x6c, 0xdb, 0x36, 0xb2, 0xaa,
|
||||
0x02, 0xfd, 0x73, 0xdb, 0xb6, 0x11, 0x9e, 0x79, 0xe6, 0x51, 0xf6, 0xef,
|
||||
0xdf, 0xcd, 0xc4, 0xc4, 0x65, 0xea, 0xf5, 0xd9, 0x5c, 0x09, 0x04, 0x6b,
|
||||
0xc8, 0x09, 0x38, 0x5b, 0x4c, 0x83, 0xb5, 0x79, 0x4a, 0xf5, 0x9c, 0xe8,
|
||||
0xe6, 0x71, 0xc3, 0x1a, 0x90, 0x7d, 0x9d, 0x3c, 0x14, 0x81, 0x85, 0x85,
|
||||
0x06, 0xc6, 0xd8, 0x6e, 0x6e, 0xc2, 0xf2, 0x7e, 0x26, 0xff, 0x8d, 0xae,
|
||||
0xb8, 0x06, 0xd6, 0x1a, 0xdf, 0xfc, 0xe6, 0xd7, 0xf8, 0xea, 0x57, 0x77,
|
||||
0xf3, 0xc6, 0x1b, 0xef, 0x30, 0x39, 0x39, 0x87, 0x35, 0xa6, 0x20, 0xe0,
|
||||
0x08, 0x5d, 0x80, 0x35, 0xf9, 0x75, 0xad, 0x91, 0xa2, 0x66, 0xac, 0xde,
|
||||
0x51, 0x2f, 0x23, 0x90, 0xdb, 0x99, 0x2d, 0x22, 0x0e, 0x22, 0x82, 0x31,
|
||||
0xfd, 0x9d, 0xe6, 0x72, 0x12, 0xcb, 0xad, 0x71, 0xfd, 0x04, 0x00, 0xca,
|
||||
0xe5, 0x32, 0x43, 0x43, 0x83, 0x4c, 0x5e, 0x9f, 0xc3, 0x18, 0x83, 0x2b,
|
||||
0x72, 0x3f, 0x70, 0x16, 0x03, 0x38, 0x2b, 0x64, 0x62, 0x48, 0xd3, 0x64,
|
||||
0x95, 0x3e, 0x6b, 0x05, 0x02, 0x22, 0x8a, 0x31, 0xd2, 0x23, 0xe0, 0xf3,
|
||||
0x08, 0x50, 0x28, 0xd0, 0x6b, 0x91, 0x7b, 0xa3, 0xd5, 0x6a, 0x22, 0x32,
|
||||
0x74, 0x5b, 0x0a, 0xbc, 0xff, 0xfe, 0x25, 0xde, 0x7e, 0xfb, 0x1c, 0xad,
|
||||
0x56, 0x8c, 0x2b, 0x52, 0x27, 0x74, 0x8e, 0x28, 0x0c, 0x08, 0x83, 0xdc,
|
||||
0xa5, 0x8c, 0xcf, 0xad, 0x34, 0x4d, 0x53, 0xa4, 0x47, 0xe0, 0xcc, 0x9a,
|
||||
0x04, 0x54, 0x05, 0x83, 0x21, 0x8e, 0x63, 0x16, 0x16, 0x1a, 0x85, 0x22,
|
||||
0xbd, 0x9e, 0x5e, 0xc4, 0x70, 0x43, 0x06, 0xd1, 0x6c, 0xb6, 0xb9, 0xe3,
|
||||
0x8e, 0x91, 0x75, 0x29, 0x30, 0x35, 0x35, 0xc7, 0x5b, 0x6f, 0x9d, 0x63,
|
||||
0x6a, 0x6a, 0x96, 0x2c, 0xcb, 0x30, 0x08, 0xd6, 0xd8, 0x1c, 0x7c, 0x10,
|
||||
0x10, 0x05, 0x8e, 0xc0, 0x39, 0x52, 0x9f, 0x61, 0xac, 0xc1, 0x60, 0xba,
|
||||
0x6d, 0x49, 0x31, 0xe6, 0xd6, 0x24, 0x20, 0x22, 0x27, 0x8d, 0xb5, 0x07,
|
||||
0x92, 0xb8, 0x4d, 0xb3, 0xd1, 0xa2, 0x93, 0x77, 0xa6, 0x53, 0x3d, 0xa1,
|
||||
0xdb, 0xcb, 0x40, 0xaf, 0xf8, 0x84, 0x61, 0xb4, 0xa6, 0x02, 0xcd, 0x66,
|
||||
0xcc, 0x3b, 0xef, 0x5c, 0xe0, 0xf2, 0xe5, 0xeb, 0xa4, 0x69, 0x4a, 0x96,
|
||||
0x79, 0x50, 0xc1, 0x19, 0x43, 0x14, 0x38, 0xca, 0x51, 0x40, 0xb9, 0x14,
|
||||
0x12, 0x05, 0x0e, 0x80, 0xcc, 0xe7, 0xe0, 0xe3, 0x24, 0x2e, 0xa2, 0xdf,
|
||||
0x25, 0x70, 0xf2, 0x56, 0x04, 0xe6, 0x72, 0xd6, 0x8b, 0xcc, 0xd4, 0x67,
|
||||
0xa8, 0x94, 0x4b, 0x24, 0x71, 0x82, 0xa8, 0x60, 0xc8, 0x15, 0x52, 0x01,
|
||||
0x51, 0xed, 0x1d, 0xde, 0xdc, 0x62, 0x0d, 0x9c, 0x3d, 0x7b, 0x89, 0xf3,
|
||||
0xe7, 0x2f, 0xd3, 0x6a, 0xb5, 0xc9, 0xb2, 0x0c, 0xdf, 0x05, 0x6f, 0x29,
|
||||
0x85, 0x01, 0x03, 0xa5, 0x88, 0x4a, 0x14, 0x51, 0x0e, 0x03, 0x9c, 0x73,
|
||||
0x64, 0xe2, 0xbb, 0xd7, 0x9d, 0x9d, 0x9b, 0xc3, 0x7b, 0xed, 0x57, 0xe0,
|
||||
0x56, 0x29, 0xa4, 0x67, 0x14, 0x7d, 0xa4, 0xb1, 0xd4, 0xa0, 0xdd, 0x6e,
|
||||
0x52, 0xad, 0x0e, 0x80, 0x0a, 0x81, 0x31, 0x39, 0x68, 0x35, 0x18, 0x3c,
|
||||
0x5e, 0xa4, 0x78, 0xdd, 0xe9, 0x20, 0x6f, 0x76, 0xa1, 0x7a, 0x7d, 0x9e,
|
||||
0x33, 0x67, 0xce, 0xb2, 0xb8, 0xd8, 0xe8, 0x15, 0x3e, 0xef, 0x31, 0x28,
|
||||
0xce, 0x5a, 0xa2, 0xc0, 0x51, 0x89, 0xa2, 0x9c, 0x40, 0x29, 0x22, 0x0a,
|
||||
0x1d, 0xaa, 0x90, 0x79, 0x8f, 0xa0, 0x78, 0x15, 0xe6, 0xe6, 0x66, 0x97,
|
||||
0x35, 0x79, 0xeb, 0x51, 0xe0, 0x35, 0x63, 0xcc, 0xd1, 0x46, 0xa3, 0x81,
|
||||
0xcf, 0x32, 0xd2, 0x38, 0xc5, 0x19, 0x8a, 0xf2, 0x0e, 0x06, 0x21, 0xf3,
|
||||
0x79, 0x4a, 0x21, 0x79, 0x15, 0x6d, 0x36, 0x5b, 0xc5, 0x21, 0x56, 0x7e,
|
||||
0x8d, 0x56, 0xab, 0xcd, 0x7b, 0xef, 0x7d, 0xc8, 0x95, 0x2b, 0x93, 0x85,
|
||||
0xc5, 0x7a, 0xb4, 0x28, 0x56, 0xce, 0x1a, 0x9c, 0xc9, 0xc1, 0x97, 0xc2,
|
||||
0x80, 0x6a, 0xb9, 0xc4, 0x40, 0x29, 0x22, 0x0c, 0x02, 0xac, 0x85, 0x24,
|
||||
0xf3, 0x78, 0x15, 0x32, 0x2f, 0xd4, 0x67, 0x66, 0x89, 0x93, 0x14, 0x2f,
|
||||
0xdd, 0xc8, 0xbc, 0x36, 0x36, 0x76, 0x64, 0xfe, 0x46, 0x02, 0xcb, 0x0a,
|
||||
0xd9, 0xf1, 0xe3, 0x7f, 0xfd, 0x8e, 0x78, 0x3f, 0xee, 0xc5, 0x53, 0xaf,
|
||||
0x4f, 0xe3, 0xb3, 0x04, 0x63, 0x20, 0xb0, 0x10, 0x58, 0x4b, 0xe4, 0x1c,
|
||||
0x91, 0xb3, 0x84, 0xce, 0x10, 0x58, 0x70, 0x46, 0xd9, 0xba, 0x65, 0x33,
|
||||
0x23, 0x23, 0x23, 0x78, 0x0f, 0x67, 0xcf, 0x8e, 0x73, 0xfa, 0xd4, 0x5b,
|
||||
0x5c, 0xbb, 0x32, 0x09, 0x2a, 0x18, 0x15, 0xac, 0xe6, 0x37, 0x89, 0xac,
|
||||
0xa5, 0x12, 0x06, 0x54, 0xcb, 0x11, 0x1b, 0x2a, 0x65, 0x36, 0x55, 0x07,
|
||||
0x18, 0xac, 0x94, 0xf3, 0xe8, 0x07, 0xf9, 0xbe, 0x5d, 0x44, 0x49, 0x33,
|
||||
0x4f, 0x9c, 0xa6, 0x5c, 0x9f, 0xbc, 0x8e, 0x97, 0xac, 0x3f, 0xfa, 0xaf,
|
||||
0xde, 0x08, 0xfe, 0x26, 0x05, 0x8a, 0x44, 0xfa, 0xa5, 0x78, 0x79, 0x7a,
|
||||
0x7a, 0x7a, 0x9a, 0xcd, 0xc3, 0x9b, 0x89, 0x02, 0x8b, 0xc1, 0x12, 0xd8,
|
||||
0xdc, 0x8d, 0x9c, 0xc9, 0x01, 0xa5, 0x05, 0xfb, 0x5d, 0x77, 0x7f, 0x89,
|
||||
0xb9, 0xd9, 0x05, 0xde, 0x7f, 0xf7, 0x2c, 0xcd, 0x56, 0x0b, 0x15, 0xcd,
|
||||
0xdb, 0x00, 0x0c, 0xb8, 0xbc, 0x2d, 0x76, 0xc6, 0x75, 0xd3, 0xa6, 0x14,
|
||||
0x06, 0x94, 0xa3, 0x90, 0x52, 0x18, 0x12, 0x85, 0x0e, 0x63, 0x0c, 0x99,
|
||||
0x17, 0xbc, 0x08, 0x49, 0x96, 0x91, 0x64, 0x9e, 0x4f, 0xae, 0x4c, 0xd0,
|
||||
0x8e, 0x63, 0x7c, 0xb7, 0x4f, 0x62, 0x7c, 0x6c, 0xec, 0xc8, 0x4a, 0x87,
|
||||
0xc1, 0x37, 0x13, 0x50, 0xd5, 0x57, 0xbc, 0xf8, 0xa7, 0x93, 0x34, 0x61,
|
||||
0x6a, 0xfa, 0x3a, 0xa5, 0x3b, 0xef, 0x24, 0xb0, 0x79, 0x9b, 0x1b, 0x38,
|
||||
0x43, 0xa8, 0x01, 0xa1, 0xb3, 0x64, 0xce, 0x92, 0x7a, 0x4b, 0x92, 0x19,
|
||||
0xce, 0xbf, 0xfb, 0x01, 0xc6, 0x0b, 0xe5, 0x20, 0x40, 0x34, 0xef, 0x2e,
|
||||
0xc1, 0x61, 0x01, 0xe7, 0x0c, 0x81, 0x75, 0x84, 0x81, 0xcd, 0xad, 0x32,
|
||||
0x0c, 0x88, 0x82, 0x80, 0xc0, 0x59, 0xc0, 0x90, 0x89, 0x27, 0x13, 0x4f,
|
||||
0x3b, 0x49, 0x69, 0xa7, 0x29, 0x53, 0xf5, 0x69, 0xea, 0x33, 0x73, 0xa4,
|
||||
0x59, 0x86, 0x48, 0x37, 0xfc, 0x47, 0x57, 0x02, 0x0f, 0xab, 0x1c, 0x6c,
|
||||
0xfd, 0xe8, 0x47, 0xff, 0xf4, 0x6a, 0x18, 0x04, 0xdf, 0x29, 0x47, 0x21,
|
||||
0xf7, 0x7e, 0xf9, 0x1e, 0x86, 0x36, 0xd5, 0x28, 0x87, 0x01, 0xa5, 0x30,
|
||||
0x20, 0x28, 0xfc, 0x59, 0x54, 0xf1, 0xde, 0x93, 0x79, 0x21, 0xf3, 0x9e,
|
||||
0xcc, 0xfb, 0xc2, 0x31, 0x84, 0x7c, 0x3f, 0x05, 0xd6, 0xe4, 0xbd, 0x4d,
|
||||
0xe8, 0x2c, 0x81, 0x73, 0xc5, 0x2c, 0x1a, 0x34, 0x55, 0x52, 0x9f, 0xa7,
|
||||
0x4b, 0x33, 0x4e, 0x69, 0xc4, 0x31, 0xd7, 0xa7, 0xa7, 0xf9, 0xf8, 0xe2,
|
||||
0x38, 0xad, 0x38, 0xee, 0x27, 0x70, 0x66, 0x6c, 0xec, 0xc8, 0x9f, 0xaf,
|
||||
0x46, 0x60, 0xc5, 0xa3, 0xc5, 0xd0, 0xd9, 0x9f, 0x66, 0x59, 0x7a, 0x28,
|
||||
0x81, 0xda, 0xf8, 0xa5, 0xcb, 0x04, 0xf7, 0x04, 0xd8, 0xc1, 0x0d, 0x79,
|
||||
0xd5, 0x0c, 0x43, 0x9c, 0xb3, 0x04, 0x06, 0x28, 0xaa, 0xa6, 0x14, 0xae,
|
||||
0x24, 0xa2, 0xfd, 0xc7, 0x11, 0xf9, 0xce, 0xca, 0x80, 0x2d, 0xba, 0x4b,
|
||||
0x63, 0x0c, 0x8a, 0xe2, 0x45, 0x0a, 0xf0, 0x19, 0xcd, 0x38, 0xa5, 0x19,
|
||||
0xc7, 0x4c, 0xd5, 0xeb, 0x5c, 0xbc, 0x7c, 0x89, 0x38, 0xc9, 0xc8, 0xbc,
|
||||
0xef, 0xb7, 0xce, 0xc3, 0xab, 0x81, 0x5f, 0x55, 0x01, 0x80, 0x1f, 0xfe,
|
||||
0xe0, 0x1f, 0x9f, 0x35, 0xc6, 0xfe, 0x7d, 0x39, 0x8a, 0xa8, 0x56, 0xca,
|
||||
0xec, 0xba, 0x67, 0x27, 0xb5, 0xc1, 0x41, 0x2a, 0x51, 0x58, 0x28, 0x61,
|
||||
0x71, 0xd6, 0x62, 0xad, 0xe9, 0xd6, 0x99, 0x1c, 0x5e, 0x31, 0x0a, 0x19,
|
||||
0x3a, 0x85, 0x5b, 0x35, 0x07, 0x9e, 0xf9, 0x3c, 0xd7, 0xf3, 0xc8, 0x27,
|
||||
0x34, 0xe3, 0x84, 0x89, 0x2b, 0x57, 0xb9, 0x3a, 0x79, 0x8d, 0x76, 0x9c,
|
||||
0x90, 0xa4, 0x69, 0x7f, 0xee, 0x3f, 0x33, 0x36, 0x76, 0xe4, 0xd8, 0xa7,
|
||||
0x22, 0x00, 0xf0, 0xfd, 0x27, 0x8f, 0xbf, 0x16, 0x38, 0x77, 0xa8, 0x54,
|
||||
0x90, 0xd8, 0xb9, 0x63, 0x07, 0x43, 0x1b, 0x7b, 0x24, 0xa2, 0x20, 0xc0,
|
||||
0x15, 0x44, 0x3a, 0x3b, 0xaa, 0x6e, 0xfe, 0x14, 0xc5, 0x4e, 0x8a, 0xed,
|
||||
0x63, 0x9e, 0x6a, 0xf9, 0x22, 0x6d, 0x27, 0x29, 0xad, 0x24, 0x61, 0x61,
|
||||
0x69, 0x89, 0x8b, 0x13, 0x13, 0xcc, 0x2d, 0x2c, 0xd0, 0x8e, 0x13, 0x32,
|
||||
0x9f, 0x91, 0xf9, 0x2e, 0xf8, 0x57, 0xc7, 0xc6, 0x8e, 0x7c, 0x77, 0x2d,
|
||||
0xf0, 0x70, 0x8b, 0xd3, 0xe9, 0xc0, 0xb9, 0xc3, 0x71, 0x9a, 0x9e, 0x54,
|
||||
0xd5, 0xbd, 0x22, 0x9e, 0xf3, 0x1f, 0x7d, 0xc4, 0xd6, 0xcd, 0xa3, 0xdc,
|
||||
0xb1, 0x65, 0x94, 0x81, 0x52, 0x89, 0x28, 0xf4, 0x44, 0x81, 0x23, 0x74,
|
||||
0x0e, 0x67, 0xf3, 0x0d, 0x48, 0xe7, 0x18, 0x44, 0xc9, 0x81, 0x7b, 0x2f,
|
||||
0x64, 0x22, 0x24, 0x69, 0x56, 0xb8, 0x4c, 0xc6, 0x52, 0xb3, 0xc5, 0xb5,
|
||||
0xa9, 0x49, 0xa6, 0xa6, 0xa7, 0x69, 0xb6, 0x13, 0x92, 0x34, 0xc9, 0xd7,
|
||||
0x90, 0xdc, 0x1e, 0xf8, 0x5b, 0x2a, 0x00, 0xf0, 0xc3, 0xef, 0xff, 0x43,
|
||||
0x2d, 0xc9, 0xb2, 0x93, 0x81, 0x73, 0x7b, 0xc3, 0xc0, 0x51, 0x0a, 0x43,
|
||||
0x06, 0x2a, 0x65, 0xb6, 0x8c, 0x6c, 0x66, 0xb8, 0x56, 0xa3, 0x52, 0x2e,
|
||||
0x11, 0x76, 0x17, 0x67, 0x4e, 0x00, 0xcd, 0xdb, 0x0d, 0xd1, 0x7c, 0xe3,
|
||||
0x93, 0x7a, 0x4f, 0x92, 0x66, 0xcc, 0x2f, 0x2e, 0x32, 0x3b, 0x3f, 0xc7,
|
||||
0xf4, 0xcc, 0x0c, 0xad, 0x38, 0x07, 0x9e, 0x66, 0x45, 0x95, 0xee, 0x55,
|
||||
0xdc, 0x75, 0x83, 0x5f, 0x17, 0x01, 0x80, 0x1f, 0x3c, 0x79, 0xbc, 0x16,
|
||||
0x27, 0xc9, 0x6b, 0xd6, 0xda, 0x87, 0xa2, 0xd0, 0x11, 0x06, 0x01, 0x61,
|
||||
0x10, 0x10, 0x85, 0x21, 0x1b, 0x37, 0x6c, 0xa0, 0x3a, 0x50, 0x65, 0x43,
|
||||
0x75, 0x80, 0x28, 0x8c, 0x70, 0x2e, 0x6f, 0xc8, 0xbc, 0xcf, 0x88, 0x93,
|
||||
0x94, 0x76, 0xbb, 0xcd, 0x52, 0x63, 0x89, 0xf9, 0xc5, 0x45, 0xe2, 0x24,
|
||||
0xa1, 0x9d, 0xa4, 0xa4, 0x59, 0xde, 0xd0, 0x79, 0x29, 0xda, 0x92, 0x3e,
|
||||
0xbb, 0x1c, 0x1b, 0x3b, 0xf2, 0xd3, 0xf5, 0x82, 0x5f, 0x37, 0x81, 0xce,
|
||||
0xf8, 0xee, 0xe1, 0x17, 0x8f, 0x1a, 0x63, 0x7e, 0xe2, 0xac, 0xc5, 0xb9,
|
||||
0xbc, 0x38, 0x05, 0x85, 0xa7, 0xe7, 0x1b, 0x11, 0xd7, 0x4d, 0x21, 0xc8,
|
||||
0x17, 0xac, 0x48, 0xc7, 0x66, 0xb3, 0xae, 0xdd, 0x8a, 0x48, 0x37, 0x5d,
|
||||
0x8a, 0xdb, 0x8f, 0x03, 0x87, 0xc7, 0xc6, 0x8e, 0x9c, 0xba, 0x1d, 0xf0,
|
||||
0xb7, 0x4d, 0x00, 0xe0, 0x89, 0x27, 0x5e, 0xd8, 0x6b, 0x8c, 0x79, 0xc5,
|
||||
0x1a, 0x73, 0xc0, 0xd8, 0xde, 0xc6, 0xdb, 0x16, 0x95, 0xda, 0x16, 0xb6,
|
||||
0xd3, 0x39, 0xd7, 0x14, 0x95, 0x6e, 0x94, 0x65, 0xd9, 0x49, 0x1d, 0x90,
|
||||
0xf7, 0xf7, 0xaf, 0xdc, 0x6e, 0xd4, 0x3f, 0x13, 0x81, 0xce, 0x78, 0xfc,
|
||||
0xf1, 0x9f, 0x3d, 0x64, 0x0c, 0x87, 0xad, 0xb1, 0x8f, 0x18, 0x63, 0x6a,
|
||||
0xbd, 0x0d, 0x78, 0x6f, 0xc7, 0xd3, 0x01, 0x9c, 0xef, 0x25, 0x96, 0x01,
|
||||
0x3f, 0x03, 0xbc, 0xc2, 0x2a, 0x0d, 0xda, 0xff, 0x0b, 0x81, 0xfe, 0xf1,
|
||||
0xf8, 0xe3, 0x3f, 0x3b, 0x04, 0xec, 0x23, 0x3f, 0xf6, 0xd8, 0x59, 0xcc,
|
||||
0xce, 0x98, 0x23, 0x07, 0x3c, 0x4e, 0xde, 0x0e, 0x9f, 0x1c, 0x1b, 0x3b,
|
||||
0x72, 0xf1, 0x33, 0xdf, 0xb4, 0x18, 0x7f, 0xb2, 0xbf, 0xd4, 0x7f, 0x5e,
|
||||
0xe3, 0x0b, 0xff, 0xcf, 0x1e, 0x5f, 0x78, 0x02, 0xff, 0x07, 0xe2, 0x1a,
|
||||
0xeb, 0x6e, 0x4b, 0x67, 0x61, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
|
||||
0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
|
||||
};
|
Reference in New Issue
Block a user