Merge https://github.com/project64/project64 into crapware
This commit is contained in:
commit
6edfcbd77b
|
@ -4,6 +4,14 @@
|
||||||
*.sdf
|
*.sdf
|
||||||
*.suo
|
*.suo
|
||||||
*.user
|
*.user
|
||||||
|
|
||||||
|
# compiler-generated sources (MSVC, GCC)
|
||||||
|
*.asm
|
||||||
|
*.s
|
||||||
|
|
||||||
|
# assembled linker objects (GCC)
|
||||||
|
*.o
|
||||||
|
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
/Bin/Debug
|
/Bin/Debug
|
||||||
/Bin/Debug64
|
/Bin/Debug64
|
||||||
|
|
Binary file not shown.
|
@ -1430,6 +1430,7 @@ Plugin Note=[video] unsupported
|
||||||
Good Name=Dezaemon 3D (J)
|
Good Name=Dezaemon 3D (J)
|
||||||
Internal Name=DEZAEMON3D
|
Internal Name=DEZAEMON3D
|
||||||
Status=Compatible
|
Status=Compatible
|
||||||
|
Save Type=Sram
|
||||||
|
|
||||||
[FD73F775-9724755A-C:50]
|
[FD73F775-9724755A-C:50]
|
||||||
Good Name=Diddy Kong Racing (E) (M3) (V1.0)
|
Good Name=Diddy Kong Racing (E) (M3) (V1.0)
|
||||||
|
|
|
@ -318,7 +318,7 @@
|
||||||
#620# "Usar o Primeiro Tipo de Salvamento Usado"
|
#620# "Usar o Primeiro Tipo de Salvamento Usado"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -266,7 +266,7 @@
|
||||||
#620# "* открий първият използван тип"
|
#620# "* открий първият използван тип"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -318,7 +318,7 @@
|
||||||
#620# "Primer tipus de desat usat"
|
#620# "Primer tipus de desat usat"
|
||||||
#621# "EEPROM de 4 kbits"
|
#621# "EEPROM de 4 kbits"
|
||||||
#622# "EEPROM de 16 kbits"
|
#622# "EEPROM de 16 kbits"
|
||||||
#623# "SRAM de 32kbytes"
|
#623# "SRAM"
|
||||||
#624# "FlashRAM de 128kbytes"
|
#624# "FlashRAM de 128kbytes"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -88,6 +88,7 @@
|
||||||
#198# "插槽 8"
|
#198# "插槽 8"
|
||||||
#199# "插槽 9"
|
#199# "插槽 9"
|
||||||
#200# "插槽 10"
|
#200# "插槽 10"
|
||||||
|
#201# "插槽 (%ws) 被选"
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
#210# "运行游戏"
|
#210# "运行游戏"
|
||||||
|
@ -224,7 +225,7 @@
|
||||||
#452# " 选择材质包目录"
|
#452# " 选择材质包目录"
|
||||||
|
|
||||||
//Options Dialog
|
//Options Dialog
|
||||||
#460# "当窗口处于非活动状态时暂停模拟器"
|
#460# "当模拟器窗口不是处于屏幕最上方,暂停模拟器"
|
||||||
#461# "载入ROM后切换为全屏模式"
|
#461# "载入ROM后切换为全屏模式"
|
||||||
#462# "隐藏高级设置"
|
#462# "隐藏高级设置"
|
||||||
#463# "记住已选择的金手指"
|
#463# "记住已选择的金手指"
|
||||||
|
@ -255,7 +256,7 @@
|
||||||
#503# "自我修改码方案:"
|
#503# "自我修改码方案:"
|
||||||
#504# "默认存档容量:"
|
#504# "默认存档容量:"
|
||||||
#505# "高级模块连接"
|
#505# "高级模块连接"
|
||||||
#506# "当ROM加载后,开始模拟"
|
#506# "当读取完ROM后,开始模拟"
|
||||||
#507# "总是从 RDB 中覆盖默认设置"
|
#507# "总是从 RDB 中覆盖默认设置"
|
||||||
#508# "自动压缩即时存档文件"
|
#508# "自动压缩即时存档文件"
|
||||||
#509# "开启调试器"
|
#509# "开启调试器"
|
||||||
|
@ -318,7 +319,7 @@
|
||||||
#620# "使用最初的存档类型"
|
#620# "使用最初的存档类型"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -270,7 +270,7 @@
|
||||||
#620# "使用最初使用的存檔類型"
|
#620# "使用最初使用的存檔類型"
|
||||||
#621# "4-Kbit EEPROM"
|
#621# "4-Kbit EEPROM"
|
||||||
#622# "16-Kbit EEPROM"
|
#622# "16-Kbit EEPROM"
|
||||||
#623# "32-KByte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -266,7 +266,7 @@ RDB není pøítomno nebo volba dole 'pøepsat' je nezaškrtnutá"
|
||||||
#620# "* detek. první užívaný typ"
|
#620# "* detek. první užívaný typ"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbajtù SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbajtù flash RAM"
|
#624# "128-kbajtù flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -265,7 +265,7 @@
|
||||||
#620# "* Find den først anvendte type"
|
#620# "* Find den først anvendte type"
|
||||||
#621# "4kbit EEPROM"
|
#621# "4kbit EEPROM"
|
||||||
#622# "16kbit EEPROM"
|
#622# "16kbit EEPROM"
|
||||||
#623# "32kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128kbyte FlashRAM"
|
#624# "128kbyte FlashRAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -265,7 +265,7 @@
|
||||||
#620# "Gebruik de eerst gebruikte save"
|
#620# "Gebruik de eerst gebruikte save"
|
||||||
#621# "4kbit EEPROM"
|
#621# "4kbit EEPROM"
|
||||||
#622# "16kbit EEPROM"
|
#622# "16kbit EEPROM"
|
||||||
#623# "32kbytes SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flashram"
|
#624# "Flashram"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -88,6 +88,7 @@
|
||||||
#198# "Slot 8"
|
#198# "Slot 8"
|
||||||
#199# "Slot 9"
|
#199# "Slot 9"
|
||||||
#200# "Slot 10"
|
#200# "Slot 10"
|
||||||
|
#201# "Save Slot (%ws) selected"
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
#210# "Play Game"
|
#210# "Play Game"
|
||||||
|
|
|
@ -277,7 +277,7 @@ no RDB is present, or 'overwrite' option below is unchecked"
|
||||||
#620# "* detect first-used type"
|
#620# "* detect first-used type"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Käytä 1. tallennustyyppiä"
|
#620# "Käytä 1. tallennustyyppiä"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -318,7 +318,7 @@
|
||||||
#620# "Par défaut"
|
#620# "Par défaut"
|
||||||
#621# "4 kbit EEPROM"
|
#621# "4 kbit EEPROM"
|
||||||
#622# "16 kbit EEPROM"
|
#622# "16 kbit EEPROM"
|
||||||
#623# "32 ko SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Automatisch"
|
#620# "Automatisch"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -265,7 +265,7 @@
|
||||||
#620# "Automatisch"
|
#620# "Automatisch"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -266,7 +266,7 @@
|
||||||
#620# "Αυτόματος"
|
#620# "Αυτόματος"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Elõszöri mentés fajta használata"
|
#620# "Elõszöri mentés fajta használata"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Riconosci automaticamente"
|
#620# "Riconosci automaticamente"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-ko SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-ko flash RAM"
|
#624# "128-ko flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -265,7 +265,7 @@
|
||||||
#620# "Riconosci il salvataggio automaticamente"
|
#620# "Riconosci il salvataggio automaticamente"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-ko SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-ko flash RAM"
|
#624# "128-ko flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#1 # "Japanese" // LANGUAGE ID
|
#1 # "Japanese" // LANGUAGE ID
|
||||||
#2 # "Nekokabu" // Author
|
#2 # "Nekokabu" // Author
|
||||||
#3 # "2.2" // Version
|
#3 # "2.2" // Version
|
||||||
#4 # "2015/3/5" // Date
|
#4 # "2015/11/6" // Date
|
||||||
|
|
||||||
//About DLL Dialog
|
//About DLL Dialog
|
||||||
#5 # "現在の言語"
|
#5 # "現在の言語"
|
||||||
|
@ -317,7 +317,7 @@
|
||||||
#620# "自動検出"
|
#620# "自動検出"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Naudoti pirmà naudotà tipà"
|
#620# "Naudoti pirmà naudotà tipà"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Intergration Tab
|
//Shell Intergration Tab
|
||||||
|
|
|
@ -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"
|
#620# "bruk den første brukte lagrings typen"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
@ -430,4 +430,4 @@ Skift plugin og restart spill nå?"
|
||||||
#2043# "Det kode navnet er allerede i bruk"
|
#2043# "Det kode navnet er allerede i bruk"
|
||||||
#2044# "Du har nådd det maksimumme antall koder for denne ROM'en"
|
#2044# "Du har nådd det maksimumme antall koder for denne ROM'en"
|
||||||
|
|
||||||
//The End
|
//The End
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Pierwszy u¿yty format"
|
#620# "Pierwszy u¿yty format"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -267,7 +267,7 @@
|
||||||
#620# "По умолчанию"
|
#620# "По умолчанию"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -318,7 +318,7 @@
|
||||||
#620# "Usar primer tipo de guardado usado"
|
#620# "Usar primer tipo de guardado usado"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
#620# "Använd Första sparnings typ"
|
#620# "Använd Första sparnings typ"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbytes SRAM"
|
#623# "SRAM"
|
||||||
#624# "Flash RAM"
|
#624# "Flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
@ -422,5 +422,5 @@ Byta plugin och starta om nu?"
|
||||||
#2040# "Kan inte öppna filen på grund av att grafik pluginen inte är helt OK"
|
#2040# "Kan inte öppna filen på grund av att grafik pluginen inte är helt OK"
|
||||||
#2041# "Är du säker på att du vill ta bort det?"
|
#2041# "Är du säker på att du vill ta bort det?"
|
||||||
#2042# "Borttagna fusk"
|
#2042# "Borttagna fusk"
|
||||||
#2043# "Fuskets namn används redan"
|
#2043# "Fuskets namn används redan"
|
||||||
#2044# "Du har nåt max antalet av fusk för detta spelet"
|
#2044# "Du har nåt max antalet av fusk för detta spelet"
|
||||||
|
|
|
@ -267,7 +267,7 @@
|
||||||
#620# "Обирає програма"
|
#620# "Обирає програма"
|
||||||
#621# "4-kbit EEPROM"
|
#621# "4-kbit EEPROM"
|
||||||
#622# "16-kbit EEPROM"
|
#622# "16-kbit EEPROM"
|
||||||
#623# "32-kbyte SRAM"
|
#623# "SRAM"
|
||||||
#624# "128-kbyte flash RAM"
|
#624# "128-kbyte flash RAM"
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
|
|
BIN
Project64.sln
BIN
Project64.sln
Binary file not shown.
|
@ -2,13 +2,13 @@
|
||||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
|
||||||
<PropertyGroup Label="Configuration">
|
<PropertyGroup Label="Configuration">
|
||||||
<PlatformToolset>v140_xp</PlatformToolset>
|
<PlatformToolset>$(DefaultPlatformToolset)_xp</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ImportGroup Label="PropertySheets">
|
<ImportGroup Label="PropertySheets">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
|
||||||
<!-- All platforms settings -->
|
<!-- All platforms settings -->
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
|
<OutDir>$(SolutionDir)bin\$(Configuration)\</OutDir>
|
||||||
|
@ -192,15 +192,18 @@
|
||||||
</Xdcmake>
|
</Xdcmake>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<!-- END common platform settings -->
|
<!-- END common platform settings -->
|
||||||
|
|
||||||
<!-- Win32 -->
|
<!-- Win32 -->
|
||||||
<ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
|
<ItemDefinitionGroup Condition="'$(Platform)'=='Win32'">
|
||||||
|
<Lib>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Lib>
|
||||||
<Link>
|
<Link>
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<!-- END Win32 -->
|
<!-- END Win32 -->
|
||||||
|
|
||||||
<!-- x64 -->
|
<!-- x64 -->
|
||||||
<PropertyGroup Condition="'$(Platform)'=='x64'">
|
<PropertyGroup Condition="'$(Platform)'=='x64'">
|
||||||
<OutDir>$(SolutionDir)bin\$(Configuration)64\</OutDir>
|
<OutDir>$(SolutionDir)bin\$(Configuration)64\</OutDir>
|
||||||
|
@ -212,6 +215,9 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
|
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
|
||||||
|
<Lib>
|
||||||
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
|
</Lib>
|
||||||
<Link>
|
<Link>
|
||||||
<TargetMachine>MachineX64</TargetMachine>
|
<TargetMachine>MachineX64</TargetMachine>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
|
@ -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_
|
||||||
|
|
||||||
|
|
|
@ -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_ */
|
|
@ -94,7 +94,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCLCompilerTool"
|
Name="VCCLCompilerTool"
|
||||||
AdditionalIncludeDirectories=""$(Root)Source\3rd Party\wx\lib\vc_lib\mswd";"$(Root)Source\3rd Party\wx\include";"$(Root)Source\3rd Party\wx\src\tiff\libtiff";"$(Root)Source\3rd Party\wx\src\jpeg";"$(Root)Source\3rd Party\wx\src\png";"$(Root)Source\3rd Party\wx\src\zlib""
|
AdditionalIncludeDirectories=""$(Root)Source\3rd Party\wx\lib\vc_lib\msw";"$(Root)Source\3rd Party\wx\include";"$(Root)Source\3rd Party\wx\src\tiff\libtiff";"$(Root)Source\3rd Party\wx\src\jpeg";"$(Root)Source\3rd Party\wx\src\png";"$(Root)Source\3rd Party\wx\src\zlib""
|
||||||
PreprocessorDefinitions="_LIB;__WXMSW__;WXBUILDING;wxUSE_BASE=0"
|
PreprocessorDefinitions="_LIB;__WXMSW__;WXBUILDING;wxUSE_BASE=0"
|
||||||
PrecompiledHeaderThrough="wx/wxprec.h"
|
PrecompiledHeaderThrough="wx/wxprec.h"
|
||||||
DisableSpecificWarnings="4005"
|
DisableSpecificWarnings="4005"
|
||||||
|
@ -2172,9 +2172,9 @@
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"
|
Name="VCCustomBuildTool"
|
||||||
Description="Creating lib\vc_lib\mswu\wx\setup.h"
|
Description="Creating lib\vc_lib\msw\wx\setup.h"
|
||||||
CommandLine="copy "$(InputPath)" lib\vc_lib\mswu\wx\setup.h
"
|
CommandLine="copy "$(InputPath)" lib\vc_lib\msw\wx\setup.h
"
|
||||||
Outputs="lib\vc_lib\mswu\wx\setup.h"
|
Outputs="lib\vc_lib\msw\wx\setup.h"
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
</File>
|
</File>
|
||||||
|
@ -2394,9 +2394,9 @@
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"
|
Name="VCCustomBuildTool"
|
||||||
Description="Creating lib\vc_lib\mswud\wx\msw\rcdefs.h"
|
Description="Creating lib\vc_lib\mswd\wx\msw\rcdefs.h"
|
||||||
CommandLine="cl /EP /nologo "$(InputPath)" > "lib\vc_lib\mswud\wx\msw\rcdefs.h"
"
|
CommandLine="cl /EP /nologo "$(InputPath)" > "lib\vc_lib\mswd\wx\msw\rcdefs.h"
"
|
||||||
Outputs="lib\vc_lib\mswud\wx\msw\rcdefs.h"
|
Outputs="lib\vc_lib\mswd\wx\msw\rcdefs.h"
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
<FileConfiguration
|
<FileConfiguration
|
||||||
|
@ -2404,8 +2404,8 @@
|
||||||
>
|
>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"
|
Name="VCCustomBuildTool"
|
||||||
Description="Creating lib\vc_lib\mswu\wx\msw\rcdefs.h"
|
Description="Creating lib\vc_lib\msw\wx\msw\rcdefs.h"
|
||||||
CommandLine="cl /EP /nologo "$(InputPath)" > "lib\vc_lib\mswu\wx\msw\rcdefs.h"
"
|
CommandLine="cl /EP /nologo "$(InputPath)" > "lib\vc_lib\msw\wx\msw\rcdefs.h"
"
|
||||||
Outputs="lib\vc_lib\mswu\wx\msw\rcdefs.h"
|
Outputs="lib\vc_lib\mswu\wx\msw\rcdefs.h"
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
|
@ -3763,11 +3763,11 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\splitter.h"
|
RelativePath="include\wx\persist\splitter.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\persist\splitter.h"
|
RelativePath="include\wx\splitter.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
@ -3851,11 +3851,11 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\toolbar.h"
|
RelativePath="include\wx\ribbon\toolbar.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\ribbon\toolbar.h"
|
RelativePath="include\wx\toolbar.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
@ -3867,11 +3867,11 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\toplevel.h"
|
RelativePath="include\wx\persist\toplevel.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\persist\toplevel.h"
|
RelativePath="include\wx\toplevel.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
@ -3879,11 +3879,11 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\treebook.h"
|
RelativePath="include\wx\persist\treebook.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="include\wx\persist\treebook.h"
|
RelativePath="include\wx\treebook.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
<File
|
||||||
|
|
|
@ -148,7 +148,19 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<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>
|
||||||
<File
|
<File
|
||||||
|
|
|
@ -177,10 +177,18 @@
|
||||||
/>
|
/>
|
||||||
</FileConfiguration>
|
</FileConfiguration>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\SyncEvent.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="Trace.cpp"
|
RelativePath="Trace.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Util.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
|
@ -230,6 +238,10 @@
|
||||||
RelativePath=".\stdtypes.h"
|
RelativePath=".\stdtypes.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\SyncEvent.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="Trace.h"
|
RelativePath="Trace.h"
|
||||||
>
|
>
|
||||||
|
@ -238,6 +250,10 @@
|
||||||
RelativePath="TraceDefs.h"
|
RelativePath="TraceDefs.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Util.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
|
|
|
@ -43,7 +43,9 @@
|
||||||
<ClCompile Include="stdafx.cpp">
|
<ClCompile Include="stdafx.cpp">
|
||||||
<PrecompiledHeader>Create</PrecompiledHeader>
|
<PrecompiledHeader>Create</PrecompiledHeader>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="SyncEvent.cpp" />
|
||||||
<ClCompile Include="Trace.cpp" />
|
<ClCompile Include="Trace.cpp" />
|
||||||
|
<ClCompile Include="Util.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="CriticalSection.h" />
|
<ClInclude Include="CriticalSection.h" />
|
||||||
|
@ -57,7 +59,9 @@
|
||||||
<ClInclude Include="std string.h" />
|
<ClInclude Include="std string.h" />
|
||||||
<ClInclude Include="stdafx.h" />
|
<ClInclude Include="stdafx.h" />
|
||||||
<ClInclude Include="stdtypes.h" />
|
<ClInclude Include="stdtypes.h" />
|
||||||
|
<ClInclude Include="SyncEvent.h" />
|
||||||
<ClInclude Include="Trace.h" />
|
<ClInclude Include="Trace.h" />
|
||||||
<ClInclude Include="TraceDefs.h" />
|
<ClInclude Include="TraceDefs.h" />
|
||||||
|
<ClInclude Include="Util.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -41,6 +41,12 @@
|
||||||
<ClCompile Include="CriticalSection.cpp">
|
<ClCompile Include="CriticalSection.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="SyncEvent.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Util.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="CriticalSection.h">
|
<ClInclude Include="CriticalSection.h">
|
||||||
|
@ -82,5 +88,11 @@
|
||||||
<ClInclude Include="stdtypes.h">
|
<ClInclude Include="stdtypes.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="SyncEvent.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Util.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -79,20 +79,14 @@ bool CFile::Open(const char * lpszFileName, uint32_t nOpenFlags)
|
||||||
sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0;
|
sa.bInheritHandle = (nOpenFlags & modeNoInherit) == 0;
|
||||||
|
|
||||||
// map creation flags
|
// map creation flags
|
||||||
ULONG dwCreateFlag = 0;
|
ULONG dwCreateFlag = OPEN_EXISTING;
|
||||||
if (nOpenFlags & modeCreate)
|
if (nOpenFlags & modeCreate)
|
||||||
{
|
{
|
||||||
if (nOpenFlags & modeNoTruncate)
|
dwCreateFlag = ((nOpenFlags & modeNoTruncate) != 0) ? OPEN_ALWAYS : CREATE_ALWAYS;
|
||||||
dwCreateFlag = OPEN_ALWAYS;
|
|
||||||
else
|
|
||||||
dwCreateFlag = CREATE_ALWAYS;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
dwCreateFlag = OPEN_EXISTING;
|
|
||||||
|
|
||||||
// attempt file creation
|
// attempt file creation
|
||||||
HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa,
|
HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode, &sa, dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
||||||
if (hFile == INVALID_HANDLE_VALUE)
|
if (hFile == INVALID_HANDLE_VALUE)
|
||||||
{ //#define ERROR_PATH_NOT_FOUND 3L
|
{ //#define ERROR_PATH_NOT_FOUND 3L
|
||||||
//ULONG err = GetLastError();
|
//ULONG err = GetLastError();
|
||||||
|
@ -169,12 +163,12 @@ uint32_t CFile::Read(void* lpBuf, uint32_t nCount)
|
||||||
return 0; // avoid Win32 "null-read"
|
return 0; // avoid Win32 "null-read"
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG dwRead = 0;
|
DWORD dwRead = 0;
|
||||||
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
|
if (!::ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL))
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (UINT)dwRead;
|
return (uint32_t)dwRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
long CFile::Seek(long lOff, SeekPosition nFrom)
|
long CFile::Seek(long lOff, SeekPosition nFrom)
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
class CFileBase
|
class CFileBase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum OpenFlags {
|
enum OpenFlags
|
||||||
|
{
|
||||||
modeRead = 0x0000,
|
modeRead = 0x0000,
|
||||||
modeWrite = 0x0001,
|
modeWrite = 0x0001,
|
||||||
modeReadWrite = 0x0002,
|
modeReadWrite = 0x0002,
|
||||||
|
@ -19,7 +20,8 @@ public:
|
||||||
modeNoTruncate = 0x2000,
|
modeNoTruncate = 0x2000,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Attribute {
|
enum Attribute
|
||||||
|
{
|
||||||
normal = 0x00,
|
normal = 0x00,
|
||||||
readOnly = 0x01,
|
readOnly = 0x01,
|
||||||
hidden = 0x02,
|
hidden = 0x02,
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <TChar.h>
|
|
||||||
|
|
||||||
CLog::CLog (void ) :
|
CLog::CLog (void ) :
|
||||||
m_FlushOnWrite(false),
|
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)
|
if (FileName == NULL)
|
||||||
{
|
{
|
||||||
|
@ -34,14 +33,14 @@ bool CLog::Open( LPCTSTR FileName, LOG_OPEN_MODE mode /* = Log_New */)
|
||||||
m_hLogFile.Close();
|
m_hLogFile.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG nOpenFlags = CFile::modeReadWrite | CFile::modeCreate;
|
uint32_t nOpenFlags = CFile::modeReadWrite | CFile::modeCreate;
|
||||||
if (mode == Log_Append) { nOpenFlags |= CFile::modeNoTruncate; }
|
if (mode == Log_Append) { nOpenFlags |= CFile::modeNoTruncate; }
|
||||||
|
|
||||||
if (!m_hLogFile.Open(File, nOpenFlags))
|
if (!m_hLogFile.Open(File, nOpenFlags))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_FileName = (LPCTSTR)File;
|
m_FileName = (const char *)File;
|
||||||
m_hLogFile.Seek(0,mode == Log_Append ? CFile::end : CFile::begin);
|
m_hLogFile.Seek(0,mode == Log_Append ? CFile::end : CFile::begin);
|
||||||
|
|
||||||
#ifdef _UNICODE
|
#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_list ap;
|
||||||
va_start( ap, Message );
|
va_start( ap, Message );
|
||||||
|
@ -72,7 +71,7 @@ void CLog::LogF(LPCTSTR Message, ...)
|
||||||
va_end( ap );
|
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; }
|
if (!m_hLogFile.IsOpen()) { return; }
|
||||||
|
|
||||||
|
@ -112,14 +111,16 @@ void CLog::LogArgs(LPCTSTR Message, va_list & args )
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer)
|
if (buffer)
|
||||||
|
{
|
||||||
delete [] buffer;
|
delete [] buffer;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CLog::Log( LPCTSTR Message )
|
void CLog::Log( const char * Message )
|
||||||
{
|
{
|
||||||
if (!m_hLogFile.IsOpen()) { return; }
|
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)
|
if (m_FlushOnWrite)
|
||||||
{
|
{
|
||||||
m_hLogFile.Flush();
|
m_hLogFile.Flush();
|
||||||
|
@ -128,7 +129,7 @@ void CLog::Log( LPCTSTR Message )
|
||||||
if (m_TruncateFileLog)
|
if (m_TruncateFileLog)
|
||||||
{
|
{
|
||||||
// check file size
|
// check file size
|
||||||
ULONG FileSize = m_hLogFile.GetLength();
|
uint32_t FileSize = m_hLogFile.GetLength();
|
||||||
// if larger then max size then
|
// if larger then max size then
|
||||||
if (FileSize > m_MaxFileSize)
|
if (FileSize > m_MaxFileSize)
|
||||||
{
|
{
|
||||||
|
@ -138,16 +139,17 @@ void CLog::Log( LPCTSTR Message )
|
||||||
FileSize = m_hLogFile.GetLength();
|
FileSize = m_hLogFile.GetLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD end = m_hLogFile.SeekToEnd();
|
uint32_t end = m_hLogFile.SeekToEnd();
|
||||||
|
|
||||||
// move to reduce size
|
// move to reduce size
|
||||||
m_hLogFile.Seek((end - m_MaxFileSize) + m_FileChangeSize,CFile::begin);
|
m_hLogFile.Seek((end - m_MaxFileSize) + m_FileChangeSize,CFile::begin);
|
||||||
|
|
||||||
// Find next end of line
|
// Find next end of line
|
||||||
DWORD NextEnter = 0, dwRead = 0;
|
uint32_t NextEnter = 0, dwRead = 0;
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
BYTE Data[300];
|
BYTE Data[300];
|
||||||
DWORD dwRead;
|
uint32_t dwRead;
|
||||||
|
|
||||||
dwRead = m_hLogFile.Read(Data,sizeof(Data));
|
dwRead = m_hLogFile.Read(Data,sizeof(Data));
|
||||||
if (dwRead == 0)
|
if (dwRead == 0)
|
||||||
|
@ -168,9 +170,10 @@ void CLog::Log( LPCTSTR Message )
|
||||||
} while(dwRead != 0);
|
} while(dwRead != 0);
|
||||||
|
|
||||||
// copy content of log to the new file
|
// copy content of log to the new file
|
||||||
DWORD ReadPos = (end - m_MaxFileSize) + m_FileChangeSize + NextEnter;
|
uint32_t ReadPos = (end - m_MaxFileSize) + m_FileChangeSize + NextEnter;
|
||||||
DWORD SizeToRead, WritePos = 0;
|
uint32_t SizeToRead, WritePos = 0;
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
enum { fIS_MvSize = 0x5000 };
|
enum { fIS_MvSize = 0x5000 };
|
||||||
unsigned char Data[fIS_MvSize + 1];
|
unsigned char Data[fIS_MvSize + 1];
|
||||||
|
|
||||||
|
@ -179,7 +182,7 @@ void CLog::Log( LPCTSTR Message )
|
||||||
|
|
||||||
m_hLogFile.Seek(ReadPos,CFile::begin);
|
m_hLogFile.Seek(ReadPos,CFile::begin);
|
||||||
|
|
||||||
DWORD dwRead;
|
uint32_t dwRead;
|
||||||
dwRead = m_hLogFile.Read(Data,SizeToRead);
|
dwRead = m_hLogFile.Read(Data,SizeToRead);
|
||||||
|
|
||||||
m_hLogFile.Seek(WritePos,CFile::begin);
|
m_hLogFile.Seek(WritePos,CFile::begin);
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
#ifndef __LOG_CLASS__H__
|
#pragma once
|
||||||
#define __LOG_CLASS__H__
|
#include "File Class.h"
|
||||||
|
|
||||||
enum LOG_OPEN_MODE {
|
enum LOG_OPEN_MODE
|
||||||
|
{
|
||||||
Log_New, Log_Append
|
Log_New, Log_Append
|
||||||
};
|
};
|
||||||
|
|
||||||
class CLog {
|
class CLog
|
||||||
|
{
|
||||||
enum { MB = 1024 * 1024 };
|
enum { MB = 1024 * 1024 };
|
||||||
enum { MAX_FILE_SIZE = 10 * MB };
|
enum { MAX_FILE_SIZE = 10 * MB };
|
||||||
|
|
||||||
|
@ -13,24 +15,24 @@ class CLog {
|
||||||
bool m_FlushOnWrite;
|
bool m_FlushOnWrite;
|
||||||
stdstr m_FileName;
|
stdstr m_FileName;
|
||||||
bool m_TruncateFileLog;
|
bool m_TruncateFileLog;
|
||||||
ULONG m_MaxFileSize;
|
uint32_t m_MaxFileSize;
|
||||||
ULONG m_FileChangeSize;
|
uint32_t m_FileChangeSize;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CLog ( void );
|
CLog ( void );
|
||||||
~CLog ( void );
|
~CLog ( void );
|
||||||
|
|
||||||
bool Open ( LPCTSTR FileName, LOG_OPEN_MODE mode = Log_New );
|
bool Open ( const char * FileName, LOG_OPEN_MODE mode = Log_New );
|
||||||
void Log ( LPCTSTR Message );
|
void Log ( const char * Message );
|
||||||
void LogF ( LPCTSTR Message, ... );
|
void LogF ( const char * Message, ... );
|
||||||
void LogArgs ( LPCTSTR Message, va_list & args );
|
void LogArgs ( const char * Message, va_list & args );
|
||||||
bool Empty ( void );
|
bool Empty ( void );
|
||||||
void Close ( void );
|
void Close ( void );
|
||||||
|
|
||||||
inline void SetMaxFileSize ( ULONG Size )
|
inline void SetMaxFileSize ( uint32_t Size )
|
||||||
{
|
{
|
||||||
m_MaxFileSize = 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 SetTruncateFile( bool Truncate ) { m_TruncateFileLog = Truncate; }
|
||||||
inline void SetFlush ( bool Always ) { m_FlushOnWrite = Always; }
|
inline void SetFlush ( bool Always ) { m_FlushOnWrite = Always; }
|
||||||
|
@ -38,5 +40,3 @@ public:
|
||||||
inline bool Flush ( void ) { return m_hLogFile.Flush(); }
|
inline bool Flush ( void ) { return m_hLogFile.Flush(); }
|
||||||
inline const stdstr & FileName ( void ) const { return m_FileName; }
|
inline const stdstr & FileName ( void ) const { return m_FileName; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
};
|
|
@ -12,20 +12,20 @@ public:
|
||||||
CTraceLog()
|
CTraceLog()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
~CTraceLog() { CloseTrace (); }
|
~CTraceLog() { CloseTrace(); }
|
||||||
|
|
||||||
CTraceModule * AddTraceModule ( CTraceModule * TraceModule );
|
CTraceModule * AddTraceModule(CTraceModule * TraceModule);
|
||||||
CTraceModule * RemoveTraceModule ( CTraceModule * TraceModule );
|
CTraceModule * RemoveTraceModule(CTraceModule * TraceModule);
|
||||||
void CloseTrace ( void );
|
void CloseTrace(void);
|
||||||
void WriteTrace ( TraceType Type, LPCTSTR Message );
|
void WriteTrace(TraceType Type, LPCTSTR Message);
|
||||||
void WriteTraceF ( TraceType Type, LPCTSTR strFormat, va_list args);
|
void WriteTraceF(TraceType Type, LPCTSTR strFormat, va_list args);
|
||||||
};
|
};
|
||||||
|
|
||||||
CTraceModule * CTraceLog::AddTraceModule ( CTraceModule * TraceModule )
|
CTraceModule * CTraceLog::AddTraceModule(CTraceModule * TraceModule)
|
||||||
{
|
{
|
||||||
CGuard Guard(m_CS);
|
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)
|
if (m_Modules[i] == TraceModule)
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ CTraceModule * CTraceLog::AddTraceModule ( CTraceModule * TraceModule )
|
||||||
return TraceModule;
|
return TraceModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTraceModule * CTraceLog::RemoveTraceModule ( CTraceModule * TraceModule )
|
CTraceModule * CTraceLog::RemoveTraceModule(CTraceModule * TraceModule)
|
||||||
{
|
{
|
||||||
CGuard Guard(m_CS);
|
CGuard Guard(m_CS);
|
||||||
|
|
||||||
|
@ -51,38 +51,38 @@ CTraceModule * CTraceLog::RemoveTraceModule ( CTraceModule * TraceModule )
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTraceLog::CloseTrace ( void)
|
void CTraceLog::CloseTrace(void)
|
||||||
{
|
{
|
||||||
CGuard Guard(m_CS);
|
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];
|
delete m_Modules[i];
|
||||||
}
|
}
|
||||||
m_Modules.clear();
|
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];
|
TCHAR pBuffer[nMaxSize];
|
||||||
|
|
||||||
_vsntprintf(pBuffer,nMaxSize,strFormat,args);
|
_vsntprintf(pBuffer, nMaxSize, strFormat, args);
|
||||||
pBuffer[nMaxSize - 1] = 0;
|
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);
|
CGuard Guard(m_CS);
|
||||||
|
|
||||||
if (Type != TraceNone)
|
if (Type != TraceNone)
|
||||||
{
|
{
|
||||||
bool WriteToLog = false;
|
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)
|
if ((m_Modules[i]->GetTraceLevel() & Type) != 0)
|
||||||
{
|
{
|
||||||
WriteToLog = true;
|
WriteToLog = true;
|
||||||
break;
|
break;
|
||||||
|
@ -99,58 +99,57 @@ void CTraceLog::WriteTrace ( TraceType Type, LPCTSTR Message)
|
||||||
SYSTEMTIME sysTime;
|
SYSTEMTIME sysTime;
|
||||||
::GetLocalTime(&sysTime);
|
::GetLocalTime(&sysTime);
|
||||||
|
|
||||||
nPos = _stprintf( pBuffer, _T("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d: "), sysTime.wYear,
|
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,
|
sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds,
|
||||||
::GetCurrentThreadId()
|
::GetCurrentThreadId()
|
||||||
);
|
);
|
||||||
|
|
||||||
// show the debug level
|
// show the debug level
|
||||||
if (Type == TraceNone) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("None : ")); }
|
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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & TraceValidate) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Valid : ")); }
|
||||||
else if ((Type & TraceAudio )!= 0) { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Audio : ")); }
|
else if ((Type & TraceAudio) != 0) { nPos += _stprintf(pBuffer + nPos, _T("%s"), _T("Audio : ")); }
|
||||||
else { nPos += _stprintf(pBuffer+nPos,_T("%s"),_T("Unknown: ")); }
|
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)
|
if ((m_Modules[i]->GetTraceLevel() & Type) != 0)
|
||||||
{
|
{
|
||||||
m_Modules[i]->Write(pBuffer, false);
|
m_Modules[i]->Write(pBuffer, 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)
|
if ((m_Modules[i]->GetTraceLevel() & Type) != 0)
|
||||||
{
|
{
|
||||||
m_Modules[i]->Write(Message, true);
|
m_Modules[i]->Write(Message, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CTraceLog & GetTraceObjet(void)
|
||||||
CTraceLog & GetTraceObjet ( void )
|
|
||||||
{
|
{
|
||||||
static CTraceLog TraceLog;
|
static CTraceLog TraceLog;
|
||||||
return TraceLog;
|
return TraceLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteTrace (TraceType Type, LPCTSTR Message )
|
void WriteTrace(TraceType Type, LPCTSTR Message)
|
||||||
{
|
{
|
||||||
if (TraceClosed)
|
if (TraceClosed)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
GetTraceObjet().WriteTrace(Type,Message);
|
GetTraceObjet().WriteTrace(Type, Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteTraceF ( TraceType Type, LPCTSTR strFormat, ... )
|
void WriteTraceF(TraceType Type, LPCTSTR strFormat, ...)
|
||||||
{
|
{
|
||||||
if (TraceClosed)
|
if (TraceClosed)
|
||||||
{
|
{
|
||||||
|
@ -158,11 +157,11 @@ void WriteTraceF ( TraceType Type, LPCTSTR strFormat, ... )
|
||||||
}
|
}
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, strFormat);
|
va_start(args, strFormat);
|
||||||
GetTraceObjet().WriteTraceF(Type,strFormat,args);
|
GetTraceObjet().WriteTraceF(Type, strFormat, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTraceModule * AddTraceModule ( CTraceModule * TraceModule )
|
CTraceModule * AddTraceModule(CTraceModule * TraceModule)
|
||||||
{
|
{
|
||||||
if (TraceClosed)
|
if (TraceClosed)
|
||||||
{
|
{
|
||||||
|
@ -172,52 +171,52 @@ CTraceModule * AddTraceModule ( CTraceModule * TraceModule )
|
||||||
return TraceModule;
|
return TraceModule;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTraceModule * RemoveTraceModule ( CTraceModule * TraceModule )
|
CTraceModule * RemoveTraceModule(CTraceModule * TraceModule)
|
||||||
{
|
{
|
||||||
return GetTraceObjet().RemoveTraceModule(TraceModule);
|
return GetTraceObjet().RemoveTraceModule(TraceModule);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloseTrace ( void )
|
void CloseTrace(void)
|
||||||
{
|
{
|
||||||
TraceClosed = true;
|
TraceClosed = true;
|
||||||
GetTraceObjet().CloseTrace();
|
GetTraceObjet().CloseTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile ) :
|
CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile) :
|
||||||
m_FlushFile(FlushFile)
|
m_FlushFile(FlushFile)
|
||||||
{
|
{
|
||||||
m_hLogFile.SetFlush(false);
|
m_hLogFile.SetFlush(false);
|
||||||
m_hLogFile.SetTruncateFile(true);
|
m_hLogFile.SetTruncateFile(true);
|
||||||
m_hLogFile.SetMaxFileSize(5 * MB);
|
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) :
|
CTraceFileLog::CTraceFileLog(LPCTSTR FileName, bool FlushFile, LOG_OPEN_MODE eMode, size_t dwMaxFileSize) :
|
||||||
m_FlushFile(FlushFile)
|
m_FlushFile(FlushFile)
|
||||||
{
|
{
|
||||||
enum { MB = 1024 * 1024 };
|
enum { MB = 1024 * 1024 };
|
||||||
|
|
||||||
m_hLogFile.SetFlush(false);
|
m_hLogFile.SetFlush(false);
|
||||||
m_hLogFile.SetTruncateFile(true);
|
m_hLogFile.SetTruncateFile(true);
|
||||||
|
|
||||||
if(dwMaxFileSize < 2048 && dwMaxFileSize > 2)
|
if (dwMaxFileSize < 3 || dwMaxFileSize > 2047)
|
||||||
m_hLogFile.SetMaxFileSize(dwMaxFileSize * MB);
|
{ /* Clamp file size to 5 MB if it exceeds 2047 or falls short of 3. */
|
||||||
else
|
dwMaxFileSize = 5;
|
||||||
m_hLogFile.SetMaxFileSize(5 * MB);
|
}
|
||||||
|
m_hLogFile.SetMaxFileSize(dwMaxFileSize * MB);
|
||||||
|
|
||||||
m_hLogFile.Open(FileName,eMode);
|
m_hLogFile.Open(FileName, eMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CTraceFileLog::~CTraceFileLog()
|
CTraceFileLog::~CTraceFileLog()
|
||||||
{
|
{
|
||||||
TraceClosed = true;
|
TraceClosed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTraceFileLog::Write(LPCTSTR Message, bool EndOfLine )
|
void CTraceFileLog::Write(LPCTSTR Message, bool EndOfLine)
|
||||||
{
|
{
|
||||||
if (!m_hLogFile.IsOpen()) { return; }
|
if (!m_hLogFile.IsOpen()) { return; }
|
||||||
|
|
||||||
CGuard Section(m_CriticalSection);
|
CGuard Section(m_CriticalSection);
|
||||||
m_hLogFile.Log(Message);
|
m_hLogFile.Log(Message);
|
||||||
if (EndOfLine)
|
if (EndOfLine)
|
||||||
|
@ -230,7 +229,16 @@ void CTraceFileLog::Write(LPCTSTR Message, bool EndOfLine )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTraceFileLog::SetFlushFile( bool bFlushFile )
|
void CTraceFileLog::SetFlushFile(bool bFlushFile)
|
||||||
{
|
{
|
||||||
m_FlushFile = bFlushFile;
|
m_FlushFile = bFlushFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDebugTraceLog::Write(const char * Message, bool EndOfLine)
|
||||||
|
{
|
||||||
|
OutputDebugString(Message);
|
||||||
|
if (EndOfLine)
|
||||||
|
{
|
||||||
|
OutputDebugString("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "CriticalSection.h"
|
||||||
|
#include "Log Class.h"
|
||||||
|
|
||||||
class CTraceModule
|
class CTraceModule
|
||||||
{
|
{
|
||||||
TraceLevel m_Type;
|
TraceLevel m_Type;
|
||||||
|
@ -10,7 +13,7 @@ public:
|
||||||
|
|
||||||
inline void SetTraceLevel ( TraceLevel Type ) { m_Type = Type; }
|
inline void SetTraceLevel ( TraceLevel Type ) { m_Type = Type; }
|
||||||
inline TraceLevel GetTraceLevel ( void ) const { return m_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
|
class CTraceFileLog : public CTraceModule
|
||||||
|
@ -22,25 +25,18 @@ class CTraceFileLog : public CTraceModule
|
||||||
bool m_FlushFile;
|
bool m_FlushFile;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CTraceFileLog (LPCTSTR FileName, bool FlushFile = true);
|
CTraceFileLog (const char * FileName, bool FlushFile = true);
|
||||||
CTraceFileLog (LPCTSTR FileName, bool FlushFile, LOG_OPEN_MODE eMode, DWORD dwMaxFileSize = 5);
|
CTraceFileLog(const char * FileName, bool FlushFile, LOG_OPEN_MODE eMode, size_t dwMaxFileSize = 5);
|
||||||
virtual ~CTraceFileLog ();
|
virtual ~CTraceFileLog ();
|
||||||
|
|
||||||
void Write ( LPCTSTR Message, bool EndOfLine );
|
void Write ( const char * Message, bool EndOfLine );
|
||||||
void SetFlushFile ( bool bFlushFile );
|
void SetFlushFile ( bool bFlushFile );
|
||||||
};
|
};
|
||||||
|
|
||||||
class CDebugTraceLog : public CTraceModule
|
class CDebugTraceLog : public CTraceModule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Write ( LPCTSTR Message, bool EndOfLine )
|
void Write ( const char * Message, bool EndOfLine );
|
||||||
{
|
|
||||||
OutputDebugString(Message);
|
|
||||||
if (EndOfLine)
|
|
||||||
{
|
|
||||||
OutputDebugString("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CTraceModule * AddTraceModule ( CTraceModule * TraceModule ); // Must be created with new
|
CTraceModule * AddTraceModule ( CTraceModule * TraceModule ); // Must be created with new
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
||||||
|
};
|
|
@ -1,22 +1,22 @@
|
||||||
// MD5.CC - source code for the C++/object oriented translation and
|
// MD5.CC - source code for the C++/object oriented translation and
|
||||||
// modification of MD5.
|
// modification of MD5.
|
||||||
|
|
||||||
// Translation and modification (c) 1995 by Mordechai T. Abzug
|
// Translation and modification (c) 1995 by Mordechai T. Abzug
|
||||||
|
|
||||||
// This translation/ modification is provided "as is," without express or
|
// This translation/ modification is provided "as is," without express or
|
||||||
// implied warranty of any kind.
|
// implied warranty of any kind.
|
||||||
|
|
||||||
// The translator/ modifier does not claim (1) that MD5 will do what you think
|
// The translator/ modifier does not claim (1) that MD5 will do what you think
|
||||||
// it does; (2) that this translation/ modification is accurate; or (3) that
|
// it does; (2) that this translation/ modification is accurate; or (3) that
|
||||||
// this software is "merchantible." (Language for this disclaimer partially
|
// this software is "merchantible." (Language for this disclaimer partially
|
||||||
// copied from the disclaimer below).
|
// copied from the disclaimer below).
|
||||||
|
|
||||||
/* based on:
|
/* based on:
|
||||||
|
|
||||||
MD5.H - header file for MD5C.C
|
MD5.H - header file for MD5C.C
|
||||||
MDDRIVER.C - test driver for MD2, MD4 and MD5
|
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.
|
rights reserved.
|
||||||
|
|
||||||
License to copy and use this software is granted provided that it
|
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_)
|
#pragma once
|
||||||
#define AFX_MD5_H__6DD6923B_E241_40CE_81A3_4C2C88C140E4__INCLUDED_
|
|
||||||
|
|
||||||
/* sprintf() */
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
@ -51,106 +47,102 @@ documentation and/or software.
|
||||||
|
|
||||||
struct MD5Digest
|
struct MD5Digest
|
||||||
{
|
{
|
||||||
MD5Digest() { Reset(); }
|
MD5Digest() { Reset(); }
|
||||||
unsigned char digest[16];
|
unsigned char digest[16];
|
||||||
|
|
||||||
void Reset() { ::memset(digest, 0, sizeof(digest)); }
|
void Reset() { ::memset(digest, 0, sizeof(digest)); }
|
||||||
BOOL IsClear()
|
bool IsClear()
|
||||||
{
|
{
|
||||||
int isClear = 0;
|
int isClear = 0;
|
||||||
for (int i=0; i < 16; i++)
|
for (int i=0; i < 16; i++)
|
||||||
isClear += digest[i];
|
{
|
||||||
return (isClear == 0);
|
isClear += digest[i];
|
||||||
}
|
}
|
||||||
std::string String ( void )
|
return (isClear == 0);
|
||||||
{
|
}
|
||||||
char s[33];
|
std::string String ( void )
|
||||||
|
{
|
||||||
|
char s[33];
|
||||||
|
|
||||||
::memset(s, 0, sizeof(s));
|
::memset(s, 0, sizeof(s));
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
sprintf(s+i*2, "%02X", digest[i]);
|
sprintf(s+i*2, "%02X", digest[i]);
|
||||||
}
|
}
|
||||||
s[32]='\0';
|
s[32]='\0';
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MD5Digest_less : std::binary_function<MD5Digest, MD5Digest, bool>
|
struct MD5Digest_less : std::binary_function<MD5Digest, MD5Digest, bool>
|
||||||
{
|
{
|
||||||
bool operator()(const MD5Digest& x, const MD5Digest& y) const
|
bool operator()(const MD5Digest& x, const MD5Digest& y) const
|
||||||
{
|
{
|
||||||
return (memcmp(x.digest, y.digest, sizeof(x.digest)) < 0);
|
return (memcmp(x.digest, y.digest, sizeof(x.digest)) < 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class MD5
|
class MD5
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// methods for controlled operation:
|
// methods for controlled operation:
|
||||||
MD5 (); // simple initializer
|
MD5 (); // simple initializer
|
||||||
~MD5 ();
|
~MD5 ();
|
||||||
void update (const unsigned char *input, unsigned int input_length);
|
void update (const unsigned char *input, unsigned int input_length);
|
||||||
void update (FILE *file);
|
void update (FILE *file);
|
||||||
void finalize ();
|
void finalize ();
|
||||||
|
|
||||||
// constructors for special circumstances. All these constructors finalize
|
// constructors for special circumstances. All these constructors finalize
|
||||||
// the MD5 context.
|
// the MD5 context.
|
||||||
MD5 (CPath File); // digest File, finalize
|
MD5 (CPath File); // digest File, finalize
|
||||||
MD5 (const unsigned char *string); // digest string, finalize
|
MD5 (const unsigned char *string); // digest string, finalize
|
||||||
MD5 (FILE *file); // digest file, close, finalize
|
MD5 (FILE *file); // digest file, close, finalize
|
||||||
MD5 (const unsigned char *input, unsigned int input_length);
|
MD5 (const unsigned char *input, unsigned int input_length);
|
||||||
MD5 (const stdstr & string);
|
MD5 (const stdstr & string);
|
||||||
|
|
||||||
// methods to acquire finalized result
|
// methods to acquire finalized result
|
||||||
void get_digest(MD5Digest& extdigest); //Digest into a digest structure
|
void get_digest(MD5Digest& extdigest); //Digest into a digest structure
|
||||||
const unsigned char *raw_digest (); // digest as a 16-byte binary array
|
const unsigned char *raw_digest (); // digest as a 16-byte binary array
|
||||||
const char * hex_digest (); // digest as a 33-byte ascii-hex string
|
const char * hex_digest (); // digest as a 33-byte ascii-hex string
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// first, some types:
|
// first, some types:
|
||||||
typedef unsigned int uint4; // assumes integer is 4 words long
|
typedef unsigned int uint4; // assumes integer is 4 words long
|
||||||
typedef unsigned short int uint2; // assumes short integer is 2 words long
|
typedef unsigned short int uint2; // assumes short integer is 2 words long
|
||||||
typedef unsigned char uint1; // assumes char is 1 word long
|
typedef unsigned char uint1; // assumes char is 1 word long
|
||||||
|
|
||||||
// next, the private data:
|
// next, the private data:
|
||||||
uint4 state[4];
|
uint4 state[4];
|
||||||
uint4 count[2]; // number of *bits*, mod 2^64
|
uint4 count[2]; // number of *bits*, mod 2^64
|
||||||
uint1 buffer[64]; // input buffer
|
uint1 buffer[64]; // input buffer
|
||||||
uint1 digest[16];
|
uint1 digest[16];
|
||||||
uint1 finalized;
|
uint1 finalized;
|
||||||
stdstr m_hex_digest;
|
stdstr m_hex_digest;
|
||||||
|
|
||||||
// last, the private methods, mostly static:
|
// last, the private methods, mostly static:
|
||||||
void init (); // called by all constructors
|
void init (); // called by all constructors
|
||||||
void transform (uint1 *buffer); // does the real update work. Note
|
void transform (uint1 *buffer); // does the real update work. Note
|
||||||
// that length is implied to be 64.
|
// that length is implied to be 64.
|
||||||
|
|
||||||
static void encode (uint1 *dest, uint4 *src, uint4 length);
|
static void encode (uint1 *dest, uint4 *src, uint4 length);
|
||||||
static void decode (uint4 *dest, uint1 *src, uint4 length);
|
static void decode (uint4 *dest, uint1 *src, uint4 length);
|
||||||
static void memcpy (uint1 *dest, uint1 *src, uint4 length);
|
static void memcpy (uint1 *dest, uint1 *src, uint4 length);
|
||||||
static void memset (uint1 *start, uint1 val, uint4 length);
|
static void memset (uint1 *start, uint1 val, uint4 length);
|
||||||
|
|
||||||
static inline uint4 rotate_left (uint4 x, uint4 n);
|
|
||||||
static inline uint4 F (uint4 x, uint4 y, uint4 z);
|
|
||||||
static inline uint4 G (uint4 x, uint4 y, uint4 z);
|
|
||||||
static inline uint4 H (uint4 x, uint4 y, uint4 z);
|
|
||||||
static inline uint4 I (uint4 x, uint4 y, uint4 z);
|
|
||||||
static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
|
||||||
uint4 s, uint4 ac);
|
|
||||||
static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
|
||||||
uint4 s, uint4 ac);
|
|
||||||
static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
|
||||||
uint4 s, uint4 ac);
|
|
||||||
static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
|
||||||
uint4 s, uint4 ac);
|
|
||||||
|
|
||||||
|
static inline uint4 rotate_left (uint4 x, uint4 n);
|
||||||
|
static inline uint4 F (uint4 x, uint4 y, uint4 z);
|
||||||
|
static inline uint4 G (uint4 x, uint4 y, uint4 z);
|
||||||
|
static inline uint4 H (uint4 x, uint4 y, uint4 z);
|
||||||
|
static inline uint4 I (uint4 x, uint4 y, uint4 z);
|
||||||
|
static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||||
|
uint4 s, uint4 ac);
|
||||||
|
static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||||
|
uint4 s, uint4 ac);
|
||||||
|
static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x,
|
||||||
|
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_)
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include <malloc.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
stdstr::stdstr()
|
stdstr::stdstr()
|
||||||
|
|
|
@ -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 std::list<stdstr> strlist;
|
||||||
typedef strlist::iterator strlist_iter;
|
typedef strlist::iterator strlist_iter;
|
||||||
|
|
|
@ -16,3 +16,4 @@
|
||||||
#include "Trace.h"
|
#include "Trace.h"
|
||||||
#include "md5.h"
|
#include "md5.h"
|
||||||
#include "Smart Pointer.h"
|
#include "Smart Pointer.h"
|
||||||
|
#include "SyncEvent.h"
|
||||||
|
|
|
@ -87,41 +87,17 @@ static int left_z, left_dzdy;
|
||||||
|
|
||||||
__inline int imul16(int x, int y) // (x * y) >> 16
|
__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
|
__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
|
__inline int idiv16(int x, int y) // (x << 16) / y
|
||||||
{
|
{
|
||||||
//x = (((long long)x) << 16) / ((long long)y);
|
x = ((int64_t)x << 16) / (int64_t)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
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,9 +37,9 @@
|
||||||
//
|
//
|
||||||
//****************************************************************
|
//****************************************************************
|
||||||
|
|
||||||
|
#include <Common/std string.h>
|
||||||
#include "Gfx_1.3.h"
|
#include "Gfx_1.3.h"
|
||||||
#include "Version.h"
|
#include "Version.h"
|
||||||
#include <Common/std string.h>
|
|
||||||
#include <Settings/Settings.h>
|
#include <Settings/Settings.h>
|
||||||
|
|
||||||
#include <wx/fileconf.h>
|
#include <wx/fileconf.h>
|
||||||
|
@ -1197,7 +1197,7 @@ int DllUnload(void)
|
||||||
void wxSetInstance(HINSTANCE hInstance);
|
void wxSetInstance(HINSTANCE hInstance);
|
||||||
|
|
||||||
extern "C" int WINAPI DllMain (HINSTANCE hinst,
|
extern "C" int WINAPI DllMain (HINSTANCE hinst,
|
||||||
wxUint32 fdwReason,
|
DWORD fdwReason,
|
||||||
LPVOID /*lpReserved*/)
|
LPVOID /*lpReserved*/)
|
||||||
{
|
{
|
||||||
sprintf (out_buf, "DllMain (%0p - %d)\n", hinst, fdwReason);
|
sprintf (out_buf, "DllMain (%0p - %d)\n", hinst, fdwReason);
|
||||||
|
|
|
@ -830,12 +830,20 @@ extern const char *CIStatus[];
|
||||||
#define FBL_D_1 2
|
#define FBL_D_1 2
|
||||||
#define FBL_D_0 3
|
#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
|
#ifndef max
|
||||||
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
#define max(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
#ifndef min
|
#ifndef min
|
||||||
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
#define min(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
[Setup]
|
[Setup]
|
||||||
AppId={{BEB5FB69-4080-466F-96C4-F15DF271718B}
|
AppId={{BEB5FB69-4080-466F-96C4-F15DF271718B}
|
||||||
AppName=Project 64
|
AppName=Project64
|
||||||
AppVersion={#AppVersion}
|
AppVersion={#AppVersion}
|
||||||
DefaultDirName={pf}\Project64 2.2
|
DefaultDirName={pf}\Project64 2.2
|
||||||
VersionInfoVersion={#AppVersion}
|
VersionInfoVersion={#AppVersion}
|
||||||
|
@ -19,7 +19,7 @@ UninstallDisplayIcon={uninstallexe}
|
||||||
SetupIconFile={#BaseDir}\Source\Project64\User Interface\Icons\pj64.ico
|
SetupIconFile={#BaseDir}\Source\Project64\User Interface\Icons\pj64.ico
|
||||||
|
|
||||||
[Run]
|
[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]
|
[Files]
|
||||||
Source: "{#BaseDir}\Bin\{#Configuration}\Project64.exe"; DestDir: "{app}"; Flags: ignoreversion
|
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
|
Name: "{app}\Textures"; Permissions: users-modify
|
||||||
|
|
||||||
[Icons]
|
[Icons]
|
||||||
Name: "{commonprograms}\Project 64 2.2\Project 64"; Filename: "{app}\Project64.exe"
|
Name: "{commonprograms}\Project64 2.2\Project64"; Filename: "{app}\Project64.exe"
|
||||||
Name: "{commonprograms}\Project 64 2.2\Uninstall Project64 2.2"; Filename: "{uninstallexe}"; Parameters: "/LOG"
|
Name: "{commonprograms}\Project64 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\Support"; Filename: "http://forum.pj64-emu.com"
|
||||||
|
|
||||||
[Code]
|
[Code]
|
||||||
function HaveCommandlineParam (inParam: String): Boolean;
|
function HaveCommandlineParam (inParam: String): Boolean;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\User Interface\Notification Class.h>
|
||||||
|
|
||||||
|
void AppInit(CNotification * Notify);
|
||||||
|
void AppCleanup(void);
|
|
@ -1,29 +1,16 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project 64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
* License: *
|
* License: *
|
||||||
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CDelaySlotFunctionMap
|
__interface CDebugger
|
||||||
{
|
{
|
||||||
typedef std::map<DWORD,CCompiledFunc *> FUNCTION_MAP;
|
virtual void TLBChanged(void) = 0;
|
||||||
|
};
|
||||||
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();
|
|
||||||
};
|
|
|
@ -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;
|
||||||
|
};
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,520 +11,521 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
enum LanguageStringID{
|
enum LanguageStringID{
|
||||||
EMPTY_STRING = 0,
|
EMPTY_STRING = 0,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Meta Information *
|
* Meta Information *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//About DLL
|
//About DLL
|
||||||
LANGUAGE_NAME = 1,
|
LANGUAGE_NAME = 1,
|
||||||
LANGUAGE_AUTHOR =2,
|
LANGUAGE_AUTHOR = 2,
|
||||||
LANGUAGE_VERSION =3,
|
LANGUAGE_VERSION = 3,
|
||||||
LANGUAGE_DATE =4,
|
LANGUAGE_DATE = 4,
|
||||||
|
|
||||||
//About DLL Dialog
|
//About DLL Dialog
|
||||||
INI_CURRENT_LANG =5,
|
INI_CURRENT_LANG = 5,
|
||||||
INI_AUTHOR =6,
|
INI_AUTHOR = 6,
|
||||||
INI_VERSION =7,
|
INI_VERSION = 7,
|
||||||
INI_DATE =8,
|
INI_DATE = 8,
|
||||||
INI_HOMEPAGE =9,
|
INI_HOMEPAGE = 9,
|
||||||
INI_CURRENT_RDB =10,
|
INI_CURRENT_RDB = 10,
|
||||||
INI_CURRENT_CHT =11,
|
INI_CURRENT_CHT = 11,
|
||||||
INI_CURRENT_RDX =12,
|
INI_CURRENT_RDX = 12,
|
||||||
|
|
||||||
//About INI title
|
//About INI title
|
||||||
INI_TITLE =20,
|
INI_TITLE = 20,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Numbers *
|
* Numbers *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
NUMBER_0 =50,
|
NUMBER_0 = 50,
|
||||||
NUMBER_1 = 51,
|
NUMBER_1 = 51,
|
||||||
NUMBER_2 = 52,
|
NUMBER_2 = 52,
|
||||||
NUMBER_3 = 53,
|
NUMBER_3 = 53,
|
||||||
NUMBER_4 = 54,
|
NUMBER_4 = 54,
|
||||||
NUMBER_5 = 55,
|
NUMBER_5 = 55,
|
||||||
NUMBER_6 = 56,
|
NUMBER_6 = 56,
|
||||||
NUMBER_7 = 57,
|
NUMBER_7 = 57,
|
||||||
NUMBER_8 = 58,
|
NUMBER_8 = 58,
|
||||||
NUMBER_9 = 59,
|
NUMBER_9 = 59,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Menu *
|
* Menu *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//File Menu
|
//File Menu
|
||||||
MENU_FILE =100,
|
MENU_FILE = 100,
|
||||||
MENU_OPEN =101,
|
MENU_OPEN = 101,
|
||||||
MENU_ROM_INFO =102,
|
MENU_ROM_INFO = 102,
|
||||||
MENU_START =103,
|
MENU_START = 103,
|
||||||
MENU_END =104,
|
MENU_END = 104,
|
||||||
MENU_CHOOSE_ROM =105,
|
MENU_CHOOSE_ROM = 105,
|
||||||
MENU_REFRESH =106,
|
MENU_REFRESH = 106,
|
||||||
MENU_RECENT_ROM =107,
|
MENU_RECENT_ROM = 107,
|
||||||
MENU_RECENT_DIR =108,
|
MENU_RECENT_DIR = 108,
|
||||||
MENU_EXIT =109,
|
MENU_EXIT = 109,
|
||||||
|
|
||||||
//System Menu
|
//System Menu
|
||||||
MENU_SYSTEM =120,
|
MENU_SYSTEM = 120,
|
||||||
MENU_RESET =121,
|
MENU_RESET = 121,
|
||||||
MENU_PAUSE =122,
|
MENU_PAUSE = 122,
|
||||||
MENU_BITMAP =123,
|
MENU_BITMAP = 123,
|
||||||
MENU_LIMIT_FPS =124,
|
MENU_LIMIT_FPS = 124,
|
||||||
MENU_SAVE =125,
|
MENU_SAVE = 125,
|
||||||
MENU_SAVE_AS =126,
|
MENU_SAVE_AS = 126,
|
||||||
MENU_RESTORE =127,
|
MENU_RESTORE = 127,
|
||||||
MENU_LOAD =128,
|
MENU_LOAD = 128,
|
||||||
MENU_CURRENT_SAVE =129,
|
MENU_CURRENT_SAVE = 129,
|
||||||
MENU_CHEAT =130,
|
MENU_CHEAT = 130,
|
||||||
MENU_GS_BUTTON =131,
|
MENU_GS_BUTTON = 131,
|
||||||
MENU_RESUME =132,
|
MENU_RESUME = 132,
|
||||||
MENU_RESET_SOFT =133, //added in build 1.7.50
|
MENU_RESET_SOFT = 133, //added in build 1.7.50
|
||||||
MENU_RESET_HARD =134, //added in build 1.7.50
|
MENU_RESET_HARD = 134, //added in build 1.7.50
|
||||||
|
|
||||||
//Options Menu
|
//Options Menu
|
||||||
MENU_OPTIONS = 140,
|
MENU_OPTIONS = 140,
|
||||||
MENU_FULL_SCREEN= 141,
|
MENU_FULL_SCREEN = 141,
|
||||||
MENU_ON_TOP = 142,
|
MENU_ON_TOP = 142,
|
||||||
MENU_CONFG_GFX = 143,
|
MENU_CONFG_GFX = 143,
|
||||||
MENU_CONFG_AUDIO= 144,
|
MENU_CONFG_AUDIO = 144,
|
||||||
MENU_CONFG_CTRL = 145,
|
MENU_CONFG_CTRL = 145,
|
||||||
MENU_CONFG_RSP = 146,
|
MENU_CONFG_RSP = 146,
|
||||||
MENU_SHOW_CPU = 147,
|
MENU_SHOW_CPU = 147,
|
||||||
MENU_SETTINGS = 148,
|
MENU_SETTINGS = 148,
|
||||||
|
|
||||||
//Debugger Menu
|
//Debugger Menu
|
||||||
MENU_DEBUGGER = 160,
|
MENU_DEBUGGER = 160,
|
||||||
|
|
||||||
//Language Menu
|
//Language Menu
|
||||||
MENU_LANGUAGE = 175,
|
MENU_LANGUAGE = 175,
|
||||||
|
|
||||||
//Help Menu
|
//Help Menu
|
||||||
MENU_HELP = 180,
|
MENU_HELP = 180,
|
||||||
MENU_ABOUT_INI = 181,
|
MENU_ABOUT_INI = 181,
|
||||||
MENU_ABOUT_PJ64 = 182,
|
MENU_ABOUT_PJ64 = 182,
|
||||||
MENU_FORUM = 183,
|
MENU_FORUM = 183,
|
||||||
MENU_HOMEPAGE = 184,
|
MENU_HOMEPAGE = 184,
|
||||||
|
|
||||||
//Current Save Slot menu
|
//Current Save Slot menu
|
||||||
MENU_SLOT_DEFAULT = 190,
|
MENU_SLOT_DEFAULT = 190,
|
||||||
MENU_SLOT_1 = 191,
|
MENU_SLOT_1 = 191,
|
||||||
MENU_SLOT_2 = 192,
|
MENU_SLOT_2 = 192,
|
||||||
MENU_SLOT_3 = 193,
|
MENU_SLOT_3 = 193,
|
||||||
MENU_SLOT_4 = 194,
|
MENU_SLOT_4 = 194,
|
||||||
MENU_SLOT_5 = 195,
|
MENU_SLOT_5 = 195,
|
||||||
MENU_SLOT_6 = 196,
|
MENU_SLOT_6 = 196,
|
||||||
MENU_SLOT_7 = 197,
|
MENU_SLOT_7 = 197,
|
||||||
MENU_SLOT_8 = 198,
|
MENU_SLOT_8 = 198,
|
||||||
MENU_SLOT_9 = 199,
|
MENU_SLOT_9 = 199,
|
||||||
MENU_SLOT_10 = 200,
|
MENU_SLOT_10 = 200,
|
||||||
|
MENU_SLOT_SAVE = 201,
|
||||||
|
|
||||||
//Pop up Menu
|
//Pop up Menu
|
||||||
POPUP_PLAY = 210,
|
POPUP_PLAY = 210,
|
||||||
POPUP_INFO = 211,
|
POPUP_INFO = 211,
|
||||||
POPUP_SETTINGS = 212,
|
POPUP_SETTINGS = 212,
|
||||||
POPUP_CHEATS = 213,
|
POPUP_CHEATS = 213,
|
||||||
POPUP_GFX_PLUGIN = 214,
|
POPUP_GFX_PLUGIN = 214,
|
||||||
|
|
||||||
//selecting save slot
|
//selecting save slot
|
||||||
SAVE_SLOT_DEFAULT = 220,
|
SAVE_SLOT_DEFAULT = 220,
|
||||||
SAVE_SLOT_1 = 221,
|
SAVE_SLOT_1 = 221,
|
||||||
SAVE_SLOT_2 = 222,
|
SAVE_SLOT_2 = 222,
|
||||||
SAVE_SLOT_3 = 223,
|
SAVE_SLOT_3 = 223,
|
||||||
SAVE_SLOT_4 = 224,
|
SAVE_SLOT_4 = 224,
|
||||||
SAVE_SLOT_5 = 225,
|
SAVE_SLOT_5 = 225,
|
||||||
SAVE_SLOT_6 = 226,
|
SAVE_SLOT_6 = 226,
|
||||||
SAVE_SLOT_7 = 227,
|
SAVE_SLOT_7 = 227,
|
||||||
SAVE_SLOT_8 = 228,
|
SAVE_SLOT_8 = 228,
|
||||||
SAVE_SLOT_9 = 229,
|
SAVE_SLOT_9 = 229,
|
||||||
SAVE_SLOT_10 = 230,
|
SAVE_SLOT_10 = 230,
|
||||||
|
|
||||||
// Menu Descriptions (TODO: unused ? implement or remove)
|
// Menu Descriptions (TODO: unused ? implement or remove)
|
||||||
MENUDES_OPEN = 250,
|
MENUDES_OPEN = 250,
|
||||||
MENUDES_ROM_INFO = 251,
|
MENUDES_ROM_INFO = 251,
|
||||||
MENUDES_START = 252,
|
MENUDES_START = 252,
|
||||||
MENUDES_END = 253,
|
MENUDES_END = 253,
|
||||||
MENUDES_CHOOSE_ROM = 254,
|
MENUDES_CHOOSE_ROM = 254,
|
||||||
MENUDES_REFRESH = 255,
|
MENUDES_REFRESH = 255,
|
||||||
MENUDES_EXIT = 256,
|
MENUDES_EXIT = 256,
|
||||||
MENUDES_RESET = 257,
|
MENUDES_RESET = 257,
|
||||||
MENUDES_PAUSE = 258,
|
MENUDES_PAUSE = 258,
|
||||||
MENUDES_BITMAP = 259,
|
MENUDES_BITMAP = 259,
|
||||||
MENUDES_LIMIT_FPS = 260,
|
MENUDES_LIMIT_FPS = 260,
|
||||||
MENUDES_SAVE = 261,
|
MENUDES_SAVE = 261,
|
||||||
MENUDES_SAVE_AS = 262,
|
MENUDES_SAVE_AS = 262,
|
||||||
MENUDES_RESTORE = 263,
|
MENUDES_RESTORE = 263,
|
||||||
MENUDES_LOAD = 264,
|
MENUDES_LOAD = 264,
|
||||||
MENUDES_CHEAT = 265,
|
MENUDES_CHEAT = 265,
|
||||||
MENUDES_GS_BUTTON = 266,
|
MENUDES_GS_BUTTON = 266,
|
||||||
MENUDES_FULL_SCREEN = 267,
|
MENUDES_FULL_SCREEN = 267,
|
||||||
MENUDES_ON_TOP = 268,
|
MENUDES_ON_TOP = 268,
|
||||||
MENUDES_CONFG_GFX = 269,
|
MENUDES_CONFG_GFX = 269,
|
||||||
MENUDES_CONFG_AUDIO = 270,
|
MENUDES_CONFG_AUDIO = 270,
|
||||||
MENUDES_CONFG_CTRL = 271,
|
MENUDES_CONFG_CTRL = 271,
|
||||||
MENUDES_CONFG_RSP = 272,
|
MENUDES_CONFG_RSP = 272,
|
||||||
MENUDES_SHOW_CPU = 273,
|
MENUDES_SHOW_CPU = 273,
|
||||||
MENUDES_SETTINGS = 274,
|
MENUDES_SETTINGS = 274,
|
||||||
MENUDES_USER_MAN = 275,
|
MENUDES_USER_MAN = 275,
|
||||||
MENUDES_GAME_FAQ = 276,
|
MENUDES_GAME_FAQ = 276,
|
||||||
MENUDES_ABOUT_INI = 277,
|
MENUDES_ABOUT_INI = 277,
|
||||||
MENUDES_ABOUT_PJ64 = 278,
|
MENUDES_ABOUT_PJ64 = 278,
|
||||||
MENUDES_RECENT_ROM = 279,
|
MENUDES_RECENT_ROM = 279,
|
||||||
MENUDES_RECENT_DIR = 280,
|
MENUDES_RECENT_DIR = 280,
|
||||||
MENUDES_LANGUAGES = 281,
|
MENUDES_LANGUAGES = 281,
|
||||||
MENUDES_GAME_SLOT = 282,
|
MENUDES_GAME_SLOT = 282,
|
||||||
MENUDES_PLAY_GAME = 283,
|
MENUDES_PLAY_GAME = 283,
|
||||||
MENUDES_GAME_INFO = 284,
|
MENUDES_GAME_INFO = 284,
|
||||||
MENUDES_GAME_SETTINGS= 285,
|
MENUDES_GAME_SETTINGS = 285,
|
||||||
MENUDES_GAME_CHEATS = 286,
|
MENUDES_GAME_CHEATS = 286,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Rom Browser *
|
* Rom Browser *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Rom Browser Fields
|
//Rom Browser Fields
|
||||||
RB_FILENAME = 300,
|
RB_FILENAME = 300,
|
||||||
RB_INTERNALNAME = 301,
|
RB_INTERNALNAME = 301,
|
||||||
RB_GOODNAME = 302,
|
RB_GOODNAME = 302,
|
||||||
RB_STATUS = 303,
|
RB_STATUS = 303,
|
||||||
RB_ROMSIZE = 304,
|
RB_ROMSIZE = 304,
|
||||||
RB_NOTES_CORE = 305,
|
RB_NOTES_CORE = 305,
|
||||||
RB_NOTES_PLUGIN = 306,
|
RB_NOTES_PLUGIN = 306,
|
||||||
RB_NOTES_USER = 307,
|
RB_NOTES_USER = 307,
|
||||||
RB_CART_ID = 308,
|
RB_CART_ID = 308,
|
||||||
RB_MANUFACTUER = 309,
|
RB_MANUFACTUER = 309,
|
||||||
RB_COUNTRY = 310,
|
RB_COUNTRY = 310,
|
||||||
RB_DEVELOPER = 311,
|
RB_DEVELOPER = 311,
|
||||||
RB_CRC1 = 312,
|
RB_CRC1 = 312,
|
||||||
RB_CRC2 = 313,
|
RB_CRC2 = 313,
|
||||||
RB_CICCHIP = 314,
|
RB_CICCHIP = 314,
|
||||||
RB_RELEASE_DATE = 315,
|
RB_RELEASE_DATE = 315,
|
||||||
RB_GENRE = 316,
|
RB_GENRE = 316,
|
||||||
RB_PLAYERS = 317,
|
RB_PLAYERS = 317,
|
||||||
RB_FORCE_FEEDBACK = 318,
|
RB_FORCE_FEEDBACK = 318,
|
||||||
RB_FILE_FORMAT = 319,
|
RB_FILE_FORMAT = 319,
|
||||||
|
|
||||||
//Select Rom
|
//Select Rom
|
||||||
SELECT_ROM_DIR = 320,
|
SELECT_ROM_DIR = 320,
|
||||||
|
|
||||||
//Messages
|
//Messages
|
||||||
RB_NOT_GOOD_FILE = 340,
|
RB_NOT_GOOD_FILE = 340,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Options *
|
* Options *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Options Title
|
//Options Title
|
||||||
OPTIONS_TITLE = 400,
|
OPTIONS_TITLE = 400,
|
||||||
|
|
||||||
//Tabs
|
//Tabs
|
||||||
TAB_PLUGIN = 401,
|
TAB_PLUGIN = 401,
|
||||||
TAB_DIRECTORY = 402,
|
TAB_DIRECTORY = 402,
|
||||||
TAB_OPTIONS = 403,
|
TAB_OPTIONS = 403,
|
||||||
TAB_ROMSELECTION = 404,
|
TAB_ROMSELECTION = 404,
|
||||||
TAB_ADVANCED = 405,
|
TAB_ADVANCED = 405,
|
||||||
TAB_ROMSETTINGS = 406,
|
TAB_ROMSETTINGS = 406,
|
||||||
TAB_SHELLINTERGATION= 407,
|
TAB_SHELLINTERGATION = 407,
|
||||||
TAB_ROMNOTES = 408,
|
TAB_ROMNOTES = 408,
|
||||||
TAB_SHORTCUTS = 409,
|
TAB_SHORTCUTS = 409,
|
||||||
TAB_ROMSTATUS = 410,
|
TAB_ROMSTATUS = 410,
|
||||||
TAB_RECOMPILER = 411, //Added in 1.7.0.50
|
TAB_RECOMPILER = 411, //Added in 1.7.0.50
|
||||||
|
|
||||||
//Plugin Dialog
|
//Plugin Dialog
|
||||||
PLUG_ABOUT = 420,
|
PLUG_ABOUT = 420,
|
||||||
PLUG_RSP = 421,
|
PLUG_RSP = 421,
|
||||||
PLUG_GFX = 422,
|
PLUG_GFX = 422,
|
||||||
PLUG_AUDIO = 423,
|
PLUG_AUDIO = 423,
|
||||||
PLUG_CTRL = 424,
|
PLUG_CTRL = 424,
|
||||||
PLUG_HLE_GFX = 425,
|
PLUG_HLE_GFX = 425,
|
||||||
PLUG_HLE_AUDIO = 426,
|
PLUG_HLE_AUDIO = 426,
|
||||||
PLUG_DEFAULT = 427,
|
PLUG_DEFAULT = 427,
|
||||||
|
|
||||||
//Directory Dialog
|
//Directory Dialog
|
||||||
DIR_PLUGIN = 440,
|
DIR_PLUGIN = 440,
|
||||||
DIR_ROM = 441,
|
DIR_ROM = 441,
|
||||||
DIR_AUTO_SAVE = 442,
|
DIR_AUTO_SAVE = 442,
|
||||||
DIR_INSTANT_SAVE = 443,
|
DIR_INSTANT_SAVE = 443,
|
||||||
DIR_SCREEN_SHOT = 444,
|
DIR_SCREEN_SHOT = 444,
|
||||||
DIR_ROM_DEFAULT = 445,
|
DIR_ROM_DEFAULT = 445,
|
||||||
DIR_SELECT_PLUGIN = 446,
|
DIR_SELECT_PLUGIN = 446,
|
||||||
DIR_SELECT_ROM = 447,
|
DIR_SELECT_ROM = 447,
|
||||||
DIR_SELECT_AUTO = 448,
|
DIR_SELECT_AUTO = 448,
|
||||||
DIR_SELECT_INSTANT = 449,
|
DIR_SELECT_INSTANT = 449,
|
||||||
DIR_SELECT_SCREEN = 450,
|
DIR_SELECT_SCREEN = 450,
|
||||||
DIR_TEXTURE = 451,
|
DIR_TEXTURE = 451,
|
||||||
DIR_SELECT_TEXTURE = 452,
|
DIR_SELECT_TEXTURE = 452,
|
||||||
|
|
||||||
//Options (general) Tab
|
//Options (general) Tab
|
||||||
OPTION_AUTO_SLEEP =460,
|
OPTION_AUTO_SLEEP = 460,
|
||||||
OPTION_AUTO_FULLSCREEN =461,
|
OPTION_AUTO_FULLSCREEN = 461,
|
||||||
OPTION_BASIC_MODE =462,
|
OPTION_BASIC_MODE = 462,
|
||||||
OPTION_REMEMBER_CHEAT =463,
|
OPTION_REMEMBER_CHEAT = 463,
|
||||||
OPTION_DISABLE_SS =464,
|
OPTION_DISABLE_SS = 464,
|
||||||
OPTION_DISPLAY_FR =465,
|
OPTION_DISPLAY_FR = 465,
|
||||||
OPTION_CHANGE_FR =466,
|
OPTION_CHANGE_FR = 466,
|
||||||
OPTION_CHECK_RUNNING =467,
|
OPTION_CHECK_RUNNING = 467,
|
||||||
|
|
||||||
//Rom Browser Tab
|
//Rom Browser Tab
|
||||||
RB_MAX_ROMS = 480,
|
RB_MAX_ROMS = 480,
|
||||||
RB_ROMS = 481,
|
RB_ROMS = 481,
|
||||||
RB_MAX_DIRS = 482,
|
RB_MAX_DIRS = 482,
|
||||||
RB_DIRS = 483,
|
RB_DIRS = 483,
|
||||||
RB_USE = 484,
|
RB_USE = 484,
|
||||||
RB_DIR_RECURSION = 485,
|
RB_DIR_RECURSION = 485,
|
||||||
RB_AVALIABLE_FIELDS = 486,
|
RB_AVALIABLE_FIELDS = 486,
|
||||||
RB_SHOW_FIELDS = 487,
|
RB_SHOW_FIELDS = 487,
|
||||||
RB_ADD = 488,
|
RB_ADD = 488,
|
||||||
RB_REMOVE = 489,
|
RB_REMOVE = 489,
|
||||||
RB_UP = 490,
|
RB_UP = 490,
|
||||||
RB_DOWN = 491,
|
RB_DOWN = 491,
|
||||||
RB_REFRESH = 492,
|
RB_REFRESH = 492,
|
||||||
|
|
||||||
//Advanced Options
|
//Advanced Options
|
||||||
ADVANCE_INFO = 500,
|
ADVANCE_INFO = 500,
|
||||||
ADVANCE_DEFAULTS = 501,
|
ADVANCE_DEFAULTS = 501,
|
||||||
ADVANCE_CPU_STYLE = 502,
|
ADVANCE_CPU_STYLE = 502,
|
||||||
ADVANCE_SMCM = 503,
|
ADVANCE_SMCM = 503,
|
||||||
ADVANCE_MEM_SIZE = 504,
|
ADVANCE_MEM_SIZE = 504,
|
||||||
ADVANCE_ABL = 505,
|
ADVANCE_ABL = 505,
|
||||||
ADVANCE_AUTO_START = 506,
|
ADVANCE_AUTO_START = 506,
|
||||||
ADVANCE_OVERWRITE = 507,
|
ADVANCE_OVERWRITE = 507,
|
||||||
ADVANCE_COMPRESS = 508,
|
ADVANCE_COMPRESS = 508,
|
||||||
ADVANCE_DEBUGGER = 509,
|
ADVANCE_DEBUGGER = 509,
|
||||||
ADVANCE_SMM_CACHE = 510,
|
ADVANCE_SMM_CACHE = 510,
|
||||||
ADVANCE_SMM_PIDMA = 511,
|
ADVANCE_SMM_PIDMA = 511,
|
||||||
ADVANCE_SMM_VALIDATE= 512,
|
ADVANCE_SMM_VALIDATE = 512,
|
||||||
ADVANCE_SMM_PROTECT = 513,
|
ADVANCE_SMM_PROTECT = 513,
|
||||||
ADVANCE_SMM_TLB = 514,
|
ADVANCE_SMM_TLB = 514,
|
||||||
|
|
||||||
//Rom Options
|
//Rom Options
|
||||||
ROM_CPU_STYLE = 520,
|
ROM_CPU_STYLE = 520,
|
||||||
ROM_VIREFRESH = 521,
|
ROM_VIREFRESH = 521,
|
||||||
ROM_MEM_SIZE = 522,
|
ROM_MEM_SIZE = 522,
|
||||||
ROM_ABL = 523,
|
ROM_ABL = 523,
|
||||||
ROM_SAVE_TYPE = 524,
|
ROM_SAVE_TYPE = 524,
|
||||||
ROM_COUNTER_FACTOR = 525,
|
ROM_COUNTER_FACTOR = 525,
|
||||||
ROM_LARGE_BUFFER = 526,
|
ROM_LARGE_BUFFER = 526,
|
||||||
ROM_USE_TLB = 527,
|
ROM_USE_TLB = 527,
|
||||||
ROM_REG_CACHE = 528,
|
ROM_REG_CACHE = 528,
|
||||||
ROM_DELAY_SI = 529,
|
ROM_DELAY_SI = 529,
|
||||||
ROM_FAST_SP = 530,
|
ROM_FAST_SP = 530,
|
||||||
ROM_DEFAULT = 531,
|
ROM_DEFAULT = 531,
|
||||||
ROM_AUDIO_SIGNAL = 532,
|
ROM_AUDIO_SIGNAL = 532,
|
||||||
ROM_FIXED_AUDIO = 533,
|
ROM_FIXED_AUDIO = 533,
|
||||||
ROM_FUNC_FIND = 534,
|
ROM_FUNC_FIND = 534,
|
||||||
ROM_CUSTOM_SMM = 535,
|
ROM_CUSTOM_SMM = 535,
|
||||||
ROM_SYNC_AUDIO = 536,
|
ROM_SYNC_AUDIO = 536,
|
||||||
ROM_COUNTPERBYTE = 537,
|
ROM_COUNTPERBYTE = 537,
|
||||||
ROM_32BIT = 538,
|
ROM_32BIT = 538,
|
||||||
ROM_DELAY_DP = 539,
|
ROM_DELAY_DP = 539,
|
||||||
|
|
||||||
//Core Styles
|
//Core Styles
|
||||||
CORE_INTERPTER = 540,
|
CORE_INTERPTER = 540,
|
||||||
CORE_RECOMPILER = 541,
|
CORE_RECOMPILER = 541,
|
||||||
CORE_SYNC = 542,
|
CORE_SYNC = 542,
|
||||||
|
|
||||||
//Self Mod Methods
|
//Self Mod Methods
|
||||||
SMCM_NONE = 560,
|
SMCM_NONE = 560,
|
||||||
SMCM_CACHE = 561,
|
SMCM_CACHE = 561,
|
||||||
SMCM_PROECTED = 562,
|
SMCM_PROECTED = 562,
|
||||||
SMCM_CHECK_MEM = 563,
|
SMCM_CHECK_MEM = 563,
|
||||||
SMCM_CHANGE_MEM = 564,
|
SMCM_CHANGE_MEM = 564,
|
||||||
SMCM_CHECK_ADV = 565,
|
SMCM_CHECK_ADV = 565,
|
||||||
SMCM_CACHE2 = 566,
|
SMCM_CACHE2 = 566,
|
||||||
|
|
||||||
//Function Lookup memthod
|
//Function Lookup memthod
|
||||||
FLM_PLOOKUP = 570,
|
FLM_PLOOKUP = 570,
|
||||||
FLM_VLOOKUP = 571,
|
FLM_VLOOKUP = 571,
|
||||||
FLM_CHANGEMEM = 572,
|
FLM_CHANGEMEM = 572,
|
||||||
|
|
||||||
//RDRAM Size
|
//RDRAM Size
|
||||||
RDRAM_4MB = 580,
|
RDRAM_4MB = 580,
|
||||||
RDRAM_8MB = 581,
|
RDRAM_8MB = 581,
|
||||||
|
|
||||||
//Advanced Block Linking
|
//Advanced Block Linking
|
||||||
ABL_ON = 600,
|
ABL_ON = 600,
|
||||||
ABL_OFF = 601,
|
ABL_OFF = 601,
|
||||||
|
|
||||||
//Save Type
|
//Save Type
|
||||||
SAVE_FIRST_USED = 620,
|
SAVE_FIRST_USED = 620,
|
||||||
SAVE_4K_EEPROM = 621,
|
SAVE_4K_EEPROM = 621,
|
||||||
SAVE_16K_EEPROM = 622,
|
SAVE_16K_EEPROM = 622,
|
||||||
SAVE_SRAM = 623,
|
SAVE_SRAM = 623,
|
||||||
SAVE_FLASHRAM = 624,
|
SAVE_FLASHRAM = 624,
|
||||||
|
|
||||||
//Shell Integration Tab
|
//Shell Integration Tab
|
||||||
SHELL_TEXT = 640,
|
SHELL_TEXT = 640,
|
||||||
|
|
||||||
//Rom Notes
|
//Rom Notes
|
||||||
NOTE_STATUS = 660,
|
NOTE_STATUS = 660,
|
||||||
NOTE_CORE = 661,
|
NOTE_CORE = 661,
|
||||||
NOTE_PLUGIN = 662,
|
NOTE_PLUGIN = 662,
|
||||||
|
|
||||||
// Accelerator Selector
|
// Accelerator Selector
|
||||||
ACCEL_CPUSTATE_TITLE = 680,
|
ACCEL_CPUSTATE_TITLE = 680,
|
||||||
ACCEL_MENUITEM_TITLE = 681,
|
ACCEL_MENUITEM_TITLE = 681,
|
||||||
ACCEL_CURRENTKEYS_TITLE = 682,
|
ACCEL_CURRENTKEYS_TITLE = 682,
|
||||||
ACCEL_SELKEY_TITLE = 683,
|
ACCEL_SELKEY_TITLE = 683,
|
||||||
ACCEL_ASSIGNEDTO_TITLE = 684,
|
ACCEL_ASSIGNEDTO_TITLE = 684,
|
||||||
ACCEL_ASSIGN_BTN = 685,
|
ACCEL_ASSIGN_BTN = 685,
|
||||||
ACCEL_REMOVE_BTN = 686,
|
ACCEL_REMOVE_BTN = 686,
|
||||||
ACCEL_RESETALL_BTN = 687,
|
ACCEL_RESETALL_BTN = 687,
|
||||||
ACCEL_CPUSTATE_1 = 688,
|
ACCEL_CPUSTATE_1 = 688,
|
||||||
ACCEL_CPUSTATE_2 = 689,
|
ACCEL_CPUSTATE_2 = 689,
|
||||||
ACCEL_CPUSTATE_3 = 690,
|
ACCEL_CPUSTATE_3 = 690,
|
||||||
ACCEL_CPUSTATE_4 = 691,
|
ACCEL_CPUSTATE_4 = 691,
|
||||||
ACCEL_DETECTKEY = 692,
|
ACCEL_DETECTKEY = 692,
|
||||||
|
|
||||||
// Frame Rate Option
|
// Frame Rate Option
|
||||||
STR_FR_VIS = 700,
|
STR_FR_VIS = 700,
|
||||||
STR_FR_DLS = 701,
|
STR_FR_DLS = 701,
|
||||||
STR_FR_PERCENT = 702,
|
STR_FR_PERCENT = 702,
|
||||||
|
|
||||||
// Increase speed
|
// Increase speed
|
||||||
STR_INSREASE_SPEED = 710,
|
STR_INSREASE_SPEED = 710,
|
||||||
STR_DECREASE_SPEED = 711,
|
STR_DECREASE_SPEED = 711,
|
||||||
|
|
||||||
//Bottom page buttons
|
//Bottom page buttons
|
||||||
BOTTOM_RESET_PAGE = 720,
|
BOTTOM_RESET_PAGE = 720,
|
||||||
BOTTOM_RESET_ALL = 721,
|
BOTTOM_RESET_ALL = 721,
|
||||||
BOTTOM_APPLY = 722,
|
BOTTOM_APPLY = 722,
|
||||||
BOTTOM_CLOSE = 723,
|
BOTTOM_CLOSE = 723,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* ROM Information *
|
* ROM Information *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Rom Info Title Title
|
//Rom Info Title Title
|
||||||
INFO_TITLE = 800,
|
INFO_TITLE = 800,
|
||||||
|
|
||||||
//Rom Info Text
|
//Rom Info Text
|
||||||
INFO_ROM_NAME_TEXT = 801,
|
INFO_ROM_NAME_TEXT = 801,
|
||||||
INFO_FILE_NAME_TEXT = 802,
|
INFO_FILE_NAME_TEXT = 802,
|
||||||
INFO_LOCATION_TEXT = 803,
|
INFO_LOCATION_TEXT = 803,
|
||||||
INFO_SIZE_TEXT = 804,
|
INFO_SIZE_TEXT = 804,
|
||||||
INFO_CART_ID_TEXT = 805,
|
INFO_CART_ID_TEXT = 805,
|
||||||
INFO_MANUFACTURER_TEXT= 806,
|
INFO_MANUFACTURER_TEXT = 806,
|
||||||
INFO_COUNTRY_TEXT = 807,
|
INFO_COUNTRY_TEXT = 807,
|
||||||
INFO_CRC1_TEXT = 808,
|
INFO_CRC1_TEXT = 808,
|
||||||
INFO_CRC2_TEXT = 809,
|
INFO_CRC2_TEXT = 809,
|
||||||
INFO_CIC_CHIP_TEXT = 810,
|
INFO_CIC_CHIP_TEXT = 810,
|
||||||
INFO_MD5_TEXT = 811,
|
INFO_MD5_TEXT = 811,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Cheats *
|
* Cheats *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
//Cheat List
|
//Cheat List
|
||||||
CHEAT_TITLE = 1000,
|
CHEAT_TITLE = 1000,
|
||||||
CHEAT_LIST_FRAME = 1001,
|
CHEAT_LIST_FRAME = 1001,
|
||||||
CHEAT_NOTES_FRAME = 1002,
|
CHEAT_NOTES_FRAME = 1002,
|
||||||
CHEAT_MARK_ALL = 1003,
|
CHEAT_MARK_ALL = 1003,
|
||||||
CHEAT_MARK_NONE = 1004,
|
CHEAT_MARK_NONE = 1004,
|
||||||
|
|
||||||
//Add Cheat
|
//Add Cheat
|
||||||
CHEAT_ADDCHEAT_FRAME =1005,
|
CHEAT_ADDCHEAT_FRAME = 1005,
|
||||||
CHEAT_ADDCHEAT_NAME =1006,
|
CHEAT_ADDCHEAT_NAME = 1006,
|
||||||
CHEAT_ADDCHEAT_CODE = 1007,
|
CHEAT_ADDCHEAT_CODE = 1007,
|
||||||
CHEAT_ADDCHEAT_INSERT= 1008,
|
CHEAT_ADDCHEAT_INSERT = 1008,
|
||||||
CHEAT_ADDCHEAT_CLEAR= 1009,
|
CHEAT_ADDCHEAT_CLEAR = 1009,
|
||||||
CHEAT_ADDCHEAT_NOTES= 1010,
|
CHEAT_ADDCHEAT_NOTES = 1010,
|
||||||
CHEAT_ADD_TO_DB = 1011,
|
CHEAT_ADD_TO_DB = 1011,
|
||||||
|
|
||||||
//Code extension
|
//Code extension
|
||||||
CHEAT_CODE_EXT_TITLE =1012,
|
CHEAT_CODE_EXT_TITLE = 1012,
|
||||||
CHEAT_CODE_EXT_TXT =1013,
|
CHEAT_CODE_EXT_TXT = 1013,
|
||||||
CHEAT_OK =1014,
|
CHEAT_OK = 1014,
|
||||||
CHEAT_CANCEL =1015,
|
CHEAT_CANCEL = 1015,
|
||||||
|
|
||||||
//Digital Value
|
//Digital Value
|
||||||
CHEAT_QUANTITY_TITLE =1016,
|
CHEAT_QUANTITY_TITLE = 1016,
|
||||||
CHEAT_CHOOSE_VALUE =1017,
|
CHEAT_CHOOSE_VALUE = 1017,
|
||||||
CHEAT_VALUE =1018,
|
CHEAT_VALUE = 1018,
|
||||||
CHEAT_FROM =1019,
|
CHEAT_FROM = 1019,
|
||||||
CHEAT_TO =1020,
|
CHEAT_TO = 1020,
|
||||||
CHEAT_NOTES =1021,
|
CHEAT_NOTES = 1021,
|
||||||
CHEAT_ADDCHEAT_ADD = 1022,
|
CHEAT_ADDCHEAT_ADD = 1022,
|
||||||
CHEAT_ADDCHEAT_NEW = 1023,
|
CHEAT_ADDCHEAT_NEW = 1023,
|
||||||
CHEAT_ADDCHEAT_CODEDES =1024,
|
CHEAT_ADDCHEAT_CODEDES = 1024,
|
||||||
CHEAT_ADDCHEAT_OPT =1025,
|
CHEAT_ADDCHEAT_OPT = 1025,
|
||||||
CHEAT_ADDCHEAT_OPTDES =1026,
|
CHEAT_ADDCHEAT_OPTDES = 1026,
|
||||||
|
|
||||||
//Edit Cheat
|
//Edit Cheat
|
||||||
CHEAT_EDITCHEAT_WINDOW =1027,
|
CHEAT_EDITCHEAT_WINDOW = 1027,
|
||||||
CHEAT_EDITCHEAT_UPDATE =1028,
|
CHEAT_EDITCHEAT_UPDATE = 1028,
|
||||||
CHEAT_CHANGED_MSG =1029,
|
CHEAT_CHANGED_MSG = 1029,
|
||||||
CHEAT_CHANGED_TITLE =1030,
|
CHEAT_CHANGED_TITLE = 1030,
|
||||||
|
|
||||||
//Cheat Popup Menu
|
//Cheat Popup Menu
|
||||||
CHEAT_ADDNEW =1040,
|
CHEAT_ADDNEW = 1040,
|
||||||
CHEAT_EDIT = 1041,
|
CHEAT_EDIT = 1041,
|
||||||
CHEAT_DELETE = 1042,
|
CHEAT_DELETE = 1042,
|
||||||
|
|
||||||
// short cut editor
|
// short cut editor
|
||||||
STR_SHORTCUT_RESET_TITLE = 1100,
|
STR_SHORTCUT_RESET_TITLE = 1100,
|
||||||
STR_SHORTCUT_RESET_TEXT = 1101,
|
STR_SHORTCUT_RESET_TEXT = 1101,
|
||||||
STR_SHORTCUT_FILEMENU = 1102,
|
STR_SHORTCUT_FILEMENU = 1102,
|
||||||
STR_SHORTCUT_SYSTEMMENU = 1103,
|
STR_SHORTCUT_SYSTEMMENU = 1103,
|
||||||
STR_SHORTCUT_OPTIONS = 1104,
|
STR_SHORTCUT_OPTIONS = 1104,
|
||||||
STR_SHORTCUT_SAVESLOT = 1105,
|
STR_SHORTCUT_SAVESLOT = 1105,
|
||||||
|
|
||||||
/*********************************************************************************
|
/*********************************************************************************
|
||||||
* Messages *
|
* Messages *
|
||||||
*********************************************************************************/
|
*********************************************************************************/
|
||||||
MSG_CPU_PAUSED = 2000,
|
MSG_CPU_PAUSED = 2000,
|
||||||
MSG_CPU_RESUMED = 2001,
|
MSG_CPU_RESUMED = 2001,
|
||||||
MSG_PERM_LOOP = 2002,
|
MSG_PERM_LOOP = 2002,
|
||||||
MSG_MEM_ALLOC_ERROR = 2003,
|
MSG_MEM_ALLOC_ERROR = 2003,
|
||||||
MSG_FAIL_INIT_GFX = 2004,
|
MSG_FAIL_INIT_GFX = 2004,
|
||||||
MSG_FAIL_INIT_AUDIO = 2005,
|
MSG_FAIL_INIT_AUDIO = 2005,
|
||||||
MSG_FAIL_INIT_RSP = 2006,
|
MSG_FAIL_INIT_RSP = 2006,
|
||||||
MSG_FAIL_INIT_CONTROL = 2007,
|
MSG_FAIL_INIT_CONTROL = 2007,
|
||||||
MSG_FAIL_LOAD_PLUGIN = 2008,
|
MSG_FAIL_LOAD_PLUGIN = 2008,
|
||||||
MSG_FAIL_LOAD_WORD = 2009,
|
MSG_FAIL_LOAD_WORD = 2009,
|
||||||
MSG_FAIL_OPEN_SAVE = 2010,
|
MSG_FAIL_OPEN_SAVE = 2010,
|
||||||
MSG_FAIL_OPEN_EEPROM = 2011,
|
MSG_FAIL_OPEN_EEPROM = 2011,
|
||||||
MSG_FAIL_OPEN_FLASH = 2012,
|
MSG_FAIL_OPEN_FLASH = 2012,
|
||||||
MSG_FAIL_OPEN_MEMPAK = 2013,
|
MSG_FAIL_OPEN_MEMPAK = 2013,
|
||||||
MSG_FAIL_OPEN_ZIP = 2014,
|
MSG_FAIL_OPEN_ZIP = 2014,
|
||||||
MSG_FAIL_OPEN_IMAGE = 2015,
|
MSG_FAIL_OPEN_IMAGE = 2015,
|
||||||
MSG_FAIL_ZIP = 2016,
|
MSG_FAIL_ZIP = 2016,
|
||||||
MSG_FAIL_IMAGE = 2017,
|
MSG_FAIL_IMAGE = 2017,
|
||||||
MSG_UNKNOWN_COUNTRY = 2018,
|
MSG_UNKNOWN_COUNTRY = 2018,
|
||||||
MSG_UNKNOWN_CIC_CHIP = 2019,
|
MSG_UNKNOWN_CIC_CHIP = 2019,
|
||||||
MSG_UNKNOWN_FILE_FORMAT= 2020,
|
MSG_UNKNOWN_FILE_FORMAT = 2020,
|
||||||
MSG_UNKNOWN_MEM_ACTION = 2021,
|
MSG_UNKNOWN_MEM_ACTION = 2021,
|
||||||
MSG_UNHANDLED_OP = 2022,
|
MSG_UNHANDLED_OP = 2022,
|
||||||
MSG_NONMAPPED_SPACE = 2023,
|
MSG_NONMAPPED_SPACE = 2023,
|
||||||
MSG_SAVE_STATE_HEADER = 2024,
|
MSG_SAVE_STATE_HEADER = 2024,
|
||||||
MSG_MSGBOX_TITLE =2025,
|
MSG_MSGBOX_TITLE = 2025,
|
||||||
MSG_PIF2_ERROR = 2026,
|
MSG_PIF2_ERROR = 2026,
|
||||||
MSG_PIF2_TITLE = 2027,
|
MSG_PIF2_TITLE = 2027,
|
||||||
MSG_PLUGIN_CHANGE = 2028,
|
MSG_PLUGIN_CHANGE = 2028,
|
||||||
MSG_PLUGIN_CHANGE_TITLE= 2029,
|
MSG_PLUGIN_CHANGE_TITLE = 2029,
|
||||||
MSG_EMULATION_ENDED = 2030,
|
MSG_EMULATION_ENDED = 2030,
|
||||||
MSG_EMULATION_STARTED = 2031,
|
MSG_EMULATION_STARTED = 2031,
|
||||||
MSG_UNABLED_LOAD_STATE = 2032,
|
MSG_UNABLED_LOAD_STATE = 2032,
|
||||||
MSG_LOADED_STATE = 2033,
|
MSG_LOADED_STATE = 2033,
|
||||||
MSG_SAVED_STATE = 2034,
|
MSG_SAVED_STATE = 2034,
|
||||||
MSG_SAVE_SLOT = 2035,
|
MSG_SAVE_SLOT = 2035,
|
||||||
MSG_BYTESWAP =2036,
|
MSG_BYTESWAP = 2036,
|
||||||
MSG_CHOOSE_IMAGE = 2037,
|
MSG_CHOOSE_IMAGE = 2037,
|
||||||
MSG_LOADED = 2038,
|
MSG_LOADED = 2038,
|
||||||
MSG_LOADING = 2039,
|
MSG_LOADING = 2039,
|
||||||
MSG_PLUGIN_NOT_INIT = 2040,
|
MSG_PLUGIN_NOT_INIT = 2040,
|
||||||
MSG_DEL_SURE = 2041,
|
MSG_DEL_SURE = 2041,
|
||||||
MSG_DEL_TITLE = 2042,
|
MSG_DEL_TITLE = 2042,
|
||||||
MSG_CHEAT_NAME_IN_USE = 2043,
|
MSG_CHEAT_NAME_IN_USE = 2043,
|
||||||
MSG_MAX_CHEATS = 2044,
|
MSG_MAX_CHEATS = 2044,
|
||||||
MSG_PLUGIN_INIT = 2045, //Added in pj64 1.6
|
MSG_PLUGIN_INIT = 2045, //Added in pj64 1.6
|
||||||
MSG_NO_SHORTCUT_SEL = 2046, //Added in pj64 1.6
|
MSG_NO_SHORTCUT_SEL = 2046, //Added in pj64 1.6
|
||||||
MSG_NO_MENUITEM_SEL = 2047, //Added in pj64 1.6
|
MSG_NO_MENUITEM_SEL = 2047, //Added in pj64 1.6
|
||||||
MSG_MENUITEM_ASSIGNED = 2048, //Added in pj64 1.6
|
MSG_MENUITEM_ASSIGNED = 2048, //Added in pj64 1.6
|
||||||
MSG_NO_SEL_SHORTCUT = 2049, //Added in pj64 1.6
|
MSG_NO_SEL_SHORTCUT = 2049, //Added in pj64 1.6
|
||||||
MSG_WAITING_FOR_START = 2050, //Added in pj64 1.7
|
MSG_WAITING_FOR_START = 2050, //Added in pj64 1.7
|
||||||
MSG_INVALID_EXE = 2051, //Added in pj64 1.7
|
MSG_INVALID_EXE = 2051, //Added in pj64 1.7
|
||||||
MSG_INVALID_EXE_TITLE = 2052, //Added in pj64 1.7
|
MSG_INVALID_EXE_TITLE = 2052, //Added in pj64 1.7
|
||||||
MSG_7Z_FILE_NOT_FOUND = 2053, //Added in pj64 1.7
|
MSG_7Z_FILE_NOT_FOUND = 2053, //Added in pj64 1.7
|
||||||
MSG_SET_LLE_GFX_TITLE = 2054, //Added in pj64 1.7
|
MSG_SET_LLE_GFX_TITLE = 2054, //Added in pj64 1.7
|
||||||
MSG_SET_LLE_GFX_MSG = 2055, //Added in pj64 1.7
|
MSG_SET_LLE_GFX_MSG = 2055, //Added in pj64 1.7
|
||||||
MSG_SET_HLE_AUD_TITLE = 2056, //Added in pj64 1.7
|
MSG_SET_HLE_AUD_TITLE = 2056, //Added in pj64 1.7
|
||||||
MSG_SET_HLE_AUD_MSG = 2057, //Added in pj64 1.7
|
MSG_SET_HLE_AUD_MSG = 2057, //Added in pj64 1.7
|
||||||
};
|
};
|
||||||
|
|
||||||
#include ".\\Multilanguage\Language Class.h"
|
#include ".\\Multilanguage\Language Class.h"
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -14,8 +14,9 @@
|
||||||
#include <string> //stl string
|
#include <string> //stl string
|
||||||
#include <map> //stl map
|
#include <map> //stl map
|
||||||
#include <list> //stl list
|
#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;
|
typedef LANG_STRINGS::value_type LANG_STR;
|
||||||
|
|
||||||
struct LanguageFile
|
struct LanguageFile
|
||||||
|
@ -29,14 +30,14 @@ typedef std::list<LanguageFile> LanguageList;
|
||||||
class CLanguage
|
class CLanguage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CLanguage ();
|
CLanguage();
|
||||||
|
|
||||||
const std::wstring & GetString ( LanguageStringID StringID );
|
const std::wstring & GetString(LanguageStringID StringID);
|
||||||
LanguageList & GetLangList ( void );
|
LanguageList & GetLangList(void);
|
||||||
void SetLanguage ( const wchar_t * LanguageName );
|
void SetLanguage(const wchar_t * LanguageName);
|
||||||
bool LoadCurrentStrings ( void );
|
bool LoadCurrentStrings(void);
|
||||||
bool IsCurrentLang ( LanguageFile & File );
|
bool IsCurrentLang(LanguageFile & File);
|
||||||
bool IsLanguageLoaded ( void ) const { return m_LanguageLoaded; }
|
bool IsLanguageLoaded(void) const { return m_LanguageLoaded; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CLanguage(const CLanguage&); // Disable copy constructor
|
CLanguage(const CLanguage&); // Disable copy constructor
|
||||||
|
@ -48,16 +49,16 @@ private:
|
||||||
LANG_STRINGS m_CurrentStrings, m_DefaultStrings;
|
LANG_STRINGS m_CurrentStrings, m_DefaultStrings;
|
||||||
LanguageList m_LanguageList;
|
LanguageList m_LanguageList;
|
||||||
|
|
||||||
std::wstring GetLangString ( const char * FileName, LanguageStringID ID );
|
std::wstring GetLangString(const char * FileName, LanguageStringID ID);
|
||||||
LANG_STR GetNextLangString ( void * OpenFile );
|
LANG_STR GetNextLangString(void * OpenFile);
|
||||||
void LoadDefaultStrings ( void );
|
void LoadDefaultStrings(void);
|
||||||
|
|
||||||
bool m_LanguageLoaded;
|
bool m_LanguageLoaded;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CLanguage * g_Lang;
|
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();
|
return g_Lang->GetString(StringID).c_str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -15,299 +15,114 @@ 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;
|
LRESULT CALLBACK CLanguageSelector::LangSelectProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
static HBITMAP hbmpBackgroundTop = NULL;
|
static HBITMAP hbmpBackgroundTop = NULL;
|
||||||
static HBITMAP hbmpBackgroundBottom = NULL;
|
|
||||||
static HBITMAP hbmpBackgroundMiddle = NULL;
|
|
||||||
static HFONT hTextFont = NULL;
|
static HFONT hTextFont = NULL;
|
||||||
static CLanguageSelector * lngClass;
|
static CLanguageSelector * lngClass;
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
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)
|
||||||
{
|
{
|
||||||
lngClass = (CLanguageSelector *)lParam;
|
EndDialog(hDlg, 0);
|
||||||
|
}
|
||||||
LanguageList LangList = g_Lang->GetLangList();
|
for (LanguageList::iterator Language = LangList.begin(); Language != LangList.end(); Language++)
|
||||||
if (LangList.size() == 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)
|
||||||
{
|
{
|
||||||
EndDialog(hDlg,0);
|
SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_SETCURSEL, index, 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)
|
|
||||||
{
|
|
||||||
SendMessage(GetDlgItem(hDlg,IDC_LANG_SEL),CB_SETCURSEL,index,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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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));
|
|
||||||
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,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
FW_NORMAL,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
DEFAULT_CHARSET,
|
|
||||||
OUT_DEFAULT_PRECIS,
|
|
||||||
CLIP_DEFAULT_PRECIS,
|
|
||||||
PROOF_QUALITY,
|
|
||||||
DEFAULT_PITCH|FF_DONTCARE,
|
|
||||||
"Arial"
|
|
||||||
);
|
|
||||||
SendDlgItemMessage(hDlg,IDC_SELECT_LANG,WM_SETFONT,(WPARAM)hTextFont,TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hOkButton = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_LANG_OK));
|
int Index = SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_GETCURSEL, 0, 0);
|
||||||
pfnWndLangSelectOkProc = (WNDPROC)::GetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC);
|
if (Index < 0)
|
||||||
::SetWindowLongPtr(GetDlgItem(hDlg,IDOK), GWLP_WNDPROC,(LONG_PTR)LangSelectOkProc);
|
|
||||||
break;
|
|
||||||
case WM_NCHITTEST:
|
|
||||||
{
|
{
|
||||||
int xPos = LOWORD(lParam);
|
SendMessage(GetDlgItem(hDlg, IDC_LANG_SEL), CB_SETCURSEL, 0, 0);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
// Use the size of the image
|
||||||
|
hbmpBackgroundTop = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_ABOUT_LOGO));
|
||||||
|
BITMAP bmTL;
|
||||||
|
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL);
|
||||||
|
|
||||||
|
hTextFont = ::CreateFont
|
||||||
|
(
|
||||||
|
18,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
FW_NORMAL,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
DEFAULT_CHARSET,
|
||||||
|
OUT_DEFAULT_PRECIS,
|
||||||
|
CLIP_DEFAULT_PRECIS,
|
||||||
|
PROOF_QUALITY,
|
||||||
|
DEFAULT_PITCH | FF_DONTCARE,
|
||||||
|
"Arial"
|
||||||
|
);
|
||||||
|
SendDlgItemMessage(hDlg, IDC_SELECT_LANG, WM_SETFONT, (WPARAM)hTextFont, TRUE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case WM_CTLCOLORSTATIC:
|
case WM_CTLCOLORSTATIC:
|
||||||
{
|
{
|
||||||
HDC hdcStatic = (HDC)wParam;
|
HDC hdcStatic = (HDC)wParam;
|
||||||
SetTextColor(hdcStatic, RGB(0, 0, 0));
|
SetTextColor(hdcStatic, RGB(0, 0, 0));
|
||||||
SetBkMode(hdcStatic, TRANSPARENT);
|
SetBkMode(hdcStatic, TRANSPARENT);
|
||||||
return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
|
return (LONG)(LRESULT)((HBRUSH)GetStockObject(NULL_BRUSH));
|
||||||
}
|
}
|
||||||
break;
|
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:
|
case WM_PAINT:
|
||||||
|
{
|
||||||
|
PAINTSTRUCT ps;
|
||||||
|
|
||||||
|
if (BeginPaint(hDlg, &ps))
|
||||||
{
|
{
|
||||||
PAINTSTRUCT ps;
|
RECT rcClient;
|
||||||
|
GetClientRect(hDlg, &rcClient);
|
||||||
|
|
||||||
if (BeginPaint(hDlg,&ps))
|
BITMAP bmTL_top;
|
||||||
{
|
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
|
||||||
RECT rcClient;
|
|
||||||
GetClientRect(hDlg, &rcClient);
|
|
||||||
|
|
||||||
BITMAP bmTL_top, bmTL_bottom, bmTL_Middle;
|
HDC memdc = CreateCompatibleDC(ps.hdc);
|
||||||
GetObject(hbmpBackgroundTop, sizeof(BITMAP), &bmTL_top);
|
HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
|
||||||
GetObject(hbmpBackgroundBottom, sizeof(BITMAP), &bmTL_bottom);
|
BitBlt(ps.hdc, 0, 0, bmTL_top.bmWidth, bmTL_top.bmHeight, memdc, 0, 0, SRCCOPY);
|
||||||
GetObject(hbmpBackgroundMiddle, sizeof(BITMAP), &bmTL_Middle);
|
SelectObject(memdc, save);
|
||||||
|
DeleteDC(memdc);
|
||||||
|
|
||||||
HDC memdc = CreateCompatibleDC(ps.hdc);
|
EndPaint(hDlg, &ps);
|
||||||
HGDIOBJ save = SelectObject(memdc, hbmpBackgroundTop);
|
|
||||||
BitBlt(ps.hdc, 0, 0, bmTL_top.bmWidth, bmTL_top.bmHeight, memdc, 0, 0, SRCCOPY);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
|
break;
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
switch (LOWORD(wParam))
|
switch (LOWORD(wParam))
|
||||||
{
|
{
|
||||||
|
@ -316,14 +131,6 @@ LRESULT CALLBACK CLanguageSelector::LangSelectProc (HWND hDlg, UINT uMsg, WPARAM
|
||||||
{
|
{
|
||||||
DeleteObject(hbmpBackgroundTop);
|
DeleteObject(hbmpBackgroundTop);
|
||||||
}
|
}
|
||||||
if (hbmpBackgroundBottom)
|
|
||||||
{
|
|
||||||
DeleteObject(hbmpBackgroundBottom);
|
|
||||||
}
|
|
||||||
if (hbmpBackgroundMiddle)
|
|
||||||
{
|
|
||||||
DeleteObject(hbmpBackgroundMiddle);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hTextFont)
|
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)
|
if (Index >= 0)
|
||||||
{
|
{
|
||||||
wchar_t String[255];
|
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);
|
g_Lang->SetLanguage(String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EndDialog(hDlg,0);
|
EndDialog(hDlg, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -13,13 +13,13 @@
|
||||||
class CLanguageSelector
|
class CLanguageSelector
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CLanguageSelector ();
|
CLanguageSelector();
|
||||||
|
|
||||||
void Select ( void );
|
void Select(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CLanguageSelector(const CLanguageSelector&); // Disable copy constructor
|
CLanguageSelector(const CLanguageSelector&); // Disable copy constructor
|
||||||
CLanguageSelector& operator=(const CLanguageSelector&); // Disable assignment
|
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);
|
||||||
};
|
};
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -16,7 +16,6 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "User Interface.h"
|
#include "User Interface.h"
|
||||||
#include "N64 System/Types.h"
|
|
||||||
|
|
||||||
class CNotification;
|
class CNotification;
|
||||||
#include "N64 System/Profiling Class.h"
|
#include "N64 System/Profiling Class.h"
|
||||||
|
@ -45,7 +44,6 @@ class CNotification;
|
||||||
|
|
||||||
//C Core - to be upgrdaded and removed
|
//C Core - to be upgrdaded and removed
|
||||||
#include "N64 System/C Core/r4300i Commands.h"
|
#include "N64 System/C Core/r4300i Commands.h"
|
||||||
#include "N64 System/C Core/Logging.h"
|
|
||||||
|
|
||||||
//Interpter
|
//Interpter
|
||||||
#include "N64 System/Interpreter/Interpreter Ops.h"
|
#include "N64 System/Interpreter/Interpreter Ops.h"
|
||||||
|
@ -65,7 +63,6 @@ class CNotification;
|
||||||
#include "N64 System/Recompiler/Section Info.h"
|
#include "N64 System/Recompiler/Section Info.h"
|
||||||
#include "N64 System/Recompiler/Function Info.h"
|
#include "N64 System/Recompiler/Function Info.h"
|
||||||
#include "N64 System/Recompiler/Function Map Class.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/Recompiler Class.h"
|
||||||
#include "N64 System/Recompiler/x86CodeLog.h"
|
#include "N64 System/Recompiler/x86CodeLog.h"
|
||||||
|
|
||||||
|
@ -78,4 +75,3 @@ class CNotification;
|
||||||
//Main Files
|
//Main Files
|
||||||
#include "N64 System/N64 Class.h"
|
#include "N64 System/N64 Class.h"
|
||||||
#include "N64 System/System Globals.h"
|
#include "N64 System/System Globals.h"
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,82 +10,39 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CCheats
|
class CCheats
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CCheats ( const CN64Rom * Rom = NULL );
|
CCheats();
|
||||||
~CCheats ( void );
|
~CCheats(void);
|
||||||
|
|
||||||
bool IsCheatMessage ( MSG * msg );
|
enum
|
||||||
void ApplyCheats ( CMipsMemory * MMU );
|
{
|
||||||
void ApplyGSButton ( CMipsMemory * MMU );
|
MaxCheats = 50000,
|
||||||
void LoadCheats ( bool DisableSelected, CPlugins * Plugins );
|
MaxGSEntries = 100,
|
||||||
void SelectCheats ( HWND hParent, bool BlockExecution );
|
};
|
||||||
inline bool CheatsSlectionChanged ( void ) const { return m_CheatSelectionChanged; }
|
|
||||||
|
void ApplyCheats(CMipsMemory * MMU);
|
||||||
|
void ApplyGSButton(CMipsMemory * MMU);
|
||||||
|
void LoadCheats(bool DisableSelected, CPlugins * Plugins);
|
||||||
|
|
||||||
|
static bool IsValid16BitCode(const char * CheatString);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct GAMESHARK_CODE {
|
struct GAMESHARK_CODE
|
||||||
DWORD Command;
|
{
|
||||||
WORD Value;
|
uint32_t Command;
|
||||||
};
|
uint16_t Value;
|
||||||
|
};
|
||||||
|
|
||||||
typedef std::vector<GAMESHARK_CODE> CODES;
|
typedef std::vector<GAMESHARK_CODE> CODES;
|
||||||
typedef std::vector<CODES> CODES_ARRAY;
|
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;
|
const CN64Rom * m_Rom;
|
||||||
enum TV_CHECK_STATE { TV_STATE_UNKNOWN, TV_STATE_CLEAR, TV_STATE_CHECKED, TV_STATE_INDETERMINATE };
|
CODES_ARRAY m_Codes;
|
||||||
enum { MaxGSEntries = 100, IDC_MYTREE = 0x500 };
|
|
||||||
|
|
||||||
bool LoadCode ( int CheatNo, LPCSTR CheatString );
|
bool LoadCode(int32_t CheatNo, const char * CheatString);
|
||||||
void AddCodeLayers ( int CheatNumber, const stdstr &CheatName, HWND hParent, bool CheatActive );
|
int32_t ApplyCheatEntry(CMipsMemory * MMU, const CODES & CodeEntry, int32_t CurrentEntry, bool Execute);
|
||||||
//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);
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,76 +1,76 @@
|
||||||
template <class T>
|
template <class T>
|
||||||
class CDebugDialog :
|
class CDebugDialog :
|
||||||
public CDialogImpl<T>
|
public CDialogImpl < T >
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
CDebugger * m_Debugger;
|
CDebuggerUI * m_Debugger;
|
||||||
HANDLE m_CreatedEvent;
|
HANDLE m_CreatedEvent;
|
||||||
HANDLE m_DialogThread;
|
HANDLE m_DialogThread;
|
||||||
|
|
||||||
static DWORD CreateDebuggerWindow (CDebugDialog<T> * pThis)
|
static DWORD CreateDebuggerWindow(CDebugDialog<T> * pThis)
|
||||||
{
|
{
|
||||||
pThis->DoModal(NULL);
|
pThis->DoModal(NULL);
|
||||||
pThis->WindowCreated();
|
pThis->WindowCreated();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowCreated ( void )
|
void WindowCreated(void)
|
||||||
{
|
{
|
||||||
SetEvent(m_CreatedEvent);
|
SetEvent(m_CreatedEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CDebugDialog (CDebugger * debugger) :
|
CDebugDialog(CDebuggerUI * debugger) :
|
||||||
m_Debugger(debugger),
|
m_Debugger(debugger),
|
||||||
m_CreatedEvent(CreateEvent(NULL,true,false,NULL)),
|
m_CreatedEvent(CreateEvent(NULL, true, false, NULL)),
|
||||||
m_DialogThread(NULL)
|
m_DialogThread(NULL)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
virtual ~CDebugDialog (void)
|
virtual ~CDebugDialog(void)
|
||||||
{
|
{
|
||||||
HideWindow();
|
HideWindow();
|
||||||
CloseHandle(m_CreatedEvent);
|
CloseHandle(m_CreatedEvent);
|
||||||
if (m_DialogThread)
|
if (m_DialogThread)
|
||||||
{
|
{
|
||||||
CloseHandle(m_DialogThread);
|
CloseHandle(m_DialogThread);
|
||||||
m_DialogThread = NULL;
|
m_DialogThread = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HideWindow ( void )
|
void HideWindow(void)
|
||||||
{
|
{
|
||||||
if (m_hWnd && ::IsWindow(m_hWnd))
|
if (m_hWnd && ::IsWindow(m_hWnd))
|
||||||
{
|
{
|
||||||
::EndDialog(m_hWnd, 0);
|
::EndDialog(m_hWnd, 0);
|
||||||
}
|
}
|
||||||
if (m_DialogThread)
|
if (m_DialogThread)
|
||||||
{
|
{
|
||||||
if (WaitForSingleObject(m_DialogThread, 5000) == WAIT_TIMEOUT)
|
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);
|
TerminateThread(m_DialogThread, 1);
|
||||||
}
|
}
|
||||||
CloseHandle(m_DialogThread);
|
CloseHandle(m_DialogThread);
|
||||||
m_DialogThread = NULL;
|
m_DialogThread = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowWindow ( void )
|
void ShowWindow(void)
|
||||||
{
|
{
|
||||||
if (m_hWnd)
|
if (m_hWnd)
|
||||||
{
|
{
|
||||||
SetForegroundWindow((HWND)m_hWnd);
|
SetForegroundWindow((HWND)m_hWnd);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DWORD ThreadID;
|
DWORD ThreadID;
|
||||||
ResetEvent(m_CreatedEvent);
|
ResetEvent(m_CreatedEvent);
|
||||||
m_DialogThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CreateDebuggerWindow,(LPVOID)this,0, &ThreadID);
|
m_DialogThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CreateDebuggerWindow, (LPVOID)this, 0, &ThreadID);
|
||||||
if (WaitForSingleObject(m_CreatedEvent,20000) == WAIT_TIMEOUT)
|
if (WaitForSingleObject(m_CreatedEvent, 20000) == WAIT_TIMEOUT)
|
||||||
{
|
{
|
||||||
WriteTrace(TraceError,"Failed to get window create notification");
|
WriteTrace(TraceError, "Failed to get window create notification");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,11 +10,10 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#ifdef WINDOWS_UI
|
|
||||||
#include "Debugger UI.h"
|
#include "Debugger UI.h"
|
||||||
|
|
||||||
CDumpMemory::CDumpMemory(CDebugger * debugger) :
|
CDumpMemory::CDumpMemory(CDebuggerUI * debugger) :
|
||||||
CDebugDialog<CDumpMemory>(debugger)
|
CDebugDialog<CDumpMemory>(debugger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,575 +23,135 @@ CDumpMemory::~CDumpMemory()
|
||||||
|
|
||||||
LRESULT CDumpMemory::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
LRESULT CDumpMemory::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
||||||
{
|
{
|
||||||
m_StartAddress.Attach(GetDlgItem(IDC_E_START_ADDR));
|
m_StartAddress.Attach(GetDlgItem(IDC_E_START_ADDR));
|
||||||
m_EndAddress.Attach(GetDlgItem(IDC_E_END_ADDR));
|
m_EndAddress.Attach(GetDlgItem(IDC_E_END_ADDR));
|
||||||
m_PC.Attach(GetDlgItem(IDC_E_ALT_PC));
|
m_PC.Attach(GetDlgItem(IDC_E_ALT_PC));
|
||||||
|
|
||||||
m_StartAddress.SetDisplayType(CEditNumber::DisplayHex);
|
m_StartAddress.SetDisplayType(CEditNumber::DisplayHex);
|
||||||
m_EndAddress.SetDisplayType(CEditNumber::DisplayHex);
|
m_EndAddress.SetDisplayType(CEditNumber::DisplayHex);
|
||||||
m_PC.SetDisplayType(CEditNumber::DisplayHex);
|
m_PC.SetDisplayType(CEditNumber::DisplayHex);
|
||||||
|
|
||||||
m_StartAddress.SetValue(0x80000000,true,true);
|
m_StartAddress.SetValue(0x80000000, true, true);
|
||||||
m_EndAddress.SetValue(0x803FFFF0,true,true);
|
m_EndAddress.SetValue(0x803FFFF0, true, true);
|
||||||
m_PC.SetValue(0x80000000);
|
m_PC.SetValue(0x80000000);
|
||||||
HWND hFormatList = GetDlgItem(IDC_FORMAT);
|
HWND hFormatList = GetDlgItem(IDC_FORMAT);
|
||||||
int pos = ::SendMessage(hFormatList,CB_ADDSTRING,(WPARAM)0,(LPARAM)"TEXT - Disassembly + PC");
|
int pos = ::SendMessage(hFormatList, CB_ADDSTRING, (WPARAM)0, (LPARAM)"TEXT - Disassembly + PC");
|
||||||
::SendMessage(hFormatList,CB_SETITEMDATA,(WPARAM)pos,(LPARAM)DisassemblyWithPC);
|
::SendMessage(hFormatList, CB_SETITEMDATA, (WPARAM)pos, (LPARAM)DisassemblyWithPC);
|
||||||
::SendMessage(hFormatList,CB_SETCURSEL,(WPARAM)0,(LPARAM)0);
|
::SendMessage(hFormatList, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
|
||||||
|
|
||||||
WindowCreated();
|
WindowCreated();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT CDumpMemory::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
|
LRESULT CDumpMemory::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
|
||||||
{
|
{
|
||||||
switch(wID)
|
switch (wID)
|
||||||
{
|
{
|
||||||
case IDCANCEL:
|
case IDCANCEL:
|
||||||
EndDialog(0);
|
EndDialog(0);
|
||||||
break;
|
break;
|
||||||
case IDC_BTN_CHOOSE_FILE:
|
case IDC_BTN_CHOOSE_FILE:
|
||||||
{
|
{
|
||||||
char FileName[_MAX_PATH],Directory[_MAX_PATH];
|
char FileName[_MAX_PATH], Directory[_MAX_PATH];
|
||||||
OPENFILENAME openfilename;
|
OPENFILENAME openfilename;
|
||||||
|
|
||||||
memset(&FileName, 0, sizeof(FileName));
|
memset(&FileName, 0, sizeof(FileName));
|
||||||
memset(&openfilename, 0, sizeof(openfilename));
|
memset(&openfilename, 0, sizeof(openfilename));
|
||||||
strcpy(Directory,CPath(CPath::MODULE_DIRECTORY));
|
strcpy(Directory, CPath(CPath::MODULE_DIRECTORY));
|
||||||
openfilename.lStructSize = sizeof( openfilename );
|
openfilename.lStructSize = sizeof(openfilename);
|
||||||
openfilename.hwndOwner = m_hWnd;
|
openfilename.hwndOwner = m_hWnd;
|
||||||
openfilename.lpstrFilter = "Text file (*.txt)\0*.txt;\0All files (*.*)\0*.*\0";
|
openfilename.lpstrFilter = "Text file (*.txt)\0*.txt;\0All files (*.*)\0*.*\0";
|
||||||
openfilename.lpstrFile = FileName;
|
openfilename.lpstrFile = FileName;
|
||||||
openfilename.lpstrInitialDir = Directory;
|
openfilename.lpstrInitialDir = Directory;
|
||||||
openfilename.nMaxFile = MAX_PATH;
|
openfilename.nMaxFile = MAX_PATH;
|
||||||
openfilename.Flags = OFN_HIDEREADONLY;
|
openfilename.Flags = OFN_HIDEREADONLY;
|
||||||
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory);
|
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];
|
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)
|
if (strlen(ext) == 0)
|
||||||
{
|
{
|
||||||
strcat(FileName,".txt");
|
strcat(FileName, ".txt");
|
||||||
}
|
}
|
||||||
SetDlgItemText(IDC_FILENAME,FileName);
|
SetDlgItemText(IDC_FILENAME, FileName);
|
||||||
}
|
}
|
||||||
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
|
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDOK:
|
case IDOK:
|
||||||
{
|
{
|
||||||
TCHAR FileName[MAX_PATH];
|
TCHAR FileName[MAX_PATH];
|
||||||
int CurrentFormatSel = SendDlgItemMessage(IDC_FORMAT,CB_GETCURSEL,0,0);
|
int CurrentFormatSel = SendDlgItemMessage(IDC_FORMAT, CB_GETCURSEL, 0, 0);
|
||||||
DumpFormat Format = (DumpFormat)SendDlgItemMessage(IDC_FORMAT,CB_GETITEMDATA,CurrentFormatSel,0);
|
DumpFormat Format = (DumpFormat)SendDlgItemMessage(IDC_FORMAT, CB_GETITEMDATA, CurrentFormatSel, 0);
|
||||||
DWORD StartPC =m_StartAddress.GetValue();
|
DWORD StartPC = m_StartAddress.GetValue();
|
||||||
DWORD EndPC = m_EndAddress.GetValue();
|
DWORD EndPC = m_EndAddress.GetValue();
|
||||||
DWORD DumpPC = m_PC.GetValue();
|
DWORD DumpPC = m_PC.GetValue();
|
||||||
GetDlgItemText(IDC_FILENAME,FileName,sizeof(FileName));
|
GetDlgItemText(IDC_FILENAME, FileName, sizeof(FileName));
|
||||||
if (strlen(FileName) == 0)
|
if (strlen(FileName) == 0)
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"Please Choose target file");
|
g_Notify->DisplayError(L"Please Choose target file");
|
||||||
::SetFocus(GetDlgItem(IDC_FILENAME));
|
::SetFocus(GetDlgItem(IDC_FILENAME));
|
||||||
return false;
|
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;
|
DumpPC = g_Reg->m_PROGRAM_COUNTER;
|
||||||
}
|
}
|
||||||
//disable buttons
|
//disable buttons
|
||||||
::EnableWindow(GetDlgItem(IDC_E_START_ADDR),FALSE);
|
::EnableWindow(GetDlgItem(IDC_E_START_ADDR), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDC_E_END_ADDR),FALSE);
|
::EnableWindow(GetDlgItem(IDC_E_END_ADDR), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDC_E_ALT_PC),FALSE);
|
::EnableWindow(GetDlgItem(IDC_E_ALT_PC), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDC_USE_ALT_PC),FALSE);
|
::EnableWindow(GetDlgItem(IDC_USE_ALT_PC), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDC_FILENAME),FALSE);
|
::EnableWindow(GetDlgItem(IDC_FILENAME), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDC_BTN_CHOOSE_FILE),FALSE);
|
::EnableWindow(GetDlgItem(IDC_BTN_CHOOSE_FILE), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDC_FORMAT),FALSE);
|
::EnableWindow(GetDlgItem(IDC_FORMAT), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDOK),FALSE);
|
::EnableWindow(GetDlgItem(IDOK), FALSE);
|
||||||
::EnableWindow(GetDlgItem(IDCANCEL),FALSE);
|
::EnableWindow(GetDlgItem(IDCANCEL), FALSE);
|
||||||
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory);
|
g_BaseSystem->ExternalEvent(SysEvent_PauseCPU_DumpMemory);
|
||||||
if (!DumpMemory(FileName,Format,StartPC,EndPC,DumpPC))
|
if (!DumpMemory(FileName, Format, StartPC, EndPC, DumpPC))
|
||||||
{
|
{
|
||||||
//enable buttons
|
//enable buttons
|
||||||
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
|
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
|
g_BaseSystem->ExternalEvent(SysEvent_ResumeCPU_DumpMemory);
|
||||||
}
|
}
|
||||||
EndDialog(0);
|
EndDialog(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//#include "..\\..\\User Interface.h"
|
bool CDumpMemory::DumpMemory(LPCSTR FileName, DumpFormat Format, DWORD StartPC, DWORD EndPC, DWORD /*DumpPC*/)
|
||||||
//#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*/ )
|
|
||||||
{
|
{
|
||||||
switch (Format)
|
switch (Format)
|
||||||
{
|
{
|
||||||
case DisassemblyWithPC:
|
case DisassemblyWithPC:
|
||||||
{
|
{
|
||||||
CLog LogFile;
|
CLog LogFile;
|
||||||
if (!LogFile.Open(FileName))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
LogFile.SetFlush(false);
|
LogFile.SetFlush(false);
|
||||||
LogFile.SetTruncateFile(false);
|
LogFile.SetTruncateFile(false);
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
#ifdef tofix
|
#ifdef tofix
|
||||||
char Command[200];
|
char Command[200];
|
||||||
for (COpcode OpCode(StartPC); OpCode.PC() < EndPC; OpCode.Next())
|
for (COpcode OpCode(StartPC); OpCode.PC() < EndPC; OpCode.Next())
|
||||||
{
|
{
|
||||||
const char * szOpName = OpCode.OpcodeName();
|
const char * szOpName = OpCode.OpcodeName();
|
||||||
OpCode.OpcodeParam(Command);
|
OpCode.OpcodeParam(Command);
|
||||||
LogFile.LogF("%X: %-15s%s\r\n",OpCode.PC(),szOpName,Command);
|
LogFile.LogF("%X: %-15s%s\r\n",OpCode.PC(),szOpName,Command);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
m_StartAddress.SetValue(StartPC,true,true);
|
m_StartAddress.SetValue(StartPC, true, true);
|
||||||
m_EndAddress.SetValue(EndPC,true,true);
|
m_EndAddress.SetValue(EndPC, true, true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
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
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,33 +11,33 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CDumpMemory :
|
class CDumpMemory :
|
||||||
public CDebugDialog<CDumpMemory>
|
public CDebugDialog < CDumpMemory >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum { IDD = IDD_Cheats_DumpMemory };
|
enum { IDD = IDD_Cheats_DumpMemory };
|
||||||
|
|
||||||
CDumpMemory(CDebugger * debugger);
|
CDumpMemory(CDebuggerUI * debugger);
|
||||||
virtual ~CDumpMemory(void);
|
virtual ~CDumpMemory(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CDumpMemory(void); // Disable default constructor
|
CDumpMemory(void); // Disable default constructor
|
||||||
CDumpMemory(const CDumpMemory&); // Disable copy constructor
|
CDumpMemory(const CDumpMemory&); // Disable copy constructor
|
||||||
CDumpMemory& operator=(const CDumpMemory&); // Disable assignment
|
CDumpMemory& operator=(const CDumpMemory&); // Disable assignment
|
||||||
|
|
||||||
enum DumpFormat
|
enum DumpFormat
|
||||||
{
|
{
|
||||||
DisassemblyWithPC
|
DisassemblyWithPC
|
||||||
};
|
};
|
||||||
|
|
||||||
BEGIN_MSG_MAP_EX(CDumpMemory)
|
BEGIN_MSG_MAP_EX(CDumpMemory)
|
||||||
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
||||||
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
|
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
|
||||||
END_MSG_MAP()
|
END_MSG_MAP()
|
||||||
|
|
||||||
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
||||||
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, 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;
|
CEditNumber m_StartAddress, m_EndAddress, m_PC;
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,59 +11,59 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CDebugMemorySearch :
|
class CDebugMemorySearch :
|
||||||
public CDebugDialog<CDebugMemorySearch>
|
public CDebugDialog < CDebugMemorySearch >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum { IDD = IDD_Debugger_Search };
|
enum { IDD = IDD_Debugger_Search };
|
||||||
|
|
||||||
CDebugMemorySearch(CDebugger * debugger);
|
CDebugMemorySearch(CDebuggerUI * debugger);
|
||||||
virtual ~CDebugMemorySearch(void);
|
virtual ~CDebugMemorySearch(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CDebugMemorySearch(void); // Disable default constructor
|
CDebugMemorySearch(void); // Disable default constructor
|
||||||
CDebugMemorySearch(const CDebugMemorySearch&); // Disable copy constructor
|
CDebugMemorySearch(const CDebugMemorySearch&); // Disable copy constructor
|
||||||
CDebugMemorySearch& operator=(const CDebugMemorySearch&); // Disable assignment
|
CDebugMemorySearch& operator=(const CDebugMemorySearch&); // Disable assignment
|
||||||
|
|
||||||
enum MemorySize
|
enum MemorySize
|
||||||
{
|
{
|
||||||
_8Bit,
|
_8Bit,
|
||||||
_16Bit,
|
_16Bit,
|
||||||
_32Bit,
|
_32Bit,
|
||||||
};
|
};
|
||||||
|
|
||||||
//Searching for value
|
//Searching for value
|
||||||
enum SearchMemChangeState
|
enum SearchMemChangeState
|
||||||
{
|
{
|
||||||
SearchChangeState_Reset,
|
SearchChangeState_Reset,
|
||||||
SearchChangeState_Changed,
|
SearchChangeState_Changed,
|
||||||
SearchChangeState_Unchanged,
|
SearchChangeState_Unchanged,
|
||||||
SearchChangeState_Greater,
|
SearchChangeState_Greater,
|
||||||
SearchChangeState_Lessthan,
|
SearchChangeState_Lessthan,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SearchResultItem
|
struct SearchResultItem
|
||||||
{
|
{
|
||||||
DWORD PAddr;
|
DWORD PAddr;
|
||||||
DWORD Value;
|
DWORD Value;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<SearchResultItem> SearchResult;
|
typedef std::vector<SearchResultItem> SearchResult;
|
||||||
|
|
||||||
BEGIN_MSG_MAP_EX(CDebugMemorySearch)
|
BEGIN_MSG_MAP_EX(CDebugMemorySearch)
|
||||||
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
||||||
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
|
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
|
||||||
NOTIFY_HANDLER_EX(IDC_LST_RESULTS,NM_RCLICK,OnResultRClick)
|
NOTIFY_HANDLER_EX(IDC_LST_RESULTS, NM_RCLICK, OnResultRClick)
|
||||||
END_MSG_MAP()
|
END_MSG_MAP()
|
||||||
|
|
||||||
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
||||||
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, 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 EnableUnknownOptions(bool Enable);
|
||||||
void EnableValueOptions ( bool Enable );
|
void EnableValueOptions(bool Enable);
|
||||||
void EnableTextOptions ( bool Enable );
|
void EnableTextOptions(bool Enable);
|
||||||
void EnableJalOptions ( bool Enable );
|
void EnableJalOptions(bool Enable);
|
||||||
void AddAlignmentOptions ( CComboBox & ctrl );
|
void AddAlignmentOptions(CComboBox & ctrl);
|
||||||
|
|
||||||
CEditNumber m_PAddrStart, m_SearchLen, m_SearchValue, m_MaxSearch;
|
CEditNumber m_PAddrStart, m_SearchLen, m_SearchValue, m_MaxSearch;
|
||||||
CComboBox m_UnknownOptions, m_ValueSize, m_UnknownSize;
|
CComboBox m_UnknownOptions, m_ValueSize, m_UnknownSize;
|
||||||
|
@ -75,12 +75,12 @@ private:
|
||||||
BYTE * m_MemoryState;
|
BYTE * m_MemoryState;
|
||||||
DWORD m_MemoryStateSize;
|
DWORD m_MemoryStateSize;
|
||||||
|
|
||||||
void FixUnknownOptions ( bool Reset );
|
void FixUnknownOptions(bool Reset);
|
||||||
void SearchForUnknown ( void );
|
void SearchForUnknown(void);
|
||||||
void SearchForValue ( void );
|
void SearchForValue(void);
|
||||||
void SearchForText ( void );
|
void SearchForText(void);
|
||||||
void Reset ( void );
|
void Reset(void);
|
||||||
bool SearchSetBaseForChanges ( void );
|
bool SearchSetBaseForChanges(void);
|
||||||
bool SearchForChanges ( SearchMemChangeState SearchType, MemorySize Size, DWORD &StartAddress, DWORD &Len, DWORD &OldValue, DWORD &NewValue );
|
bool SearchForChanges(SearchMemChangeState SearchType, MemorySize Size, DWORD &StartAddress, DWORD &Len, DWORD &OldValue, DWORD &NewValue);
|
||||||
bool SearchForValue ( DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len );
|
bool SearchForValue(DWORD Value, MemorySize Size, DWORD &StartAddress, DWORD &Len);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,11 +10,10 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#ifdef WINDOWS_UI
|
|
||||||
#include "Debugger UI.h"
|
#include "Debugger UI.h"
|
||||||
|
|
||||||
CDebugTlb::CDebugTlb(CDebugger * debugger) :
|
CDebugTlb::CDebugTlb(CDebuggerUI * debugger) :
|
||||||
CDebugDialog<CDebugTlb>(debugger)
|
CDebugDialog<CDebugTlb>(debugger)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,267 +23,266 @@ CDebugTlb::~CDebugTlb()
|
||||||
|
|
||||||
LRESULT CDebugTlb::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
LRESULT CDebugTlb::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
||||||
{
|
{
|
||||||
LV_COLUMN col;
|
LV_COLUMN col;
|
||||||
|
|
||||||
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||||
col.fmt = LVCFMT_LEFT;
|
col.fmt = LVCFMT_LEFT;
|
||||||
|
|
||||||
col.pszText = "Index";
|
col.pszText = "Index";
|
||||||
col.cx = 40;
|
col.cx = 40;
|
||||||
col.iSubItem = 0;
|
col.iSubItem = 0;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 0, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST), 0, &col);
|
||||||
|
|
||||||
col.pszText = "Page Mask";
|
col.pszText = "Page Mask";
|
||||||
col.cx = 90;
|
col.cx = 90;
|
||||||
col.iSubItem = 1;
|
col.iSubItem = 1;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 1, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST), 1, &col);
|
||||||
|
|
||||||
col.pszText = "Entry Hi";
|
col.pszText = "Entry Hi";
|
||||||
col.cx = 90;
|
col.cx = 90;
|
||||||
col.iSubItem = 2;
|
col.iSubItem = 2;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 2, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST), 2, &col);
|
||||||
|
|
||||||
col.pszText = "Entry Lo0";
|
col.pszText = "Entry Lo0";
|
||||||
col.cx = 90;
|
col.cx = 90;
|
||||||
col.iSubItem = 3;
|
col.iSubItem = 3;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 3, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST), 3, &col);
|
||||||
|
|
||||||
col.pszText = "Entry Lo1";
|
col.pszText = "Entry Lo1";
|
||||||
col.cx = 90;
|
col.cx = 90;
|
||||||
col.iSubItem = 4;
|
col.iSubItem = 4;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST), 4, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST), 4, &col);
|
||||||
|
|
||||||
col.pszText = "Index";
|
col.pszText = "Index";
|
||||||
col.cx = 40;
|
col.cx = 40;
|
||||||
col.iSubItem = 0;
|
col.iSubItem = 0;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 0, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 0, &col);
|
||||||
|
|
||||||
col.pszText = "Valid";
|
col.pszText = "Valid";
|
||||||
col.cx = 40;
|
col.cx = 40;
|
||||||
col.iSubItem = 1;
|
col.iSubItem = 1;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 1, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 1, &col);
|
||||||
|
|
||||||
col.pszText = "Dirty";
|
col.pszText = "Dirty";
|
||||||
col.cx = 40;
|
col.cx = 40;
|
||||||
col.iSubItem = 2;
|
col.iSubItem = 2;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 2, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 2, &col);
|
||||||
|
|
||||||
col.pszText = "Rule";
|
col.pszText = "Rule";
|
||||||
col.cx = 270;
|
col.cx = 270;
|
||||||
col.iSubItem = 3;
|
col.iSubItem = 3;
|
||||||
ListView_InsertColumn ( GetDlgItem(IDC_LIST2), 3, &col);
|
ListView_InsertColumn(GetDlgItem(IDC_LIST2), 3, &col);
|
||||||
|
|
||||||
RefreshTLBWindow();
|
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)
|
// if (Settings().Load(TLBWindowLeft) <= 0)
|
||||||
// {
|
// {
|
||||||
// SetWindowPos(NULL,Settings().Load(TLBWindowLeft),Settings().Load(TLBWindowTop),0,0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
|
// SetWindowPos(NULL,Settings().Load(TLBWindowLeft),Settings().Load(TLBWindowTop),0,0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW);
|
||||||
// }
|
// }
|
||||||
WindowCreated();
|
WindowCreated();
|
||||||
return TRUE;
|
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:
|
case IDCANCEL:
|
||||||
EndDialog(0);
|
EndDialog(0);
|
||||||
break;
|
break;
|
||||||
case IDC_TLB_ENTRIES:
|
case IDC_TLB_ENTRIES:
|
||||||
::ShowWindow(GetDlgItem(IDC_LIST),SW_SHOW);
|
::ShowWindow(GetDlgItem(IDC_LIST), SW_SHOW);
|
||||||
::ShowWindow(GetDlgItem(IDC_LIST2),SW_HIDE);
|
::ShowWindow(GetDlgItem(IDC_LIST2), SW_HIDE);
|
||||||
break;
|
break;
|
||||||
case IDC_TLB_RULES:
|
case IDC_TLB_RULES:
|
||||||
::ShowWindow(GetDlgItem(IDC_LIST),SW_HIDE);
|
::ShowWindow(GetDlgItem(IDC_LIST), SW_HIDE);
|
||||||
::ShowWindow(GetDlgItem(IDC_LIST2),SW_SHOW);
|
::ShowWindow(GetDlgItem(IDC_LIST2), SW_SHOW);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugTlb::RefreshTLBWindow (void)
|
void CDebugTlb::RefreshTLBWindow(void)
|
||||||
{
|
{
|
||||||
if (m_hWnd == NULL)
|
if (m_hWnd == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
HWND hList = GetDlgItem(IDC_LIST);
|
|
||||||
char Output[100], OldText[100];
|
|
||||||
LV_ITEM item, OldItem;
|
|
||||||
int count;
|
|
||||||
|
|
||||||
CTLB::TLB_ENTRY * tlb = g_TLB->m_tlb;
|
HWND hList = GetDlgItem(IDC_LIST);
|
||||||
for (count = 0; count < 32; count ++)
|
char Output[100], OldText[100];
|
||||||
{
|
LV_ITEM item, OldItem;
|
||||||
sprintf(Output,"0x%02X",count);
|
int count;
|
||||||
item.mask = LVIF_TEXT;
|
|
||||||
item.iItem = count;
|
|
||||||
item.pszText = Output;
|
|
||||||
item.iSubItem = 0;
|
|
||||||
|
|
||||||
OldItem.mask = LVIF_TEXT;
|
CTLB::TLB_ENTRY * tlb = g_TLB->m_tlb;
|
||||||
OldItem.iItem = count;
|
for (count = 0; count < 32; count++)
|
||||||
OldItem.pszText = OldText;
|
{
|
||||||
OldItem.cchTextMax = sizeof( OldText )-1;
|
sprintf(Output, "0x%02X", count);
|
||||||
OldItem.iSubItem = 0;
|
item.mask = LVIF_TEXT;
|
||||||
|
item.iItem = count;
|
||||||
|
item.pszText = Output;
|
||||||
|
item.iSubItem = 0;
|
||||||
|
|
||||||
if (ListView_GetItemCount(hList) <= count)
|
OldItem.mask = LVIF_TEXT;
|
||||||
{
|
OldItem.iItem = count;
|
||||||
ListView_InsertItem(hList,&item);
|
OldItem.pszText = OldText;
|
||||||
}
|
OldItem.cchTextMax = sizeof(OldText) - 1;
|
||||||
else
|
OldItem.iSubItem = 0;
|
||||||
{
|
|
||||||
ListView_GetItem(hList,&OldItem);
|
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
|
||||||
{
|
|
||||||
ListView_SetItem(hList,&item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tlb[count].EntryDefined)
|
|
||||||
{
|
|
||||||
sprintf(Output,"0x%08X",tlb[count].PageMask.Value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
strcpy(Output,"................");
|
|
||||||
}
|
|
||||||
item.iSubItem = 1;
|
|
||||||
OldItem.iSubItem = 1;
|
|
||||||
ListView_GetItem(hList,&OldItem);
|
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
|
||||||
{
|
|
||||||
ListView_SetItem(hList,&item);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tlb[count].EntryDefined)
|
if (ListView_GetItemCount(hList) <= count)
|
||||||
{
|
{
|
||||||
sprintf(Output,"0x%08X",tlb[count].EntryHi.Value);
|
ListView_InsertItem(hList, &item);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(Output,"................");
|
ListView_GetItem(hList, &OldItem);
|
||||||
}
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
item.iSubItem = 2;
|
{
|
||||||
OldItem.iSubItem = 2;
|
ListView_SetItem(hList, &item);
|
||||||
ListView_GetItem(hList,&OldItem);
|
}
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
}
|
||||||
{
|
if (tlb[count].EntryDefined)
|
||||||
ListView_SetItem(hList,&item);
|
{
|
||||||
}
|
sprintf(Output, "0x%08X", tlb[count].PageMask.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(Output, "................");
|
||||||
|
}
|
||||||
|
item.iSubItem = 1;
|
||||||
|
OldItem.iSubItem = 1;
|
||||||
|
ListView_GetItem(hList, &OldItem);
|
||||||
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
|
{
|
||||||
|
ListView_SetItem(hList, &item);
|
||||||
|
}
|
||||||
|
|
||||||
if (tlb[count].EntryDefined)
|
if (tlb[count].EntryDefined)
|
||||||
{
|
{
|
||||||
sprintf(Output,"0x%08X",tlb[count].EntryLo0.Value);
|
sprintf(Output, "0x%08X", tlb[count].EntryHi.Value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(Output,"................");
|
strcpy(Output, "................");
|
||||||
}
|
}
|
||||||
item.iSubItem = 3;
|
item.iSubItem = 2;
|
||||||
OldItem.iSubItem = 3;
|
OldItem.iSubItem = 2;
|
||||||
ListView_GetItem(hList,&OldItem);
|
ListView_GetItem(hList, &OldItem);
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
{
|
{
|
||||||
ListView_SetItem(hList,&item);
|
ListView_SetItem(hList, &item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tlb[count].EntryDefined)
|
if (tlb[count].EntryDefined)
|
||||||
{
|
{
|
||||||
sprintf(Output,"0x%08X",tlb[count].EntryLo1.Value);
|
sprintf(Output, "0x%08X", tlb[count].EntryLo0.Value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(Output,"................");
|
strcpy(Output, "................");
|
||||||
}
|
}
|
||||||
item.iSubItem = 4;
|
item.iSubItem = 3;
|
||||||
OldItem.iSubItem = 4;
|
OldItem.iSubItem = 3;
|
||||||
ListView_GetItem(hList,&OldItem);
|
ListView_GetItem(hList, &OldItem);
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
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 ++)
|
|
||||||
{
|
|
||||||
sprintf(Output,"0x%02X",count);
|
|
||||||
item.mask = LVIF_TEXT;
|
|
||||||
item.iItem = count;
|
|
||||||
item.pszText = Output;
|
|
||||||
item.iSubItem = 0;
|
|
||||||
|
|
||||||
OldItem.mask = LVIF_TEXT;
|
if (tlb[count].EntryDefined)
|
||||||
OldItem.iItem = count;
|
{
|
||||||
OldItem.pszText = OldText;
|
sprintf(Output, "0x%08X", tlb[count].EntryLo1.Value);
|
||||||
OldItem.cchTextMax = sizeof( OldText )-1;
|
}
|
||||||
OldItem.iSubItem = 0;
|
else
|
||||||
|
{
|
||||||
|
strcpy(Output, "................");
|
||||||
|
}
|
||||||
|
item.iSubItem = 4;
|
||||||
|
OldItem.iSubItem = 4;
|
||||||
|
ListView_GetItem(hList, &OldItem);
|
||||||
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
|
{
|
||||||
|
ListView_SetItem(hList, &item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ListView_GetItemCount(hList) <= count)
|
CTLB::FASTTLB * FastTlb = g_TLB->m_FastTlb;
|
||||||
{
|
hList = GetDlgItem(IDC_LIST2);
|
||||||
item.iItem = ListView_InsertItem(hList,&item);
|
for (count = 0; count < 64; count++)
|
||||||
}
|
{
|
||||||
else
|
sprintf(Output, "0x%02X", count);
|
||||||
{
|
item.mask = LVIF_TEXT;
|
||||||
ListView_GetItem(hList,&OldItem);
|
item.iItem = count;
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
item.pszText = Output;
|
||||||
{
|
item.iSubItem = 0;
|
||||||
ListView_SetItem(hList,&item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FastTlb[count].ValidEntry)
|
OldItem.mask = LVIF_TEXT;
|
||||||
{
|
OldItem.iItem = count;
|
||||||
sprintf(Output,"%s",FastTlb[count].VALID?"Yes":"No");
|
OldItem.pszText = OldText;
|
||||||
}
|
OldItem.cchTextMax = sizeof(OldText) - 1;
|
||||||
else
|
OldItem.iSubItem = 0;
|
||||||
{
|
|
||||||
strcpy(Output,"................");
|
|
||||||
}
|
|
||||||
item.iSubItem = 1;
|
|
||||||
OldItem.iSubItem = 1;
|
|
||||||
ListView_GetItem(hList,&OldItem);
|
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
|
||||||
{
|
|
||||||
ListView_SetItem(hList,&item);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FastTlb[count].ValidEntry && FastTlb[count].VALID)
|
if (ListView_GetItemCount(hList) <= count)
|
||||||
{
|
{
|
||||||
sprintf(Output,"%s",FastTlb[count].DIRTY?"Yes":"No");
|
item.iItem = ListView_InsertItem(hList, &item);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
strcpy(Output,"................");
|
ListView_GetItem(hList, &OldItem);
|
||||||
}
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
item.iSubItem = 2;
|
{
|
||||||
OldItem.iSubItem = 2;
|
ListView_SetItem(hList, &item);
|
||||||
ListView_GetItem(hList,&OldItem);
|
}
|
||||||
if ( strcmp( item.pszText, OldItem.pszText ) != 0 )
|
}
|
||||||
{
|
|
||||||
ListView_SetItem(hList,&item);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FastTlb[count].ValidEntry && FastTlb[count].VALID)
|
if (FastTlb[count].ValidEntry)
|
||||||
{
|
{
|
||||||
sprintf(Output,"%08X:%08X -> %08X:%08X",FastTlb[count].VSTART,FastTlb[count].VEND,
|
sprintf(Output, "%s", FastTlb[count].VALID ? "Yes" : "No");
|
||||||
FastTlb[count].PHYSSTART,FastTlb[count].PHYSEND);
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
strcpy(Output, "................");
|
||||||
strcpy(Output,"................");
|
}
|
||||||
}
|
item.iSubItem = 1;
|
||||||
item.iSubItem = 3;
|
OldItem.iSubItem = 1;
|
||||||
OldItem.iSubItem = 3;
|
ListView_GetItem(hList, &OldItem);
|
||||||
ListView_GetItem(hList,&OldItem);
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
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");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(Output, "................");
|
||||||
|
}
|
||||||
|
item.iSubItem = 2;
|
||||||
|
OldItem.iSubItem = 2;
|
||||||
|
ListView_GetItem(hList, &OldItem);
|
||||||
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(Output, "................");
|
||||||
|
}
|
||||||
|
item.iSubItem = 3;
|
||||||
|
OldItem.iSubItem = 3;
|
||||||
|
ListView_GetItem(hList, &OldItem);
|
||||||
|
if (strcmp(item.pszText, OldItem.pszText) != 0)
|
||||||
|
{
|
||||||
|
ListView_SetItem(hList, &item);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,22 +11,21 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CDebugTlb :
|
class CDebugTlb :
|
||||||
public CDebugDialog<CDebugTlb>
|
public CDebugDialog < CDebugTlb >
|
||||||
{
|
{
|
||||||
|
BEGIN_MSG_MAP_EX(CDebugTlb)
|
||||||
BEGIN_MSG_MAP_EX(CDebugTlb)
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
||||||
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
COMMAND_CODE_HANDLER(BN_CLICKED, OnClicked)
|
||||||
COMMAND_CODE_HANDLER(BN_CLICKED,OnClicked)
|
|
||||||
END_MSG_MAP()
|
END_MSG_MAP()
|
||||||
|
|
||||||
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
||||||
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
|
LRESULT OnClicked(WORD wNotifyCode, WORD wID, HWND /*hWndCtl*/, BOOL& bHandled);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum { IDD = IDD_Debugger_TLB };
|
enum { IDD = IDD_Debugger_TLB };
|
||||||
|
|
||||||
CDebugTlb(CDebugger * debugger);
|
CDebugTlb(CDebuggerUI * debugger);
|
||||||
virtual ~CDebugTlb(void);
|
virtual ~CDebugTlb(void);
|
||||||
|
|
||||||
void RefreshTLBWindow ( void );
|
void RefreshTLBWindow(void);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,18 +10,17 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#ifdef WINDOWS_UI
|
|
||||||
#include "Debugger UI.h"
|
#include "Debugger UI.h"
|
||||||
|
|
||||||
CDebugMemoryView::CDebugMemoryView(CDebugger * debugger) :
|
CDebugMemoryView::CDebugMemoryView(CDebuggerUI * debugger) :
|
||||||
CDebugDialog<CDebugMemoryView>(debugger),
|
CDebugDialog<CDebugMemoryView>(debugger),
|
||||||
m_MemoryList(NULL)
|
m_MemoryList(NULL)
|
||||||
{
|
{
|
||||||
if (m_MemoryList== NULL)
|
if (m_MemoryList== NULL)
|
||||||
{
|
{
|
||||||
m_MemoryList = new CListCtrl;
|
m_MemoryList = new CListCtrl;
|
||||||
m_MemoryList->RegisterClass();
|
m_MemoryList->RegisterClass();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CDebugMemoryView::~CDebugMemoryView()
|
CDebugMemoryView::~CDebugMemoryView()
|
||||||
|
@ -30,446 +29,444 @@ CDebugMemoryView::~CDebugMemoryView()
|
||||||
|
|
||||||
LRESULT CDebugMemoryView::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
LRESULT CDebugMemoryView::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
|
||||||
{
|
{
|
||||||
m_DataStartLoc = (DWORD)-1;
|
m_DataStartLoc = (DWORD)-1;
|
||||||
m_CompareStartLoc = (DWORD)-1;
|
m_CompareStartLoc = (DWORD)-1;
|
||||||
memset(m_CompareData,0,sizeof(m_CompareData));
|
memset(m_CompareData, 0, sizeof(m_CompareData));
|
||||||
memset(m_CompareValid,0,sizeof(m_CompareValid));
|
memset(m_CompareValid, 0, sizeof(m_CompareValid));
|
||||||
|
|
||||||
HWND hScrlBar = GetDlgItem(IDC_SCRL_BAR);
|
HWND hScrlBar = GetDlgItem(IDC_SCRL_BAR);
|
||||||
if (hScrlBar)
|
if (hScrlBar)
|
||||||
{
|
{
|
||||||
SCROLLINFO si;
|
SCROLLINFO si;
|
||||||
|
|
||||||
si.cbSize = sizeof(si);
|
si.cbSize = sizeof(si);
|
||||||
si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
|
si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
|
||||||
si.nMin = 0;
|
si.nMin = 0;
|
||||||
si.nMax = 0xFFFF;
|
si.nMax = 0xFFFF;
|
||||||
si.nPos = 0x8000;
|
si.nPos = 0x8000;
|
||||||
si.nPage = 100;
|
si.nPage = 100;
|
||||||
::SetScrollInfo(hScrlBar,SB_CTL,&si,TRUE);
|
::SetScrollInfo(hScrlBar, SB_CTL, &si, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_MemAddr.Attach(GetDlgItem(IDC_ADDR_EDIT));
|
m_MemAddr.Attach(GetDlgItem(IDC_ADDR_EDIT));
|
||||||
m_MemAddr.SetDisplayType(CEditNumber::DisplayHex);
|
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 = new CListCtrl;
|
||||||
m_MemoryList->RegisterClass();
|
m_MemoryList->RegisterClass();
|
||||||
}
|
}
|
||||||
m_MemoryList->SubclassWindow( GetDlgItem( IDC_MEM_DETAILS ) );
|
m_MemoryList->SubclassWindow(GetDlgItem(IDC_MEM_DETAILS));
|
||||||
m_MemoryList->ShowHeader(false);
|
m_MemoryList->ShowHeader(false);
|
||||||
m_MemoryList->SetSortEnabled(FALSE);
|
m_MemoryList->SetSortEnabled(FALSE);
|
||||||
m_MemoryList->AddColumn( _T( "Address" ), 90 );
|
m_MemoryList->AddColumn(_T("Address"), 90);
|
||||||
m_MemoryList->AddColumn( _T( "1" ), 20 );
|
m_MemoryList->AddColumn(_T("1"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "2" ), 20 );
|
m_MemoryList->AddColumn(_T("2"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "3" ), 20 );
|
m_MemoryList->AddColumn(_T("3"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "4" ), 20 );
|
m_MemoryList->AddColumn(_T("4"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "-" ), 10 );
|
m_MemoryList->AddColumn(_T("-"), 10);
|
||||||
m_MemoryList->AddColumn( _T( "5" ), 20 );
|
m_MemoryList->AddColumn(_T("5"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "6" ), 20 );
|
m_MemoryList->AddColumn(_T("6"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "7" ), 20 );
|
m_MemoryList->AddColumn(_T("7"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "8" ), 20 );
|
m_MemoryList->AddColumn(_T("8"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "-" ), 10 );
|
m_MemoryList->AddColumn(_T("-"), 10);
|
||||||
m_MemoryList->AddColumn( _T( "9" ), 20 );
|
m_MemoryList->AddColumn(_T("9"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "10" ), 20 );
|
m_MemoryList->AddColumn(_T("10"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "11" ), 20 );
|
m_MemoryList->AddColumn(_T("11"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "12" ), 20 );
|
m_MemoryList->AddColumn(_T("12"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "-" ), 10 );
|
m_MemoryList->AddColumn(_T("-"), 10);
|
||||||
m_MemoryList->AddColumn( _T( "13" ), 20 );
|
m_MemoryList->AddColumn(_T("13"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "14" ), 20 );
|
m_MemoryList->AddColumn(_T("14"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "15" ), 20 );
|
m_MemoryList->AddColumn(_T("15"), 20);
|
||||||
m_MemoryList->AddColumn( _T( "16" ), 35 );
|
m_MemoryList->AddColumn(_T("16"), 35);
|
||||||
m_MemoryList->AddColumn( _T( "Memory Ascii" ), 140 );
|
m_MemoryList->AddColumn(_T("Memory Ascii"), 140);
|
||||||
::SetWindowLongPtr(m_MemoryList->m_hWnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE);
|
::SetWindowLongPtr(m_MemoryList->m_hWnd, GWL_EXSTYLE, WS_EX_CLIENTEDGE);
|
||||||
RefreshMemory(false);
|
RefreshMemory(false);
|
||||||
int height = m_MemoryList->GetTotalHeight();
|
int height = m_MemoryList->GetTotalHeight();
|
||||||
|
|
||||||
RECT MemoryListRect = {0};
|
|
||||||
::GetClientRect(GetDlgItem( IDC_MEM_DETAILS ), &MemoryListRect);
|
|
||||||
|
|
||||||
if (height > MemoryListRect.bottom)
|
RECT MemoryListRect = { 0 };
|
||||||
{
|
::GetClientRect(GetDlgItem(IDC_MEM_DETAILS), &MemoryListRect);
|
||||||
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);
|
|
||||||
|
|
||||||
RECT DlgItemRect = {0};
|
if (height > MemoryListRect.bottom)
|
||||||
::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 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);
|
||||||
|
|
||||||
::GetWindowRect(GetDlgItem( IDC_MEM_DETAILS ), &DlgItemRect);
|
RECT DlgItemRect = { 0 };
|
||||||
::SetWindowPos(GetDlgItem( IDC_MEM_DETAILS ), NULL,0,0,DlgItemRect.right - DlgItemRect.left,(DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
|
::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_SCRL_BAR ), &DlgItemRect);
|
::GetWindowRect(GetDlgItem(IDC_MEM_DETAILS), &DlgItemRect);
|
||||||
::SetWindowPos(GetDlgItem( IDC_SCRL_BAR ), NULL,0,0,DlgItemRect.right - DlgItemRect.left,(DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
|
::SetWindowPos(GetDlgItem(IDC_MEM_DETAILS), NULL, 0, 0, DlgItemRect.right - DlgItemRect.left, (DlgItemRect.bottom - DlgItemRect.top) + (height - MemoryListRect.bottom), SWP_NOMOVE);
|
||||||
}
|
|
||||||
WindowCreated();
|
::GetWindowRect(GetDlgItem(IDC_SCRL_BAR), &DlgItemRect);
|
||||||
return TRUE;
|
::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)
|
if (m_MemoryList)
|
||||||
{
|
{
|
||||||
m_MemoryList->UnsubclassWindow();
|
m_MemoryList->UnsubclassWindow();
|
||||||
delete m_MemoryList;
|
delete m_MemoryList;
|
||||||
m_MemoryList = NULL;
|
m_MemoryList = NULL;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT CDebugMemoryView::OnClicked (WORD /*wNotifyCode*/, WORD wID, HWND , BOOL& /*bHandled*/)
|
LRESULT CDebugMemoryView::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND, BOOL& /*bHandled*/)
|
||||||
{
|
{
|
||||||
switch (wID)
|
switch (wID)
|
||||||
{
|
{
|
||||||
case IDC_REFRSH_MEM:
|
case IDC_REFRSH_MEM:
|
||||||
RefreshMemory(true);
|
RefreshMemory(true);
|
||||||
break;
|
break;
|
||||||
case IDC_CHK_VADDR:
|
case IDC_CHK_VADDR:
|
||||||
RefreshMemory(false);
|
RefreshMemory(false);
|
||||||
break;
|
break;
|
||||||
case IDC_DUMP_MEM:
|
case IDC_DUMP_MEM:
|
||||||
m_Debugger->Debug_ShowMemoryDump();
|
m_Debugger->Debug_ShowMemoryDump();
|
||||||
break;
|
break;
|
||||||
case IDC_SEARCH_MEM:
|
case IDC_SEARCH_MEM:
|
||||||
m_Debugger->Debug_ShowMemorySearch();
|
m_Debugger->Debug_ShowMemorySearch();
|
||||||
break;
|
break;
|
||||||
case IDCANCEL:
|
case IDCANCEL:
|
||||||
EndDialog(0);
|
EndDialog(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return FALSE;
|
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 LineNumber = pListNotify->m_nItem;
|
||||||
int Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 1));
|
int Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 1));
|
||||||
if (pListNotify->m_nSubItem >= 6 && pListNotify->m_nSubItem < 10)
|
if (pListNotify->m_nSubItem >= 6 && pListNotify->m_nSubItem < 10)
|
||||||
{
|
{
|
||||||
Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 2));
|
Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 2));
|
||||||
}
|
}
|
||||||
if (pListNotify->m_nSubItem >= 11 && pListNotify->m_nSubItem < 15)
|
if (pListNotify->m_nSubItem >= 11 && pListNotify->m_nSubItem < 15)
|
||||||
{
|
{
|
||||||
Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 3));
|
Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 3));
|
||||||
}
|
}
|
||||||
if (pListNotify->m_nSubItem >= 16 && pListNotify->m_nSubItem < 20)
|
if (pListNotify->m_nSubItem >= 16 && pListNotify->m_nSubItem < 20)
|
||||||
{
|
{
|
||||||
Pos = ((LineNumber << 4) + (pListNotify->m_nSubItem - 4));
|
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);
|
int Finish = strlen(strValue);
|
||||||
if (Finish > 8)
|
if (Finish > 8)
|
||||||
{
|
{
|
||||||
Finish = 8;
|
Finish = 8;
|
||||||
}
|
}
|
||||||
DWORD Value = 0;
|
DWORD Value = 0;
|
||||||
for (int i = 0; i < Finish; i++)
|
for (int i = 0; i < Finish; i++)
|
||||||
{
|
{
|
||||||
Value = (Value << 4);
|
Value = (Value << 4);
|
||||||
if (strValue[i] <= '9' && strValue[i] >= '0')
|
if (strValue[i] <= '9' && strValue[i] >= '0')
|
||||||
{
|
{
|
||||||
Value |= strValue[i] - '0';
|
Value |= strValue[i] - '0';
|
||||||
}
|
}
|
||||||
else if (strValue[i] <= 'f' && strValue[i] >= 'a')
|
else if (strValue[i] <= 'f' && strValue[i] >= 'a')
|
||||||
{
|
{
|
||||||
Value |= strValue[i] - 'a' + 10;
|
Value |= strValue[i] - 'a' + 10;
|
||||||
}
|
}
|
||||||
else if (strValue[i] <= 'F' && strValue[i] >= 'A')
|
else if (strValue[i] <= 'F' && strValue[i] >= 'A')
|
||||||
{
|
{
|
||||||
Value |= strValue[i] - 'A' + 10;
|
Value |= strValue[i] - 'A' + 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_CurrentData[Pos] == Value)
|
if (m_CurrentData[Pos] == Value)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_CompareStartLoc != m_DataStartLoc ||
|
if (m_CompareStartLoc != m_DataStartLoc ||
|
||||||
m_CompareVAddrr != m_DataVAddrr)
|
m_CompareVAddrr != m_DataVAddrr)
|
||||||
{
|
{
|
||||||
// copy current data for change comparison
|
// copy current data for change comparison
|
||||||
m_CompareStartLoc = m_DataStartLoc;
|
m_CompareStartLoc = m_DataStartLoc;
|
||||||
m_CompareVAddrr = m_DataVAddrr;
|
m_CompareVAddrr = m_DataVAddrr;
|
||||||
memcpy(m_CompareData,m_CurrentData,sizeof(m_CurrentData));
|
memcpy(m_CompareData, m_CurrentData, sizeof(m_CurrentData));
|
||||||
memcpy(m_CompareValid,m_DataValid,sizeof(m_CompareValid));
|
memcpy(m_CompareValid, m_DataValid, sizeof(m_CompareValid));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_CompareData[Pos] = m_CurrentData[Pos];
|
m_CompareData[Pos] = m_CurrentData[Pos];
|
||||||
m_CurrentData[Pos] = (BYTE)Value;
|
m_CurrentData[Pos] = (BYTE)Value;
|
||||||
|
|
||||||
//sb
|
//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
|
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);
|
Insert_MemoryLineDump(LineNumber);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugMemoryView::ShowAddress(DWORD Address, bool VAddr)
|
void CDebugMemoryView::ShowAddress(DWORD Address, bool VAddr)
|
||||||
{
|
{
|
||||||
if (m_hWnd == NULL)
|
if (m_hWnd == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SendDlgItemMessage( IDC_CHK_VADDR, BM_SETCHECK, VAddr ? BST_CHECKED : BST_UNCHECKED,0);
|
SendDlgItemMessage(IDC_CHK_VADDR, BM_SETCHECK, VAddr ? BST_CHECKED : BST_UNCHECKED, 0);
|
||||||
m_MemAddr.SetValue(Address,true,true);
|
m_MemAddr.SetValue(Address, true, true);
|
||||||
RefreshMemory (true);
|
RefreshMemory(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugMemoryView::Insert_MemoryLineDump ( int LineNumber )
|
void CDebugMemoryView::Insert_MemoryLineDump(int LineNumber)
|
||||||
{
|
{
|
||||||
if (m_MemoryList == NULL || m_MemoryList->GetColumnCount() == 0)
|
if (m_MemoryList == NULL || m_MemoryList->GetColumnCount() == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char Output[20], Hex[60], Ascii[20], AsciiAddOn[15];
|
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)
|
if (m_MemoryList->GetItemCount() <= LineNumber)
|
||||||
{
|
{
|
||||||
HFONT hFont = (HFONT)GetStockObject(ANSI_FIXED_FONT);
|
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++)
|
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)
|
if (i == 5 || i == 10 || i == 15)
|
||||||
{
|
{
|
||||||
m_MemoryList->SetItemText(LineNumber,i,"-");
|
m_MemoryList->SetItemText(LineNumber, i, "-");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Hex[0] = 0;
|
Hex[0] = 0;
|
||||||
Ascii[0] = 0;
|
Ascii[0] = 0;
|
||||||
int CompareStartPos = m_DataStartLoc - m_CompareStartLoc;
|
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);
|
int Pos = ((LineNumber << 4) + i);
|
||||||
if (m_DataValid[Pos])
|
if (m_DataValid[Pos])
|
||||||
{
|
{
|
||||||
int ComparePos = CompareStartPos + Pos;
|
int ComparePos = CompareStartPos + Pos;
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
if (ComparePos >= 0 && ComparePos < MemoryToDisplay &&
|
if (ComparePos >= 0 && ComparePos < MemoryToDisplay &&
|
||||||
m_DataVAddrr == m_CompareVAddrr &&
|
m_DataVAddrr == m_CompareVAddrr &&
|
||||||
m_DataValid[ComparePos] &&
|
m_DataValid[ComparePos] &&
|
||||||
m_CurrentData[Pos] != m_CompareData[ComparePos])
|
m_CurrentData[Pos] != m_CompareData[ComparePos])
|
||||||
{
|
{
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
sprintf(Hex,"%02X",m_CurrentData[Pos]);
|
sprintf(Hex, "%02X", m_CurrentData[Pos]);
|
||||||
m_MemoryList->SetItemText(LineNumber,col,Hex);
|
m_MemoryList->SetItemText(LineNumber, col, Hex);
|
||||||
m_MemoryList->SetItemFormat( LineNumber,col, ITEM_FORMAT_EDIT, ITEM_FLAGS_EDIT_HEX );
|
m_MemoryList->SetItemFormat(LineNumber, col, ITEM_FORMAT_EDIT, ITEM_FLAGS_EDIT_HEX);
|
||||||
m_MemoryList->SetItemMaxEditLen( LineNumber,col , 2);
|
m_MemoryList->SetItemMaxEditLen(LineNumber, col, 2);
|
||||||
m_MemoryList->SetItemColours( LineNumber, col, GetSysColor( COLOR_WINDOW ),
|
m_MemoryList->SetItemColours(LineNumber, col, GetSysColor(COLOR_WINDOW),
|
||||||
Changed ? RGB( 255, 0, 0 ) : GetSysColor( COLOR_WINDOWTEXT ) );
|
Changed ? RGB(255, 0, 0) : GetSysColor(COLOR_WINDOWTEXT));
|
||||||
m_MemoryList->SetItemHighlightColours( LineNumber, col,
|
m_MemoryList->SetItemHighlightColours(LineNumber, col,
|
||||||
Changed ? RGB( 255, 0, 0 ) : GetSysColor( COLOR_HIGHLIGHTTEXT ) );
|
Changed ? RGB(255, 0, 0) : GetSysColor(COLOR_HIGHLIGHTTEXT));
|
||||||
if (m_CurrentData[Pos] < 30)
|
if (m_CurrentData[Pos] < 30)
|
||||||
{
|
{
|
||||||
strcat(Ascii,".");
|
strcat(Ascii, ".");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sprintf(AsciiAddOn,"%c",m_CurrentData[Pos]);
|
sprintf(AsciiAddOn, "%c", m_CurrentData[Pos]);
|
||||||
strcat(Ascii,AsciiAddOn);
|
strcat(Ascii, AsciiAddOn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_MemoryList->SetItemText(LineNumber,col,"**");
|
m_MemoryList->SetItemText(LineNumber, col, "**");
|
||||||
m_MemoryList->SetItemFormat( LineNumber,col, ITEM_FORMAT_NONE, ITEM_FLAGS_NONE );
|
m_MemoryList->SetItemFormat(LineNumber, col, ITEM_FORMAT_NONE, ITEM_FLAGS_NONE);
|
||||||
m_MemoryList->SetItemColours( LineNumber, col, GetSysColor( COLOR_WINDOW ), GetSysColor( COLOR_WINDOWTEXT ) );
|
m_MemoryList->SetItemColours(LineNumber, col, GetSysColor(COLOR_WINDOW), GetSysColor(COLOR_WINDOWTEXT));
|
||||||
strcat(Ascii,"*");
|
strcat(Ascii, "*");
|
||||||
}
|
}
|
||||||
if (i != 0xF)
|
if (i != 0xF)
|
||||||
{
|
{
|
||||||
if ((i & 3) == 3)
|
if ((i & 3) == 3)
|
||||||
{
|
{
|
||||||
col += 1;
|
col += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
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))
|
if (ctrl != GetDlgItem(IDC_SCRL_BAR))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DWORD Location = m_MemAddr.GetValue();
|
DWORD Location = m_MemAddr.GetValue();
|
||||||
switch (request)
|
switch (request)
|
||||||
{
|
{
|
||||||
case SB_LINEDOWN:
|
case SB_LINEDOWN:
|
||||||
m_MemAddr.SetValue(Location < 0xFFFFFFEF ? Location + 0x10 : 0xFFFFFFFF,true,true);
|
m_MemAddr.SetValue(Location < 0xFFFFFFEF ? Location + 0x10 : 0xFFFFFFFF, true, true);
|
||||||
break;
|
break;
|
||||||
case SB_LINEUP:
|
case SB_LINEUP:
|
||||||
m_MemAddr.SetValue(Location > 0x10 ? Location - 0x10 : 0,true,true);
|
m_MemAddr.SetValue(Location > 0x10 ? Location - 0x10 : 0, true, true);
|
||||||
break;
|
break;
|
||||||
case SB_PAGEDOWN:
|
case SB_PAGEDOWN:
|
||||||
m_MemAddr.SetValue(Location < 0xFFFFFEFF ? Location + 0x100 : 0xFFFFFFFF,true,true);
|
m_MemAddr.SetValue(Location < 0xFFFFFEFF ? Location + 0x100 : 0xFFFFFFFF, true, true);
|
||||||
break;
|
break;
|
||||||
case SB_PAGEUP:
|
case SB_PAGEUP:
|
||||||
m_MemAddr.SetValue(Location > 0x100 ? Location - 0x100 : 0,true,true);
|
m_MemAddr.SetValue(Location > 0x100 ? Location - 0x100 : 0, true, true);
|
||||||
break;
|
break;
|
||||||
case SB_THUMBPOSITION:
|
case SB_THUMBPOSITION:
|
||||||
m_MemAddr.SetValue((DWORD)Pos << 0x10,true,true);
|
m_MemAddr.SetValue((DWORD)Pos << 0x10, true, true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugMemoryView::RefreshMemory ( bool ResetCompare )
|
void CDebugMemoryView::RefreshMemory(bool ResetCompare)
|
||||||
{
|
{
|
||||||
if (m_MemoryList && m_MemoryList->GetHasEditItem())
|
if (m_MemoryList && m_MemoryList->GetHasEditItem())
|
||||||
{
|
{
|
||||||
m_MemoryList->SetFocus();
|
m_MemoryList->SetFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD NewAddress = m_MemAddr.GetValue();
|
DWORD NewAddress = m_MemAddr.GetValue();
|
||||||
if (NewAddress != m_DataStartLoc)
|
if (NewAddress != m_DataStartLoc)
|
||||||
{
|
{
|
||||||
HWND hScrlBar = GetDlgItem(IDC_SCRL_BAR);
|
HWND hScrlBar = GetDlgItem(IDC_SCRL_BAR);
|
||||||
if (hScrlBar)
|
if (hScrlBar)
|
||||||
{
|
{
|
||||||
SCROLLINFO si;
|
SCROLLINFO si;
|
||||||
|
|
||||||
si.cbSize = sizeof(si);
|
si.cbSize = sizeof(si);
|
||||||
si.fMask = SIF_POS;
|
si.fMask = SIF_POS;
|
||||||
si.nPos = NewAddress >> 0x10;
|
si.nPos = NewAddress >> 0x10;
|
||||||
::SetScrollInfo(hScrlBar,SB_CTL,&si,TRUE);
|
::SetScrollInfo(hScrlBar, SB_CTL, &si, TRUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ResetCompare)
|
if (ResetCompare)
|
||||||
{
|
{
|
||||||
// copy current data for change comparison
|
// copy current data for change comparison
|
||||||
m_CompareStartLoc = m_DataStartLoc;
|
m_CompareStartLoc = m_DataStartLoc;
|
||||||
m_CompareVAddrr = m_DataVAddrr;
|
m_CompareVAddrr = m_DataVAddrr;
|
||||||
memcpy(m_CompareData,m_CurrentData,sizeof(m_CurrentData));
|
memcpy(m_CompareData, m_CurrentData, sizeof(m_CurrentData));
|
||||||
memcpy(m_CompareValid,m_DataValid,sizeof(m_CompareValid));
|
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_DataStartLoc = m_MemAddr.GetValue();
|
||||||
|
if (m_DataStartLoc > 0xFFFFFF00) { m_DataStartLoc = 0xFFFFFF00; }
|
||||||
|
int WritePos = 0;
|
||||||
|
|
||||||
if ((m_DataStartLoc & 3) != 0)
|
m_DataVAddrr = (SendDlgItemMessage(IDC_CHK_VADDR, BM_GETCHECK, 0, 0) & BST_CHECKED) != 0;
|
||||||
{
|
|
||||||
MIPS_WORD word;
|
|
||||||
bool ValidData = true;
|
|
||||||
|
|
||||||
if ( m_DataVAddrr )
|
|
||||||
{
|
|
||||||
if (!g_MMU->LW_VAddr(m_DataStartLoc & ~3, word.UW))
|
|
||||||
{
|
|
||||||
ValidData = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!g_MMU->LW_PAddr(m_DataStartLoc & ~3, word.UW))
|
|
||||||
{
|
|
||||||
ValidData = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int Offset = (m_DataStartLoc & 3);
|
if ((m_DataStartLoc & 3) != 0)
|
||||||
for (int i = 0; i < (4 - Offset); i++)
|
{
|
||||||
{
|
MIPS_WORD word;
|
||||||
if (WritePos >= MemoryToDisplay)
|
bool ValidData = true;
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
m_DataValid[WritePos + i] = ValidData;
|
|
||||||
if (ValidData)
|
|
||||||
{
|
|
||||||
m_CurrentData[WritePos + i] = word.UB[3 - (i + Offset)];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
WritePos = 4 - Offset;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
for (DWORD Pos = ((m_DataStartLoc + 3) & ~3); Pos < (m_DataStartLoc + MemoryToDisplay); WritePos += 4, Pos += 4)
|
if (m_DataVAddrr)
|
||||||
{
|
{
|
||||||
MIPS_WORD word;
|
if (!g_MMU->LW_VAddr(m_DataStartLoc & ~3, word.UW))
|
||||||
bool ValidData = true;
|
{
|
||||||
|
ValidData = false;
|
||||||
if ( m_DataVAddrr )
|
}
|
||||||
{
|
}
|
||||||
if (!g_MMU->LW_VAddr(Pos, word.UW))
|
else
|
||||||
{
|
{
|
||||||
ValidData = false;
|
if (!g_MMU->LW_PAddr(m_DataStartLoc & ~3, word.UW))
|
||||||
}
|
{
|
||||||
}
|
ValidData = false;
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
if (!g_MMU->LW_PAddr(Pos, word.UW))
|
|
||||||
{
|
|
||||||
ValidData = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
int Offset = (m_DataStartLoc & 3);
|
||||||
{
|
for (int i = 0; i < (4 - Offset); i++)
|
||||||
if ((WritePos + i)>= MemoryToDisplay)
|
{
|
||||||
{
|
if (WritePos >= MemoryToDisplay)
|
||||||
break;
|
{
|
||||||
}
|
break;
|
||||||
m_DataValid[WritePos + i] = ValidData;
|
}
|
||||||
if (ValidData)
|
m_DataValid[WritePos + i] = ValidData;
|
||||||
{
|
if (ValidData)
|
||||||
m_CurrentData[WritePos + i] = word.UB[3 - i];
|
{
|
||||||
}
|
m_CurrentData[WritePos + i] = word.UB[3 - (i + Offset)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
WritePos = 4 - Offset;
|
||||||
|
}
|
||||||
|
|
||||||
for (int count = 0 ; count < 16;count ++)
|
for (DWORD Pos = ((m_DataStartLoc + 3) & ~3); Pos < (m_DataStartLoc + MemoryToDisplay); WritePos += 4, Pos += 4)
|
||||||
{
|
{
|
||||||
Insert_MemoryLineDump ( count );
|
MIPS_WORD word;
|
||||||
}
|
bool ValidData = true;
|
||||||
|
|
||||||
|
if (m_DataVAddrr)
|
||||||
|
{
|
||||||
|
if (!g_MMU->LW_VAddr(Pos, word.UW))
|
||||||
|
{
|
||||||
|
ValidData = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!g_MMU->LW_PAddr(Pos, word.UW))
|
||||||
|
{
|
||||||
|
ValidData = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if ((WritePos + i) >= MemoryToDisplay)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_DataValid[WritePos + i] = ValidData;
|
||||||
|
if (ValidData)
|
||||||
|
{
|
||||||
|
m_CurrentData[WritePos + i] = word.UB[3 - i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int count = 0; count < 16; count++)
|
||||||
|
{
|
||||||
|
Insert_MemoryLineDump(count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,48 +11,48 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CDebugMemoryView :
|
class CDebugMemoryView :
|
||||||
public CDebugDialog<CDebugMemoryView>
|
public CDebugDialog < CDebugMemoryView >
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
enum { IDD = IDD_Debugger_Memory };
|
||||||
|
|
||||||
BEGIN_MSG_MAP_EX(CDebugMemoryView)
|
CDebugMemoryView(CDebuggerUI * debugger);
|
||||||
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
virtual ~CDebugMemoryView(void);
|
||||||
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)
|
|
||||||
END_MSG_MAP()
|
|
||||||
|
|
||||||
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
void ShowAddress(DWORD Address, bool VAddr);
|
||||||
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 Insert_MemoryLineDump ( int LineNumber );
|
private:
|
||||||
void RefreshMemory ( bool ResetCompare );
|
BEGIN_MSG_MAP_EX(CDebugMemoryView)
|
||||||
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
||||||
enum { MemoryToDisplay = 0x100};
|
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)
|
||||||
|
END_MSG_MAP()
|
||||||
|
|
||||||
CEditNumber m_MemAddr;
|
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
|
||||||
CListCtrl * m_MemoryList;
|
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);
|
||||||
|
|
||||||
DWORD m_DataStartLoc;
|
void Insert_MemoryLineDump(int LineNumber);
|
||||||
bool m_DataVAddrr;
|
void RefreshMemory(bool ResetCompare);
|
||||||
BYTE m_CurrentData[MemoryToDisplay];
|
|
||||||
bool m_DataValid[MemoryToDisplay];
|
|
||||||
|
|
||||||
DWORD m_CompareStartLoc;
|
enum { MemoryToDisplay = 0x100 };
|
||||||
bool m_CompareVAddrr;
|
|
||||||
BYTE m_CompareData[MemoryToDisplay];
|
|
||||||
bool m_CompareValid[MemoryToDisplay];
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum { IDD = IDD_Debugger_Memory };
|
|
||||||
|
|
||||||
CDebugMemoryView(CDebugger * debugger);
|
CEditNumber m_MemAddr;
|
||||||
virtual ~CDebugMemoryView(void);
|
CListCtrl * m_MemoryList;
|
||||||
|
|
||||||
void ShowAddress (DWORD Address, bool VAddr);
|
DWORD m_DataStartLoc;
|
||||||
|
bool m_DataVAddrr;
|
||||||
|
BYTE m_CurrentData[MemoryToDisplay];
|
||||||
|
bool m_DataValid[MemoryToDisplay];
|
||||||
|
|
||||||
|
DWORD m_CompareStartLoc;
|
||||||
|
bool m_CompareVAddrr;
|
||||||
|
BYTE m_CompareData[MemoryToDisplay];
|
||||||
|
bool m_CompareValid[MemoryToDisplay];
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,41 +1,4 @@
|
||||||
////#define _WIN32_WINNT 0x0500
|
#pragma once
|
||||||
|
|
||||||
//#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"
|
|
||||||
|
|
||||||
#include "../../WTL App.h"
|
#include "../../WTL App.h"
|
||||||
#include "../../N64 System.h"
|
#include "../../N64 System.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,127 +9,141 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
#ifdef WINDOWS_UI
|
|
||||||
#include "Debugger UI.h"
|
#include "Debugger UI.h"
|
||||||
|
|
||||||
CPj64Module _Module;
|
CPj64Module _Module;
|
||||||
|
|
||||||
CDebugger::CDebugger () :
|
CDebuggerUI::CDebuggerUI () :
|
||||||
m_MemoryDump(NULL),
|
m_MemoryDump(NULL),
|
||||||
m_MemoryView(NULL),
|
m_MemoryView(NULL),
|
||||||
m_MemorySearch(NULL),
|
m_MemorySearch(NULL),
|
||||||
m_DebugTLB(NULL)
|
m_DebugTLB(NULL)
|
||||||
{
|
{
|
||||||
|
g_Settings->RegisterChangeCB(GameRunning_InReset,this,(CSettings::SettingChangedFunc)GameReset);
|
||||||
|
g_Debugger = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
CDebugger::~CDebugger (void)
|
CDebuggerUI::~CDebuggerUI (void)
|
||||||
{
|
{
|
||||||
Debug_Reset();
|
g_Settings->UnregisterChangeCB(GameRunning_InReset,this,(CSettings::SettingChangedFunc)GameReset);
|
||||||
|
Debug_Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::Debug_Reset ( void )
|
void CDebuggerUI::GameReset ( CDebuggerUI * _this )
|
||||||
{
|
{
|
||||||
if (m_MemoryDump)
|
if (!g_Settings->LoadBool(GameRunning_InReset))
|
||||||
{
|
|
||||||
m_MemoryDump->HideWindow();
|
|
||||||
delete m_MemoryDump;
|
|
||||||
m_MemoryDump = NULL;
|
|
||||||
}
|
|
||||||
if (m_MemoryView)
|
|
||||||
{
|
|
||||||
m_MemoryView->HideWindow();
|
|
||||||
delete m_MemoryView;
|
|
||||||
m_MemoryView = NULL;
|
|
||||||
}
|
|
||||||
if (m_MemorySearch)
|
|
||||||
{
|
|
||||||
m_MemorySearch->HideWindow();
|
|
||||||
delete m_MemorySearch;
|
|
||||||
m_MemorySearch = NULL;
|
|
||||||
}
|
|
||||||
if (m_DebugTLB)
|
|
||||||
{
|
|
||||||
m_DebugTLB->HideWindow();
|
|
||||||
delete m_DebugTLB;
|
|
||||||
m_DebugTLB = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CDebugger::Debug_ShowMemoryDump()
|
|
||||||
{
|
|
||||||
if (g_MMU == NULL)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_MemoryDump == NULL)
|
_this->Debug_Reset();
|
||||||
{
|
|
||||||
m_MemoryDump = new CDumpMemory(this);
|
|
||||||
}
|
|
||||||
if (m_MemoryDump)
|
|
||||||
{
|
|
||||||
m_MemoryDump->ShowWindow();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::Debug_ShowMemoryWindow ( void )
|
void CDebuggerUI::Debug_Reset ( void )
|
||||||
{
|
{
|
||||||
if (g_MMU == NULL)
|
if (m_MemoryDump)
|
||||||
{
|
{
|
||||||
return;
|
m_MemoryDump->HideWindow();
|
||||||
}
|
delete m_MemoryDump;
|
||||||
if (m_MemoryView == NULL)
|
m_MemoryDump = NULL;
|
||||||
{
|
}
|
||||||
m_MemoryView = new CDebugMemoryView(this);
|
if (m_MemoryView)
|
||||||
}
|
{
|
||||||
if (m_MemoryView)
|
m_MemoryView->HideWindow();
|
||||||
{
|
delete m_MemoryView;
|
||||||
m_MemoryView->ShowWindow();
|
m_MemoryView = NULL;
|
||||||
}
|
}
|
||||||
|
if (m_MemorySearch)
|
||||||
|
{
|
||||||
|
m_MemorySearch->HideWindow();
|
||||||
|
delete m_MemorySearch;
|
||||||
|
m_MemorySearch = NULL;
|
||||||
|
}
|
||||||
|
if (m_DebugTLB)
|
||||||
|
{
|
||||||
|
m_DebugTLB->HideWindow();
|
||||||
|
delete m_DebugTLB;
|
||||||
|
m_DebugTLB = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::Debug_ShowMemoryLocation ( DWORD Address, bool VAddr )
|
void CDebuggerUI::Debug_ShowMemoryDump()
|
||||||
{
|
{
|
||||||
Debug_ShowMemoryWindow();
|
if (g_MMU == NULL)
|
||||||
if (m_MemoryView)
|
{
|
||||||
{
|
return;
|
||||||
m_MemoryView->ShowAddress(Address,VAddr);
|
}
|
||||||
}
|
if (m_MemoryDump == NULL)
|
||||||
|
{
|
||||||
|
m_MemoryDump = new CDumpMemory(this);
|
||||||
|
}
|
||||||
|
if (m_MemoryDump)
|
||||||
|
{
|
||||||
|
m_MemoryDump->ShowWindow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::Debug_ShowTLBWindow (void)
|
void CDebuggerUI::Debug_ShowMemoryWindow ( void )
|
||||||
{
|
{
|
||||||
if (g_MMU == NULL)
|
if (g_MMU == NULL)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_DebugTLB == NULL)
|
if (m_MemoryView == NULL)
|
||||||
{
|
{
|
||||||
m_DebugTLB = new CDebugTlb(this);
|
m_MemoryView = new CDebugMemoryView(this);
|
||||||
}
|
}
|
||||||
if (m_DebugTLB)
|
if (m_MemoryView)
|
||||||
{
|
{
|
||||||
m_DebugTLB->ShowWindow();
|
m_MemoryView->ShowWindow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::Debug_RefreshTLBWindow(void)
|
void CDebuggerUI::Debug_ShowMemoryLocation ( uint32_t Address, bool VAddr )
|
||||||
{
|
{
|
||||||
if (m_DebugTLB)
|
Debug_ShowMemoryWindow();
|
||||||
{
|
if (m_MemoryView)
|
||||||
m_DebugTLB->RefreshTLBWindow();
|
{
|
||||||
}
|
m_MemoryView->ShowAddress(Address,VAddr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDebugger::Debug_ShowMemorySearch()
|
void CDebuggerUI::Debug_ShowTLBWindow (void)
|
||||||
{
|
{
|
||||||
if (m_MemorySearch == NULL)
|
if (g_MMU == NULL)
|
||||||
{
|
{
|
||||||
m_MemorySearch = new CDebugMemorySearch(this);
|
return;
|
||||||
}
|
}
|
||||||
if (m_MemorySearch)
|
if (m_DebugTLB == NULL)
|
||||||
{
|
{
|
||||||
m_MemorySearch->ShowWindow();
|
m_DebugTLB = new CDebugTlb(this);
|
||||||
}
|
}
|
||||||
|
if (m_DebugTLB)
|
||||||
|
{
|
||||||
|
m_DebugTLB->ShowWindow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
void CDebuggerUI::Debug_RefreshTLBWindow(void)
|
||||||
|
{
|
||||||
|
if (m_DebugTLB)
|
||||||
|
{
|
||||||
|
m_DebugTLB->RefreshTLBWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDebuggerUI::Debug_ShowMemorySearch()
|
||||||
|
{
|
||||||
|
if (m_MemorySearch == NULL)
|
||||||
|
{
|
||||||
|
m_MemorySearch = new CDebugMemorySearch(this);
|
||||||
|
}
|
||||||
|
if (m_MemorySearch)
|
||||||
|
{
|
||||||
|
m_MemorySearch->ShowWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDebuggerUI::TLBChanged()
|
||||||
|
{
|
||||||
|
Debug_RefreshTLBWindow();
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -13,25 +13,35 @@
|
||||||
class CDumpMemory;
|
class CDumpMemory;
|
||||||
class CDebugMemoryView;
|
class CDebugMemoryView;
|
||||||
class CDebugMemorySearch;
|
class CDebugMemorySearch;
|
||||||
|
class CDebugTlb;
|
||||||
|
|
||||||
class CDebugger
|
__interface CDebugger
|
||||||
{
|
{
|
||||||
CDumpMemory * m_MemoryDump;
|
virtual void TLBChanged ( void ) = 0;
|
||||||
CDebugMemoryView * m_MemoryView;
|
};
|
||||||
CDebugMemorySearch * m_MemorySearch;
|
|
||||||
CDebugTlb * m_DebugTLB;
|
class CDebuggerUI :
|
||||||
|
public CDebugger
|
||||||
|
{
|
||||||
|
CDumpMemory * m_MemoryDump;
|
||||||
|
CDebugMemoryView * m_MemoryView;
|
||||||
|
CDebugMemorySearch * m_MemorySearch;
|
||||||
|
CDebugTlb * m_DebugTLB;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CDebugger();
|
CDebuggerUI();
|
||||||
virtual ~CDebugger();
|
virtual ~CDebuggerUI();
|
||||||
|
|
||||||
public:
|
void TLBChanged ( void );
|
||||||
|
|
||||||
void Debug_Reset ( void );
|
public:
|
||||||
void Debug_ShowMemoryDump ( void );
|
void Debug_Reset ( void );
|
||||||
void Debug_ShowMemoryWindow ( void );
|
void Debug_ShowMemoryDump ( void );
|
||||||
void Debug_ShowMemoryLocation ( DWORD Address, bool VAddr );
|
void Debug_ShowMemoryWindow ( void );
|
||||||
void Debug_ShowMemorySearch ( void );
|
void Debug_ShowMemoryLocation ( uint32_t Address, bool VAddr );
|
||||||
void Debug_ShowTLBWindow ( void );
|
void Debug_ShowMemorySearch ( void );
|
||||||
void Debug_RefreshTLBWindow ( void );
|
void Debug_ShowTLBWindow ( void );
|
||||||
|
void Debug_RefreshTLBWindow ( void );
|
||||||
|
|
||||||
|
static void GameReset ( CDebuggerUI * _this );
|
||||||
};
|
};
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -12,446 +12,445 @@
|
||||||
|
|
||||||
R4300iOp::Func * CInterpreterCPU::m_R4300i_Opcode = NULL;
|
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;
|
OPCODE Command;
|
||||||
|
|
||||||
if (!g_MMU->LW_VAddr(PC + 4, Command.Hex))
|
if (!g_MMU->LW_VAddr(PC + 4, Command.Hex))
|
||||||
{
|
{
|
||||||
//g_Notify->DisplayError(L"Failed to load word 2");
|
//g_Notify->DisplayError(L"Failed to load word 2");
|
||||||
//ExitThread(0);
|
//ExitThread(0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Command.op)
|
switch (Command.op)
|
||||||
{
|
{
|
||||||
case R4300i_SPECIAL:
|
case R4300i_SPECIAL:
|
||||||
switch (Command.funct)
|
switch (Command.funct)
|
||||||
{
|
{
|
||||||
case R4300i_SPECIAL_SLL:
|
case R4300i_SPECIAL_SLL:
|
||||||
case R4300i_SPECIAL_SRL:
|
case R4300i_SPECIAL_SRL:
|
||||||
case R4300i_SPECIAL_SRA:
|
case R4300i_SPECIAL_SRA:
|
||||||
case R4300i_SPECIAL_SLLV:
|
case R4300i_SPECIAL_SLLV:
|
||||||
case R4300i_SPECIAL_SRLV:
|
case R4300i_SPECIAL_SRLV:
|
||||||
case R4300i_SPECIAL_SRAV:
|
case R4300i_SPECIAL_SRAV:
|
||||||
case R4300i_SPECIAL_MFHI:
|
case R4300i_SPECIAL_MFHI:
|
||||||
case R4300i_SPECIAL_MTHI:
|
case R4300i_SPECIAL_MTHI:
|
||||||
case R4300i_SPECIAL_MFLO:
|
case R4300i_SPECIAL_MFLO:
|
||||||
case R4300i_SPECIAL_MTLO:
|
case R4300i_SPECIAL_MTLO:
|
||||||
case R4300i_SPECIAL_DSLLV:
|
case R4300i_SPECIAL_DSLLV:
|
||||||
case R4300i_SPECIAL_DSRLV:
|
case R4300i_SPECIAL_DSRLV:
|
||||||
case R4300i_SPECIAL_DSRAV:
|
case R4300i_SPECIAL_DSRAV:
|
||||||
case R4300i_SPECIAL_ADD:
|
case R4300i_SPECIAL_ADD:
|
||||||
case R4300i_SPECIAL_ADDU:
|
case R4300i_SPECIAL_ADDU:
|
||||||
case R4300i_SPECIAL_SUB:
|
case R4300i_SPECIAL_SUB:
|
||||||
case R4300i_SPECIAL_SUBU:
|
case R4300i_SPECIAL_SUBU:
|
||||||
case R4300i_SPECIAL_AND:
|
case R4300i_SPECIAL_AND:
|
||||||
case R4300i_SPECIAL_OR:
|
case R4300i_SPECIAL_OR:
|
||||||
case R4300i_SPECIAL_XOR:
|
case R4300i_SPECIAL_XOR:
|
||||||
case R4300i_SPECIAL_NOR:
|
case R4300i_SPECIAL_NOR:
|
||||||
case R4300i_SPECIAL_SLT:
|
case R4300i_SPECIAL_SLT:
|
||||||
case R4300i_SPECIAL_SLTU:
|
case R4300i_SPECIAL_SLTU:
|
||||||
case R4300i_SPECIAL_DADD:
|
case R4300i_SPECIAL_DADD:
|
||||||
case R4300i_SPECIAL_DADDU:
|
case R4300i_SPECIAL_DADDU:
|
||||||
case R4300i_SPECIAL_DSUB:
|
case R4300i_SPECIAL_DSUB:
|
||||||
case R4300i_SPECIAL_DSUBU:
|
case R4300i_SPECIAL_DSUBU:
|
||||||
case R4300i_SPECIAL_DSLL:
|
case R4300i_SPECIAL_DSLL:
|
||||||
case R4300i_SPECIAL_DSRL:
|
case R4300i_SPECIAL_DSRL:
|
||||||
case R4300i_SPECIAL_DSRA:
|
case R4300i_SPECIAL_DSRA:
|
||||||
case R4300i_SPECIAL_DSLL32:
|
case R4300i_SPECIAL_DSLL32:
|
||||||
case R4300i_SPECIAL_DSRL32:
|
case R4300i_SPECIAL_DSRL32:
|
||||||
case R4300i_SPECIAL_DSRA32:
|
case R4300i_SPECIAL_DSRA32:
|
||||||
if (Command.rd == 0)
|
if (Command.rd == 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (Command.rd == Reg1 || Command.rd == Reg2)
|
if (Command.rd == Reg1 || Command.rd == Reg2)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_SPECIAL_MULT:
|
case R4300i_SPECIAL_MULT:
|
||||||
case R4300i_SPECIAL_MULTU:
|
case R4300i_SPECIAL_MULTU:
|
||||||
case R4300i_SPECIAL_DIV:
|
case R4300i_SPECIAL_DIV:
|
||||||
case R4300i_SPECIAL_DIVU:
|
case R4300i_SPECIAL_DIVU:
|
||||||
case R4300i_SPECIAL_DMULT:
|
case R4300i_SPECIAL_DMULT:
|
||||||
case R4300i_SPECIAL_DMULTU:
|
case R4300i_SPECIAL_DMULTU:
|
||||||
case R4300i_SPECIAL_DDIV:
|
case R4300i_SPECIAL_DDIV:
|
||||||
case R4300i_SPECIAL_DDIVU:
|
case R4300i_SPECIAL_DDIVU:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (g_Settings->LoadBool(Debugger_Enabled))
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_CP0:
|
case R4300i_CP0:
|
||||||
switch (Command.rs)
|
switch (Command.rs)
|
||||||
{
|
{
|
||||||
case R4300i_COP0_MT: break;
|
case R4300i_COP0_MT: break;
|
||||||
case R4300i_COP0_MF:
|
case R4300i_COP0_MF:
|
||||||
if (Command.rt == 0)
|
if (Command.rt == 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (Command.rt == Reg1 || Command.rt == Reg2)
|
if (Command.rt == Reg1 || Command.rt == Reg2)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if ( (Command.rs & 0x10 ) != 0 )
|
if ((Command.rs & 0x10) != 0)
|
||||||
{
|
{
|
||||||
switch (Command.funct)
|
switch (Command.funct)
|
||||||
{
|
{
|
||||||
case R4300i_COP0_CO_TLBR: break;
|
case R4300i_COP0_CO_TLBR: break;
|
||||||
case R4300i_COP0_CO_TLBWI: break;
|
case R4300i_COP0_CO_TLBWI: break;
|
||||||
case R4300i_COP0_CO_TLBWR: break;
|
case R4300i_COP0_CO_TLBWR: break;
|
||||||
case R4300i_COP0_CO_TLBP: break;
|
case R4300i_COP0_CO_TLBP: break;
|
||||||
default:
|
default:
|
||||||
if (g_Settings->LoadBool(Debugger_Enabled))
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (g_Settings->LoadBool(Debugger_Enabled))
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_CP1:
|
case R4300i_CP1:
|
||||||
switch (Command.fmt)
|
switch (Command.fmt)
|
||||||
{
|
{
|
||||||
case R4300i_COP1_MF:
|
case R4300i_COP1_MF:
|
||||||
if (Command.rt == 0)
|
if (Command.rt == 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (Command.rt == Reg1 || Command.rt == Reg2)
|
if (Command.rt == Reg1 || Command.rt == Reg2)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_COP1_CF: break;
|
case R4300i_COP1_CF: break;
|
||||||
case R4300i_COP1_MT: break;
|
case R4300i_COP1_MT: break;
|
||||||
case R4300i_COP1_CT: break;
|
case R4300i_COP1_CT: break;
|
||||||
case R4300i_COP1_S: break;
|
case R4300i_COP1_S: break;
|
||||||
case R4300i_COP1_D: break;
|
case R4300i_COP1_D: break;
|
||||||
case R4300i_COP1_W: break;
|
case R4300i_COP1_W: break;
|
||||||
case R4300i_COP1_L: break;
|
case R4300i_COP1_L: break;
|
||||||
default:
|
default:
|
||||||
if (g_Settings->LoadBool(Debugger_Enabled))
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_ANDI:
|
case R4300i_ANDI:
|
||||||
case R4300i_ORI:
|
case R4300i_ORI:
|
||||||
case R4300i_XORI:
|
case R4300i_XORI:
|
||||||
case R4300i_LUI:
|
case R4300i_LUI:
|
||||||
case R4300i_ADDI:
|
case R4300i_ADDI:
|
||||||
case R4300i_ADDIU:
|
case R4300i_ADDIU:
|
||||||
case R4300i_SLTI:
|
case R4300i_SLTI:
|
||||||
case R4300i_SLTIU:
|
case R4300i_SLTIU:
|
||||||
case R4300i_DADDI:
|
case R4300i_DADDI:
|
||||||
case R4300i_DADDIU:
|
case R4300i_DADDIU:
|
||||||
case R4300i_LB:
|
case R4300i_LB:
|
||||||
case R4300i_LH:
|
case R4300i_LH:
|
||||||
case R4300i_LW:
|
case R4300i_LW:
|
||||||
case R4300i_LWL:
|
case R4300i_LWL:
|
||||||
case R4300i_LWR:
|
case R4300i_LWR:
|
||||||
case R4300i_LDL:
|
case R4300i_LDL:
|
||||||
case R4300i_LDR:
|
case R4300i_LDR:
|
||||||
case R4300i_LBU:
|
case R4300i_LBU:
|
||||||
case R4300i_LHU:
|
case R4300i_LHU:
|
||||||
case R4300i_LD:
|
case R4300i_LD:
|
||||||
case R4300i_LWC1:
|
case R4300i_LWC1:
|
||||||
case R4300i_LDC1:
|
case R4300i_LDC1:
|
||||||
if (Command.rt == 0)
|
if (Command.rt == 0)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (Command.rt == Reg1 || Command.rt == Reg2)
|
if (Command.rt == Reg1 || Command.rt == Reg2)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R4300i_CACHE: break;
|
case R4300i_CACHE: break;
|
||||||
case R4300i_SB: break;
|
case R4300i_SB: break;
|
||||||
case R4300i_SH: break;
|
case R4300i_SH: break;
|
||||||
case R4300i_SW: break;
|
case R4300i_SW: break;
|
||||||
case R4300i_SWR: break;
|
case R4300i_SWR: break;
|
||||||
case R4300i_SWL: break;
|
case R4300i_SWL: break;
|
||||||
case R4300i_SWC1: break;
|
case R4300i_SWC1: break;
|
||||||
case R4300i_SDC1: break;
|
case R4300i_SDC1: break;
|
||||||
case R4300i_SD: break;
|
case R4300i_SD: break;
|
||||||
default:
|
default:
|
||||||
if (g_Settings->LoadBool(Debugger_Enabled))
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInterpreterCPU::BuildCPU()
|
void CInterpreterCPU::BuildCPU()
|
||||||
{
|
{
|
||||||
R4300iOp::m_TestTimer = false;
|
R4300iOp::m_TestTimer = false;
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
R4300iOp::m_JumpToLocation = 0;
|
R4300iOp::m_JumpToLocation = 0;
|
||||||
|
|
||||||
if (g_Settings->LoadBool(Game_32Bit))
|
if (g_Settings->LoadBool(Game_32Bit))
|
||||||
{
|
{
|
||||||
m_R4300i_Opcode = R4300iOp32::BuildInterpreter();
|
m_R4300i_Opcode = R4300iOp32::BuildInterpreter();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_R4300i_Opcode = R4300iOp::BuildInterpreter();
|
m_R4300i_Opcode = R4300iOp::BuildInterpreter();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInterpreterCPU::InPermLoop()
|
void CInterpreterCPU::InPermLoop()
|
||||||
{
|
{
|
||||||
// *** Changed ***/
|
// *** Changed ***/
|
||||||
//if (CPU_Type == CPU_SyncCores)
|
//if (CPU_Type == CPU_SyncCores)
|
||||||
//{
|
//{
|
||||||
// SyncRegisters.CP0[9] +=5;
|
// SyncRegisters.CP0[9] +=5;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
/* Interrupts enabled */
|
/* Interrupts enabled */
|
||||||
if (( g_Reg->STATUS_REGISTER & STATUS_IE ) == 0 ||
|
if ((g_Reg->STATUS_REGISTER & STATUS_IE) == 0 ||
|
||||||
( g_Reg->STATUS_REGISTER & STATUS_EXL ) != 0 ||
|
(g_Reg->STATUS_REGISTER & STATUS_EXL) != 0 ||
|
||||||
( g_Reg->STATUS_REGISTER & STATUS_ERL ) != 0 ||
|
(g_Reg->STATUS_REGISTER & STATUS_ERL) != 0 ||
|
||||||
( g_Reg->STATUS_REGISTER & 0xFF00) == 0)
|
(g_Reg->STATUS_REGISTER & 0xFF00) == 0)
|
||||||
{
|
{
|
||||||
if (g_Plugins->Gfx()->UpdateScreen != NULL)
|
if (g_Plugins->Gfx()->UpdateScreen != NULL)
|
||||||
{
|
{
|
||||||
g_Plugins->Gfx()->UpdateScreen();
|
g_Plugins->Gfx()->UpdateScreen();
|
||||||
}
|
}
|
||||||
//CurrentFrame = 0;
|
//CurrentFrame = 0;
|
||||||
//CurrentPercent = 0;
|
//CurrentPercent = 0;
|
||||||
//DisplayFPS();
|
//DisplayFPS();
|
||||||
g_Notify->DisplayError(GS(MSG_PERM_LOOP));
|
g_Notify->DisplayError(GS(MSG_PERM_LOOP));
|
||||||
g_System->CloseCpu();
|
g_System->CloseCpu();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (*g_NextTimer > 0)
|
if (*g_NextTimer > 0)
|
||||||
{
|
{
|
||||||
*g_NextTimer = 0 - g_System->CountPerOp();
|
*g_NextTimer = 0 - g_System->CountPerOp();
|
||||||
g_SystemTimer->UpdateTimers();
|
g_SystemTimer->UpdateTimers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInterpreterCPU::ExecuteCPU()
|
void CInterpreterCPU::ExecuteCPU()
|
||||||
{
|
|
||||||
bool & Done = g_System->m_EndEmulation;
|
|
||||||
DWORD & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
|
|
||||||
OPCODE & Opcode = R4300iOp::m_Opcode;
|
|
||||||
DWORD & JumpToLocation = R4300iOp::m_JumpToLocation;
|
|
||||||
bool & TestTimer = R4300iOp::m_TestTimer;
|
|
||||||
const BOOL & bDoSomething= g_SystemEvents->DoSomething();
|
|
||||||
DWORD CountPerOp = g_System->CountPerOp();
|
|
||||||
int & NextTimer = *g_NextTimer;
|
|
||||||
|
|
||||||
__try
|
|
||||||
{
|
|
||||||
while (!Done)
|
|
||||||
{
|
|
||||||
if (g_MMU->LW_VAddr(PROGRAM_COUNTER, Opcode.Hex))
|
|
||||||
{
|
|
||||||
/*if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER< 0x80380000)
|
|
||||||
{
|
|
||||||
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER));
|
|
||||||
//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 ]();
|
|
||||||
NextTimer -= CountPerOp;
|
|
||||||
|
|
||||||
switch (R4300iOp::m_NextInstruction)
|
|
||||||
{
|
|
||||||
case NORMAL:
|
|
||||||
PROGRAM_COUNTER += 4;
|
|
||||||
break;
|
|
||||||
case DELAY_SLOT:
|
|
||||||
R4300iOp::m_NextInstruction = JUMP;
|
|
||||||
PROGRAM_COUNTER += 4;
|
|
||||||
break;
|
|
||||||
case PERMLOOP_DO_DELAY:
|
|
||||||
R4300iOp::m_NextInstruction = PERMLOOP_DELAY_DONE;
|
|
||||||
PROGRAM_COUNTER += 4;
|
|
||||||
break;
|
|
||||||
case JUMP:
|
|
||||||
{
|
|
||||||
BOOL CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
|
|
||||||
PROGRAM_COUNTER = JumpToLocation;
|
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
|
||||||
if (CheckTimer)
|
|
||||||
{
|
|
||||||
TestTimer = false;
|
|
||||||
if (NextTimer < 0)
|
|
||||||
{
|
|
||||||
g_SystemTimer->TimerDone();
|
|
||||||
}
|
|
||||||
if (bDoSomething)
|
|
||||||
{
|
|
||||||
g_SystemEvents->ExecuteEvents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PERMLOOP_DELAY_DONE:
|
|
||||||
PROGRAM_COUNTER = JumpToLocation;
|
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
|
||||||
CInterpreterCPU::InPermLoop();
|
|
||||||
g_SystemTimer->TimerDone();
|
|
||||||
if (bDoSomething)
|
|
||||||
{
|
|
||||||
g_SystemEvents->ExecuteEvents();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP,PROGRAM_COUNTER);
|
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} __except( g_MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
|
|
||||||
{
|
|
||||||
g_Notify->DisplayError(GS(MSG_UNKNOWN_MEM_ACTION));
|
|
||||||
ExitThread(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CInterpreterCPU::ExecuteOps(int Cycles)
|
|
||||||
{
|
{
|
||||||
bool & Done = g_System->m_EndEmulation;
|
bool & Done = g_System->m_EndEmulation;
|
||||||
DWORD & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
|
uint32_t & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
|
||||||
OPCODE & Opcode = R4300iOp::m_Opcode;
|
OPCODE & Opcode = R4300iOp::m_Opcode;
|
||||||
DWORD & JumpToLocation = R4300iOp::m_JumpToLocation;
|
uint32_t & JumpToLocation = R4300iOp::m_JumpToLocation;
|
||||||
bool & TestTimer = R4300iOp::m_TestTimer;
|
bool & TestTimer = R4300iOp::m_TestTimer;
|
||||||
const BOOL & DoSomething = g_SystemEvents->DoSomething();
|
const int32_t & bDoSomething = g_SystemEvents->DoSomething();
|
||||||
DWORD CountPerOp = g_System->CountPerOp();
|
uint32_t CountPerOp = g_System->CountPerOp();
|
||||||
|
int32_t & NextTimer = *g_NextTimer;
|
||||||
__try
|
|
||||||
{
|
|
||||||
while (!Done)
|
|
||||||
{
|
|
||||||
if (Cycles <= 0)
|
|
||||||
{
|
|
||||||
g_SystemTimer->UpdateTimers();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_MMU->LW_VAddr(PROGRAM_COUNTER, Opcode.Hex))
|
|
||||||
{
|
|
||||||
/*if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER< 0x80380000)
|
|
||||||
{
|
|
||||||
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER));
|
|
||||||
//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());
|
|
||||||
}*/
|
|
||||||
/*if (PROGRAM_COUNTER > 0x80323000 && PROGRAM_COUNTER< 0x80380000)
|
|
||||||
{
|
|
||||||
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER));
|
|
||||||
//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 ]();
|
|
||||||
_GPR[0].DW = 0; /* MIPS $zero hard-wired to 0 */
|
|
||||||
|
|
||||||
Cycles -= CountPerOp;
|
__try
|
||||||
*g_NextTimer -= CountPerOp;
|
{
|
||||||
|
while (!Done)
|
||||||
/*static DWORD TestAddress = 0x80077B0C, TestValue = 0, CurrentValue = 0;
|
{
|
||||||
if (g_MMU->LW_VAddr(TestAddress, TestValue))
|
if (g_MMU->LW_VAddr(PROGRAM_COUNTER, Opcode.Hex))
|
||||||
{
|
{
|
||||||
if (TestValue != CurrentValue)
|
/*if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER< 0x80380000)
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceError,"%X: %X changed (%s)",PROGRAM_COUNTER,TestAddress,R4300iOpcodeName(m_Opcode.Hex,PROGRAM_COUNTER) );
|
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER));
|
||||||
CurrentValue = TestValue;
|
//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]();
|
||||||
switch (R4300iOp::m_NextInstruction)
|
NextTimer -= CountPerOp;
|
||||||
{
|
|
||||||
case NORMAL:
|
switch (R4300iOp::m_NextInstruction)
|
||||||
PROGRAM_COUNTER += 4;
|
{
|
||||||
break;
|
case NORMAL:
|
||||||
case DELAY_SLOT:
|
PROGRAM_COUNTER += 4;
|
||||||
R4300iOp::m_NextInstruction = JUMP;
|
break;
|
||||||
PROGRAM_COUNTER += 4;
|
case DELAY_SLOT:
|
||||||
break;
|
R4300iOp::m_NextInstruction = JUMP;
|
||||||
case PERMLOOP_DO_DELAY:
|
PROGRAM_COUNTER += 4;
|
||||||
R4300iOp::m_NextInstruction = PERMLOOP_DELAY_DONE;
|
break;
|
||||||
PROGRAM_COUNTER += 4;
|
case PERMLOOP_DO_DELAY:
|
||||||
break;
|
R4300iOp::m_NextInstruction = PERMLOOP_DELAY_DONE;
|
||||||
case JUMP:
|
PROGRAM_COUNTER += 4;
|
||||||
{
|
break;
|
||||||
BOOL CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
|
case JUMP:
|
||||||
PROGRAM_COUNTER = JumpToLocation;
|
{
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
bool CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
|
||||||
if (CheckTimer)
|
PROGRAM_COUNTER = JumpToLocation;
|
||||||
{
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
TestTimer = false;
|
if (CheckTimer)
|
||||||
if (*g_NextTimer < 0)
|
{
|
||||||
{
|
TestTimer = false;
|
||||||
g_SystemTimer->TimerDone();
|
if (NextTimer < 0)
|
||||||
}
|
{
|
||||||
if (DoSomething)
|
g_SystemTimer->TimerDone();
|
||||||
{
|
}
|
||||||
g_SystemEvents->ExecuteEvents();
|
if (bDoSomething)
|
||||||
}
|
{
|
||||||
}
|
g_SystemEvents->ExecuteEvents();
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case PERMLOOP_DELAY_DONE:
|
}
|
||||||
PROGRAM_COUNTER = JumpToLocation;
|
break;
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
case PERMLOOP_DELAY_DONE:
|
||||||
CInterpreterCPU::InPermLoop();
|
PROGRAM_COUNTER = JumpToLocation;
|
||||||
g_SystemTimer->TimerDone();
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
if (DoSomething)
|
CInterpreterCPU::InPermLoop();
|
||||||
{
|
g_SystemTimer->TimerDone();
|
||||||
g_SystemEvents->ExecuteEvents();
|
if (bDoSomething)
|
||||||
}
|
{
|
||||||
break;
|
g_SystemEvents->ExecuteEvents();
|
||||||
default:
|
}
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
break;
|
||||||
}
|
default:
|
||||||
}
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP,PROGRAM_COUNTER);
|
else
|
||||||
R4300iOp::m_NextInstruction = NORMAL;
|
{
|
||||||
}
|
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP, PROGRAM_COUNTER);
|
||||||
}
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
} __except( g_MMU->MemoryFilter( GetExceptionCode(), GetExceptionInformation()) )
|
}
|
||||||
{
|
}
|
||||||
g_Notify->DisplayError(GS(MSG_UNKNOWN_MEM_ACTION));
|
}
|
||||||
ExitThread(0);
|
__except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation()))
|
||||||
}
|
{
|
||||||
|
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CInterpreterCPU::ExecuteOps(int32_t Cycles)
|
||||||
|
{
|
||||||
|
bool & Done = g_System->m_EndEmulation;
|
||||||
|
uint32_t & PROGRAM_COUNTER = *_PROGRAM_COUNTER;
|
||||||
|
OPCODE & Opcode = R4300iOp::m_Opcode;
|
||||||
|
uint32_t & JumpToLocation = R4300iOp::m_JumpToLocation;
|
||||||
|
bool & TestTimer = R4300iOp::m_TestTimer;
|
||||||
|
const int32_t & DoSomething = g_SystemEvents->DoSomething();
|
||||||
|
uint32_t CountPerOp = g_System->CountPerOp();
|
||||||
|
|
||||||
|
__try
|
||||||
|
{
|
||||||
|
while (!Done)
|
||||||
|
{
|
||||||
|
if (Cycles <= 0)
|
||||||
|
{
|
||||||
|
g_SystemTimer->UpdateTimers();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_MMU->LW_VAddr(PROGRAM_COUNTER, Opcode.Hex))
|
||||||
|
{
|
||||||
|
/*if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER< 0x80380000)
|
||||||
|
{
|
||||||
|
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER));
|
||||||
|
//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());
|
||||||
|
}*/
|
||||||
|
/*if (PROGRAM_COUNTER > 0x80323000 && PROGRAM_COUNTER< 0x80380000)
|
||||||
|
{
|
||||||
|
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",*_PROGRAM_COUNTER,R4300iOpcodeName(Opcode.Hex,*_PROGRAM_COUNTER));
|
||||||
|
//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]();
|
||||||
|
_GPR[0].DW = 0; /* MIPS $zero hard-wired to 0 */
|
||||||
|
|
||||||
|
Cycles -= CountPerOp;
|
||||||
|
*g_NextTimer -= CountPerOp;
|
||||||
|
|
||||||
|
/*static uint32_t TestAddress = 0x80077B0C, TestValue = 0, CurrentValue = 0;
|
||||||
|
if (g_MMU->LW_VAddr(TestAddress, TestValue))
|
||||||
|
{
|
||||||
|
if (TestValue != CurrentValue)
|
||||||
|
{
|
||||||
|
WriteTraceF(TraceError,"%X: %X changed (%s)",PROGRAM_COUNTER,TestAddress,R4300iOpcodeName(m_Opcode.Hex,PROGRAM_COUNTER) );
|
||||||
|
CurrentValue = TestValue;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
switch (R4300iOp::m_NextInstruction)
|
||||||
|
{
|
||||||
|
case NORMAL:
|
||||||
|
PROGRAM_COUNTER += 4;
|
||||||
|
break;
|
||||||
|
case DELAY_SLOT:
|
||||||
|
R4300iOp::m_NextInstruction = JUMP;
|
||||||
|
PROGRAM_COUNTER += 4;
|
||||||
|
break;
|
||||||
|
case PERMLOOP_DO_DELAY:
|
||||||
|
R4300iOp::m_NextInstruction = PERMLOOP_DELAY_DONE;
|
||||||
|
PROGRAM_COUNTER += 4;
|
||||||
|
break;
|
||||||
|
case JUMP:
|
||||||
|
{
|
||||||
|
bool CheckTimer = (JumpToLocation < PROGRAM_COUNTER || TestTimer);
|
||||||
|
PROGRAM_COUNTER = JumpToLocation;
|
||||||
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
|
if (CheckTimer)
|
||||||
|
{
|
||||||
|
TestTimer = false;
|
||||||
|
if (*g_NextTimer < 0)
|
||||||
|
{
|
||||||
|
g_SystemTimer->TimerDone();
|
||||||
|
}
|
||||||
|
if (DoSomething)
|
||||||
|
{
|
||||||
|
g_SystemEvents->ExecuteEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PERMLOOP_DELAY_DONE:
|
||||||
|
PROGRAM_COUNTER = JumpToLocation;
|
||||||
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
|
CInterpreterCPU::InPermLoop();
|
||||||
|
g_SystemTimer->TimerDone();
|
||||||
|
if (DoSomething)
|
||||||
|
{
|
||||||
|
g_SystemEvents->ExecuteEvents();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_Reg->DoTLBReadMiss(R4300iOp::m_NextInstruction == JUMP, PROGRAM_COUNTER);
|
||||||
|
R4300iOp::m_NextInstruction = NORMAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__except (g_MMU->MemoryFilter(GetExceptionCode(), GetExceptionInformation()))
|
||||||
|
{
|
||||||
|
g_Notify->FatalError(GS(MSG_UNKNOWN_MEM_ACTION));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,19 +10,21 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Project64\N64 System\Interpreter\Interpreter Ops.h>
|
||||||
|
|
||||||
class CInterpreterCPU :
|
class CInterpreterCPU :
|
||||||
private R4300iOp
|
private R4300iOp
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void BuildCPU();
|
static void BuildCPU();
|
||||||
static void ExecuteCPU();
|
static void ExecuteCPU();
|
||||||
static void ExecuteOps(int Cycles);
|
static void ExecuteOps(int32_t Cycles);
|
||||||
static void InPermLoop();
|
static void InPermLoop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CInterpreterCPU(); // Disable default constructor
|
CInterpreterCPU(); // Disable default constructor
|
||||||
CInterpreterCPU(const CInterpreterCPU&); // Disable copy constructor
|
CInterpreterCPU(const CInterpreterCPU&); // Disable copy constructor
|
||||||
CInterpreterCPU& operator=(const CInterpreterCPU&); // Disable assignment
|
CInterpreterCPU& operator=(const CInterpreterCPU&); // Disable assignment
|
||||||
|
|
||||||
static R4300iOp::Func * m_R4300i_Opcode;
|
static R4300iOp::Func * m_R4300i_Opcode;
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,75 +10,77 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Interpreter Ops.h"
|
||||||
|
|
||||||
class R4300iOp32 :
|
class R4300iOp32 :
|
||||||
public R4300iOp
|
public R4300iOp
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/************************* OpCode functions *************************/
|
/************************* OpCode functions *************************/
|
||||||
static void JAL();
|
static void JAL();
|
||||||
static void BEQ();
|
static void BEQ();
|
||||||
static void BNE();
|
static void BNE();
|
||||||
static void BLEZ();
|
static void BLEZ();
|
||||||
static void BGTZ();
|
static void BGTZ();
|
||||||
static void ADDI();
|
static void ADDI();
|
||||||
static void ADDIU();
|
static void ADDIU();
|
||||||
static void SLTI();
|
static void SLTI();
|
||||||
static void SLTIU();
|
static void SLTIU();
|
||||||
static void ANDI();
|
static void ANDI();
|
||||||
static void ORI();
|
static void ORI();
|
||||||
static void XORI();
|
static void XORI();
|
||||||
static void LUI();
|
static void LUI();
|
||||||
static void BEQL();
|
static void BEQL();
|
||||||
static void BNEL();
|
static void BNEL();
|
||||||
static void BLEZL();
|
static void BLEZL();
|
||||||
static void BGTZL();
|
static void BGTZL();
|
||||||
static void LB();
|
static void LB();
|
||||||
static void LH();
|
static void LH();
|
||||||
static void LWL();
|
static void LWL();
|
||||||
static void LW();
|
static void LW();
|
||||||
static void LBU();
|
static void LBU();
|
||||||
static void LHU();
|
static void LHU();
|
||||||
static void LWR();
|
static void LWR();
|
||||||
static void LWU();
|
static void LWU();
|
||||||
static void LL();
|
static void LL();
|
||||||
|
|
||||||
/********************** R4300i OpCodes: Special **********************/
|
/********************** R4300i OpCodes: Special **********************/
|
||||||
static void SPECIAL_SLL();
|
static void SPECIAL_SLL();
|
||||||
static void SPECIAL_SRL();
|
static void SPECIAL_SRL();
|
||||||
static void SPECIAL_SRA();
|
static void SPECIAL_SRA();
|
||||||
static void SPECIAL_SLLV();
|
static void SPECIAL_SLLV();
|
||||||
static void SPECIAL_SRLV();
|
static void SPECIAL_SRLV();
|
||||||
static void SPECIAL_SRAV();
|
static void SPECIAL_SRAV();
|
||||||
static void SPECIAL_JALR();
|
static void SPECIAL_JALR();
|
||||||
static void SPECIAL_ADD();
|
static void SPECIAL_ADD();
|
||||||
static void SPECIAL_ADDU();
|
static void SPECIAL_ADDU();
|
||||||
static void SPECIAL_SUB();
|
static void SPECIAL_SUB();
|
||||||
static void SPECIAL_SUBU();
|
static void SPECIAL_SUBU();
|
||||||
static void SPECIAL_AND();
|
static void SPECIAL_AND();
|
||||||
static void SPECIAL_OR();
|
static void SPECIAL_OR();
|
||||||
static void SPECIAL_NOR();
|
static void SPECIAL_NOR();
|
||||||
static void SPECIAL_SLT();
|
static void SPECIAL_SLT();
|
||||||
static void SPECIAL_SLTU();
|
static void SPECIAL_SLTU();
|
||||||
static void SPECIAL_TEQ();
|
static void SPECIAL_TEQ();
|
||||||
static void SPECIAL_DSRL32();
|
static void SPECIAL_DSRL32();
|
||||||
static void SPECIAL_DSRA32();
|
static void SPECIAL_DSRA32();
|
||||||
|
|
||||||
/********************** R4300i OpCodes: RegImm **********************/
|
/********************** R4300i OpCodes: RegImm **********************/
|
||||||
static void REGIMM_BLTZ();
|
static void REGIMM_BLTZ();
|
||||||
static void REGIMM_BGEZ();
|
static void REGIMM_BGEZ();
|
||||||
static void REGIMM_BLTZL();
|
static void REGIMM_BLTZL();
|
||||||
static void REGIMM_BGEZL();
|
static void REGIMM_BGEZL();
|
||||||
static void REGIMM_BLTZAL();
|
static void REGIMM_BLTZAL();
|
||||||
static void REGIMM_BGEZAL();
|
static void REGIMM_BGEZAL();
|
||||||
|
|
||||||
/************************** COP0 functions **************************/
|
/************************** COP0 functions **************************/
|
||||||
static void COP0_MF();
|
static void COP0_MF();
|
||||||
static void COP0_MT();
|
static void COP0_MT();
|
||||||
|
|
||||||
/************************** COP1 functions **************************/
|
/************************** COP1 functions **************************/
|
||||||
static void COP1_MF();
|
static void COP1_MF();
|
||||||
static void COP1_CF();
|
static void COP1_CF();
|
||||||
static void COP1_DMT();
|
static void COP1_DMT();
|
||||||
|
|
||||||
static Func* BuildInterpreter();
|
static Func* BuildInterpreter();
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,229 +10,231 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#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 :
|
class R4300iOp :
|
||||||
protected CDebugSettings,
|
public CLogging,
|
||||||
protected CSystemRegisters
|
protected CDebugSettings,
|
||||||
|
protected CSystemRegisters
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef void(*Func)();
|
typedef void(*Func)();
|
||||||
|
|
||||||
/************************* OpCode functions *************************/
|
/************************* OpCode functions *************************/
|
||||||
static void J();
|
static void J();
|
||||||
static void JAL();
|
static void JAL();
|
||||||
static void BNE();
|
static void BNE();
|
||||||
static void BEQ();
|
static void BEQ();
|
||||||
static void BLEZ();
|
static void BLEZ();
|
||||||
static void BGTZ();
|
static void BGTZ();
|
||||||
static void ADDI();
|
static void ADDI();
|
||||||
static void ADDIU();
|
static void ADDIU();
|
||||||
static void SLTI();
|
static void SLTI();
|
||||||
static void SLTIU();
|
static void SLTIU();
|
||||||
static void ANDI();
|
static void ANDI();
|
||||||
static void ORI();
|
static void ORI();
|
||||||
static void XORI();
|
static void XORI();
|
||||||
static void LUI();
|
static void LUI();
|
||||||
static void BEQL();
|
static void BEQL();
|
||||||
static void BNEL();
|
static void BNEL();
|
||||||
static void BLEZL();
|
static void BLEZL();
|
||||||
static void BGTZL();
|
static void BGTZL();
|
||||||
static void DADDIU();
|
static void DADDIU();
|
||||||
static void LDL();
|
static void LDL();
|
||||||
static void LDR();
|
static void LDR();
|
||||||
static void LB();
|
static void LB();
|
||||||
static void LH();
|
static void LH();
|
||||||
static void LWL();
|
static void LWL();
|
||||||
static void LW();
|
static void LW();
|
||||||
static void LBU();
|
static void LBU();
|
||||||
static void LHU();
|
static void LHU();
|
||||||
static void LWR();
|
static void LWR();
|
||||||
static void LWU();
|
static void LWU();
|
||||||
static void SB();
|
static void SB();
|
||||||
static void SH();
|
static void SH();
|
||||||
static void SWL();
|
static void SWL();
|
||||||
static void SW();
|
static void SW();
|
||||||
static void SDL();
|
static void SDL();
|
||||||
static void SDR();
|
static void SDR();
|
||||||
static void SWR();
|
static void SWR();
|
||||||
static void CACHE();
|
static void CACHE();
|
||||||
static void LL();
|
static void LL();
|
||||||
static void LWC1();
|
static void LWC1();
|
||||||
static void LDC1();
|
static void LDC1();
|
||||||
static void LD();
|
static void LD();
|
||||||
static void SC();
|
static void SC();
|
||||||
static void SWC1();
|
static void SWC1();
|
||||||
static void SDC1();
|
static void SDC1();
|
||||||
static void SD();
|
static void SD();
|
||||||
|
|
||||||
|
/********************** R4300i OpCodes: Special **********************/
|
||||||
|
static void SPECIAL_SLL();
|
||||||
|
static void SPECIAL_SRL();
|
||||||
|
static void SPECIAL_SRA();
|
||||||
|
static void SPECIAL_SLLV();
|
||||||
|
static void SPECIAL_SRLV();
|
||||||
|
static void SPECIAL_SRAV();
|
||||||
|
static void SPECIAL_JR();
|
||||||
|
static void SPECIAL_JALR();
|
||||||
|
static void SPECIAL_SYSCALL();
|
||||||
|
static void SPECIAL_BREAK();
|
||||||
|
static void SPECIAL_SYNC();
|
||||||
|
static void SPECIAL_MFHI();
|
||||||
|
static void SPECIAL_MTHI();
|
||||||
|
static void SPECIAL_MFLO();
|
||||||
|
static void SPECIAL_MTLO();
|
||||||
|
static void SPECIAL_DSLLV();
|
||||||
|
static void SPECIAL_DSRLV();
|
||||||
|
static void SPECIAL_DSRAV();
|
||||||
|
static void SPECIAL_MULT();
|
||||||
|
static void SPECIAL_MULTU();
|
||||||
|
static void SPECIAL_DIV();
|
||||||
|
static void SPECIAL_DIVU();
|
||||||
|
static void SPECIAL_DMULT();
|
||||||
|
static void SPECIAL_DMULTU();
|
||||||
|
static void SPECIAL_DDIV();
|
||||||
|
static void SPECIAL_DDIVU();
|
||||||
|
static void SPECIAL_ADD();
|
||||||
|
static void SPECIAL_ADDU();
|
||||||
|
static void SPECIAL_SUB();
|
||||||
|
static void SPECIAL_SUBU();
|
||||||
|
static void SPECIAL_AND();
|
||||||
|
static void SPECIAL_OR();
|
||||||
|
static void SPECIAL_XOR();
|
||||||
|
static void SPECIAL_NOR();
|
||||||
|
static void SPECIAL_SLT();
|
||||||
|
static void SPECIAL_SLTU();
|
||||||
|
static void SPECIAL_DADD();
|
||||||
|
static void SPECIAL_DADDU();
|
||||||
|
static void SPECIAL_DSUB();
|
||||||
|
static void SPECIAL_DSUBU();
|
||||||
|
static void SPECIAL_TEQ();
|
||||||
|
static void SPECIAL_DSLL();
|
||||||
|
static void SPECIAL_DSRL();
|
||||||
|
static void SPECIAL_DSRA();
|
||||||
|
static void SPECIAL_DSLL32();
|
||||||
|
static void SPECIAL_DSRL32();
|
||||||
|
static void SPECIAL_DSRA32();
|
||||||
|
|
||||||
/********************** R4300i OpCodes: Special **********************/
|
/********************** R4300i OpCodes: RegImm **********************/
|
||||||
static void SPECIAL_SLL();
|
static void REGIMM_BLTZ();
|
||||||
static void SPECIAL_SRL();
|
static void REGIMM_BGEZ();
|
||||||
static void SPECIAL_SRA();
|
static void REGIMM_BLTZL();
|
||||||
static void SPECIAL_SLLV();
|
static void REGIMM_BGEZL();
|
||||||
static void SPECIAL_SRLV();
|
static void REGIMM_BLTZAL();
|
||||||
static void SPECIAL_SRAV();
|
static void REGIMM_BGEZAL();
|
||||||
static void SPECIAL_JR();
|
|
||||||
static void SPECIAL_JALR();
|
|
||||||
static void SPECIAL_SYSCALL();
|
|
||||||
static void SPECIAL_BREAK();
|
|
||||||
static void SPECIAL_SYNC();
|
|
||||||
static void SPECIAL_MFHI();
|
|
||||||
static void SPECIAL_MTHI();
|
|
||||||
static void SPECIAL_MFLO();
|
|
||||||
static void SPECIAL_MTLO();
|
|
||||||
static void SPECIAL_DSLLV();
|
|
||||||
static void SPECIAL_DSRLV();
|
|
||||||
static void SPECIAL_DSRAV();
|
|
||||||
static void SPECIAL_MULT();
|
|
||||||
static void SPECIAL_MULTU();
|
|
||||||
static void SPECIAL_DIV();
|
|
||||||
static void SPECIAL_DIVU();
|
|
||||||
static void SPECIAL_DMULT();
|
|
||||||
static void SPECIAL_DMULTU();
|
|
||||||
static void SPECIAL_DDIV();
|
|
||||||
static void SPECIAL_DDIVU();
|
|
||||||
static void SPECIAL_ADD();
|
|
||||||
static void SPECIAL_ADDU();
|
|
||||||
static void SPECIAL_SUB();
|
|
||||||
static void SPECIAL_SUBU();
|
|
||||||
static void SPECIAL_AND();
|
|
||||||
static void SPECIAL_OR();
|
|
||||||
static void SPECIAL_XOR();
|
|
||||||
static void SPECIAL_NOR();
|
|
||||||
static void SPECIAL_SLT();
|
|
||||||
static void SPECIAL_SLTU();
|
|
||||||
static void SPECIAL_DADD();
|
|
||||||
static void SPECIAL_DADDU();
|
|
||||||
static void SPECIAL_DSUB();
|
|
||||||
static void SPECIAL_DSUBU();
|
|
||||||
static void SPECIAL_TEQ();
|
|
||||||
static void SPECIAL_DSLL();
|
|
||||||
static void SPECIAL_DSRL();
|
|
||||||
static void SPECIAL_DSRA();
|
|
||||||
static void SPECIAL_DSLL32();
|
|
||||||
static void SPECIAL_DSRL32();
|
|
||||||
static void SPECIAL_DSRA32();
|
|
||||||
|
|
||||||
/********************** R4300i OpCodes: RegImm **********************/
|
/************************** COP0 functions **************************/
|
||||||
static void REGIMM_BLTZ();
|
static void COP0_MF();
|
||||||
static void REGIMM_BGEZ();
|
static void COP0_MT();
|
||||||
static void REGIMM_BLTZL();
|
|
||||||
static void REGIMM_BGEZL();
|
|
||||||
static void REGIMM_BLTZAL();
|
|
||||||
static void REGIMM_BGEZAL();
|
|
||||||
|
|
||||||
/************************** COP0 functions **************************/
|
/************************** COP0 CO functions ***********************/
|
||||||
static void COP0_MF();
|
static void COP0_CO_TLBR();
|
||||||
static void COP0_MT();
|
static void COP0_CO_TLBWI();
|
||||||
|
static void COP0_CO_TLBWR();
|
||||||
|
static void COP0_CO_TLBP();
|
||||||
|
static void COP0_CO_ERET();
|
||||||
|
|
||||||
/************************** COP0 CO functions ***********************/
|
/************************** COP1 functions **************************/
|
||||||
static void COP0_CO_TLBR();
|
static void COP1_MF();
|
||||||
static void COP0_CO_TLBWI();
|
static void COP1_DMF();
|
||||||
static void COP0_CO_TLBWR();
|
static void COP1_CF();
|
||||||
static void COP0_CO_TLBP();
|
static void COP1_MT();
|
||||||
static void COP0_CO_ERET();
|
static void COP1_DMT();
|
||||||
|
static void COP1_CT();
|
||||||
|
|
||||||
/************************** COP1 functions **************************/
|
/************************* COP1: BC1 functions ***********************/
|
||||||
static void COP1_MF();
|
static void COP1_BCF();
|
||||||
static void COP1_DMF();
|
static void COP1_BCT();
|
||||||
static void COP1_CF();
|
static void COP1_BCFL();
|
||||||
static void COP1_MT();
|
static void COP1_BCTL();
|
||||||
static void COP1_DMT();
|
|
||||||
static void COP1_CT();
|
|
||||||
|
|
||||||
/************************* COP1: BC1 functions ***********************/
|
/************************** COP1: S functions ************************/
|
||||||
static void COP1_BCF();
|
static void COP1_S_ADD();
|
||||||
static void COP1_BCT();
|
static void COP1_S_SUB();
|
||||||
static void COP1_BCFL();
|
static void COP1_S_MUL();
|
||||||
static void COP1_BCTL();
|
static void COP1_S_DIV();
|
||||||
|
static void COP1_S_SQRT();
|
||||||
|
static void COP1_S_ABS();
|
||||||
|
static void COP1_S_MOV();
|
||||||
|
static void COP1_S_NEG();
|
||||||
|
static void COP1_S_TRUNC_L();
|
||||||
|
static void COP1_S_CEIL_L(); //added by Witten
|
||||||
|
static void COP1_S_FLOOR_L(); //added by Witten
|
||||||
|
static void COP1_S_ROUND_W();
|
||||||
|
static void COP1_S_TRUNC_W();
|
||||||
|
static void COP1_S_CEIL_W(); //added by Witten
|
||||||
|
static void COP1_S_FLOOR_W();
|
||||||
|
static void COP1_S_CVT_D();
|
||||||
|
static void COP1_S_CVT_W();
|
||||||
|
static void COP1_S_CVT_L();
|
||||||
|
static void COP1_S_CMP();
|
||||||
|
|
||||||
/************************** COP1: S functions ************************/
|
/************************** COP1: D functions ************************/
|
||||||
static void COP1_S_ADD();
|
static void COP1_D_ADD();
|
||||||
static void COP1_S_SUB();
|
static void COP1_D_SUB();
|
||||||
static void COP1_S_MUL();
|
static void COP1_D_MUL();
|
||||||
static void COP1_S_DIV();
|
static void COP1_D_DIV();
|
||||||
static void COP1_S_SQRT();
|
static void COP1_D_SQRT();
|
||||||
static void COP1_S_ABS();
|
static void COP1_D_ABS();
|
||||||
static void COP1_S_MOV();
|
static void COP1_D_MOV();
|
||||||
static void COP1_S_NEG();
|
static void COP1_D_NEG();
|
||||||
static void COP1_S_TRUNC_L();
|
static void COP1_D_TRUNC_L(); //added by Witten
|
||||||
static void COP1_S_CEIL_L(); //added by Witten
|
static void COP1_D_CEIL_L(); //added by Witten
|
||||||
static void COP1_S_FLOOR_L(); //added by Witten
|
static void COP1_D_FLOOR_L(); //added by Witten
|
||||||
static void COP1_S_ROUND_W();
|
static void COP1_D_ROUND_W();
|
||||||
static void COP1_S_TRUNC_W();
|
static void COP1_D_TRUNC_W();
|
||||||
static void COP1_S_CEIL_W(); //added by Witten
|
static void COP1_D_CEIL_W(); //added by Witten
|
||||||
static void COP1_S_FLOOR_W();
|
static void COP1_D_FLOOR_W(); //added by Witten
|
||||||
static void COP1_S_CVT_D();
|
static void COP1_D_CVT_S();
|
||||||
static void COP1_S_CVT_W();
|
static void COP1_D_CVT_W();
|
||||||
static void COP1_S_CVT_L();
|
static void COP1_D_CVT_L();
|
||||||
static void COP1_S_CMP();
|
static void COP1_D_CMP();
|
||||||
|
|
||||||
/************************** COP1: D functions ************************/
|
/************************** COP1: W functions ************************/
|
||||||
static void COP1_D_ADD();
|
static void COP1_W_CVT_S();
|
||||||
static void COP1_D_SUB();
|
static void COP1_W_CVT_D();
|
||||||
static void COP1_D_MUL();
|
|
||||||
static void COP1_D_DIV();
|
|
||||||
static void COP1_D_SQRT();
|
|
||||||
static void COP1_D_ABS();
|
|
||||||
static void COP1_D_MOV();
|
|
||||||
static void COP1_D_NEG();
|
|
||||||
static void COP1_D_TRUNC_L(); //added by Witten
|
|
||||||
static void COP1_D_CEIL_L(); //added by Witten
|
|
||||||
static void COP1_D_FLOOR_L(); //added by Witten
|
|
||||||
static void COP1_D_ROUND_W();
|
|
||||||
static void COP1_D_TRUNC_W();
|
|
||||||
static void COP1_D_CEIL_W(); //added by Witten
|
|
||||||
static void COP1_D_FLOOR_W(); //added by Witten
|
|
||||||
static void COP1_D_CVT_S();
|
|
||||||
static void COP1_D_CVT_W();
|
|
||||||
static void COP1_D_CVT_L();
|
|
||||||
static void COP1_D_CMP();
|
|
||||||
|
|
||||||
/************************** COP1: W functions ************************/
|
/************************** COP1: L functions ************************/
|
||||||
static void COP1_W_CVT_S();
|
static void COP1_L_CVT_S();
|
||||||
static void COP1_W_CVT_D();
|
static void COP1_L_CVT_D();
|
||||||
|
|
||||||
/************************** COP1: L functions ************************/
|
/************************** Other functions **************************/
|
||||||
static void COP1_L_CVT_S();
|
static void UnknownOpcode();
|
||||||
static void COP1_L_CVT_D();
|
|
||||||
|
|
||||||
/************************** Other functions **************************/
|
static Func* BuildInterpreter();
|
||||||
static void UnknownOpcode();
|
|
||||||
|
|
||||||
|
static bool m_TestTimer;
|
||||||
static Func* BuildInterpreter();
|
static uint32_t m_NextInstruction;
|
||||||
|
static OPCODE m_Opcode;
|
||||||
static bool m_TestTimer;
|
static uint32_t m_JumpToLocation;
|
||||||
static DWORD m_NextInstruction;
|
|
||||||
static OPCODE m_Opcode;
|
|
||||||
static DWORD m_JumpToLocation;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void SPECIAL();
|
static void SPECIAL();
|
||||||
static void REGIMM();
|
static void REGIMM();
|
||||||
static void COP0();
|
static void COP0();
|
||||||
static void COP0_CO();
|
static void COP0_CO();
|
||||||
static void COP1();
|
static void COP1();
|
||||||
static void COP1_BC();
|
static void COP1_BC();
|
||||||
static void COP1_S();
|
static void COP1_S();
|
||||||
static void COP1_D();
|
static void COP1_D();
|
||||||
static void COP1_W();
|
static void COP1_W();
|
||||||
static void COP1_L();
|
static void COP1_L();
|
||||||
|
|
||||||
static Func Jump_Opcode[64];
|
static Func Jump_Opcode[64];
|
||||||
static Func Jump_Special[64];
|
static Func Jump_Special[64];
|
||||||
static Func Jump_Regimm[32];
|
static Func Jump_Regimm[32];
|
||||||
static Func Jump_CoP0[32];
|
static Func Jump_CoP0[32];
|
||||||
static Func Jump_CoP0_Function[64];
|
static Func Jump_CoP0_Function[64];
|
||||||
static Func Jump_CoP1[32];
|
static Func Jump_CoP1[32];
|
||||||
static Func Jump_CoP1_BC[32];
|
static Func Jump_CoP1_BC[32];
|
||||||
static Func Jump_CoP1_S[64];
|
static Func Jump_CoP1_S[64];
|
||||||
static Func Jump_CoP1_D[64];
|
static Func Jump_CoP1_D[64];
|
||||||
static Func Jump_CoP1_W[64];
|
static Func Jump_CoP1_W[64];
|
||||||
static Func Jump_CoP1_L[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];
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,147 +9,150 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include "Audio.h"
|
||||||
|
#include <Project64\N64 System\System Globals.h>
|
||||||
|
#include <Project64\N64 System\N64 Class.h>
|
||||||
|
|
||||||
CAudio::CAudio()
|
CAudio::CAudio()
|
||||||
{
|
{
|
||||||
Reset();
|
Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
CAudio::~CAudio()
|
CAudio::~CAudio()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::Reset()
|
void CAudio::Reset()
|
||||||
{
|
{
|
||||||
m_SecondBuff = 0;
|
m_SecondBuff = 0;
|
||||||
m_Status = 0;
|
m_Status = 0;
|
||||||
m_BytesPerSecond = 0;
|
m_BytesPerSecond = 0;
|
||||||
m_CountsPerByte = g_System->AiCountPerBytes(); // should be calculated ... see below, instead allow from user settings
|
m_CountsPerByte = g_System->AiCountPerBytes(); // should be calculated ... see below, instead allow from user settings
|
||||||
if (m_CountsPerByte == 0) m_CountsPerByte = 500; // If the user has no defined value, grant a default and we will calculate
|
if (m_CountsPerByte == 0) m_CountsPerByte = 500; // If the user has no defined value, grant a default and we will calculate
|
||||||
m_FramesPerSecond = 60;
|
m_FramesPerSecond = 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD CAudio::GetLength()
|
uint32_t CAudio::GetLength()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
|
||||||
DWORD TimeLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt), Res = 0;
|
uint32_t TimeLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt), Res = 0;
|
||||||
if (TimeLeft > 0)
|
if (TimeLeft > 0)
|
||||||
{
|
{
|
||||||
Res = (TimeLeft / m_CountsPerByte);
|
Res = (TimeLeft / m_CountsPerByte);
|
||||||
}
|
}
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Done (res = %d, TimeLeft = %d)",Res, TimeLeft);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Done (res = %d, TimeLeft = %d)", Res, TimeLeft);
|
||||||
return (Res+3)&~3;
|
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;
|
return m_Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::LenChanged()
|
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 != 0)
|
||||||
{
|
{
|
||||||
if (g_Reg->AI_LEN_REG >= 0x40000)
|
if (g_Reg->AI_LEN_REG >= 0x40000)
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": *** Ignoring Write, To Large (%X)",g_Reg->AI_LEN_REG);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": *** Ignoring Write, To Large (%X)", g_Reg->AI_LEN_REG);
|
||||||
} else {
|
}
|
||||||
m_Status |= ai_busy;
|
else
|
||||||
DWORD AudioLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt);
|
{
|
||||||
if (m_SecondBuff == 0)
|
m_Status |= ai_busy;
|
||||||
{
|
uint32_t AudioLeft = g_SystemTimer->GetTimer(CSystemTimer::AiTimerInterrupt);
|
||||||
if (AudioLeft == 0)
|
if (m_SecondBuff == 0)
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio, __FUNCTION__ ": Set Timer AI_LEN_REG: %d m_CountsPerByte: %d", g_Reg->AI_LEN_REG, m_CountsPerByte);
|
if (AudioLeft == 0)
|
||||||
g_SystemTimer->SetTimer(CSystemTimer::AiTimerInterrupt, g_Reg->AI_LEN_REG * m_CountsPerByte, false);
|
{
|
||||||
}
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Set Timer AI_LEN_REG: %d m_CountsPerByte: %d", g_Reg->AI_LEN_REG, m_CountsPerByte);
|
||||||
else
|
g_SystemTimer->SetTimer(CSystemTimer::AiTimerInterrupt, g_Reg->AI_LEN_REG * m_CountsPerByte, false);
|
||||||
{
|
}
|
||||||
WriteTraceF(TraceAudio, __FUNCTION__ ": Increasing Second Buffer (m_SecondBuff %d Increase: %d)", m_SecondBuff, g_Reg->AI_LEN_REG);
|
else
|
||||||
m_SecondBuff += g_Reg->AI_LEN_REG;
|
{
|
||||||
m_Status |= ai_full;
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Increasing Second Buffer (m_SecondBuff %d Increase: %d)", m_SecondBuff, g_Reg->AI_LEN_REG);
|
||||||
}
|
m_SecondBuff += g_Reg->AI_LEN_REG;
|
||||||
}
|
m_Status |= ai_full;
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
else
|
||||||
}
|
{
|
||||||
}
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
}
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": *** Reset Timer to 0");
|
else
|
||||||
g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy);
|
{
|
||||||
g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": *** Reset Timer to 0");
|
||||||
m_SecondBuff = 0;
|
g_SystemTimer->StopTimer(CSystemTimer::AiTimerBusy);
|
||||||
m_Status = 0;
|
g_SystemTimer->StopTimer(CSystemTimer::AiTimerInterrupt);
|
||||||
}
|
m_SecondBuff = 0;
|
||||||
|
m_Status = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_Plugins->Audio()->AiLenChanged != NULL)
|
if (g_Plugins->Audio()->AiLenChanged != NULL)
|
||||||
{
|
{
|
||||||
g_Plugins->Audio()->AiLenChanged();
|
g_Plugins->Audio()->AiLenChanged();
|
||||||
}
|
}
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Done");
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Done");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::InterruptTimerDone()
|
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;
|
m_Status &= ~ai_full;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_AI;
|
g_Reg->MI_INTR_REG |= MI_INTR_AI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
if (m_SecondBuff != 0)
|
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;
|
m_SecondBuff = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Status &= ~ai_busy;
|
m_Status &= ~ai_busy;
|
||||||
}
|
}
|
||||||
if (g_Reg->m_AudioIntrReg == 0)
|
if (g_Reg->m_AudioIntrReg == 0)
|
||||||
{
|
{
|
||||||
g_System->SyncToAudio();
|
g_System->SyncToAudio();
|
||||||
}
|
}
|
||||||
WriteTrace(TraceAudio,__FUNCTION__ ": Done");
|
WriteTrace(TraceAudio, __FUNCTION__ ": Done");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAudio::BusyTimerDone()
|
void CAudio::BusyTimerDone()
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ ": Start (m_SecondBuff = %d)",m_SecondBuff);
|
WriteTraceF(TraceAudio, __FUNCTION__ ": Start (m_SecondBuff = %d)", m_SecondBuff);
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
m_Status &= ~ai_busy;
|
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))
|
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(uint32_t Dacrate, uint32_t System)
|
||||||
void CAudio::SetFrequency (DWORD Dacrate, DWORD System)
|
|
||||||
{
|
{
|
||||||
WriteTraceF(TraceAudio,__FUNCTION__ "(Dacrate: %X System: %d): AI_BITRATE_REG = %X",Dacrate,System,g_Reg->AI_BITRATE_REG);
|
WriteTraceF(TraceAudio, __FUNCTION__ "(Dacrate: %X System: %d): AI_BITRATE_REG = %X", Dacrate, System, g_Reg->AI_BITRATE_REG);
|
||||||
DWORD Frequency;
|
uint32_t Frequency;
|
||||||
|
|
||||||
switch (System)
|
switch (System)
|
||||||
{
|
{
|
||||||
case SYSTEM_PAL: Frequency = 49656530 / (Dacrate + 1); break;
|
case SYSTEM_PAL: Frequency = 49656530 / (Dacrate + 1); break;
|
||||||
case SYSTEM_MPAL: Frequency = 48628316 / (Dacrate + 1); break;
|
case SYSTEM_MPAL: Frequency = 48628316 / (Dacrate + 1); break;
|
||||||
default: Frequency = 48681812 / (Dacrate + 1); break;
|
default: Frequency = 48681812 / (Dacrate + 1); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//nBlockAlign = 16 / 8 * 2;
|
//nBlockAlign = 16 / 8 * 2;
|
||||||
m_BytesPerSecond = Frequency * 4;
|
m_BytesPerSecond = Frequency * 4;
|
||||||
//m_BytesPerSecond = 194532;
|
//m_BytesPerSecond = 194532;
|
||||||
//m_BytesPerSecond = 128024;
|
//m_BytesPerSecond = 128024;
|
||||||
|
|
||||||
m_FramesPerSecond = System == SYSTEM_PAL ? 50 : 60;
|
m_FramesPerSecond = System == SYSTEM_PAL ? 50 : 60;
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,29 +11,32 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CAudio
|
class CAudio
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ai_full = 0x80000000,
|
ai_full = 0x80000000,
|
||||||
ai_busy = 0x40000000,
|
ai_busy = 0x40000000,
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
CAudio();
|
CAudio();
|
||||||
~CAudio();
|
~CAudio();
|
||||||
|
|
||||||
DWORD GetLength ();
|
uint32_t GetLength ();
|
||||||
DWORD GetStatus ();
|
uint32_t GetStatus ();
|
||||||
void LenChanged ();
|
void LenChanged ();
|
||||||
void InterruptTimerDone();
|
void InterruptTimerDone();
|
||||||
void BusyTimerDone ();
|
void BusyTimerDone ();
|
||||||
void Reset ();
|
void Reset ();
|
||||||
void SetViIntr ( DWORD VI_INTR_TIME );
|
void SetViIntr ( uint32_t VI_INTR_TIME );
|
||||||
void SetFrequency ( DWORD Dacrate, DWORD System );
|
void SetFrequency ( uint32_t Dacrate, uint32_t System );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DWORD m_SecondBuff;
|
CAudio(const CAudio&); // Disable copy constructor
|
||||||
DWORD m_Status;
|
CAudio& operator=(const CAudio&); // Disable assignment
|
||||||
DWORD m_BytesPerSecond;
|
|
||||||
int m_CountsPerByte;
|
uint32_t m_SecondBuff;
|
||||||
int m_FramesPerSecond;
|
uint32_t m_Status;
|
||||||
|
uint32_t m_BytesPerSecond;
|
||||||
|
int32_t m_CountsPerByte;
|
||||||
|
int32_t m_FramesPerSecond;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,355 +11,362 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
|
||||||
CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) :
|
CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) :
|
||||||
m_FlashRam(FlashRam),
|
m_FlashRam(FlashRam),
|
||||||
m_Sram(Sram)
|
m_Sram(Sram)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::OnFirstDMA()
|
void CDMA::OnFirstDMA()
|
||||||
{
|
{
|
||||||
switch (g_Rom->CicChipID())
|
int16_t offset;
|
||||||
{
|
const uint32_t base = 0x00000000;
|
||||||
case CIC_NUS_6101: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
const uint32_t rt = g_MMU->RdramSize();
|
||||||
case CIC_NUS_5167: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
|
||||||
case CIC_UNKNOWN:
|
switch (g_Rom->CicChipID())
|
||||||
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_6101: offset = +0x0318; break;
|
||||||
case CIC_NUS_6105: *(DWORD *)&((g_MMU->Rdram())[0x3F0]) = g_MMU->RdramSize(); break;
|
case CIC_NUS_5167: offset = +0x0318; break;
|
||||||
case CIC_NUS_6106: *(DWORD *)&((g_MMU->Rdram())[0x318]) = g_MMU->RdramSize(); break;
|
case CIC_UNKNOWN:
|
||||||
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()
|
void CDMA::PI_DMA_READ()
|
||||||
{
|
{
|
||||||
// PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
// PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
||||||
DWORD PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1;
|
uint32_t PI_RD_LEN_REG = ((g_Reg->PI_RD_LEN_REG) & 0x00FFFFFFul) + 1;
|
||||||
|
|
||||||
if ((PI_RD_LEN_REG & 1) != 0)
|
if ((PI_RD_LEN_REG & 1) != 0)
|
||||||
{
|
{
|
||||||
PI_RD_LEN_REG += 1;
|
PI_RD_LEN_REG += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize())
|
|
||||||
{
|
|
||||||
if (bHaveDebugger())
|
|
||||||
{
|
|
||||||
g_Notify->DisplayError(stdstr_f("PI_DMA_READ not in Memory: %08X", g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG).ToUTF16().c_str());
|
|
||||||
}
|
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
|
||||||
g_Reg->CheckInterrupts();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Write ROM Area (for 64DD Convert)
|
if (g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG > g_MMU->RdramSize())
|
||||||
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FBFFFFF && g_Settings->LoadBool(Game_AllowROMWrites))
|
{
|
||||||
{
|
if (bHaveDebugger())
|
||||||
DWORD i;
|
{
|
||||||
BYTE * ROM = g_Rom->GetRomAddress();
|
g_Notify->DisplayError(stdstr_f("PI_DMA_READ not in Memory: %08X", g_Reg->PI_DRAM_ADDR_REG + PI_RD_LEN_REG).ToUTF16().c_str());
|
||||||
BYTE * RDRAM = g_MMU->Rdram();
|
}
|
||||||
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
|
g_Reg->CheckInterrupts();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD OldProtect;
|
//Write ROM Area (for 64DD Convert)
|
||||||
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READWRITE, &OldProtect);
|
if (g_Reg->PI_CART_ADDR_REG >= 0x10000000 && g_Reg->PI_CART_ADDR_REG <= 0x1FBFFFFF && g_Settings->LoadBool(Game_AllowROMWrites))
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
uint8_t * ROM = g_Rom->GetRomAddress();
|
||||||
|
uint8_t * RDRAM = g_MMU->Rdram();
|
||||||
|
|
||||||
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
|
DWORD OldProtect;
|
||||||
if (g_Reg->PI_CART_ADDR_REG + PI_RD_LEN_REG < g_Rom->GetRomSize())
|
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READWRITE, &OldProtect);
|
||||||
{
|
|
||||||
for (i = 0; i < PI_RD_LEN_REG; i++)
|
|
||||||
{
|
|
||||||
*(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DWORD Len;
|
|
||||||
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
|
||||||
for (i = 0; i < Len; i++)
|
|
||||||
{
|
|
||||||
*(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_Reg->PI_CART_ADDR_REG += 0x10000000;
|
|
||||||
|
|
||||||
if (!g_System->DmaUsed())
|
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
|
||||||
{
|
if (g_Reg->PI_CART_ADDR_REG + PI_RD_LEN_REG < g_Rom->GetRomSize())
|
||||||
g_System->SetDmaUsed(true);
|
{
|
||||||
OnFirstDMA();
|
for (i = 0; i < PI_RD_LEN_REG; i++)
|
||||||
}
|
{
|
||||||
if (g_Recompiler && g_System->bSMM_PIDMA())
|
*(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3));
|
||||||
{
|
}
|
||||||
g_Recompiler->ClearRecompCode_Phys(g_Reg->PI_DRAM_ADDR_REG, g_Reg->PI_WR_LEN_REG, CRecompiler::Remove_DMA);
|
}
|
||||||
}
|
else
|
||||||
|
{
|
||||||
|
uint32_t Len;
|
||||||
|
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
||||||
|
for (i = 0; i < Len; i++)
|
||||||
|
{
|
||||||
|
*(ROM + ((g_Reg->PI_CART_ADDR_REG + i) ^ 3)) = *(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_Reg->PI_CART_ADDR_REG += 0x10000000;
|
||||||
|
|
||||||
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READONLY, &OldProtect);
|
if (!g_System->DmaUsed())
|
||||||
|
{
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_System->SetDmaUsed(true);
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
OnFirstDMA();
|
||||||
g_Reg->CheckInterrupts();
|
}
|
||||||
return;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
if ( g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000)
|
VirtualProtect(ROM, g_Rom->GetRomSize(), PAGE_READONLY, &OldProtect);
|
||||||
{
|
|
||||||
if (g_System->m_SaveUsing == SaveChip_Auto)
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
{
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_System->m_SaveUsing = SaveChip_Sram;
|
g_Reg->CheckInterrupts();
|
||||||
}
|
return;
|
||||||
if (g_System->m_SaveUsing == SaveChip_Sram)
|
}
|
||||||
{
|
|
||||||
m_Sram.DmaToSram(
|
if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG <= 0x08010000)
|
||||||
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
|
{
|
||||||
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
if (g_System->m_SaveUsing == SaveChip_Auto)
|
||||||
PI_RD_LEN_REG
|
{
|
||||||
);
|
g_System->m_SaveUsing = SaveChip_Sram;
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
}
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
if (g_System->m_SaveUsing == SaveChip_Sram)
|
||||||
g_Reg->CheckInterrupts();
|
{
|
||||||
return;
|
m_Sram.DmaToSram(
|
||||||
}
|
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
|
||||||
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
{
|
PI_RD_LEN_REG
|
||||||
m_FlashRam.DmaToFlashram(
|
);
|
||||||
g_MMU->Rdram()+g_Reg->PI_DRAM_ADDR_REG,
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
PI_RD_LEN_REG
|
g_Reg->CheckInterrupts();
|
||||||
);
|
return;
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
}
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
||||||
g_Reg->CheckInterrupts();
|
{
|
||||||
return;
|
m_FlashRam.DmaToFlashram(
|
||||||
}
|
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
|
||||||
}
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
PI_RD_LEN_REG
|
||||||
{
|
);
|
||||||
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->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->CheckInterrupts();
|
||||||
g_Reg->CheckInterrupts();
|
return;
|
||||||
return;
|
}
|
||||||
}
|
}
|
||||||
if (bHaveDebugger())
|
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
||||||
{
|
{
|
||||||
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("**** 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->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->CheckInterrupts();
|
||||||
g_Reg->CheckInterrupts();
|
return;
|
||||||
return;
|
}
|
||||||
|
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_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
|
g_Reg->CheckInterrupts();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::PI_DMA_WRITE()
|
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)
|
if ((PI_WR_LEN_REG & 1) != 0)
|
||||||
{
|
{
|
||||||
PI_WR_LEN_REG += 1; /* fixes AI Shougi 3, Doraemon 3, etc. */
|
PI_WR_LEN_REG += 1; /* fixes AI Shougi 3, Doraemon 3, etc. */
|
||||||
}
|
}
|
||||||
|
|
||||||
g_Reg->PI_STATUS_REG |= PI_STATUS_DMA_BUSY;
|
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()); }
|
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;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
return;
|
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)
|
if (g_System->m_SaveUsing == SaveChip_Auto)
|
||||||
{
|
{
|
||||||
g_System->m_SaveUsing = SaveChip_Sram;
|
g_System->m_SaveUsing = SaveChip_Sram;
|
||||||
}
|
}
|
||||||
if (g_System->m_SaveUsing == SaveChip_Sram)
|
if (g_System->m_SaveUsing == SaveChip_Sram)
|
||||||
{
|
{
|
||||||
m_Sram.DmaFromSram(
|
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,
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
PI_WR_LEN_REG
|
PI_WR_LEN_REG
|
||||||
);
|
);
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
if (g_System->m_SaveUsing == SaveChip_FlashRam)
|
||||||
{
|
{
|
||||||
m_FlashRam.DmaFromFlashram(
|
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,
|
g_Reg->PI_CART_ADDR_REG - 0x08000000,
|
||||||
PI_WR_LEN_REG
|
PI_WR_LEN_REG
|
||||||
);
|
);
|
||||||
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
}
|
}
|
||||||
return;
|
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 tofix
|
||||||
#ifdef ROM_IN_MAPSPACE
|
#ifdef ROM_IN_MAPSPACE
|
||||||
if (WrittenToRom)
|
if (WrittenToRom)
|
||||||
{
|
{
|
||||||
DWORD OldProtect;
|
uint32_t OldProtect;
|
||||||
VirtualProtect(ROM,m_RomFileSize,PAGE_READONLY, &OldProtect);
|
VirtualProtect(ROM,m_RomFileSize,PAGE_READONLY, &OldProtect);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
BYTE * ROM = g_Rom->GetRomAddress();
|
uint8_t * ROM = g_Rom->GetRomAddress();
|
||||||
BYTE * RDRAM = g_MMU->Rdram();
|
uint8_t * RDRAM = g_MMU->Rdram();
|
||||||
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
|
g_Reg->PI_CART_ADDR_REG -= 0x10000000;
|
||||||
if (g_Reg->PI_CART_ADDR_REG + PI_WR_LEN_REG < g_Rom->GetRomSize())
|
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())
|
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())
|
while (cart >= g_Rom->GetRomSize())
|
||||||
{
|
{
|
||||||
cart -= g_Rom->GetRomSize();
|
cart -= 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 + ((cart + i) ^ 3));
|
*(RDRAM + ((g_Reg->PI_DRAM_ADDR_REG + i) ^ 3)) = *(ROM + ((cart + i) ^ 3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DWORD Len;
|
uint32_t Len;
|
||||||
Len = g_Rom->GetRomSize() - g_Reg->PI_CART_ADDR_REG;
|
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;
|
g_Reg->PI_CART_ADDR_REG += 0x10000000;
|
||||||
|
|
||||||
if (!g_System->DmaUsed())
|
if (!g_System->DmaUsed())
|
||||||
{
|
{
|
||||||
g_System->SetDmaUsed(true);
|
g_System->SetDmaUsed(true);
|
||||||
OnFirstDMA();
|
OnFirstDMA();
|
||||||
}
|
}
|
||||||
if (g_Recompiler && g_System->bSMM_PIDMA())
|
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->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
|
||||||
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
g_Reg->MI_INTR_REG |= MI_INTR_PI;
|
||||||
g_Reg->CheckInterrupts();
|
g_Reg->CheckInterrupts();
|
||||||
//ChangeTimer(PiTimer,(int)(PI_WR_LEN_REG * 8.9) + 50);
|
//ChangeTimer(PiTimer,(int32_t)(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));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory))
|
|
||||||
{
|
|
||||||
g_Notify->DisplayError(stdstr_f("PI_DMA_WRITE not in ROM: %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();
|
|
||||||
|
|
||||||
|
if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory))
|
||||||
|
{
|
||||||
|
g_Notify->DisplayError(stdstr_f("PI_DMA_WRITE not in ROM: %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();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::SP_DMA_READ()
|
void CDMA::SP_DMA_READ()
|
||||||
{
|
{
|
||||||
g_Reg->SP_DRAM_ADDR_REG &= 0x1FFFFFFF;
|
g_Reg->SP_DRAM_ADDR_REG &= 0x1FFFFFFF;
|
||||||
|
|
||||||
if (g_Reg->SP_DRAM_ADDR_REG > g_MMU->RdramSize())
|
if (g_Reg->SP_DRAM_ADDR_REG > g_MMU->RdramSize())
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f(__FUNCTION__ "\nSP_DRAM_ADDR_REG not in RDRam space : % 08X", g_Reg->SP_DRAM_ADDR_REG).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f(__FUNCTION__ "\nSP_DRAM_ADDR_REG not in RDRam space : % 08X", g_Reg->SP_DRAM_ADDR_REG).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
g_Reg->SP_DMA_BUSY_REG = 0;
|
g_Reg->SP_DMA_BUSY_REG = 0;
|
||||||
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_Reg->SP_RD_LEN_REG + 1 + (g_Reg->SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
|
||||||
{
|
|
||||||
if (bHaveDebugger())
|
|
||||||
{
|
|
||||||
g_Notify->DisplayError(__FUNCTIONW__ L"\nCould not fit copy in memory segment");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
|
||||||
{
|
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
|
||||||
}
|
|
||||||
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
|
||||||
{
|
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
|
||||||
}
|
|
||||||
if (((g_Reg->SP_RD_LEN_REG + 1) & 3) != 0)
|
|
||||||
{
|
|
||||||
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,
|
if (g_Reg->SP_RD_LEN_REG + 1 + (g_Reg->SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
||||||
g_Reg->SP_RD_LEN_REG + 1 );
|
{
|
||||||
|
if (bHaveDebugger())
|
||||||
g_Reg->SP_DMA_BUSY_REG = 0;
|
{
|
||||||
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
g_Notify->DisplayError(__FUNCTIONW__ L"\nCould not fit copy in memory segment");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
|
}
|
||||||
|
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
|
}
|
||||||
|
if (((g_Reg->SP_RD_LEN_REG + 1) & 3) != 0)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
g_Reg->SP_DMA_BUSY_REG = 0;
|
||||||
|
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMA::SP_DMA_WRITE()
|
void CDMA::SP_DMA_WRITE()
|
||||||
{
|
{
|
||||||
if (g_Reg->SP_DRAM_ADDR_REG > g_MMU->RdramSize())
|
if (g_Reg->SP_DRAM_ADDR_REG > g_MMU->RdramSize())
|
||||||
{
|
{
|
||||||
if (bHaveDebugger())
|
if (bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(stdstr_f(__FUNCTION__ "\nSP_DRAM_ADDR_REG not in RDRam space : % 08X", g_Reg->SP_DRAM_ADDR_REG).ToUTF16().c_str());
|
g_Notify->DisplayError(stdstr_f(__FUNCTION__ "\nSP_DRAM_ADDR_REG not in RDRam space : % 08X", g_Reg->SP_DRAM_ADDR_REG).ToUTF16().c_str());
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_Reg->SP_WR_LEN_REG + 1 + (g_Reg->SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
|
||||||
{
|
|
||||||
if (bHaveDebugger())
|
|
||||||
{
|
|
||||||
g_Notify->DisplayError(L"SP DMA WRITE\ncould not fit copy in memory segement");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
if (g_Reg->SP_WR_LEN_REG + 1 + (g_Reg->SP_MEM_ADDR_REG & 0xFFF) > 0x1000)
|
||||||
{
|
{
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
if (bHaveDebugger())
|
||||||
}
|
{
|
||||||
|
g_Notify->DisplayError(L"SP DMA WRITE\ncould not fit copy in memory segement");
|
||||||
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
}
|
||||||
{
|
return;
|
||||||
g_Notify->BreakPoint(__FILEW__,__LINE__);
|
}
|
||||||
}
|
|
||||||
if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0)
|
|
||||||
{
|
|
||||||
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),
|
if ((g_Reg->SP_MEM_ADDR_REG & 3) != 0)
|
||||||
g_Reg->SP_WR_LEN_REG + 1);
|
{
|
||||||
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
g_Reg->SP_DMA_BUSY_REG = 0;
|
}
|
||||||
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
|
||||||
}
|
if ((g_Reg->SP_DRAM_ADDR_REG & 3) != 0)
|
||||||
|
{
|
||||||
|
g_Notify->BreakPoint(__FILEW__, __LINE__);
|
||||||
|
}
|
||||||
|
if (((g_Reg->SP_WR_LEN_REG + 1) & 3) != 0)
|
||||||
|
{
|
||||||
|
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),
|
||||||
|
g_Reg->SP_WR_LEN_REG + 1);
|
||||||
|
|
||||||
|
g_Reg->SP_DMA_BUSY_REG = 0;
|
||||||
|
g_Reg->SP_STATUS_REG &= ~SP_STATUS_DMA_BUSY;
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,27 +9,30 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <Project64\Settings\Debug Settings.h>
|
||||||
|
#include <Project64\N64 System\Mips\FlashRam.h>
|
||||||
|
#include <Project64\N64 System\Mips\Sram.h>
|
||||||
|
|
||||||
class CDMA :
|
class CDMA :
|
||||||
private CDebugSettings
|
private CDebugSettings
|
||||||
{
|
{
|
||||||
CDMA();
|
CDMA();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void SP_DMA_READ();
|
void SP_DMA_READ();
|
||||||
void SP_DMA_WRITE();
|
void SP_DMA_WRITE();
|
||||||
void PI_DMA_READ();
|
void PI_DMA_READ();
|
||||||
void PI_DMA_WRITE();
|
void PI_DMA_WRITE();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CDMA (CFlashram & FlashRam, CSram & Sram);
|
CDMA(CFlashram & FlashRam, CSram & Sram);
|
||||||
|
|
||||||
//void SI_DMA_READ();
|
|
||||||
//void SI_DMA_WRITE();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CFlashram & m_FlashRam;
|
CDMA(const CDMA&); // Disable copy constructor
|
||||||
CSram & m_Sram;
|
CDMA& operator=(const CDMA&); // Disable assignment
|
||||||
|
|
||||||
void OnFirstDMA();
|
CFlashram & m_FlashRam;
|
||||||
|
CSram & m_Sram;
|
||||||
|
|
||||||
|
void OnFirstDMA();
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -9,190 +9,193 @@
|
||||||
* *
|
* *
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
|
#include "Eeprom.h"
|
||||||
|
#include <Project64\N64 System\System Globals.h>
|
||||||
|
#include <Project64\N64 System\N64 Class.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
CEeprom::CEeprom(bool ReadOnly):
|
CEeprom::CEeprom(bool ReadOnly) :
|
||||||
m_ReadOnly(ReadOnly),
|
m_ReadOnly(ReadOnly),
|
||||||
m_hFile(NULL)
|
m_hFile(NULL)
|
||||||
{
|
{
|
||||||
memset(m_EEPROM,0xFF,sizeof(m_EEPROM));
|
memset(m_EEPROM, 0xFF, sizeof(m_EEPROM));
|
||||||
}
|
}
|
||||||
|
|
||||||
CEeprom::~CEeprom()
|
CEeprom::~CEeprom()
|
||||||
{
|
{
|
||||||
if (m_hFile)
|
if (m_hFile)
|
||||||
{
|
{
|
||||||
CloseHandle(m_hFile);
|
CloseHandle(m_hFile);
|
||||||
m_hFile = NULL;
|
m_hFile = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char byte2bcd(int n)
|
uint8_t byte2bcd(int32_t n)
|
||||||
{
|
{
|
||||||
n %= 100;
|
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;
|
time_t curtime_time;
|
||||||
struct tm curtime;
|
struct tm curtime;
|
||||||
|
|
||||||
if (g_System->m_SaveUsing == SaveChip_Auto)
|
if (g_System->m_SaveUsing == SaveChip_Auto)
|
||||||
{
|
{
|
||||||
g_System->m_SaveUsing = SaveChip_Eeprom_4K;
|
g_System->m_SaveUsing = SaveChip_Eeprom_4K;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Command[2])
|
switch (Command[2])
|
||||||
{
|
{
|
||||||
case 0: // check
|
case 0: // check
|
||||||
if (g_System->m_SaveUsing != SaveChip_Eeprom_4K && g_System->m_SaveUsing != SaveChip_Eeprom_16K)
|
if (g_System->m_SaveUsing != SaveChip_Eeprom_4K && g_System->m_SaveUsing != SaveChip_Eeprom_16K)
|
||||||
{
|
{
|
||||||
Command[1] |= 0x80;
|
Command[1] |= 0x80;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Command[1] != 3)
|
if (Command[1] != 3)
|
||||||
{
|
{
|
||||||
Command[1] |= 0x40;
|
Command[1] |= 0x40;
|
||||||
if ((Command[1] & 3) > 0)
|
if ((Command[1] & 3) > 0)
|
||||||
Command[3] = 0x00;
|
Command[3] = 0x00;
|
||||||
if ((Command[1] & 3) > 1)
|
if ((Command[1] & 3) > 1)
|
||||||
Command[4] = (g_System->m_SaveUsing == SaveChip_Eeprom_4K) ? 0x80 : 0xC0;
|
Command[4] = (g_System->m_SaveUsing == SaveChip_Eeprom_4K) ? 0x80 : 0xC0;
|
||||||
if ((Command[1] & 3) > 2)
|
if ((Command[1] & 3) > 2)
|
||||||
Command[5] = 0x00;
|
Command[5] = 0x00;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Command[3] = 0x00;
|
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;
|
Command[5] = 0x00;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4: // Read from Eeprom
|
case 4: // Read from Eeprom
|
||||||
if (Command[0] != 2 && bHaveDebugger())
|
if (Command[0] != 2 && bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
||||||
}
|
}
|
||||||
if (Command[1] != 8 && bHaveDebugger())
|
if (Command[1] != 8 && bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"What am I meant to do with this Eeprom 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;
|
break;
|
||||||
case 5: //Write to Eeprom
|
case 5: //Write to Eeprom
|
||||||
if (Command[0] != 10 && bHaveDebugger())
|
if (Command[0] != 10 && bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
g_Notify->DisplayError(L"What am I meant to do with this Eeprom Command");
|
||||||
}
|
}
|
||||||
if (Command[1] != 1 && bHaveDebugger())
|
if (Command[1] != 1 && bHaveDebugger())
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"What am I meant to do with this Eeprom 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;
|
break;
|
||||||
case 6: //RTC Status query
|
case 6: //RTC Status query
|
||||||
Command[3] = 0x00;
|
Command[3] = 0x00;
|
||||||
Command[4] = 0x10;
|
Command[4] = 0x10;
|
||||||
Command[5] = 0x00;
|
Command[5] = 0x00;
|
||||||
break;
|
break;
|
||||||
case 7: //Read RTC block
|
case 7: //Read RTC block
|
||||||
switch (Command[3])
|
switch (Command[3])
|
||||||
{
|
{
|
||||||
case 0: //Block number
|
case 0: //Block number
|
||||||
Command[4] = 0x00;
|
Command[4] = 0x00;
|
||||||
Command[5] = 0x02;
|
Command[5] = 0x02;
|
||||||
Command[12] = 0x00;
|
Command[12] = 0x00;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
//read block, Command[2], Unimplemented
|
//read block, Command[2], Unimplemented
|
||||||
break;
|
break;
|
||||||
case 2: //Set RTC Time
|
case 2: //Set RTC Time
|
||||||
time(&curtime_time);
|
time(&curtime_time);
|
||||||
memcpy(&curtime, localtime(&curtime_time), sizeof(curtime)); // fd's fix
|
memcpy(&curtime, localtime(&curtime_time), sizeof(curtime)); // fd's fix
|
||||||
Command[4] = byte2bcd(curtime.tm_sec);
|
Command[4] = byte2bcd(curtime.tm_sec);
|
||||||
Command[5] = byte2bcd(curtime.tm_min);
|
Command[5] = byte2bcd(curtime.tm_min);
|
||||||
Command[6] = 0x80 + byte2bcd(curtime.tm_hour);
|
Command[6] = 0x80 + byte2bcd(curtime.tm_hour);
|
||||||
Command[7] = byte2bcd(curtime.tm_mday);
|
Command[7] = byte2bcd(curtime.tm_mday);
|
||||||
Command[8] = byte2bcd(curtime.tm_wday);
|
Command[8] = byte2bcd(curtime.tm_wday);
|
||||||
Command[9] = byte2bcd(curtime.tm_mon + 1);
|
Command[9] = byte2bcd(curtime.tm_mon + 1);
|
||||||
Command[10] = byte2bcd(curtime.tm_year);
|
Command[10] = byte2bcd(curtime.tm_year);
|
||||||
Command[11] = byte2bcd(curtime.tm_year / 100);
|
Command[11] = byte2bcd(curtime.tm_year / 100);
|
||||||
Command[12] = 0x00; // status
|
Command[12] = 0x00; // status
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
//Write RTC, unimplemented
|
//Write RTC, unimplemented
|
||||||
if (g_Settings->LoadDword(Debugger_ShowPifErrors))
|
if (g_Settings->LoadDword(Debugger_ShowPifErrors))
|
||||||
{
|
{
|
||||||
g_Notify->DisplayError(L"Write RTC, unimplemented");
|
g_Notify->DisplayError(L"Write RTC, unimplemented");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (g_Settings->LoadDword(Debugger_ShowPifErrors))
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CEeprom::LoadEeprom()
|
void CEeprom::LoadEeprom()
|
||||||
{
|
{
|
||||||
CPath FileName;
|
CPath FileName;
|
||||||
DWORD dwRead;
|
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.SetName(g_Settings->LoadStringVal(Game_GameName).c_str());
|
||||||
FileName.SetExtension("eep");
|
FileName.SetExtension("eep");
|
||||||
|
|
||||||
if (!FileName.DirectoryExists())
|
if (!FileName.DirectoryExists())
|
||||||
{
|
{
|
||||||
FileName.DirectoryCreate();
|
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);
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS, NULL);
|
||||||
if (m_hFile == INVALID_HANDLE_VALUE)
|
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));
|
g_Notify->DisplayError(GS(MSG_FAIL_OPEN_EEPROM));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SetFilePointer(m_hFile,0,NULL,FILE_BEGIN);
|
SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN);
|
||||||
ReadFile(m_hFile,m_EEPROM,sizeof(m_EEPROM),&dwRead,NULL);
|
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)
|
if (m_hFile == NULL)
|
||||||
{
|
{
|
||||||
LoadEeprom();
|
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;
|
DWORD dwWritten;
|
||||||
int i;
|
int32_t i;
|
||||||
|
|
||||||
if (m_hFile == NULL)
|
if (m_hFile == NULL)
|
||||||
{
|
{
|
||||||
LoadEeprom();
|
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);
|
SetFilePointer(m_hFile, line * 8, NULL, FILE_BEGIN);
|
||||||
WriteFile( m_hFile,Buffer,8,&dwWritten,NULL );
|
WriteFile(m_hFile, Buffer, 8, &dwWritten, NULL);
|
||||||
FlushFileBuffers(m_hFile);
|
FlushFileBuffers(m_hFile);
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -11,20 +11,24 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class CEeprom :
|
class CEeprom :
|
||||||
private CDebugSettings
|
private CDebugSettings
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CEeprom ( bool ReadOnly );
|
CEeprom(bool ReadOnly);
|
||||||
~CEeprom();
|
~CEeprom();
|
||||||
|
|
||||||
void EepromCommand ( BYTE * Command );
|
void EepromCommand(uint8_t * Command);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void LoadEeprom ();
|
CEeprom(void); // Disable default constructor
|
||||||
void ReadFrom ( BYTE * Buffer, int line );
|
CEeprom(const CEeprom&); // Disable copy constructor
|
||||||
void WriteTo ( BYTE * Buffer, int line );
|
CEeprom& operator=(const CEeprom&); // Disable assignment
|
||||||
|
|
||||||
BYTE m_EEPROM[0x800];
|
void LoadEeprom();
|
||||||
bool m_ReadOnly;
|
void ReadFrom(uint8_t * Buffer, int32_t line);
|
||||||
HANDLE m_hFile;
|
void WriteTo(uint8_t * Buffer, int32_t line);
|
||||||
|
|
||||||
|
uint8_t m_EEPROM[0x800];
|
||||||
|
bool m_ReadOnly;
|
||||||
|
void * m_hFile;
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* *
|
* *
|
||||||
* Project 64 - A Nintendo 64 emulator. *
|
* Project64 - A Nintendo 64 emulator. *
|
||||||
* http://www.pj64-emu.com/ *
|
* http://www.pj64-emu.com/ *
|
||||||
* Copyright (C) 2012 Project64. All rights reserved. *
|
* Copyright (C) 2012 Project64. All rights reserved. *
|
||||||
* *
|
* *
|
||||||
|
@ -10,78 +10,75 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#pragma once
|
#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
|
//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 uint8_t * Rdram () = 0;
|
||||||
virtual BYTE * Rdram () = 0;
|
virtual uint32_t RdramSize() = 0;
|
||||||
virtual DWORD RdramSize() = 0;
|
virtual uint8_t * Dmem () = 0;
|
||||||
virtual BYTE * Dmem () = 0;
|
virtual uint8_t * Imem () = 0;
|
||||||
virtual BYTE * Imem () = 0;
|
virtual uint8_t * PifRam () = 0;
|
||||||
virtual BYTE * 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_PAddr ( DWORD PAddr, BYTE & Value ) = 0;
|
virtual bool LB_VAddr ( uint32_t VAddr, uint8_t & Value ) = 0;
|
||||||
virtual bool LH_PAddr ( DWORD PAddr, WORD & Value ) = 0;
|
virtual bool LH_VAddr ( uint32_t VAddr, uint16_t & Value ) = 0;
|
||||||
virtual bool LW_PAddr ( DWORD PAddr, DWORD & Value ) = 0;
|
virtual bool LW_VAddr ( uint32_t VAddr, uint32_t & Value ) = 0;
|
||||||
virtual bool LD_PAddr ( DWORD PAddr, QWORD & Value ) = 0;
|
virtual bool LD_VAddr ( uint32_t VAddr, uint64_t & Value ) = 0;
|
||||||
|
|
||||||
virtual bool SB_VAddr ( DWORD VAddr, BYTE Value ) = 0;
|
virtual bool LB_PAddr ( uint32_t PAddr, uint8_t & Value ) = 0;
|
||||||
virtual bool SH_VAddr ( DWORD VAddr, WORD Value ) = 0;
|
virtual bool LH_PAddr ( uint32_t PAddr, uint16_t & Value ) = 0;
|
||||||
virtual bool SW_VAddr ( DWORD VAddr, DWORD Value ) = 0;
|
virtual bool LW_PAddr ( uint32_t PAddr, uint32_t & Value ) = 0;
|
||||||
virtual bool SD_VAddr ( DWORD VAddr, QWORD Value ) = 0;
|
virtual bool LD_PAddr ( uint32_t PAddr, uint64_t & Value ) = 0;
|
||||||
|
|
||||||
virtual bool SB_PAddr ( DWORD PAddr, BYTE Value ) = 0;
|
virtual bool SB_VAddr ( uint32_t VAddr, uint8_t Value ) = 0;
|
||||||
virtual bool SH_PAddr ( DWORD PAddr, WORD Value ) = 0;
|
virtual bool SH_VAddr ( uint32_t VAddr, uint16_t Value ) = 0;
|
||||||
virtual bool SW_PAddr ( DWORD PAddr, DWORD Value ) = 0;
|
virtual bool SW_VAddr ( uint32_t VAddr, uint32_t Value ) = 0;
|
||||||
virtual bool SD_PAddr ( DWORD PAddr, QWORD Value ) = 0;
|
virtual bool SD_VAddr ( uint32_t VAddr, uint64_t Value ) = 0;
|
||||||
|
|
||||||
virtual bool ValidVaddr ( DWORD VAddr ) const = 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 int MemoryFilter ( DWORD dwExptCode, void * lpExceptionPointer ) = 0;
|
virtual bool ValidVaddr ( uint32_t VAddr ) const = 0;
|
||||||
virtual void UpdateFieldSerration ( unsigned int interlaced ) = 0;
|
|
||||||
|
|
||||||
//Protect the Memory from being written to
|
virtual int32_t MemoryFilter ( uint32_t dwExptCode, void * lpExceptionPointer ) = 0;
|
||||||
virtual void ProtectMemory ( DWORD StartVaddr, DWORD EndVaddr ) = 0;
|
virtual void UpdateFieldSerration ( uint32_t interlaced ) = 0;
|
||||||
virtual void UnProtectMemory ( DWORD StartVaddr, DWORD EndVaddr ) = 0;
|
|
||||||
|
|
||||||
//Compilation Functions
|
//Protect the Memory from being written to
|
||||||
virtual void ResetMemoryStack () = 0;
|
virtual void ProtectMemory ( uint32_t StartVaddr, uint32_t EndVaddr ) = 0;
|
||||||
|
virtual void UnProtectMemory ( uint32_t StartVaddr, uint32_t EndVaddr ) = 0;
|
||||||
virtual void Compile_LB () = 0;
|
|
||||||
virtual void Compile_LBU () = 0;
|
//Compilation Functions
|
||||||
virtual void Compile_LH () = 0;
|
virtual void ResetMemoryStack () = 0;
|
||||||
virtual void Compile_LHU () = 0;
|
|
||||||
virtual void Compile_LW () = 0;
|
virtual void Compile_LB () = 0;
|
||||||
virtual void Compile_LL () = 0;
|
virtual void Compile_LBU () = 0;
|
||||||
virtual void Compile_LWC1 () = 0;
|
virtual void Compile_LH () = 0;
|
||||||
virtual void Compile_LWU () = 0;
|
virtual void Compile_LHU () = 0;
|
||||||
virtual void Compile_LWL () = 0;
|
virtual void Compile_LW () = 0;
|
||||||
virtual void Compile_LWR () = 0;
|
virtual void Compile_LL () = 0;
|
||||||
virtual void Compile_LD () = 0;
|
virtual void Compile_LWC1 () = 0;
|
||||||
virtual void Compile_LDC1 () = 0;
|
virtual void Compile_LWU () = 0;
|
||||||
virtual void Compile_LDL () = 0;
|
virtual void Compile_LWL () = 0;
|
||||||
virtual void Compile_LDR () = 0;
|
virtual void Compile_LWR () = 0;
|
||||||
virtual void Compile_SB () = 0;
|
virtual void Compile_LD () = 0;
|
||||||
virtual void Compile_SH () = 0;
|
virtual void Compile_LDC1 () = 0;
|
||||||
virtual void Compile_SW () = 0;
|
virtual void Compile_LDL () = 0;
|
||||||
virtual void Compile_SWL () = 0;
|
virtual void Compile_LDR () = 0;
|
||||||
virtual void Compile_SWR () = 0;
|
virtual void Compile_SB () = 0;
|
||||||
virtual void Compile_SD () = 0;
|
virtual void Compile_SH () = 0;
|
||||||
virtual void Compile_SDL () = 0;
|
virtual void Compile_SW () = 0;
|
||||||
virtual void Compile_SDR () = 0;
|
virtual void Compile_SWL () = 0;
|
||||||
virtual void Compile_SC () = 0;
|
virtual void Compile_SWR () = 0;
|
||||||
virtual void Compile_SWC1 () = 0;
|
virtual void Compile_SD () = 0;
|
||||||
virtual void Compile_SDC1 () = 0;
|
virtual void Compile_SDL () = 0;
|
||||||
|
virtual void Compile_SDR () = 0;
|
||||||
|
virtual void Compile_SC () = 0;
|
||||||
|
virtual void Compile_SWC1 () = 0;
|
||||||
|
virtual void Compile_SDC1 () = 0;
|
||||||
};
|
};
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue