This commit is contained in:
MELERIX 2015-11-17 01:34:39 -03:00
commit 6edfcbd77b
353 changed files with 47146 additions and 44311 deletions

8
.gitignore vendored
View File

@ -4,6 +4,14 @@
*.sdf
*.suo
*.user
# compiler-generated sources (MSVC, GCC)
*.asm
*.s
# assembled linker objects (GCC)
*.o
Thumbs.db
/Bin/Debug
/Bin/Debug64

BIN
Artwork/publisherlogo.psd Normal file

Binary file not shown.

View File

@ -1430,6 +1430,7 @@ Plugin Note=[video] unsupported
Good Name=Dezaemon 3D (J)
Internal Name=DEZAEMON3D
Status=Compatible
Save Type=Sram
[FD73F775-9724755A-C:50]
Good Name=Diddy Kong Racing (E) (M3) (V1.0)

View File

@ -318,7 +318,7 @@
#620# "Usar o Primeiro Tipo de Salvamento Usado"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -266,7 +266,7 @@
#620# "* открий първият използван тип"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Intergration Tab

View File

@ -318,7 +318,7 @@
#620# "Primer tipus de desat usat"
#621# "EEPROM de 4 kbits"
#622# "EEPROM de 16 kbits"
#623# "SRAM de 32kbytes"
#623# "SRAM"
#624# "FlashRAM de 128kbytes"
//Shell Integration Tab

View File

@ -88,6 +88,7 @@
#198# "插槽 8"
#199# "插槽 9"
#200# "插槽 10"
#201# "插槽 (%ws) 被选"
//Pop up Menu
#210# "运行游戏"
@ -224,7 +225,7 @@
#452# " 选择材质包目录"
//Options Dialog
#460# "当窗口处于非活动状态时暂停模拟器"
#460# "当模拟器窗口不是处于屏幕最上方,暂停模拟器"
#461# "载入ROM后切换为全屏模式"
#462# "隐藏高级设置"
#463# "记住已选择的金手指"
@ -255,7 +256,7 @@
#503# "自我修改码方案:"
#504# "默认存档容量:"
#505# "高级模块连接"
#506# "当ROM加载后,开始模拟"
#506# "当读取完ROM后开始模拟"
#507# "总是从 RDB 中覆盖默认设置"
#508# "自动压缩即时存档文件"
#509# "开启调试器"
@ -318,7 +319,7 @@
#620# "使用最初的存档类型"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -270,7 +270,7 @@
#620# "使用最初使用的存檔類型"
#621# "4-Kbit EEPROM"
#622# "16-Kbit EEPROM"
#623# "32-KByte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -266,7 +266,7 @@ RDB není pøítomno nebo volba dole 'pøepsat' je nezaškrtnutá"
#620# "* detek. první užívaný typ"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbajtù SRAM"
#623# "SRAM"
#624# "128-kbajtù flash RAM"
//Shell Intergration Tab

View File

@ -265,7 +265,7 @@
#620# "* Find den først anvendte type"
#621# "4kbit EEPROM"
#622# "16kbit EEPROM"
#623# "32kbyte SRAM"
#623# "SRAM"
#624# "128kbyte FlashRAM"
//Shell Intergration Tab

View File

@ -265,7 +265,7 @@
#620# "Gebruik de eerst gebruikte save"
#621# "4kbit EEPROM"
#622# "16kbit EEPROM"
#623# "32kbytes SRAM"
#623# "SRAM"
#624# "Flashram"
//Shell Integration Tab

View File

@ -88,6 +88,7 @@
#198# "Slot 8"
#199# "Slot 9"
#200# "Slot 10"
#201# "Save Slot (%ws) selected"
//Pop up Menu
#210# "Play Game"

View File

@ -277,7 +277,7 @@ no RDB is present, or 'overwrite' option below is unchecked"
#620# "* detect first-used type"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Intergration Tab

View File

@ -269,7 +269,7 @@
#620# "Käytä 1. tallennustyyppiä"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -318,7 +318,7 @@
#620# "Par défaut"
#621# "4 kbit EEPROM"
#622# "16 kbit EEPROM"
#623# "32 ko SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -269,7 +269,7 @@
#620# "Automatisch"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Intergration Tab

View File

@ -265,7 +265,7 @@
#620# "Automatisch"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Intergration Tab

View File

@ -266,7 +266,7 @@
#620# "Αυτόματος"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Integration Tab

View File

@ -269,7 +269,7 @@
#620# "Elõszöri mentés fajta használata"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -269,7 +269,7 @@
#620# "Riconosci automaticamente"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-ko SRAM"
#623# "SRAM"
#624# "128-ko flash RAM"
//Shell Intergration Tab

View File

@ -265,7 +265,7 @@
#620# "Riconosci il salvataggio automaticamente"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-ko SRAM"
#623# "SRAM"
#624# "128-ko flash RAM"
//Shell Intergration Tab

View File

@ -5,7 +5,7 @@
#1 # "Japanese" // LANGUAGE ID
#2 # "Nekokabu" // Author
#3 # "2.2" // Version
#4 # "2015/3/5" // Date
#4 # "2015/11/6" // Date
//About DLL Dialog
#5 # "現在の言語"
@ -317,7 +317,7 @@
#620# "自動検出"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -269,7 +269,7 @@
#620# "Naudoti pirmà naudotà tipà"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Intergration Tab

View File

@ -271,7 +271,7 @@ De vil ta effekt når ROM'en er resatt eller en ny er startet."
#620# "bruk den første brukte lagrings typen"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Integration Tab

View File

@ -269,7 +269,7 @@
#620# "Pierwszy u¿yty format"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -267,7 +267,7 @@
#620# "По умолчанию"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Integration Tab

View File

@ -318,7 +318,7 @@
#620# "Usar primer tipo de guardado usado"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -269,7 +269,7 @@
#620# "Använd Första sparnings typ"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbytes SRAM"
#623# "SRAM"
#624# "Flash RAM"
//Shell Integration Tab

View File

@ -267,7 +267,7 @@
#620# "Обирає програма"
#621# "4-kbit EEPROM"
#622# "16-kbit EEPROM"
#623# "32-kbyte SRAM"
#623# "SRAM"
#624# "128-kbyte flash RAM"
//Shell Integration Tab

Binary file not shown.

View File

@ -2,7 +2,7 @@
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Label="Configuration">
<PlatformToolset>v140_xp</PlatformToolset>
<PlatformToolset>$(DefaultPlatformToolset)_xp</PlatformToolset>
</PropertyGroup>
<ImportGroup Label="PropertySheets">
@ -195,6 +195,9 @@
<!-- Win32 -->
<ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
<Lib>
<TargetMachine>MachineX86</TargetMachine>
</Lib>
<Link>
<TargetMachine>MachineX86</TargetMachine>
</Link>
@ -212,6 +215,9 @@
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
<Lib>
<TargetMachine>MachineX64</TargetMachine>
</Lib>
<Link>
<TargetMachine>MachineX64</TargetMachine>
</Link>

View File

@ -0,0 +1,145 @@
/***************************************************************************
* *
* XInput.h -- This module defines XBOX controller APIs *
* and constansts for the Windows platform. *
* *
* Copyright (c) Microsoft Corp. All rights reserved. *
* *
***************************************************************************/
#ifndef _XINPUT_H_
#define _XINPUT_H_
#include <windef.h>
// Current name of the DLL shipped in the same SDK as this header.
// The name reflects the current version
#define XINPUT_DLL_A "xinput9_1_0.dll"
#define XINPUT_DLL_W L"xinput9_1_0.dll"
#ifdef UNICODE
#define XINPUT_DLL XINPUT_DLL_W
#else
#define XINPUT_DLL XINPUT_DLL_A
#endif
//
// Device types available in XINPUT_CAPABILITIES
//
#define XINPUT_DEVTYPE_GAMEPAD 0x01
//
// Device subtypes available in XINPUT_CAPABILITIES
//
#define XINPUT_DEVSUBTYPE_GAMEPAD 0x01
//
// Flags for XINPUT_CAPABILITIES
//
#define XINPUT_CAPS_VOICE_SUPPORTED 0x0004
//
// Constants for gamepad buttons
//
#define XINPUT_GAMEPAD_DPAD_UP 0x0001
#define XINPUT_GAMEPAD_DPAD_DOWN 0x0002
#define XINPUT_GAMEPAD_DPAD_LEFT 0x0004
#define XINPUT_GAMEPAD_DPAD_RIGHT 0x0008
#define XINPUT_GAMEPAD_START 0x0010
#define XINPUT_GAMEPAD_BACK 0x0020
#define XINPUT_GAMEPAD_LEFT_THUMB 0x0040
#define XINPUT_GAMEPAD_RIGHT_THUMB 0x0080
#define XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100
#define XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200
#define XINPUT_GAMEPAD_A 0x1000
#define XINPUT_GAMEPAD_B 0x2000
#define XINPUT_GAMEPAD_X 0x4000
#define XINPUT_GAMEPAD_Y 0x8000
//
// Gamepad thresholds
//
#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30
//
// Flags to pass to XInputGetCapabilities
//
#define XINPUT_FLAG_GAMEPAD 0x00000001
//
// Structures used by XInput APIs
//
typedef struct _XINPUT_GAMEPAD
{
WORD wButtons;
BYTE bLeftTrigger;
BYTE bRightTrigger;
SHORT sThumbLX;
SHORT sThumbLY;
SHORT sThumbRX;
SHORT sThumbRY;
} XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;
typedef struct _XINPUT_STATE
{
DWORD dwPacketNumber;
XINPUT_GAMEPAD Gamepad;
} XINPUT_STATE, *PXINPUT_STATE;
typedef struct _XINPUT_VIBRATION
{
WORD wLeftMotorSpeed;
WORD wRightMotorSpeed;
} XINPUT_VIBRATION, *PXINPUT_VIBRATION;
typedef struct _XINPUT_CAPABILITIES
{
BYTE Type;
BYTE SubType;
WORD Flags;
XINPUT_GAMEPAD Gamepad;
XINPUT_VIBRATION Vibration;
} XINPUT_CAPABILITIES, *PXINPUT_CAPABILITIES;
//
// XInput APIs
//
#ifdef __cplusplus
extern "C" {
#endif
DWORD WINAPI XInputGetState
(
DWORD dwUserIndex, // [in] Index of the gamer associated with the device
XINPUT_STATE* pState // [out] Receives the current state
);
DWORD WINAPI XInputSetState
(
DWORD dwUserIndex, // [in] Index of the gamer associated with the device
XINPUT_VIBRATION* pVibration // [in, out] The vibration information to send to the controller
);
DWORD WINAPI XInputGetCapabilities
(
DWORD dwUserIndex, // [in] Index of the gamer associated with the device
DWORD dwFlags, // [in] Input flags that identify the device type
XINPUT_CAPABILITIES* pCapabilities // [out] Receives the capabilities
);
DWORD WINAPI XInputGetDSoundAudioDeviceGuids
(
DWORD dwUserIndex, // [in] Index of the gamer associated with the device
GUID* pDSoundRenderGuid, // [out] DSound device ID for render
GUID* pDSoundCaptureGuid // [out] DSound device ID for capture
);
#ifdef __cplusplus
}
#endif
#endif //_XINPUT_H_

View File

@ -0,0 +1,127 @@
/*
Name: wx/msw/gccpriv.h
Purpose: MinGW/Cygwin definitions
Author: Vadim Zeitlin
Modified by:
Created:
RCS-ID: $Id: gccpriv.h 36155 2005-11-10 16:16:05Z ABX $
Copyright: (c) Vadim Zeitlin
Licence: wxWindows Licence
*/
/* THIS IS A C FILE, DON'T USE C++ FEATURES (IN PARTICULAR COMMENTS) IN IT */
#ifndef _WX_MSW_GCCPRIV_H_
#define _WX_MSW_GCCPRIV_H_
#if defined(__MINGW32__) && !defined(__GNUWIN32__)
#define __GNUWIN32__
#endif
#if defined(__MINGW32__) && ( ( __GNUC__ > 2 ) || ( ( __GNUC__ == 2 ) && ( __GNUC_MINOR__ >= 95 ) ) )
#include <_mingw.h>
#endif
#if defined( __MINGW32__ ) && !defined(__WINE__) && !defined( HAVE_W32API_H )
#if __MINGW32_MAJOR_VERSION >= 1
#define HAVE_W32API_H
#endif
#elif defined( __CYGWIN__ ) && !defined( HAVE_W32API_H )
#if ( __GNUC__ > 2 )
#define HAVE_W32API_H
#endif
#endif
#if wxCHECK_WATCOM_VERSION(1,0)
#define HAVE_W32API_H
#endif
/* check for MinGW/Cygwin w32api version ( releases >= 0.5, only ) */
#if defined( HAVE_W32API_H )
#include <w32api.h>
#endif
/* Watcom can't handle defined(xxx) here: */
#if defined(__W32API_MAJOR_VERSION) && defined(__W32API_MINOR_VERSION)
#define wxCHECK_W32API_VERSION( major, minor ) \
( ( ( __W32API_MAJOR_VERSION > (major) ) \
|| ( __W32API_MAJOR_VERSION == (major) && __W32API_MINOR_VERSION >= (minor) ) ) )
#else
#define wxCHECK_W32API_VERSION( major, minor ) (0)
#endif
/* Cygwin / Mingw32 with gcc >= 2.95 use new windows headers which
are more ms-like (header author is Anders Norlander, hence the name) */
#if (defined(__MINGW32__) || defined(__CYGWIN__) || defined(__WINE__)) && ((__GNUC__>2) || ((__GNUC__==2) && (__GNUC_MINOR__>=95)))
#ifndef wxUSE_NORLANDER_HEADERS
#define wxUSE_NORLANDER_HEADERS 1
#endif
#else
#ifndef wxUSE_NORLANDER_HEADERS
#define wxUSE_NORLANDER_HEADERS 0
#endif
#endif
/* "old" GNUWIN32 is the one without Norlander's headers: it lacks the
standard Win32 headers and we define the used stuff ourselves for it
in wx/msw/gnuwin32/extra.h */
#if defined(__GNUC__) && !wxUSE_NORLANDER_HEADERS
#define __GNUWIN32_OLD__
#endif
/* Cygwin 1.0 */
#if defined(__CYGWIN__) && ((__GNUC__==2) && (__GNUC_MINOR__==9))
#define __CYGWIN10__
#endif
/* Check for Mingw runtime version: */
#if defined(__MINGW32_MAJOR_VERSION) && defined(__MINGW32_MINOR_VERSION)
#define wxCHECK_MINGW32_VERSION( major, minor ) \
( ( ( __MINGW32_MAJOR_VERSION > (major) ) \
|| ( __MINGW32_MAJOR_VERSION == (major) && __MINGW32_MINOR_VERSION >= (minor) ) ) )
#else
#define wxCHECK_MINGW32_VERSION( major, minor ) (0)
#endif
/* Mingw runtime 1.0-20010604 has some missing _tXXXX functions,
so let's define them ourselves: */
#if defined(__GNUWIN32__) && wxCHECK_W32API_VERSION( 1, 0 ) \
&& !wxCHECK_W32API_VERSION( 1, 1 )
#ifndef _tsetlocale
#if wxUSE_UNICODE
#define _tsetlocale _wsetlocale
#else
#define _tsetlocale setlocale
#endif
#endif
#ifndef _tgetenv
#if wxUSE_UNICODE
#define _tgetenv _wgetenv
#else
#define _tgetenv getenv
#endif
#endif
#ifndef _tfopen
#if wxUSE_UNICODE
#define _tfopen _wfopen
#else
#define _tfopen fopen
#endif
#endif
#endif
/* current (= before mingw-runtime 3.3) mingw32 headers forget to
define _puttchar, this will probably be fixed in the next versions but
for now do it ourselves
*/
#if defined( __MINGW32__ ) && \
!wxCHECK_MINGW32_VERSION(3,3) && !defined( _puttchar )
#ifdef wxUSE_UNICODE
#define _puttchar putwchar
#else
#define _puttchar puttchar
#endif
#endif
#endif
/* _WX_MSW_GCCPRIV_H_ */

View File

@ -94,7 +94,7 @@
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="&quot;$(Root)Source\3rd Party\wx\lib\vc_lib\mswd&quot;;&quot;$(Root)Source\3rd Party\wx\include&quot;;&quot;$(Root)Source\3rd Party\wx\src\tiff\libtiff&quot;;&quot;$(Root)Source\3rd Party\wx\src\jpeg&quot;;&quot;$(Root)Source\3rd Party\wx\src\png&quot;;&quot;$(Root)Source\3rd Party\wx\src\zlib&quot;"
AdditionalIncludeDirectories="&quot;$(Root)Source\3rd Party\wx\lib\vc_lib\msw&quot;;&quot;$(Root)Source\3rd Party\wx\include&quot;;&quot;$(Root)Source\3rd Party\wx\src\tiff\libtiff&quot;;&quot;$(Root)Source\3rd Party\wx\src\jpeg&quot;;&quot;$(Root)Source\3rd Party\wx\src\png&quot;;&quot;$(Root)Source\3rd Party\wx\src\zlib&quot;"
PreprocessorDefinitions="_LIB;__WXMSW__;WXBUILDING;wxUSE_BASE=0"
PrecompiledHeaderThrough="wx/wxprec.h"
DisableSpecificWarnings="4005"
@ -2172,9 +2172,9 @@
>
<Tool
Name="VCCustomBuildTool"
Description="Creating lib\vc_lib\mswu\wx\setup.h"
CommandLine="copy &quot;$(InputPath)&quot; lib\vc_lib\mswu\wx\setup.h&#x0D;&#x0A;"
Outputs="lib\vc_lib\mswu\wx\setup.h"
Description="Creating lib\vc_lib\msw\wx\setup.h"
CommandLine="copy &quot;$(InputPath)&quot; lib\vc_lib\msw\wx\setup.h&#x0D;&#x0A;"
Outputs="lib\vc_lib\msw\wx\setup.h"
/>
</FileConfiguration>
</File>
@ -2394,9 +2394,9 @@
>
<Tool
Name="VCCustomBuildTool"
Description="Creating lib\vc_lib\mswud\wx\msw\rcdefs.h"
CommandLine="cl /EP /nologo &quot;$(InputPath)&quot; &gt; &quot;lib\vc_lib\mswud\wx\msw\rcdefs.h&quot;&#x0D;&#x0A;"
Outputs="lib\vc_lib\mswud\wx\msw\rcdefs.h"
Description="Creating lib\vc_lib\mswd\wx\msw\rcdefs.h"
CommandLine="cl /EP /nologo &quot;$(InputPath)&quot; &gt; &quot;lib\vc_lib\mswd\wx\msw\rcdefs.h&quot;&#x0D;&#x0A;"
Outputs="lib\vc_lib\mswd\wx\msw\rcdefs.h"
/>
</FileConfiguration>
<FileConfiguration
@ -2404,8 +2404,8 @@
>
<Tool
Name="VCCustomBuildTool"
Description="Creating lib\vc_lib\mswu\wx\msw\rcdefs.h"
CommandLine="cl /EP /nologo &quot;$(InputPath)&quot; &gt; &quot;lib\vc_lib\mswu\wx\msw\rcdefs.h&quot;&#x0D;&#x0A;"
Description="Creating lib\vc_lib\msw\wx\msw\rcdefs.h"
CommandLine="cl /EP /nologo &quot;$(InputPath)&quot; &gt; &quot;lib\vc_lib\msw\wx\msw\rcdefs.h&quot;&#x0D;&#x0A;"
Outputs="lib\vc_lib\mswu\wx\msw\rcdefs.h"
/>
</FileConfiguration>
@ -3763,11 +3763,11 @@
>
</File>
<File
RelativePath="include\wx\splitter.h"
RelativePath="include\wx\persist\splitter.h"
>
</File>
<File
RelativePath="include\wx\persist\splitter.h"
RelativePath="include\wx\splitter.h"
>
</File>
<File
@ -3851,11 +3851,11 @@
>
</File>
<File
RelativePath="include\wx\toolbar.h"
RelativePath="include\wx\ribbon\toolbar.h"
>
</File>
<File
RelativePath="include\wx\ribbon\toolbar.h"
RelativePath="include\wx\toolbar.h"
>
</File>
<File
@ -3867,11 +3867,11 @@
>
</File>
<File
RelativePath="include\wx\toplevel.h"
RelativePath="include\wx\persist\toplevel.h"
>
</File>
<File
RelativePath="include\wx\persist\toplevel.h"
RelativePath="include\wx\toplevel.h"
>
</File>
<File
@ -3879,11 +3879,11 @@
>
</File>
<File
RelativePath="include\wx\treebook.h"
RelativePath="include\wx\persist\treebook.h"
>
</File>
<File
RelativePath="include\wx\persist\treebook.h"
RelativePath="include\wx\treebook.h"
>
</File>
<File

View File

@ -148,7 +148,19 @@
>
</File>
<File
RelativePath="src\zlib\gzio.c"
RelativePath=".\src\zlib\gzclose.c"
>
</File>
<File
RelativePath=".\src\zlib\gzlib.c"
>
</File>
<File
RelativePath=".\src\zlib\gzread.c"
>
</File>
<File
RelativePath=".\src\zlib\gzwrite.c"
>
</File>
<File

View File

@ -177,10 +177,18 @@
/>
</FileConfiguration>
</File>
<File
RelativePath=".\SyncEvent.cpp"
>
</File>
<File
RelativePath="Trace.cpp"
>
</File>
<File
RelativePath=".\Util.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
@ -230,6 +238,10 @@
RelativePath=".\stdtypes.h"
>
</File>
<File
RelativePath=".\SyncEvent.h"
>
</File>
<File
RelativePath="Trace.h"
>
@ -238,6 +250,10 @@
RelativePath="TraceDefs.h"
>
</File>
<File
RelativePath=".\Util.h"
>
</File>
</Filter>
</Files>
<Globals>

View File

@ -43,7 +43,9 @@
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="SyncEvent.cpp" />
<ClCompile Include="Trace.cpp" />
<ClCompile Include="Util.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="CriticalSection.h" />
@ -57,7 +59,9 @@
<ClInclude Include="std string.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="stdtypes.h" />
<ClInclude Include="SyncEvent.h" />
<ClInclude Include="Trace.h" />
<ClInclude Include="TraceDefs.h" />
<ClInclude Include="Util.h" />
</ItemGroup>
</Project>

View File

@ -41,6 +41,12 @@
<ClCompile Include="CriticalSection.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SyncEvent.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Util.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="CriticalSection.h">
@ -82,5 +88,11 @@
<ClInclude Include="stdtypes.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SyncEvent.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Util.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -79,20 +79,14 @@ bool CFile::Open(const char * lpszFileName, uint32_t nOpenFlags)
sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0;
// map creation flags
ULONG dwCreateFlag = 0;
ULONG dwCreateFlag = OPEN_EXISTING;
if (nOpenFlags & modeCreate)
{
if (nOpenFlags & modeNoTruncate)
dwCreateFlag = OPEN_ALWAYS;
else
dwCreateFlag = CREATE_ALWAYS;
dwCreateFlag = ((nOpenFlags & modeNoTruncate) != 0) ? OPEN_ALWAYS : CREATE_ALWAYS;
}
else
dwCreateFlag = OPEN_EXISTING;
// attempt file creation
HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa,
dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa, dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{ //#define ERROR_PATH_NOT_FOUND 3L
//ULONG err = GetLastError();
@ -169,12 +163,12 @@ uint32_t CFile::Read(void* lpBuf, uint32_t nCount)
return 0; // avoid Win32 "null-read"
}
ULONG dwRead = 0;
DWORD dwRead = 0;
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
{
return 0;
}
return (UINT)dwRead;
return (uint32_t)dwRead;
}
long CFile::Seek(long lOff, SeekPosition nFrom)

View File

@ -5,7 +5,8 @@
class CFileBase
{
public:
enum OpenFlags {
enum OpenFlags
{
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
@ -19,7 +20,8 @@ public:
modeNoTruncate = 0x2000,
};
enum Attribute {
enum Attribute
{
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,

View File

@ -2,7 +2,6 @@
#include <windows.h>
#include <stdio.h>
#include <stdarg.h>
#include <TChar.h>
CLog::CLog (void ) :
m_FlushOnWrite(false),
@ -16,7 +15,7 @@ CLog::~CLog (void)
{
}
bool CLog::Open( LPCTSTR FileName, LOG_OPEN_MODE mode /* = Log_New */)
bool CLog::Open( const char * FileName, LOG_OPEN_MODE mode /* = Log_New */)
{
if (FileName == NULL)
{
@ -34,14 +33,14 @@ bool CLog::Open( LPCTSTR FileName, LOG_OPEN_MODE mode /* = Log_New */)
m_hLogFile.Close();
}
ULONG nOpenFlags = CFile::modeReadWrite | CFile::modeCreate;
uint32_t nOpenFlags = CFile::modeReadWrite | CFile::modeCreate;
if (mode == Log_Append) { nOpenFlags |= CFile::modeNoTruncate; }
if (!m_hLogFile.Open(File, nOpenFlags))
{
return false;
}
m_FileName = (LPCTSTR)File;
m_FileName = (const char *)File;
m_hLogFile.Seek(0,mode == Log_Append ? CFile::end : CFile::begin);
#ifdef _UNICODE
@ -64,7 +63,7 @@ void CLog::Close ( void )
}
}
void CLog::LogF(LPCTSTR Message, ...)
void CLog::LogF(const char * Message, ...)
{
va_list ap;
va_start( ap, Message );
@ -72,7 +71,7 @@ void CLog::LogF(LPCTSTR Message, ...)
va_end( ap );
}
void CLog::LogArgs(LPCTSTR Message, va_list & args )
void CLog::LogArgs(const char * Message, va_list & args )
{
if (!m_hLogFile.IsOpen()) { return; }
@ -112,14 +111,16 @@ void CLog::LogArgs(LPCTSTR Message, va_list & args )
}
if (buffer)
{
delete [] buffer;
}
#endif
}
void CLog::Log( LPCTSTR Message )
void CLog::Log( const char * Message )
{
if (!m_hLogFile.IsOpen()) { return; }
m_hLogFile.Write(Message,(ULONG)_tcslen(Message)*sizeof(TCHAR));
m_hLogFile.Write(Message,(uint32_t)strlen(Message)*sizeof(TCHAR));
if (m_FlushOnWrite)
{
m_hLogFile.Flush();
@ -128,7 +129,7 @@ void CLog::Log( LPCTSTR Message )
if (m_TruncateFileLog)
{
// check file size
ULONG FileSize = m_hLogFile.GetLength();
uint32_t FileSize = m_hLogFile.GetLength();
// if larger then max size then
if (FileSize > m_MaxFileSize)
{
@ -138,16 +139,17 @@ void CLog::Log( LPCTSTR Message )
FileSize = m_hLogFile.GetLength();
}
DWORD end = m_hLogFile.SeekToEnd();
uint32_t end = m_hLogFile.SeekToEnd();
// move to reduce size
m_hLogFile.Seek((end - m_MaxFileSize) + m_FileChangeSize,CFile::begin);
// Find next end of line
DWORD NextEnter = 0, dwRead = 0;
do {
uint32_t NextEnter = 0, dwRead = 0;
do
{
BYTE Data[300];
DWORD dwRead;
uint32_t dwRead;
dwRead = m_hLogFile.Read(Data,sizeof(Data));
if (dwRead == 0)
@ -168,9 +170,10 @@ void CLog::Log( LPCTSTR Message )
} while(dwRead != 0);
// copy content of log to the new file
DWORD ReadPos = (end - m_MaxFileSize) + m_FileChangeSize + NextEnter;
DWORD SizeToRead, WritePos = 0;
do {
uint32_t ReadPos = (end - m_MaxFileSize) + m_FileChangeSize + NextEnter;
uint32_t SizeToRead, WritePos = 0;
do
{
enum { fIS_MvSize = 0x5000 };
unsigned char Data[fIS_MvSize + 1];
@ -179,7 +182,7 @@ void CLog::Log( LPCTSTR Message )
m_hLogFile.Seek(ReadPos,CFile::begin);
DWORD dwRead;
uint32_t dwRead;
dwRead = m_hLogFile.Read(Data,SizeToRead);
m_hLogFile.Seek(WritePos,CFile::begin);

View File

@ -1,11 +1,13 @@
#ifndef __LOG_CLASS__H__
#define __LOG_CLASS__H__
#pragma once
#include "File Class.h"
enum LOG_OPEN_MODE {
enum LOG_OPEN_MODE
{
Log_New, Log_Append
};
class CLog {
class CLog
{
enum { MB = 1024 * 1024 };
enum { MAX_FILE_SIZE = 10 * MB };
@ -13,24 +15,24 @@ class CLog {
bool m_FlushOnWrite;
stdstr m_FileName;
bool m_TruncateFileLog;
ULONG m_MaxFileSize;
ULONG m_FileChangeSize;
uint32_t m_MaxFileSize;
uint32_t m_FileChangeSize;
public:
CLog ( void );
~CLog ( void );
bool Open ( LPCTSTR FileName, LOG_OPEN_MODE mode = Log_New );
void Log ( LPCTSTR Message );
void LogF ( LPCTSTR Message, ... );
void LogArgs ( LPCTSTR Message, va_list & args );
bool Open ( const char * FileName, LOG_OPEN_MODE mode = Log_New );
void Log ( const char * Message );
void LogF ( const char * Message, ... );
void LogArgs ( const char * Message, va_list & args );
bool Empty ( void );
void Close ( void );
inline void SetMaxFileSize ( ULONG Size )
inline void SetMaxFileSize ( uint32_t Size )
{
m_MaxFileSize = Size;
m_FileChangeSize = (ULONG)(Size * 0.1);
m_FileChangeSize = (uint32_t)(Size * 0.1);
}
inline void SetTruncateFile( bool Truncate ) { m_TruncateFileLog = Truncate; }
inline void SetFlush ( bool Always ) { m_FlushOnWrite = Always; }
@ -38,5 +40,3 @@ public:
inline bool Flush ( void ) { return m_hLogFile.Flush(); }
inline const stdstr & FileName ( void ) const { return m_FileName; }
};
#endif

View File

@ -0,0 +1,31 @@
#include "stdafx.h"
SyncEvent::SyncEvent(bool bManualReset)
{
m_Event = CreateEvent(NULL, bManualReset, FALSE, NULL);
}
SyncEvent::~SyncEvent()
{
CloseHandle(m_Event);
}
void SyncEvent::Trigger()
{
SetEvent(m_Event);
}
bool SyncEvent::IsTriggered(int32_t iWaitTime)
{
return (WAIT_OBJECT_0 == WaitForSingleObject(m_Event,iWaitTime));
}
void SyncEvent::Reset()
{
ResetEvent(m_Event);
}
void * SyncEvent::GetHandle()
{
return m_Event;
}

21
Source/Common/SyncEvent.h Normal file
View File

@ -0,0 +1,21 @@
#pragma once
class SyncEvent
{
public:
enum { INFINITE_TIMEOUT = 0xFFFFFFFF };
SyncEvent(bool bManualReset = true);
~SyncEvent(void);
void Trigger (void);
bool IsTriggered (int32_t iWaitTime = 0);
void Reset();
void * GetHandle();
protected:
SyncEvent(const SyncEvent&); // Disable copy constructor
SyncEvent& operator=(const SyncEvent&); // Disable assignment
void * m_Event;
};

View File

@ -12,20 +12,20 @@ public:
CTraceLog()
{
}
~CTraceLog() { CloseTrace (); }
~CTraceLog() { CloseTrace(); }
CTraceModule * AddTraceModule ( CTraceModule * TraceModule );
CTraceModule * RemoveTraceModule ( CTraceModule * TraceModule );
void CloseTrace ( void );
void WriteTrace ( TraceType Type, LPCTSTR Message );
void WriteTraceF ( TraceType Type, LPCTSTR strFormat, va_list args);
CTraceModule * AddTraceModule(CTraceModule * TraceModule);
CTraceModule * RemoveTraceModule(CTraceModule * TraceModule);
void CloseTrace(void);
void WriteTrace(TraceType Type, LPCTSTR Message);
void WriteTraceF(TraceType Type, LPCTSTR strFormat, va_list args);
};
CTraceModule * CTraceLog::AddTraceModule ( CTraceModule * TraceModule )
CTraceModule * CTraceLog::AddTraceModule(CTraceModule * TraceModule)
{
CGuard Guard(m_CS);
for (int i = 0; i < (int)m_Modules.size(); i++ )
for (int i = 0; i < (int)m_Modules.size(); i++)
{
if (m_Modules[i] == TraceModule)
{
@ -36,7 +36,7 @@ CTraceModule * CTraceLog::AddTraceModule ( CTraceModule * TraceModule )
return TraceModule;
}
CTraceModule * CTraceLog::RemoveTraceModule ( CTraceModule * TraceModule )
CTraceModule * CTraceLog::RemoveTraceModule(CTraceModule * TraceModule)
{
CGuard Guard(m_CS);
@ -51,36 +51,36 @@ CTraceModule * CTraceLog::RemoveTraceModule ( CTraceModule * TraceModule )
return NULL;
}
void CTraceLog::CloseTrace ( void)
void CTraceLog::CloseTrace(void)
{
CGuard Guard(m_CS);
for (int i = 0; i < (int)m_Modules.size(); i++ )
for (int i = 0; i < (int)m_Modules.size(); i++)
{
if(m_Modules[i])
if (m_Modules[i])
delete m_Modules[i];
}
m_Modules.clear();
}
void CTraceLog::WriteTraceF ( TraceType Type, LPCTSTR strFormat, va_list args)
void CTraceLog::WriteTraceF(TraceType Type, LPCTSTR strFormat, va_list args)
{
const int nMaxSize = 32*1024;
const int nMaxSize = 32 * 1024;
TCHAR pBuffer[nMaxSize];
_vsntprintf(pBuffer,nMaxSize,strFormat,args);
_vsntprintf(pBuffer, nMaxSize, strFormat, args);
pBuffer[nMaxSize - 1] = 0;
WriteTrace(Type,pBuffer);
WriteTrace(Type, pBuffer);
}
void CTraceLog::WriteTrace ( TraceType Type, LPCTSTR Message)
void CTraceLog::WriteTrace(TraceType Type, LPCTSTR Message)
{
CGuard Guard(m_CS);
if (Type != TraceNone)
{
bool WriteToLog = false;
for (int i = 0; i < (int)m_Modules.size(); i++ )
for (int i = 0; i < (int)m_Modules.size(); i++)
{
if ((m_Modules[i]->GetTraceLevel() & Type) != 0)
{
@ -99,25 +99,25 @@ void CTraceLog::WriteTrace ( TraceType Type, LPCTSTR Message)
SYSTEMTIME sysTime;
::GetLocalTime(&sysTime);
nPos = _stprintf( pBuffer, _T("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d: "), sysTime.wYear,
sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond,sysTime.wMilliseconds,
nPos = _stprintf(pBuffer, _T("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d: "), sysTime.wYear,
sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds,
::GetCurrentThreadId()
);
// show the debug level
if (Type == TraceNone) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("None : ")); }
else if ((Type & TraceError) != 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Error : ")); }
else if ((Type & TraceSettings) != 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Setting: ")); }
else if ((Type & TraceGfxPlugin) != 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Gfx : ")); }
else if ((Type & TraceDebug) != 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Debug : ")); }
else if ((Type & TraceRecompiler)!= 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Recomp : ")); }
else if ((Type & TraceRSP )!= 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("RSP : ")); }
else if ((Type & TraceTLB )!= 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("TLB : ")); }
else if ((Type & TraceValidate )!= 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Valid : ")); }
else if ((Type & TraceAudio )!= 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Audio : ")); }
else { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Unknown: ")); }
if (Type == TraceNone) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("None : ")); }
else if ((Type & TraceError) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Error : ")); }
else if ((Type & TraceSettings) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Setting: ")); }
else if ((Type & TraceGfxPlugin) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Gfx : ")); }
else if ((Type & TraceDebug) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Debug : ")); }
else if ((Type & TraceRecompiler) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Recomp : ")); }
else if ((Type & TraceRSP) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("RSP : ")); }
else if ((Type & TraceTLB) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("TLB : ")); }
else if ((Type & TraceValidate) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Valid : ")); }
else if ((Type & TraceAudio) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Audio : ")); }
else { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Unknown: ")); }
for (int i = 0; i < (int)m_Modules.size(); i++ )
for (int i = 0; i < (int)m_Modules.size(); i++)
{
if ((m_Modules[i]->GetTraceLevel() & Type) != 0)
{
@ -125,7 +125,7 @@ void CTraceLog::WriteTrace ( TraceType Type, LPCTSTR Message)
}
}
}
for (int i = 0; i < (int)m_Modules.size(); i++ )
for (int i = 0; i < (int)m_Modules.size(); i++)
{
if ((m_Modules[i]->GetTraceLevel() & Type) != 0)
{
@ -134,23 +134,22 @@ void CTraceLog::WriteTrace ( TraceType Type, LPCTSTR Message)
}
}
CTraceLog & GetTraceObjet ( void )
CTraceLog & GetTraceObjet(void)
{
static CTraceLog TraceLog;
return TraceLog;
}
void WriteTrace (TraceType Type, LPCTSTR Message )
void WriteTrace(TraceType Type, LPCTSTR Message)
{
if (TraceClosed)
{
return;
}
GetTraceObjet().WriteTrace(Type,Message);
GetTraceObjet().WriteTrace(Type, Message);
}
void WriteTraceF ( TraceType Type, LPCTSTR strFormat, ... )
void WriteTraceF(TraceType Type, LPCTSTR strFormat, ...)
{
if (TraceClosed)
{
@ -158,11 +157,11 @@ void WriteTraceF ( TraceType Type, LPCTSTR strFormat, ... )
}
va_list args;
va_start(args, strFormat);
GetTraceObjet().WriteTraceF(Type,strFormat,args);
GetTraceObjet().WriteTraceF(Type, strFormat, args);
va_end(args);
}
CTraceModule * AddTraceModule ( CTraceModule * TraceModule )
CTraceModule * AddTraceModule(CTraceModule * TraceModule)
{
if (TraceClosed)
{
@ -172,49 +171,49 @@ CTraceModule * AddTraceModule ( CTraceModule * TraceModule )
return TraceModule;
}
CTraceModule * RemoveTraceModule ( CTraceModule * TraceModule )
CTraceModule * RemoveTraceModule(CTraceModule * TraceModule)
{
return GetTraceObjet().RemoveTraceModule(TraceModule);
}
void CloseTrace ( void )
void CloseTrace(void)
{
TraceClosed = true;
GetTraceObjet().CloseTrace();
}
CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile ) :
m_FlushFile(FlushFile)
CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile) :
m_FlushFile(FlushFile)
{
m_hLogFile.SetFlush(false);
m_hLogFile.SetTruncateFile(true);
m_hLogFile.SetMaxFileSize(5 * MB);
m_hLogFile.Open(FileName,Log_Append);
m_hLogFile.Open(FileName, Log_Append);
}
CTraceFileLog::CTraceFileLog (LPCTSTR FileName, bool FlushFile, LOG_OPEN_MODE eMode, DWORD dwMaxFileSize) :
m_FlushFile(FlushFile)
CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile, LOG_OPEN_MODE eMode, size_t dwMaxFileSize) :
m_FlushFile(FlushFile)
{
enum { MB = 1024 * 1024 };
m_hLogFile.SetFlush(false);
m_hLogFile.SetTruncateFile(true);
if(dwMaxFileSize < 2048 && dwMaxFileSize > 2)
if (dwMaxFileSize < 3 || dwMaxFileSize > 2047)
{ /* Clamp file size to 5 MB if it exceeds 2047 or falls short of 3. */
dwMaxFileSize = 5;
}
m_hLogFile.SetMaxFileSize(dwMaxFileSize * MB);
else
m_hLogFile.SetMaxFileSize(5 * MB);
m_hLogFile.Open(FileName,eMode);
m_hLogFile.Open(FileName, eMode);
}
CTraceFileLog::~CTraceFileLog()
{
TraceClosed = true;
}
void CTraceFileLog::Write(LPCTSTR Message, bool EndOfLine )
void CTraceFileLog::Write(LPCTSTR Message, bool EndOfLine)
{
if (!m_hLogFile.IsOpen()) { return; }
@ -230,7 +229,16 @@ void CTraceFileLog::Write(LPCTSTR Message, bool EndOfLine )
}
}
void CTraceFileLog::SetFlushFile( bool bFlushFile )
void CTraceFileLog::SetFlushFile(bool bFlushFile)
{
m_FlushFile = bFlushFile;
}
void CDebugTraceLog::Write(const char * Message, bool EndOfLine)
{
OutputDebugString(Message);
if (EndOfLine)
{
OutputDebugString("\n");
}
}

View File

@ -1,5 +1,8 @@
#pragma once
#include "CriticalSection.h"
#include "Log Class.h"
class CTraceModule
{
TraceLevel m_Type;
@ -10,7 +13,7 @@ public:
inline void SetTraceLevel ( TraceLevel Type ) { m_Type = Type; }
inline TraceLevel GetTraceLevel ( void ) const { return m_Type; }
virtual void Write ( LPCTSTR Message, bool EndOfLine ) = 0;
virtual void Write ( const char * Message, bool EndOfLine ) = 0;
};
class CTraceFileLog : public CTraceModule
@ -22,25 +25,18 @@ class CTraceFileLog : public CTraceModule
bool m_FlushFile;
public:
CTraceFileLog (LPCTSTR FileName, bool FlushFile = true);
CTraceFileLog (LPCTSTR FileName, bool FlushFile, LOG_OPEN_MODE eMode, DWORD dwMaxFileSize = 5);
CTraceFileLog (const char * FileName, bool FlushFile = true);
CTraceFileLog(const char * FileName, bool FlushFile, LOG_OPEN_MODE eMode, size_t dwMaxFileSize = 5);
virtual ~CTraceFileLog ();
void Write ( LPCTSTR Message, bool EndOfLine );
void Write ( const char * Message, bool EndOfLine );
void SetFlushFile ( bool bFlushFile );
};
class CDebugTraceLog : public CTraceModule
{
public:
void Write ( LPCTSTR Message, bool EndOfLine )
{
OutputDebugString(Message);
if (EndOfLine)
{
OutputDebugString("\n");
}
}
void Write ( const char * Message, bool EndOfLine );
};
CTraceModule * AddTraceModule ( CTraceModule * TraceModule ); // Must be created with new

61
Source/Common/Util.cpp Normal file
View File

@ -0,0 +1,61 @@
#include "stdafx.h"
#include "Util.h"
#include <Tlhelp32.h>
void pjutil::Sleep(uint32_t timeout)
{
::Sleep(timeout);
}
bool pjutil::TerminatedExistingExe()
{
bool bTerminated = false;
bool AskedUser = false;
DWORD pid = GetCurrentProcessId();
HANDLE nSearch = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (nSearch != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 lppe;
memset(&lppe, 0, sizeof(PROCESSENTRY32));
lppe.dwSize = sizeof(PROCESSENTRY32);
stdstr ModuleName = CPath(CPath::MODULE_FILE).GetNameExtension();
if (Process32First(nSearch, &lppe))
{
do
{
if (_stricmp(lppe.szExeFile, ModuleName.c_str()) != 0 ||
lppe.th32ProcessID == pid)
{
continue;
}
if (!AskedUser)
{
AskedUser = true;
int res = MessageBox(NULL, stdstr_f("%s currently running\n\nTerminate pid %d now?", ModuleName.c_str(), lppe.th32ProcessID).c_str(), stdstr_f("Terminate %s",ModuleName.c_str()).c_str(), MB_YESNO | MB_ICONEXCLAMATION);
if (res != IDYES)
{
break;
}
}
HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, lppe.th32ProcessID);
if (hHandle != NULL)
{
if (TerminateProcess(hHandle, 0))
{
bTerminated = true;
}
else
{
MessageBox(NULL, stdstr_f("Failed to terminate pid %d", lppe.th32ProcessID).c_str(), stdstr_f("Terminate %s failed!",ModuleName.c_str()).c_str(), MB_YESNO | MB_ICONEXCLAMATION);
}
CloseHandle(hHandle);
}
} while (Process32Next(nSearch, &lppe));
}
CloseHandle(nSearch);
}
return bTerminated;
}

14
Source/Common/Util.h Normal file
View File

@ -0,0 +1,14 @@
#pragma once
#include "stdtypes.h"
class pjutil
{
public:
static void Sleep(uint32_t timeout);
static bool TerminatedExistingExe();
private:
pjutil(void); // Disable default constructor
pjutil(const pjutil&); // Disable copy constructor
pjutil& operator=(const pjutil&); // Disable assignment
};

View File

@ -13,10 +13,10 @@
/* based on:
MD5.H - header file for MD5C.C
MDDRIVER.C - test driver for MD2, MD4 and MD5
MD5.H - header file for MD5C.C
MDDRIVER.C - test driver for MD2, MD4 and MD5
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.
License to copy and use this software is granted provided that it
@ -39,11 +39,7 @@ documentation and/or software.
*/
#if !defined(AFX_MD5_H__6DD6923B_E241_40CE_81A3_4C2C88C140E4__INCLUDED_)
#define AFX_MD5_H__6DD6923B_E241_40CE_81A3_4C2C88C140E4__INCLUDED_
/* sprintf() */
#include <stdio.h>
#pragma once
#include <string>
#include <functional>
@ -55,11 +51,13 @@ struct MD5Digest
unsigned char digest[16];
void Reset() { ::memset(digest, 0, sizeof(digest)); }
BOOL IsClear()
bool IsClear()
{
int isClear = 0;
for (int i=0; i < 16; i++)
{
isClear += digest[i];
}
return (isClear == 0);
}
std::string String ( void )
@ -88,36 +86,35 @@ struct MD5Digest_less : std::binary_function<MD5Digest, MD5Digest, bool>
class MD5
{
public:
// methods for controlled operation:
// methods for controlled operation:
MD5 (); // simple initializer
~MD5 ();
void update (const unsigned char *input, unsigned int input_length);
void update (FILE *file);
void finalize ();
// constructors for special circumstances. All these constructors finalize
// the MD5 context.
// constructors for special circumstances. All these constructors finalize
// the MD5 context.
MD5 (CPath File); // digest File, finalize
MD5 (const unsigned char *string); // digest string, finalize
MD5 (FILE *file); // digest file, close, finalize
MD5 (const unsigned char *input, unsigned int input_length);
MD5 (const stdstr & string);
// methods to acquire finalized result
// methods to acquire finalized result
void get_digest(MD5Digest& extdigest); //Digest into a digest structure
const unsigned char *raw_digest (); // digest as a 16-byte binary array
const char * hex_digest (); // digest as a 33-byte ascii-hex string
private:
// first, some types:
// first, some types:
typedef unsigned int uint4; // assumes integer is 4 words long
typedef unsigned short int uint2; // assumes short integer is 2 words long
typedef unsigned char uint1; // assumes char is 1 word long
// next, the private data:
// next, the private data:
uint4 state[4];
uint4 count[2]; // number of *bits*, mod 2^64
uint1 buffer[64]; // input buffer
@ -125,7 +122,7 @@ private:
uint1 finalized;
stdstr m_hex_digest;
// last, the private methods, mostly static:
// last, the private methods, mostly static:
void init (); // called by all constructors
void transform (uint1 *buffer); // does the real update work. Note
// that length is implied to be 64.
@ -148,9 +145,4 @@ private:
uint4 s, uint4 ac);
static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
uint4 s, uint4 ac);
};
#endif // !defined(AFX_MD5_H__6DD6923B_E241_40CE_81A3_4C2C88C140E4__INCLUDED_)

View File

@ -1,4 +1,5 @@
#include "stdafx.h"
#include <malloc.h>
#include <algorithm>
stdstr::stdstr()

View File

@ -51,5 +51,22 @@ public:
}
};
class stdwstr_f : public std::wstring
{
public:
stdwstr_f(const wchar_t * strFormat, ...)
{
va_list args;
va_start(args, strFormat);
wchar_t Msg[1000];
_vsnwprintf(Msg, sizeof(Msg) - 1, strFormat, args);
va_end(args);
this->assign(Msg);
}
};
typedef std::list<stdstr> strlist;
typedef strlist::iterator strlist_iter;

View File

@ -16,3 +16,4 @@
#include "Trace.h"
#include "md5.h"
#include "Smart Pointer.h"
#include "SyncEvent.h"

View File

@ -87,41 +87,17 @@ static int left_z, left_dzdy;
__inline int imul16(int x, int y) // (x * y) >> 16
{
return (((long long)x) * ((long long)y)) >> 16;
return ((int64_t)x * (int64_t)y) >> 16;
}
__inline int imul14(int x, int y) // (x * y) >> 14
{
return (((long long)x) * ((long long)y)) >> 14;
return ((int64_t)x * (int64_t)y) >> 14;
}
__inline int idiv16(int x, int y) // (x << 16) / y
{
//x = (((long long)x) << 16) / ((long long)y);
/*
eax = x;
ebx = y;
edx = x;
(x << 16) | ()
*/
#if !defined(__GNUC__) && !defined(NO_ASM)
__asm {
mov eax, x
mov ebx, y
mov edx,eax
sar edx,16
shl eax,16
idiv ebx
mov x, eax
}
#elif !defined(NO_ASM)
int reminder;
asm ("idivl %[divisor]"
: "=a" (x), "=d" (reminder)
: [divisor] "g" (y), "d" (x >> 16), "a" (x << 16));
#else
x = (((long long)x) << 16) / ((long long)y);
#endif
x = ((int64_t)x << 16) / (int64_t)y;
return x;
}

View File

@ -37,9 +37,9 @@
//
//****************************************************************
#include <Common/std string.h>
#include "Gfx_1.3.h"
#include "Version.h"
#include <Common/std string.h>
#include <Settings/Settings.h>
#include <wx/fileconf.h>
@ -1197,7 +1197,7 @@ int DllUnload(void)
void wxSetInstance(HINSTANCE hInstance);
extern "C" int WINAPI DllMain (HINSTANCE hinst,
wxUint32 fdwReason,
DWORD fdwReason,
LPVOID /*lpReserved*/)
{
sprintf (out_buf, "DllMain (%0p - %d)\n", hinst, fdwReason);

View File

@ -830,12 +830,20 @@ extern const char *CIStatus[];
#define FBL_D_1 2
#define FBL_D_0 3
/*
* taken straight from MSVC <windef.h> in case of other compilers
*
* Careful! These macros can sabotage std::max and std::min from <vector>.
* The only solution is to include <vector> first, before <windef.h> or
* before defining the below macros (or just don't use <windows.h>).
*/
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef TRUE
#define TRUE 1
#endif

View File

@ -3,7 +3,7 @@
[Setup]
AppId={{BEB5FB69-4080-466F-96C4-F15DF271718B}
AppName=Project 64
AppName=Project64
AppVersion={#AppVersion}
DefaultDirName={pf}\Project64 2.2
VersionInfoVersion={#AppVersion}
@ -19,7 +19,7 @@ UninstallDisplayIcon={uninstallexe}
SetupIconFile={#BaseDir}\Source\Project64\User Interface\Icons\pj64.ico
[Run]
Filename: "{app}\Project64.exe"; Description: "{cm:LaunchProgram,{#StringChange('Project 64', '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\Project64.exe"; Description: "{cm:LaunchProgram,{#StringChange('Project64', '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Files]
Source: "{#BaseDir}\Bin\{#Configuration}\Project64.exe"; DestDir: "{app}"; Flags: ignoreversion
@ -42,9 +42,9 @@ Name: "{app}\Screenshots"; Permissions: users-modify
Name: "{app}\Textures"; Permissions: users-modify
[Icons]
Name: "{commonprograms}\Project 64 2.2\Project 64"; Filename: "{app}\Project64.exe"
Name: "{commonprograms}\Project 64 2.2\Uninstall Project64 2.2"; Filename: "{uninstallexe}"; Parameters: "/LOG"
Name: "{commonprograms}\Project 64 2.2\Support"; Filename: "http://forum.pj64-emu.com"
Name: "{commonprograms}\Project64 2.2\Project64"; Filename: "{app}\Project64.exe"
Name: "{commonprograms}\Project64 2.2\Uninstall Project64 2.2"; Filename: "{uninstallexe}"; Parameters: "/LOG"
Name: "{commonprograms}\Project64 2.2\Support"; Filename: "http://forum.pj64-emu.com"
[Code]
function HaveCommandlineParam (inParam: String): Boolean;

View File

@ -0,0 +1,139 @@
#include "stdafx.h"
#include <Common\Util.h>
void FixDirectories(void);
void FixLocale(void);
static void IncreaseThreadPriority(void);
static CTraceFileLog * g_LogFile = NULL;
void LogLevelChanged(CTraceFileLog * LogFile)
{
LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
}
void LogFlushChanged(CTraceFileLog * LogFile)
{
LogFile->SetFlushFile(g_Settings->LoadDword(Debugger_AppLogFlush) != 0);
}
void InitializeLog(void)
{
CPath LogFilePath(CPath::MODULE_DIRECTORY);
LogFilePath.AppendDirectory("Logs");
if (!LogFilePath.DirectoryExists())
{
LogFilePath.DirectoryCreate();
}
LogFilePath.SetNameExtension("Project64.log");
g_LogFile = new CTraceFileLog(LogFilePath, g_Settings->LoadDword(Debugger_AppLogFlush) != 0, Log_New, 500);
#ifdef VALIDATE_DEBUG
g_LogFile->SetTraceLevel((TraceLevel)(g_Settings->LoadDword(Debugger_AppLogLevel) | TraceValidate | TraceDebug));
#else
g_LogFile->SetTraceLevel((TraceLevel)g_Settings->LoadDword(Debugger_AppLogLevel));
#endif
AddTraceModule(g_LogFile);
g_Settings->RegisterChangeCB(Debugger_AppLogLevel, g_LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
g_Settings->RegisterChangeCB(Debugger_AppLogFlush, g_LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
}
void AppInit(CNotification * Notify)
{
try
{
g_Notify = Notify;
FixDirectories();
FixLocale();
stdstr_f AppName("Project64 %s", VER_FILE_VERSION_STR);
IncreaseThreadPriority();
g_Settings = new CSettings;
g_Settings->Initialize(AppName.c_str());
if (g_Settings->LoadBool(Setting_CheckEmuRunning) &&
pjutil::TerminatedExistingExe())
{
delete g_Settings;
g_Settings = new CSettings;
g_Settings->Initialize(AppName.c_str());
}
InitializeLog();
WriteTrace(TraceDebug, __FUNCTION__ ": Application Starting");
CMipsMemoryVM::ReserveMemory();
//Create the plugin container
WriteTrace(TraceDebug, __FUNCTION__ ": Create Plugins");
g_Plugins = new CPlugins(g_Settings->LoadStringVal(Directory_Plugin));
g_Lang = new CLanguage();
g_Lang->LoadCurrentStrings();
g_Notify->AppInitDone();
}
catch (...)
{
g_Notify->DisplayError(stdstr_f("Exception caught\nFile: %s\nLine: %d", __FILE__, __LINE__).ToUTF16().c_str());
}
}
void AppCleanup(void)
{
g_Settings->UnregisterChangeCB(Debugger_AppLogLevel, g_LogFile, (CSettings::SettingChangedFunc)LogLevelChanged);
g_Settings->UnregisterChangeCB(Debugger_AppLogFlush, g_LogFile, (CSettings::SettingChangedFunc)LogFlushChanged);
WriteTrace(TraceDebug, __FUNCTION__ ": cleaning up global objects");
if (g_Rom) { delete g_Rom; g_Rom = NULL; }
if (g_Plugins) { delete g_Plugins; g_Plugins = NULL; }
if (g_Settings) { delete g_Settings; g_Settings = NULL; }
if (g_Lang) { delete g_Lang; g_Lang = NULL; }
CMipsMemoryVM::FreeReservedMemory();
WriteTrace(TraceDebug, __FUNCTION__ ": Done");
CloseTrace();
}
void FixDirectories(void)
{
CPath Directory(CPath::MODULE_DIRECTORY);
Directory.AppendDirectory("Config");
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
Directory.UpDirectory();
Directory.AppendDirectory("Logs");
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
Directory.UpDirectory();
Directory.AppendDirectory("Save");
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
Directory.UpDirectory();
Directory.AppendDirectory("Screenshots");
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
Directory.UpDirectory();
Directory.AppendDirectory("textures");
if (!Directory.DirectoryExists()) Directory.DirectoryCreate();
}
#include <windows.h>
void FixLocale(void)
{
char *lbuffer = new char[10];
if (GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SABBREVLANGNAME, lbuffer, 10))
{
setlocale(LC_ALL, lbuffer);
}
delete[] lbuffer;
}
void IncreaseThreadPriority(void)
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
}

View File

@ -0,0 +1,6 @@
#pragma once
#include <Project64\User Interface\Notification Class.h>
void AppInit(CNotification * Notify);
void AppCleanup(void);

View File

@ -10,20 +10,7 @@
****************************************************************************/
#pragma once
class CDelaySlotFunctionMap
__interface CDebugger
{
typedef std::map<DWORD,CCompiledFunc *> FUNCTION_MAP;
FUNCTION_MAP FunctionMap;
public:
CDelaySlotFunctionMap();
~CDelaySlotFunctionMap();
CCompiledFunc* AddFunctionInfo(DWORD vAddr, DWORD pAddr);
CCompiledFunc* FindFunction(DWORD vAddr, int Length);
CCompiledFunc* FindFunction(DWORD vAddr) const;
void Remove(CCompiledFunc* info);
void Reset();
virtual void TLBChanged(void) = 0;
};

View File

@ -0,0 +1,28 @@
/****************************************************************************
* *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
#pragma once
#include <Project64\Settings\Logging Settings.h>
#include <Common\File Class.h>
class CLogging :
public CLogSettings
{
public:
static void StartLog(void);
static void StopLog(void);
static void Log_LW(uint32_t PC, uint32_t VAddr);
static void Log_SW(uint32_t PC, uint32_t VAddr, uint32_t Value);
static void LogMessage(const char * Message, ...);
private:
static CFile * m_hLogFile;
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -13,32 +13,32 @@
enum LanguageStringID{
EMPTY_STRING = 0,
/*********************************************************************************
* Meta Information *
*********************************************************************************/
//About DLL
/*********************************************************************************
* Meta Information *
*********************************************************************************/
//About DLL
LANGUAGE_NAME = 1,
LANGUAGE_AUTHOR =2,
LANGUAGE_VERSION =3,
LANGUAGE_DATE =4,
LANGUAGE_AUTHOR = 2,
LANGUAGE_VERSION = 3,
LANGUAGE_DATE = 4,
//About DLL Dialog
INI_CURRENT_LANG =5,
INI_AUTHOR =6,
INI_VERSION =7,
INI_DATE =8,
INI_HOMEPAGE =9,
INI_CURRENT_RDB =10,
INI_CURRENT_CHT =11,
INI_CURRENT_RDX =12,
//About DLL Dialog
INI_CURRENT_LANG = 5,
INI_AUTHOR = 6,
INI_VERSION = 7,
INI_DATE = 8,
INI_HOMEPAGE = 9,
INI_CURRENT_RDB = 10,
INI_CURRENT_CHT = 11,
INI_CURRENT_RDX = 12,
//About INI title
INI_TITLE =20,
//About INI title
INI_TITLE = 20,
/*********************************************************************************
* Numbers *
*********************************************************************************/
NUMBER_0 =50,
/*********************************************************************************
* Numbers *
*********************************************************************************/
NUMBER_0 = 50,
NUMBER_1 = 51,
NUMBER_2 = 52,
NUMBER_3 = 53,
@ -49,63 +49,63 @@ enum LanguageStringID{
NUMBER_8 = 58,
NUMBER_9 = 59,
/*********************************************************************************
* Menu *
*********************************************************************************/
//File Menu
MENU_FILE =100,
MENU_OPEN =101,
MENU_ROM_INFO =102,
MENU_START =103,
MENU_END =104,
MENU_CHOOSE_ROM =105,
MENU_REFRESH =106,
MENU_RECENT_ROM =107,
MENU_RECENT_DIR =108,
MENU_EXIT =109,
/*********************************************************************************
* Menu *
*********************************************************************************/
//File Menu
MENU_FILE = 100,
MENU_OPEN = 101,
MENU_ROM_INFO = 102,
MENU_START = 103,
MENU_END = 104,
MENU_CHOOSE_ROM = 105,
MENU_REFRESH = 106,
MENU_RECENT_ROM = 107,
MENU_RECENT_DIR = 108,
MENU_EXIT = 109,
//System Menu
MENU_SYSTEM =120,
MENU_RESET =121,
MENU_PAUSE =122,
MENU_BITMAP =123,
MENU_LIMIT_FPS =124,
MENU_SAVE =125,
MENU_SAVE_AS =126,
MENU_RESTORE =127,
MENU_LOAD =128,
MENU_CURRENT_SAVE =129,
MENU_CHEAT =130,
MENU_GS_BUTTON =131,
MENU_RESUME =132,
MENU_RESET_SOFT =133, //added in build 1.7.50
MENU_RESET_HARD =134, //added in build 1.7.50
//System Menu
MENU_SYSTEM = 120,
MENU_RESET = 121,
MENU_PAUSE = 122,
MENU_BITMAP = 123,
MENU_LIMIT_FPS = 124,
MENU_SAVE = 125,
MENU_SAVE_AS = 126,
MENU_RESTORE = 127,
MENU_LOAD = 128,
MENU_CURRENT_SAVE = 129,
MENU_CHEAT = 130,
MENU_GS_BUTTON = 131,
MENU_RESUME = 132,
MENU_RESET_SOFT = 133, //added in build 1.7.50
MENU_RESET_HARD = 134, //added in build 1.7.50
//Options Menu
//Options Menu
MENU_OPTIONS = 140,
MENU_FULL_SCREEN= 141,
MENU_FULL_SCREEN = 141,
MENU_ON_TOP = 142,
MENU_CONFG_GFX = 143,
MENU_CONFG_AUDIO= 144,
MENU_CONFG_AUDIO = 144,
MENU_CONFG_CTRL = 145,
MENU_CONFG_RSP = 146,
MENU_SHOW_CPU = 147,
MENU_SETTINGS = 148,
//Debugger Menu
//Debugger Menu
MENU_DEBUGGER = 160,
//Language Menu
//Language Menu
MENU_LANGUAGE = 175,
//Help Menu
//Help Menu
MENU_HELP = 180,
MENU_ABOUT_INI = 181,
MENU_ABOUT_PJ64 = 182,
MENU_FORUM = 183,
MENU_HOMEPAGE = 184,
//Current Save Slot menu
//Current Save Slot menu
MENU_SLOT_DEFAULT = 190,
MENU_SLOT_1 = 191,
MENU_SLOT_2 = 192,
@ -117,15 +117,16 @@ enum LanguageStringID{
MENU_SLOT_8 = 198,
MENU_SLOT_9 = 199,
MENU_SLOT_10 = 200,
MENU_SLOT_SAVE = 201,
//Pop up Menu
//Pop up Menu
POPUP_PLAY = 210,
POPUP_INFO = 211,
POPUP_SETTINGS = 212,
POPUP_CHEATS = 213,
POPUP_GFX_PLUGIN = 214,
//selecting save slot
//selecting save slot
SAVE_SLOT_DEFAULT = 220,
SAVE_SLOT_1 = 221,
SAVE_SLOT_2 = 222,
@ -138,7 +139,7 @@ enum LanguageStringID{
SAVE_SLOT_9 = 229,
SAVE_SLOT_10 = 230,
// Menu Descriptions (TODO: unused ? implement or remove)
// Menu Descriptions (TODO: unused ? implement or remove)
MENUDES_OPEN = 250,
MENUDES_ROM_INFO = 251,
MENUDES_START = 252,
@ -174,13 +175,13 @@ enum LanguageStringID{
MENUDES_GAME_SLOT = 282,
MENUDES_PLAY_GAME = 283,
MENUDES_GAME_INFO = 284,
MENUDES_GAME_SETTINGS= 285,
MENUDES_GAME_SETTINGS = 285,
MENUDES_GAME_CHEATS = 286,
/*********************************************************************************
* Rom Browser *
*********************************************************************************/
//Rom Browser Fields
/*********************************************************************************
* Rom Browser *
*********************************************************************************/
//Rom Browser Fields
RB_FILENAME = 300,
RB_INTERNALNAME = 301,
RB_GOODNAME = 302,
@ -202,32 +203,32 @@ enum LanguageStringID{
RB_FORCE_FEEDBACK = 318,
RB_FILE_FORMAT = 319,
//Select Rom
//Select Rom
SELECT_ROM_DIR = 320,
//Messages
//Messages
RB_NOT_GOOD_FILE = 340,
/*********************************************************************************
* Options *
*********************************************************************************/
//Options Title
/*********************************************************************************
* Options *
*********************************************************************************/
//Options Title
OPTIONS_TITLE = 400,
//Tabs
//Tabs
TAB_PLUGIN = 401,
TAB_DIRECTORY = 402,
TAB_OPTIONS = 403,
TAB_ROMSELECTION = 404,
TAB_ADVANCED = 405,
TAB_ROMSETTINGS = 406,
TAB_SHELLINTERGATION= 407,
TAB_SHELLINTERGATION = 407,
TAB_ROMNOTES = 408,
TAB_SHORTCUTS = 409,
TAB_ROMSTATUS = 410,
TAB_RECOMPILER = 411, //Added in 1.7.0.50
//Plugin Dialog
//Plugin Dialog
PLUG_ABOUT = 420,
PLUG_RSP = 421,
PLUG_GFX = 422,
@ -237,7 +238,7 @@ enum LanguageStringID{
PLUG_HLE_AUDIO = 426,
PLUG_DEFAULT = 427,
//Directory Dialog
//Directory Dialog
DIR_PLUGIN = 440,
DIR_ROM = 441,
DIR_AUTO_SAVE = 442,
@ -252,17 +253,17 @@ enum LanguageStringID{
DIR_TEXTURE = 451,
DIR_SELECT_TEXTURE = 452,
//Options (general) Tab
OPTION_AUTO_SLEEP =460,
OPTION_AUTO_FULLSCREEN =461,
OPTION_BASIC_MODE =462,
OPTION_REMEMBER_CHEAT =463,
OPTION_DISABLE_SS =464,
OPTION_DISPLAY_FR =465,
OPTION_CHANGE_FR =466,
OPTION_CHECK_RUNNING =467,
//Options (general) Tab
OPTION_AUTO_SLEEP = 460,
OPTION_AUTO_FULLSCREEN = 461,
OPTION_BASIC_MODE = 462,
OPTION_REMEMBER_CHEAT = 463,
OPTION_DISABLE_SS = 464,
OPTION_DISPLAY_FR = 465,
OPTION_CHANGE_FR = 466,
OPTION_CHECK_RUNNING = 467,
//Rom Browser Tab
//Rom Browser Tab
RB_MAX_ROMS = 480,
RB_ROMS = 481,
RB_MAX_DIRS = 482,
@ -277,7 +278,7 @@ enum LanguageStringID{
RB_DOWN = 491,
RB_REFRESH = 492,
//Advanced Options
//Advanced Options
ADVANCE_INFO = 500,
ADVANCE_DEFAULTS = 501,
ADVANCE_CPU_STYLE = 502,
@ -290,11 +291,11 @@ enum LanguageStringID{
ADVANCE_DEBUGGER = 509,
ADVANCE_SMM_CACHE = 510,
ADVANCE_SMM_PIDMA = 511,
ADVANCE_SMM_VALIDATE= 512,
ADVANCE_SMM_VALIDATE = 512,
ADVANCE_SMM_PROTECT = 513,
ADVANCE_SMM_TLB = 514,
//Rom Options
//Rom Options
ROM_CPU_STYLE = 520,
ROM_VIREFRESH = 521,
ROM_MEM_SIZE = 522,
@ -316,12 +317,12 @@ enum LanguageStringID{
ROM_32BIT = 538,
ROM_DELAY_DP = 539,
//Core Styles
//Core Styles
CORE_INTERPTER = 540,
CORE_RECOMPILER = 541,
CORE_SYNC = 542,
//Self Mod Methods
//Self Mod Methods
SMCM_NONE = 560,
SMCM_CACHE = 561,
SMCM_PROECTED = 562,
@ -330,35 +331,35 @@ enum LanguageStringID{
SMCM_CHECK_ADV = 565,
SMCM_CACHE2 = 566,
//Function Lookup memthod
//Function Lookup memthod
FLM_PLOOKUP = 570,
FLM_VLOOKUP = 571,
FLM_CHANGEMEM = 572,
//RDRAM Size
//RDRAM Size
RDRAM_4MB = 580,
RDRAM_8MB = 581,
//Advanced Block Linking
//Advanced Block Linking
ABL_ON = 600,
ABL_OFF = 601,
//Save Type
//Save Type
SAVE_FIRST_USED = 620,
SAVE_4K_EEPROM = 621,
SAVE_16K_EEPROM = 622,
SAVE_SRAM = 623,
SAVE_FLASHRAM = 624,
//Shell Integration Tab
//Shell Integration Tab
SHELL_TEXT = 640,
//Rom Notes
//Rom Notes
NOTE_STATUS = 660,
NOTE_CORE = 661,
NOTE_PLUGIN = 662,
// Accelerator Selector
// Accelerator Selector
ACCEL_CPUSTATE_TITLE = 680,
ACCEL_MENUITEM_TITLE = 681,
ACCEL_CURRENTKEYS_TITLE = 682,
@ -373,90 +374,90 @@ enum LanguageStringID{
ACCEL_CPUSTATE_4 = 691,
ACCEL_DETECTKEY = 692,
// Frame Rate Option
// Frame Rate Option
STR_FR_VIS = 700,
STR_FR_DLS = 701,
STR_FR_PERCENT = 702,
// Increase speed
// Increase speed
STR_INSREASE_SPEED = 710,
STR_DECREASE_SPEED = 711,
//Bottom page buttons
//Bottom page buttons
BOTTOM_RESET_PAGE = 720,
BOTTOM_RESET_ALL = 721,
BOTTOM_APPLY = 722,
BOTTOM_CLOSE = 723,
/*********************************************************************************
* ROM Information *
*********************************************************************************/
//Rom Info Title Title
/*********************************************************************************
* ROM Information *
*********************************************************************************/
//Rom Info Title Title
INFO_TITLE = 800,
//Rom Info Text
//Rom Info Text
INFO_ROM_NAME_TEXT = 801,
INFO_FILE_NAME_TEXT = 802,
INFO_LOCATION_TEXT = 803,
INFO_SIZE_TEXT = 804,
INFO_CART_ID_TEXT = 805,
INFO_MANUFACTURER_TEXT= 806,
INFO_MANUFACTURER_TEXT = 806,
INFO_COUNTRY_TEXT = 807,
INFO_CRC1_TEXT = 808,
INFO_CRC2_TEXT = 809,
INFO_CIC_CHIP_TEXT = 810,
INFO_MD5_TEXT = 811,
/*********************************************************************************
* Cheats *
*********************************************************************************/
//Cheat List
/*********************************************************************************
* Cheats *
*********************************************************************************/
//Cheat List
CHEAT_TITLE = 1000,
CHEAT_LIST_FRAME = 1001,
CHEAT_NOTES_FRAME = 1002,
CHEAT_MARK_ALL = 1003,
CHEAT_MARK_NONE = 1004,
//Add Cheat
CHEAT_ADDCHEAT_FRAME =1005,
CHEAT_ADDCHEAT_NAME =1006,
//Add Cheat
CHEAT_ADDCHEAT_FRAME = 1005,
CHEAT_ADDCHEAT_NAME = 1006,
CHEAT_ADDCHEAT_CODE = 1007,
CHEAT_ADDCHEAT_INSERT= 1008,
CHEAT_ADDCHEAT_CLEAR= 1009,
CHEAT_ADDCHEAT_NOTES= 1010,
CHEAT_ADDCHEAT_INSERT = 1008,
CHEAT_ADDCHEAT_CLEAR = 1009,
CHEAT_ADDCHEAT_NOTES = 1010,
CHEAT_ADD_TO_DB = 1011,
//Code extension
CHEAT_CODE_EXT_TITLE =1012,
CHEAT_CODE_EXT_TXT =1013,
CHEAT_OK =1014,
CHEAT_CANCEL =1015,
//Code extension
CHEAT_CODE_EXT_TITLE = 1012,
CHEAT_CODE_EXT_TXT = 1013,
CHEAT_OK = 1014,
CHEAT_CANCEL = 1015,
//Digital Value
CHEAT_QUANTITY_TITLE =1016,
CHEAT_CHOOSE_VALUE =1017,
CHEAT_VALUE =1018,
CHEAT_FROM =1019,
CHEAT_TO =1020,
CHEAT_NOTES =1021,
//Digital Value
CHEAT_QUANTITY_TITLE = 1016,
CHEAT_CHOOSE_VALUE = 1017,
CHEAT_VALUE = 1018,
CHEAT_FROM = 1019,
CHEAT_TO = 1020,
CHEAT_NOTES = 1021,
CHEAT_ADDCHEAT_ADD = 1022,
CHEAT_ADDCHEAT_NEW = 1023,
CHEAT_ADDCHEAT_CODEDES =1024,
CHEAT_ADDCHEAT_OPT =1025,
CHEAT_ADDCHEAT_OPTDES =1026,
CHEAT_ADDCHEAT_CODEDES = 1024,
CHEAT_ADDCHEAT_OPT = 1025,
CHEAT_ADDCHEAT_OPTDES = 1026,
//Edit Cheat
CHEAT_EDITCHEAT_WINDOW =1027,
CHEAT_EDITCHEAT_UPDATE =1028,
CHEAT_CHANGED_MSG =1029,
CHEAT_CHANGED_TITLE =1030,
//Edit Cheat
CHEAT_EDITCHEAT_WINDOW = 1027,
CHEAT_EDITCHEAT_UPDATE = 1028,
CHEAT_CHANGED_MSG = 1029,
CHEAT_CHANGED_TITLE = 1030,
//Cheat Popup Menu
CHEAT_ADDNEW =1040,
//Cheat Popup Menu
CHEAT_ADDNEW = 1040,
CHEAT_EDIT = 1041,
CHEAT_DELETE = 1042,
// short cut editor
// short cut editor
STR_SHORTCUT_RESET_TITLE = 1100,
STR_SHORTCUT_RESET_TEXT = 1101,
STR_SHORTCUT_FILEMENU = 1102,
@ -464,9 +465,9 @@ enum LanguageStringID{
STR_SHORTCUT_OPTIONS = 1104,
STR_SHORTCUT_SAVESLOT = 1105,
/*********************************************************************************
* Messages *
*********************************************************************************/
/*********************************************************************************
* Messages *
*********************************************************************************/
MSG_CPU_PAUSED = 2000,
MSG_CPU_RESUMED = 2001,
MSG_PERM_LOOP = 2002,
@ -487,23 +488,23 @@ enum LanguageStringID{
MSG_FAIL_IMAGE = 2017,
MSG_UNKNOWN_COUNTRY = 2018,
MSG_UNKNOWN_CIC_CHIP = 2019,
MSG_UNKNOWN_FILE_FORMAT= 2020,
MSG_UNKNOWN_FILE_FORMAT = 2020,
MSG_UNKNOWN_MEM_ACTION = 2021,
MSG_UNHANDLED_OP = 2022,
MSG_NONMAPPED_SPACE = 2023,
MSG_SAVE_STATE_HEADER = 2024,
MSG_MSGBOX_TITLE =2025,
MSG_MSGBOX_TITLE = 2025,
MSG_PIF2_ERROR = 2026,
MSG_PIF2_TITLE = 2027,
MSG_PLUGIN_CHANGE = 2028,
MSG_PLUGIN_CHANGE_TITLE= 2029,
MSG_PLUGIN_CHANGE_TITLE = 2029,
MSG_EMULATION_ENDED = 2030,
MSG_EMULATION_STARTED = 2031,
MSG_UNABLED_LOAD_STATE = 2032,
MSG_LOADED_STATE = 2033,
MSG_SAVED_STATE = 2034,
MSG_SAVE_SLOT = 2035,
MSG_BYTESWAP =2036,
MSG_BYTESWAP = 2036,
MSG_CHOOSE_IMAGE = 2037,
MSG_LOADED = 2038,
MSG_LOADING = 2039,

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -14,182 +14,183 @@
CLanguage * g_Lang = NULL;
void CLanguage::LoadDefaultStrings (void)
void CLanguage::LoadDefaultStrings(void)
{
#define DEF_STR(ID,str) m_DefaultStrings.insert(LANG_STRINGS::value_type(ID,str))
DEF_STR(EMPTY_STRING, L"" );
DEF_STR(EMPTY_STRING, L"");
/*********************************************************************************
* Meta Information *
*********************************************************************************/
//About DLL
DEF_STR(LANGUAGE_NAME, L"" );
DEF_STR(LANGUAGE_AUTHOR, L"" );
DEF_STR(LANGUAGE_VERSION, L"" );
DEF_STR(LANGUAGE_DATE, L"" );
DEF_STR(LANGUAGE_NAME, L"");
DEF_STR(LANGUAGE_AUTHOR, L"");
DEF_STR(LANGUAGE_VERSION, L"");
DEF_STR(LANGUAGE_DATE, L"");
//About DLL Dialog
DEF_STR(INI_CURRENT_LANG, L"Current Language" );
DEF_STR(INI_AUTHOR, L"Author" );
DEF_STR(INI_VERSION, L"Version" );
DEF_STR(INI_DATE, L"Date" );
DEF_STR(INI_HOMEPAGE, L"Visit Home Page" );
DEF_STR(INI_CURRENT_RDB, L"ROM Database (.RDB)" );
DEF_STR(INI_CURRENT_CHT, L"Cheat Code File (.CHT)" );
DEF_STR(INI_CURRENT_LANG, L"Current Language");
DEF_STR(INI_AUTHOR, L"Author");
DEF_STR(INI_VERSION, L"Version");
DEF_STR(INI_DATE, L"Date");
DEF_STR(INI_HOMEPAGE, L"Visit Home Page");
DEF_STR(INI_CURRENT_RDB, L"ROM Database (.RDB)");
DEF_STR(INI_CURRENT_CHT, L"Cheat Code File (.CHT)");
DEF_STR(INI_CURRENT_RDX, L"Extended ROM Info (.RDX)");
//About INI title
DEF_STR(INI_TITLE, L"About Config Files" );
DEF_STR(INI_TITLE, L"About Config Files");
/*********************************************************************************
* Numbers *
*********************************************************************************/
DEF_STR(NUMBER_0, L"0" );
DEF_STR(NUMBER_1, L"1" );
DEF_STR(NUMBER_2, L"2" );
DEF_STR(NUMBER_3, L"3" );
DEF_STR(NUMBER_4, L"4" ),
DEF_STR(NUMBER_5, L"5" );
DEF_STR(NUMBER_6, L"6" );
DEF_STR(NUMBER_7, L"7" );
DEF_STR(NUMBER_8, L"8" );
DEF_STR(NUMBER_9, L"9" );
DEF_STR(NUMBER_0, L"0");
DEF_STR(NUMBER_1, L"1");
DEF_STR(NUMBER_2, L"2");
DEF_STR(NUMBER_3, L"3");
DEF_STR(NUMBER_4, L"4"),
DEF_STR(NUMBER_5, L"5");
DEF_STR(NUMBER_6, L"6");
DEF_STR(NUMBER_7, L"7");
DEF_STR(NUMBER_8, L"8");
DEF_STR(NUMBER_9, L"9");
/*********************************************************************************
* Menu *
*********************************************************************************/
//File Menu
DEF_STR(MENU_FILE, L"&File" );
DEF_STR(MENU_OPEN, L"&Open ROM" );
DEF_STR(MENU_ROM_INFO, L"ROM &Info...." );
DEF_STR(MENU_START, L"Start Emulation" );
DEF_STR(MENU_END, L"&End Emulation" );
DEF_STR(MENU_CHOOSE_ROM, L"Choose ROM Directory..." );
DEF_STR(MENU_REFRESH, L"Refresh ROM List" );
DEF_STR(MENU_RECENT_ROM, L"Recent ROM" );
DEF_STR(MENU_RECENT_DIR, L"Recent ROM Directories" );
DEF_STR(MENU_EXIT, L"E&xit" );
DEF_STR(MENU_FILE, L"&File");
DEF_STR(MENU_OPEN, L"&Open ROM");
DEF_STR(MENU_ROM_INFO, L"ROM &Info....");
DEF_STR(MENU_START, L"Start Emulation");
DEF_STR(MENU_END, L"&End Emulation");
DEF_STR(MENU_CHOOSE_ROM, L"Choose ROM Directory...");
DEF_STR(MENU_REFRESH, L"Refresh ROM List");
DEF_STR(MENU_RECENT_ROM, L"Recent ROM");
DEF_STR(MENU_RECENT_DIR, L"Recent ROM Directories");
DEF_STR(MENU_EXIT, L"E&xit");
//System Menu
DEF_STR(MENU_SYSTEM, L"&System" );
DEF_STR(MENU_RESET, L"&Reset" );
DEF_STR(MENU_PAUSE, L"&Pause" );
DEF_STR(MENU_BITMAP, L"Generate Bitmap" );
DEF_STR(MENU_LIMIT_FPS, L"Limit FPS" );
DEF_STR(MENU_SAVE, L"&Save State" );
DEF_STR(MENU_SAVE_AS, L"Save As..." );
DEF_STR(MENU_RESTORE, L"&Load State" );
DEF_STR(MENU_LOAD, L"Load..." );
DEF_STR(MENU_CURRENT_SAVE,L"Current Save S&tate" );
DEF_STR(MENU_CHEAT, L"Cheats..." );
DEF_STR(MENU_GS_BUTTON, L"GS Button" );
DEF_STR(MENU_RESUME, L"R&esume" );
DEF_STR(MENU_RESET_SOFT, L"&Soft Reset" );
DEF_STR(MENU_RESET_HARD, L"&Hard Reset" );
DEF_STR(MENU_SYSTEM, L"&System");
DEF_STR(MENU_RESET, L"&Reset");
DEF_STR(MENU_PAUSE, L"&Pause");
DEF_STR(MENU_BITMAP, L"Generate Bitmap");
DEF_STR(MENU_LIMIT_FPS, L"Limit FPS");
DEF_STR(MENU_SAVE, L"&Save State");
DEF_STR(MENU_SAVE_AS, L"Save As...");
DEF_STR(MENU_RESTORE, L"&Load State");
DEF_STR(MENU_LOAD, L"Load...");
DEF_STR(MENU_CURRENT_SAVE, L"Current Save S&tate");
DEF_STR(MENU_CHEAT, L"Cheats...");
DEF_STR(MENU_GS_BUTTON, L"GS Button");
DEF_STR(MENU_RESUME, L"R&esume");
DEF_STR(MENU_RESET_SOFT, L"&Soft Reset");
DEF_STR(MENU_RESET_HARD, L"&Hard Reset");
//Options Menu
DEF_STR(MENU_OPTIONS, L"&Options" );
DEF_STR(MENU_FULL_SCREEN, L"&Full Screen" );
DEF_STR(MENU_ON_TOP, L"&Always on &Top" );
DEF_STR(MENU_CONFG_GFX, L"Configure Graphics Plugin..." );
DEF_STR(MENU_CONFG_AUDIO, L"Configure Audio Plugin..." );
DEF_STR(MENU_CONFG_CTRL, L"Configure Controller Plugin..." );
DEF_STR(MENU_CONFG_RSP, L"Configure RSP Plugin..." );
DEF_STR(MENU_SHOW_CPU, L"Show CPU Usage" );
DEF_STR(MENU_SETTINGS, L"&Settings..." );
DEF_STR(MENU_OPTIONS, L"&Options");
DEF_STR(MENU_FULL_SCREEN, L"&Full Screen");
DEF_STR(MENU_ON_TOP, L"&Always on &Top");
DEF_STR(MENU_CONFG_GFX, L"Configure Graphics Plugin...");
DEF_STR(MENU_CONFG_AUDIO, L"Configure Audio Plugin...");
DEF_STR(MENU_CONFG_CTRL, L"Configure Controller Plugin...");
DEF_STR(MENU_CONFG_RSP, L"Configure RSP Plugin...");
DEF_STR(MENU_SHOW_CPU, L"Show CPU Usage");
DEF_STR(MENU_SETTINGS, L"&Settings...");
//Debugger Menu
DEF_STR(MENU_DEBUGGER, L"&Debugger" );
DEF_STR(MENU_DEBUGGER, L"&Debugger");
//Language Menu
DEF_STR(MENU_LANGUAGE, L"&Language" );
DEF_STR(MENU_LANGUAGE, L"&Language");
//Help Menu
DEF_STR(MENU_HELP, L"&Help" );
DEF_STR(MENU_ABOUT_INI, L"About Conf&ig Files" );
DEF_STR(MENU_ABOUT_PJ64, L"&About Project64" );
DEF_STR(MENU_FORUM, L"Support &Forum" );
DEF_STR(MENU_HOMEPAGE, L"&Homepage" );
DEF_STR(MENU_HELP, L"&Help");
DEF_STR(MENU_ABOUT_INI, L"About Conf&ig Files");
DEF_STR(MENU_ABOUT_PJ64, L"&About Project64");
DEF_STR(MENU_FORUM, L"Support &Forum");
DEF_STR(MENU_HOMEPAGE, L"&Homepage");
//Current Save Slot menu
DEF_STR(MENU_SLOT_DEFAULT,L"Default" );
DEF_STR(MENU_SLOT_1, L"Slot 1" );
DEF_STR(MENU_SLOT_2, L"Slot 2" );
DEF_STR(MENU_SLOT_3, L"Slot 3" );
DEF_STR(MENU_SLOT_4, L"Slot 4" );
DEF_STR(MENU_SLOT_5, L"Slot 5" );
DEF_STR(MENU_SLOT_6, L"Slot 6" );
DEF_STR(MENU_SLOT_7, L"Slot 7" );
DEF_STR(MENU_SLOT_8, L"Slot 8" );
DEF_STR(MENU_SLOT_9, L"Slot 9" );
DEF_STR(MENU_SLOT_10, L"Slot 10" );
DEF_STR(MENU_SLOT_DEFAULT, L"Default");
DEF_STR(MENU_SLOT_1, L"Slot 1");
DEF_STR(MENU_SLOT_2, L"Slot 2");
DEF_STR(MENU_SLOT_3, L"Slot 3");
DEF_STR(MENU_SLOT_4, L"Slot 4");
DEF_STR(MENU_SLOT_5, L"Slot 5");
DEF_STR(MENU_SLOT_6, L"Slot 6");
DEF_STR(MENU_SLOT_7, L"Slot 7");
DEF_STR(MENU_SLOT_8, L"Slot 8");
DEF_STR(MENU_SLOT_9, L"Slot 9");
DEF_STR(MENU_SLOT_10, L"Slot 10");
DEF_STR(MENU_SLOT_SAVE, L"Save slot (%ws) selected");
//Pop up Menu
DEF_STR(POPUP_PLAY, L"Play Game" );
DEF_STR(POPUP_INFO, L"ROM Information" );
DEF_STR(POPUP_SETTINGS, L"Edit Game Settings" );
DEF_STR(POPUP_CHEATS, L"Edit Cheats" );
DEF_STR(POPUP_GFX_PLUGIN,L"Graphics Plugin" );
DEF_STR(POPUP_PLAY, L"Play Game");
DEF_STR(POPUP_INFO, L"ROM Information");
DEF_STR(POPUP_SETTINGS, L"Edit Game Settings");
DEF_STR(POPUP_CHEATS, L"Edit Cheats");
DEF_STR(POPUP_GFX_PLUGIN, L"Graphics Plugin");
//Alternate Name to save Slot
DEF_STR(SAVE_SLOT_DEFAULT,L"Save Slot - Default" );
DEF_STR(SAVE_SLOT_1, L"Save Slot - 1" );
DEF_STR(SAVE_SLOT_2, L"Save Slot - 2" );
DEF_STR(SAVE_SLOT_3, L"Save Slot - 3" );
DEF_STR(SAVE_SLOT_4, L"Save Slot - 4" );
DEF_STR(SAVE_SLOT_5, L"Save Slot - 5" );
DEF_STR(SAVE_SLOT_6, L"Save Slot - 6" );
DEF_STR(SAVE_SLOT_7, L"Save Slot - 7" );
DEF_STR(SAVE_SLOT_8, L"Save Slot - 8" );
DEF_STR(SAVE_SLOT_9, L"Save Slot - 9" );
DEF_STR(SAVE_SLOT_10, L"Save Slot - 10" );
DEF_STR(SAVE_SLOT_DEFAULT, L"Save Slot - Default");
DEF_STR(SAVE_SLOT_1, L"Save Slot - 1");
DEF_STR(SAVE_SLOT_2, L"Save Slot - 2");
DEF_STR(SAVE_SLOT_3, L"Save Slot - 3");
DEF_STR(SAVE_SLOT_4, L"Save Slot - 4");
DEF_STR(SAVE_SLOT_5, L"Save Slot - 5");
DEF_STR(SAVE_SLOT_6, L"Save Slot - 6");
DEF_STR(SAVE_SLOT_7, L"Save Slot - 7");
DEF_STR(SAVE_SLOT_8, L"Save Slot - 8");
DEF_STR(SAVE_SLOT_9, L"Save Slot - 9");
DEF_STR(SAVE_SLOT_10, L"Save Slot - 10");
/*********************************************************************************
* ROM Browser *
*********************************************************************************/
//ROM Browser Fields
DEF_STR(RB_FILENAME, L"File Name" );
DEF_STR(RB_INTERNALNAME, L"Internal Name" );
DEF_STR(RB_GOODNAME, L"Good Name" );
DEF_STR(RB_STATUS, L"Status" );
DEF_STR(RB_ROMSIZE, L"ROM Size" );
DEF_STR(RB_NOTES_CORE, L"Notes (core)" );
DEF_STR(RB_NOTES_PLUGIN, L"Notes (default plugins)" );
DEF_STR(RB_NOTES_USER, L"Notes (user)" );
DEF_STR(RB_CART_ID, L"Cartridge ID" );
DEF_STR(RB_MANUFACTUER, L"Manufacturer" );
DEF_STR(RB_COUNTRY, L"Country" );
DEF_STR(RB_DEVELOPER, L"Developer" );
DEF_STR(RB_CRC1, L"CRC1" );
DEF_STR(RB_CRC2, L"CRC2" );
DEF_STR(RB_CICCHIP, L"CIC Chip" );
DEF_STR(RB_RELEASE_DATE, L"Release Date" );
DEF_STR(RB_GENRE, L"Genre" );
DEF_STR(RB_PLAYERS, L"Players" );
DEF_STR(RB_FORCE_FEEDBACK,L"Force Feedback" );
DEF_STR(RB_FILE_FORMAT, L"File Format" );
DEF_STR(RB_FILENAME, L"File Name");
DEF_STR(RB_INTERNALNAME, L"Internal Name");
DEF_STR(RB_GOODNAME, L"Good Name");
DEF_STR(RB_STATUS, L"Status");
DEF_STR(RB_ROMSIZE, L"ROM Size");
DEF_STR(RB_NOTES_CORE, L"Notes (core)");
DEF_STR(RB_NOTES_PLUGIN, L"Notes (default plugins)");
DEF_STR(RB_NOTES_USER, L"Notes (user)");
DEF_STR(RB_CART_ID, L"Cartridge ID");
DEF_STR(RB_MANUFACTUER, L"Manufacturer");
DEF_STR(RB_COUNTRY, L"Country");
DEF_STR(RB_DEVELOPER, L"Developer");
DEF_STR(RB_CRC1, L"CRC1");
DEF_STR(RB_CRC2, L"CRC2");
DEF_STR(RB_CICCHIP, L"CIC Chip");
DEF_STR(RB_RELEASE_DATE, L"Release Date");
DEF_STR(RB_GENRE, L"Genre");
DEF_STR(RB_PLAYERS, L"Players");
DEF_STR(RB_FORCE_FEEDBACK, L"Force Feedback");
DEF_STR(RB_FILE_FORMAT, L"File Format");
//Select ROM
DEF_STR(SELECT_ROM_DIR, L"Select current ROM directory" );
DEF_STR(SELECT_ROM_DIR, L"Select current ROM directory");
//Messages
DEF_STR(RB_NOT_GOOD_FILE,L"Bad ROM? Use GoodN64 & check for updated RDB." );
DEF_STR(RB_NOT_GOOD_FILE, L"Bad ROM? Use GoodN64 & check for updated RDB.");
/*********************************************************************************
* Options *
*********************************************************************************/
//Options Title
DEF_STR(OPTIONS_TITLE,L"Settings");
DEF_STR(OPTIONS_TITLE, L"Settings");
//Tabs
DEF_STR(TAB_PLUGIN, L"Plugins");
DEF_STR(TAB_DIRECTORY, L"Directories");
DEF_STR(TAB_OPTIONS, L"Options");
DEF_STR(TAB_ROMSELECTION,L"ROM Selection");
DEF_STR(TAB_ROMSELECTION, L"ROM Selection");
DEF_STR(TAB_ADVANCED, L"Advanced");
DEF_STR(TAB_ROMSETTINGS, L"General Settings");
DEF_STR(TAB_SHELLINTERGATION,L"Shell Integration");
DEF_STR(TAB_SHELLINTERGATION, L"Shell Integration");
DEF_STR(TAB_ROMNOTES, L"Notes");
DEF_STR(TAB_SHORTCUTS, L"Keyboard Shortcuts");
DEF_STR(TAB_ROMSTATUS, L"Status");
@ -202,7 +203,7 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(PLUG_AUDIO, L" Audio (sound) plugin: ");
DEF_STR(PLUG_CTRL, L" Input (controller) plugin: ");
DEF_STR(PLUG_HLE_GFX, L"Graphics HLE");
DEF_STR(PLUG_HLE_AUDIO,L"Audio HLE");
DEF_STR(PLUG_HLE_AUDIO, L"Audio HLE");
DEF_STR(PLUG_DEFAULT, L"** Use System Plugin **");
//Directory Dialog
@ -215,7 +216,7 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(DIR_SELECT_PLUGIN, L"Select plugin directory");
DEF_STR(DIR_SELECT_ROM, L"Select ROM directory");
DEF_STR(DIR_SELECT_AUTO, L"Select N64 native saves directory");
DEF_STR(DIR_SELECT_INSTANT,L"Select saved states directory");
DEF_STR(DIR_SELECT_INSTANT, L"Select saved states directory");
DEF_STR(DIR_SELECT_SCREEN, L"Select screenshot directory");
DEF_STR(DIR_TEXTURE, L" Texture pack directory: ");
DEF_STR(DIR_SELECT_TEXTURE, L"Select texture pack directory");
@ -258,7 +259,7 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(ADVANCE_DEBUGGER, L"Enable debugger");
DEF_STR(ADVANCE_SMM_CACHE, L"Cache");
DEF_STR(ADVANCE_SMM_PIDMA, L"PI DMA");
DEF_STR(ADVANCE_SMM_VALIDATE,L"Start changed");
DEF_STR(ADVANCE_SMM_VALIDATE, L"Start changed");
DEF_STR(ADVANCE_SMM_PROTECT, L"Protect memory");
DEF_STR(ADVANCE_SMM_TLB, L"TLB unmapping");
@ -315,7 +316,7 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(SAVE_FIRST_USED, L"Use first-used save type");
DEF_STR(SAVE_4K_EEPROM, L"4-kbit EEPROM");
DEF_STR(SAVE_16K_EEPROM, L"16-kbit EEPROM");
DEF_STR(SAVE_SRAM, L"32-kbyte SRAM");
DEF_STR(SAVE_SRAM, L"SRAM");
DEF_STR(SAVE_FLASHRAM, L"Flash RAM");
//Shell Integration Tab
@ -409,13 +410,13 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(CHEAT_NOTES, L"&Notes:");
DEF_STR(CHEAT_ADDCHEAT_ADD, L"Add Cheat");
DEF_STR(CHEAT_ADDCHEAT_NEW, L"New Cheat");
DEF_STR(CHEAT_ADDCHEAT_CODEDES,L"<address> <value>");
DEF_STR(CHEAT_ADDCHEAT_CODEDES, L"<address> <value>");
DEF_STR(CHEAT_ADDCHEAT_OPT, L"Options:");
DEF_STR(CHEAT_ADDCHEAT_OPTDES, L"<value> <label>");
//Edit Cheat
DEF_STR(CHEAT_EDITCHEAT_WINDOW,L"Edit Cheat");
DEF_STR(CHEAT_EDITCHEAT_UPDATE,L"Update Cheat");
DEF_STR(CHEAT_EDITCHEAT_WINDOW, L"Edit Cheat");
DEF_STR(CHEAT_EDITCHEAT_UPDATE, L"Update Cheat");
DEF_STR(CHEAT_CHANGED_MSG, L"Cheat has been changed.\n\nDo you want to update?");
DEF_STR(CHEAT_CHANGED_TITLE, L"Cheat updated");
@ -455,7 +456,7 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(MSG_FAIL_IMAGE, L"File loaded does not appear to be a valid N64 ROM.\n\nVerify your ROMs with GoodN64.");
DEF_STR(MSG_UNKNOWN_COUNTRY, L"Unknown country");
DEF_STR(MSG_UNKNOWN_CIC_CHIP, L"Unknown CIC chip");
DEF_STR(MSG_UNKNOWN_FILE_FORMAT,L"Unknown file format");
DEF_STR(MSG_UNKNOWN_FILE_FORMAT, L"Unknown file format");
DEF_STR(MSG_UNKNOWN_MEM_ACTION, L"Unknown memory action\n\nEmulation stopped");
DEF_STR(MSG_UNHANDLED_OP, L"Unhandled R4300i opcode at");
DEF_STR(MSG_NONMAPPED_SPACE, L"Executing from non-mapped space.\n\nVerify ROM and its settings.");
@ -464,7 +465,7 @@ void CLanguage::LoadDefaultStrings (void)
DEF_STR(MSG_PIF2_ERROR, L"Copyright sequence not found in LUT. Game will no longer function.");
DEF_STR(MSG_PIF2_TITLE, L"Copy Protection Failure");
DEF_STR(MSG_PLUGIN_CHANGE, L"Changing a plugin requires Project64 to reset a running ROM.\nIf you don't want to lose your place, answer No and save the current state first.\n\nChange plugins and reset ROM now?");
DEF_STR(MSG_PLUGIN_CHANGE_TITLE,L"Change Plugins");
DEF_STR(MSG_PLUGIN_CHANGE_TITLE, L"Change Plugins");
DEF_STR(MSG_EMULATION_ENDED, L"Emulation ended");
DEF_STR(MSG_EMULATION_STARTED, L"Emulation started");
DEF_STR(MSG_UNABLED_LOAD_STATE, L"Unable to load state");
@ -496,8 +497,8 @@ void CLanguage::LoadDefaultStrings (void)
}
CLanguage::CLanguage() :
m_emptyString(L""),
m_LanguageLoaded(false)
m_emptyString(L""),
m_LanguageLoaded(false)
{
LoadDefaultStrings();
if (g_Settings)
@ -506,7 +507,7 @@ CLanguage::CLanguage() :
}
}
bool CLanguage::LoadCurrentStrings ( void )
bool CLanguage::LoadCurrentStrings(void)
{
LanguageList LangList = GetLangList();
stdstr Filename;
@ -538,7 +539,7 @@ bool CLanguage::LoadCurrentStrings ( void )
//Search for utf8 file marker
uint8_t utf_bom[3];
if (fread(&utf_bom, sizeof(utf_bom),1,file) != 1 ||
if (fread(&utf_bom, sizeof(utf_bom), 1, file) != 1 ||
utf_bom[0] != 0xEF ||
utf_bom[1] != 0xBB ||
utf_bom[2] != 0xBF)
@ -557,14 +558,14 @@ bool CLanguage::LoadCurrentStrings ( void )
return true;
}
LanguageList & CLanguage::GetLangList (void)
LanguageList & CLanguage::GetLangList(void)
{
if (m_LanguageList.size() > 0)
{
return m_LanguageList;
}
CPath LanguageFiles(g_Settings->LoadStringVal(Setting_LanguageDir),"*.pj.Lang");
CPath LanguageFiles(g_Settings->LoadStringVal(Setting_LanguageDir), "*.pj.Lang");
if (LanguageFiles.FindFirst())
{
do
@ -572,7 +573,7 @@ LanguageList & CLanguage::GetLangList (void)
LanguageFile File; //We temporally store the values in here to added to the list
File.Filename = (std::string &)LanguageFiles;
File.LanguageName = GetLangString(LanguageFiles,LANGUAGE_NAME);
File.LanguageName = GetLangString(LanguageFiles, LANGUAGE_NAME);
if (File.LanguageName.length() == 0)
{
@ -586,7 +587,7 @@ LanguageList & CLanguage::GetLangList (void)
return m_LanguageList;
}
const std::wstring & CLanguage::GetString (LanguageStringID StringID)
const std::wstring & CLanguage::GetString(LanguageStringID StringID)
{
LANG_STRINGS::iterator CurrentString = m_CurrentStrings.find(StringID);
if (CurrentString != m_CurrentStrings.end())
@ -600,12 +601,12 @@ const std::wstring & CLanguage::GetString (LanguageStringID StringID)
return DefString->second;
}
#ifdef _DEBUG
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
#endif
return m_emptyString;
}
std::wstring CLanguage::GetLangString ( const char * FileName, LanguageStringID ID )
std::wstring CLanguage::GetLangString(const char * FileName, LanguageStringID ID)
{
FILE *file = fopen(FileName, "rb");
if (file == NULL)
@ -615,7 +616,7 @@ std::wstring CLanguage::GetLangString ( const char * FileName, LanguageStringID
//Search for utf8 file marker
uint8_t utf_bom[3];
if (fread(&utf_bom, sizeof(utf_bom),1,file) != 1 ||
if (fread(&utf_bom, sizeof(utf_bom), 1, file) != 1 ||
utf_bom[0] != 0xEF ||
utf_bom[1] != 0xBB ||
utf_bom[2] != 0xBF)
@ -638,10 +639,10 @@ std::wstring CLanguage::GetLangString ( const char * FileName, LanguageStringID
return L"";
}
LANG_STR CLanguage::GetNextLangString (void * OpenFile)
LANG_STR CLanguage::GetNextLangString(void * OpenFile)
{
enum { MAX_STRING_LEN = 400 };
int StringID;
int32_t StringID;
char szString[MAX_STRING_LEN]; //temp store the string from the file
FILE * file = (FILE *)OpenFile;
@ -649,46 +650,46 @@ LANG_STR CLanguage::GetNextLangString (void * OpenFile)
//while(token!='#' && !feof(file)) { fread(&token, 1, 1, file); }
if (feof(file))
{
return LANG_STR(0,L"");
return LANG_STR(0, L"");
}
//Search for token #
char token=0;
while (token!='#' && !feof(file))
char token = 0;
while (token != '#' && !feof(file))
{
fread(&token, 1, 1, file);
}
if (feof(file))
{
return LANG_STR(0,L"");
return LANG_STR(0, L"");
}
//get StringID after token
fscanf(file, "%d", &StringID);
//Search for token #
while(token!='#' && !feof(file))
while (token != '#' && !feof(file))
{
fread(&token, 1, 1, file);
}
if (feof(file))
{
StringID = EMPTY_STRING; return LANG_STR(0,L"");
StringID = EMPTY_STRING; return LANG_STR(0, L"");
}
//Search for start of string '"'
while (token!='"' && !feof(file))
while (token != '"' && !feof(file))
{
fread(&token, 1, 1, file);
}
if (feof(file))
{
StringID = EMPTY_STRING; return LANG_STR(0,L"");
StringID = EMPTY_STRING; return LANG_STR(0, L"");
}
int pos = 0;
int32_t pos = 0;
fread(&token, 1, 1, file);
while (token!='"' && !feof(file))
while (token != '"' && !feof(file))
{
szString[pos++] = token;
fread(&token, 1, 1, file);
@ -699,22 +700,22 @@ LANG_STR CLanguage::GetNextLangString (void * OpenFile)
}
szString[pos++] = 0;
stdstr text(szString);
text.Replace("\\n","\n");
return LANG_STR(StringID,text.ToUTF16());
text.Replace("\\n", "\n");
return LANG_STR(StringID, text.ToUTF16());
}
void CLanguage::SetLanguage ( const wchar_t * LanguageName )
void CLanguage::SetLanguage(const wchar_t * LanguageName)
{
m_SelectedLanguage = LanguageName;
if (LoadCurrentStrings())
{
stdstr Language;
Language.FromUTF16(LanguageName);
g_Settings->SaveString(Setting_CurrentLanguage,Language);
g_Settings->SaveString(Setting_CurrentLanguage, Language);
}
}
bool CLanguage::IsCurrentLang( LanguageFile & File )
bool CLanguage::IsCurrentLang(LanguageFile & File)
{
if (m_SelectedLanguage == File.LanguageName)
{

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -14,8 +14,9 @@
#include <string> //stl string
#include <map> //stl map
#include <list> //stl list
#include <common/stdtypes.h>
typedef std::map<int, std::wstring, std::less<int> > LANG_STRINGS;
typedef std::map<int32_t, std::wstring, std::less<int32_t> > LANG_STRINGS;
typedef LANG_STRINGS::value_type LANG_STR;
struct LanguageFile
@ -29,14 +30,14 @@ typedef std::list<LanguageFile> LanguageList;
class CLanguage
{
public:
CLanguage ();
CLanguage();
const std::wstring & GetString ( LanguageStringID StringID );
LanguageList & GetLangList ( void );
void SetLanguage ( const wchar_t * LanguageName );
bool LoadCurrentStrings ( void );
bool IsCurrentLang ( LanguageFile & File );
bool IsLanguageLoaded ( void ) const { return m_LanguageLoaded; }
const std::wstring & GetString(LanguageStringID StringID);
LanguageList & GetLangList(void);
void SetLanguage(const wchar_t * LanguageName);
bool LoadCurrentStrings(void);
bool IsCurrentLang(LanguageFile & File);
bool IsLanguageLoaded(void) const { return m_LanguageLoaded; }
private:
CLanguage(const CLanguage&); // Disable copy constructor
@ -48,16 +49,16 @@ private:
LANG_STRINGS m_CurrentStrings, m_DefaultStrings;
LanguageList m_LanguageList;
std::wstring GetLangString ( const char * FileName, LanguageStringID ID );
LANG_STR GetNextLangString ( void * OpenFile );
void LoadDefaultStrings ( void );
std::wstring GetLangString(const char * FileName, LanguageStringID ID);
LANG_STR GetNextLangString(void * OpenFile);
void LoadDefaultStrings(void);
bool m_LanguageLoaded;
};
extern CLanguage * g_Lang;
inline const wchar_t * GS (LanguageStringID StringID)
inline const wchar_t * GS(LanguageStringID StringID)
{
return g_Lang->GetString(StringID).c_str();
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -15,199 +15,48 @@ CLanguageSelector::CLanguageSelector()
{
}
void CLanguageSelector::Select ( void )
void CLanguageSelector::Select(void)
{
DialogBoxParam(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_Lang_Select),NULL,(DLGPROC)LangSelectProc, (LPARAM)this);
DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_Lang_Select), NULL, (DLGPROC)LangSelectProc, (LPARAM)this);
}
static WNDPROC pfnWndLangSelectOkProc = NULL;
static HBITMAP hOkButton = NULL;
DWORD CALLBACK LangSelectOkProc (HWND hWnd, DWORD uMsg, DWORD wParam, DWORD lParam)
{
static bool m_fPressed = false;
static HBITMAP hOkButtonDown = NULL;
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
if (BeginPaint(hWnd,&ps))
{
if (m_fPressed)
{
if (hOkButtonDown == NULL)
{
hOkButtonDown = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK_DOWN));
}
if (hOkButtonDown)
{
RECT rcClient;
GetClientRect(hWnd, &rcClient);
BITMAP bmTL1;
GetObject(hOkButtonDown, sizeof(BITMAP), &bmTL1);
HDC memdc = CreateCompatibleDC(ps.hdc);
HGDIOBJ save = SelectObject(memdc, hOkButtonDown);
BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
SelectObject(memdc, save);
DeleteDC(memdc);
}
}
else
{
if (hOkButton)
{
RECT rcClient;
GetClientRect(hWnd, &rcClient);
BITMAP bmTL1;
GetObject(hOkButton, sizeof(BITMAP), &bmTL1);
HDC memdc = CreateCompatibleDC(ps.hdc);
HGDIOBJ save = SelectObject(memdc, hOkButton);
BitBlt(ps.hdc, 0, 0, bmTL1.bmWidth, bmTL1.bmHeight, memdc, 0, 0, SRCCOPY);
SelectObject(memdc, save);
DeleteDC(memdc);
}
}
EndPaint(hWnd,&ps);
}
}
break;
case WM_MOUSEMOVE:
if (::GetCapture() == hWnd)
{
POINT ptCursor = { ((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)) };
ClientToScreen(hWnd, &ptCursor);
RECT rect;
GetWindowRect(hWnd, &rect);
bool uPressed = ::PtInRect(&rect, ptCursor)==TRUE;
if ( m_fPressed != uPressed )
{
m_fPressed = uPressed;
::InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
}
break;
case WM_LBUTTONDOWN:
{
LRESULT lRet = 0;
lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
SetCapture(hWnd);
if ( ::GetCapture()==hWnd )
{
m_fPressed = true;
if (m_fPressed)
{
::InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
}
}
return lRet;
}
break;
case WM_LBUTTONUP:
{
LRESULT lRet = 0;
lRet = DefWindowProc(hWnd, uMsg, wParam, lParam);
if ( ::GetCapture() == hWnd )
{
::ReleaseCapture();
if ( m_fPressed )
{
::SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(hWnd), BN_CLICKED), (LPARAM)hWnd);
}
}
m_fPressed = false;
return lRet;
}
break;
}
return CallWindowProc(pfnWndLangSelectOkProc, hWnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
LRESULT CALLBACK CLanguageSelector::LangSelectProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hbmpBackgroundTop = NULL;
static HBITMAP hbmpBackgroundBottom = NULL;
static HBITMAP hbmpBackgroundMiddle = NULL;
static HFONT hTextFont = NULL;
static CLanguageSelector * lngClass;
switch (uMsg)
{
case WM_INITDIALOG:
SetWindowPos(hDlg,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE);
{
lngClass = (CLanguageSelector *)lParam;
LanguageList LangList = g_Lang->GetLangList();
if (LangList.size() == 0)
{
EndDialog(hDlg,0);
EndDialog(hDlg, 0);
}
for (LanguageList::iterator Language = LangList.begin(); Language != LangList.end(); Language++)
{
int index = SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_ADDSTRING,0,(WPARAM)Language->LanguageName.c_str());
if (_wcsicmp(Language->LanguageName.c_str(),L"English") == 0)
int index = SendMessageW(GetDlgItem(hDlg, IDC_LANG_SEL), CB_ADDSTRING, 0, (WPARAM)Language->LanguageName.c_str());
if (_wcsicmp(Language->LanguageName.c_str(), L"English") == 0)
{
SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,index,0);
SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_SETCURSEL, index, 0);
}
}
int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
int Index = SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETCURSEL, 0, 0);
if (Index < 0)
{
SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,0,0);
SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_SETCURSEL, 0, 0);
}
enum { ROUND_EDGE = 15 };
DWORD dwStyle = GetWindowLong(hDlg, GWL_STYLE);
dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);
SetWindowLong(hDlg, GWL_STYLE, dwStyle);
// Use the size of the image
hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_TOP));
hbmpBackgroundBottom = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_BOTTOM));
hbmpBackgroundMiddle = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_ABOUT_MIDDLE));
hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_ABOUT_LOGO));
BITMAP bmTL;
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL);
if (hbmpBackgroundTop)
{
// int iHeight = bmTL.bmHeight;
int iWidth = bmTL.bmWidth;
RECT rect;
GetWindowRect(hDlg, &rect);
rect.left -= rect.left;
rect.bottom -= rect.top;
rect.top -= rect.top;
// Tweaked
HRGN hWindowRegion= CreateRoundRectRgn
(
rect.left,
rect.top,
rect.left+iWidth+GetSystemMetrics(SM_CXEDGE)-1,
rect.bottom+GetSystemMetrics(SM_CYEDGE)-1,
ROUND_EDGE,
ROUND_EDGE
);
if (hWindowRegion)
{
SetWindowRgn(hDlg, hWindowRegion, TRUE);
DeleteObject(hWindowRegion);
}
}
hTextFont = ::CreateFont
(
18,
@ -222,39 +71,10 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
DEFAULT_PITCH | FF_DONTCARE,
"Arial"
);
SendDlgItemMessage(hDlg,IDC_SELECT_LANG,WM_SETFONT,(WPARAM)hTextFont,TRUE);
}
hOkButton = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK));
pfnWndLangSelectOkProc = (WNDPROC)::GetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC);
::SetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC,(LONG_PTR)LangSelectOkProc);
break;
case WM_NCHITTEST:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
RECT client, a;
GetClientRect(hDlg,&a);
GetClientRect(hDlg,&client);
ClientToScreen(hDlg,(LPPOINT)&client);
client.right += client.left;
client.bottom += client.top;
int nCaption = GetSystemMetrics(SM_CYCAPTION)*4;
LRESULT lResult = HTCLIENT;
//check caption
if (xPos <= client.right && xPos >= client.left &&
(yPos >= client.top+ 0)&& (yPos <= client.top + 0+nCaption))
{
lResult = HTCAPTION;
}
SetWindowLong(hDlg, DWLP_MSGRESULT, lResult);
return TRUE;
SendDlgItemMessage(hDlg, IDC_SELECT_LANG, WM_SETFONT, (WPARAM)hTextFont, TRUE);
}
break;
case WM_CTLCOLORSTATIC:
@ -265,19 +85,33 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
}
break;
case WM_ERASEBKGND:
{
HPEN outline;
HBRUSH fill;
RECT rect;
outline = CreatePen(PS_SOLID, 1, 0x00FFFFFF);
fill = CreateSolidBrush(0x00FFFFFF);
SelectObject((HDC)wParam, outline);
SelectObject((HDC)wParam, fill);
GetClientRect(hDlg, &rect);
Rectangle((HDC)wParam, rect.left, rect.top, rect.right, rect.bottom);
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
if (BeginPaint(hDlg,&ps))
if (BeginPaint(hDlg, &ps))
{
RECT rcClient;
GetClientRect(hDlg, &rcClient);
BITMAP bmTL_top, bmTL_bottom, bmTL_Middle;
BITMAP bmTL_top;
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
GetObject(hbmpBackgroundBottom, sizeof(BITMAP), &bmTL_bottom);
GetObject(hbmpBackgroundMiddle, sizeof(BITMAP), &bmTL_Middle);
HDC memdc = CreateCompatibleDC(ps.hdc);
HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
@ -285,26 +119,7 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
SelectObject(memdc, save);
DeleteDC(memdc);
memdc = CreateCompatibleDC(ps.hdc);
save = SelectObject(memdc, hbmpBackgroundMiddle);
for (int x = bmTL_top.bmHeight; x < rcClient.bottom; x += bmTL_Middle.bmHeight)
{
//BitBlt(ps.hdc, 0, bmTL_top.bmHeight, bmTL_Middle.bmWidth, rcClient.bottom - (bmTL_bottom.bmHeight + bmTL_top.bmHeight), memdc, 0, 0, SRCCOPY);
BitBlt(ps.hdc, 0, x, bmTL_Middle.bmWidth, bmTL_Middle.bmHeight, memdc, 0, 0, SRCCOPY);
}
SelectObject(memdc, save);
DeleteDC(memdc);
BITMAP ;
memdc = CreateCompatibleDC(ps.hdc);
save = SelectObject(memdc, hbmpBackgroundBottom);
BitBlt(ps.hdc, 0, rcClient.bottom - bmTL_bottom.bmHeight, bmTL_bottom.bmWidth, bmTL_bottom.bmHeight, memdc, 0, 0, SRCCOPY);
SelectObject(memdc, save);
DeleteDC(memdc);
BITMAP ;
EndPaint(hDlg,&ps);
EndPaint(hDlg, &ps);
}
}
break;
@ -316,14 +131,6 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
{
DeleteObject(hbmpBackgroundTop);
}
if (hbmpBackgroundBottom)
{
DeleteObject(hbmpBackgroundBottom);
}
if (hbmpBackgroundMiddle)
{
DeleteObject(hbmpBackgroundMiddle);
}
if (hTextFont)
{
@ -331,17 +138,17 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
}
{
int Index = SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETCURSEL,0,0);
int Index = SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETCURSEL, 0, 0);
if (Index >= 0)
{
wchar_t String[255];
SendMessageW(GetDlgItem(hDlg,IDC_LANG_SEL),CB_GETLBTEXT,Index,(LPARAM)String);
SendMessageW(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETLBTEXT, Index, (LPARAM)String);
g_Lang->SetLanguage(String);
}
}
EndDialog(hDlg,0);
EndDialog(hDlg, 0);
break;
}
default:

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -13,13 +13,13 @@
class CLanguageSelector
{
public:
CLanguageSelector ();
CLanguageSelector();
void Select ( void );
void Select(void);
private:
CLanguageSelector(const CLanguageSelector&); // Disable copy constructor
CLanguageSelector& operator=(const CLanguageSelector&); // Disable assignment
static LRESULT CALLBACK LangSelectProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK LangSelectProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -16,7 +16,6 @@
#include <math.h>
#include "User Interface.h"
#include "N64 System/Types.h"
class CNotification;
#include "N64 System/Profiling Class.h"
@ -45,7 +44,6 @@ class CNotification;
//C Core - to be upgrdaded and removed
#include "N64 System/C Core/r4300i Commands.h"
#include "N64 System/C Core/Logging.h"
//Interpter
#include "N64 System/Interpreter/Interpreter Ops.h"
@ -65,7 +63,6 @@ class CNotification;
#include "N64 System/Recompiler/Section Info.h"
#include "N64 System/Recompiler/Function Info.h"
#include "N64 System/Recompiler/Function Map Class.h"
#include "N64 System/Recompiler/Delay Slot Map Class.h"
#include "N64 System/Recompiler/Recompiler Class.h"
#include "N64 System/Recompiler/x86CodeLog.h"
@ -78,4 +75,3 @@ class CNotification;
//Main Files
#include "N64 System/N64 Class.h"
#include "N64 System/System Globals.h"

View File

@ -1,920 +0,0 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
#include "stdafx.h"
#include <prsht.h>
void LoadLogSetting (HKEY hKey,char * String, BOOL * Value);
void SaveLogOptions (void);
LRESULT CALLBACK LogGeneralProc ( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK LogPifProc ( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK LogRegProc ( HWND, UINT, WPARAM, LPARAM );
LOG_OPTIONS LogOptions,TempOptions;
HANDLE hLogFile = NULL;
void EnterLogOptions(HWND hwndOwner)
{
PROPSHEETPAGE psp[3];
PROPSHEETHEADER psh;
psp[0].dwSize = sizeof(PROPSHEETPAGE);
psp[0].dwFlags = PSP_USETITLE;
psp[0].hInstance = GetModuleHandle(NULL);
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_Logging_Registers);
psp[0].pfnDlgProc = (DLGPROC)LogRegProc;
psp[0].pszTitle = "Registers";
psp[0].lParam = 0;
psp[0].pfnCallback = NULL;
psp[1].dwSize = sizeof(PROPSHEETPAGE);
psp[1].dwFlags = PSP_USETITLE;
psp[1].hInstance = GetModuleHandle(NULL);
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_Logging_PifRam);
psp[1].pfnDlgProc = (DLGPROC)LogPifProc;
psp[1].pszTitle = "Pif Ram";
psp[1].lParam = 0;
psp[1].pfnCallback = NULL;
psp[2].dwSize = sizeof(PROPSHEETPAGE);
psp[2].dwFlags = PSP_USETITLE;
psp[2].hInstance = GetModuleHandle(NULL);
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_Logging_General);
psp[2].pfnDlgProc = (DLGPROC)LogGeneralProc;
psp[2].pszTitle = "General";
psp[2].lParam = 0;
psp[2].pfnCallback = NULL;
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
psh.hwndParent = hwndOwner;
psh.hInstance = GetModuleHandle(NULL);
psh.pszCaption = (LPSTR) "Log Options";
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
psh.pfnCallback = NULL;
LoadLogOptions(&TempOptions,TRUE);
#if defined(WINDOWS_UI)
PropertySheet(&psh);
#else
g_Notify -> BreakPoint(__FILEW__, __LINE__);
#endif
SaveLogOptions();
LoadLogOptions(&LogOptions, FALSE);
return;
}
void LoadLogOptions (LOG_OPTIONS * LogOptions, BOOL AlwaysFill)
{
long lResult;
HKEY hKeyResults = 0;
char String[200];
sprintf(String,"Software\\N64 Emulation\\%s\\Logging",g_Settings->LoadStringVal(Setting_ApplicationName).c_str());
lResult = RegOpenKeyEx( HKEY_CURRENT_USER,String,0,KEY_ALL_ACCESS,
&hKeyResults);
if (lResult == ERROR_SUCCESS)
{
//LoadLogSetting(hKeyResults,"Generate Log File",&LogOptions->GenerateLog);
if (LogOptions->GenerateLog || AlwaysFill)
{
LoadLogSetting(hKeyResults,"Log RDRAM",&LogOptions->LogRDRamRegisters);
LoadLogSetting(hKeyResults,"Log SP",&LogOptions->LogSPRegisters);
LoadLogSetting(hKeyResults,"Log DP Command",&LogOptions->LogDPCRegisters);
LoadLogSetting(hKeyResults,"Log DP Span",&LogOptions->LogDPSRegisters);
LoadLogSetting(hKeyResults,"Log MIPS Interface (MI)",&LogOptions->LogMIPSInterface);
LoadLogSetting(hKeyResults,"Log Video Interface (VI)",&LogOptions->LogVideoInterface);
LoadLogSetting(hKeyResults,"Log Audio Interface (AI)",&LogOptions->LogAudioInterface);
LoadLogSetting(hKeyResults,"Log Peripheral Interface (PI)",&LogOptions->LogPerInterface);
LoadLogSetting(hKeyResults,"Log RDRAM Interface (RI)",&LogOptions->LogRDRAMInterface);
LoadLogSetting(hKeyResults,"Log Serial Interface (SI)",&LogOptions->LogSerialInterface);
LoadLogSetting(hKeyResults,"Log PifRam DMA Operations",&LogOptions->LogPRDMAOperations);
LoadLogSetting(hKeyResults,"Log PifRam Direct Memory Loads",&LogOptions->LogPRDirectMemLoads);
LoadLogSetting(hKeyResults,"Log PifRam DMA Memory Loads",&LogOptions->LogPRDMAMemLoads);
LoadLogSetting(hKeyResults,"Log PifRam Direct Memory Stores",&LogOptions->LogPRDirectMemStores);
LoadLogSetting(hKeyResults,"Log PifRam DMA Memory Stores",&LogOptions->LogPRDMAMemStores);
LoadLogSetting(hKeyResults,"Log Controller Pak",&LogOptions->LogControllerPak);
LoadLogSetting(hKeyResults,"Log CP0 changes",&LogOptions->LogCP0changes);
LoadLogSetting(hKeyResults,"Log CP0 reads",&LogOptions->LogCP0reads);
LoadLogSetting(hKeyResults,"Log Exceptions",&LogOptions->LogExceptions);
LoadLogSetting(hKeyResults,"No Interrupts",&LogOptions->NoInterrupts);
LoadLogSetting(hKeyResults,"Log TLB",&LogOptions->LogTLB);
LoadLogSetting(hKeyResults,"Log Cache Operations",&LogOptions->LogCache);
LoadLogSetting(hKeyResults,"Log Rom Header",&LogOptions->LogRomHeader);
LoadLogSetting(hKeyResults,"Log Unknown access",&LogOptions->LogUnknown);
return;
}
}
LogOptions->GenerateLog = FALSE;
LogOptions->LogRDRamRegisters = FALSE;
LogOptions->LogSPRegisters = FALSE;
LogOptions->LogDPCRegisters = FALSE;
LogOptions->LogDPSRegisters = FALSE;
LogOptions->LogMIPSInterface = FALSE;
LogOptions->LogVideoInterface = FALSE;
LogOptions->LogAudioInterface = FALSE;
LogOptions->LogPerInterface = FALSE;
LogOptions->LogRDRAMInterface = FALSE;
LogOptions->LogSerialInterface = FALSE;
LogOptions->LogPRDMAOperations = FALSE;
LogOptions->LogPRDirectMemLoads = FALSE;
LogOptions->LogPRDMAMemLoads = FALSE;
LogOptions->LogPRDirectMemStores = FALSE;
LogOptions->LogPRDMAMemStores = FALSE;
LogOptions->LogControllerPak = FALSE;
LogOptions->LogCP0changes = FALSE;
LogOptions->LogCP0reads = FALSE;
LogOptions->LogCache = FALSE;
LogOptions->LogExceptions = FALSE;
LogOptions->NoInterrupts = FALSE;
LogOptions->LogTLB = FALSE;
LogOptions->LogRomHeader = FALSE;
LogOptions->LogUnknown = FALSE;
}
void LoadLogSetting (HKEY hKey,char * String, BOOL * Value)
{
DWORD Type, dwResult, Bytes = 4;
long lResult;
lResult = RegQueryValueEx(hKey,String,0,&Type,(LPBYTE)(&dwResult),&Bytes);
if (Type == REG_DWORD && lResult == ERROR_SUCCESS)
{
*Value = (BOOL)dwResult;
}
else
{
*Value = FALSE;
}
}
LRESULT CALLBACK LogGeneralProc (HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
if (TempOptions.LogCP0changes) { CheckDlgButton(hDlg,IDC_CP0_WRITE,BST_CHECKED); }
if (TempOptions.LogCP0reads) { CheckDlgButton(hDlg,IDC_CP0_READ,BST_CHECKED); }
if (TempOptions.LogCache) { CheckDlgButton(hDlg,IDC_CACHE,BST_CHECKED); }
if (TempOptions.LogExceptions) { CheckDlgButton(hDlg,IDC_EXCEPTIONS,BST_CHECKED); }
if (TempOptions.NoInterrupts) { CheckDlgButton(hDlg,IDC_INTERRUPTS,BST_CHECKED); }
if (TempOptions.LogTLB) { CheckDlgButton(hDlg,IDC_TLB,BST_CHECKED); }
if (TempOptions.LogRomHeader) { CheckDlgButton(hDlg,IDC_ROM_HEADER,BST_CHECKED); }
if (TempOptions.LogUnknown) { CheckDlgButton(hDlg,IDC_UNKOWN,BST_CHECKED); }
break;
case WM_NOTIFY:
if (((NMHDR FAR *) lParam)->code != PSN_APPLY) { break; }
TempOptions.LogCP0changes = IsDlgButtonChecked(hDlg,IDC_CP0_WRITE) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogCP0reads = IsDlgButtonChecked(hDlg,IDC_CP0_READ) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogCache = IsDlgButtonChecked(hDlg,IDC_CACHE) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogExceptions = IsDlgButtonChecked(hDlg,IDC_EXCEPTIONS) == BST_CHECKED?TRUE:FALSE;
TempOptions.NoInterrupts = IsDlgButtonChecked(hDlg,IDC_INTERRUPTS) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogTLB = IsDlgButtonChecked(hDlg,IDC_TLB) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogRomHeader = IsDlgButtonChecked(hDlg,IDC_ROM_HEADER) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogUnknown = IsDlgButtonChecked(hDlg,IDC_UNKOWN) == BST_CHECKED?TRUE:FALSE;
break;
default:
return FALSE;
}
return TRUE;
}
void Log_LW (DWORD PC, DWORD VAddr)
{
if (!LogOptions.GenerateLog)
{
return;
}
if ( VAddr < 0xA0000000 || VAddr >= 0xC0000000 )
{
DWORD PAddr;
if (!g_TransVaddr->TranslateVaddr(VAddr,PAddr))
{
if (LogOptions.LogUnknown)
{
LogMessage("%08X: read from unknown ??? (%08X)",PC,VAddr);
}
return;
}
VAddr = PAddr + 0xA0000000;
}
DWORD Value;
if ( VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
{
return;
}
if ( VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
{
if (!LogOptions.LogRDRamRegisters)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA3F00000: LogMessage("%08X: read from RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG (%08X)",PC, Value); return;
case 0xA3F00004: LogMessage("%08X: read from RDRAM_DEVICE_ID_REG (%08X)",PC, Value); return;
case 0xA3F00008: LogMessage("%08X: read from RDRAM_DELAY_REG (%08X)",PC, Value); return;
case 0xA3F0000C: LogMessage("%08X: read from RDRAM_MODE_REG (%08X)",PC, Value); return;
case 0xA3F00010: LogMessage("%08X: read from RDRAM_REF_INTERVAL_REG (%08X)",PC, Value); return;
case 0xA3F00014: LogMessage("%08X: read from RDRAM_REF_ROW_REG (%08X)",PC, Value); return;
case 0xA3F00018: LogMessage("%08X: read from RDRAM_RAS_INTERVAL_REG (%08X)",PC, Value); return;
case 0xA3F0001C: LogMessage("%08X: read from RDRAM_MIN_INTERVAL_REG (%08X)",PC, Value); return;
case 0xA3F00020: LogMessage("%08X: read from RDRAM_ADDR_SELECT_REG (%08X)",PC, Value); return;
case 0xA3F00024: LogMessage("%08X: read from RDRAM_DEVICE_MANUF_REG (%08X)",PC, Value); return;
}
}
if ( VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC )
{
return;
}
if ( VAddr >= 0xA4040000 && VAddr <= 0xA404001C )
{
if (!LogOptions.LogSPRegisters)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4040000: LogMessage("%08X: read from SP_MEM_ADDR_REG (%08X)",PC, Value); break;
case 0xA4040004: LogMessage("%08X: read from SP_DRAM_ADDR_REG (%08X)",PC, Value); break;
case 0xA4040008: LogMessage("%08X: read from SP_RD_LEN_REG (%08X)",PC, Value); break;
case 0xA404000C: LogMessage("%08X: read from SP_WR_LEN_REG (%08X)",PC, Value); break;
case 0xA4040010: LogMessage("%08X: read from SP_STATUS_REG (%08X)",PC, Value); break;
case 0xA4040014: LogMessage("%08X: read from SP_DMA_FULL_REG (%08X)",PC, Value); break;
case 0xA4040018: LogMessage("%08X: read from SP_DMA_BUSY_REG (%08X)",PC, Value); break;
case 0xA404001C: LogMessage("%08X: read from SP_SEMAPHORE_REG (%08X)",PC, Value); break;
}
return;
}
if ( VAddr == 0xA4080000)
{
if (!LogOptions.LogSPRegisters)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
LogMessage("%08X: read from SP_PC (%08X)",PC, Value);
return;
}
if (VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
{
if (!LogOptions.LogDPCRegisters)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4100000: LogMessage("%08X: read from DPC_START_REG (%08X)",PC, Value); return;
case 0xA4100004: LogMessage("%08X: read from DPC_END_REG (%08X)",PC, Value); return;
case 0xA4100008: LogMessage("%08X: read from DPC_CURRENT_REG (%08X)",PC, Value); return;
case 0xA410000C: LogMessage("%08X: read from DPC_STATUS_REG (%08X)",PC, Value); return;
case 0xA4100010: LogMessage("%08X: read from DPC_CLOCK_REG (%08X)",PC, Value); return;
case 0xA4100014: LogMessage("%08X: read from DPC_BUFBUSY_REG (%08X)",PC, Value); return;
case 0xA4100018: LogMessage("%08X: read from DPC_PIPEBUSY_REG (%08X)",PC, Value); return;
case 0xA410001C: LogMessage("%08X: read from DPC_TMEM_REG (%08X)",PC, Value); return;
}
}
if (VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
{
if (!LogOptions.LogMIPSInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4300000: LogMessage("%08X: read from MI_INIT_MODE_REG/MI_MODE_REG (%08X)",PC, Value); return;
case 0xA4300004: LogMessage("%08X: read from MI_VERSION_REG/MI_NOOP_REG (%08X)",PC, Value); return;
case 0xA4300008: LogMessage("%08X: read from MI_INTR_REG (%08X)",PC, Value); return;
case 0xA430000C: LogMessage("%08X: read from MI_INTR_MASK_REG (%08X)",PC, Value); return;
}
}
if (VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
{
if (!LogOptions.LogVideoInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4400000: LogMessage("%08X: read from VI_STATUS_REG/VI_CONTROL_REG (%08X)",PC, Value); return;
case 0xA4400004: LogMessage("%08X: read from VI_ORIGIN_REG/VI_DRAM_ADDR_REG (%08X)",PC, Value); return;
case 0xA4400008: LogMessage("%08X: read from VI_WIDTH_REG/VI_H_WIDTH_REG (%08X)",PC, Value); return;
case 0xA440000C: LogMessage("%08X: read from VI_INTR_REG/VI_V_INTR_REG (%08X)",PC, Value); return;
case 0xA4400010: LogMessage("%08X: read from VI_CURRENT_REG/VI_V_CURRENT_LINE_REG (%08X)",PC, Value); return;
case 0xA4400014: LogMessage("%08X: read from VI_BURST_REG/VI_TIMING_REG (%08X)",PC, Value); return;
case 0xA4400018: LogMessage("%08X: read from VI_V_SYNC_REG (%08X)",PC, Value); return;
case 0xA440001C: LogMessage("%08X: read from VI_H_SYNC_REG (%08X)",PC, Value); return;
case 0xA4400020: LogMessage("%08X: read from VI_LEAP_REG/VI_H_SYNC_LEAP_REG (%08X)",PC, Value); return;
case 0xA4400024: LogMessage("%08X: read from VI_H_START_REG/VI_H_VIDEO_REG (%08X)",PC, Value); return;
case 0xA4400028: LogMessage("%08X: read from VI_V_START_REG/VI_V_VIDEO_REG (%08X)",PC, Value); return;
case 0xA440002C: LogMessage("%08X: read from VI_V_BURST_REG (%08X)",PC, Value); return;
case 0xA4400030: LogMessage("%08X: read from VI_X_SCALE_REG (%08X)",PC, Value); return;
case 0xA4400034: LogMessage("%08X: read from VI_Y_SCALE_REG (%08X)",PC, Value); return;
}
}
if (VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
{
if (!LogOptions.LogAudioInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4500000: LogMessage("%08X: read from AI_DRAM_ADDR_REG (%08X)",PC, Value); return;
case 0xA4500004: LogMessage("%08X: read from AI_LEN_REG (%08X)",PC, Value); return;
case 0xA4500008: LogMessage("%08X: read from AI_CONTROL_REG (%08X)",PC, Value); return;
case 0xA450000C: LogMessage("%08X: read from AI_STATUS_REG (%08X)",PC, Value); return;
case 0xA4500010: LogMessage("%08X: read from AI_DACRATE_REG (%08X)",PC, Value); return;
case 0xA4500014: LogMessage("%08X: read from AI_BITRATE_REG (%08X)",PC, Value); return;
}
}
if (VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
{
if (!LogOptions.LogPerInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4600000: LogMessage("%08X: read from PI_DRAM_ADDR_REG (%08X)",PC, Value); return;
case 0xA4600004: LogMessage("%08X: read from PI_CART_ADDR_REG (%08X)",PC, Value); return;
case 0xA4600008: LogMessage("%08X: read from PI_RD_LEN_REG (%08X)",PC, Value); return;
case 0xA460000C: LogMessage("%08X: read from PI_WR_LEN_REG (%08X)",PC, Value); return;
case 0xA4600010: LogMessage("%08X: read from PI_STATUS_REG (%08X)",PC, Value); return;
case 0xA4600014: LogMessage("%08X: read from PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG (%08X)",PC, Value); return;
case 0xA4600018: LogMessage("%08X: read from PI_BSD_DOM1_PWD_REG (%08X)",PC, Value); return;
case 0xA460001C: LogMessage("%08X: read from PI_BSD_DOM1_PGS_REG (%08X)",PC, Value); return;
case 0xA4600020: LogMessage("%08X: read from PI_BSD_DOM1_RLS_REG (%08X)",PC, Value); return;
case 0xA4600024: LogMessage("%08X: read from PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG (%08X)",PC, Value); return;
case 0xA4600028: LogMessage("%08X: read from PI_BSD_DOM2_PWD_REG (%08X)",PC, Value); return;
case 0xA460002C: LogMessage("%08X: read from PI_BSD_DOM2_PGS_REG (%08X)",PC, Value); return;
case 0xA4600030: LogMessage("%08X: read from PI_BSD_DOM2_RLS_REG (%08X)",PC, Value); return;
}
}
if (VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
{
if (!LogOptions.LogRDRAMInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xA4700000: LogMessage("%08X: read from RI_MODE_REG (%08X)",PC, Value); return;
case 0xA4700004: LogMessage("%08X: read from RI_CONFIG_REG (%08X)",PC, Value); return;
case 0xA4700008: LogMessage("%08X: read from RI_CURRENT_LOAD_REG (%08X)",PC, Value); return;
case 0xA470000C: LogMessage("%08X: read from RI_SELECT_REG (%08X)",PC, Value); return;
case 0xA4700010: LogMessage("%08X: read from RI_REFRESH_REG/RI_COUNT_REG (%08X)",PC, Value); return;
case 0xA4700014: LogMessage("%08X: read from RI_LATENCY_REG (%08X)",PC, Value); return;
case 0xA4700018: LogMessage("%08X: read from RI_RERROR_REG (%08X)",PC, Value); return;
case 0xA470001C: LogMessage("%08X: read from RI_WERROR_REG (%08X)",PC, Value); return;
}
}
if ( VAddr == 0xA4800000)
{
if (!LogOptions.LogSerialInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
LogMessage("%08X: read from SI_DRAM_ADDR_REG (%08X)",PC, Value);
return;
}
if ( VAddr == 0xA4800004)
{
if (!LogOptions.LogSerialInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
LogMessage("%08X: read from SI_PIF_ADDR_RD64B_REG (%08X)",PC, Value);
return;
}
if ( VAddr == 0xA4800010)
{
if (!LogOptions.LogSerialInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
LogMessage("%08X: read from SI_PIF_ADDR_WR64B_REG (%08X)",PC, Value);
return;
}
if ( VAddr == 0xA4800018)
{
if (!LogOptions.LogSerialInterface)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
LogMessage("%08X: read from SI_STATUS_REG (%08X)",PC, Value);
return;
}
if ( VAddr >= 0xBFC00000 && VAddr <= 0xBFC007C0 )
{
return;
}
if ( VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC )
{
if (!LogOptions.LogPRDirectMemLoads)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
LogMessage("%08X: read word from Pif Ram at 0x%X (%08X)",PC,VAddr - 0xBFC007C0, Value);
return;
}
if ( VAddr >= 0xB0000040 && ((VAddr - 0xB0000000) < g_Rom->GetRomSize()))
{
return;
}
if ( VAddr >= 0xB0000000 && VAddr < 0xB0000040)
{
if (!LogOptions.LogRomHeader)
{
return;
}
g_MMU->LW_VAddr(VAddr,Value);
switch (VAddr)
{
case 0xB0000004: LogMessage("%08X: read from Rom Clock Rate (%08X)",PC, Value); break;
case 0xB0000008: LogMessage("%08X: read from Rom Boot address offset (%08X)",PC, Value); break;
case 0xB000000C: LogMessage("%08X: read from Rom Release offset (%08X)",PC, Value); break;
case 0xB0000010: LogMessage("%08X: read from Rom CRC1 (%08X)",PC, Value); break;
case 0xB0000014: LogMessage("%08X: read from Rom CRC2 (%08X)",PC, Value); break;
default: LogMessage("%08X: read from Rom header 0x%X (%08X)",PC, VAddr & 0xFF,Value); break;
}
return;
}
if (!LogOptions.LogUnknown)
{
return;
}
LogMessage("%08X: read from unknown ??? (%08X)",PC,VAddr);
}
void __cdecl LogMessage (char * Message, ...)
{
DWORD dwWritten;
char Msg[400];
va_list ap;
if (!g_Settings->LoadBool(Debugger_Enabled))
{
return;
}
if (hLogFile == NULL)
{
return;
}
va_start( ap, Message );
vsprintf( Msg, Message, ap );
va_end( ap );
strcat(Msg,"\r\n");
WriteFile( hLogFile,Msg,strlen(Msg),&dwWritten,NULL );
}
void Log_SW (DWORD PC, DWORD VAddr, DWORD Value)
{
if (!LogOptions.GenerateLog)
{
return;
}
if ( VAddr < 0xA0000000 || VAddr >= 0xC0000000 )
{
DWORD PAddr;
if (!g_TransVaddr->TranslateVaddr(VAddr,PAddr))
{
if (LogOptions.LogUnknown)
{
LogMessage("%08X: Writing 0x%08X to %08X",PC, Value, VAddr );
}
return;
}
VAddr = PAddr + 0xA0000000;
}
if ( VAddr >= 0xA0000000 && VAddr < (0xA0000000 + g_MMU->RdramSize()))
{
return;
}
if ( VAddr >= 0xA3F00000 && VAddr <= 0xA3F00024)
{
if (!LogOptions.LogRDRamRegisters)
{
return;
}
switch (VAddr)
{
case 0xA3F00000: LogMessage("%08X: Writing 0x%08X to RDRAM_CONFIG_REG/RDRAM_DEVICE_TYPE_REG",PC, Value ); return;
case 0xA3F00004: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_ID_REG",PC, Value ); return;
case 0xA3F00008: LogMessage("%08X: Writing 0x%08X to RDRAM_DELAY_REG",PC, Value ); return;
case 0xA3F0000C: LogMessage("%08X: Writing 0x%08X to RDRAM_MODE_REG",PC, Value ); return;
case 0xA3F00010: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_INTERVAL_REG",PC, Value ); return;
case 0xA3F00014: LogMessage("%08X: Writing 0x%08X to RDRAM_REF_ROW_REG",PC, Value ); return;
case 0xA3F00018: LogMessage("%08X: Writing 0x%08X to RDRAM_RAS_INTERVAL_REG",PC, Value ); return;
case 0xA3F0001C: LogMessage("%08X: Writing 0x%08X to RDRAM_MIN_INTERVAL_REG",PC, Value ); return;
case 0xA3F00020: LogMessage("%08X: Writing 0x%08X to RDRAM_ADDR_SELECT_REG",PC, Value ); return;
case 0xA3F00024: LogMessage("%08X: Writing 0x%08X to RDRAM_DEVICE_MANUF_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4000000 && VAddr <= 0xA4001FFC )
{
return;
}
if ( VAddr >= 0xA4040000 && VAddr <= 0xA404001C)
{
if (!LogOptions.LogSPRegisters)
{
return;
}
switch (VAddr)
{
case 0xA4040000: LogMessage("%08X: Writing 0x%08X to SP_MEM_ADDR_REG",PC, Value ); return;
case 0xA4040004: LogMessage("%08X: Writing 0x%08X to SP_DRAM_ADDR_REG",PC, Value ); return;
case 0xA4040008: LogMessage("%08X: Writing 0x%08X to SP_RD_LEN_REG",PC, Value ); return;
case 0xA404000C: LogMessage("%08X: Writing 0x%08X to SP_WR_LEN_REG",PC, Value ); return;
case 0xA4040010: LogMessage("%08X: Writing 0x%08X to SP_STATUS_REG",PC, Value ); return;
case 0xA4040014: LogMessage("%08X: Writing 0x%08X to SP_DMA_FULL_REG",PC, Value ); return;
case 0xA4040018: LogMessage("%08X: Writing 0x%08X to SP_DMA_BUSY_REG",PC, Value ); return;
case 0xA404001C: LogMessage("%08X: Writing 0x%08X to SP_SEMAPHORE_REG",PC, Value ); return;
}
}
if ( VAddr == 0xA4080000)
{
if (!LogOptions.LogSPRegisters)
{
return;
}
LogMessage("%08X: Writing 0x%08X to SP_PC",PC, Value ); return;
}
if ( VAddr >= 0xA4100000 && VAddr <= 0xA410001C)
{
if (!LogOptions.LogDPCRegisters)
{
return;
}
switch (VAddr)
{
case 0xA4100000: LogMessage("%08X: Writing 0x%08X to DPC_START_REG",PC, Value ); return;
case 0xA4100004: LogMessage("%08X: Writing 0x%08X to DPC_END_REG",PC, Value ); return;
case 0xA4100008: LogMessage("%08X: Writing 0x%08X to DPC_CURRENT_REG",PC, Value ); return;
case 0xA410000C: LogMessage("%08X: Writing 0x%08X to DPC_STATUS_REG",PC, Value ); return;
case 0xA4100010: LogMessage("%08X: Writing 0x%08X to DPC_CLOCK_REG",PC, Value ); return;
case 0xA4100014: LogMessage("%08X: Writing 0x%08X to DPC_BUFBUSY_REG",PC, Value ); return;
case 0xA4100018: LogMessage("%08X: Writing 0x%08X to DPC_PIPEBUSY_REG",PC, Value ); return;
case 0xA410001C: LogMessage("%08X: Writing 0x%08X to DPC_TMEM_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4200000 && VAddr <= 0xA420000C)
{
if (!LogOptions.LogDPSRegisters)
{
return;
}
switch (VAddr)
{
case 0xA4200000: LogMessage("%08X: Writing 0x%08X to DPS_TBIST_REG",PC, Value ); return;
case 0xA4200004: LogMessage("%08X: Writing 0x%08X to DPS_TEST_MODE_REG",PC, Value ); return;
case 0xA4200008: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_ADDR_REG",PC, Value ); return;
case 0xA420000C: LogMessage("%08X: Writing 0x%08X to DPS_BUFTEST_DATA_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4300000 && VAddr <= 0xA430000C)
{
if (!LogOptions.LogMIPSInterface)
{
return;
}
switch (VAddr)
{
case 0xA4300000: LogMessage("%08X: Writing 0x%08X to MI_INIT_MODE_REG/MI_MODE_REG",PC, Value ); return;
case 0xA4300004: LogMessage("%08X: Writing 0x%08X to MI_VERSION_REG/MI_NOOP_REG",PC, Value ); return;
case 0xA4300008: LogMessage("%08X: Writing 0x%08X to MI_INTR_REG",PC, Value ); return;
case 0xA430000C: LogMessage("%08X: Writing 0x%08X to MI_INTR_MASK_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4400000 && VAddr <= 0xA4400034)
{
if (!LogOptions.LogVideoInterface)
{
return;
}
switch (VAddr)
{
case 0xA4400000: LogMessage("%08X: Writing 0x%08X to VI_STATUS_REG/VI_CONTROL_REG",PC, Value ); return;
case 0xA4400004: LogMessage("%08X: Writing 0x%08X to VI_ORIGIN_REG/VI_DRAM_ADDR_REG",PC, Value ); return;
case 0xA4400008: LogMessage("%08X: Writing 0x%08X to VI_WIDTH_REG/VI_H_WIDTH_REG",PC, Value ); return;
case 0xA440000C: LogMessage("%08X: Writing 0x%08X to VI_INTR_REG/VI_V_INTR_REG",PC, Value ); return;
case 0xA4400010: LogMessage("%08X: Writing 0x%08X to VI_CURRENT_REG/VI_V_CURRENT_LINE_REG",PC, Value ); return;
case 0xA4400014: LogMessage("%08X: Writing 0x%08X to VI_BURST_REG/VI_TIMING_REG",PC, Value ); return;
case 0xA4400018: LogMessage("%08X: Writing 0x%08X to VI_V_SYNC_REG",PC, Value ); return;
case 0xA440001C: LogMessage("%08X: Writing 0x%08X to VI_H_SYNC_REG",PC, Value ); return;
case 0xA4400020: LogMessage("%08X: Writing 0x%08X to VI_LEAP_REG/VI_H_SYNC_LEAP_REG",PC, Value ); return;
case 0xA4400024: LogMessage("%08X: Writing 0x%08X to VI_H_START_REG/VI_H_VIDEO_REG",PC, Value ); return;
case 0xA4400028: LogMessage("%08X: Writing 0x%08X to VI_V_START_REG/VI_V_VIDEO_REG",PC, Value ); return;
case 0xA440002C: LogMessage("%08X: Writing 0x%08X to VI_V_BURST_REG",PC, Value ); return;
case 0xA4400030: LogMessage("%08X: Writing 0x%08X to VI_X_SCALE_REG",PC, Value ); return;
case 0xA4400034: LogMessage("%08X: Writing 0x%08X to VI_Y_SCALE_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4500000 && VAddr <= 0xA4500014)
{
if (!LogOptions.LogAudioInterface)
{
return;
}
switch (VAddr)
{
case 0xA4500000: LogMessage("%08X: Writing 0x%08X to AI_DRAM_ADDR_REG",PC, Value ); return;
case 0xA4500004: LogMessage("%08X: Writing 0x%08X to AI_LEN_REG",PC, Value ); return;
case 0xA4500008: LogMessage("%08X: Writing 0x%08X to AI_CONTROL_REG",PC, Value ); return;
case 0xA450000C: LogMessage("%08X: Writing 0x%08X to AI_STATUS_REG",PC, Value ); return;
case 0xA4500010: LogMessage("%08X: Writing 0x%08X to AI_DACRATE_REG",PC, Value ); return;
case 0xA4500014: LogMessage("%08X: Writing 0x%08X to AI_BITRATE_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4600000 && VAddr <= 0xA4600030)
{
if (!LogOptions.LogPerInterface)
{
return;
}
switch (VAddr)
{
case 0xA4600000: LogMessage("%08X: Writing 0x%08X to PI_DRAM_ADDR_REG",PC, Value ); return;
case 0xA4600004: LogMessage("%08X: Writing 0x%08X to PI_CART_ADDR_REG",PC, Value ); return;
case 0xA4600008: LogMessage("%08X: Writing 0x%08X to PI_RD_LEN_REG",PC, Value ); return;
case 0xA460000C: LogMessage("%08X: Writing 0x%08X to PI_WR_LEN_REG",PC, Value ); return;
case 0xA4600010: LogMessage("%08X: Writing 0x%08X to PI_STATUS_REG",PC, Value ); return;
case 0xA4600014: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_LAT_REG/PI_DOMAIN1_REG",PC, Value ); return;
case 0xA4600018: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PWD_REG",PC, Value ); return;
case 0xA460001C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_PGS_REG",PC, Value ); return;
case 0xA4600020: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM1_RLS_REG",PC, Value ); return;
case 0xA4600024: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_LAT_REG/PI_DOMAIN2_REG",PC, Value ); return;
case 0xA4600028: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PWD_REG",PC, Value ); return;
case 0xA460002C: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_PGS_REG",PC, Value ); return;
case 0xA4600030: LogMessage("%08X: Writing 0x%08X to PI_BSD_DOM2_RLS_REG",PC, Value ); return;
}
}
if ( VAddr >= 0xA4700000 && VAddr <= 0xA470001C)
{
if (!LogOptions.LogRDRAMInterface)
{
return;
}
switch (VAddr)
{
case 0xA4700000: LogMessage("%08X: Writing 0x%08X to RI_MODE_REG",PC, Value ); return;
case 0xA4700004: LogMessage("%08X: Writing 0x%08X to RI_CONFIG_REG",PC, Value ); return;
case 0xA4700008: LogMessage("%08X: Writing 0x%08X to RI_CURRENT_LOAD_REG",PC, Value ); return;
case 0xA470000C: LogMessage("%08X: Writing 0x%08X to RI_SELECT_REG",PC, Value ); return;
case 0xA4700010: LogMessage("%08X: Writing 0x%08X to RI_REFRESH_REG/RI_COUNT_REG",PC, Value ); return;
case 0xA4700014: LogMessage("%08X: Writing 0x%08X to RI_LATENCY_REG",PC, Value ); return;
case 0xA4700018: LogMessage("%08X: Writing 0x%08X to RI_RERROR_REG",PC, Value ); return;
case 0xA470001C: LogMessage("%08X: Writing 0x%08X to RI_WERROR_REG",PC, Value ); return;
}
}
if ( VAddr == 0xA4800000)
{
if (!LogOptions.LogSerialInterface)
{
return;
}
LogMessage("%08X: Writing 0x%08X to SI_DRAM_ADDR_REG",PC, Value ); return;
}
if ( VAddr == 0xA4800004)
{
if (LogOptions.LogPRDMAOperations)
{
LogMessage("%08X: A DMA transfer from the PIF ram has occured",PC );
}
if (!LogOptions.LogSerialInterface)
{
return;
}
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_RD64B_REG",PC, Value ); return;
}
if ( VAddr == 0xA4800010)
{
if (LogOptions.LogPRDMAOperations)
{
LogMessage("%08X: A DMA transfer to the PIF ram has occured",PC );
}
if (!LogOptions.LogSerialInterface)
{
return;
}
LogMessage("%08X: Writing 0x%08X to SI_PIF_ADDR_WR64B_REG",PC, Value ); return;
}
if ( VAddr == 0xA4800018)
{
if (!LogOptions.LogSerialInterface)
{
return;
}
LogMessage("%08X: Writing 0x%08X to SI_STATUS_REG",PC, Value ); return;
}
if ( VAddr >= 0xBFC007C0 && VAddr <= 0xBFC007FC )
{
if (!LogOptions.LogPRDirectMemStores)
{
return;
}
LogMessage("%08X: Writing 0x%08X to Pif Ram at 0x%X",PC,Value, VAddr - 0xBFC007C0);
return;
}
if (!LogOptions.LogUnknown)
{
return;
}
LogMessage("%08X: Writing 0x%08X to %08X ????",PC, Value, VAddr );
}
LRESULT CALLBACK LogPifProc (HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
if (TempOptions.LogPRDMAOperations) { CheckDlgButton(hDlg,IDC_SI_DMA,BST_CHECKED); }
if (TempOptions.LogPRDirectMemLoads) { CheckDlgButton(hDlg,IDC_DIRECT_WRITE,BST_CHECKED); }
if (TempOptions.LogPRDMAMemLoads) { CheckDlgButton(hDlg,IDC_DMA_WRITE,BST_CHECKED); }
if (TempOptions.LogPRDirectMemStores) { CheckDlgButton(hDlg,IDC_DIRECT_READ,BST_CHECKED); }
if (TempOptions.LogPRDMAMemStores) { CheckDlgButton(hDlg,IDC_DMA_READ,BST_CHECKED); }
if (TempOptions.LogControllerPak) { CheckDlgButton(hDlg,IDC_CONT_PAK,BST_CHECKED); }
break;
case WM_NOTIFY:
if (((NMHDR FAR *) lParam)->code != PSN_APPLY)
{
break;
}
TempOptions.LogPRDMAOperations = IsDlgButtonChecked(hDlg,IDC_SI_DMA) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogPRDirectMemLoads = IsDlgButtonChecked(hDlg,IDC_DIRECT_WRITE) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogPRDMAMemLoads = IsDlgButtonChecked(hDlg,IDC_DMA_WRITE) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogPRDirectMemStores = IsDlgButtonChecked(hDlg,IDC_DIRECT_READ) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogPRDMAMemStores = IsDlgButtonChecked(hDlg,IDC_DMA_READ) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogControllerPak = IsDlgButtonChecked(hDlg,IDC_CONT_PAK) == BST_CHECKED?TRUE:FALSE;
break;
default:
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK LogRegProc (HWND hDlg, UINT uMsg, WPARAM /*wParam*/, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
if (TempOptions.LogRDRamRegisters) { CheckDlgButton(hDlg,IDC_RDRAM,BST_CHECKED); }
if (TempOptions.LogSPRegisters) { CheckDlgButton(hDlg,IDC_SP_REG,BST_CHECKED); }
if (TempOptions.LogDPCRegisters) { CheckDlgButton(hDlg,IDC_DPC_REG,BST_CHECKED); }
if (TempOptions.LogDPSRegisters) { CheckDlgButton(hDlg,IDC_DPS_REG,BST_CHECKED); }
if (TempOptions.LogMIPSInterface) { CheckDlgButton(hDlg,IDC_MI_REG,BST_CHECKED); }
if (TempOptions.LogVideoInterface) { CheckDlgButton(hDlg,IDC_VI_REG,BST_CHECKED); }
if (TempOptions.LogAudioInterface) { CheckDlgButton(hDlg,IDC_AI_REG,BST_CHECKED); }
if (TempOptions.LogPerInterface) { CheckDlgButton(hDlg,IDC_PI_REG,BST_CHECKED); }
if (TempOptions.LogRDRAMInterface) { CheckDlgButton(hDlg,IDC_RI_REG,BST_CHECKED); }
if (TempOptions.LogSerialInterface) { CheckDlgButton(hDlg,IDC_SI_REG,BST_CHECKED); }
break;
case WM_NOTIFY:
if (((NMHDR FAR *) lParam)->code != PSN_APPLY)
{
break;
}
TempOptions.LogRDRamRegisters = IsDlgButtonChecked(hDlg,IDC_RDRAM) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogSPRegisters = IsDlgButtonChecked(hDlg,IDC_SP_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogDPCRegisters = IsDlgButtonChecked(hDlg,IDC_DPC_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogDPSRegisters = IsDlgButtonChecked(hDlg,IDC_DPS_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogMIPSInterface = IsDlgButtonChecked(hDlg,IDC_MI_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogVideoInterface = IsDlgButtonChecked(hDlg,IDC_VI_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogAudioInterface = IsDlgButtonChecked(hDlg,IDC_AI_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogPerInterface = IsDlgButtonChecked(hDlg,IDC_PI_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogRDRAMInterface = IsDlgButtonChecked(hDlg,IDC_RI_REG) == BST_CHECKED?TRUE:FALSE;
TempOptions.LogSerialInterface = IsDlgButtonChecked(hDlg,IDC_SI_REG) == BST_CHECKED?TRUE:FALSE;
break;
default:
return FALSE;
}
return TRUE;
}
void SaveLogSetting (HKEY hKey,char * String, BOOL Value)
{
DWORD StoreValue = Value;
RegSetValueEx(hKey,String,0,REG_DWORD,(CONST BYTE *)&StoreValue,sizeof(DWORD));
}
void SaveLogOptions (void)
{
long lResult;
HKEY hKeyResults = 0;
DWORD Disposition = 0;
char String[200];
sprintf(String,"Software\\N64 Emulation\\%s\\Logging",g_Settings->LoadStringVal(Setting_ApplicationName).c_str());
lResult = RegCreateKeyEx( HKEY_CURRENT_USER,String,0,"", REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,NULL,&hKeyResults,&Disposition);
SaveLogSetting(hKeyResults,"Log RDRAM",TempOptions.LogRDRamRegisters);
SaveLogSetting(hKeyResults,"Log SP",TempOptions.LogSPRegisters);
SaveLogSetting(hKeyResults,"Log DP Command",TempOptions.LogDPCRegisters);
SaveLogSetting(hKeyResults,"Log DP Span",TempOptions.LogDPSRegisters);
SaveLogSetting(hKeyResults,"Log MIPS Interface (MI)",TempOptions.LogMIPSInterface);
SaveLogSetting(hKeyResults,"Log Video Interface (VI)",TempOptions.LogVideoInterface);
SaveLogSetting(hKeyResults,"Log Audio Interface (AI)",TempOptions.LogAudioInterface);
SaveLogSetting(hKeyResults,"Log Peripheral Interface (PI)",TempOptions.LogPerInterface);
SaveLogSetting(hKeyResults,"Log RDRAM Interface (RI)",TempOptions.LogRDRAMInterface);
SaveLogSetting(hKeyResults,"Log Serial Interface (SI)",TempOptions.LogSerialInterface);
SaveLogSetting(hKeyResults,"Log PifRam DMA Operations",TempOptions.LogPRDMAOperations);
SaveLogSetting(hKeyResults,"Log PifRam Direct Memory Loads",TempOptions.LogPRDirectMemLoads);
SaveLogSetting(hKeyResults,"Log PifRam DMA Memory Loads",TempOptions.LogPRDMAMemLoads);
SaveLogSetting(hKeyResults,"Log PifRam Direct Memory Stores",TempOptions.LogPRDirectMemStores);
SaveLogSetting(hKeyResults,"Log PifRam DMA Memory Stores",TempOptions.LogPRDMAMemStores);
SaveLogSetting(hKeyResults,"Log Controller Pak",TempOptions.LogControllerPak);
SaveLogSetting(hKeyResults,"Log CP0 changes",TempOptions.LogCP0changes);
SaveLogSetting(hKeyResults,"Log CP0 reads",TempOptions.LogCP0reads);
SaveLogSetting(hKeyResults,"Log Exceptions",TempOptions.LogExceptions);
SaveLogSetting(hKeyResults,"No Interrupts",TempOptions.NoInterrupts);
SaveLogSetting(hKeyResults,"Log TLB",TempOptions.LogTLB);
SaveLogSetting(hKeyResults,"Log Cache Operations",TempOptions.LogCache);
SaveLogSetting(hKeyResults,"Log Rom Header",TempOptions.LogRomHeader);
SaveLogSetting(hKeyResults,"Log Unknown access",TempOptions.LogUnknown);
RegCloseKey(hKeyResults);
}
void StartLog (void)
{
if (!LogOptions.GenerateLog)
{
StopLog();
return;
}
if (hLogFile)
{
return;
}
CPath LogFile(CPath::MODULE_DIRECTORY);
LogFile.AppendDirectory("Logs");
LogFile.SetNameExtension("cpudebug.log");
hLogFile = CreateFile(LogFile,GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
SetFilePointer(hLogFile,0,NULL,FILE_BEGIN);
}
void StopLog (void)
{
if (hLogFile)
{
CloseHandle(hLogFile);
}
hLogFile = NULL;
}

View File

@ -1,63 +0,0 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
BOOL GenerateLog;
/* Registers Log */
BOOL LogRDRamRegisters;
BOOL LogSPRegisters;
BOOL LogDPCRegisters;
BOOL LogDPSRegisters;
BOOL LogMIPSInterface;
BOOL LogVideoInterface;
BOOL LogAudioInterface;
BOOL LogPerInterface;
BOOL LogRDRAMInterface;
BOOL LogSerialInterface;
/* Pif Ram Log */
BOOL LogPRDMAOperations;
BOOL LogPRDirectMemLoads;
BOOL LogPRDMAMemLoads;
BOOL LogPRDirectMemStores;
BOOL LogPRDMAMemStores;
BOOL LogControllerPak;
/* Special Log */
BOOL LogCP0changes;
BOOL LogCP0reads;
BOOL LogTLB;
BOOL LogExceptions;
BOOL NoInterrupts;
BOOL LogCache;
BOOL LogRomHeader;
BOOL LogUnknown;
} LOG_OPTIONS;
extern LOG_OPTIONS LogOptions;
void EnterLogOptions ( HWND hwndOwner );
void LoadLogOptions ( LOG_OPTIONS * LogOptions, BOOL AlwaysFill );
void Log_LW ( DWORD PC, DWORD VAddr );
void __cdecl LogMessage ( char * Message, ... );
void Log_SW ( DWORD PC, DWORD VAddr, DWORD Value );
void StartLog ( void );
void StopLog ( void );
#ifdef __cplusplus
}
#endif

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -13,79 +13,36 @@
class CCheats
{
public:
CCheats ( const CN64Rom * Rom = NULL );
~CCheats ( void );
CCheats();
~CCheats(void);
bool IsCheatMessage ( MSG * msg );
void ApplyCheats ( CMipsMemory * MMU );
void ApplyGSButton ( CMipsMemory * MMU );
void LoadCheats ( bool DisableSelected, CPlugins * Plugins );
void SelectCheats ( HWND hParent, bool BlockExecution );
inline bool CheatsSlectionChanged ( void ) const { return m_CheatSelectionChanged; }
enum
{
MaxCheats = 50000,
MaxGSEntries = 100,
};
void ApplyCheats(CMipsMemory * MMU);
void ApplyGSButton(CMipsMemory * MMU);
void LoadCheats(bool DisableSelected, CPlugins * Plugins);
static bool IsValid16BitCode(const char * CheatString);
private:
struct GAMESHARK_CODE {
DWORD Command;
WORD Value;
struct GAMESHARK_CODE
{
uint32_t Command;
uint16_t Value;
};
typedef std::vector<GAMESHARK_CODE> CODES;
typedef std::vector<CODES> CODES_ARRAY;
enum { MaxCheats = 50000 };
void LoadPermCheats ( CPlugins * Plugins );
void LoadPermCheats(CPlugins * Plugins);
static int CALLBACK CheatAddProc ( HWND hDlg,DWORD uMsg,DWORD wParam, DWORD lParam );
static int CALLBACK CheatListProc ( HWND hDlg,DWORD uMsg,DWORD wParam, DWORD lParam );
static int CALLBACK ManageCheatsProc ( HWND hDlg,DWORD uMsg,DWORD wParam, DWORD lParam );
static int CALLBACK CheatsCodeExProc ( HWND hDlg, DWORD uMsg, DWORD wParam, DWORD lParam);
static int CALLBACK CheatsCodeQuantProc ( HWND hDlg, DWORD uMsg, DWORD wParam, DWORD lParam);
//information about the gui for selecting cheats
HWND m_Window, m_hSelectCheat, m_AddCheat, m_hCheatTree, m_hSelectedItem;
const CN64Rom * m_Rom;
void * const m_rcList, * const m_rcAdd;
int m_MinSizeDlg, m_MaxSizeDlg;
int m_EditCheat;
bool m_DeleteingEntries;
CODES_ARRAY m_Codes;
bool m_CheatSelectionChanged;
//Information about the current cheat we are editing
stdstr m_EditName;
stdstr m_EditCode;
stdstr m_EditOptions;
stdstr m_EditNotes;
enum Dialog_State { CONTRACTED, EXPANDED } m_DialogState;
enum TV_CHECK_STATE { TV_STATE_UNKNOWN, TV_STATE_CLEAR, TV_STATE_CHECKED, TV_STATE_INDETERMINATE };
enum { MaxGSEntries = 100, IDC_MYTREE = 0x500 };
bool LoadCode ( int CheatNo, LPCSTR CheatString );
void AddCodeLayers ( int CheatNumber, const stdstr &CheatName, HWND hParent, bool CheatActive );
//Reload the cheats from the ini file to the select gui
void RefreshCheatManager ();
void ChangeChildrenStatus ( HWND hParent, bool Checked );
void CheckParentStatus ( HWND hParent );
static stdstr ReadCodeString ( HWND hDlg, bool &validcodes, bool &validoption, bool &nooptions, int &codeformat );
static stdstr ReadOptionsString( HWND hDlg, bool &validcodes, bool &validoptions, bool &nooptions, int &codeformat );
int ApplyCheatEntry (CMipsMemory * MMU,const CODES & CodeEntry, int CurrentEntry, bool Execute );
void RecordCheatValues ( HWND hDlg );
bool CheatChanged ( HWND hDlg );
bool IsValid16BitCode ( LPCSTR CheatString ) const;
void DeleteCheat(int Index);
//Get Information about the Cheat
stdstr GetCheatName ( int CheatNo, bool AddExtension ) const;
static bool CheatUsesCodeExtensions ( const stdstr &LineEntry );
//Working with treeview
static bool TV_SetCheckState(HWND hwndTreeView, HWND hItem, TV_CHECK_STATE state);
static int TV_GetCheckState(HWND hwndTreeView, HWND hItem);
static DWORD AsciiToHex ( const char * HexValue );
static void MenuSetText ( HMENU hMenu, int MenuPos, const wchar_t * Title, const wchar_t * ShortCut );
//UI Functions
static stdstr GetDlgItemStr (HWND hDlg, int nIDDlgItem);
bool LoadCode(int32_t CheatNo, const char * CheatString);
int32_t ApplyCheatEntry(CMipsMemory * MMU, const CODES & CodeEntry, int32_t CurrentEntry, bool Execute);
};

View File

@ -1,32 +1,32 @@
template <class T>
class CDebugDialog :
public CDialogImpl<T>
public CDialogImpl < T >
{
protected:
CDebugger * m_Debugger;
CDebuggerUI * m_Debugger;
HANDLE m_CreatedEvent;
HANDLE m_DialogThread;
static DWORD CreateDebuggerWindow (CDebugDialog<T> * pThis)
static DWORD CreateDebuggerWindow(CDebugDialog<T> * pThis)
{
pThis->DoModal(NULL);
pThis->WindowCreated();
return 0;
}
void WindowCreated ( void )
void WindowCreated(void)
{
SetEvent(m_CreatedEvent);
}
public:
CDebugDialog (CDebugger * debugger) :
CDebugDialog(CDebuggerUI * debugger) :
m_Debugger(debugger),
m_CreatedEvent(CreateEvent(NULL,true,false,NULL)),
m_CreatedEvent(CreateEvent(NULL, true, false, NULL)),
m_DialogThread(NULL)
{
}
virtual ~CDebugDialog (void)
virtual ~CDebugDialog(void)
{
HideWindow();
CloseHandle(m_CreatedEvent);
@ -37,7 +37,7 @@ public:
}
}
void HideWindow ( void )
void HideWindow(void)
{
if (m_hWnd && ::IsWindow(m_hWnd))
{
@ -47,7 +47,7 @@ public:
{
if (WaitForSingleObject(m_DialogThread, 5000) == WAIT_TIMEOUT)
{
WriteTrace(TraceError,"CDebugDialog - time out on close");
WriteTrace(TraceError, "CDebugDialog - time out on close");
TerminateThread(m_DialogThread, 1);
}
@ -56,7 +56,7 @@ public:
}
}
void ShowWindow ( void )
void ShowWindow(void)
{
if (m_hWnd)
{
@ -66,10 +66,10 @@ public:
{
DWORD ThreadID;
ResetEvent(m_CreatedEvent);
m_DialogThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CreateDebuggerWindow,(LPVOID)this,0, &ThreadID);
if (WaitForSingleObject(m_CreatedEvent,20000) == WAIT_TIMEOUT)
m_DialogThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CreateDebuggerWindow, (LPVOID)this, 0, &ThreadID);
if (WaitForSingleObject(m_CreatedEvent, 20000) == WAIT_TIMEOUT)
{
WriteTrace(TraceError,"Failed to get window create notification");
WriteTrace(TraceError, "Failed to get window create notification");
}
}
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,10 +10,9 @@
****************************************************************************/
#include "stdafx.h"
#ifdef WINDOWS_UI
#include "Debugger UI.h"
CDumpMemory::CDumpMemory(CDebugger * debugger) :
CDumpMemory::CDumpMemory(CDebuggerUI * debugger) :
CDebugDialog<CDumpMemory>(debugger)
{
}
@ -32,13 +31,13 @@ LRESULT CDumpMemory::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lPa
m_EndAddress.SetDisplayType(CEditNumber::DisplayHex);
m_PC.SetDisplayType(CEditNumber::DisplayHex);
m_StartAddress.SetValue(0x80000000,true,true);
m_EndAddress.SetValue(0x803FFFF0,true,true);
m_StartAddress.SetValue(0x80000000, true, true);
m_EndAddress.SetValue(0x803FFFF0, true, true);
m_PC.SetValue(0x80000000);
HWND hFormatList = GetDlgItem(IDC_FORMAT);
int pos = ::SendMessage(hFormatList,CB_ADDSTRING,(WPARAM)0,(LPARAM)"TEXT - Disassembly + PC");
::SendMessage(hFormatList,CB_SETITEMDATA,(WPARAM)pos,(LPARAM)DisassemblyWithPC);
::SendMessage(hFormatList,CB_SETCURSEL,(WPARAM)0,(LPARAM)0);
int pos = ::SendMessage(hFormatList, CB_ADDSTRING, (WPARAM)0, (LPARAM)"TEXT - Disassembly + PC");
::SendMessage(hFormatList, CB_SETITEMDATA, (WPARAM)pos, (LPARAM)DisassemblyWithPC);
::SendMessage(hFormatList, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
WindowCreated();
return TRUE;
@ -46,20 +45,20 @@ LRESULT CDumpMemory::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lPa
LRESULT CDumpMemory::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
switch(wID)
switch (wID)
{
case IDCANCEL:
EndDialog(0);
break;
case IDC_BTN_CHOOSE_FILE:
{
char FileName[_MAX_PATH],Directory[_MAX_PATH];
char FileName[_MAX_PATH], Directory[_MAX_PATH];
OPENFILENAME openfilename;
memset(&FileName, 0, sizeof(FileName));
memset(&openfilename, 0, sizeof(openfilename));
strcpy(Directory,CPath(CPath::MODULE_DIRECTORY));
openfilename.lStructSize = sizeof( openfilename );
strcpy(Directory, CPath(CPath::MODULE_DIRECTORY));
openfilename.lStructSize = sizeof(openfilename);
openfilename.hwndOwner = m_hWnd;
openfilename.lpstrFilter = "Text file (*.txt)\0*.txt;\0All files (*.*)\0*.*\0";
openfilename.lpstrFile = FileName;
@ -67,15 +66,15 @@ LRESULT CDumpMemory::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/,
openfilename.nMaxFile = MAX_PATH;
openfilename.Flags = OFN_HIDEREADONLY;
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory);
if (GetOpenFileName (&openfilename))
if (GetOpenFileName(&openfilename))
{
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath( FileName, drive, dir, fname, ext );
_splitpath(FileName, drive, dir, fname, ext);
if (strlen(ext) == 0)
{
strcat(FileName,".txt");
strcat(FileName, ".txt");
}
SetDlgItemText(IDC_FILENAME,FileName);
SetDlgItemText(IDC_FILENAME, FileName);
}
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
}
@ -83,34 +82,34 @@ LRESULT CDumpMemory::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/,
case IDOK:
{
TCHAR FileName[MAX_PATH];
int CurrentFormatSel = SendDlgItemMessage(IDC_FORMAT,CB_GETCURSEL,0,0);
DumpFormat Format = (DumpFormat)SendDlgItemMessage(IDC_FORMAT,CB_GETITEMDATA,CurrentFormatSel,0);
DWORD StartPC =m_StartAddress.GetValue();
int CurrentFormatSel = SendDlgItemMessage(IDC_FORMAT, CB_GETCURSEL, 0, 0);
DumpFormat Format = (DumpFormat)SendDlgItemMessage(IDC_FORMAT, CB_GETITEMDATA, CurrentFormatSel, 0);
DWORD StartPC = m_StartAddress.GetValue();
DWORD EndPC = m_EndAddress.GetValue();
DWORD DumpPC = m_PC.GetValue();
GetDlgItemText(IDC_FILENAME,FileName,sizeof(FileName));
GetDlgItemText(IDC_FILENAME, FileName, sizeof(FileName));
if (strlen(FileName) == 0)
{
g_Notify->DisplayError(L"Please Choose target file");
::SetFocus(GetDlgItem(IDC_FILENAME));
return false;
}
if (SendDlgItemMessage(IDC_USE_ALT_PC,BM_GETSTATE, 0,0) != BST_CHECKED)
if (SendDlgItemMessage(IDC_USE_ALT_PC, BM_GETSTATE, 0, 0) != BST_CHECKED)
{
DumpPC = g_Reg->m_PROGRAM_COUNTER;
}
//disable buttons
::EnableWindow(GetDlgItem(IDC_E_START_ADDR),FALSE);
::EnableWindow(GetDlgItem(IDC_E_END_ADDR),FALSE);
::EnableWindow(GetDlgItem(IDC_E_ALT_PC),FALSE);
::EnableWindow(GetDlgItem(IDC_USE_ALT_PC),FALSE);
::EnableWindow(GetDlgItem(IDC_FILENAME),FALSE);
::EnableWindow(GetDlgItem(IDC_BTN_CHOOSE_FILE),FALSE);
::EnableWindow(GetDlgItem(IDC_FORMAT),FALSE);
::EnableWindow(GetDlgItem(IDOK),FALSE);
::EnableWindow(GetDlgItem(IDCANCEL),FALSE);
::EnableWindow(GetDlgItem(IDC_E_START_ADDR), FALSE);
::EnableWindow(GetDlgItem(IDC_E_END_ADDR), FALSE);
::EnableWindow(GetDlgItem(IDC_E_ALT_PC), FALSE);
::EnableWindow(GetDlgItem(IDC_USE_ALT_PC), FALSE);
::EnableWindow(GetDlgItem(IDC_FILENAME), FALSE);
::EnableWindow(GetDlgItem(IDC_BTN_CHOOSE_FILE), FALSE);
::EnableWindow(GetDlgItem(IDC_FORMAT), FALSE);
::EnableWindow(GetDlgItem(IDOK), FALSE);
::EnableWindow(GetDlgItem(IDCANCEL), FALSE);
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory);
if (!DumpMemory(FileName,Format,StartPC,EndPC,DumpPC))
if (!DumpMemory(FileName, Format, StartPC, EndPC, DumpPC))
{
//enable buttons
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
@ -124,208 +123,7 @@ LRESULT CDumpMemory::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/,
return FALSE;
}
//#include "..\\..\\User Interface.h"
//#include "..\\..\\N64 System.h"
//#include <windows.h>
//
//DWORD CDumpMemory::m_StartAddress = 0x80000000;
//DWORD CDumpMemory::m_EndAddress = 0x803FFFF0;
//CDumpMemory::CDumpMemory(CMipsMemory * MMU) :
// m_Window(NULL), g_MMU(MMU)
//{
//}
//CDumpMemory::~CDumpMemory()
//{
//}
//void CDumpMemory::DisplayDump(HWND & hParent)
//{
// DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_Cheats_DumpMemory),
// (HWND)hParent, (DLGPROC)WinProc,(LPARAM)this);
//}
//DWORD CDumpMemory::AsciiToHex (const char * HexValue)
//{
// DWORD Count, Finish, Value = 0;
// Finish = strlen(HexValue);
// if (Finish > 8 )
// {
// Finish = 8;
// }
// for (Count = 0; Count < Finish; Count++
// {
// Value = (Value << 4);
// switch ( HexValue[Count] )
// {
// case '0': break;
// case '1': Value += 1; break;
// case '2': Value += 2; break;
// case '3': Value += 3; break;
// case '4': Value += 4; break;
// case '5': Value += 5; break;
// case '6': Value += 6; break;
// case '7': Value += 7; break;
// case '8': Value += 8; break;
// case '9': Value += 9; break;
// case 'A': Value += 10; break;
// case 'a': Value += 10; break;
// case 'B': Value += 11; break;
// case 'b': Value += 11; break;
// case 'C': Value += 12; break;
// case 'c': Value += 12; break;
// case 'D': Value += 13; break;
// case 'd': Value += 13; break;
// case 'E': Value += 14; break;
// case 'e': Value += 14; break;
// case 'F': Value += 15; break;
// case 'f': Value += 15; break;
// default:
// Value = (Value >> 4);
// Count = Finish;
// }
// }
// return Value;
//}
//int CALLBACK CDumpMemory::WinProc (HWND hDlg,DWORD uMsg,DWORD wParam, DWORD lParam)
//{
// switch (uMsg)
// {
// case WM_INITDIALOG:
// {
// CDumpMemory * _this = (CDumpMemory *)lParam;
// SetProp(hDlg,"Class",_this);
// _this->m_Window = hDlg;
// SetDlgItemText(hDlg,IDC_E_START_ADDR,stdstr("0x%X",m_StartAddress).c_str());
// SetDlgItemText(hDlg,IDC_E_END_ADDR,stdstr("0x%X",m_EndAddress).c_str());
// SetDlgItemText(hDlg,IDC_E_ALT_PC,"0x80000000");
// HWND hFormatList = GetDlgItem(hDlg,IDC_FORMAT);
// int pos = SendMessage(hFormatList,CB_ADDSTRING,(WPARAM)0,(LPARAM)"TEXT - Disassembly + PC");
// SendMessage(hFormatList,CB_SETITEMDATA,(WPARAM)pos,(LPARAM)DisassemblyWithPC);
// SendMessage(hFormatList,CB_SETCURSEL,(WPARAM)0,(LPARAM)0);
// }
// break;
// case WM_COMMAND:
// switch (LOWORD(wParam))
// {
// case IDC_E_START_ADDR:
// case IDC_E_END_ADDR:
// case IDC_E_ALT_PC:
// if (HIWORD(wParam) == EN_UPDATE)
// {
// CDumpMemory * _this = (CDumpMemory *)GetProp(hDlg,"Class");
// TCHAR szTmp[20], szTmp2[20];
// DWORD Value;
// GetDlgItemText(hDlg,LOWORD(wParam),szTmp,sizeof(szTmp));
// Value = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// //if (Value > Stop)
// //{
// // Value = Stop;
// //}
// //if (Value < Start)
// //{
// // Value = Start;
// //}
// sprintf(szTmp2,"0x%X",Value);
// if (strcmp(szTmp,szTmp2) != 0)
// {
// SetDlgItemText(hDlg,LOWORD(wParam),szTmp2);
// if (_this->SelStop == 0)
// {
// _this->SelStop = strlen(szTmp2); _this->SelStart = _this->SelStop;
// }
// SendDlgItemMessage(hDlg,LOWORD(wParam),EM_SETSEL,(WPARAM)_this->SelStart,(LPARAM)_this->SelStop);
// }
// else
// {
// WORD NewSelStart, NewSelStop;
// SendDlgItemMessage(hDlg,LOWORD(wParam),EM_GETSEL,(WPARAM)&NewSelStart,(LPARAM)&NewSelStop);
// if (NewSelStart != 0)
// {
// _this->SelStart = NewSelStart; _this->SelStop = NewSelStop;
// }
// }
// }
// break;
// case IDC_BTN_CHOOSE_FILE:
// {
// CDumpMemory * _this = (CDumpMemory *)GetProp(hDlg,"Class");
// OPENFILENAME openfilename;
// char FileName[_MAX_PATH],Directory[_MAX_PATH];
// memset(&FileName, 0, sizeof(FileName));
// memset(&openfilename, 0, sizeof(openfilename));
// strcpy(Directory,g_Settings->LoadStringVal(ApplicationDir).c_str());
// openfilename.lStructSize = sizeof( openfilename );
// openfilename.hwndOwner = hDlg;
// openfilename.lpstrFilter = "Text file (*.txt)\0*.txt;\0All files (*.*)\0*.*\0";
// openfilename.lpstrFile = FileName;
// openfilename.lpstrInitialDir = Directory;
// openfilename.nMaxFile = MAX_PATH;
// openfilename.Flags = OFN_HIDEREADONLY;
// if (GetOpenFileName (&openfilename))
// {
// char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
// _splitpath( FileName, drive, dir, fname, ext );
// if (strlen(ext) == 0)
// {
// strcat(FileName,".txt");
// }
// SetDlgItemText(hDlg,IDC_FILENAME,FileName);
// }
// }
// break;
// case IDCANCEL:
// RemoveProp(hDlg,"Class");
// EndDialog(hDlg,0);
// break;
// case IDOK:
// {
// CDumpMemory * _this = (CDumpMemory *)GetProp(hDlg,"Class");
// TCHAR szTmp[20], FileName[MAX_PATH];
// int CurrentFormatSel = SendDlgItemMessage(hDlg,IDC_FORMAT,CB_GETCURSEL,0,0);
// DumpFormat Format = (DumpFormat)SendDlgItemMessage(hDlg,IDC_FORMAT,CB_GETITEMDATA,CurrentFormatSel,0);
// GetDlgItemText(hDlg,IDC_E_START_ADDR,szTmp,sizeof(szTmp));
// DWORD StartPC = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// GetDlgItemText(hDlg,IDC_E_END_ADDR,szTmp,sizeof(szTmp));
// DWORD EndPC = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// GetDlgItemText(hDlg,IDC_E_ALT_PC,szTmp,sizeof(szTmp));
// DWORD DumpPC = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// GetDlgItemText(hDlg,IDC_FILENAME,FileName,sizeof(FileName));
// if (strlen(FileName) == 0)
// {
// g_Notify->DisplayError(L"Please Choose target file");
// SetFocus(GetDlgItem(hDlg,IDC_FILENAME));
// return false;
// }
// if (SendDlgItemMessage(hDlg,IDC_USE_ALT_PC,BM_GETSTATE, 0,0) != BST_CHECKED)
// {
// DumpPC = _this->g_MMU->SystemRegisters()->PROGRAM_COUNTER;
// }
// //disable buttons
// EnableWindow(GetDlgItem(hDlg,IDC_E_START_ADDR),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_E_END_ADDR),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_E_ALT_PC),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_USE_ALT_PC),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_FILENAME),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_BTN_CHOOSE_FILE),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_FORMAT),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDOK),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDCANCEL),FALSE);
// if (!_this->DumpMemory(FileName,Format,StartPC,EndPC,DumpPC))
// {
// //enable buttons
// return false;
// }
// }
// RemoveProp(hDlg,"Class");
// EndDialog(hDlg,0);
// break;
// }
// break;
// default:
// return false;
// }
// return true;
//}
bool CDumpMemory::DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD /*DumpPC*/ )
bool CDumpMemory::DumpMemory(LPCSTR FileName, DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD /*DumpPC*/)
{
switch (Format)
{
@ -334,12 +132,12 @@ bool CDumpMemory::DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC,
CLog LogFile;
if (!LogFile.Open(FileName))
{
g_Notify->DisplayError(stdstr_f("Failed to open\n%s",FileName).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Failed to open\n%s", FileName).ToUTF16().c_str());
return false;
}
LogFile.SetFlush(false);
LogFile.SetTruncateFile(false);
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
#ifdef tofix
char Command[200];
for (COpcode OpCode(StartPC); OpCode.PC() < EndPC; OpCode.Next())
@ -349,250 +147,11 @@ bool CDumpMemory::DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC,
LogFile.LogF("%X: %-15s%s\r\n",OpCode.PC(),szOpName,Command);
}
#endif
m_StartAddress.SetValue(StartPC,true,true);
m_EndAddress.SetValue(EndPC,true,true);
m_StartAddress.SetValue(StartPC, true, true);
m_EndAddress.SetValue(EndPC, true, true);
return true;
}
break;
}
return false;
}
//
//CDumpMemory::CDumpMemory(CMipsMemory * MMU) :
// m_Window(NULL), g_MMU(MMU)
//{
//}
//
//CDumpMemory::~CDumpMemory()
//{
//}
//
//void CDumpMemory::DisplayDump(HWND & hParent)
//{
// DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_Cheats_DumpMemory),
// (HWND)hParent, (DLGPROC)WinProc,(LPARAM)this);
//}
//
//DWORD CDumpMemory::AsciiToHex (const char * HexValue)
//{
// DWORD Count, Finish, Value = 0;
//
// Finish = strlen(HexValue);
// if (Finish > 8 )
// {
// Finish = 8;
// }
//
// for (Count = 0; Count < Finish; Count++)
// {
// Value = (Value << 4);
// switch ( HexValue[Count] )
// {
// case '0': break;
// case '1': Value += 1; break;
// case '2': Value += 2; break;
// case '3': Value += 3; break;
// case '4': Value += 4; break;
// case '5': Value += 5; break;
// case '6': Value += 6; break;
// case '7': Value += 7; break;
// case '8': Value += 8; break;
// case '9': Value += 9; break;
// case 'A': Value += 10; break;
// case 'a': Value += 10; break;
// case 'B': Value += 11; break;
// case 'b': Value += 11; break;
// case 'C': Value += 12; break;
// case 'c': Value += 12; break;
// case 'D': Value += 13; break;
// case 'd': Value += 13; break;
// case 'E': Value += 14; break;
// case 'e': Value += 14; break;
// case 'F': Value += 15; break;
// case 'f': Value += 15; break;
// default:
// Value = (Value >> 4);
// Count = Finish;
// }
// }
// return Value;
//}
//
//int CALLBACK CDumpMemory::WinProc (HWND hDlg,DWORD uMsg,DWORD wParam, DWORD lParam)
//{
// switch (uMsg)
// {
// case WM_INITDIALOG:
// {
// CDumpMemory * _this = (CDumpMemory *)lParam;
// SetProp(hDlg,"Class",_this);
// _this->m_Window = hDlg;
// SetDlgItemText(hDlg,IDC_E_START_ADDR,stdstr("0x%X",m_StartAddress).c_str());
// SetDlgItemText(hDlg,IDC_E_END_ADDR,stdstr("0x%X",m_EndAddress).c_str());
// SetDlgItemText(hDlg,IDC_E_ALT_PC,"0x80000000");
//
// HWND hFormatList = GetDlgItem(hDlg,IDC_FORMAT);
// int pos = SendMessage(hFormatList,CB_ADDSTRING,(WPARAM)0,(LPARAM)"TEXT - Disassembly + PC");
// SendMessage(hFormatList,CB_SETITEMDATA,(WPARAM)pos,(LPARAM)DisassemblyWithPC);
// SendMessage(hFormatList,CB_SETCURSEL,(WPARAM)0,(LPARAM)0);
//
// }
// break;
// case WM_COMMAND:
// switch (LOWORD(wParam))
// {
// case IDC_E_START_ADDR:
// case IDC_E_END_ADDR:
// case IDC_E_ALT_PC:
// if (HIWORD(wParam) == EN_UPDATE)
// {
// CDumpMemory * _this = (CDumpMemory *)GetProp(hDlg,"Class");
//
// TCHAR szTmp[20], szTmp2[20];
// DWORD Value;
//
// GetDlgItemText(hDlg,LOWORD(wParam),szTmp,sizeof(szTmp));
// Value = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// //if (Value > Stop)
// //{
// // Value = Stop;
// //}
// //if (Value < Start)
// //{
// // Value = Start;
// //}
// sprintf(szTmp2,"0x%X",Value);
// if (strcmp(szTmp,szTmp2) != 0)
// {
// SetDlgItemText(hDlg,LOWORD(wParam),szTmp2);
// if (_this->SelStop == 0) { _this->SelStop = strlen(szTmp2); _this->SelStart = _this->SelStop; }
// SendDlgItemMessage(hDlg,LOWORD(wParam),EM_SETSEL,(WPARAM)_this->SelStart,(LPARAM)_this->SelStop);
// }
// else
// {
// WORD NewSelStart, NewSelStop;
// SendDlgItemMessage(hDlg,LOWORD(wParam),EM_GETSEL,(WPARAM)&NewSelStart,(LPARAM)&NewSelStop);
// if (NewSelStart != 0)
// {
// _this->SelStart = NewSelStart; _this->SelStop = NewSelStop;
// }
// }
// }
// break;
// case IDC_BTN_CHOOSE_FILE:
// {
// CDumpMemory * _this = (CDumpMemory *)GetProp(hDlg,"Class");
//
// OPENFILENAME openfilename;
// char FileName[_MAX_PATH],Directory[_MAX_PATH];
//
// memset(&FileName, 0, sizeof(FileName));
// memset(&openfilename, 0, sizeof(openfilename));
//
// strcpy(Directory,g_Settings->LoadStringVal(ApplicationDir).c_str());
//
// openfilename.lStructSize = sizeof( openfilename );
// openfilename.hwndOwner = hDlg;
// openfilename.lpstrFilter = "Text file (*.txt)\0*.txt;\0All files (*.*)\0*.*\0";
// openfilename.lpstrFile = FileName;
// openfilename.lpstrInitialDir = Directory;
// openfilename.nMaxFile = MAX_PATH;
// openfilename.Flags = OFN_HIDEREADONLY;
//
// if (GetOpenFileName (&openfilename))
// {
// char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
//
// _splitpath( FileName, drive, dir, fname, ext );
// if (strlen(ext) == 0)
// {
// strcat(FileName,".txt");
// }
// SetDlgItemText(hDlg,IDC_FILENAME,FileName);
// }
// }
// break;
// case IDCANCEL:
// RemoveProp(hDlg,"Class");
// EndDialog(hDlg,0);
// break;
// case IDOK:
// {
// CDumpMemory * _this = (CDumpMemory *)GetProp(hDlg,"Class");
// TCHAR szTmp[20], FileName[MAX_PATH];
//
// int CurrentFormatSel = SendDlgItemMessage(hDlg,IDC_FORMAT,CB_GETCURSEL,0,0);
// DumpFormat Format = (DumpFormat)SendDlgItemMessage(hDlg,IDC_FORMAT,CB_GETITEMDATA,CurrentFormatSel,0);
//
// GetDlgItemText(hDlg,IDC_E_START_ADDR,szTmp,sizeof(szTmp));
// DWORD StartPC = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// GetDlgItemText(hDlg,IDC_E_END_ADDR,szTmp,sizeof(szTmp));
// DWORD EndPC = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// GetDlgItemText(hDlg,IDC_E_ALT_PC,szTmp,sizeof(szTmp));
// DWORD DumpPC = szTmp[1] =='x'?AsciiToHex(&szTmp[2]):AsciiToHex(szTmp);
// GetDlgItemText(hDlg,IDC_FILENAME,FileName,sizeof(FileName));
//
// if (strlen(FileName) == 0)
// {
// g_Notify->DisplayError(L"Please Choose target file");
// SetFocus(GetDlgItem(hDlg,IDC_FILENAME));
// return false;
// }
//
// if (SendDlgItemMessage(hDlg,IDC_USE_ALT_PC,BM_GETSTATE, 0,0) != BST_CHECKED)
// {
// DumpPC = _this->g_MMU->SystemRegisters()->PROGRAM_COUNTER;
// }
// //disable buttons
// EnableWindow(GetDlgItem(hDlg,IDC_E_START_ADDR),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_E_END_ADDR),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_E_ALT_PC),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_USE_ALT_PC),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_FILENAME),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_BTN_CHOOSE_FILE),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDC_FORMAT),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDOK),FALSE);
// EnableWindow(GetDlgItem(hDlg,IDCANCEL),FALSE);
// if (!_this->DumpMemory(FileName,Format,StartPC,EndPC,DumpPC))
// {
// //enable buttons
// return false;
// }
// }
// RemoveProp(hDlg,"Class");
// EndDialog(hDlg,0);
// break;
// }
// break;
// default:
// return false;
// }
// return true;
//}
//
//bool CDumpMemory::DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD DumpPC )
//{
// switch (Format)
// {
// case DisassemblyWithPC:
// {
// CLog LogFile(FileName);
// if (!LogFile.IsOpen())
// {
// g_Notify->DisplayError(L"Failed to open\n%s",FileName);
// return false;
// }
//
// for (COpcode OpCode(g_MMU,StartPC); OpCode.PC() < EndPC; OpCode.Next())
// {
// LogFile.Log("%X: %s",OpCode.PC(),OpCode.Name().c_str());
// }
// m_StartAddress = StartPC;
// m_EndAddress = EndPC;
// return true;
// }
// break;
// }
// return false;
//}
#endif

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -11,12 +11,12 @@
#pragma once
class CDumpMemory :
public CDebugDialog<CDumpMemory>
public CDebugDialog < CDumpMemory >
{
public:
enum { IDD = IDD_Cheats_DumpMemory };
CDumpMemory(CDebugger * debugger);
CDumpMemory(CDebuggerUI * debugger);
virtual ~CDumpMemory(void);
private:
@ -31,13 +31,13 @@ private:
BEGIN_MSG_MAP_EX(CDumpMemory)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
bool DumpMemory ( LPCSTR FileName,DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD DumpPC );
bool DumpMemory(LPCSTR FileName, DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD DumpPC);
CEditNumber m_StartAddress, m_EndAddress, m_PC;
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,10 +10,9 @@
****************************************************************************/
#include "stdafx.h"
#ifdef WINDOWS_UI
#include "Debugger UI.h"
CDebugMemorySearch::CDebugMemorySearch(CDebugger * debugger) :
CDebugMemorySearch::CDebugMemorySearch(CDebuggerUI * debugger) :
CDebugDialog<CDebugMemorySearch>(debugger),
m_MemoryState(NULL),
m_MemoryStateSize(0)
@ -28,15 +27,15 @@ CDebugMemorySearch::~CDebugMemorySearch()
}
}
void CDebugMemorySearch::AddAlignmentOptions (CComboBox & ctrl)
void CDebugMemorySearch::AddAlignmentOptions(CComboBox & ctrl)
{
int Index = ctrl.AddString("32 bits (aligned)");
ctrl.SetItemData(Index,_32Bit);
ctrl.SetItemData(Index, _32Bit);
Index = ctrl.AddString("16bits (aligned)");
ctrl.SetItemData(Index,_16Bit);
ctrl.SetItemData(Index, _16Bit);
Index = ctrl.AddString("8bits");
ctrl.SetCurSel(Index);
ctrl.SetItemData(Index,_8Bit);
ctrl.SetItemData(Index, _8Bit);
}
LRESULT CDebugMemorySearch::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
@ -56,49 +55,49 @@ LRESULT CDebugMemorySearch::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARA
m_ValueSize.Attach(GetDlgItem(IDC_VALUE_ALIGN));
AddAlignmentOptions(m_ValueSize);
m_SearchResults.Attach(GetDlgItem(IDC_LST_RESULTS));
m_SearchResults.AddColumn("ID",0);
m_SearchResults.AddColumn("PAddr",1);
m_SearchResults.AddColumn("Value",2);
m_SearchResults.SetColumnWidth(0,50);
m_SearchResults.SetColumnWidth(1,75);
m_SearchResults.SetColumnWidth(2,75);
m_SearchResults.AddColumn("ID", 0);
m_SearchResults.AddColumn("PAddr", 1);
m_SearchResults.AddColumn("Value", 2);
m_SearchResults.SetColumnWidth(0, 50);
m_SearchResults.SetColumnWidth(1, 75);
m_SearchResults.SetColumnWidth(2, 75);
m_SearchResults.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
m_UnknownOptions.Attach(GetDlgItem(IDC_CMB_UNKNOWN));
m_HaveResults = false;
FixUnknownOptions(true);
SendMessage(GetDlgItem(IDC_RADIO_VALUE),BM_SETCHECK, BST_CHECKED,0);
SendMessage(GetDlgItem(IDC_RADIO_VALUE), BM_SETCHECK, BST_CHECKED, 0);
BOOL bHandled;
OnClicked(0,IDC_BTN_RDRAM,NULL,bHandled);
OnClicked(0,IDC_RADIO_VALUE,NULL,bHandled);
OnClicked(0, IDC_BTN_RDRAM, NULL, bHandled);
OnClicked(0, IDC_RADIO_VALUE, NULL, bHandled);
WindowCreated();
return TRUE;
}
LRESULT CDebugMemorySearch::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/)
{
switch(wID)
switch (wID)
{
case IDCANCEL:
EndDialog(0);
break;
case IDC_BTN_RDRAM:
m_PAddrStart.SetValue(0,true,true);
m_SearchLen.SetValue(g_MMU->RdramSize(),true,true);
m_PAddrStart.SetValue(0, true, true);
m_SearchLen.SetValue(g_MMU->RdramSize(), true, true);
break;
case IDC_BTN_ROM:
m_PAddrStart.SetValue(0x10000000,true,true);
m_SearchLen.SetValue(g_Rom->GetRomSize(),true,true);
m_PAddrStart.SetValue(0x10000000, true, true);
m_SearchLen.SetValue(g_Rom->GetRomSize(), true, true);
break;
case IDC_BTN_SPMEM:
m_PAddrStart.SetValue(0x04000000,true,true);
m_SearchLen.SetValue(0x2000,true,true);
m_PAddrStart.SetValue(0x04000000, true, true);
m_SearchLen.SetValue(0x2000, true, true);
break;
case IDC_SEARCH_HEX:
{
bool bChecked = (SendMessage(hWndCtl, BM_GETSTATE, 0,0) & BST_CHECKED) != 0;
m_SearchValue.SetDisplayType( bChecked ? CEditNumber::DisplayHex : CEditNumber::DisplayDec);
bool bChecked = (SendMessage(hWndCtl, BM_GETSTATE, 0, 0) & BST_CHECKED) != 0;
m_SearchValue.SetDisplayType(bChecked ? CEditNumber::DisplayHex : CEditNumber::DisplayDec);
}
break;
case ID_POPUP_SHOWINMEMORYVIEWER:
@ -139,21 +138,21 @@ LRESULT CDebugMemorySearch::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND hWndC
EnableJalOptions(true);
break;
case IDC_BTN_SEARCH:
if (SendMessage(GetDlgItem(IDC_RADIO_UNKNOWN),BM_GETSTATE, 0,0) == BST_CHECKED)
if (SendMessage(GetDlgItem(IDC_RADIO_UNKNOWN), BM_GETSTATE, 0, 0) == BST_CHECKED)
{
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_SearchMemory);
SearchForUnknown();
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_SearchMemory);
break;
}
if (SendMessage(GetDlgItem(IDC_RADIO_VALUE),BM_GETSTATE, 0,0) == BST_CHECKED)
if (SendMessage(GetDlgItem(IDC_RADIO_VALUE), BM_GETSTATE, 0, 0) == BST_CHECKED)
{
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_SearchMemory);
SearchForValue();
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_SearchMemory);
break;
}
if (SendMessage(GetDlgItem(IDC_RADIO_TEXT),BM_GETSTATE, 0,0) == BST_CHECKED)
if (SendMessage(GetDlgItem(IDC_RADIO_TEXT), BM_GETSTATE, 0, 0) == BST_CHECKED)
{
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_SearchMemory);
SearchForText();
@ -167,7 +166,7 @@ LRESULT CDebugMemorySearch::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND hWndC
return FALSE;
}
LRESULT CDebugMemorySearch::OnResultRClick ( LPNMHDR /*lpnmh*/ )
LRESULT CDebugMemorySearch::OnResultRClick(LPNMHDR /*lpnmh*/)
{
LONG iItem = m_SearchResults.GetNextItem(-1, LVNI_SELECTED);
if (iItem == -1)
@ -176,54 +175,54 @@ LRESULT CDebugMemorySearch::OnResultRClick ( LPNMHDR /*lpnmh*/ )
}
//Load the menu
HMENU hMenu = LoadMenu(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MEM_SEARCH));
HMENU hPopupMenu = GetSubMenu(hMenu,0);
HMENU hMenu = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MEM_SEARCH));
HMENU hPopupMenu = GetSubMenu(hMenu, 0);
//Get the current Mouse location
POINT Mouse;
GetCursorPos(&Mouse);
//Show the menu
TrackPopupMenu(hPopupMenu, 0, Mouse.x, Mouse.y, 0,m_hWnd, NULL);
TrackPopupMenu(hPopupMenu, 0, Mouse.x, Mouse.y, 0, m_hWnd, NULL);
DestroyMenu(hMenu);
return true;
}
void CDebugMemorySearch::EnableValueOptions( bool Enable )
void CDebugMemorySearch::EnableValueOptions(bool Enable)
{
if (Enable)
{
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),m_HaveResults ? "Search Results" : "Search");
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), m_HaveResults ? "Search Results" : "Search");
}
::EnableWindow(GetDlgItem(IDC_SEARCH_VALUE),Enable);
::EnableWindow(GetDlgItem(IDC_SEARCH_HEX),Enable);
::EnableWindow(GetDlgItem(IDC_VALUE_ALIGN),m_HaveResults ? false : Enable );
::EnableWindow(GetDlgItem(IDC_SEARCH_VALUE), Enable);
::EnableWindow(GetDlgItem(IDC_SEARCH_HEX), Enable);
::EnableWindow(GetDlgItem(IDC_VALUE_ALIGN), m_HaveResults ? false : Enable);
}
void CDebugMemorySearch::EnableTextOptions( bool Enable )
void CDebugMemorySearch::EnableTextOptions(bool Enable)
{
if (Enable)
{
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),m_HaveResults ? "Search Results" : "Search");
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), m_HaveResults ? "Search Results" : "Search");
}
::EnableWindow(GetDlgItem(IDC_SEARCH_TEXT),Enable);
::EnableWindow(GetDlgItem(IDC_CASE_SENSITIVE),Enable);
::EnableWindow(GetDlgItem(IDC_SEARCH_TEXT), Enable);
::EnableWindow(GetDlgItem(IDC_CASE_SENSITIVE), Enable);
}
void CDebugMemorySearch::EnableJalOptions( bool Enable )
void CDebugMemorySearch::EnableJalOptions(bool Enable)
{
if (Enable)
{
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),m_HaveResults ? "Search Results" : "Search");
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), m_HaveResults ? "Search Results" : "Search");
}
::EnableWindow(GetDlgItem(IDC_JAL_ADDR),Enable);
::EnableWindow(GetDlgItem(IDC_JAL_ADDR), Enable);
}
void CDebugMemorySearch::EnableUnknownOptions( bool Enable )
void CDebugMemorySearch::EnableUnknownOptions(bool Enable)
{
if (m_UnknownOptions.GetCount() > 1)
{
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN),m_HaveResults ? false : Enable );
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN), m_HaveResults ? false : Enable);
if (Enable)
{
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), m_HaveResults ? "Search Results" : "Search");
@ -231,16 +230,16 @@ void CDebugMemorySearch::EnableUnknownOptions( bool Enable )
}
else
{
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN), false );
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN), false);
if (Enable)
{
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), "Create");
}
}
::EnableWindow(GetDlgItem(IDC_CMB_UNKNOWN),Enable);
::EnableWindow(GetDlgItem(IDC_CMB_UNKNOWN), Enable);
}
void CDebugMemorySearch::SearchForValue( void )
void CDebugMemorySearch::SearchForValue(void)
{
MemorySize Size = (MemorySize)m_ValueSize.GetItemData(m_ValueSize.GetCurSel());
DWORD Value = m_SearchValue.GetValue();
@ -270,23 +269,23 @@ void CDebugMemorySearch::SearchForValue( void )
m_SearchResults.DeleteAllItems();
DWORD ItemsAdded = 0;
while (SearchForValue(Value,Size,StartAddress,Len))
while (SearchForValue(Value, Size, StartAddress, Len))
{
SearchResultItem Result;
Result.PAddr = StartAddress;
Result.Value = Value;
char LocationStr[20];
sprintf(LocationStr,"%d",ItemsAdded + 1);
int Index = m_SearchResults.AddItem(ItemsAdded,0,LocationStr);
m_SearchResults.SetItemData(Index,m_SearchResult.size());
sprintf(LocationStr, "%d", ItemsAdded + 1);
int Index = m_SearchResults.AddItem(ItemsAdded, 0, LocationStr);
m_SearchResults.SetItemData(Index, m_SearchResult.size());
m_SearchResult.push_back(Result);
sprintf(LocationStr,"0x%08X",StartAddress);
m_SearchResults.SetItemText(Index,1,LocationStr);
sprintf(LocationStr,DisplayStr,Value);
m_SearchResults.SetItemText(Index,2,LocationStr);
sprintf(LocationStr,DisplayStr,Value);
m_SearchResults.SetItemText(Index,3,LocationStr);
sprintf(LocationStr, "0x%08X", StartAddress);
m_SearchResults.SetItemText(Index, 1, LocationStr);
sprintf(LocationStr, DisplayStr, Value);
m_SearchResults.SetItemText(Index, 2, LocationStr);
sprintf(LocationStr, DisplayStr, Value);
m_SearchResults.SetItemText(Index, 3, LocationStr);
StartAddress += MoveSize;
Len -= MoveSize;
ItemsAdded += 1;
@ -295,9 +294,9 @@ void CDebugMemorySearch::SearchForValue( void )
break;
}
}
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search Results");
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON),SW_SHOW);
::EnableWindow(GetDlgItem(IDC_VALUE_ALIGN),false);
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), "Search Results");
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON), SW_SHOW);
::EnableWindow(GetDlgItem(IDC_VALUE_ALIGN), false);
}
else
{
@ -307,7 +306,7 @@ void CDebugMemorySearch::SearchForValue( void )
int ItemId = m_SearchResults.GetItemData(i);
SearchResultItem & Result = m_SearchResult[ItemId];
DWORD NewValue = 0;
uint32_t NewValue = 0;
bool valid = false;
switch (Size)
@ -330,16 +329,16 @@ void CDebugMemorySearch::SearchForValue( void )
valid = g_MMU->LW_PAddr(Result.PAddr, NewValue);
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if (Value == NewValue)
{
char LocationStr[20];
sprintf(LocationStr,DisplayStr,NewValue);
m_SearchResults.SetItemText(i,2,LocationStr);
sprintf(LocationStr,DisplayStr,Result.Value);
m_SearchResults.SetItemText(i,3,LocationStr);
sprintf(LocationStr, DisplayStr, NewValue);
m_SearchResults.SetItemText(i, 2, LocationStr);
sprintf(LocationStr, DisplayStr, Result.Value);
m_SearchResults.SetItemText(i, 3, LocationStr);
Result.Value = NewValue;
}
else
@ -348,7 +347,7 @@ void CDebugMemorySearch::SearchForValue( void )
}
}
}
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS),stdstr_f("Results (%d)",m_SearchResults.GetItemCount()).c_str());
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS), stdstr_f("Results (%d)", m_SearchResults.GetItemCount()).c_str());
}
void CDebugMemorySearch::SearchForUnknown()
@ -359,8 +358,8 @@ void CDebugMemorySearch::SearchForUnknown()
m_SearchResults.DeleteAllItems();
SearchSetBaseForChanges();
FixUnknownOptions(false);
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON),SW_SHOW);
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN),true );
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON), SW_SHOW);
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN), true);
return;
}
MemorySize Size = (MemorySize)m_UnknownSize.GetItemData(m_UnknownSize.GetCurSel());
@ -378,7 +377,7 @@ void CDebugMemorySearch::SearchForUnknown()
{
m_HaveResults = true;
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN),false );
::EnableWindow(GetDlgItem(IDC_UNKNOWN_ALIGN), false);
DWORD StartAddress = m_PAddrStart.GetValue();
DWORD Len = m_SearchLen.GetValue();
DWORD MaxSearch = m_MaxSearch.GetValue();
@ -392,17 +391,17 @@ void CDebugMemorySearch::SearchForUnknown()
break;
}
}
m_SearchResults.AddColumn("New Value",2);
m_SearchResults.AddColumn("Old Value",3);
m_SearchResults.SetColumnWidth(0,50);
m_SearchResults.SetColumnWidth(1,75);
m_SearchResults.SetColumnWidth(2,75);
m_SearchResults.SetColumnWidth(3,75);
m_SearchResults.AddColumn("New Value", 2);
m_SearchResults.AddColumn("Old Value", 3);
m_SearchResults.SetColumnWidth(0, 50);
m_SearchResults.SetColumnWidth(1, 75);
m_SearchResults.SetColumnWidth(2, 75);
m_SearchResults.SetColumnWidth(3, 75);
m_SearchResults.DeleteAllItems();
DWORD ItemsAdded = 0, OldValue, NewValue;
while (SearchForChanges(Option,Size,StartAddress,Len,OldValue,NewValue))
while (SearchForChanges(Option, Size, StartAddress, Len, OldValue, NewValue))
{
SearchResultItem Result;
Result.PAddr = StartAddress;
@ -410,16 +409,16 @@ void CDebugMemorySearch::SearchForUnknown()
//if list size > max, then break
char LocationStr[20];
sprintf(LocationStr,"%d",ItemsAdded + 1);
int Index = m_SearchResults.AddItem(ItemsAdded,0,LocationStr);
m_SearchResults.SetItemData(Index,m_SearchResult.size());
sprintf(LocationStr, "%d", ItemsAdded + 1);
int Index = m_SearchResults.AddItem(ItemsAdded, 0, LocationStr);
m_SearchResults.SetItemData(Index, m_SearchResult.size());
m_SearchResult.push_back(Result);
sprintf(LocationStr,"0x%08X",StartAddress);
m_SearchResults.SetItemText(Index,1,LocationStr);
sprintf(LocationStr,DisplayStr,NewValue);
m_SearchResults.SetItemText(Index,2,LocationStr);
sprintf(LocationStr,DisplayStr,OldValue);
m_SearchResults.SetItemText(Index,3,LocationStr);
sprintf(LocationStr, "0x%08X", StartAddress);
m_SearchResults.SetItemText(Index, 1, LocationStr);
sprintf(LocationStr, DisplayStr, NewValue);
m_SearchResults.SetItemText(Index, 2, LocationStr);
sprintf(LocationStr, DisplayStr, OldValue);
m_SearchResults.SetItemText(Index, 3, LocationStr);
StartAddress += MoveSize;
Len -= MoveSize;
ItemsAdded += 1;
@ -428,10 +427,10 @@ void CDebugMemorySearch::SearchForUnknown()
break;
}
}
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search Results");
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON),SW_SHOW);
::EnableWindow(GetDlgItem(IDC_RADIO_TEXT),false);
::EnableWindow(GetDlgItem(IDC_RADIO_JAL),false);
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), "Search Results");
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON), SW_SHOW);
::EnableWindow(GetDlgItem(IDC_RADIO_TEXT), false);
::EnableWindow(GetDlgItem(IDC_RADIO_JAL), false);
}
else
{
@ -442,7 +441,7 @@ void CDebugMemorySearch::SearchForUnknown()
SearchResultItem & Result = m_SearchResult[ItemId];
bool UpdateResult = false;
DWORD NewValue = 0;
uint32_t NewValue = 0;
bool valid = false;
switch (Size)
@ -465,7 +464,7 @@ void CDebugMemorySearch::SearchForUnknown()
valid = g_MMU->LW_PAddr(Result.PAddr, NewValue);
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
switch (Option)
@ -495,16 +494,16 @@ void CDebugMemorySearch::SearchForUnknown()
}
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if (UpdateResult)
{
char LocationStr[20];
sprintf(LocationStr,DisplayStr,NewValue);
m_SearchResults.SetItemText(i,2,LocationStr);
sprintf(LocationStr,DisplayStr,Result.Value);
m_SearchResults.SetItemText(i,3,LocationStr);
sprintf(LocationStr, DisplayStr, NewValue);
m_SearchResults.SetItemText(i, 2, LocationStr);
sprintf(LocationStr, DisplayStr, Result.Value);
m_SearchResults.SetItemText(i, 3, LocationStr);
Result.Value = NewValue;
}
else
@ -513,29 +512,29 @@ void CDebugMemorySearch::SearchForUnknown()
}
}
}
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS),stdstr_f("Results (%d)",m_SearchResults.GetItemCount()).c_str());
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS), stdstr_f("Results (%d)", m_SearchResults.GetItemCount()).c_str());
}
void CDebugMemorySearch::SearchForText()
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
void CDebugMemorySearch::Reset ( void )
void CDebugMemorySearch::Reset(void)
{
m_HaveResults = false;
SendMessage(GetDlgItem(IDC_RADIO_VALUE),BM_SETCHECK, BST_CHECKED,0);
SendMessage(GetDlgItem(IDC_RADIO_VALUE), BM_SETCHECK, BST_CHECKED, 0);
EnableUnknownOptions(false);
EnableValueOptions(true);
EnableTextOptions(false);
EnableJalOptions(false);
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search");
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS),"Results");
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON),SW_HIDE);
::EnableWindow(GetDlgItem(IDC_RADIO_UNKNOWN),true);
::EnableWindow(GetDlgItem(IDC_RADIO_VALUE),true);
::EnableWindow(GetDlgItem(IDC_RADIO_TEXT),false);
::EnableWindow(GetDlgItem(IDC_RADIO_JAL),false);
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), "Search");
::SetWindowText(GetDlgItem(IDC_BORDER_RESULTS), "Results");
::ShowWindow(GetDlgItem(IDC_RESET_BUTTON), SW_HIDE);
::EnableWindow(GetDlgItem(IDC_RADIO_UNKNOWN), true);
::EnableWindow(GetDlgItem(IDC_RADIO_VALUE), true);
::EnableWindow(GetDlgItem(IDC_RADIO_TEXT), false);
::EnableWindow(GetDlgItem(IDC_RADIO_JAL), false);
for (int i = 1; i < 10; i++)
{
if (!m_SearchResults.DeleteColumn(i))
@ -543,18 +542,18 @@ void CDebugMemorySearch::Reset ( void )
break;
}
}
m_SearchResults.AddColumn("Value",2);
m_SearchResults.AddColumn("Value", 2);
m_SearchResults.DeleteAllItems();
m_SearchResults.SetColumnWidth(0,50);
m_SearchResults.SetColumnWidth(1,75);
m_SearchResults.SetColumnWidth(2,75);
m_SearchResults.SetColumnWidth(0, 50);
m_SearchResults.SetColumnWidth(1, 75);
m_SearchResults.SetColumnWidth(2, 75);
m_SearchResults.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT);
FixUnknownOptions(true);
}
void CDebugMemorySearch::FixUnknownOptions ( bool Reset )
void CDebugMemorySearch::FixUnknownOptions(bool Reset)
{
CComboBox & cb = m_UnknownOptions ;
CComboBox & cb = m_UnknownOptions;
if (!Reset && cb.GetCount() > 1)
{
@ -563,27 +562,27 @@ void CDebugMemorySearch::FixUnknownOptions ( bool Reset )
cb.ResetContent();
if (Reset)
{
cb.SetItemData(cb.AddString("Create compare base"),SearchChangeState_Reset);
cb.SetItemData(cb.AddString("Create compare base"), SearchChangeState_Reset);
cb.SetCurSel(0);
return;
}
cb.SetItemData(cb.AddString("memory changed"),SearchChangeState_Changed);
cb.SetItemData(cb.AddString("memory unchanged"),SearchChangeState_Unchanged);
cb.SetItemData(cb.AddString("Value has increased"),SearchChangeState_Greater);
cb.SetItemData(cb.AddString("Value has descreased"),SearchChangeState_Lessthan);
cb.SetItemData(cb.AddString("memory changed"), SearchChangeState_Changed);
cb.SetItemData(cb.AddString("memory unchanged"), SearchChangeState_Unchanged);
cb.SetItemData(cb.AddString("Value has increased"), SearchChangeState_Greater);
cb.SetItemData(cb.AddString("Value has descreased"), SearchChangeState_Lessthan);
cb.SetCurSel(1);
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH),"Search");
::SetWindowText(GetDlgItem(IDC_BTN_SEARCH), "Search");
}
bool CDebugMemorySearch::SearchSetBaseForChanges ( void )
bool CDebugMemorySearch::SearchSetBaseForChanges(void)
{
if (m_MemoryState != NULL)
{
delete [] m_MemoryState;
delete[] m_MemoryState;
}
m_MemoryStateSize = g_MMU->RdramSize();
m_MemoryState = new BYTE[m_MemoryStateSize];
memcpy(m_MemoryState,g_MMU->Rdram(),m_MemoryStateSize);
memcpy(m_MemoryState, g_MMU->Rdram(), m_MemoryStateSize);
return true;
}
@ -598,7 +597,7 @@ bool CDebugMemorySearch::SearchForChanges(SearchMemChangeState SearchType, Memor
if (SearchType == SearchChangeState_Reset)
{
Notify().BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if (Size == _32Bit) { StartAddress = ((StartAddress + 3) & ~3); }
if (Size == _16Bit) { StartAddress = ((StartAddress + 1) & ~1); }
@ -649,7 +648,7 @@ bool CDebugMemorySearch::SearchForChanges(SearchMemChangeState SearchType, Memor
}
break;
case _8Bit:
for (pos = StartAddress; pos < EndMemSearchAddr; pos ++)
for (pos = StartAddress; pos < EndMemSearchAddr; pos++)
{
OldValue = *(BYTE *)(m_MemoryState + (pos ^ 3));
NewValue = *(BYTE *)(g_MMU->Rdram() + (pos ^ 3));
@ -665,13 +664,13 @@ bool CDebugMemorySearch::SearchForChanges(SearchMemChangeState SearchType, Memor
}
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
}
return false;
}
bool CDebugMemorySearch::SearchForValue (DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len )
bool CDebugMemorySearch::SearchForValue(DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len)
{
if (g_MMU == NULL || g_Rom == NULL)
{
@ -723,7 +722,7 @@ bool CDebugMemorySearch::SearchForValue (DWORD Value, MemorySize Size, DWORD &St
}
break;
case _8Bit:
for (pos = StartAddress; pos < EndMemSearchAddr; pos ++)
for (pos = StartAddress; pos < EndMemSearchAddr; pos++)
{
if (*(BYTE *)(RDRAM + (pos ^ 3)) == (BYTE)Value)
{
@ -734,7 +733,7 @@ bool CDebugMemorySearch::SearchForValue (DWORD Value, MemorySize Size, DWORD &St
}
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
}
if (StartAddress >= 0x10000000)
@ -773,7 +772,7 @@ bool CDebugMemorySearch::SearchForValue (DWORD Value, MemorySize Size, DWORD &St
}
break;
case _8Bit:
for (pos = StartAddress; pos < EndMemSearchAddr; pos ++)
for (pos = StartAddress; pos < EndMemSearchAddr; pos++)
{
if (*(BYTE *)(ROM + (pos ^ 3)) == (BYTE)Value)
{
@ -784,9 +783,8 @@ bool CDebugMemorySearch::SearchForValue (DWORD Value, MemorySize Size, DWORD &St
}
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
}
return false;
}
#endif

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -11,12 +11,12 @@
#pragma once
class CDebugMemorySearch :
public CDebugDialog<CDebugMemorySearch>
public CDebugDialog < CDebugMemorySearch >
{
public:
enum { IDD = IDD_Debugger_Search };
CDebugMemorySearch(CDebugger * debugger);
CDebugMemorySearch(CDebuggerUI * debugger);
virtual ~CDebugMemorySearch(void);
private:
@ -51,19 +51,19 @@ private:
BEGIN_MSG_MAP_EX(CDebugMemorySearch)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
NOTIFY_HANDLER_EX(IDC_LST_RESULTS,NM_RCLICK,OnResultRClick)
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
NOTIFY_HANDLER_EX(IDC_LST_RESULTS, NM_RCLICK, OnResultRClick)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
LRESULT OnResultRClick ( LPNMHDR lpnmh );
LRESULT OnResultRClick(LPNMHDR lpnmh);
void EnableUnknownOptions ( bool Enable );
void EnableValueOptions ( bool Enable );
void EnableTextOptions ( bool Enable );
void EnableJalOptions ( bool Enable );
void AddAlignmentOptions ( CComboBox & ctrl );
void EnableUnknownOptions(bool Enable);
void EnableValueOptions(bool Enable);
void EnableTextOptions(bool Enable);
void EnableJalOptions(bool Enable);
void AddAlignmentOptions(CComboBox & ctrl);
CEditNumber m_PAddrStart, m_SearchLen, m_SearchValue, m_MaxSearch;
CComboBox m_UnknownOptions, m_ValueSize, m_UnknownSize;
@ -75,12 +75,12 @@ private:
BYTE * m_MemoryState;
DWORD m_MemoryStateSize;
void FixUnknownOptions ( bool Reset );
void SearchForUnknown ( void );
void SearchForValue ( void );
void SearchForText ( void );
void Reset ( void );
bool SearchSetBaseForChanges ( void );
bool SearchForChanges ( SearchMemChangeState SearchType, MemorySize Size, DWORD &StartAddress, DWORD &Len, DWORD &OldValue, DWORD &NewValue );
bool SearchForValue ( DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len );
void FixUnknownOptions(bool Reset);
void SearchForUnknown(void);
void SearchForValue(void);
void SearchForText(void);
void Reset(void);
bool SearchSetBaseForChanges(void);
bool SearchForChanges(SearchMemChangeState SearchType, MemorySize Size, DWORD &StartAddress, DWORD &Len, DWORD &OldValue, DWORD &NewValue);
bool SearchForValue(DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len);
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,10 +10,9 @@
****************************************************************************/
#include "stdafx.h"
#ifdef WINDOWS_UI
#include "Debugger UI.h"
CDebugTlb::CDebugTlb(CDebugger * debugger) :
CDebugTlb::CDebugTlb(CDebuggerUI * debugger) :
CDebugDialog<CDebugTlb>(debugger)
{
}
@ -32,79 +31,79 @@ LRESULT CDebugTlb::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lPara
col.pszText = "Index";
col.cx = 40;
col.iSubItem = 0;
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 0, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST), 0, &col);
col.pszText = "Page Mask";
col.cx = 90;
col.iSubItem = 1;
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 1, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST), 1, &col);
col.pszText = "Entry Hi";
col.cx = 90;
col.iSubItem = 2;
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 2, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST), 2, &col);
col.pszText = "Entry Lo0";
col.cx = 90;
col.iSubItem = 3;
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 3, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST), 3, &col);
col.pszText = "Entry Lo1";
col.cx = 90;
col.iSubItem = 4;
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 4, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST), 4, &col);
col.pszText = "Index";
col.cx = 40;
col.iSubItem = 0;
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 0, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 0, &col);
col.pszText = "Valid";
col.cx = 40;
col.iSubItem = 1;
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 1, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 1, &col);
col.pszText = "Dirty";
col.cx = 40;
col.iSubItem = 2;
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 2, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 2, &col);
col.pszText = "Rule";
col.cx = 270;
col.iSubItem = 3;
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 3, &col);
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 3, &col);
RefreshTLBWindow();
SendMessage(GetDlgItem(IDC_TLB_ENTRIES),BM_SETCHECK, BST_CHECKED,0);
SendMessage(GetDlgItem(IDC_TLB_ENTRIES), BM_SETCHECK, BST_CHECKED, 0);
// if (Settings().Load(TLBWindowLeft) <= 0)
// {
// SetWindowPos(NULL,Settings().Load(TLBWindowLeft),Settings().Load(TLBWindowTop),0,0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
// }
// if (Settings().Load(TLBWindowLeft) <= 0)
// {
// SetWindowPos(NULL,Settings().Load(TLBWindowLeft),Settings().Load(TLBWindowTop),0,0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
// }
WindowCreated();
return TRUE;
}
LRESULT CDebugTlb::OnClicked (WORD /*wNotifyCode*/, WORD wID, HWND , BOOL& /*bHandled*/)
LRESULT CDebugTlb::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND, BOOL& /*bHandled*/)
{
switch(wID)
switch (wID)
{
case IDCANCEL:
EndDialog(0);
break;
case IDC_TLB_ENTRIES:
::ShowWindow(GetDlgItem(IDC_LIST),SW_SHOW);
::ShowWindow(GetDlgItem(IDC_LIST2),SW_HIDE);
::ShowWindow(GetDlgItem(IDC_LIST), SW_SHOW);
::ShowWindow(GetDlgItem(IDC_LIST2), SW_HIDE);
break;
case IDC_TLB_RULES:
::ShowWindow(GetDlgItem(IDC_LIST),SW_HIDE);
::ShowWindow(GetDlgItem(IDC_LIST2),SW_SHOW);
::ShowWindow(GetDlgItem(IDC_LIST), SW_HIDE);
::ShowWindow(GetDlgItem(IDC_LIST2), SW_SHOW);
break;
}
return FALSE;
}
void CDebugTlb::RefreshTLBWindow (void)
void CDebugTlb::RefreshTLBWindow(void)
{
if (m_hWnd == NULL)
{
@ -117,9 +116,9 @@ void CDebugTlb::RefreshTLBWindow (void)
int count;
CTLB::TLB_ENTRY * tlb = g_TLB->m_tlb;
for (count = 0; count < 32; count ++)
for (count = 0; count < 32; count++)
{
sprintf(Output,"0x%02X",count);
sprintf(Output, "0x%02X", count);
item.mask = LVIF_TEXT;
item.iItem = count;
item.pszText = Output;
@ -128,91 +127,91 @@ void CDebugTlb::RefreshTLBWindow (void)
OldItem.mask = LVIF_TEXT;
OldItem.iItem = count;
OldItem.pszText = OldText;
OldItem.cchTextMax = sizeof( OldText )-1;
OldItem.cchTextMax = sizeof(OldText) - 1;
OldItem.iSubItem = 0;
if (ListView_GetItemCount(hList) <= count)
{
ListView_InsertItem(hList,&item);
ListView_InsertItem(hList, &item);
}
else
{
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
}
if (tlb[count].EntryDefined)
{
sprintf(Output,"0x%08X",tlb[count].PageMask.Value);
sprintf(Output, "0x%08X", tlb[count].PageMask.Value);
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 1;
OldItem.iSubItem = 1;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
if (tlb[count].EntryDefined)
{
sprintf(Output,"0x%08X",tlb[count].EntryHi.Value);
sprintf(Output, "0x%08X", tlb[count].EntryHi.Value);
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 2;
OldItem.iSubItem = 2;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
if (tlb[count].EntryDefined)
{
sprintf(Output,"0x%08X",tlb[count].EntryLo0.Value);
sprintf(Output, "0x%08X", tlb[count].EntryLo0.Value);
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 3;
OldItem.iSubItem = 3;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
if (tlb[count].EntryDefined)
{
sprintf(Output,"0x%08X",tlb[count].EntryLo1.Value);
sprintf(Output, "0x%08X", tlb[count].EntryLo1.Value);
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 4;
OldItem.iSubItem = 4;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
}
CTLB::FASTTLB * FastTlb = g_TLB->m_FastTlb;
hList = GetDlgItem(IDC_LIST2);
for (count = 0; count < 64; count ++)
for (count = 0; count < 64; count++)
{
sprintf(Output,"0x%02X",count);
sprintf(Output, "0x%02X", count);
item.mask = LVIF_TEXT;
item.iItem = count;
item.pszText = Output;
@ -221,70 +220,69 @@ void CDebugTlb::RefreshTLBWindow (void)
OldItem.mask = LVIF_TEXT;
OldItem.iItem = count;
OldItem.pszText = OldText;
OldItem.cchTextMax = sizeof( OldText )-1;
OldItem.cchTextMax = sizeof(OldText) - 1;
OldItem.iSubItem = 0;
if (ListView_GetItemCount(hList) <= count)
{
item.iItem = ListView_InsertItem(hList,&item);
item.iItem = ListView_InsertItem(hList, &item);
}
else
{
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
}
if (FastTlb[count].ValidEntry)
{
sprintf(Output,"%s",FastTlb[count].VALID?"Yes":"No");
sprintf(Output, "%s", FastTlb[count].VALID ? "Yes" : "No");
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 1;
OldItem.iSubItem = 1;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
if (FastTlb[count].ValidEntry && FastTlb[count].VALID)
{
sprintf(Output,"%s",FastTlb[count].DIRTY?"Yes":"No");
sprintf(Output, "%s", FastTlb[count].DIRTY ? "Yes" : "No");
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 2;
OldItem.iSubItem = 2;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
if (FastTlb[count].ValidEntry && FastTlb[count].VALID)
{
sprintf(Output,"%08X:%08X -> %08X:%08X",FastTlb[count].VSTART,FastTlb[count].VEND,
FastTlb[count].PHYSSTART,FastTlb[count].PHYSEND);
sprintf(Output, "%08X:%08X -> %08X:%08X", FastTlb[count].VSTART, FastTlb[count].VEND,
FastTlb[count].PHYSSTART, FastTlb[count].PHYSEND);
}
else
{
strcpy(Output,"................");
strcpy(Output, "................");
}
item.iSubItem = 3;
OldItem.iSubItem = 3;
ListView_GetItem(hList,&OldItem);
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
ListView_GetItem(hList, &OldItem);
if (strcmp(item.pszText, OldItem.pszText) != 0)
{
ListView_SetItem(hList,&item);
ListView_SetItem(hList, &item);
}
}
}
#endif

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -11,12 +11,11 @@
#pragma once
class CDebugTlb :
public CDebugDialog<CDebugTlb>
public CDebugDialog < CDebugTlb >
{
BEGIN_MSG_MAP_EX(CDebugTlb)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
@ -25,8 +24,8 @@ class CDebugTlb :
public:
enum { IDD = IDD_Debugger_TLB };
CDebugTlb(CDebugger * debugger);
CDebugTlb(CDebuggerUI * debugger);
virtual ~CDebugTlb(void);
void RefreshTLBWindow ( void );
void RefreshTLBWindow(void);
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,10 +10,9 @@
****************************************************************************/
#include "stdafx.h"
#ifdef WINDOWS_UI
#include "Debugger UI.h"
CDebugMemoryView::CDebugMemoryView(CDebugger * debugger) :
CDebugMemoryView::CDebugMemoryView(CDebuggerUI * debugger) :
CDebugDialog<CDebugMemoryView>(debugger),
m_MemoryList(NULL)
{
@ -32,8 +31,8 @@ LRESULT CDebugMemoryView::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM
{
m_DataStartLoc = (DWORD)-1;
m_CompareStartLoc = (DWORD)-1;
memset(m_CompareData,0,sizeof(m_CompareData));
memset(m_CompareValid,0,sizeof(m_CompareValid));
memset(m_CompareData, 0, sizeof(m_CompareData));
memset(m_CompareValid, 0, sizeof(m_CompareValid));
HWND hScrlBar = GetDlgItem(IDC_SCRL_BAR);
if (hScrlBar)
@ -46,72 +45,72 @@ LRESULT CDebugMemoryView::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM
si.nMax = 0xFFFF;
si.nPos = 0x8000;
si.nPage = 100;
::SetScrollInfo(hScrlBar,SB_CTL,&si,TRUE);
::SetScrollInfo(hScrlBar, SB_CTL, &si, TRUE);
}
m_MemAddr.Attach(GetDlgItem(IDC_ADDR_EDIT));
m_MemAddr.SetDisplayType(CEditNumber::DisplayHex);
m_MemAddr.SetValue(0x80000000,true,true);
m_MemAddr.SetValue(0x80000000, true, true);
SendDlgItemMessage( IDC_CHK_VADDR, BM_SETCHECK, BST_CHECKED,0);
SendDlgItemMessage(IDC_CHK_VADDR, BM_SETCHECK, BST_CHECKED, 0);
if (m_MemoryList== NULL)
if (m_MemoryList == NULL)
{
m_MemoryList = new CListCtrl;
m_MemoryList->RegisterClass();
}
m_MemoryList->SubclassWindow( GetDlgItem( IDC_MEM_DETAILS ) );
m_MemoryList->SubclassWindow(GetDlgItem(IDC_MEM_DETAILS));
m_MemoryList->ShowHeader(false);
m_MemoryList->SetSortEnabled(FALSE);
m_MemoryList->AddColumn( _T( "Address" ), 90 );
m_MemoryList->AddColumn( _T( "1" ), 20 );
m_MemoryList->AddColumn( _T( "2" ), 20 );
m_MemoryList->AddColumn( _T( "3" ), 20 );
m_MemoryList->AddColumn( _T( "4" ), 20 );
m_MemoryList->AddColumn( _T( "-" ), 10 );
m_MemoryList->AddColumn( _T( "5" ), 20 );
m_MemoryList->AddColumn( _T( "6" ), 20 );
m_MemoryList->AddColumn( _T( "7" ), 20 );
m_MemoryList->AddColumn( _T( "8" ), 20 );
m_MemoryList->AddColumn( _T( "-" ), 10 );
m_MemoryList->AddColumn( _T( "9" ), 20 );
m_MemoryList->AddColumn( _T( "10" ), 20 );
m_MemoryList->AddColumn( _T( "11" ), 20 );
m_MemoryList->AddColumn( _T( "12" ), 20 );
m_MemoryList->AddColumn( _T( "-" ), 10 );
m_MemoryList->AddColumn( _T( "13" ), 20 );
m_MemoryList->AddColumn( _T( "14" ), 20 );
m_MemoryList->AddColumn( _T( "15" ), 20 );
m_MemoryList->AddColumn( _T( "16" ), 35 );
m_MemoryList->AddColumn( _T( "Memory Ascii" ), 140 );
m_MemoryList->AddColumn(_T("Address"), 90);
m_MemoryList->AddColumn(_T("1"), 20);
m_MemoryList->AddColumn(_T("2"), 20);
m_MemoryList->AddColumn(_T("3"), 20);
m_MemoryList->AddColumn(_T("4"), 20);
m_MemoryList->AddColumn(_T("-"), 10);
m_MemoryList->AddColumn(_T("5"), 20);
m_MemoryList->AddColumn(_T("6"), 20);
m_MemoryList->AddColumn(_T("7"), 20);
m_MemoryList->AddColumn(_T("8"), 20);
m_MemoryList->AddColumn(_T("-"), 10);
m_MemoryList->AddColumn(_T("9"), 20);
m_MemoryList->AddColumn(_T("10"), 20);
m_MemoryList->AddColumn(_T("11"), 20);
m_MemoryList->AddColumn(_T("12"), 20);
m_MemoryList->AddColumn(_T("-"), 10);
m_MemoryList->AddColumn(_T("13"), 20);
m_MemoryList->AddColumn(_T("14"), 20);
m_MemoryList->AddColumn(_T("15"), 20);
m_MemoryList->AddColumn(_T("16"), 35);
m_MemoryList->AddColumn(_T("Memory Ascii"), 140);
::SetWindowLongPtr(m_MemoryList->m_hWnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE);
RefreshMemory(false);
int height = m_MemoryList->GetTotalHeight();
RECT MemoryListRect = {0};
::GetClientRect(GetDlgItem( IDC_MEM_DETAILS ), &MemoryListRect);
RECT MemoryListRect = { 0 };
::GetClientRect(GetDlgItem(IDC_MEM_DETAILS), &MemoryListRect);
if (height > MemoryListRect.bottom)
{
RECT MemoryListWindow = {0};
RECT MemoryListWindow = { 0 };
GetWindowRect(&MemoryListWindow);
SetWindowPos(NULL,0,0,MemoryListWindow.right - MemoryListWindow.left,(MemoryListWindow.bottom - MemoryListWindow.top) + (height - MemoryListRect.bottom), SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER);
SetWindowPos(NULL, 0, 0, MemoryListWindow.right - MemoryListWindow.left, (MemoryListWindow.bottom - MemoryListWindow.top) + (height - MemoryListRect.bottom), SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOZORDER);
RECT DlgItemRect = {0};
::GetWindowRect(GetDlgItem( IDC_BORDER ), &DlgItemRect);
::SetWindowPos(GetDlgItem( IDC_BORDER ), NULL,0,0,DlgItemRect.right - DlgItemRect.left,(DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
RECT DlgItemRect = { 0 };
::GetWindowRect(GetDlgItem(IDC_BORDER), &DlgItemRect);
::SetWindowPos(GetDlgItem(IDC_BORDER), NULL, 0, 0, DlgItemRect.right - DlgItemRect.left, (DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
::GetWindowRect(GetDlgItem( IDC_MEM_DETAILS ), &DlgItemRect);
::SetWindowPos(GetDlgItem( IDC_MEM_DETAILS ), NULL,0,0,DlgItemRect.right - DlgItemRect.left,(DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
::GetWindowRect(GetDlgItem(IDC_MEM_DETAILS), &DlgItemRect);
::SetWindowPos(GetDlgItem(IDC_MEM_DETAILS), NULL, 0, 0, DlgItemRect.right - DlgItemRect.left, (DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
::GetWindowRect(GetDlgItem( IDC_SCRL_BAR ), &DlgItemRect);
::SetWindowPos(GetDlgItem( IDC_SCRL_BAR ), NULL,0,0,DlgItemRect.right - DlgItemRect.left,(DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
::GetWindowRect(GetDlgItem(IDC_SCRL_BAR), &DlgItemRect);
::SetWindowPos(GetDlgItem(IDC_SCRL_BAR), NULL, 0, 0, DlgItemRect.right - DlgItemRect.left, (DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
}
WindowCreated();
return TRUE;
}
LRESULT CDebugMemoryView::OnDestroy ( void )
LRESULT CDebugMemoryView::OnDestroy(void)
{
if (m_MemoryList)
{
@ -122,7 +121,7 @@ LRESULT CDebugMemoryView::OnDestroy ( void )
return 0;
}
LRESULT CDebugMemoryView::OnClicked (WORD /*wNotifyCode*/, WORD wID, HWND , BOOL& /*bHandled*/)
LRESULT CDebugMemoryView::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND, BOOL& /*bHandled*/)
{
switch (wID)
{
@ -145,9 +144,9 @@ LRESULT CDebugMemoryView::OnClicked (WORD /*wNotifyCode*/, WORD wID, HWND , BOOL
return FALSE;
}
LRESULT CDebugMemoryView::OnMemoryModified ( LPNMHDR lpNMHDR )
LRESULT CDebugMemoryView::OnMemoryModified(LPNMHDR lpNMHDR)
{
CListNotify *pListNotify = reinterpret_cast<CListNotify *>( lpNMHDR );
CListNotify *pListNotify = reinterpret_cast<CListNotify *>(lpNMHDR);
int LineNumber = pListNotify->m_nItem;
int Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 1));
if (pListNotify->m_nSubItem >= 6 && pListNotify->m_nSubItem < 10)
@ -163,7 +162,7 @@ LRESULT CDebugMemoryView::OnMemoryModified ( LPNMHDR lpNMHDR )
Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 4));
}
LPCSTR strValue = m_MemoryList->GetItemText(pListNotify->m_nItem,pListNotify->m_nSubItem);
LPCSTR strValue = m_MemoryList->GetItemText(pListNotify->m_nItem, pListNotify->m_nSubItem);
int Finish = strlen(strValue);
if (Finish > 8)
{
@ -198,26 +197,26 @@ LRESULT CDebugMemoryView::OnMemoryModified ( LPNMHDR lpNMHDR )
// copy current data for change comparison
m_CompareStartLoc = m_DataStartLoc;
m_CompareVAddrr = m_DataVAddrr;
memcpy(m_CompareData,m_CurrentData,sizeof(m_CurrentData));
memcpy(m_CompareValid,m_DataValid,sizeof(m_CompareValid));
memcpy(m_CompareData, m_CurrentData, sizeof(m_CurrentData));
memcpy(m_CompareValid, m_DataValid, sizeof(m_CompareValid));
}
m_CompareData[Pos] = m_CurrentData[Pos];
m_CurrentData[Pos] = (BYTE)Value;
//sb
if ( m_DataVAddrr )
if (m_DataVAddrr)
{
if (!g_MMU->SB_VAddr(m_DataStartLoc + Pos,(BYTE)Value))
if (!g_MMU->SB_VAddr(m_DataStartLoc + Pos, (BYTE)Value))
{
WriteTraceF(TraceError,__FUNCTION__ ": failed to store at %X",m_DataStartLoc + Pos);
WriteTraceF(TraceError, __FUNCTION__ ": failed to store at %X", m_DataStartLoc + Pos);
}
}
else
{
if (!g_MMU->SB_PAddr(m_DataStartLoc + Pos,(BYTE)Value))
if (!g_MMU->SB_PAddr(m_DataStartLoc + Pos, (BYTE)Value))
{
WriteTraceF(TraceError,__FUNCTION__ ": failed to store at %X",m_DataStartLoc + Pos);
WriteTraceF(TraceError, __FUNCTION__ ": failed to store at %X", m_DataStartLoc + Pos);
}
}
Insert_MemoryLineDump(LineNumber);
@ -232,37 +231,37 @@ void CDebugMemoryView::ShowAddress(DWORD Address, bool VAddr)
return;
}
SendDlgItemMessage( IDC_CHK_VADDR, BM_SETCHECK, VAddr ? BST_CHECKED : BST_UNCHECKED,0);
m_MemAddr.SetValue(Address,true,true);
RefreshMemory (true);
SendDlgItemMessage(IDC_CHK_VADDR, BM_SETCHECK, VAddr ? BST_CHECKED : BST_UNCHECKED, 0);
m_MemAddr.SetValue(Address, true, true);
RefreshMemory(true);
}
void CDebugMemoryView::Insert_MemoryLineDump ( int LineNumber )
void CDebugMemoryView::Insert_MemoryLineDump(int LineNumber)
{
if (m_MemoryList == NULL || m_MemoryList->GetColumnCount() == 0)
{
return;
}
char Output[20], Hex[60], Ascii[20], AsciiAddOn[15];
sprintf(Output,"0x%08X",m_DataStartLoc + (LineNumber << 4));
sprintf(Output, "0x%08X", m_DataStartLoc + (LineNumber << 4));
if (m_MemoryList->GetItemCount() <= LineNumber)
{
HFONT hFont = (HFONT)GetStockObject(ANSI_FIXED_FONT);
m_MemoryList->AddItemAt( LineNumber, Output);
m_MemoryList->AddItemAt(LineNumber, Output);
for (int i = 0; i < m_MemoryList->GetColumnCount(); i++)
{
m_MemoryList->SetItemFont( LineNumber, i, hFont );
m_MemoryList->SetItemFont(LineNumber, i, hFont);
if (i == 5 || i == 10 || i == 15)
{
m_MemoryList->SetItemText(LineNumber,i,"-");
m_MemoryList->SetItemText(LineNumber, i, "-");
}
}
}
else
{
if ( strcmp( Output, m_MemoryList->GetItemText(LineNumber, 0) ) != 0 )
if (strcmp(Output, m_MemoryList->GetItemText(LineNumber, 0)) != 0)
{
m_MemoryList->SetItemText(LineNumber,0,Output);
m_MemoryList->SetItemText(LineNumber, 0, Output);
}
}
@ -270,7 +269,7 @@ void CDebugMemoryView::Insert_MemoryLineDump ( int LineNumber )
Ascii[0] = 0;
int CompareStartPos = m_DataStartLoc - m_CompareStartLoc;
for (int i = 0, col = 1; i < 0x10; i ++, col ++)
for (int i = 0, col = 1; i < 0x10; i++, col++)
{
int Pos = ((LineNumber << 4) + i);
if (m_DataValid[Pos])
@ -285,30 +284,30 @@ void CDebugMemoryView::Insert_MemoryLineDump ( int LineNumber )
{
Changed = true;
}
sprintf(Hex,"%02X",m_CurrentData[Pos]);
m_MemoryList->SetItemText(LineNumber,col,Hex);
m_MemoryList->SetItemFormat( LineNumber,col, ITEM_FORMAT_EDIT, ITEM_FLAGS_EDIT_HEX );
m_MemoryList->SetItemMaxEditLen( LineNumber,col , 2);
m_MemoryList->SetItemColours( LineNumber, col, GetSysColor( COLOR_WINDOW ),
Changed ? RGB( 255, 0, 0 ) : GetSysColor( COLOR_WINDOWTEXT ) );
m_MemoryList->SetItemHighlightColours( LineNumber, col,
Changed ? RGB( 255, 0, 0 ) : GetSysColor( COLOR_HIGHLIGHTTEXT ) );
sprintf(Hex, "%02X", m_CurrentData[Pos]);
m_MemoryList->SetItemText(LineNumber, col, Hex);
m_MemoryList->SetItemFormat(LineNumber, col, ITEM_FORMAT_EDIT, ITEM_FLAGS_EDIT_HEX);
m_MemoryList->SetItemMaxEditLen(LineNumber, col, 2);
m_MemoryList->SetItemColours(LineNumber, col, GetSysColor(COLOR_WINDOW),
Changed ? RGB(255, 0, 0) : GetSysColor(COLOR_WINDOWTEXT));
m_MemoryList->SetItemHighlightColours(LineNumber, col,
Changed ? RGB(255, 0, 0) : GetSysColor(COLOR_HIGHLIGHTTEXT));
if (m_CurrentData[Pos] < 30)
{
strcat(Ascii,".");
strcat(Ascii, ".");
}
else
{
sprintf(AsciiAddOn,"%c",m_CurrentData[Pos]);
strcat(Ascii,AsciiAddOn);
sprintf(AsciiAddOn, "%c", m_CurrentData[Pos]);
strcat(Ascii, AsciiAddOn);
}
}
else
{
m_MemoryList->SetItemText(LineNumber,col,"**");
m_MemoryList->SetItemFormat( LineNumber,col, ITEM_FORMAT_NONE, ITEM_FLAGS_NONE );
m_MemoryList->SetItemColours( LineNumber, col, GetSysColor( COLOR_WINDOW ), GetSysColor( COLOR_WINDOWTEXT ) );
strcat(Ascii,"*");
m_MemoryList->SetItemText(LineNumber, col, "**");
m_MemoryList->SetItemFormat(LineNumber, col, ITEM_FORMAT_NONE, ITEM_FLAGS_NONE);
m_MemoryList->SetItemColours(LineNumber, col, GetSysColor(COLOR_WINDOW), GetSysColor(COLOR_WINDOWTEXT));
strcat(Ascii, "*");
}
if (i != 0xF)
{
@ -319,18 +318,18 @@ void CDebugMemoryView::Insert_MemoryLineDump ( int LineNumber )
}
}
if ( strcmp( Ascii, m_MemoryList->GetItemText(LineNumber, 20) ) != 0 )
if (strcmp(Ascii, m_MemoryList->GetItemText(LineNumber, 20)) != 0)
{
m_MemoryList->SetItemText(LineNumber,20,Ascii);
m_MemoryList->SetItemText(LineNumber, 20, Ascii);
}
}
void CDebugMemoryView::OnAddrChanged( UINT /*Code*/, int /*id*/, HWND /*ctl*/ )
void CDebugMemoryView::OnAddrChanged(UINT /*Code*/, int /*id*/, HWND /*ctl*/)
{
RefreshMemory(false);
}
void CDebugMemoryView::OnVScroll(int request, short Pos, HWND ctrl )
void CDebugMemoryView::OnVScroll(int request, short Pos, HWND ctrl)
{
if (ctrl != GetDlgItem(IDC_SCRL_BAR))
{
@ -340,26 +339,26 @@ void CDebugMemoryView::OnVScroll(int request, short Pos, HWND ctrl )
switch (request)
{
case SB_LINEDOWN:
m_MemAddr.SetValue(Location < 0xFFFFFFEF ? Location + 0x10 : 0xFFFFFFFF,true,true);
m_MemAddr.SetValue(Location < 0xFFFFFFEF ? Location + 0x10 : 0xFFFFFFFF, true, true);
break;
case SB_LINEUP:
m_MemAddr.SetValue(Location > 0x10 ? Location - 0x10 : 0,true,true);
m_MemAddr.SetValue(Location > 0x10 ? Location - 0x10 : 0, true, true);
break;
case SB_PAGEDOWN:
m_MemAddr.SetValue(Location < 0xFFFFFEFF ? Location + 0x100 : 0xFFFFFFFF,true,true);
m_MemAddr.SetValue(Location < 0xFFFFFEFF ? Location + 0x100 : 0xFFFFFFFF, true, true);
break;
case SB_PAGEUP:
m_MemAddr.SetValue(Location > 0x100 ? Location - 0x100 : 0,true,true);
m_MemAddr.SetValue(Location > 0x100 ? Location - 0x100 : 0, true, true);
break;
case SB_THUMBPOSITION:
m_MemAddr.SetValue((DWORD)Pos << 0x10,true,true);
m_MemAddr.SetValue((DWORD)Pos << 0x10, true, true);
break;
default:
break;
}
}
void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
void CDebugMemoryView::RefreshMemory(bool ResetCompare)
{
if (m_MemoryList && m_MemoryList->GetHasEditItem())
{
@ -377,7 +376,7 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
si.nPos = NewAddress >> 0x10;
::SetScrollInfo(hScrlBar,SB_CTL,&si,TRUE);
::SetScrollInfo(hScrlBar, SB_CTL, &si, TRUE);
}
}
@ -386,22 +385,22 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
// copy current data for change comparison
m_CompareStartLoc = m_DataStartLoc;
m_CompareVAddrr = m_DataVAddrr;
memcpy(m_CompareData,m_CurrentData,sizeof(m_CurrentData));
memcpy(m_CompareValid,m_DataValid,sizeof(m_CompareValid));
memcpy(m_CompareData, m_CurrentData, sizeof(m_CurrentData));
memcpy(m_CompareValid, m_DataValid, sizeof(m_CompareValid));
}
m_DataStartLoc = m_MemAddr.GetValue();
if (m_DataStartLoc > 0xFFFFFF00) { m_DataStartLoc = 0xFFFFFF00; }
int WritePos = 0;
m_DataVAddrr = (SendDlgItemMessage( IDC_CHK_VADDR, BM_GETCHECK, 0,0) & BST_CHECKED) != 0;
m_DataVAddrr = (SendDlgItemMessage(IDC_CHK_VADDR, BM_GETCHECK, 0, 0) & BST_CHECKED) != 0;
if ((m_DataStartLoc & 3) != 0)
{
MIPS_WORD word;
bool ValidData = true;
if ( m_DataVAddrr )
if (m_DataVAddrr)
{
if (!g_MMU->LW_VAddr(m_DataStartLoc & ~3, word.UW))
{
@ -430,7 +429,6 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
}
}
WritePos = 4 - Offset;
}
for (DWORD Pos = ((m_DataStartLoc + 3) & ~3); Pos < (m_DataStartLoc + MemoryToDisplay); WritePos += 4, Pos += 4)
@ -438,7 +436,7 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
MIPS_WORD word;
bool ValidData = true;
if ( m_DataVAddrr )
if (m_DataVAddrr)
{
if (!g_MMU->LW_VAddr(Pos, word.UW))
{
@ -455,7 +453,7 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
for (int i = 0; i < 4; i++)
{
if ((WritePos + i)>= MemoryToDisplay)
if ((WritePos + i) >= MemoryToDisplay)
{
break;
}
@ -467,9 +465,8 @@ void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
}
}
for (int count = 0 ; count < 16;count ++)
for (int count = 0; count < 16; count++)
{
Insert_MemoryLineDump ( count );
Insert_MemoryLineDump(count);
}
}
#endif

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -11,13 +11,21 @@
#pragma once
class CDebugMemoryView :
public CDebugDialog<CDebugMemoryView>
public CDebugDialog < CDebugMemoryView >
{
public:
enum { IDD = IDD_Debugger_Memory };
CDebugMemoryView(CDebuggerUI * debugger);
virtual ~CDebugMemoryView(void);
void ShowAddress(DWORD Address, bool VAddr);
private:
BEGIN_MSG_MAP_EX(CDebugMemoryView)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
COMMAND_HANDLER_EX(IDC_ADDR_EDIT,EN_CHANGE,OnAddrChanged)
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
COMMAND_HANDLER_EX(IDC_ADDR_EDIT, EN_CHANGE, OnAddrChanged)
NOTIFY_HANDLER_EX(IDC_MEM_DETAILS, LCN_MODIFIED, OnMemoryModified)
MSG_WM_DESTROY(OnDestroy)
MSG_WM_VSCROLL(OnVScroll)
@ -25,15 +33,15 @@ class CDebugMemoryView :
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
void OnAddrChanged( UINT Code, int id, HWND ctl );
void OnVScroll(int request, short Pos, HWND ctrl );
LRESULT OnMemoryModified ( LPNMHDR lpNMHDR );
LRESULT OnDestroy ( void );
void OnAddrChanged(UINT Code, int id, HWND ctl);
void OnVScroll(int request, short Pos, HWND ctrl);
LRESULT OnMemoryModified(LPNMHDR lpNMHDR);
LRESULT OnDestroy(void);
void Insert_MemoryLineDump ( int LineNumber );
void RefreshMemory ( bool ResetCompare );
void Insert_MemoryLineDump(int LineNumber);
void RefreshMemory(bool ResetCompare);
enum { MemoryToDisplay = 0x100};
enum { MemoryToDisplay = 0x100 };
CEditNumber m_MemAddr;
CListCtrl * m_MemoryList;
@ -47,12 +55,4 @@ class CDebugMemoryView :
bool m_CompareVAddrr;
BYTE m_CompareData[MemoryToDisplay];
bool m_CompareValid[MemoryToDisplay];
public:
enum { IDD = IDD_Debugger_Memory };
CDebugMemoryView(CDebugger * debugger);
virtual ~CDebugMemoryView(void);
void ShowAddress (DWORD Address, bool VAddr);
};

View File

@ -1,41 +1,4 @@
////#define _WIN32_WINNT 0x0500
//#include <atlbase.h>
//#include <wtl/atlapp.h>
////#include <atlbase.h>
////#include <atlapp.h>
//class CPj64Module :
// public CAppModule
//{
//public:
// CPj64Module(void)
// {
// Init(NULL, GetModuleHandle(NULL));
// }
// virtual ~CPj64Module(void)
// {
// Term();
// }
//};
//
//
//extern CPj64Module _Module;
//
//#define _WTL_NO_CSTRING
//
//#include <atlwin.h>
//#include <wtl/atlmisc.h>
//#include <wtl/atlcrack.h>
//
//#include <wtl/atlframe.h>
//#include <wtl/atlctrls.h>
//#include <wtl/atldlgs.h>
//
//#include "../../Support.h"
//#include "Control/numberctrl.h"
//#include "Control/ClistCtrl/ListCtrl.h"
#pragma once
#include "../../WTL App.h"
#include "../../N64 System.h"

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -9,26 +9,36 @@
* *
****************************************************************************/
#include "stdafx.h"
#ifdef WINDOWS_UI
#include "Debugger UI.h"
CPj64Module _Module;
CDebugger::CDebugger () :
CDebuggerUI::CDebuggerUI () :
m_MemoryDump(NULL),
m_MemoryView(NULL),
m_MemorySearch(NULL),
m_DebugTLB(NULL)
{
g_Settings->RegisterChangeCB(GameRunning_InReset,this,(CSettings::SettingChangedFunc)GameReset);
g_Debugger = this;
}
CDebugger::~CDebugger (void)
CDebuggerUI::~CDebuggerUI (void)
{
g_Settings->UnregisterChangeCB(GameRunning_InReset,this,(CSettings::SettingChangedFunc)GameReset);
Debug_Reset();
}
void CDebugger::Debug_Reset ( void )
void CDebuggerUI::GameReset ( CDebuggerUI * _this )
{
if (!g_Settings->LoadBool(GameRunning_InReset))
{
return;
}
_this->Debug_Reset();
}
void CDebuggerUI::Debug_Reset ( void )
{
if (m_MemoryDump)
{
@ -56,7 +66,7 @@ void CDebugger::Debug_Reset ( void )
}
}
void CDebugger::Debug_ShowMemoryDump()
void CDebuggerUI::Debug_ShowMemoryDump()
{
if (g_MMU == NULL)
{
@ -72,7 +82,7 @@ void CDebugger::Debug_ShowMemoryDump()
}
}
void CDebugger::Debug_ShowMemoryWindow ( void )
void CDebuggerUI::Debug_ShowMemoryWindow ( void )
{
if (g_MMU == NULL)
{
@ -88,7 +98,7 @@ void CDebugger::Debug_ShowMemoryWindow ( void )
}
}
void CDebugger::Debug_ShowMemoryLocation ( DWORD Address, bool VAddr )
void CDebuggerUI::Debug_ShowMemoryLocation ( uint32_t Address, bool VAddr )
{
Debug_ShowMemoryWindow();
if (m_MemoryView)
@ -97,7 +107,7 @@ void CDebugger::Debug_ShowMemoryLocation ( DWORD Address, bool VAddr )
}
}
void CDebugger::Debug_ShowTLBWindow (void)
void CDebuggerUI::Debug_ShowTLBWindow (void)
{
if (g_MMU == NULL)
{
@ -113,7 +123,7 @@ void CDebugger::Debug_ShowTLBWindow (void)
}
}
void CDebugger::Debug_RefreshTLBWindow(void)
void CDebuggerUI::Debug_RefreshTLBWindow(void)
{
if (m_DebugTLB)
{
@ -121,7 +131,7 @@ void CDebugger::Debug_RefreshTLBWindow(void)
}
}
void CDebugger::Debug_ShowMemorySearch()
void CDebuggerUI::Debug_ShowMemorySearch()
{
if (m_MemorySearch == NULL)
{
@ -132,4 +142,8 @@ void CDebugger::Debug_ShowMemorySearch()
m_MemorySearch->ShowWindow();
}
}
#endif
void CDebuggerUI::TLBChanged()
{
Debug_RefreshTLBWindow();
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -13,8 +13,15 @@
class CDumpMemory;
class CDebugMemoryView;
class CDebugMemorySearch;
class CDebugTlb;
class CDebugger
__interface CDebugger
{
virtual void TLBChanged ( void ) = 0;
};
class CDebuggerUI :
public CDebugger
{
CDumpMemory * m_MemoryDump;
CDebugMemoryView * m_MemoryView;
@ -22,16 +29,19 @@ class CDebugger
CDebugTlb * m_DebugTLB;
protected:
CDebugger();
virtual ~CDebugger();
CDebuggerUI();
virtual ~CDebuggerUI();
void TLBChanged ( void );
public:
void Debug_Reset ( void );
void Debug_ShowMemoryDump ( void );
void Debug_ShowMemoryWindow ( void );
void Debug_ShowMemoryLocation ( DWORD Address, bool VAddr );
void Debug_ShowMemoryLocation ( uint32_t Address, bool VAddr );
void Debug_ShowMemorySearch ( void );
void Debug_ShowTLBWindow ( void );
void Debug_RefreshTLBWindow ( void );
static void GameReset ( CDebuggerUI * _this );
};

View File

@ -0,0 +1,96 @@
/****************************************************************************
* *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
#include "stdafx.h"
#include <Project64\N64 System\N64 Class.h>
#include <common/Util.h>
#include <Windows.h>
#include <Objbase.h>
void CN64System::StartEmulationThead()
{
ThreadInfo * Info = new ThreadInfo;
HANDLE * hThread = new HANDLE;
*hThread = NULL;
//create the needed info into a structure to pass as one parameter
//for creating a thread
Info->ThreadHandle = hThread;
*hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)StartEmulationThread, Info, 0, (LPDWORD)&Info->ThreadID);
}
void CN64System::StartEmulationThread(ThreadInfo * Info)
{
if (g_Settings->LoadBool(Setting_CN64TimeCritical))
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
}
CoInitialize(NULL);
EmulationStarting(Info->ThreadHandle, Info->ThreadID);
delete ((HANDLE *)Info->ThreadHandle);
delete Info;
CoUninitialize();
}
void CN64System::CloseCpu()
{
if (m_CPU_Handle == NULL)
{
return;
}
m_EndEmulation = true;
if (g_Settings->LoadBool(GameRunning_CPU_Paused))
{
m_hPauseEvent.Trigger();
}
if (GetCurrentThreadId() == m_CPU_ThreadID)
{
ExternalEvent(SysEvent_CloseCPU);
return;
}
HANDLE hThread = m_CPU_Handle;
m_CPU_Handle = NULL;
for (int count = 0; count < 200; count++)
{
pjutil::Sleep(100);
if (g_Notify->ProcessGuiMessages())
{
return;
}
DWORD ExitCode;
if (GetExitCodeThread(hThread, &ExitCode))
{
if (ExitCode != STILL_ACTIVE)
{
break;
}
}
}
if (hThread)
{
DWORD ExitCode;
GetExitCodeThread(hThread, &ExitCode);
if (ExitCode == STILL_ACTIVE)
{
TerminateThread(hThread, 0);
}
}
CloseHandle(hThread);
CpuStopped();
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -12,12 +12,12 @@
R4300iOp::Func * CInterpreterCPU::m_R4300i_Opcode = NULL;
void ExecuteInterpreterOps (DWORD /*Cycles*/)
void ExecuteInterpreterOps(uint32_t /*Cycles*/)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2)
{
OPCODE Command;
@ -87,7 +87,7 @@ bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
default:
if (g_Settings->LoadBool(Debugger_Enabled))
{
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?",R4300iOpcodeName(Command.Hex,PC+4), PC).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?", R4300iOpcodeName(Command.Hex, PC + 4), PC).ToUTF16().c_str());
}
return true;
}
@ -107,7 +107,7 @@ bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
}
break;
default:
if ( (Command.rs & 0x10 ) != 0 )
if ((Command.rs & 0x10) != 0)
{
switch (Command.funct)
{
@ -118,7 +118,7 @@ bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
default:
if (g_Settings->LoadBool(Debugger_Enabled))
{
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?\n6",R4300iOpcodeName(Command.Hex,PC+4), PC).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?\n6", R4300iOpcodeName(Command.Hex, PC + 4), PC).ToUTF16().c_str());
}
return true;
}
@ -127,7 +127,7 @@ bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
{
if (g_Settings->LoadBool(Debugger_Enabled))
{
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?\n7",R4300iOpcodeName(Command.Hex,PC+4), PC).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?\n7", R4300iOpcodeName(Command.Hex, PC + 4), PC).ToUTF16().c_str());
}
return true;
}
@ -156,7 +156,7 @@ bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
default:
if (g_Settings->LoadBool(Debugger_Enabled))
{
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?",R4300iOpcodeName(Command.Hex,PC+4), PC).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?", R4300iOpcodeName(Command.Hex, PC + 4), PC).ToUTF16().c_str());
}
return true;
}
@ -204,7 +204,7 @@ bool DelaySlotEffectsCompare (DWORD PC, DWORD Reg1, DWORD Reg2)
default:
if (g_Settings->LoadBool(Debugger_Enabled))
{
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?",R4300iOpcodeName(Command.Hex,PC+4), PC).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Does %s effect Delay slot at %X?", R4300iOpcodeName(Command.Hex, PC + 4), PC).ToUTF16().c_str());
}
return true;
}
@ -236,10 +236,10 @@ void CInterpreterCPU::InPermLoop()
//}
/* Interrupts enabled */
if (( g_Reg->STATUS_REGISTER & STATUS_IE ) == 0 ||
( g_Reg->STATUS_REGISTER & STATUS_EXL ) != 0 ||
( g_Reg->STATUS_REGISTER & STATUS_ERL ) != 0 ||
( g_Reg->STATUS_REGISTER & 0xFF00) == 0)
if ((g_Reg->STATUS_REGISTER & STATUS_IE) == 0 ||
(g_Reg->STATUS_REGISTER & STATUS_EXL) != 0 ||
(g_Reg->STATUS_REGISTER & STATUS_ERL) != 0 ||
(g_Reg->STATUS_REGISTER & 0xFF00) == 0)
{
if (g_Plugins->Gfx()->UpdateScreen != NULL)
{
@ -264,13 +264,13 @@ void CInterpreterCPU::InPermLoop()
void CInterpreterCPU::ExecuteCPU()
{
bool & Done = g_System->m_EndEmulation;
DWORD & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
uint32_t & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
OPCODE & Opcode = R4300iOp::m_Opcode;
DWORD & JumpToLocation = R4300iOp::m_JumpToLocation;
uint32_t & JumpToLocation = R4300iOp::m_JumpToLocation;
bool & TestTimer = R4300iOp::m_TestTimer;
const BOOL & bDoSomething= g_SystemEvents->DoSomething();
DWORD CountPerOp = g_System->CountPerOp();
int & NextTimer = *g_NextTimer;
const int32_t & bDoSomething = g_SystemEvents->DoSomething();
uint32_t CountPerOp = g_System->CountPerOp();
int32_t & NextTimer = *g_NextTimer;
__try
{
@ -284,7 +284,7 @@ void CInterpreterCPU::ExecuteCPU()
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s t9: %08X v1: %08X",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER),_GPR[0x19].UW[0],_GPR[0x03].UW[0]);
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %d %d",*_PROGRAM_COUNTER,*g_NextTimer,g_SystemTimer->CurrentType());
}*/
m_R4300i_Opcode[ Opcode.op ]();
m_R4300i_Opcode[Opcode.op]();
NextTimer -= CountPerOp;
switch (R4300iOp::m_NextInstruction)
@ -302,7 +302,7 @@ void CInterpreterCPU::ExecuteCPU()
break;
case JUMP:
{
BOOL CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
bool CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
PROGRAM_COUNTER = JumpToLocation;
R4300iOp::m_NextInstruction = NORMAL;
if (CheckTimer)
@ -330,32 +330,31 @@ void CInterpreterCPU::ExecuteCPU()
}
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
}
else
{
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP,PROGRAM_COUNTER);
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP, PROGRAM_COUNTER);
R4300iOp::m_NextInstruction = NORMAL;
}
}
} __except( g_MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
}
__except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation()))
{
g_Notify->DisplayError(GS(MSG_UNKNOWN_MEM_ACTION));
ExitThread(0);
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
}
}
void CInterpreterCPU::ExecuteOps(int Cycles)
void CInterpreterCPU::ExecuteOps(int32_t Cycles)
{
bool & Done = g_System->m_EndEmulation;
DWORD & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
uint32_t & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
OPCODE & Opcode = R4300iOp::m_Opcode;
DWORD & JumpToLocation = R4300iOp::m_JumpToLocation;
uint32_t & JumpToLocation = R4300iOp::m_JumpToLocation;
bool & TestTimer = R4300iOp::m_TestTimer;
const BOOL & DoSomething = g_SystemEvents->DoSomething();
DWORD CountPerOp = g_System->CountPerOp();
const int32_t & DoSomething = g_SystemEvents->DoSomething();
uint32_t CountPerOp = g_System->CountPerOp();
__try
{
@ -381,13 +380,13 @@ void CInterpreterCPU::ExecuteOps(int Cycles)
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s t9: %08X v1: %08X",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER),_GPR[0x19].UW[0],_GPR[0x03].UW[0]);
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %d %d",*_PROGRAM_COUNTER,*g_NextTimer,g_SystemTimer->CurrentType());
}*/
m_R4300i_Opcode[ Opcode.op ]();
m_R4300i_Opcode[Opcode.op]();
_GPR[0].DW = 0; /* MIPS $zero hard-wired to 0 */
Cycles -= CountPerOp;
*g_NextTimer -= CountPerOp;
/*static DWORD TestAddress = 0x80077B0C, TestValue = 0, CurrentValue = 0;
/*static uint32_t TestAddress = 0x80077B0C, TestValue = 0, CurrentValue = 0;
if (g_MMU->LW_VAddr(TestAddress, TestValue))
{
if (TestValue != CurrentValue)
@ -412,7 +411,7 @@ void CInterpreterCPU::ExecuteOps(int Cycles)
break;
case JUMP:
{
BOOL CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
bool CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
PROGRAM_COUNTER = JumpToLocation;
R4300iOp::m_NextInstruction = NORMAL;
if (CheckTimer)
@ -440,18 +439,18 @@ void CInterpreterCPU::ExecuteOps(int Cycles)
}
break;
default:
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
}
else
{
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP,PROGRAM_COUNTER);
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP, PROGRAM_COUNTER);
R4300iOp::m_NextInstruction = NORMAL;
}
}
} __except( g_MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
}
__except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation()))
{
g_Notify->DisplayError(GS(MSG_UNKNOWN_MEM_ACTION));
ExitThread(0);
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
}
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,13 +10,15 @@
****************************************************************************/
#pragma once
#include <Project64\N64 System\Interpreter\Interpreter Ops.h>
class CInterpreterCPU :
private R4300iOp
{
public:
static void BuildCPU();
static void ExecuteCPU();
static void ExecuteOps(int Cycles);
static void ExecuteOps(int32_t Cycles);
static void InPermLoop();
private:

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -9,9 +9,9 @@
* *
****************************************************************************/
#include "stdafx.h"
//#include "../C Core/Logging.h"
#include <Project64\Logging.h>
bool DelaySlotEffectsCompare ( DWORD PC, DWORD Reg1, DWORD Reg2 );
bool DelaySlotEffectsCompare(uint32_t PC, uint32_t Reg1, uint32_t Reg2);
#define ADDRESS_ERROR_EXCEPTION(Address,FromRead) \
g_Reg->DoAddressError(m_NextInstruction == JUMP,Address,FromRead);\
@ -36,16 +36,16 @@ bool DelaySlotEffectsCompare ( DWORD PC, DWORD Reg1, DWORD Reg2 );
R4300iOp32::Func * R4300iOp32::BuildInterpreter()
{
Jump_Opcode[ 0] = SPECIAL;
Jump_Opcode[ 1] = REGIMM;
Jump_Opcode[ 2] = R4300iOp::J;
Jump_Opcode[ 3] = JAL;
Jump_Opcode[ 4] = BEQ;
Jump_Opcode[ 5] = BNE;
Jump_Opcode[ 6] = BLEZ;
Jump_Opcode[ 7] = BGTZ;
Jump_Opcode[ 8] = ADDI;
Jump_Opcode[ 9] = ADDIU;
Jump_Opcode[0] = SPECIAL;
Jump_Opcode[1] = REGIMM;
Jump_Opcode[2] = R4300iOp::J;
Jump_Opcode[3] = JAL;
Jump_Opcode[4] = BEQ;
Jump_Opcode[5] = BNE;
Jump_Opcode[6] = BLEZ;
Jump_Opcode[7] = BGTZ;
Jump_Opcode[8] = ADDI;
Jump_Opcode[9] = ADDIU;
Jump_Opcode[10] = SLTI;
Jump_Opcode[11] = SLTIU;
Jump_Opcode[12] = ANDI;
@ -101,16 +101,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Opcode[62] = R4300iOp::UnknownOpcode;
Jump_Opcode[63] = R4300iOp::SD;
Jump_Special[ 0] = SPECIAL_SLL;
Jump_Special[ 1] = R4300iOp::UnknownOpcode;
Jump_Special[ 2] = SPECIAL_SRL;
Jump_Special[ 3] = SPECIAL_SRA;
Jump_Special[ 4] = SPECIAL_SLLV;
Jump_Special[ 5] = R4300iOp::UnknownOpcode;
Jump_Special[ 6] = SPECIAL_SRLV;
Jump_Special[ 7] = SPECIAL_SRAV;
Jump_Special[ 8] = SPECIAL_JR;
Jump_Special[ 9] = SPECIAL_JALR;
Jump_Special[0] = SPECIAL_SLL;
Jump_Special[1] = R4300iOp::UnknownOpcode;
Jump_Special[2] = SPECIAL_SRL;
Jump_Special[3] = SPECIAL_SRA;
Jump_Special[4] = SPECIAL_SLLV;
Jump_Special[5] = R4300iOp::UnknownOpcode;
Jump_Special[6] = SPECIAL_SRLV;
Jump_Special[7] = SPECIAL_SRAV;
Jump_Special[8] = SPECIAL_JR;
Jump_Special[9] = SPECIAL_JALR;
Jump_Special[10] = R4300iOp::UnknownOpcode;
Jump_Special[11] = R4300iOp::UnknownOpcode;
Jump_Special[12] = R4300iOp::SPECIAL_SYSCALL;
@ -166,16 +166,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Special[62] = R4300iOp::SPECIAL_DSRL32;
Jump_Special[63] = R4300iOp::SPECIAL_DSRA32;
Jump_Regimm[ 0] = REGIMM_BLTZ;
Jump_Regimm[ 1] = REGIMM_BGEZ;
Jump_Regimm[ 2] = REGIMM_BLTZL;
Jump_Regimm[ 3] = REGIMM_BGEZL;
Jump_Regimm[ 4] = R4300iOp::UnknownOpcode;
Jump_Regimm[ 5] = R4300iOp::UnknownOpcode;
Jump_Regimm[ 6] = R4300iOp::UnknownOpcode;
Jump_Regimm[ 7] = R4300iOp::UnknownOpcode;
Jump_Regimm[ 8] = R4300iOp::UnknownOpcode;
Jump_Regimm[ 9] = R4300iOp::UnknownOpcode;
Jump_Regimm[0] = REGIMM_BLTZ;
Jump_Regimm[1] = REGIMM_BGEZ;
Jump_Regimm[2] = REGIMM_BLTZL;
Jump_Regimm[3] = REGIMM_BGEZL;
Jump_Regimm[4] = R4300iOp::UnknownOpcode;
Jump_Regimm[5] = R4300iOp::UnknownOpcode;
Jump_Regimm[6] = R4300iOp::UnknownOpcode;
Jump_Regimm[7] = R4300iOp::UnknownOpcode;
Jump_Regimm[8] = R4300iOp::UnknownOpcode;
Jump_Regimm[9] = R4300iOp::UnknownOpcode;
Jump_Regimm[10] = R4300iOp::UnknownOpcode;
Jump_Regimm[11] = R4300iOp::UnknownOpcode;
Jump_Regimm[12] = R4300iOp::UnknownOpcode;
@ -199,16 +199,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_Regimm[30] = R4300iOp::UnknownOpcode;
Jump_Regimm[31] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 0] = COP0_MF;
Jump_CoP0[ 1] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 2] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 3] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 4] = COP0_MT;
Jump_CoP0[ 5] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 6] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 7] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 8] = R4300iOp::UnknownOpcode;
Jump_CoP0[ 9] = R4300iOp::UnknownOpcode;
Jump_CoP0[0] = COP0_MF;
Jump_CoP0[1] = R4300iOp::UnknownOpcode;
Jump_CoP0[2] = R4300iOp::UnknownOpcode;
Jump_CoP0[3] = R4300iOp::UnknownOpcode;
Jump_CoP0[4] = COP0_MT;
Jump_CoP0[5] = R4300iOp::UnknownOpcode;
Jump_CoP0[6] = R4300iOp::UnknownOpcode;
Jump_CoP0[7] = R4300iOp::UnknownOpcode;
Jump_CoP0[8] = R4300iOp::UnknownOpcode;
Jump_CoP0[9] = R4300iOp::UnknownOpcode;
Jump_CoP0[10] = R4300iOp::UnknownOpcode;
Jump_CoP0[11] = R4300iOp::UnknownOpcode;
Jump_CoP0[12] = R4300iOp::UnknownOpcode;
@ -232,16 +232,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP0[30] = R4300iOp::COP0_CO;
Jump_CoP0[31] = R4300iOp::COP0_CO;
Jump_CoP0_Function[ 0] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[ 1] = R4300iOp::COP0_CO_TLBR;
Jump_CoP0_Function[ 2] = R4300iOp::COP0_CO_TLBWI;
Jump_CoP0_Function[ 3] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[ 4] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[ 5] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[ 6] = R4300iOp::COP0_CO_TLBWR;
Jump_CoP0_Function[ 7] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[ 8] = R4300iOp::COP0_CO_TLBP;
Jump_CoP0_Function[ 9] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[0] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[1] = R4300iOp::COP0_CO_TLBR;
Jump_CoP0_Function[2] = R4300iOp::COP0_CO_TLBWI;
Jump_CoP0_Function[3] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[4] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[5] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[6] = R4300iOp::COP0_CO_TLBWR;
Jump_CoP0_Function[7] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[8] = R4300iOp::COP0_CO_TLBP;
Jump_CoP0_Function[9] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[10] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[11] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[12] = R4300iOp::UnknownOpcode;
@ -297,16 +297,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP0_Function[62] = R4300iOp::UnknownOpcode;
Jump_CoP0_Function[63] = R4300iOp::UnknownOpcode;
Jump_CoP1[ 0] = COP1_MF;
Jump_CoP1[ 1] = R4300iOp::COP1_DMF;
Jump_CoP1[ 2] = COP1_CF;
Jump_CoP1[ 3] = R4300iOp::UnknownOpcode;
Jump_CoP1[ 4] = R4300iOp::COP1_MT;
Jump_CoP1[ 5] = COP1_DMT;
Jump_CoP1[ 6] = R4300iOp::COP1_CT;
Jump_CoP1[ 7] = R4300iOp::UnknownOpcode;
Jump_CoP1[ 8] = R4300iOp::COP1_BC;
Jump_CoP1[ 9] = R4300iOp::UnknownOpcode;
Jump_CoP1[0] = COP1_MF;
Jump_CoP1[1] = R4300iOp::COP1_DMF;
Jump_CoP1[2] = COP1_CF;
Jump_CoP1[3] = R4300iOp::UnknownOpcode;
Jump_CoP1[4] = R4300iOp::COP1_MT;
Jump_CoP1[5] = COP1_DMT;
Jump_CoP1[6] = R4300iOp::COP1_CT;
Jump_CoP1[7] = R4300iOp::UnknownOpcode;
Jump_CoP1[8] = R4300iOp::COP1_BC;
Jump_CoP1[9] = R4300iOp::UnknownOpcode;
Jump_CoP1[10] = R4300iOp::UnknownOpcode;
Jump_CoP1[11] = R4300iOp::UnknownOpcode;
Jump_CoP1[12] = R4300iOp::UnknownOpcode;
@ -330,16 +330,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1[30] = R4300iOp::UnknownOpcode;
Jump_CoP1[31] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[ 0] = R4300iOp::COP1_BCF;
Jump_CoP1_BC[ 1] = R4300iOp::COP1_BCT;
Jump_CoP1_BC[ 2] = R4300iOp::COP1_BCFL;
Jump_CoP1_BC[ 3] = R4300iOp::COP1_BCTL;
Jump_CoP1_BC[ 4] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[ 5] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[ 6] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[ 7] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[ 8] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[ 9] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[0] = R4300iOp::COP1_BCF;
Jump_CoP1_BC[1] = R4300iOp::COP1_BCT;
Jump_CoP1_BC[2] = R4300iOp::COP1_BCFL;
Jump_CoP1_BC[3] = R4300iOp::COP1_BCTL;
Jump_CoP1_BC[4] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[5] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[6] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[7] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[8] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[9] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[10] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[11] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[12] = R4300iOp::UnknownOpcode;
@ -363,16 +363,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1_BC[30] = R4300iOp::UnknownOpcode;
Jump_CoP1_BC[31] = R4300iOp::UnknownOpcode;
Jump_CoP1_S[ 0] = R4300iOp::COP1_S_ADD;
Jump_CoP1_S[ 1] = R4300iOp::COP1_S_SUB;
Jump_CoP1_S[ 2] = R4300iOp::COP1_S_MUL;
Jump_CoP1_S[ 3] = R4300iOp::COP1_S_DIV;
Jump_CoP1_S[ 4] = R4300iOp::COP1_S_SQRT;
Jump_CoP1_S[ 5] = R4300iOp::COP1_S_ABS;
Jump_CoP1_S[ 6] = R4300iOp::COP1_S_MOV;
Jump_CoP1_S[ 7] = R4300iOp::COP1_S_NEG;
Jump_CoP1_S[ 8] = R4300iOp::UnknownOpcode;
Jump_CoP1_S[ 9] = R4300iOp::COP1_S_TRUNC_L;
Jump_CoP1_S[0] = R4300iOp::COP1_S_ADD;
Jump_CoP1_S[1] = R4300iOp::COP1_S_SUB;
Jump_CoP1_S[2] = R4300iOp::COP1_S_MUL;
Jump_CoP1_S[3] = R4300iOp::COP1_S_DIV;
Jump_CoP1_S[4] = R4300iOp::COP1_S_SQRT;
Jump_CoP1_S[5] = R4300iOp::COP1_S_ABS;
Jump_CoP1_S[6] = R4300iOp::COP1_S_MOV;
Jump_CoP1_S[7] = R4300iOp::COP1_S_NEG;
Jump_CoP1_S[8] = R4300iOp::UnknownOpcode;
Jump_CoP1_S[9] = R4300iOp::COP1_S_TRUNC_L;
Jump_CoP1_S[10] = R4300iOp::COP1_S_CEIL_L; //added by Witten
Jump_CoP1_S[11] = R4300iOp::COP1_S_FLOOR_L; //added by Witten
Jump_CoP1_S[12] = R4300iOp::COP1_S_ROUND_W;
@ -428,16 +428,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1_S[62] = R4300iOp::COP1_S_CMP;
Jump_CoP1_S[63] = R4300iOp::COP1_S_CMP;
Jump_CoP1_D[ 0] = R4300iOp::COP1_D_ADD;
Jump_CoP1_D[ 1] = R4300iOp::COP1_D_SUB;
Jump_CoP1_D[ 2] = R4300iOp::COP1_D_MUL;
Jump_CoP1_D[ 3] = R4300iOp::COP1_D_DIV;
Jump_CoP1_D[ 4] = R4300iOp::COP1_D_SQRT;
Jump_CoP1_D[ 5] = R4300iOp::COP1_D_ABS;
Jump_CoP1_D[ 6] = R4300iOp::COP1_D_MOV;
Jump_CoP1_D[ 7] = R4300iOp::COP1_D_NEG;
Jump_CoP1_D[ 8] = R4300iOp::UnknownOpcode;
Jump_CoP1_D[ 9] = R4300iOp::COP1_D_TRUNC_L; //added by Witten
Jump_CoP1_D[0] = R4300iOp::COP1_D_ADD;
Jump_CoP1_D[1] = R4300iOp::COP1_D_SUB;
Jump_CoP1_D[2] = R4300iOp::COP1_D_MUL;
Jump_CoP1_D[3] = R4300iOp::COP1_D_DIV;
Jump_CoP1_D[4] = R4300iOp::COP1_D_SQRT;
Jump_CoP1_D[5] = R4300iOp::COP1_D_ABS;
Jump_CoP1_D[6] = R4300iOp::COP1_D_MOV;
Jump_CoP1_D[7] = R4300iOp::COP1_D_NEG;
Jump_CoP1_D[8] = R4300iOp::UnknownOpcode;
Jump_CoP1_D[9] = R4300iOp::COP1_D_TRUNC_L; //added by Witten
Jump_CoP1_D[10] = R4300iOp::COP1_D_CEIL_L; //added by Witten
Jump_CoP1_D[11] = R4300iOp::COP1_D_FLOOR_L; //added by Witten
Jump_CoP1_D[12] = R4300iOp::COP1_D_ROUND_W;
@ -493,16 +493,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1_D[62] = R4300iOp::COP1_D_CMP;
Jump_CoP1_D[63] = R4300iOp::COP1_D_CMP;
Jump_CoP1_W[ 0] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 1] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 2] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 3] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 4] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 5] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 6] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 7] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 8] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[ 9] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[0] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[1] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[2] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[3] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[4] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[5] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[6] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[7] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[8] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[9] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[10] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[11] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[12] = R4300iOp::UnknownOpcode;
@ -558,16 +558,16 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
Jump_CoP1_W[62] = R4300iOp::UnknownOpcode;
Jump_CoP1_W[63] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 0] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 1] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 2] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 3] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 4] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 5] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 6] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 7] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 8] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[ 9] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[0] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[1] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[2] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[3] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[4] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[5] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[6] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[7] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[8] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[9] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[10] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[11] = R4300iOp::UnknownOpcode;
Jump_CoP1_L[12] = R4300iOp::UnknownOpcode;
@ -626,7 +626,6 @@ R4300iOp32::Func * R4300iOp32::BuildInterpreter()
return Jump_Opcode;
}
/************************* Opcode functions *************************/
void R4300iOp32::JAL()
{
@ -645,10 +644,10 @@ void R4300iOp32::BEQ()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] == _GPR[m_Opcode.rt].W[0])
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -665,10 +664,10 @@ void R4300iOp32::BNE()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] != _GPR[m_Opcode.rt].W[0])
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -684,10 +683,10 @@ void R4300iOp32::BLEZ() {
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] <= 0)
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -704,10 +703,10 @@ void R4300iOp32::BGTZ()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] > 0)
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -724,10 +723,10 @@ void R4300iOp32::ADDI()
#ifdef Interpreter_StackTest
if (m_Opcode.rs == 29 && m_Opcode.rt == 29)
{
StackValue += (short)m_Opcode.immediate;
StackValue += (int16_t)m_Opcode.immediate;
}
#endif
_GPR[m_Opcode.rt].W[0] = (_GPR[m_Opcode.rs].W[0] + ((short)m_Opcode.immediate));
_GPR[m_Opcode.rt].W[0] = (_GPR[m_Opcode.rs].W[0] + ((int16_t)m_Opcode.immediate));
#ifdef Interpreter_StackTest
if (m_Opcode.rt == 29 && m_Opcode.rs != 29)
{
@ -741,10 +740,10 @@ void R4300iOp32::ADDIU()
#ifdef Interpreter_StackTest
if (m_Opcode.rs == 29 && m_Opcode.rt == 29)
{
StackValue += (short)m_Opcode.immediate;
StackValue += (int16_t)m_Opcode.immediate;
}
#endif
_GPR[m_Opcode.rt].W[0] = (_GPR[m_Opcode.rs].W[0] + ((short)m_Opcode.immediate));
_GPR[m_Opcode.rt].W[0] = (_GPR[m_Opcode.rs].W[0] + ((int16_t)m_Opcode.immediate));
#ifdef Interpreter_StackTest
if (m_Opcode.rt == 29 && m_Opcode.rs != 29)
{
@ -755,7 +754,7 @@ void R4300iOp32::ADDIU()
void R4300iOp32::SLTI()
{
if (_GPR[m_Opcode.rs].W[0] < (__int64)((short)m_Opcode.immediate))
if (_GPR[m_Opcode.rs].W[0] < (int64_t)((int16_t)m_Opcode.immediate))
{
_GPR[m_Opcode.rt].W[0] = 1;
}
@ -767,11 +766,11 @@ void R4300iOp32::SLTI()
void R4300iOp32::SLTIU()
{
int imm32 = (short)m_Opcode.immediate;
__int64 imm64;
int32_t imm32 = (int16_t)m_Opcode.immediate;
int64_t imm64;
imm64 = imm32;
_GPR[m_Opcode.rt].W[0] = _GPR[m_Opcode.rs].UW[0] < (unsigned __int64)imm64?1:0;
_GPR[m_Opcode.rt].W[0] = _GPR[m_Opcode.rs].UW[0] < (uint64_t)imm64 ? 1 : 0;
}
void R4300iOp32::ANDI()
@ -791,7 +790,7 @@ void R4300iOp32::XORI()
void R4300iOp32::LUI()
{
_GPR[m_Opcode.rt].W[0] = (long)((short)m_Opcode.offset << 16);
_GPR[m_Opcode.rt].W[0] = (int32_t)((int16_t)m_Opcode.offset << 16);
#ifdef Interpreter_StackTest
if (m_Opcode.rt == 29)
{
@ -805,10 +804,10 @@ void R4300iOp32::BEQL()
if (_GPR[m_Opcode.rs].W[0] == _GPR[m_Opcode.rt].W[0])
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -826,10 +825,10 @@ void R4300iOp32::BNEL()
if (_GPR[m_Opcode.rs].W[0] != _GPR[m_Opcode.rt].W[0])
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,m_Opcode.rt))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, m_Opcode.rt))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -847,10 +846,10 @@ void R4300iOp32::BLEZL()
if (_GPR[m_Opcode.rs].W[0] <= 0)
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -868,10 +867,10 @@ void R4300iOp32::BGTZL()
if (_GPR[m_Opcode.rs].W[0] > 0)
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER,m_Opcode.rs,0))
if (!DelaySlotEffectsCompare(*_PROGRAM_COUNTER, m_Opcode.rs, 0))
{
m_NextInstruction = PERMLOOP_DO_DELAY;
}
@ -886,8 +885,8 @@ void R4300iOp32::BGTZL()
void R4300iOp32::LB()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
if (!g_MMU->LB_VAddr(Address,_GPR[m_Opcode.rt].UB[0]))
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if (!g_MMU->LB_VAddr(Address, _GPR[m_Opcode.rt].UB[0]))
{
if (bShowTLBMisses())
{
@ -903,12 +902,12 @@ void R4300iOp32::LB()
void R4300iOp32::LH()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if ((Address & 1) != 0)
{
ADDRESS_ERROR_EXCEPTION(Address, true);
}
if (!g_MMU->LH_VAddr(Address,_GPR[m_Opcode.rt].UHW[0]))
if (!g_MMU->LH_VAddr(Address, _GPR[m_Opcode.rt].UHW[0]))
{
if (bShowTLBMisses())
{
@ -924,12 +923,12 @@ void R4300iOp32::LH()
void R4300iOp32::LWL()
{
DWORD Offset, Address, Value;
uint32_t Offset, Address, Value;
Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
Offset = Address & 3;
if (!g_MMU->LW_VAddr((Address & ~3),Value))
if (!g_MMU->LW_VAddr((Address & ~3), Value))
{
if (bShowTLBMisses())
{
@ -939,24 +938,24 @@ void R4300iOp32::LWL()
return;
}
_GPR[m_Opcode.rt].W[0] = (int)(_GPR[m_Opcode.rt].W[0] & LWL_MASK[Offset]);
_GPR[m_Opcode.rt].W[0] += (int)(Value << LWL_SHIFT[Offset]);
_GPR[m_Opcode.rt].W[0] = (int32_t)(_GPR[m_Opcode.rt].W[0] & LWL_MASK[Offset]);
_GPR[m_Opcode.rt].W[0] += (int32_t)(Value << LWL_SHIFT[Offset]);
}
void R4300iOp32::LW()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if ((Address & 3) != 0)
{
ADDRESS_ERROR_EXCEPTION(Address, true);
}
if (LogOptions.GenerateLog)
if (GenerateLog())
{
Log_LW((*_PROGRAM_COUNTER),Address);
Log_LW((*_PROGRAM_COUNTER), Address);
}
if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
if (!g_MMU->LW_VAddr(Address, _GPR[m_Opcode.rt].UW[0]))
{
if (bShowTLBMisses())
{
@ -972,8 +971,8 @@ void R4300iOp32::LW()
void R4300iOp32::LBU()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
if (!g_MMU->LB_VAddr(Address,_GPR[m_Opcode.rt].UB[0]))
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if (!g_MMU->LB_VAddr(Address, _GPR[m_Opcode.rt].UB[0]))
{
if (bShowTLBMisses())
{
@ -989,12 +988,12 @@ void R4300iOp32::LBU()
void R4300iOp32::LHU()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if ((Address & 1) != 0)
{
ADDRESS_ERROR_EXCEPTION(Address, true);
}
if (!g_MMU->LH_VAddr(Address,_GPR[m_Opcode.rt].UHW[0]))
if (!g_MMU->LH_VAddr(Address, _GPR[m_Opcode.rt].UHW[0]))
{
if (bShowTLBMisses())
{
@ -1010,14 +1009,14 @@ void R4300iOp32::LHU()
void R4300iOp32::LWR()
{
DWORD Offset, Address, Value;
uint32_t Offset, Address, Value;
Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
Offset = Address & 3;
if (!g_MMU->LW_VAddr((Address & ~3),Value))
if (!g_MMU->LW_VAddr((Address & ~3), Value))
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
if (bShowTLBMisses())
{
g_Notify->DisplayError(stdstr_f(__FUNCTION__ " TLB: %X", Address).ToUTF16().c_str());
@ -1025,19 +1024,19 @@ void R4300iOp32::LWR()
return;
}
_GPR[m_Opcode.rt].W[0] = (int)(_GPR[m_Opcode.rt].W[0] & LWR_MASK[Offset]);
_GPR[m_Opcode.rt].W[0] += (int)(Value >> LWR_SHIFT[Offset]);
_GPR[m_Opcode.rt].W[0] = (int32_t)(_GPR[m_Opcode.rt].W[0] & LWR_MASK[Offset]);
_GPR[m_Opcode.rt].W[0] += (int32_t)(Value >> LWR_SHIFT[Offset]);
}
void R4300iOp32::LWU()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if ((Address & 3) != 0)
{
ADDRESS_ERROR_EXCEPTION(Address, true);
}
if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
if (!g_MMU->LW_VAddr(Address, _GPR[m_Opcode.rt].UW[0]))
{
if (bShowTLBMisses())
{
@ -1051,16 +1050,15 @@ void R4300iOp32::LWU()
}
}
void R4300iOp32::LL()
{
DWORD Address = _GPR[m_Opcode.base].UW[0] + (short)m_Opcode.offset;
uint32_t Address = _GPR[m_Opcode.base].UW[0] + (int16_t)m_Opcode.offset;
if ((Address & 3) != 0)
{
ADDRESS_ERROR_EXCEPTION(Address, true);
}
if (!g_MMU->LW_VAddr(Address,_GPR[m_Opcode.rt].UW[0]))
if (!g_MMU->LW_VAddr(Address, _GPR[m_Opcode.rt].UW[0]))
{
if (bShowTLBMisses())
{
@ -1083,7 +1081,7 @@ void R4300iOp32::SPECIAL_SLL()
void R4300iOp32::SPECIAL_SRL()
{
_GPR[m_Opcode.rd].W[0] = (int)(_GPR[m_Opcode.rt].UW[0] >> m_Opcode.sa);
_GPR[m_Opcode.rd].W[0] = (int32_t)(_GPR[m_Opcode.rt].UW[0] >> m_Opcode.sa);
}
void R4300iOp32::SPECIAL_SRA()
@ -1098,7 +1096,7 @@ void R4300iOp32::SPECIAL_SLLV()
void R4300iOp32::SPECIAL_SRLV()
{
_GPR[m_Opcode.rd].W[0] = (int)(_GPR[m_Opcode.rt].UW[0] >> (_GPR[m_Opcode.rs].UW[0] & 0x1F));
_GPR[m_Opcode.rd].W[0] = (int32_t)(_GPR[m_Opcode.rt].UW[0] >> (_GPR[m_Opcode.rs].UW[0] & 0x1F));
}
void R4300iOp32::SPECIAL_SRAV()
@ -1110,7 +1108,7 @@ void R4300iOp32::SPECIAL_JALR()
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = _GPR[m_Opcode.rs].UW[0];
_GPR[m_Opcode.rd].W[0] = (long)((*_PROGRAM_COUNTER) + 8);
_GPR[m_Opcode.rd].W[0] = (int32_t)((*_PROGRAM_COUNTER) + 8);
m_TestTimer = true;
}
@ -1189,12 +1187,12 @@ void R4300iOp32::SPECIAL_TEQ()
void R4300iOp32::SPECIAL_DSRL32()
{
_GPR[m_Opcode.rd].UW[0] = (DWORD)(_GPR[m_Opcode.rt].UDW >> (m_Opcode.sa + 32));
_GPR[m_Opcode.rd].UW[0] = (uint32_t)(_GPR[m_Opcode.rt].UDW >> (m_Opcode.sa + 32));
}
void R4300iOp32::SPECIAL_DSRA32()
{
_GPR[m_Opcode.rd].W[0] = (long)(_GPR[m_Opcode.rt].DW >> (m_Opcode.sa + 32));
_GPR[m_Opcode.rd].W[0] = (int32_t)(_GPR[m_Opcode.rt].DW >> (m_Opcode.sa + 32));
}
/********************** R4300i OpCodes: RegImm **********************/
@ -1203,10 +1201,10 @@ void R4300iOp32::REGIMM_BLTZ()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] < 0)
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
{
CInterpreterCPU::InPermLoop();
}
@ -1223,10 +1221,10 @@ void R4300iOp32::REGIMM_BGEZ()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] >= 0)
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
{
CInterpreterCPU::InPermLoop();
}
@ -1243,10 +1241,10 @@ void R4300iOp32::REGIMM_BLTZL()
if (_GPR[m_Opcode.rs].W[0] < 0)
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
{
CInterpreterCPU::InPermLoop();
}
@ -1264,10 +1262,10 @@ void R4300iOp32::REGIMM_BGEZL()
if (_GPR[m_Opcode.rs].W[0] >= 0)
{
m_NextInstruction = DELAY_SLOT;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
{
CInterpreterCPU::InPermLoop();
}
@ -1285,10 +1283,10 @@ void R4300iOp32::REGIMM_BLTZAL()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] < 0)
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
{
CInterpreterCPU::InPermLoop();
}
@ -1298,7 +1296,7 @@ void R4300iOp32::REGIMM_BLTZAL()
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
}
_GPR[31].W[0]= (long)((*_PROGRAM_COUNTER) + 8);
_GPR[31].W[0] = (int32_t)((*_PROGRAM_COUNTER) + 8);
}
void R4300iOp32::REGIMM_BGEZAL()
@ -1306,10 +1304,10 @@ void R4300iOp32::REGIMM_BGEZAL()
m_NextInstruction = DELAY_SLOT;
if (_GPR[m_Opcode.rs].W[0] >= 0)
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((short)m_Opcode.offset << 2) + 4;
m_JumpToLocation = (*_PROGRAM_COUNTER) + ((int16_t)m_Opcode.offset << 2) + 4;
if ((*_PROGRAM_COUNTER) == m_JumpToLocation)
{
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER),m_Opcode.rs,0))
if (!DelaySlotEffectsCompare((*_PROGRAM_COUNTER), m_Opcode.rs, 0))
{
CInterpreterCPU::InPermLoop();
}
@ -1319,11 +1317,13 @@ void R4300iOp32::REGIMM_BGEZAL()
{
m_JumpToLocation = (*_PROGRAM_COUNTER) + 8;
}
_GPR[31].W[0] = (long)((*_PROGRAM_COUNTER) + 8);
_GPR[31].W[0] = (int32_t)((*_PROGRAM_COUNTER) + 8);
}
/************************** COP0 functions **************************/
void R4300iOp32::COP0_MF() {
if (LogOptions.LogCP0reads)
void R4300iOp32::COP0_MF()
{
if (LogCP0reads())
{
LogMessage("%08X: R4300i Read from %s (0x%08X)", (*_PROGRAM_COUNTER), CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
}
@ -1332,17 +1332,17 @@ void R4300iOp32::COP0_MF() {
{
g_SystemTimer->UpdateTimers();
}
_GPR[m_Opcode.rt].W[0] = (int)_CP0[m_Opcode.rd];
_GPR[m_Opcode.rt].W[0] = (int32_t)_CP0[m_Opcode.rd];
}
void R4300iOp32::COP0_MT()
{
if (LogOptions.LogCP0changes)
if (LogCP0changes())
{
LogMessage("%08X: Writing 0x%X to %s register (Originally: 0x%08X)",(*_PROGRAM_COUNTER), _GPR[m_Opcode.rt].UW[0],CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
LogMessage("%08X: Writing 0x%X to %s register (Originally: 0x%08X)", (*_PROGRAM_COUNTER), _GPR[m_Opcode.rt].UW[0], CRegName::Cop0[m_Opcode.rd], _CP0[m_Opcode.rd]);
if (m_Opcode.rd == 11) //Compare
{
LogMessage("%08X: Cause register changed from %08X to %08X",(*_PROGRAM_COUNTER), g_Reg->CAUSE_REGISTER, (g_Reg->CAUSE_REGISTER & ~CAUSE_IP7));
LogMessage("%08X: Cause register changed from %08X to %08X", (*_PROGRAM_COUNTER), g_Reg->CAUSE_REGISTER, (g_Reg->CAUSE_REGISTER & ~CAUSE_IP7));
}
}
@ -1398,7 +1398,7 @@ void R4300iOp32::COP0_MT()
break;
case 13: //cause
_CP0[m_Opcode.rd] &= 0xFFFFCFF;
if ((_GPR[m_Opcode.rt].UW[0] & 0x300) != 0 && g_Settings->LoadBool(Debugger_Enabled) )
if ((_GPR[m_Opcode.rt].UW[0] & 0x300) != 0 && g_Settings->LoadBool(Debugger_Enabled))
{
g_Notify->DisplayError(L"Set IP0 or IP1");
}
@ -1412,7 +1412,7 @@ void R4300iOp32::COP0_MT()
void R4300iOp32::COP1_MF()
{
TEST_COP1_USABLE_EXCEPTION
_GPR[m_Opcode.rt].W[0] = *(int *)_FPR_S[m_Opcode.fs];
_GPR[m_Opcode.rt].W[0] = *(int32_t *)_FPR_S[m_Opcode.fs];
}
void R4300iOp32::COP1_CF()
@ -1423,11 +1423,11 @@ void R4300iOp32::COP1_CF()
if (g_Settings->LoadBool(Debugger_Enabled)) { g_Notify->DisplayError(L"CFC1 what register are you writing to ?"); }
return;
}
_GPR[m_Opcode.rt].W[0] = (int)_FPCR[m_Opcode.fs];
_GPR[m_Opcode.rt].W[0] = (int32_t)_FPCR[m_Opcode.fs];
}
void R4300iOp32::COP1_DMT()
{
TEST_COP1_USABLE_EXCEPTION
*(__int64 *)_FPR_D[m_Opcode.fs] = _GPR[m_Opcode.rt].W[0];
*(int64_t *)_FPR_D[m_Opcode.fs] = _GPR[m_Opcode.rt].W[0];
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,6 +10,8 @@
****************************************************************************/
#pragma once
#include "Interpreter Ops.h"
class R4300iOp32 :
public R4300iOp
{

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,7 +10,12 @@
****************************************************************************/
#pragma once
#include <Project64\Settings\Debug Settings.h>
#include <Project64\N64 System\Mips\Register Class.h>
#include <Project64\N64 System\Mips\OpCode.h>
class R4300iOp :
public CLogging,
protected CDebugSettings,
protected CSystemRegisters
{
@ -64,7 +69,6 @@ public:
static void SDC1();
static void SD();
/********************** R4300i OpCodes: Special **********************/
static void SPECIAL_SLL();
static void SPECIAL_SRL();
@ -200,13 +204,12 @@ public:
/************************** Other functions **************************/
static void UnknownOpcode();
static Func* BuildInterpreter();
static bool m_TestTimer;
static DWORD m_NextInstruction;
static uint32_t m_NextInstruction;
static OPCODE m_Opcode;
static DWORD m_JumpToLocation;
static uint32_t m_JumpToLocation;
protected:
static void SPECIAL();
@ -232,7 +235,6 @@ protected:
static Func Jump_CoP1_W[64];
static Func Jump_CoP1_L[64];
static const DWORD SWL_MASK[4], SWR_MASK[4], LWL_MASK[4], LWR_MASK[4];
static const int SWL_SHIFT[4], SWR_SHIFT[4], LWL_SHIFT[4], LWR_SHIFT[4];
static const uint32_t SWL_MASK[4], SWR_MASK[4], LWL_MASK[4], LWR_MASK[4];
static const int32_t SWL_SHIFT[4], SWR_SHIFT[4], LWL_SHIFT[4], LWR_SHIFT[4];
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -9,6 +9,9 @@
* *
****************************************************************************/
#include "stdafx.h"
#include "Audio.h"
#include <Project64\N64 System\System Globals.h>
#include <Project64\N64 System\N64 Class.h>
CAudio::CAudio()
{
@ -17,7 +20,6 @@ CAudio::CAudio()
CAudio::~CAudio()
{
}
void CAudio::Reset()
@ -30,35 +32,37 @@ void CAudio::Reset()
m_FramesPerSecond = 60;
}
DWORD CAudio::GetLength()
uint32_t CAudio::GetLength()
{
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
DWORD TimeLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt), Res = 0;
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
uint32_t TimeLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt), Res = 0;
if (TimeLeft > 0)
{
Res = (TimeLeft / m_CountsPerByte);
}
WriteTraceF(TraceAudio,__FUNCTION__ ": Done (res = %d, TimeLeft = %d)",Res, TimeLeft);
return (Res+3)&~3;
WriteTraceF(TraceAudio, __FUNCTION__ ": Done (res = %d, TimeLeft = %d)", Res, TimeLeft);
return (Res + 3)&~3;
}
DWORD CAudio::GetStatus()
uint32_t CAudio::GetStatus()
{
WriteTraceF(TraceAudio,__FUNCTION__ ": m_Status = %X",m_Status);
WriteTraceF(TraceAudio, __FUNCTION__ ": m_Status = %X", m_Status);
return m_Status;
}
void CAudio::LenChanged()
{
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (g_Reg->AI_LEN_REG = %d)",g_Reg->AI_LEN_REG);
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (g_Reg->AI_LEN_REG = %d)", g_Reg->AI_LEN_REG);
if (g_Reg->AI_LEN_REG != 0)
{
if (g_Reg->AI_LEN_REG >= 0x40000)
{
WriteTraceF(TraceAudio,__FUNCTION__ ": *** Ignoring Write, To Large (%X)",g_Reg->AI_LEN_REG);
} else {
WriteTraceF(TraceAudio, __FUNCTION__ ": *** Ignoring Write, To Large (%X)", g_Reg->AI_LEN_REG);
}
else
{
m_Status |= ai_busy;
DWORD AudioLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt);
uint32_t AudioLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt);
if (m_SecondBuff == 0)
{
if (AudioLeft == 0)
@ -81,7 +85,7 @@ void CAudio::LenChanged()
}
else
{
WriteTraceF(TraceAudio,__FUNCTION__ ": *** Reset Timer to 0");
WriteTraceF(TraceAudio, __FUNCTION__ ": *** Reset Timer to 0");
g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy);
g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt);
m_SecondBuff = 0;
@ -92,18 +96,18 @@ void CAudio::LenChanged()
{
g_Plugins->Audio()->AiLenChanged();
}
WriteTraceF(TraceAudio,__FUNCTION__ ": Done");
WriteTraceF(TraceAudio, __FUNCTION__ ": Done");
}
void CAudio::InterruptTimerDone()
{
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
m_Status &= ~ai_full;
g_Reg->MI_INTR_REG |= MI_INTR_AI;
g_Reg->CheckInterrupts();
if (m_SecondBuff != 0)
{
g_SystemTimer->SetTimer(CSystemTimer::AiTimerInterrupt,m_SecondBuff * m_CountsPerByte,false);
g_SystemTimer->SetTimer(CSystemTimer::AiTimerInterrupt, m_SecondBuff * m_CountsPerByte, false);
m_SecondBuff = 0;
}
else
@ -114,30 +118,29 @@ void CAudio::InterruptTimerDone()
{
g_System->SyncToAudio();
}
WriteTrace(TraceAudio,__FUNCTION__ ": Done");
WriteTrace(TraceAudio, __FUNCTION__ ": Done");
}
void CAudio::BusyTimerDone()
{
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
g_Notify->BreakPoint(__FILEW__,__LINE__);
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
g_Notify->BreakPoint(__FILEW__, __LINE__);
m_Status &= ~ai_busy;
}
void CAudio::SetViIntr ( DWORD VI_INTR_TIME )
void CAudio::SetViIntr(uint32_t VI_INTR_TIME)
{
double CountsPerSecond = (DWORD)((double)VI_INTR_TIME * m_FramesPerSecond);
double CountsPerSecond = (uint32_t)((double)VI_INTR_TIME * m_FramesPerSecond);
if (m_BytesPerSecond != 0 && (g_System->AiCountPerBytes() == 0))
{
m_CountsPerByte = (int)((double)CountsPerSecond / (double)m_BytesPerSecond);
m_CountsPerByte = (int32_t)((double)CountsPerSecond / (double)m_BytesPerSecond);
}
}
void CAudio::SetFrequency (DWORD Dacrate, DWORD System)
void CAudio::SetFrequency(uint32_t Dacrate, uint32_t System)
{
WriteTraceF(TraceAudio,__FUNCTION__ "(Dacrate: %X System: %d): AI_BITRATE_REG = %X",Dacrate,System,g_Reg->AI_BITRATE_REG);
DWORD Frequency;
WriteTraceF(TraceAudio, __FUNCTION__ "(Dacrate: %X System: %d): AI_BITRATE_REG = %X", Dacrate, System, g_Reg->AI_BITRATE_REG);
uint32_t Frequency;
switch (System)
{

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -21,19 +21,22 @@ public:
CAudio();
~CAudio();
DWORD GetLength ();
DWORD GetStatus ();
uint32_t GetLength ();
uint32_t GetStatus ();
void LenChanged ();
void InterruptTimerDone();
void BusyTimerDone ();
void Reset ();
void SetViIntr ( DWORD VI_INTR_TIME );
void SetFrequency ( DWORD Dacrate, DWORD System );
void SetViIntr ( uint32_t VI_INTR_TIME );
void SetFrequency ( uint32_t Dacrate, uint32_t System );
private:
DWORD m_SecondBuff;
DWORD m_Status;
DWORD m_BytesPerSecond;
int m_CountsPerByte;
int m_FramesPerSecond;
CAudio(const CAudio&); // Disable copy constructor
CAudio& operator=(const CAudio&); // Disable assignment
uint32_t m_SecondBuff;
uint32_t m_Status;
uint32_t m_BytesPerSecond;
int32_t m_CountsPerByte;
int32_t m_FramesPerSecond;
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -11,38 +11,46 @@
#include "stdafx.h"
CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) :
m_FlashRam(FlashRam),
m_Sram(Sram)
m_FlashRam(FlashRam),
m_Sram(Sram)
{
}
void CDMA::OnFirstDMA()
{
int16_t offset;
const uint32_t base = 0x00000000;
const uint32_t rt = g_MMU->RdramSize();
switch (g_Rom->CicChipID())
{
case CIC_NUS_6101: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
case CIC_NUS_5167: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
case CIC_NUS_6101: offset = +0x0318; break;
case CIC_NUS_5167: offset = +0x0318; break;
case CIC_UNKNOWN:
case CIC_NUS_6102: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
case CIC_NUS_6103: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
case CIC_NUS_6105: *(DWORD *)&((g_MMU->Rdram())[0x3F0]) = g_MMU->RdramSize(); break;
case CIC_NUS_6106: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
default: g_Notify->DisplayError(stdstr_f("Unhandled CicChip(%d) in first DMA",g_Rom->CicChipID()).ToUTF16().c_str());
case CIC_NUS_6102: offset = +0x0318; break;
case CIC_NUS_6103: offset = +0x0318; break;
case CIC_NUS_6105: offset = +0x03F0; break;
case CIC_NUS_6106: offset = +0x0318; break;
default:
g_Notify->DisplayError(
stdstr_f("Unhandled CicChip(%d) in first DMA", g_Rom->CicChipID()).ToUTF16().c_str()
);
return;
}
g_MMU->SW_PAddr(base + offset, rt);
}
void CDMA::PI_DMA_READ()
{
// PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
DWORD PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1;
// PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
uint32_t PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1;
if ((PI_RD_LEN_REG & 1) != 0)
{
PI_RD_LEN_REG += 1;
}
if ( g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize())
if (g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize())
{
if (bHaveDebugger())
{
@ -57,9 +65,9 @@ void CDMA::PI_DMA_READ()
//Write ROM Area (for 64DD Convert)
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FBFFFFF && g_Settings->LoadBool(Game_AllowROMWrites))
{
DWORD i;
BYTE * ROM = g_Rom->GetRomAddress();
BYTE * RDRAM = g_MMU->Rdram();
uint32_t i;
uint8_t * ROM = g_Rom->GetRomAddress();
uint8_t * RDRAM = g_MMU->Rdram();
DWORD OldProtect;
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READWRITE, &OldProtect);
@ -74,7 +82,7 @@ void CDMA::PI_DMA_READ()
}
else
{
DWORD Len;
uint32_t Len;
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
for (i = 0; i < Len; i++)
{
@ -101,7 +109,7 @@ void CDMA::PI_DMA_READ()
return;
}
if ( g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000)
if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000)
{
if (g_System->m_SaveUsing == SaveChip_Auto)
{
@ -122,7 +130,7 @@ void CDMA::PI_DMA_READ()
if (g_System->m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.DmaToFlashram(
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
g_Reg->PI_CART_ADDR_REG - 0x08000000,
PI_RD_LEN_REG
);
@ -134,7 +142,7 @@ void CDMA::PI_DMA_READ()
}
if (g_System->m_SaveUsing == SaveChip_FlashRam)
{
g_Notify->DisplayError(stdstr_f("**** FLashRam DMA Read address %08X *****",g_Reg->PI_CART_ADDR_REG).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("**** FLashRam DMA Read address %08X *****", g_Reg->PI_CART_ADDR_REG).ToUTF16().c_str());
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
@ -142,7 +150,7 @@ void CDMA::PI_DMA_READ()
}
if (bHaveDebugger())
{
g_Notify->DisplayError(stdstr_f("PI_DMA_READ where are you dmaing to ? : 08X", g_Reg->PI_CART_ADDR_REG).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("PI_DMA_READ where are you dmaing to ? : %08X", g_Reg->PI_CART_ADDR_REG).ToUTF16().c_str());
}
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
@ -152,7 +160,7 @@ void CDMA::PI_DMA_READ()
void CDMA::PI_DMA_WRITE()
{
DWORD PI_WR_LEN_REG = ((g_Reg->PI_WR_LEN_REG) & 0x00FFFFFFul) + 1;
uint32_t PI_WR_LEN_REG = ((g_Reg->PI_WR_LEN_REG) & 0x00FFFFFFul) + 1;
if ((PI_WR_LEN_REG & 1) != 0)
{
@ -160,7 +168,7 @@ void CDMA::PI_DMA_WRITE()
}
g_Reg->PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
if ( g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG > g_MMU->RdramSize())
if (g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG > g_MMU->RdramSize())
{
if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory)) { g_Notify->DisplayError(stdstr_f("PI_DMA_WRITE not in Memory: %08X", g_Reg->PI_DRAM_ADDR_REG + PI_WR_LEN_REG).ToUTF16().c_str()); }
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
@ -169,7 +177,7 @@ void CDMA::PI_DMA_WRITE()
return;
}
if ( g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000)
if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08088000)
{
if (g_System->m_SaveUsing == SaveChip_Auto)
{
@ -178,7 +186,7 @@ void CDMA::PI_DMA_WRITE()
if (g_System->m_SaveUsing == SaveChip_Sram)
{
m_Sram.DmaFromSram(
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
g_Reg->PI_CART_ADDR_REG - 0x08000000,
PI_WR_LEN_REG
);
@ -190,7 +198,7 @@ void CDMA::PI_DMA_WRITE()
if (g_System->m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.DmaFromFlashram(
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
g_Reg->PI_CART_ADDR_REG - 0x08000000,
PI_WR_LEN_REG
);
@ -201,33 +209,33 @@ void CDMA::PI_DMA_WRITE()
return;
}
if ( g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FFFFFFF)
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FFFFFFF)
{
DWORD i;
uint32_t i;
#ifdef tofix
#ifdef ROM_IN_MAPSPACE
if (WrittenToRom)
{
DWORD OldProtect;
uint32_t OldProtect;
VirtualProtect(ROM,m_RomFileSize,PAGE_READONLY, &OldProtect);
}
#endif
#endif
BYTE * ROM = g_Rom->GetRomAddress();
BYTE * RDRAM = g_MMU->Rdram();
uint8_t * ROM = g_Rom->GetRomAddress();
uint8_t * RDRAM = g_MMU->Rdram();
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
if (g_Reg->PI_CART_ADDR_REG + PI_WR_LEN_REG < g_Rom->GetRomSize())
{
for (i = 0; i < PI_WR_LEN_REG; i ++)
for (i = 0; i < PI_WR_LEN_REG; i++)
{
*(RDRAM+((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
}
}
else if (g_Reg->PI_CART_ADDR_REG >= g_Rom->GetRomSize())
{
DWORD cart = g_Reg->PI_CART_ADDR_REG - g_Rom->GetRomSize();
uint32_t cart = g_Reg->PI_CART_ADDR_REG - g_Rom->GetRomSize();
while (cart >= g_Rom->GetRomSize())
{
cart -= g_Rom->GetRomSize();
@ -239,15 +247,15 @@ void CDMA::PI_DMA_WRITE()
}
else
{
DWORD Len;
uint32_t Len;
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
for (i = 0; i < Len; i ++)
for (i = 0; i < Len; i++)
{
*(RDRAM+((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM+((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3));
}
for (i = Len; i < PI_WR_LEN_REG - Len; i ++)
for (i = Len; i < PI_WR_LEN_REG - Len; i++)
{
*(RDRAM+((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = 0;
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = 0;
}
}
g_Reg->PI_CART_ADDR_REG += 0x10000000;
@ -259,13 +267,13 @@ void CDMA::PI_DMA_WRITE()
}
if (g_Recompiler && g_System->bSMM_PIDMA())
{
g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG,CRecompiler::Remove_DMA);
g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA);
}
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
//ChangeTimer(PiTimer,(int)(PI_WR_LEN_REG * 8.9) + 50);
//ChangeTimer(PiTimer,(int)(PI_WR_LEN_REG * 8.9));
//ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9) + 50);
//ChangeTimer(PiTimer,(int32_t)(PI_WR_LEN_REG * 8.9));
return;
}
@ -276,7 +284,6 @@ void CDMA::PI_DMA_WRITE()
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
}
void CDMA::SP_DMA_READ()
@ -305,19 +312,19 @@ void CDMA::SP_DMA_READ()
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if (((g_Reg->SP_RD_LEN_REG + 1) & 3) != 0)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
memcpy( g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF), g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG,
g_Reg->SP_RD_LEN_REG + 1 );
memcpy(g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF), g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG,
g_Reg->SP_RD_LEN_REG + 1);
g_Reg->SP_DMA_BUSY_REG = 0;
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
@ -345,19 +352,19 @@ void CDMA::SP_DMA_WRITE()
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0)
{
g_Notify->BreakPoint(__FILEW__,__LINE__);
g_Notify->BreakPoint(__FILEW__, __LINE__);
}
memcpy( g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG, g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF),
memcpy(g_MMU->Rdram() + g_Reg->SP_DRAM_ADDR_REG, g_MMU->Dmem() + (g_Reg->SP_MEM_ADDR_REG & 0x1FFF),
g_Reg->SP_WR_LEN_REG + 1);
g_Reg->SP_DMA_BUSY_REG = 0;

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -9,6 +9,9 @@
* *
****************************************************************************/
#pragma once
#include <Project64\Settings\Debug Settings.h>
#include <Project64\N64 System\Mips\FlashRam.h>
#include <Project64\N64 System\Mips\Sram.h>
class CDMA :
private CDebugSettings
@ -22,12 +25,12 @@ public:
void PI_DMA_WRITE();
protected:
CDMA (CFlashram & FlashRam, CSram & Sram);
//void SI_DMA_READ();
//void SI_DMA_WRITE();
CDMA(CFlashram & FlashRam, CSram & Sram);
private:
CDMA(const CDMA&); // Disable copy constructor
CDMA& operator=(const CDMA&); // Disable assignment
CFlashram & m_FlashRam;
CSram & m_Sram;

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -9,13 +9,16 @@
* *
****************************************************************************/
#include "stdafx.h"
#include "Eeprom.h"
#include <Project64\N64 System\System Globals.h>
#include <Project64\N64 System\N64 Class.h>
#include <time.h>
CEeprom::CEeprom(bool ReadOnly):
m_ReadOnly(ReadOnly),
m_hFile(NULL)
CEeprom::CEeprom(bool ReadOnly) :
m_ReadOnly(ReadOnly),
m_hFile(NULL)
{
memset(m_EEPROM,0xFF,sizeof(m_EEPROM));
memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
}
CEeprom::~CEeprom()
@ -27,13 +30,13 @@ CEeprom::~CEeprom()
}
}
unsigned char byte2bcd(int n)
uint8_t byte2bcd(int32_t n)
{
n %= 100;
return (unsigned char)(((n / 10) << 4) | (n % 10));
return (uint8_t)(((n / 10) << 4) | (n % 10));
}
void CEeprom::EepromCommand ( BYTE * Command)
void CEeprom::EepromCommand(uint8_t * Command)
{
time_t curtime_time;
struct tm curtime;
@ -64,7 +67,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
else
{
Command[3] = 0x00;
Command[4] = g_System->m_SaveUsing == SaveChip_Eeprom_4K?0x80:0xC0;
Command[4] = g_System->m_SaveUsing == SaveChip_Eeprom_4K ? 0x80 : 0xC0;
Command[5] = 0x00;
}
break;
@ -77,7 +80,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
{
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
}
ReadFrom(&Command[4],Command[3]);
ReadFrom(&Command[4], Command[3]);
break;
case 5: //Write to Eeprom
if (Command[0] != 10 && bHaveDebugger())
@ -88,7 +91,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
{
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
}
WriteTo(&Command[4],Command[3]);
WriteTo(&Command[4], Command[3]);
break;
case 6: //RTC Status query
Command[3] = 0x00;
@ -131,7 +134,7 @@ void CEeprom::EepromCommand ( BYTE * Command)
default:
if (g_Settings->LoadDword(Debugger_ShowPifErrors))
{
g_Notify->DisplayError(stdstr_f("Unknown EepromCommand %d",Command[2]).ToUTF16().c_str());
g_Notify->DisplayError(stdstr_f("Unknown EepromCommand %d", Command[2]).ToUTF16().c_str());
}
}
}
@ -141,9 +144,9 @@ void CEeprom::LoadEeprom()
CPath FileName;
DWORD dwRead;
memset(m_EEPROM,0xFF,sizeof(m_EEPROM));
memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
FileName.SetDriveDirectory( g_Settings->LoadStringVal(Directory_NativeSave).c_str());
FileName.SetDriveDirectory(g_Settings->LoadStringVal(Directory_NativeSave).c_str());
FileName.SetName(g_Settings->LoadStringVal(Game_GameName).c_str());
FileName.SetExtension("eep");
@ -152,47 +155,47 @@ void CEeprom::LoadEeprom()
FileName.DirectoryCreate();
}
m_hFile = CreateFile(FileName,m_ReadOnly ? GENERIC_READ : GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,
m_hFile = CreateFile(FileName, m_ReadOnly ? GENERIC_READ : GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
WriteTraceF(TraceError,__FUNCTION__ ": Failed to open (%s), ReadOnly = %d, LastError = %X",(LPCTSTR)FileName, m_ReadOnly, GetLastError());
WriteTraceF(TraceError, __FUNCTION__ ": Failed to open (%s), ReadOnly = %d, LastError = %X", (LPCTSTR)FileName, m_ReadOnly, GetLastError());
g_Notify->DisplayError(GS(MSG_FAIL_OPEN_EEPROM));
return;
}
SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);
ReadFile(m_hFile,m_EEPROM,sizeof(m_EEPROM),&dwRead,NULL);
SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);
ReadFile(m_hFile, m_EEPROM, sizeof(m_EEPROM), &dwRead, NULL);
}
void CEeprom::ReadFrom(BYTE * Buffer, int line)
void CEeprom::ReadFrom(uint8_t * Buffer, int32_t line)
{
int i;
int32_t i;
if (m_hFile == NULL)
{
LoadEeprom();
}
for (i=0; i < 8; i++)
for (i = 0; i < 8; i++)
{
Buffer[i] = m_EEPROM[line*8+i];
Buffer[i] = m_EEPROM[line * 8 + i];
}
}
void CEeprom::WriteTo(BYTE * Buffer, int line)
void CEeprom::WriteTo(uint8_t * Buffer, int32_t line)
{
DWORD dwWritten;
int i;
int32_t i;
if (m_hFile == NULL)
{
LoadEeprom();
}
for (i=0;i<8;i++)
for (i = 0; i < 8; i++)
{
m_EEPROM[line*8+i]=Buffer[i];
m_EEPROM[line * 8 + i] = Buffer[i];
}
SetFilePointer(m_hFile,line*8,NULL,FILE_BEGIN);
WriteFile( m_hFile,Buffer,8,&dwWritten,NULL );
SetFilePointer(m_hFile, line * 8, NULL, FILE_BEGIN);
WriteFile(m_hFile, Buffer, 8, &dwWritten, NULL);
FlushFileBuffers(m_hFile);
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -14,17 +14,21 @@ class CEeprom :
private CDebugSettings
{
public:
CEeprom ( bool ReadOnly );
CEeprom(bool ReadOnly);
~CEeprom();
void EepromCommand ( BYTE * Command );
void EepromCommand(uint8_t * Command);
private:
void LoadEeprom ();
void ReadFrom ( BYTE * Buffer, int line );
void WriteTo ( BYTE * Buffer, int line );
CEeprom(void); // Disable default constructor
CEeprom(const CEeprom&); // Disable copy constructor
CEeprom& operator=(const CEeprom&); // Disable assignment
BYTE m_EEPROM[0x800];
void LoadEeprom();
void ReadFrom(uint8_t * Buffer, int32_t line);
void WriteTo(uint8_t * Buffer, int32_t line);
uint8_t m_EEPROM[0x800];
bool m_ReadOnly;
HANDLE m_hFile;
void * m_hFile;
};

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *

View File

@ -1,6 +1,6 @@
/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* Project64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
@ -10,51 +10,48 @@
****************************************************************************/
#pragma once
#include <objbase.h>
interface CMipsMemory_CallBack
__interface CMipsMemory_CallBack
{
//Protected memory has been written to, returns true if that memory has been unprotected
virtual bool WriteToProtectedMemory (DWORD Address, int length) = 0;
virtual bool WriteToProtectedMemory (uint32_t Address, int32_t length) = 0;
};
class CMipsMemory
__interface CMipsMemory
{
public:
virtual BYTE * Rdram () = 0;
virtual DWORD RdramSize() = 0;
virtual BYTE * Dmem () = 0;
virtual BYTE * Imem () = 0;
virtual BYTE * PifRam () = 0;
virtual uint8_t * Rdram () = 0;
virtual uint32_t RdramSize() = 0;
virtual uint8_t * Dmem () = 0;
virtual uint8_t * Imem () = 0;
virtual uint8_t * PifRam () = 0;
virtual bool LB_VAddr ( DWORD VAddr, BYTE & Value ) = 0;
virtual bool LH_VAddr ( DWORD VAddr, WORD & Value ) = 0;
virtual bool LW_VAddr ( DWORD VAddr, DWORD & Value ) = 0;
virtual bool LD_VAddr ( DWORD VAddr, QWORD & Value ) = 0;
virtual bool LB_VAddr ( uint32_t VAddr, uint8_t & Value ) = 0;
virtual bool LH_VAddr ( uint32_t VAddr, uint16_t & Value ) = 0;
virtual bool LW_VAddr ( uint32_t VAddr, uint32_t & Value ) = 0;
virtual bool LD_VAddr ( uint32_t VAddr, uint64_t & Value ) = 0;
virtual bool LB_PAddr ( DWORD PAddr, BYTE & Value ) = 0;
virtual bool LH_PAddr ( DWORD PAddr, WORD & Value ) = 0;
virtual bool LW_PAddr ( DWORD PAddr, DWORD & Value ) = 0;
virtual bool LD_PAddr ( DWORD PAddr, QWORD & Value ) = 0;
virtual bool LB_PAddr ( uint32_t PAddr, uint8_t & Value ) = 0;
virtual bool LH_PAddr ( uint32_t PAddr, uint16_t & Value ) = 0;
virtual bool LW_PAddr ( uint32_t PAddr, uint32_t & Value ) = 0;
virtual bool LD_PAddr ( uint32_t PAddr, uint64_t & Value ) = 0;
virtual bool SB_VAddr ( DWORD VAddr, BYTE Value ) = 0;
virtual bool SH_VAddr ( DWORD VAddr, WORD Value ) = 0;
virtual bool SW_VAddr ( DWORD VAddr, DWORD Value ) = 0;
virtual bool SD_VAddr ( DWORD VAddr, QWORD Value ) = 0;
virtual bool SB_VAddr ( uint32_t VAddr, uint8_t Value ) = 0;
virtual bool SH_VAddr ( uint32_t VAddr, uint16_t Value ) = 0;
virtual bool SW_VAddr ( uint32_t VAddr, uint32_t Value ) = 0;
virtual bool SD_VAddr ( uint32_t VAddr, uint64_t Value ) = 0;
virtual bool SB_PAddr ( DWORD PAddr, BYTE Value ) = 0;
virtual bool SH_PAddr ( DWORD PAddr, WORD Value ) = 0;
virtual bool SW_PAddr ( DWORD PAddr, DWORD Value ) = 0;
virtual bool SD_PAddr ( DWORD PAddr, QWORD Value ) = 0;
virtual bool SB_PAddr ( uint32_t PAddr, uint8_t Value ) = 0;
virtual bool SH_PAddr ( uint32_t PAddr, uint16_t Value ) = 0;
virtual bool SW_PAddr ( uint32_t PAddr, uint32_t Value ) = 0;
virtual bool SD_PAddr ( uint32_t PAddr, uint64_t Value ) = 0;
virtual bool ValidVaddr ( DWORD VAddr ) const = 0;
virtual bool ValidVaddr ( uint32_t VAddr ) const = 0;
virtual int MemoryFilter ( DWORD dwExptCode, void * lpExceptionPointer ) = 0;
virtual void UpdateFieldSerration ( unsigned int interlaced ) = 0;
virtual int32_t MemoryFilter ( uint32_t dwExptCode, void * lpExceptionPointer ) = 0;
virtual void UpdateFieldSerration ( uint32_t interlaced ) = 0;
//Protect the Memory from being written to
virtual void ProtectMemory ( DWORD StartVaddr, DWORD EndVaddr ) = 0;
virtual void UnProtectMemory ( DWORD StartVaddr, DWORD EndVaddr ) = 0;
virtual void ProtectMemory ( uint32_t StartVaddr, uint32_t EndVaddr ) = 0;
virtual void UnProtectMemory ( uint32_t StartVaddr, uint32_t EndVaddr ) = 0;
//Compilation Functions
virtual void ResetMemoryStack () = 0;

Some files were not shown because too many files have changed in this diff Show More