diff --git a/Purei.xcodeproj/project.pbxproj b/Purei.xcodeproj/project.pbxproj index d89ea2ad..346a3a4d 100644 --- a/Purei.xcodeproj/project.pbxproj +++ b/Purei.xcodeproj/project.pbxproj @@ -90,11 +90,6 @@ 7E93A9A00DA0496500F19184 /* VPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E93A9990DA0496500F19184 /* VPU.cpp */; }; 7E93A9A10DA0496500F19184 /* VPU1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E93A99B0DA0496500F19184 /* VPU1.cpp */; }; 7E93A9A20DA0496500F19184 /* VuExecutor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E93A99D0DA0496500F19184 /* VuExecutor.cpp */; }; - 7E93AAD40DA0935300F19184 /* libboost_filesystem-mt-1_35.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E93AAD00DA0935300F19184 /* libboost_filesystem-mt-1_35.dylib */; }; - 7E93AAD50DA0935300F19184 /* libboost_regex-mt-1_35.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E93AAD10DA0935300F19184 /* libboost_regex-mt-1_35.dylib */; }; - 7E93AAD60DA0935300F19184 /* libboost_signals-mt-1_35.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E93AAD20DA0935300F19184 /* libboost_signals-mt-1_35.dylib */; }; - 7E93AAD70DA0935300F19184 /* libboost_thread-mt-1_35.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E93AAD30DA0935300F19184 /* libboost_thread-mt-1_35.dylib */; }; - 7E93ABC70DA093B100F19184 /* libboost_system-mt-1_35.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7E93ABC60DA093B100F19184 /* libboost_system-mt-1_35.dylib */; }; 7E947ABE0D09F49A00A2AE15 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7E947AB80D09F49A00A2AE15 /* InfoPlist.strings */; }; 7E947ABF0D09F49A00A2AE15 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 7E947ABA0D09F49A00A2AE15 /* MainMenu.nib */; }; 7E947AC00D09F49A00A2AE15 /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 7E947ABC0D09F49A00A2AE15 /* icon.icns */; }; @@ -138,6 +133,35 @@ 7EEF338E0D0B8F63005FE2D8 /* GSH_OpenGLMacOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EEF338D0D0B8F63005FE2D8 /* GSH_OpenGLMacOSX.cpp */; }; 7EEF350F0D0E6E68005FE2D8 /* X86Assembler_Fpu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EEF350E0D0E6E68005FE2D8 /* X86Assembler_Fpu.cpp */; }; 7EF251B20D83124D00D90D20 /* Iop_PadMan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF251B00D83124D00D90D20 /* Iop_PadMan.cpp */; }; + 7EF8E5B9105586E400DB0236 /* Iop_Spu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5B1105586E400DB0236 /* Iop_Spu.cpp */; }; + 7EF8E5BA105586E400DB0236 /* Iop_Spu2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5B3105586E400DB0236 /* Iop_Spu2.cpp */; }; + 7EF8E5BB105586E400DB0236 /* Iop_Spu2_Core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5B5105586E400DB0236 /* Iop_Spu2_Core.cpp */; }; + 7EF8E5BC105586E400DB0236 /* Iop_SpuBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5B7105586E400DB0236 /* Iop_SpuBase.cpp */; }; + 7EF8E5CC1055870B00DB0236 /* Iop_Cdvdman.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5C81055870B00DB0236 /* Iop_Cdvdman.cpp */; }; + 7EF8E5CD1055870B00DB0236 /* Iop_SifMan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5CA1055870B00DB0236 /* Iop_SifMan.cpp */; }; + 7EF8E5E31055874B00DB0236 /* Iop_FileIo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5D71055874B00DB0236 /* Iop_FileIo.cpp */; }; + 7EF8E5E41055874B00DB0236 /* Iop_SifCmd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5D91055874B00DB0236 /* Iop_SifCmd.cpp */; }; + 7EF8E5E51055874B00DB0236 /* Iop_SifDynamic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5DB1055874B00DB0236 /* Iop_SifDynamic.cpp */; }; + 7EF8E5E61055874B00DB0236 /* Iop_SifManNull.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5DD1055874B00DB0236 /* Iop_SifManNull.cpp */; }; + 7EF8E5E71055874B00DB0236 /* Iop_SifManPs2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5DF1055874B00DB0236 /* Iop_SifManPs2.cpp */; }; + 7EF8E5E81055874B00DB0236 /* Iop_Vblank.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5E11055874B00DB0236 /* Iop_Vblank.cpp */; }; + 7EF8E5FD105587B300DB0236 /* Iop_DbcMan320.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E5FB105587B300DB0236 /* Iop_DbcMan320.cpp */; }; + 7EF8E606105587EA00DB0236 /* ElfFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E601105587EA00DB0236 /* ElfFile.cpp */; }; + 7EF8E607105587EA00DB0236 /* PadListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E603105587EA00DB0236 /* PadListener.cpp */; }; + 7EF8E608105587EA00DB0236 /* VuBasicBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EF8E604105587EA00DB0236 /* VuBasicBlock.cpp */; }; + 7EF8E64110558E4400DB0236 /* libboost_filesystem-xgcc40-mt-1_37.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EF8E64010558E4400DB0236 /* libboost_filesystem-xgcc40-mt-1_37.dylib */; }; + 7EF8E64510558E5C00DB0236 /* libboost_thread-xgcc40-mt-1_37.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EF8E64410558E5C00DB0236 /* libboost_thread-xgcc40-mt-1_37.dylib */; }; + 7EF8E64910558E8400DB0236 /* libboost_regex-xgcc40-mt-1_37.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EF8E64810558E8400DB0236 /* libboost_regex-xgcc40-mt-1_37.dylib */; }; + 7EF8E64E10558E9E00DB0236 /* libboost_signals-xgcc40-mt-1_37.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EF8E64C10558E9E00DB0236 /* libboost_signals-xgcc40-mt-1_37.dylib */; }; + 7EF8E64F10558E9E00DB0236 /* libboost_system-xgcc40-mt-1_37.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EF8E64D10558E9E00DB0236 /* libboost_system-xgcc40-mt-1_37.dylib */; }; + 7EFA614010544EAD000BB472 /* ControllerInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA613E10544EAD000BB472 /* ControllerInfo.cpp */; }; + 7EFA615A1054506E000BB472 /* AppConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61581054506E000BB472 /* AppConfig.cpp */; }; + 7EFA61B61054928C000BB472 /* StructCollectionStateFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61B21054928C000BB472 /* StructCollectionStateFile.cpp */; }; + 7EFA61B71054928C000BB472 /* StructFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61B41054928C000BB472 /* StructFile.cpp */; }; + 7EFA61BE105492DB000BB472 /* Iop_SubSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61BC105492DB000BB472 /* Iop_SubSystem.cpp */; }; + 7EFA61C910549312000BB472 /* Iop_Dmac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61C310549312000BB472 /* Iop_Dmac.cpp */; }; + 7EFA61CA10549312000BB472 /* Iop_DmacChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61C510549312000BB472 /* Iop_DmacChannel.cpp */; }; + 7EFA61CB10549312000BB472 /* Iop_RootCounters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7EFA61C710549312000BB472 /* Iop_RootCounters.cpp */; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; /* End PBXBuildFile section */ @@ -309,11 +333,6 @@ 7E93A99C0DA0496500F19184 /* VPU1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VPU1.h; path = Source/VPU1.h; sourceTree = ""; }; 7E93A99D0DA0496500F19184 /* VuExecutor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VuExecutor.cpp; path = Source/VuExecutor.cpp; sourceTree = ""; }; 7E93A99E0DA0496500F19184 /* VUExecutor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VUExecutor.h; path = Source/VUExecutor.h; sourceTree = ""; }; - 7E93AAD00DA0935300F19184 /* libboost_filesystem-mt-1_35.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_filesystem-mt-1_35.dylib"; path = "/usr/local/lib/libboost_filesystem-mt-1_35.dylib"; sourceTree = ""; }; - 7E93AAD10DA0935300F19184 /* libboost_regex-mt-1_35.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_regex-mt-1_35.dylib"; path = "/usr/local/lib/libboost_regex-mt-1_35.dylib"; sourceTree = ""; }; - 7E93AAD20DA0935300F19184 /* libboost_signals-mt-1_35.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_signals-mt-1_35.dylib"; path = "/usr/local/lib/libboost_signals-mt-1_35.dylib"; sourceTree = ""; }; - 7E93AAD30DA0935300F19184 /* libboost_thread-mt-1_35.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_thread-mt-1_35.dylib"; path = "/usr/local/lib/libboost_thread-mt-1_35.dylib"; sourceTree = ""; }; - 7E93ABC60DA093B100F19184 /* libboost_system-mt-1_35.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_system-mt-1_35.dylib"; path = "/usr/local/lib/libboost_system-mt-1_35.dylib"; sourceTree = ""; }; 7E947AB90D09F49A00A2AE15 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = InfoPlist.strings; sourceTree = ""; }; 7E947ABB0D09F49A00A2AE15 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = MainMenu.nib; sourceTree = ""; }; 7E947ABC0D09F49A00A2AE15 /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = icon.icns; path = Source/macosxui/icon.icns; sourceTree = ""; }; @@ -397,6 +416,59 @@ 7EEF350E0D0E6E68005FE2D8 /* X86Assembler_Fpu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = X86Assembler_Fpu.cpp; path = Source/X86Assembler_Fpu.cpp; sourceTree = ""; }; 7EF251B00D83124D00D90D20 /* Iop_PadMan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_PadMan.cpp; path = Source/iop/Iop_PadMan.cpp; sourceTree = ""; }; 7EF251B10D83124D00D90D20 /* Iop_PadMan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_PadMan.h; path = Source/iop/Iop_PadMan.h; sourceTree = ""; }; + 7EF8E5B1105586E400DB0236 /* Iop_Spu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_Spu.cpp; path = Source/iop/Iop_Spu.cpp; sourceTree = ""; }; + 7EF8E5B2105586E400DB0236 /* Iop_Spu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Spu.h; path = Source/iop/Iop_Spu.h; sourceTree = ""; }; + 7EF8E5B3105586E400DB0236 /* Iop_Spu2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_Spu2.cpp; path = Source/iop/Iop_Spu2.cpp; sourceTree = ""; }; + 7EF8E5B4105586E400DB0236 /* Iop_Spu2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Spu2.h; path = Source/iop/Iop_Spu2.h; sourceTree = ""; }; + 7EF8E5B5105586E400DB0236 /* Iop_Spu2_Core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_Spu2_Core.cpp; path = Source/iop/Iop_Spu2_Core.cpp; sourceTree = ""; }; + 7EF8E5B6105586E400DB0236 /* Iop_Spu2_Core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Spu2_Core.h; path = Source/iop/Iop_Spu2_Core.h; sourceTree = ""; }; + 7EF8E5B7105586E400DB0236 /* Iop_SpuBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SpuBase.cpp; path = Source/iop/Iop_SpuBase.cpp; sourceTree = ""; }; + 7EF8E5B8105586E400DB0236 /* Iop_SpuBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_SpuBase.h; path = Source/iop/Iop_SpuBase.h; sourceTree = ""; }; + 7EF8E5C81055870B00DB0236 /* Iop_Cdvdman.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_Cdvdman.cpp; path = Source/iop/Iop_Cdvdman.cpp; sourceTree = ""; }; + 7EF8E5C91055870B00DB0236 /* Iop_Cdvdman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Cdvdman.h; path = Source/iop/Iop_Cdvdman.h; sourceTree = ""; }; + 7EF8E5CA1055870B00DB0236 /* Iop_SifMan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SifMan.cpp; path = Source/iop/Iop_SifMan.cpp; sourceTree = ""; }; + 7EF8E5CB1055870B00DB0236 /* Iop_Sifman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Sifman.h; path = Source/iop/Iop_Sifman.h; sourceTree = ""; }; + 7EF8E5D71055874B00DB0236 /* Iop_FileIo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_FileIo.cpp; path = Source/iop/Iop_FileIo.cpp; sourceTree = ""; }; + 7EF8E5D81055874B00DB0236 /* Iop_FileIo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_FileIo.h; path = Source/iop/Iop_FileIo.h; sourceTree = ""; }; + 7EF8E5D91055874B00DB0236 /* Iop_SifCmd.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SifCmd.cpp; path = Source/iop/Iop_SifCmd.cpp; sourceTree = ""; }; + 7EF8E5DA1055874B00DB0236 /* Iop_SifCmd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_SifCmd.h; path = Source/iop/Iop_SifCmd.h; sourceTree = ""; }; + 7EF8E5DB1055874B00DB0236 /* Iop_SifDynamic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SifDynamic.cpp; path = Source/iop/Iop_SifDynamic.cpp; sourceTree = ""; }; + 7EF8E5DC1055874B00DB0236 /* Iop_SifDynamic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_SifDynamic.h; path = Source/iop/Iop_SifDynamic.h; sourceTree = ""; }; + 7EF8E5DD1055874B00DB0236 /* Iop_SifManNull.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SifManNull.cpp; path = Source/iop/Iop_SifManNull.cpp; sourceTree = ""; }; + 7EF8E5DE1055874B00DB0236 /* Iop_SifManNull.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_SifManNull.h; path = Source/iop/Iop_SifManNull.h; sourceTree = ""; }; + 7EF8E5DF1055874B00DB0236 /* Iop_SifManPs2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SifManPs2.cpp; path = Source/iop/Iop_SifManPs2.cpp; sourceTree = ""; }; + 7EF8E5E01055874B00DB0236 /* Iop_SifManPs2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_SifManPs2.h; path = Source/iop/Iop_SifManPs2.h; sourceTree = ""; }; + 7EF8E5E11055874B00DB0236 /* Iop_Vblank.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_Vblank.cpp; path = Source/iop/Iop_Vblank.cpp; sourceTree = ""; }; + 7EF8E5E21055874B00DB0236 /* Iop_Vblank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Vblank.h; path = Source/iop/Iop_Vblank.h; sourceTree = ""; }; + 7EF8E5FA105587B300DB0236 /* Iop_BiosBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_BiosBase.h; path = Source/iop/Iop_BiosBase.h; sourceTree = ""; }; + 7EF8E5FB105587B300DB0236 /* Iop_DbcMan320.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_DbcMan320.cpp; path = Source/iop/Iop_DbcMan320.cpp; sourceTree = ""; }; + 7EF8E5FC105587B300DB0236 /* Iop_DbcMan320.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_DbcMan320.h; path = Source/iop/Iop_DbcMan320.h; sourceTree = ""; }; + 7EF8E601105587EA00DB0236 /* ElfFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ElfFile.cpp; path = Source/ElfFile.cpp; sourceTree = ""; }; + 7EF8E602105587EA00DB0236 /* ElfFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ElfFile.h; path = Source/ElfFile.h; sourceTree = ""; }; + 7EF8E603105587EA00DB0236 /* PadListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PadListener.cpp; path = Source/PadListener.cpp; sourceTree = ""; }; + 7EF8E604105587EA00DB0236 /* VuBasicBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = VuBasicBlock.cpp; path = Source/VuBasicBlock.cpp; sourceTree = ""; }; + 7EF8E605105587EA00DB0236 /* VuBasicBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VuBasicBlock.h; path = Source/VuBasicBlock.h; sourceTree = ""; }; + 7EF8E64010558E4400DB0236 /* libboost_filesystem-xgcc40-mt-1_37.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_filesystem-xgcc40-mt-1_37.dylib"; path = "/usr/local/lib/libboost_filesystem-xgcc40-mt-1_37.dylib"; sourceTree = ""; }; + 7EF8E64410558E5C00DB0236 /* libboost_thread-xgcc40-mt-1_37.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_thread-xgcc40-mt-1_37.dylib"; path = "/usr/local/lib/libboost_thread-xgcc40-mt-1_37.dylib"; sourceTree = ""; }; + 7EF8E64810558E8400DB0236 /* libboost_regex-xgcc40-mt-1_37.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_regex-xgcc40-mt-1_37.dylib"; path = "/usr/local/lib/libboost_regex-xgcc40-mt-1_37.dylib"; sourceTree = ""; }; + 7EF8E64C10558E9E00DB0236 /* libboost_signals-xgcc40-mt-1_37.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_signals-xgcc40-mt-1_37.dylib"; path = "/usr/local/lib/libboost_signals-xgcc40-mt-1_37.dylib"; sourceTree = ""; }; + 7EF8E64D10558E9E00DB0236 /* libboost_system-xgcc40-mt-1_37.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libboost_system-xgcc40-mt-1_37.dylib"; path = "/usr/local/lib/libboost_system-xgcc40-mt-1_37.dylib"; sourceTree = ""; }; + 7EFA613E10544EAD000BB472 /* ControllerInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ControllerInfo.cpp; path = Source/ControllerInfo.cpp; sourceTree = ""; }; + 7EFA613F10544EAD000BB472 /* ControllerInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ControllerInfo.h; path = Source/ControllerInfo.h; sourceTree = ""; }; + 7EFA61581054506E000BB472 /* AppConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AppConfig.cpp; path = Source/AppConfig.cpp; sourceTree = ""; }; + 7EFA61591054506E000BB472 /* AppConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = Source/AppConfig.h; sourceTree = ""; }; + 7EFA61B21054928C000BB472 /* StructCollectionStateFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StructCollectionStateFile.cpp; path = Source/StructCollectionStateFile.cpp; sourceTree = ""; }; + 7EFA61B31054928C000BB472 /* StructCollectionStateFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StructCollectionStateFile.h; path = Source/StructCollectionStateFile.h; sourceTree = ""; }; + 7EFA61B41054928C000BB472 /* StructFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StructFile.cpp; path = Source/StructFile.cpp; sourceTree = ""; }; + 7EFA61B51054928C000BB472 /* StructFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StructFile.h; path = Source/StructFile.h; sourceTree = ""; }; + 7EFA61BC105492DB000BB472 /* Iop_SubSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_SubSystem.cpp; path = Source/iop/Iop_SubSystem.cpp; sourceTree = ""; }; + 7EFA61BD105492DB000BB472 /* Iop_SubSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_SubSystem.h; path = Source/iop/Iop_SubSystem.h; sourceTree = ""; }; + 7EFA61C310549312000BB472 /* Iop_Dmac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_Dmac.cpp; path = Source/iop/Iop_Dmac.cpp; sourceTree = ""; }; + 7EFA61C410549312000BB472 /* Iop_Dmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_Dmac.h; path = Source/iop/Iop_Dmac.h; sourceTree = ""; }; + 7EFA61C510549312000BB472 /* Iop_DmacChannel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_DmacChannel.cpp; path = Source/iop/Iop_DmacChannel.cpp; sourceTree = ""; }; + 7EFA61C610549312000BB472 /* Iop_DmacChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_DmacChannel.h; path = Source/iop/Iop_DmacChannel.h; sourceTree = ""; }; + 7EFA61C710549312000BB472 /* Iop_RootCounters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Iop_RootCounters.cpp; path = Source/iop/Iop_RootCounters.cpp; sourceTree = ""; }; + 7EFA61C810549312000BB472 /* Iop_RootCounters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Iop_RootCounters.h; path = Source/iop/Iop_RootCounters.h; sourceTree = ""; }; 8D1107320486CEB800E47090 /* Purei.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Purei.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -412,11 +484,11 @@ 7EE1BC970D4D512800B502BD /* IOKit.framework in Frameworks */, 7EE1BC990D4D513500B502BD /* CoreFoundation.framework in Frameworks */, 7E6F94920D8B4B0D0060B97B /* libbz2.dylib in Frameworks */, - 7E93AAD40DA0935300F19184 /* libboost_filesystem-mt-1_35.dylib in Frameworks */, - 7E93AAD50DA0935300F19184 /* libboost_regex-mt-1_35.dylib in Frameworks */, - 7E93AAD60DA0935300F19184 /* libboost_signals-mt-1_35.dylib in Frameworks */, - 7E93AAD70DA0935300F19184 /* libboost_thread-mt-1_35.dylib in Frameworks */, - 7E93ABC70DA093B100F19184 /* libboost_system-mt-1_35.dylib in Frameworks */, + 7EF8E64110558E4400DB0236 /* libboost_filesystem-xgcc40-mt-1_37.dylib in Frameworks */, + 7EF8E64510558E5C00DB0236 /* libboost_thread-xgcc40-mt-1_37.dylib in Frameworks */, + 7EF8E64910558E8400DB0236 /* libboost_regex-xgcc40-mt-1_37.dylib in Frameworks */, + 7EF8E64E10558E9E00DB0236 /* libboost_signals-xgcc40-mt-1_37.dylib in Frameworks */, + 7EF8E64F10558E9E00DB0236 /* libboost_system-xgcc40-mt-1_37.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -529,6 +601,8 @@ 7E8987060D08B4480077F9ED /* Purei Core */ = { isa = PBXGroup; children = ( + 7EFA61581054506E000BB472 /* AppConfig.cpp */, + 7EFA61591054506E000BB472 /* AppConfig.h */, 7E8987B10D08BD090077F9ED /* ArrayStack.h */, 7E8987B20D08BD090077F9ED /* BasicBlock.cpp */, 7E8987B30D08BD090077F9ED /* BasicBlock.h */, @@ -537,6 +611,8 @@ 7E8987B80D08BD090077F9ED /* CodeGen_FPU.cpp */, 7E9E4F850D4531BE003321D8 /* CodeGen_MD.cpp */, 7E8987BA0D08BD090077F9ED /* CodeGen_StackPatterns.h */, + 7EFA613E10544EAD000BB472 /* ControllerInfo.cpp */, + 7EFA613F10544EAD000BB472 /* ControllerInfo.h */, 7E8987C00D08BD090077F9ED /* COP_FPU.cpp */, 7E8987C10D08BD090077F9ED /* COP_FPU.h */, 7E8987C20D08BD090077F9ED /* COP_FPU_Reflection.cpp */, @@ -551,6 +627,8 @@ 7E8987CB0D08BD090077F9ED /* Dmac_Channel.h */, 7E8987CC0D08BD090077F9ED /* ELF.cpp */, 7E8987CD0D08BD090077F9ED /* ELF.h */, + 7EF8E601105587EA00DB0236 /* ElfFile.cpp */, + 7EF8E602105587EA00DB0236 /* ElfFile.h */, 7E8987D00D08BD090077F9ED /* GIF.cpp */, 7E8987D10D08BD090077F9ED /* GIF.h */, 7E8987D20D08BD090077F9ED /* GSH_Null.cpp */, @@ -629,6 +707,7 @@ 7E8988270D08BD090077F9ED /* offsetof_def.h */, 7E89882A0D08BD090077F9ED /* PadHandler.cpp */, 7E89882B0D08BD090077F9ED /* PadHandler.h */, + 7EF8E603105587EA00DB0236 /* PadListener.cpp */, 7E89882C0D08BD090077F9ED /* PadListener.h */, 7EAD8BE40D4846DE002CC1C1 /* Posix_VolumeStream.cpp */, 7EAD8BE30D4846DE002CC1C1 /* Posix_VolumeStream.h */, @@ -645,6 +724,10 @@ 7E9E4F8B0D4531BE003321D8 /* SIF.h */, 7E9E4F8C0D4531BE003321D8 /* SifModule.h */, 7E9E4F8D0D4531BE003321D8 /* SifModuleAdapter.h */, + 7EFA61B21054928C000BB472 /* StructCollectionStateFile.cpp */, + 7EFA61B31054928C000BB472 /* StructCollectionStateFile.h */, + 7EFA61B41054928C000BB472 /* StructFile.cpp */, + 7EFA61B51054928C000BB472 /* StructFile.h */, 7E908B500DF383AB00BAAB46 /* Timer.cpp */, 7E908B510DF383AB00BAAB46 /* Timer.h */, 7E8988370D08BD090077F9ED /* uint128.h */, @@ -657,6 +740,8 @@ 7E93A99A0DA0496500F19184 /* VPU.h */, 7E93A99B0DA0496500F19184 /* VPU1.cpp */, 7E93A99C0DA0496500F19184 /* VPU1.h */, + 7EF8E604105587EA00DB0236 /* VuBasicBlock.cpp */, + 7EF8E605105587EA00DB0236 /* VuBasicBlock.h */, 7E93A99D0DA0496500F19184 /* VuExecutor.cpp */, 7E93A99E0DA0496500F19184 /* VUExecutor.h */, 7E89883E0D08BD090077F9ED /* VUShared.cpp */, @@ -700,14 +785,14 @@ 7E93AAD80DA0936300F19184 /* Libraries */ = { isa = PBXGroup; children = ( + 7EF8E64C10558E9E00DB0236 /* libboost_signals-xgcc40-mt-1_37.dylib */, + 7EF8E64D10558E9E00DB0236 /* libboost_system-xgcc40-mt-1_37.dylib */, + 7EF8E64810558E8400DB0236 /* libboost_regex-xgcc40-mt-1_37.dylib */, + 7EF8E64410558E5C00DB0236 /* libboost_thread-xgcc40-mt-1_37.dylib */, + 7EF8E64010558E4400DB0236 /* libboost_filesystem-xgcc40-mt-1_37.dylib */, 7EE1BC980D4D513500B502BD /* CoreFoundation.framework */, 7E89890A0D08C3910077F9ED /* Framework.xcodeproj */, 7EE1BC960D4D512800B502BD /* IOKit.framework */, - 7E93AAD00DA0935300F19184 /* libboost_filesystem-mt-1_35.dylib */, - 7E93AAD10DA0935300F19184 /* libboost_regex-mt-1_35.dylib */, - 7E93AAD20DA0935300F19184 /* libboost_signals-mt-1_35.dylib */, - 7E93ABC60DA093B100F19184 /* libboost_system-mt-1_35.dylib */, - 7E93AAD30DA0935300F19184 /* libboost_thread-mt-1_35.dylib */, 7E6F94910D8B4B0D0060B97B /* libbz2.dylib */, 7E898A350D08C61A0077F9ED /* libz.dylib */, 7E947C3F0D0B4EFB00A2AE15 /* OpenGL.framework */, @@ -723,12 +808,23 @@ 7E9E4F980D4531FF003321D8 /* DirectoryDevice.cpp */, 7E9E4F990D4531FF003321D8 /* DirectoryDevice.h */, 7E9E4F9A0D4531FF003321D8 /* Ioman_Device.h */, + 7EF8E5FA105587B300DB0236 /* Iop_BiosBase.h */, 7E9E4F9B0D4531FF003321D8 /* Iop_Cdvdfsv.cpp */, 7E9E4F9C0D4531FF003321D8 /* Iop_Cdvdfsv.h */, + 7EF8E5C81055870B00DB0236 /* Iop_Cdvdman.cpp */, + 7EF8E5C91055870B00DB0236 /* Iop_Cdvdman.h */, 7EAD8CE20D48528A002CC1C1 /* Iop_DbcMan.cpp */, 7EAD8CE10D48528A002CC1C1 /* Iop_DbcMan.h */, + 7EF8E5FB105587B300DB0236 /* Iop_DbcMan320.cpp */, + 7EF8E5FC105587B300DB0236 /* Iop_DbcMan320.h */, + 7EFA61C310549312000BB472 /* Iop_Dmac.cpp */, + 7EFA61C410549312000BB472 /* Iop_Dmac.h */, + 7EFA61C510549312000BB472 /* Iop_DmacChannel.cpp */, + 7EFA61C610549312000BB472 /* Iop_DmacChannel.h */, 7E9E4F9D0D4531FF003321D8 /* Iop_Dynamic.cpp */, 7E9E4F9E0D4531FF003321D8 /* Iop_Dynamic.h */, + 7EF8E5D71055874B00DB0236 /* Iop_FileIo.cpp */, + 7EF8E5D81055874B00DB0236 /* Iop_FileIo.h */, 7E9E4F9F0D4531FF003321D8 /* Iop_Intc.cpp */, 7E9E4FA00D4531FF003321D8 /* Iop_Intc.h */, 7E9E4FA10D4531FF003321D8 /* Iop_Intrman.cpp */, @@ -746,8 +842,30 @@ 7E9E4FA90D4531FF003321D8 /* Iop_Module.h */, 7EF251B00D83124D00D90D20 /* Iop_PadMan.cpp */, 7EF251B10D83124D00D90D20 /* Iop_PadMan.h */, + 7EFA61C710549312000BB472 /* Iop_RootCounters.cpp */, + 7EFA61C810549312000BB472 /* Iop_RootCounters.h */, + 7EF8E5D91055874B00DB0236 /* Iop_SifCmd.cpp */, + 7EF8E5DA1055874B00DB0236 /* Iop_SifCmd.h */, + 7EF8E5DB1055874B00DB0236 /* Iop_SifDynamic.cpp */, + 7EF8E5DC1055874B00DB0236 /* Iop_SifDynamic.h */, + 7EF8E5CA1055870B00DB0236 /* Iop_SifMan.cpp */, + 7EF8E5CB1055870B00DB0236 /* Iop_Sifman.h */, + 7EF8E5DD1055874B00DB0236 /* Iop_SifManNull.cpp */, + 7EF8E5DE1055874B00DB0236 /* Iop_SifManNull.h */, + 7EF8E5DF1055874B00DB0236 /* Iop_SifManPs2.cpp */, + 7EF8E5E01055874B00DB0236 /* Iop_SifManPs2.h */, + 7EF8E5B1105586E400DB0236 /* Iop_Spu.cpp */, + 7EF8E5B2105586E400DB0236 /* Iop_Spu.h */, + 7EF8E5B3105586E400DB0236 /* Iop_Spu2.cpp */, + 7EF8E5B4105586E400DB0236 /* Iop_Spu2.h */, + 7EF8E5B5105586E400DB0236 /* Iop_Spu2_Core.cpp */, + 7EF8E5B6105586E400DB0236 /* Iop_Spu2_Core.h */, + 7EF8E5B7105586E400DB0236 /* Iop_SpuBase.cpp */, + 7EF8E5B8105586E400DB0236 /* Iop_SpuBase.h */, 7E9E4FAA0D4531FF003321D8 /* Iop_Stdio.cpp */, 7E9E4FAB0D4531FF003321D8 /* Iop_Stdio.h */, + 7EFA61BC105492DB000BB472 /* Iop_SubSystem.cpp */, + 7EFA61BD105492DB000BB472 /* Iop_SubSystem.h */, 7E9E4FAC0D4531FF003321D8 /* Iop_Sysclib.cpp */, 7E9E4FAD0D4531FF003321D8 /* Iop_Sysclib.h */, 7E9E4FAE0D4531FF003321D8 /* Iop_Sysmem.cpp */, @@ -764,6 +882,8 @@ 7E908B550DF383FA00BAAB46 /* Iop_Unknown.h */, 7E908B560DF383FA00BAAB46 /* Iop_Unknown2.cpp */, 7E908B570DF383FA00BAAB46 /* Iop_Unknown2.h */, + 7EF8E5E11055874B00DB0236 /* Iop_Vblank.cpp */, + 7EF8E5E21055874B00DB0236 /* Iop_Vblank.h */, 7E9E4FB80D4531FF003321D8 /* IopBios.cpp */, 7E9E4FB90D4531FF003321D8 /* IopBios.h */, 7E9E4FBA0D4531FF003321D8 /* IsoDevice.cpp */, @@ -961,6 +1081,30 @@ 7E908B520DF383AB00BAAB46 /* Timer.cpp in Sources */, 7E908B580DF383FA00BAAB46 /* Iop_Unknown.cpp in Sources */, 7E908B590DF383FA00BAAB46 /* Iop_Unknown2.cpp in Sources */, + 7EFA614010544EAD000BB472 /* ControllerInfo.cpp in Sources */, + 7EFA615A1054506E000BB472 /* AppConfig.cpp in Sources */, + 7EFA61B61054928C000BB472 /* StructCollectionStateFile.cpp in Sources */, + 7EFA61B71054928C000BB472 /* StructFile.cpp in Sources */, + 7EFA61BE105492DB000BB472 /* Iop_SubSystem.cpp in Sources */, + 7EFA61C910549312000BB472 /* Iop_Dmac.cpp in Sources */, + 7EFA61CA10549312000BB472 /* Iop_DmacChannel.cpp in Sources */, + 7EFA61CB10549312000BB472 /* Iop_RootCounters.cpp in Sources */, + 7EF8E5B9105586E400DB0236 /* Iop_Spu.cpp in Sources */, + 7EF8E5BA105586E400DB0236 /* Iop_Spu2.cpp in Sources */, + 7EF8E5BB105586E400DB0236 /* Iop_Spu2_Core.cpp in Sources */, + 7EF8E5BC105586E400DB0236 /* Iop_SpuBase.cpp in Sources */, + 7EF8E5CC1055870B00DB0236 /* Iop_Cdvdman.cpp in Sources */, + 7EF8E5CD1055870B00DB0236 /* Iop_SifMan.cpp in Sources */, + 7EF8E5E31055874B00DB0236 /* Iop_FileIo.cpp in Sources */, + 7EF8E5E41055874B00DB0236 /* Iop_SifCmd.cpp in Sources */, + 7EF8E5E51055874B00DB0236 /* Iop_SifDynamic.cpp in Sources */, + 7EF8E5E61055874B00DB0236 /* Iop_SifManNull.cpp in Sources */, + 7EF8E5E71055874B00DB0236 /* Iop_SifManPs2.cpp in Sources */, + 7EF8E5E81055874B00DB0236 /* Iop_Vblank.cpp in Sources */, + 7EF8E5FD105587B300DB0236 /* Iop_DbcMan320.cpp in Sources */, + 7EF8E606105587EA00DB0236 /* ElfFile.cpp in Sources */, + 7EF8E607105587EA00DB0236 /* PadListener.cpp in Sources */, + 7EF8E608105587EA00DB0236 /* VuBasicBlock.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1044,12 +1188,13 @@ DEBUGGER_INCLUDED, MACOSX, _DEBUG, + _IOP_EMULATE_MODULES, ); GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( - "/usr/local/include/boost-1_35/boost/tr1/tr1", - "/usr/local/include/boost-1_35/", + "/usr/local/include/boost-1_37/boost/tr1/tr1", + "/usr/local/include/boost-1_37/", "~/Projects/Framework/include", ); INFOPLIST_FILE = ""; diff --git a/Source/AppConfig.cpp b/Source/AppConfig.cpp index 688bc7b5..5a994c6f 100644 --- a/Source/AppConfig.cpp +++ b/Source/AppConfig.cpp @@ -1,59 +1,68 @@ -#include "AppConfig.h" -#include "PathUtils.h" -#include "Utf8.h" - -#define BASE_DATA_PATH L"Purei Data Files" -#define DEFAULT_CONFIG_PATH ("config.xml") - -using namespace Framework; -using namespace boost; -using namespace std; - -CAppConfig::CAppConfig() : -CConfig(BuildConfigPath()) -{ - -} - -CAppConfig::~CAppConfig() -{ - -} - -CConfig::PathType CAppConfig::GetBasePath() -{ - return (PathUtils::GetPersonalDataPath() / BASE_DATA_PATH); -} - -CConfig::PathType CAppConfig::Utf8ToPath(const char* path) -{ -#if defined(WIN32) - return CConfig::PathType(Utf8::ConvertFrom(path)); -#else - return CConfig::PathType(path) -#endif -} - -string CAppConfig::PathToUtf8(const CConfig::PathType& path) -{ -#if defined(WIN32) - return Utf8::ConvertTo(path.string()); -#else - return path.string(); -#endif -} - -CConfig::PathType CAppConfig::BuildConfigPath() -{ -#if defined(MACOSX) - passwd* userInfo = getpwuid(getuid()); - if(userInfo == NULL) return DEFAULT_CONFIG_PATH; - return string(userInfo->pw_dir) + "/Library/Preferences/com.vapps.Purei.xml"; -#elif defined(WIN32) - CConfig::PathType userPath(GetBasePath()); - PathUtils::EnsurePathExists(userPath); - return (userPath / L"Config.xml"); -#else - return DEFAULT_CONFIG_PATH; -#endif -} +#include "AppConfig.h" +#include "PathUtils.h" +#include "Utf8.h" +#if !defined(WIN32) +#include +#endif + +#define BASE_DATA_PATH L"Purei Data Files" +#define DEFAULT_CONFIG_PATH (L"config.xml") + +using namespace Framework; +using namespace boost; +using namespace std; + +CAppConfig::CAppConfig() : +CConfig(BuildConfigPath()) +{ + +} + +CAppConfig::~CAppConfig() +{ + +} + +CConfig::PathType CAppConfig::GetBasePath() +{ +#if defined(WIN32) + return (PathUtils::GetPersonalDataPath() / BASE_DATA_PATH); +#elif defined(MACOSX) + return (Utf8ToPath(PathUtils::GetHomePath().string().c_str()) / BASE_DATA_PATH); +#else + return CConfig::PathType(); +#endif +} + +CConfig::PathType CAppConfig::Utf8ToPath(const char* path) +{ +//#if defined(WIN32) + return CConfig::PathType(Utf8::ConvertFrom(path)); +//#else +// return CConfig::PathType(path); +//#endif +} + +string CAppConfig::PathToUtf8(const CConfig::PathType& path) +{ +//#if defined(WIN32) + return Utf8::ConvertTo(path.string()); +//#else +// return path.string(); +//#endif +} + +CConfig::PathType CAppConfig::BuildConfigPath() +{ +#if defined(MACOSX) + passwd* userInfo = getpwuid(getuid()); + if(userInfo == NULL) return DEFAULT_CONFIG_PATH; + return wstring(Utf8::ConvertFrom(userInfo->pw_dir)) + L"/Library/Preferences/com.vapps.Purei.xml"; +#elif defined(WIN32) + CConfig::PathType userPath(GetBasePath()); + PathUtils::EnsurePathExists(userPath); + return (userPath / L"Config.xml"); +#else + return DEFAULT_CONFIG_PATH; +#endif +} diff --git a/Source/AppConfig.h b/Source/AppConfig.h index b717c0c8..74a223c2 100644 --- a/Source/AppConfig.h +++ b/Source/AppConfig.h @@ -1,24 +1,24 @@ -#ifndef _APPCONFIG_H_ -#define _APPCONFIG_H_ - -#include "Config.h" -#include "Singleton.h" - -class CAppConfig : public Framework::CConfig, public CSingleton -{ -public: - friend class CSingleton; - - static CConfig::PathType GetBasePath(); - - static CConfig::PathType Utf8ToPath(const char*); - static std::string PathToUtf8(const CConfig::PathType&); - -private: - CAppConfig(); - virtual ~CAppConfig(); - - static CConfig::PathType BuildConfigPath(); -}; - -#endif +#ifndef _APPCONFIG_H_ +#define _APPCONFIG_H_ + +#include "Config.h" +#include "Singleton.h" + +class CAppConfig : public Framework::CConfig, public CSingleton +{ +public: + friend class CSingleton; + + static CConfig::PathType GetBasePath(); + + static CConfig::PathType Utf8ToPath(const char*); + static std::string PathToUtf8(const CConfig::PathType&); + +private: + CAppConfig(); + virtual ~CAppConfig(); + + static CConfig::PathType BuildConfigPath(); +}; + +#endif diff --git a/Source/COP_FPU.cpp b/Source/COP_FPU.cpp index ef188623..cdf166ac 100644 --- a/Source/COP_FPU.cpp +++ b/Source/COP_FPU.cpp @@ -414,51 +414,51 @@ void CCOP_FPU::SWC1() CCOP_FPU::InstructionFuncConstant CCOP_FPU::m_pOpGeneral[0x20] = { //0x00 - &MFC1, &Illegal, &Illegal, &Illegal, &MTC1, &Illegal, &CTC1, &Illegal, + &CCOP_FPU::MFC1, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::MTC1, &CCOP_FPU::Illegal, &CCOP_FPU::CTC1, &CCOP_FPU::Illegal, //0x08 - &BC1, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::BC1, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x10 - &S, &Illegal, &Illegal, &Illegal, &W, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::W, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, }; CCOP_FPU::InstructionFuncConstant CCOP_FPU::m_pOpSingle[0x40] = { //0x00 - &ADD_S, &SUB_S, &MUL_S, &DIV_S, &SQRT_S, &ABS_S, &MOV_S, &NEG_S, + &CCOP_FPU::ADD_S, &CCOP_FPU::SUB_S, &CCOP_FPU::MUL_S, &CCOP_FPU::DIV_S, &CCOP_FPU::SQRT_S, &CCOP_FPU::ABS_S, &CCOP_FPU::MOV_S, &CCOP_FPU::NEG_S, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x18 - &ADDA_S, &Illegal, &MULA_S, &Illegal, &MADD_S, &MSUB_S, &Illegal, &Illegal, + &CCOP_FPU::ADDA_S, &CCOP_FPU::Illegal, &CCOP_FPU::MULA_S, &CCOP_FPU::Illegal, &CCOP_FPU::MADD_S, &CCOP_FPU::MSUB_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x20 - &Illegal, &Illegal, &Illegal, &Illegal, &CVT_W_S, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::CVT_W_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x28 - &MAX_S, &MIN_S, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::MAX_S, &CCOP_FPU::MIN_S, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x30 - &Illegal, &Illegal, &C_EQ_S, &Illegal, &C_LT_S, &Illegal, &C_LE_S, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::C_EQ_S, &CCOP_FPU::Illegal, &CCOP_FPU::C_LT_S, &CCOP_FPU::Illegal, &CCOP_FPU::C_LE_S, &CCOP_FPU::Illegal, //0x38 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, }; CCOP_FPU::InstructionFuncConstant CCOP_FPU::m_pOpWord[0x40] = { //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x20 - &CVT_S_W, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::CVT_S_W, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x28 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x30 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, //0x38 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, &CCOP_FPU::Illegal, }; diff --git a/Source/COP_SCU.cpp b/Source/COP_SCU.cpp index 56f06f18..97be0388 100644 --- a/Source/COP_SCU.cpp +++ b/Source/COP_SCU.cpp @@ -1,340 +1,340 @@ -#include -#include -#include -#include "COP_SCU.h" -#include "MIPS.h" -#include "CodeGen.h" -#include "offsetof_def.h" - -char* CCOP_SCU::m_sRegName[] = -{ - "Index", - "Random", - "EntryLo0", - "EntryLo1", - "Context", - "PageMask", - "Wired", - "*RESERVED*", - "BadVAddr", - "Count", - "EntryHi", - "Compare", - "Status", - "Cause", - "EPC", - "PrevID", - "Config", - "LLAddr", - "WatchLo", - "WatchHi", - "XContext", - "CPCOND0", - "*RESERVED*", - "*RESERVED*", - "*RESERVED*", - "*RESERVED*", - "PErr", - "CacheErr", - "TagLo", - "TagHi", - "ErrorEPC", - "*RESERVED*" -}; - -CCOP_SCU::CCOP_SCU(MIPS_REGSIZE nRegSize) : -CMIPSCoprocessor(nRegSize), -m_nRT(0), -m_nRD(0) -{ - -} - -void CCOP_SCU::CompileInstruction(uint32 nAddress, CCodeGen* codeGen, CMIPS* pCtx) -{ - SetupQuickVariables(nAddress, codeGen, pCtx); - - m_nRT = (uint8)((m_nOpcode >> 16) & 0x1F); - m_nRD = (uint8)((m_nOpcode >> 11) & 0x1F); - - ((this)->*(m_pOpGeneral[(m_nOpcode >> 21) & 0x1F]))(); -} - -////////////////////////////////////////////////// -//General Opcodes -////////////////////////////////////////////////// - -//00 -void CCOP_SCU::MFC0() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[m_nRD])); - m_codeGen->SeX(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nRT].nV[1])); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nRT].nV[0])); -} - -//04 -void CCOP_SCU::MTC0() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_nRT].nV[0])); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[m_nRD])); -} - -//08 -void CCOP_SCU::BC0() -{ - ((this)->*(m_pOpBC0[m_nRT]))(); -} - -//10 -void CCOP_SCU::C0() -{ - ((this)->*(m_pOpC0[(m_nOpcode & 0x3F)]))(); -} - -////////////////////////////////////////////////// -//Branches -////////////////////////////////////////////////// - -//00 -void CCOP_SCU::BC0F() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[CPCOND0])); - m_codeGen->PushCst(0); - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - Branch(true); -} - -//01 -void CCOP_SCU::BC0T() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[CPCOND0])); - m_codeGen->PushCst(0); - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - Branch(false); -} - -////////////////////////////////////////////////// -//Coprocessor Specific Opcodes -////////////////////////////////////////////////// - -//18 -void CCOP_SCU::ERET() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - m_codeGen->PushCst(0x04); - m_codeGen->And(); - - m_codeGen->PushCst(0x00); - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - m_codeGen->BeginIfElse(false); - { - //ERL bit was set - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[ERROREPC])); -// m_codeGen->PullRel(offsetof(CMIPS, m_State.nPC)); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); - - //Clear ERL bit - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - m_codeGen->PushCst(~0x04); - m_codeGen->And(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - } - m_codeGen->BeginIfElseAlt(); - { - //EXL bit wasn't set, we assume ERL was (unsafe) - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[EPC])); -// m_codeGen->PullRel(offsetof(CMIPS, m_State.nPC)); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); - - //Clear EXL bit - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - m_codeGen->PushCst(~0x02); - m_codeGen->And(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - } - m_codeGen->EndIf(); -} - -//38 -void CCOP_SCU::EI() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - //Should check for pending interrupts here - m_codeGen->PushCst(0x00010001); - m_codeGen->Or(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); -} - -//39 -void CCOP_SCU::DI() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); - m_codeGen->PushCst(~0x00010001); - m_codeGen->And(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); -} - -////////////////////////////////////////////////// -//Opcode Tables -////////////////////////////////////////////////// - -CCOP_SCU::InstructionFuncConstant CCOP_SCU::m_pOpGeneral[0x20] = -{ - //0x00 - &MFC0, &Illegal, &Illegal, &Illegal, &MTC0, &Illegal, &Illegal, &Illegal, - //0x08 - &BC0, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &C0, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CCOP_SCU::InstructionFuncConstant CCOP_SCU::m_pOpBC0[0x20] = -{ - //0x00 - &BC0F, &BC0T, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CCOP_SCU::InstructionFuncConstant CCOP_SCU::m_pOpC0[0x40] = -{ - //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &ERET, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x20 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x28 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x30 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x38 - &EI, &DI, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -void CCOP_SCU::GetInstruction(uint32 nOpcode, char* sText) -{ - switch((nOpcode >> 21) & 0x1F) - { - case 0x00: - strcpy(sText, "MFC0"); - break; - case 0x04: - strcpy(sText, "MTC0"); - break; - case 0x08: - switch((nOpcode >> 16) & 0x1F) - { - case 0x00: - strcpy(sText, "BC0F"); - break; - case 0x01: - strcpy(sText, "BC0T"); - break; - default: - strcpy(sText, "???"); - break; - } - break; - case 0x10: - switch(nOpcode & 0x3F) - { - case 0x02: - strcpy(sText, "TLBWI"); - break; - case 0x18: - strcpy(sText, "ERET"); - break; - case 0x38: - strcpy(sText, "EI"); - break; - case 0x39: - strcpy(sText, "DI"); - break; - default: - strcpy(sText, "???"); - break; - } - break; - default: - strcpy(sText, "???"); - break; - } -} - -void CCOP_SCU::GetArguments(uint32 nAddress, uint32 nOpcode, char* sText) -{ - uint8 nRT = static_cast((nOpcode >> 16) & 0x1F); - uint8 nRD = static_cast((nOpcode >> 11) & 0x1F); - uint16 nImm = static_cast(nOpcode); - switch((nOpcode >> 21) & 0x1F) - { - case 0x00: - case 0x04: - sprintf(sText, "%s, %s", CMIPS::m_sGPRName[nRT], m_sRegName[nRD]); - break; - case 0x08: - switch((nOpcode >> 16) & 0x1F) - { - case 0x00: - case 0x01: - sprintf(sText, "0x%0.8X", nAddress + CMIPS::GetBranch(nImm) + 4); - break; - default: - strcpy(sText, ""); - break; - } - break; - default: - strcpy(sText, ""); - break; - } -} - -uint32 CCOP_SCU::GetEffectiveAddress(uint32 nAddress, uint32 nOpcode) -{ - if(((nOpcode >> 21) & 0x1F) == 0x08) - { - switch((nOpcode >> 16) & 0x1F) - { - case 0x00: - case 0x01: - return (nAddress + CMIPS::GetBranch(static_cast(nOpcode)) + 4); - break; - default: - return 0; - break; - } - } - return 0; -} - -bool CCOP_SCU::IsBranch(uint32 nOpcode) -{ - if(((nOpcode >> 21) & 0x1F) == 0x08) - { - switch((nOpcode >> 16) & 0x1F) - { - case 0x00: - case 0x01: - return true; - break; - default: - return false; - break; - } - } - return false; -} +#include +#include +#include +#include "COP_SCU.h" +#include "MIPS.h" +#include "CodeGen.h" +#include "offsetof_def.h" + +char* CCOP_SCU::m_sRegName[] = +{ + "Index", + "Random", + "EntryLo0", + "EntryLo1", + "Context", + "PageMask", + "Wired", + "*RESERVED*", + "BadVAddr", + "Count", + "EntryHi", + "Compare", + "Status", + "Cause", + "EPC", + "PrevID", + "Config", + "LLAddr", + "WatchLo", + "WatchHi", + "XContext", + "CPCOND0", + "*RESERVED*", + "*RESERVED*", + "*RESERVED*", + "*RESERVED*", + "PErr", + "CacheErr", + "TagLo", + "TagHi", + "ErrorEPC", + "*RESERVED*" +}; + +CCOP_SCU::CCOP_SCU(MIPS_REGSIZE nRegSize) : +CMIPSCoprocessor(nRegSize), +m_nRT(0), +m_nRD(0) +{ + +} + +void CCOP_SCU::CompileInstruction(uint32 nAddress, CCodeGen* codeGen, CMIPS* pCtx) +{ + SetupQuickVariables(nAddress, codeGen, pCtx); + + m_nRT = (uint8)((m_nOpcode >> 16) & 0x1F); + m_nRD = (uint8)((m_nOpcode >> 11) & 0x1F); + + ((this)->*(m_pOpGeneral[(m_nOpcode >> 21) & 0x1F]))(); +} + +////////////////////////////////////////////////// +//General Opcodes +////////////////////////////////////////////////// + +//00 +void CCOP_SCU::MFC0() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[m_nRD])); + m_codeGen->SeX(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nRT].nV[1])); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nGPR[m_nRT].nV[0])); +} + +//04 +void CCOP_SCU::MTC0() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nGPR[m_nRT].nV[0])); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[m_nRD])); +} + +//08 +void CCOP_SCU::BC0() +{ + ((this)->*(m_pOpBC0[m_nRT]))(); +} + +//10 +void CCOP_SCU::C0() +{ + ((this)->*(m_pOpC0[(m_nOpcode & 0x3F)]))(); +} + +////////////////////////////////////////////////// +//Branches +////////////////////////////////////////////////// + +//00 +void CCOP_SCU::BC0F() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[CPCOND0])); + m_codeGen->PushCst(0); + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + Branch(true); +} + +//01 +void CCOP_SCU::BC0T() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[CPCOND0])); + m_codeGen->PushCst(0); + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + Branch(false); +} + +////////////////////////////////////////////////// +//Coprocessor Specific Opcodes +////////////////////////////////////////////////// + +//18 +void CCOP_SCU::ERET() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + m_codeGen->PushCst(0x04); + m_codeGen->And(); + + m_codeGen->PushCst(0x00); + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + m_codeGen->BeginIfElse(false); + { + //ERL bit was set + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[ERROREPC])); +// m_codeGen->PullRel(offsetof(CMIPS, m_State.nPC)); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); + + //Clear ERL bit + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + m_codeGen->PushCst(~0x04); + m_codeGen->And(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + } + m_codeGen->BeginIfElseAlt(); + { + //EXL bit wasn't set, we assume ERL was (unsafe) + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[EPC])); +// m_codeGen->PullRel(offsetof(CMIPS, m_State.nPC)); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); + + //Clear EXL bit + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + m_codeGen->PushCst(~0x02); + m_codeGen->And(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + } + m_codeGen->EndIf(); +} + +//38 +void CCOP_SCU::EI() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + //Should check for pending interrupts here + m_codeGen->PushCst(0x00010001); + m_codeGen->Or(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); +} + +//39 +void CCOP_SCU::DI() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); + m_codeGen->PushCst(~0x00010001); + m_codeGen->And(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP0[STATUS])); +} + +////////////////////////////////////////////////// +//Opcode Tables +////////////////////////////////////////////////// + +CCOP_SCU::InstructionFuncConstant CCOP_SCU::m_pOpGeneral[0x20] = +{ + //0x00 + &CCOP_SCU::MFC0, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::MTC0, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x08 + &CCOP_SCU::BC0, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x10 + &CCOP_SCU::C0, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x18 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, +}; + +CCOP_SCU::InstructionFuncConstant CCOP_SCU::m_pOpBC0[0x20] = +{ + //0x00 + &CCOP_SCU::BC0F, &CCOP_SCU::BC0T, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x08 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x10 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x18 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, +}; + +CCOP_SCU::InstructionFuncConstant CCOP_SCU::m_pOpC0[0x40] = +{ + //0x00 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x08 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x10 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x18 + &CCOP_SCU::ERET, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x20 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x28 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x30 + &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, + //0x38 + &CCOP_SCU::EI, &CCOP_SCU::DI, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, &CCOP_SCU::Illegal, +}; + +void CCOP_SCU::GetInstruction(uint32 nOpcode, char* sText) +{ + switch((nOpcode >> 21) & 0x1F) + { + case 0x00: + strcpy(sText, "MFC0"); + break; + case 0x04: + strcpy(sText, "MTC0"); + break; + case 0x08: + switch((nOpcode >> 16) & 0x1F) + { + case 0x00: + strcpy(sText, "BC0F"); + break; + case 0x01: + strcpy(sText, "BC0T"); + break; + default: + strcpy(sText, "???"); + break; + } + break; + case 0x10: + switch(nOpcode & 0x3F) + { + case 0x02: + strcpy(sText, "TLBWI"); + break; + case 0x18: + strcpy(sText, "ERET"); + break; + case 0x38: + strcpy(sText, "EI"); + break; + case 0x39: + strcpy(sText, "DI"); + break; + default: + strcpy(sText, "???"); + break; + } + break; + default: + strcpy(sText, "???"); + break; + } +} + +void CCOP_SCU::GetArguments(uint32 nAddress, uint32 nOpcode, char* sText) +{ + uint8 nRT = static_cast((nOpcode >> 16) & 0x1F); + uint8 nRD = static_cast((nOpcode >> 11) & 0x1F); + uint16 nImm = static_cast(nOpcode); + switch((nOpcode >> 21) & 0x1F) + { + case 0x00: + case 0x04: + sprintf(sText, "%s, %s", CMIPS::m_sGPRName[nRT], m_sRegName[nRD]); + break; + case 0x08: + switch((nOpcode >> 16) & 0x1F) + { + case 0x00: + case 0x01: + sprintf(sText, "0x%0.8X", nAddress + CMIPS::GetBranch(nImm) + 4); + break; + default: + strcpy(sText, ""); + break; + } + break; + default: + strcpy(sText, ""); + break; + } +} + +uint32 CCOP_SCU::GetEffectiveAddress(uint32 nAddress, uint32 nOpcode) +{ + if(((nOpcode >> 21) & 0x1F) == 0x08) + { + switch((nOpcode >> 16) & 0x1F) + { + case 0x00: + case 0x01: + return (nAddress + CMIPS::GetBranch(static_cast(nOpcode)) + 4); + break; + default: + return 0; + break; + } + } + return 0; +} + +bool CCOP_SCU::IsBranch(uint32 nOpcode) +{ + if(((nOpcode >> 21) & 0x1F) == 0x08) + { + switch((nOpcode >> 16) & 0x1F) + { + case 0x00: + case 0x01: + return true; + break; + default: + return false; + break; + } + } + return false; +} diff --git a/Source/COP_VU.cpp b/Source/COP_VU.cpp index 8b5db649..e2a2fbea 100644 --- a/Source/COP_VU.cpp +++ b/Source/COP_VU.cpp @@ -481,79 +481,79 @@ void CCOP_VU::VRXOR() CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpCop2[0x20] = { //0x00 - &Illegal, &QMFC2, &CFC2, &Illegal, &Illegal, &QMTC2, &CTC2, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::QMFC2, &CCOP_VU::CFC2, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::QMTC2, &CCOP_VU::CTC2, &CCOP_VU::Illegal, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x10 - &V, &V, &V, &V, &V, &V, &V, &V, + &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, //0x18 - &V, &V, &V, &V, &V, &V, &V, &V, + &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, &CCOP_VU::V, }; CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVector[0x40] = { //0x00 - &VADDbc, &VADDbc, &VADDbc, &VADDbc, &VSUBbc, &VSUBbc, &VSUBbc, &VSUBbc, + &CCOP_VU::VADDbc, &CCOP_VU::VADDbc, &CCOP_VU::VADDbc, &CCOP_VU::VADDbc, &CCOP_VU::VSUBbc, &CCOP_VU::VSUBbc, &CCOP_VU::VSUBbc, &CCOP_VU::VSUBbc, //0x08 - &VMADDbc, &VMADDbc, &VMADDbc, &VMADDbc, &VMSUBbc, &VMSUBbc, &VMSUBbc, &VMSUBbc, + &CCOP_VU::VMADDbc, &CCOP_VU::VMADDbc, &CCOP_VU::VMADDbc, &CCOP_VU::VMADDbc, &CCOP_VU::VMSUBbc, &CCOP_VU::VMSUBbc, &CCOP_VU::VMSUBbc, &CCOP_VU::VMSUBbc, //0x10 - &VMAXbc, &Illegal, &Illegal, &Illegal, &VMINIbc, &Illegal, &Illegal, &Illegal, + &CCOP_VU::VMAXbc, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VMINIbc, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x18 - &VMULbc, &VMULbc, &VMULbc, &VMULbc, &VMULq, &Illegal, &Illegal, &Illegal, + &CCOP_VU::VMULbc, &CCOP_VU::VMULbc, &CCOP_VU::VMULbc, &CCOP_VU::VMULbc, &CCOP_VU::VMULq, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x20 - &VADDq, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::VADDq, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x28 - &VADD, &Illegal, &VMUL, &VMAX, &VSUB, &Illegal, &VOPMSUB, &VMINI, + &CCOP_VU::VADD, &CCOP_VU::Illegal, &CCOP_VU::VMUL, &CCOP_VU::VMAX, &CCOP_VU::VSUB, &CCOP_VU::Illegal, &CCOP_VU::VOPMSUB, &CCOP_VU::VMINI, //0x30 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x38 - &Illegal, &Illegal, &Illegal, &Illegal, &VX0, &VX1, &VX2, &VX3, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VX0, &CCOP_VU::VX1, &CCOP_VU::VX2, &CCOP_VU::VX3, }; CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx0[0x20] = { //0x00 - &VADDAbc, &VSUBAbc, &VMADDAbc, &VMSUBAbc, &VITOF0, &VFTOI0, &VMULAbc, &Illegal, + &CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF0, &CCOP_VU::VFTOI0, &CCOP_VU::VMULAbc, &CCOP_VU::Illegal, //0x08 - &Illegal, &Illegal, &VADDA, &Illegal, &VMOVE, &Illegal, &VDIV, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VADDA, &CCOP_VU::Illegal, &CCOP_VU::VMOVE, &CCOP_VU::Illegal, &CCOP_VU::VDIV, &CCOP_VU::Illegal, //0x10 - &VRNEXT, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::VRNEXT, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, }; CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx1[0x20] = { //0x00 - &VADDAbc, &VSUBAbc, &VMADDAbc, &VMSUBAbc, &VITOF4, &VFTOI4, &VMULAbc, &Illegal, + &CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF4, &CCOP_VU::VFTOI4, &CCOP_VU::VMULAbc, &CCOP_VU::Illegal, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &VMR32, &Illegal, &VSQRT, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VMR32, &CCOP_VU::Illegal, &CCOP_VU::VSQRT, &CCOP_VU::Illegal, //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, }; CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx2[0x20] = { //0x00 - &VADDAbc, &VSUBAbc, &VMADDAbc, &VMSUBAbc, &Illegal, &Illegal, &VMULAbc, &Illegal, + &CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VMULAbc, &CCOP_VU::Illegal, //0x08 - &Illegal, &Illegal, &Illegal, &VOPMULA, &Illegal, &Illegal, &VRSQRT, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VOPMULA, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VRSQRT, &CCOP_VU::Illegal, //0x10 - &VRINIT, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::VRINIT, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, }; CCOP_VU::InstructionFuncConstant CCOP_VU::m_pOpVx3[0x20] = { //0x00 - &VADDAbc, &VSUBAbc, &VMADDAbc, &VMSUBAbc, &VITOF15, &Illegal, &VMULAbc, &VCLIP, + &CCOP_VU::VADDAbc, &CCOP_VU::VSUBAbc, &CCOP_VU::VMADDAbc, &CCOP_VU::VMSUBAbc, &CCOP_VU::VITOF15, &CCOP_VU::Illegal, &CCOP_VU::VMULAbc, &CCOP_VU::VCLIP, //0x08 - &Illegal, &Illegal, &Illegal, &VNOP, &Illegal, &Illegal, &VWAITQ, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VNOP, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::VWAITQ, &CCOP_VU::Illegal, //0x10 - &VRXOR, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::VRXOR, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, &CCOP_VU::Illegal, }; diff --git a/Source/GSHandler.cpp b/Source/GSHandler.cpp index 07e72e90..074d8b58 100644 --- a/Source/GSHandler.cpp +++ b/Source/GSHandler.cpp @@ -1,1238 +1,1250 @@ -#include -#include -#include -#include "GSHandler.h" -#include "INTC.h" -#include "PtrMacro.h" -#include "Log.h" -#include "MemoryStateFile.h" -#include "RegisterStateFile.h" - -#define R_REG(a, v, r) \ - if((a) & 0x4) \ - { \ - v = (uint32)(r >> 32); \ - } \ - else \ - { \ - v = (uint32)(r & 0xFFFFFFFF); \ - } - -#define W_REG(a, v, r) \ - if((a) & 0x4) \ - { \ - (r) &= 0x00000000FFFFFFFFULL; \ - (r) |= (uint64)(v) << 32; \ - } \ - else \ - { \ - (r) &= 0xFFFFFFFF00000000ULL; \ - (r) |= (v); \ - } - -#define STATE_RAM ("gs/ram") -#define STATE_REGS ("gs/regs") -#define STATE_TRXCTX ("gs/trxcontext") -#define STATE_PRIVREGS ("gs/privregs.xml") - -#define STATE_PRIVREGS_PMODE ("PMODE") -#define STATE_PRIVREGS_DISPFB1 ("DISPFB1") -#define STATE_PRIVREGS_DISPLAY1 ("DISPLAY1") -#define STATE_PRIVREGS_DISPFB2 ("DISPFB2") -#define STATE_PRIVREGS_DISPLAY2 ("DISPLAY2") -#define STATE_PRIVREGS_CSR ("CSR") -#define STATE_PRIVREGS_IMR ("IMR") -#define STATE_PRIVREGS_CRTINTERLACED ("CrtInterlated") -#define STATE_PRIVREGS_CRTMODE ("CrtMode") -#define STATE_PRIVREGS_CRTFRAMEMODE ("CrtFrameMode") - -#define LOG_NAME ("gs") - -using namespace Framework; -using namespace std; -using namespace std::tr1; - -int CGSHandler::STORAGEPSMCT32::m_nBlockSwizzleTable[4][8] = -{ - { 0, 1, 4, 5, 16, 17, 20, 21 }, - { 2, 3, 6, 7, 18, 19, 22, 23 }, - { 8, 9, 12, 13, 24, 25, 28, 29 }, - { 10, 11, 14, 15, 26, 27, 30, 31 }, -}; - -int CGSHandler::STORAGEPSMCT32::m_nColumnSwizzleTable[2][8] = -{ - { 0, 1, 4, 5, 8, 9, 12, 13, }, - { 2, 3, 6, 7, 10, 11, 14, 15, }, -}; - -int CGSHandler::STORAGEPSMCT16::m_nBlockSwizzleTable[8][4] = -{ - { 0, 2, 8, 10, }, - { 1, 3, 9, 11, }, - { 4, 6, 12, 14, }, - { 5, 7, 13, 15, }, - { 16, 18, 24, 26, }, - { 17, 19, 25, 27, }, - { 20, 22, 28, 30, }, - { 21, 23, 29, 31, }, -}; - -int CGSHandler::STORAGEPSMCT16::m_nColumnSwizzleTable[2][16] = -{ - { 0, 2, 8, 10, 16, 18, 24, 26, 1, 3, 9, 11, 17, 19, 25, 27, }, - { 4, 6, 12, 14, 20, 22, 28, 30, 5, 7, 13, 15, 21, 23, 29, 31, }, -}; - -int CGSHandler::STORAGEPSMCT16S::m_nBlockSwizzleTable[8][4] = -{ - { 0, 2, 16, 18, }, - { 1, 3, 17, 19, }, - { 8, 10, 24, 26, }, - { 9, 11, 25, 27, }, - { 4, 6, 20, 22, }, - { 5, 7, 21, 23, }, - { 12, 14, 28, 30, }, - { 13, 15, 29, 31, }, -}; - -int CGSHandler::STORAGEPSMCT16S::m_nColumnSwizzleTable[2][16] = -{ - { 0, 2, 8, 10, 16, 18, 24, 26, 1, 3, 9, 11, 17, 19, 25, 27, }, - { 4, 6, 12, 14, 20, 22, 28, 30, 5, 7, 13, 15, 21, 23, 29, 31, }, -}; - -int CGSHandler::STORAGEPSMT8::m_nBlockSwizzleTable[4][8] = -{ - { 0, 1, 4, 5, 16, 17, 20, 21 }, - { 2, 3, 6, 7, 18, 19, 22, 23 }, - { 8, 9, 12, 13, 24, 25, 28, 29 }, - { 10, 11, 14, 15, 26, 27, 30, 31 }, -}; - -int CGSHandler::STORAGEPSMT8::m_nColumnWordTable[2][2][8] = -{ - { - { 0, 1, 4, 5, 8, 9, 12, 13, }, - { 2, 3, 6, 7, 10, 11, 14, 15, }, - }, - { - { 8, 9, 12, 13, 0, 1, 4, 5, }, - { 10, 11, 14, 15, 2, 3, 6, 7, }, - }, -}; - -int CGSHandler::STORAGEPSMT4::m_nBlockSwizzleTable[8][4] = -{ - { 0, 2, 8, 10, }, - { 1, 3, 9, 11, }, - { 4, 6, 12, 14, }, - { 5, 7, 13, 15, }, - { 16, 18, 24, 26, }, - { 17, 19, 25, 27, }, - { 20, 22, 28, 30, }, - { 21, 23, 29, 31, } -}; - -int CGSHandler::STORAGEPSMT4::m_nColumnWordTable[2][2][8] = -{ - { - { 0, 1, 4, 5, 8, 9, 12, 13, }, - { 2, 3, 6, 7, 10, 11, 14, 15, }, - }, - { - { 8, 9, 12, 13, 0, 1, 4, 5, }, - { 10, 11, 14, 15, 2, 3, 6, 7, }, - }, -}; - -CGSHandler::CGSHandler() : -m_thread(NULL), -m_enabled(true), -m_renderDone(false), -m_threadDone(false) -{ - m_pRAM = (uint8*)malloc(RAMSIZE); - - for(int i = 0; i < PSM_MAX; i++) - { - m_pTransferHandler[i] = &CGSHandler::TrxHandlerInvalid; - } - - m_pTransferHandler[PSMCT32] = &CGSHandler::TrxHandlerCopy; - m_pTransferHandler[PSMCT24] = &CGSHandler::TrxHandlerPSMCT24; - m_pTransferHandler[PSMCT16] = &CGSHandler::TrxHandlerCopy; - m_pTransferHandler[PSMT8] = &CGSHandler::TrxHandlerCopy; - m_pTransferHandler[PSMT4] = &CGSHandler::TrxHandlerPSMT4; - m_pTransferHandler[PSMT8H] = &CGSHandler::TrxHandlerPSMT8H; - m_pTransferHandler[PSMT4HL] = &CGSHandler::TrxHandlerPSMT4H<24, 0x0F000000>; - m_pTransferHandler[PSMT4HH] = &CGSHandler::TrxHandlerPSMT4H<28, 0xF0000000>; - - Reset(); - - m_thread = new boost::thread(bind(&CGSHandler::ThreadProc, this)); -} - -CGSHandler::~CGSHandler() -{ - m_threadDone = true; - m_thread->join(); - delete m_thread; - FREEPTR(m_pRAM); -} - -void CGSHandler::Reset() -{ - memset(m_nReg, 0, sizeof(uint64) * 0x80); - m_nReg[GS_REG_PRMODECONT] = 1; - memset(m_pRAM, 0, RAMSIZE); - m_nPMODE = 0; - m_nDISPFB1 = 0; - m_nDISPLAY1 = 0; - m_nDISPFB2 = 0; - m_nDISPLAY2 = 0; - m_nCSR = 0; - m_nIMR = 0; - m_nCrtIsInterlaced = false; - m_nCrtMode = 0; - m_nCrtIsFrameMode = false; - m_enabled = true; - m_renderDone = false; -} - -void CGSHandler::SetEnabled(bool enabled) -{ - m_enabled = enabled; -} - -bool CGSHandler::IsRenderDone() const -{ - return m_renderDone; -} - -void CGSHandler::SaveState(CZipArchiveWriter& archive) -{ - archive.InsertFile(new CMemoryStateFile(STATE_RAM, m_pRAM, RAMSIZE)); - archive.InsertFile(new CMemoryStateFile(STATE_REGS, m_nReg, sizeof(uint64) * 0x80)); - archive.InsertFile(new CMemoryStateFile(STATE_TRXCTX, &m_TrxCtx, sizeof(TRXCONTEXT))); - - { - CRegisterStateFile* registerFile = new CRegisterStateFile(STATE_PRIVREGS); - - registerFile->SetRegister64(STATE_PRIVREGS_PMODE, m_nPMODE); - registerFile->SetRegister64(STATE_PRIVREGS_DISPFB1, m_nDISPFB1); - registerFile->SetRegister64(STATE_PRIVREGS_DISPLAY1, m_nDISPLAY1); - registerFile->SetRegister64(STATE_PRIVREGS_DISPFB2, m_nDISPFB2); - registerFile->SetRegister64(STATE_PRIVREGS_DISPLAY2, m_nDISPLAY2); - registerFile->SetRegister64(STATE_PRIVREGS_CSR, m_nCSR); - registerFile->SetRegister64(STATE_PRIVREGS_IMR, m_nIMR); - registerFile->SetRegister32(STATE_PRIVREGS_CRTINTERLACED, m_nCrtIsInterlaced); - registerFile->SetRegister32(STATE_PRIVREGS_CRTMODE, m_nCrtMode); - registerFile->SetRegister32(STATE_PRIVREGS_CRTFRAMEMODE, m_nCrtIsFrameMode); - - archive.InsertFile(registerFile); - } -} - -void CGSHandler::LoadState(CZipArchiveReader& archive) -{ - archive.BeginReadFile(STATE_RAM )->Read(m_pRAM, RAMSIZE); - archive.BeginReadFile(STATE_REGS )->Read(m_nReg, sizeof(uint64) * 0x80); - archive.BeginReadFile(STATE_TRXCTX )->Read(&m_TrxCtx, sizeof(TRXCONTEXT)); - - { - CRegisterStateFile registerFile(*archive.BeginReadFile(STATE_PRIVREGS)); - m_nPMODE = registerFile.GetRegister64(STATE_PRIVREGS_PMODE); - m_nDISPFB1 = registerFile.GetRegister64(STATE_PRIVREGS_DISPFB1); - m_nDISPLAY1 = registerFile.GetRegister64(STATE_PRIVREGS_DISPLAY1); - m_nDISPFB2 = registerFile.GetRegister64(STATE_PRIVREGS_DISPFB2); - m_nDISPLAY2 = registerFile.GetRegister64(STATE_PRIVREGS_DISPLAY2); - m_nCSR = registerFile.GetRegister64(STATE_PRIVREGS_CSR); - m_nIMR = registerFile.GetRegister64(STATE_PRIVREGS_IMR); - m_nCrtIsInterlaced = registerFile.GetRegister32(STATE_PRIVREGS_CRTINTERLACED) != 0; - m_nCrtMode = registerFile.GetRegister32(STATE_PRIVREGS_CRTMODE); - m_nCrtIsFrameMode = registerFile.GetRegister32(STATE_PRIVREGS_CRTFRAMEMODE) != 0; - } - - UpdateViewport(); -} - -void CGSHandler::SetVBlank() -{ - m_nCSR |= 0x08; -// CINTC::AssertLine(CINTC::INTC_LINE_VBLANK_START); -} - -void CGSHandler::ResetVBlank() -{ - m_nCSR &= ~0x08; - - //Alternate current field - m_nCSR ^= 0x2000; -// CINTC::AssertLine(CINTC::INTC_LINE_VBLANK_END); -} - -uint32 CGSHandler::ReadPrivRegister(uint32 nAddress) -{ - uint32 nData; - switch(nAddress >> 4) - { - case 0x1200100: - //Force CSR to have the H-Blank bit set. - m_nCSR |= 0x04; - R_REG(nAddress, nData, m_nCSR); - break; - default: - CLog::GetInstance().Print(LOG_NAME, "Read an unhandled priviledged register (0x%0.8X).\r\n", nAddress); - nData = 0xCCCCCCCC; - break; - } - return nData; -} - -void CGSHandler::WritePrivRegister(uint32 nAddress, uint32 nData) -{ - switch(nAddress >> 4) - { - case 0x1200000: - W_REG(nAddress, nData, m_nPMODE); - if(!(nAddress & 0x4)) - { - if((m_nPMODE & 0x01) && (m_nPMODE & 0x02)) - { - CLog::GetInstance().Print(LOG_NAME, "Warning. Both read circuits were enabled. Using RC1 for display.\r\n"); - m_nPMODE &= ~0x02; - } - } - break; - case 0x1200007: - W_REG(nAddress, nData, m_nDISPFB1); - if(nAddress & 0x04) - { -#ifdef _DEBUG - DISPFB* dispfb; - dispfb = GetDispFb(0); - CLog::GetInstance().Print(LOG_NAME, "DISPFB1(FBP: 0x%0.8X, FBW: %i, PSM: %i, DBX: %i, DBY: %i);\r\n", \ - dispfb->GetBufPtr(), \ - dispfb->GetBufWidth(), \ - dispfb->nPSM, \ - dispfb->nX, \ - dispfb->nY); -#endif - } - break; - case 0x1200008: - W_REG(nAddress, nData, m_nDISPLAY1); - if(nAddress & 0x04) - { - UpdateViewport(); - } - break; - case 0x1200009: - W_REG(nAddress, nData, m_nDISPFB2); - if(nAddress & 0x04) - { -#ifdef _DEBUG - DISPFB* dispfb; - dispfb = GetDispFb(1); - CLog::GetInstance().Print(LOG_NAME, "DISPFB2(FBP: 0x%0.8X, FBW: %i, PSM: %i, DBX: %i, DBY: %i);\r\n", \ - dispfb->GetBufPtr(), \ - dispfb->GetBufWidth(), \ - dispfb->nPSM, \ - dispfb->nX, \ - dispfb->nY); -#endif - //Speed hack for Atelier Iris - Flip(); - } - break; - case 0x120000A: - W_REG(nAddress, nData, m_nDISPLAY2); - if(nAddress & 0x04) - { - UpdateViewport(); - } - break; - case 0x1200100: - W_REG(nAddress, nData, m_nCSR); - if(!(nAddress & 0x04)) - { - SetVBlank(); - //Flip(); - if(nData & 0x08) - { - ResetVBlank(); - } - } - break; - case 0x1200101: - W_REG(nAddress, nData, m_nIMR); - break; - default: - CLog::GetInstance().Print(LOG_NAME, "Wrote to an unhandled priviledged register (0x%0.8X, 0x%0.8X).\r\n", nAddress, nData); - break; - } -} - -void CGSHandler::Initialize() -{ - m_mailBox.SendCall(bind(&CGSHandler::InitializeImpl, this)); -} - -void CGSHandler::Release() -{ - m_mailBox.SendCall(bind(&CGSHandler::ReleaseImpl, this), true); -} - -void CGSHandler::Flip() -{ - OnNewFrame(); - if(!m_enabled) return; - while(m_mailBox.IsPending()) - { - //Flush all commands - boost::thread::yield(); - } - m_mailBox.SendCall(bind(&CGSHandler::FlipImpl, this)); -#ifdef _DEBUG - CLog::GetInstance().Print(LOG_NAME, "Frame Done.\r\n---------------------------------------------------------------------------------\r\n"); -#endif -} - -void CGSHandler::ForcedFlip() -{ - -} - -void CGSHandler::WriteRegister(uint8 registerId, uint64 value) -{ - m_mailBox.SendCall(bind(&CGSHandler::WriteRegisterImpl, this, registerId, value)); -} - -void CGSHandler::FeedImageData(void* data, uint32 length) -{ - uint8* buffer = new uint8[length]; - memcpy(buffer, data, length); - m_mailBox.SendCall(bind(&CGSHandler::FeedImageDataImpl, this, buffer, length)); -} - -void CGSHandler::WriteRegisterMassively(const RegisterWrite* writeList, unsigned int count) -{ - m_mailBox.SendCall(bind(&CGSHandler::WriteRegisterMassivelyImpl, this, writeList, count)); -} - -void CGSHandler::UpdateViewport() -{ - m_mailBox.SendCall(bind(&CGSHandler::UpdateViewportImpl, this)); -} - -void CGSHandler::WriteRegisterImpl(uint8 nRegister, uint64 nData) -{ - m_nReg[nRegister] = nData; - - switch(nRegister) - { - case GS_REG_TRXDIR: - BITBLTBUF* pBuf; - TRXREG* pReg; - unsigned int nPixelSize; - - pBuf = GetBitBltBuf(); - pReg = GetTrxReg(); - - //We need to figure out the pixel size of the source stream - switch(pBuf->nDstPsm) - { - case PSMCT32: - nPixelSize = 32; - break; - case PSMCT24: - nPixelSize = 24; - break; - case PSMCT16: - nPixelSize = 16; - break; - case PSMT8: - case PSMT8H: - nPixelSize = 8; - break; - case PSMT4: - case PSMT4HH: - case PSMT4HL: - nPixelSize = 4; - break; - default: - assert(0); - break; - } - - m_TrxCtx.nSize = (pReg->nRRW * pReg->nRRH * nPixelSize) / 8; - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY = 0; - m_TrxCtx.nDirty = false; - - break; - } - -#ifdef _DEBUG - DisassembleWrite(nRegister, nData); -#endif -} - -void CGSHandler::FeedImageDataImpl(void* pData, uint32 nLength) -{ - boost::scoped_array dataPtr(reinterpret_cast(pData)); - - if(m_TrxCtx.nSize == 0) - { -#ifdef _DEBUG - CLog::GetInstance().Print(LOG_NAME, "Warning. Received image data when no transfer was expected.\r\n"); -#endif - return; - } - - if(m_TrxCtx.nSize < nLength) - { - nLength = m_TrxCtx.nSize; - //assert(0); - //return; - } - - BITBLTBUF* pBuf(GetBitBltBuf()); - if(pBuf->nDstPsm == 1) return; - m_TrxCtx.nDirty |= ((this)->*(m_pTransferHandler[pBuf->nDstPsm]))(pData, nLength); - - m_TrxCtx.nSize -= nLength; - - if(m_TrxCtx.nSize == 0) - { - if(m_TrxCtx.nDirty) - { - BITBLTBUF* pBuf = GetBitBltBuf(); - TRXREG* pReg = GetTrxReg(); - - uint32 nSize = (pBuf->GetDstWidth() * pReg->nRRH * GetPsmPixelSize(pBuf->nDstPsm)) / 8; - - ProcessImageTransfer(pBuf->GetDstPtr(), nSize); - -#ifdef _DEBUG - CLog::GetInstance().Print(LOG_NAME, "Dirty image transfer at 0x%0.8X.\r\n", pBuf->GetDstPtr()); -#endif - } - } -} - -void CGSHandler::WriteRegisterMassivelyImpl(const RegisterWrite* writeList, unsigned int count) -{ - const RegisterWrite* writeIterator = writeList; - for(unsigned int i = 0; i < count; i++) - { - WriteRegisterImpl(writeIterator->first, writeIterator->second); - writeIterator++; - } - delete [] writeList; -} - -void CGSHandler::FetchImagePSMCT16(uint16* pDst, uint32 nBufPos, uint32 nBufWidth, uint32 nWidth, uint32 nHeight) -{ - CPixelIndexorPSMCT16 Indexor(m_pRAM, nBufPos, nBufWidth); - - for(unsigned int j = 0; j < nHeight; j++) - { - for(unsigned int i = 0; i < nWidth; i++) - { - pDst[i] = Indexor.GetPixel(i, j); - } - - pDst += (nWidth); - } -} - -void CGSHandler::FetchImagePSMCT16S(uint16* pDst, uint32 nBufPos, uint32 nBufWidth, uint32 nWidth, uint32 nHeight) -{ - CPixelIndexorPSMCT16S Indexor(m_pRAM, nBufPos, nBufWidth); - - for(unsigned int j = 0; j < nHeight; j++) - { - for(unsigned int i = 0; i < nWidth; i++) - { - pDst[i] = Indexor.GetPixel(i, j); - } - - pDst += (nWidth); - } -} - -void CGSHandler::FetchImagePSMCT32(uint32* pDst, uint32 nBufPos, uint32 nBufWidth, uint32 nWidth, uint32 nHeight) -{ - CPixelIndexorPSMCT32 Indexor(m_pRAM, nBufPos, nBufWidth); - - for(unsigned int j = 0; j < nHeight; j++) - { - for(unsigned int i = 0; i < nWidth; i++) - { - pDst[i] = Indexor.GetPixel(i, j); - } - - pDst += (nWidth); - } -} - -bool CGSHandler::TrxHandlerInvalid(void* pData, uint32 nLength) -{ - assert(0); - return false; -} - -template -bool CGSHandler::TrxHandlerCopy(void* pData, uint32 nLength) -{ - typename Storage::Unit* pSrc; - uint32 nX, nY; - TRXPOS* pTrxPos; - TRXREG* pTrxReg; - BITBLTBUF* pTrxBuf; - bool nDirty = false; - - nLength /= sizeof(typename Storage::Unit); - pTrxPos = GetTrxPos(); - pTrxReg = GetTrxReg(); - pTrxBuf = GetBitBltBuf(); - - CPixelIndexor Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); - - pSrc = (typename Storage::Unit*)pData; - - for(unsigned int i = 0; i < nLength; i++) - { - typename Storage::Unit* pPixel; - - nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; - nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; - - pPixel = Indexor.GetPixelAddress(nX, nY); - - if((*pPixel) != pSrc[i]) - { - (*pPixel) = pSrc[i]; - nDirty = true; - } - - m_TrxCtx.nRRX++; - if(m_TrxCtx.nRRX == pTrxReg->nRRW) - { - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY++; - } - } - - return nDirty; -} - -bool CGSHandler::TrxHandlerPSMCT24(void* pData, uint32 nLength) -{ - uint8* pSrc; - uint32* pDstPixel; - uint32 nSrcPixel; - uint32 nX, nY; - TRXPOS* pTrxPos; - TRXREG* pTrxReg; - BITBLTBUF* pTrxBuf; - - pTrxPos = GetTrxPos(); - pTrxReg = GetTrxReg(); - pTrxBuf = GetBitBltBuf(); - - CPixelIndexorPSMCT32 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); - - pSrc = (uint8*)pData; - - for(unsigned int i = 0; i < nLength; i += 3) - { - nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; - nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; - - pDstPixel = Indexor.GetPixelAddress(nX, nY); - nSrcPixel = (*(uint32*)&pSrc[i]) & 0x00FFFFFF; - (*pDstPixel) &= 0xFF000000; - (*pDstPixel) |= nSrcPixel; - - m_TrxCtx.nRRX++; - if(m_TrxCtx.nRRX == pTrxReg->nRRW) - { - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY++; - } - } - - return true; -} - -bool CGSHandler::TrxHandlerPSMT4(void* pData, uint32 nLength) -{ - //Gotta rewrite this - bool dirty = false; - TRXPOS* pTrxPos = GetTrxPos(); - TRXREG* pTrxReg = GetTrxReg(); - BITBLTBUF* pTrxBuf = GetBitBltBuf(); - - CPixelIndexorPSMT4 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); - -// assert(0); - - uint8* pSrc = (uint8*)pData; - - for(unsigned int i = 0; i < nLength; i++) - { - uint8 nPixel[2]; - - nPixel[0] = (pSrc[i] >> 0) & 0x0F; - nPixel[1] = (pSrc[i] >> 4) & 0x0F; - - for(unsigned int j = 0; j < 2; j++) - { - uint32 nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; - uint32 nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; - - uint8 currentPixel = Indexor.GetPixel(nX, nY); - if(currentPixel != nPixel[j]) - { - Indexor.SetPixel(nX, nY, nPixel[j]); - dirty = true; - } - - m_TrxCtx.nRRX++; - if(m_TrxCtx.nRRX == pTrxReg->nRRW) - { - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY++; - } - } - } - - return dirty; -} - -template -bool CGSHandler::TrxHandlerPSMT4H(void* pData, uint32 nLength) -{ - uint8* pSrc; - uint8 nSrcPixel; - uint32 nX, nY; - uint32* pDstPixel; - TRXPOS* pTrxPos; - TRXREG* pTrxReg; - BITBLTBUF* pTrxBuf; - - pTrxPos = GetTrxPos(); - pTrxReg = GetTrxReg(); - pTrxBuf = GetBitBltBuf(); - - CPixelIndexorPSMCT32 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); - - pSrc = (uint8*)pData; - - for(unsigned int i = 0; i < nLength; i++) - { - //Pixel 1 - nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; - nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; - - nSrcPixel = pSrc[i] & 0x0F; - - pDstPixel = Indexor.GetPixelAddress(nX, nY); - (*pDstPixel) &= ~nMask; - (*pDstPixel) |= (nSrcPixel << nShift); - - m_TrxCtx.nRRX++; - if(m_TrxCtx.nRRX == pTrxReg->nRRW) - { - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY++; - } - - //Pixel 2 - nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; - nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; - - nSrcPixel = (pSrc[i] & 0xF0); - - pDstPixel = Indexor.GetPixelAddress(nX, nY); - (*pDstPixel) &= ~nMask; - (*pDstPixel) |= (nSrcPixel << (nShift - 4)); - - m_TrxCtx.nRRX++; - if(m_TrxCtx.nRRX == pTrxReg->nRRW) - { - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY++; - } - } - - return true; -} - -bool CGSHandler::TrxHandlerPSMT8H(void* pData, uint32 nLength) -{ - uint8* pSrc; - uint8 nSrcPixel; - uint32 nX, nY; - uint32* pDstPixel; - TRXPOS* pTrxPos; - TRXREG* pTrxReg; - BITBLTBUF* pTrxBuf; - - pTrxPos = GetTrxPos(); - pTrxReg = GetTrxReg(); - pTrxBuf = GetBitBltBuf(); - - CPixelIndexorPSMCT32 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); - - pSrc = (uint8*)pData; - - for(unsigned int i = 0; i < nLength; i++) - { - nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; - nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; - - nSrcPixel = pSrc[i]; - - pDstPixel = Indexor.GetPixelAddress(nX, nY); - (*pDstPixel) &= ~0xFF000000; - (*pDstPixel) |= (nSrcPixel << 24); - - m_TrxCtx.nRRX++; - if(m_TrxCtx.nRRX == pTrxReg->nRRW) - { - m_TrxCtx.nRRX = 0; - m_TrxCtx.nRRY++; - } - } - - return true; -} - -void CGSHandler::SetCrt(bool nIsInterlaced, unsigned int nMode, bool nIsFrameMode) -{ - m_nCrtMode = nMode; - m_nCrtIsInterlaced = nIsInterlaced; - m_nCrtIsFrameMode = nIsFrameMode; - - UpdateViewport(); -} - -CGSHandler::DISPFB* CGSHandler::GetDispFb(unsigned int nUnit) -{ - switch(nUnit) - { - case 0: - return (DISPFB*)&m_nDISPFB1; - break; - case 1: - return (DISPFB*)&m_nDISPFB2; - break; - default: - assert(0); - return NULL; - break; - } -} - -CGSHandler::TEXCLUT* CGSHandler::GetTexClut() -{ - return (TEXCLUT*)&m_nReg[GS_REG_TEXCLUT]; -} - -CGSHandler::FOGCOL* CGSHandler::GetFogCol() -{ - return (FOGCOL*)&m_nReg[GS_REG_FOGCOL]; -} - -CGSHandler::FRAME* CGSHandler::GetFrame(unsigned int nUnit) -{ - assert(nUnit < 2); - return (FRAME*)&m_nReg[GS_REG_FRAME_1 + nUnit]; -} - -CGSHandler::TRXREG* CGSHandler::GetTrxReg() -{ - return (TRXREG*)&m_nReg[GS_REG_TRXREG]; -} - -CGSHandler::TRXPOS* CGSHandler::GetTrxPos() -{ - return (TRXPOS*)&m_nReg[GS_REG_TRXPOS]; -} - -CGSHandler::BITBLTBUF* CGSHandler::GetBitBltBuf() -{ - return (BITBLTBUF*)&m_nReg[GS_REG_BITBLTBUF]; -} - -unsigned int CGSHandler::GetCrtWidth() -{ - switch(m_nCrtMode) - { - case 0x02: - case 0x03: - case 0x1C: - return 640; - break; - default: - assert(0); - return 640; - break; - } -} - -unsigned int CGSHandler::GetCrtHeight() -{ - switch(m_nCrtMode) - { - case 0x02: - return 448; - break; - case 0x03: - return 512; - break; - case 0x1C: - return 480; - break; - default: - assert(0); - return 448; - break; - } -} - -bool CGSHandler::GetCrtIsInterlaced() -{ - return m_nCrtIsInterlaced; -} - -bool CGSHandler::GetCrtIsFrameMode() -{ - return m_nCrtIsFrameMode; -} - -unsigned int CGSHandler::GetPsmPixelSize(unsigned int nPSM) -{ - switch(nPSM) - { - case PSMCT32: - case PSMT4HH: - case PSMT4HL: - case PSMT8H: - return 32; - break; - case PSMCT24: - return 24; - break; - case PSMCT16: - case PSMCT16S: - return 16; - break; - case PSMT8: - return 8; - break; - case PSMT4: - return 4; - break; - default: - assert(0); - return 0; - break; - } -} - -void CGSHandler::DisassembleWrite(uint8 nRegister, uint64 nData) -{ - GSPRIM pr; - double nX, nY, nZ; - double nU, nV; - double nS, nT; - - //Filtering - //if(!((nRegister == GS_REG_FRAME_1) || (nRegister == GS_REG_FRAME_2))) return; - //if(!((nRegister == GS_REG_TEST_1) || (nRegister == GS_REG_TEST_2))) return; - - switch(nRegister) - { - case GS_REG_PRIM: - DECODE_PRIM(nData, pr); - CLog::GetInstance().Print(LOG_NAME, "PRIM(PRI: %i, IIP: %i, TME: %i, FGE: %i, ABE: %i, AA1: %i, FST: %i, CTXT: %i, FIX: %i);\r\n", \ - pr.nType, \ - pr.nShading, \ - pr.nTexture, \ - pr.nFog, \ - pr.nAlpha, \ - pr.nAntiAliasing, \ - pr.nUseUV, \ - pr.nContext, \ - pr.nUseFloat); - break; - case GS_REG_RGBAQ: - RGBAQ rgbaq; - rgbaq <<= nData; - CLog::GetInstance().Print(LOG_NAME, "RGBAQ(R: 0x%0.2X, G: 0x%0.2X, B: 0x%0.2X, A: 0x%0.2X, Q: %f);\r\n", \ - rgbaq.nR, - rgbaq.nG, - rgbaq.nB, - rgbaq.nA, - rgbaq.nQ); - break; - case GS_REG_ST: - DECODE_ST(nData, nS, nT); - CLog::GetInstance().Print(LOG_NAME, "ST(S: %f, T: %f);\r\n", \ - nS, \ - nT); - break; - case GS_REG_UV: - DECODE_UV(nData, nU, nV); - CLog::GetInstance().Print(LOG_NAME, "UV(U: %f, V: %f);\r\n", \ - nU, \ - nV); - break; - case GS_REG_XYZ2: - DECODE_XYZ2(nData, nX, nY, nZ); - CLog::GetInstance().Print(LOG_NAME, "XYZ2(%f, %f, %f);\r\n", \ - nX, \ - nY, \ - nZ); - break; - case GS_REG_XYZF2: - case GS_REG_XYZF3: - { - XYZF xyzf; - xyzf = *reinterpret_cast(&nData); - CLog::GetInstance().Print(LOG_NAME, "%s(%f, %f, %i, %i);\r\n", \ - (nRegister == GS_REG_XYZF2) ? "XYZF2" : "XYZF3", - xyzf.GetX(), - xyzf.GetY(), - xyzf.nZ, - xyzf.nF); - } - break; - case GS_REG_XYZ3: - DECODE_XYZ2(nData, nX, nY, nZ); - CLog::GetInstance().Print(LOG_NAME, "XYZ3(%f, %f, %f);\r\n", \ - nX, \ - nY, \ - nZ); - break; - case GS_REG_TEX0_1: - case GS_REG_TEX0_2: - { - TEX0 tex; - tex <<= nData; - CLog::GetInstance().Print(LOG_NAME, "TEX0_%i(TBP: 0x%0.8X, TBW: %i, PSM: %i, TW: %i, TH: %i, TCC: %i, TFX: %i, CBP: 0x%0.8X, CPSM: %i, CSM: %i, CSA: %i, CLD: %i);\r\n", \ - nRegister == GS_REG_TEX0_1 ? 1 : 2, \ - tex.GetBufPtr(), \ - tex.GetBufWidth(), \ - tex.nPsm, \ - tex.GetWidth(), \ - tex.GetHeight(), \ - tex.nColorComp, \ - tex.nFunction, \ - tex.GetCLUTPtr(), \ - tex.nCPSM, \ - tex.nCSM, \ - tex.nCSA, \ - tex.nCLD); - } - break; - case GS_REG_CLAMP_1: - case GS_REG_CLAMP_2: - { - CLAMP clamp; - clamp <<= nData; - CLog::GetInstance().Print(LOG_NAME, "CLAMP_%i(WMS: %i, WMT: %i, MINU: %i, MAXU: %i, MINV: %i, MAXV: %i);\r\n", \ - nRegister == GS_REG_CLAMP_1 ? 1 : 2, \ - clamp.nWMS, \ - clamp.nWMT, \ - clamp.GetMinU(), \ - clamp.GetMaxU(), \ - clamp.GetMinV(), \ - clamp.GetMaxV()); - } - break; - case GS_REG_TEX1_1: - case GS_REG_TEX1_2: - { - TEX1 tex1; - tex1 <<= nData; - CLog::GetInstance().Print(LOG_NAME, "TEX1_%i(LCM: %i, MXL: %i, MMAG: %i, MMIN: %i, MTBA: %i, L: %i, K: %i);\r\n", \ - nRegister == GS_REG_TEX1_1 ? 1 : 2, \ - tex1.nLODMethod, \ - tex1.nMaxMip, \ - tex1.nMagFilter, \ - tex1.nMinFilter, \ - tex1.nMipBaseAddr, \ - tex1.nLODL, \ - tex1.nLODK); - } - break; - case GS_REG_TEX2_1: - case GS_REG_TEX2_2: - TEX2 tex2; - tex2 = *(TEX2*)&nData; - CLog::GetInstance().Print(LOG_NAME, "TEX2_%i(PSM: %i, CBP: 0x%0.8X, CPSM: %i, CSM: %i, CSA: %i, CLD: %i);\r\n", \ - nRegister == GS_REG_TEX2_1 ? 1 : 2, \ - tex2.nPsm, \ - tex2.GetCLUTPtr(), \ - tex2.nCPSM, \ - tex2.nCSM, \ - tex2.nCSA, \ - tex2.nCLD); - break; - case GS_REG_XYOFFSET_1: - case GS_REG_XYOFFSET_2: - CLog::GetInstance().Print(LOG_NAME, "XYOFFSET_%i(%i, %i);\r\n", \ - nRegister == GS_REG_XYOFFSET_1 ? 1 : 2, \ - (uint32)((nData >> 0) & 0xFFFFFFFF), \ - (uint32)((nData >> 32) & 0xFFFFFFFF)); - break; - case GS_REG_PRMODECONT: - CLog::GetInstance().Print(LOG_NAME, "PRMODECONT(AC = %i);\r\n", \ - nData & 1); - break; - case GS_REG_PRMODE: - PRMODE prm; - prm <<= nData; - CLog::GetInstance().Print(LOG_NAME, "PRMODE(IIP: %i, TME: %i, FGE: %i, ABE: %i, AA1: %i, FST: %i, CTXT: %i, FIX: %i);\r\n", \ - prm.nShading, \ - prm.nTexture, \ - prm.nFog, \ - prm.nAlpha, \ - prm.nAntiAliasing, \ - prm.nUseUV, \ - prm.nContext, \ - prm.nUseFloat); - break; - case GS_REG_TEXCLUT: - TEXCLUT clut; - clut = *(TEXCLUT*)&nData; - CLog::GetInstance().Print(LOG_NAME, "TEXCLUT(CBW: %i, COU: %i, COV: %i);\r\n", \ - clut.nCBW, - clut.nCOU, - clut.nCOV); - break; - case GS_REG_FOGCOL: - FOGCOL fogcol; - fogcol = *(FOGCOL*)&nData; - CLog::GetInstance().Print(LOG_NAME, "FOGCOL(R: 0x%0.2X, G: 0x%0.2X, B: 0x%0.2X);\r\n", \ - fogcol.nFCR, - fogcol.nFCG, - fogcol.nFCB); - break; - case GS_REG_TEXA: - TEXA TexA; - TexA <<= nData; - CLog::GetInstance().Print(LOG_NAME, "TEXA(TA0: 0x%0.2X, AEM: %i, TA1: 0x%0.2X);\r\n", \ - TexA.nTA0, - TexA.nAEM, - TexA.nTA1); - break; - case GS_REG_TEXFLUSH: - CLog::GetInstance().Print(LOG_NAME, "TEXFLUSH();\r\n"); - break; - case GS_REG_ALPHA_1: - case GS_REG_ALPHA_2: - ALPHA alpha; - alpha <<= nData; - CLog::GetInstance().Print(LOG_NAME, "ALPHA_%i(A: %i, B: %i, C: %i, D: %i, FIX: 0x%0.2X);\r\n", \ - nRegister == GS_REG_ALPHA_1 ? 1 : 2, \ - alpha.nA, \ - alpha.nB, \ - alpha.nC, \ - alpha.nD, \ - alpha.nFix); - break; - case GS_REG_SCISSOR_1: - CLog::GetInstance().Print(LOG_NAME, "SCISSOR_1(%i, %i, %i, %i);\r\n", \ - (uint32)((nData >> 0) & 0xFFFF), \ - (uint32)((nData >> 16) & 0xFFFF), \ - (uint32)((nData >> 32) & 0xFFFF), \ - (uint32)((nData >> 48) & 0xFFFF)); - break; - case GS_REG_TEST_1: - case GS_REG_TEST_2: - TEST tst; - tst <<= nData; - CLog::GetInstance().Print(LOG_NAME, "TEST_%i(ATE: %i, ATST: %i, AREF: 0x%0.2X, AFAIL: %i, DATE: %i, DATM: %i, ZTE: %i, ZTST: %i);\r\n", \ - nRegister == GS_REG_TEST_1 ? 1 : 2, \ - tst.nAlphaEnabled, \ - tst.nAlphaMethod, \ - tst.nAlphaRef, \ - tst.nAlphaFail, \ - tst.nDestAlphaEnabled, \ - tst.nDestAlphaMode, \ - tst.nDepthEnabled, \ - tst.nDepthMethod); - break; - case GS_REG_FRAME_1: - case GS_REG_FRAME_2: - FRAME fr; - fr = *(FRAME*)&nData; - CLog::GetInstance().Print(LOG_NAME, "FRAME_%i(FBP: 0x%0.8X, FBW: %i, PSM: %i, FBMSK: %i);\r\n", \ - nRegister == GS_REG_FRAME_1 ? 1 : 2, \ - fr.GetBasePtr(), \ - fr.GetWidth(), \ - fr.nPsm, \ - fr.nMask); - break; - case GS_REG_ZBUF_1: - case GS_REG_ZBUF_2: - ZBUF zbuf; - zbuf = *(ZBUF*)&nData; - CLog::GetInstance().Print(LOG_NAME, "ZBUF_%i(ZBP: 0x%0.8X, PSM: %i, ZMSK: %i);\r\n", \ - nRegister == GS_REG_ZBUF_1 ? 1 : 2, \ - zbuf.GetBasePtr(), \ - zbuf.nPsm, \ - zbuf.nMask); - break; - case GS_REG_BITBLTBUF: - BITBLTBUF buf; - buf = *(BITBLTBUF*)&nData; - CLog::GetInstance().Print(LOG_NAME, "BITBLTBUF(0x%0.8X, %i, %i, 0x%0.8X, %i, %i);\r\n", \ - buf.GetSrcPtr(), \ - buf.GetSrcWidth(), \ - buf.nSrcPsm, \ - buf.GetDstPtr(), \ - buf.GetDstWidth(), \ - buf.nDstPsm); - break; - case GS_REG_TRXPOS: - CLog::GetInstance().Print(LOG_NAME, "TRXPOS(%i, %i, %i, %i, %i);\r\n", \ - (uint32)((nData >> 0) & 0xFFFF), \ - (uint32)((nData >> 16) & 0xFFFF), \ - (uint32)((nData >> 32) & 0xFFFF), \ - (uint32)((nData >> 48) & 0xFF), \ - (uint32)((nData >> 59) & 0x1)); - break; - case GS_REG_TRXREG: - CLog::GetInstance().Print(LOG_NAME, "TRXREG(%i, %i);\r\n", \ - (uint32)((nData >> 0) & 0xFFFFFFFF), - (uint32)((nData >> 32) & 0xFFFFFFFF)); - break; - case GS_REG_TRXDIR: - CLog::GetInstance().Print(LOG_NAME, "TRXDIR(%i);\r\n", \ - (uint32)((nData >> 0) & 0xFFFFFFFF)); - break; - default: - CLog::GetInstance().Print(LOG_NAME, "Unknown command (0x%X).\r\n", nRegister); - break; - } -} - -void CGSHandler::ThreadProc() -{ - while(!m_threadDone) - { - m_mailBox.WaitForCall(100); - while(m_mailBox.IsPending()) - { - m_mailBox.ReceiveCall(); - } - } -} +#include +#include +#include +#include "GSHandler.h" +#include "INTC.h" +#include "PtrMacro.h" +#include "Log.h" +#include "MemoryStateFile.h" +#include "RegisterStateFile.h" + +#define R_REG(a, v, r) \ + if((a) & 0x4) \ + { \ + v = (uint32)(r >> 32); \ + } \ + else \ + { \ + v = (uint32)(r & 0xFFFFFFFF); \ + } + +#define W_REG(a, v, r) \ + if((a) & 0x4) \ + { \ + (r) &= 0x00000000FFFFFFFFULL; \ + (r) |= (uint64)(v) << 32; \ + } \ + else \ + { \ + (r) &= 0xFFFFFFFF00000000ULL; \ + (r) |= (v); \ + } + +#define STATE_RAM ("gs/ram") +#define STATE_REGS ("gs/regs") +#define STATE_TRXCTX ("gs/trxcontext") +#define STATE_PRIVREGS ("gs/privregs.xml") + +#define STATE_PRIVREGS_PMODE ("PMODE") +#define STATE_PRIVREGS_DISPFB1 ("DISPFB1") +#define STATE_PRIVREGS_DISPLAY1 ("DISPLAY1") +#define STATE_PRIVREGS_DISPFB2 ("DISPFB2") +#define STATE_PRIVREGS_DISPLAY2 ("DISPLAY2") +#define STATE_PRIVREGS_CSR ("CSR") +#define STATE_PRIVREGS_IMR ("IMR") +#define STATE_PRIVREGS_CRTINTERLACED ("CrtInterlated") +#define STATE_PRIVREGS_CRTMODE ("CrtMode") +#define STATE_PRIVREGS_CRTFRAMEMODE ("CrtFrameMode") + +#define LOG_NAME ("gs") + +using namespace Framework; +using namespace std; +using namespace std::tr1; + +int CGSHandler::STORAGEPSMCT32::m_nBlockSwizzleTable[4][8] = +{ + { 0, 1, 4, 5, 16, 17, 20, 21 }, + { 2, 3, 6, 7, 18, 19, 22, 23 }, + { 8, 9, 12, 13, 24, 25, 28, 29 }, + { 10, 11, 14, 15, 26, 27, 30, 31 }, +}; + +int CGSHandler::STORAGEPSMCT32::m_nColumnSwizzleTable[2][8] = +{ + { 0, 1, 4, 5, 8, 9, 12, 13, }, + { 2, 3, 6, 7, 10, 11, 14, 15, }, +}; + +int CGSHandler::STORAGEPSMCT16::m_nBlockSwizzleTable[8][4] = +{ + { 0, 2, 8, 10, }, + { 1, 3, 9, 11, }, + { 4, 6, 12, 14, }, + { 5, 7, 13, 15, }, + { 16, 18, 24, 26, }, + { 17, 19, 25, 27, }, + { 20, 22, 28, 30, }, + { 21, 23, 29, 31, }, +}; + +int CGSHandler::STORAGEPSMCT16::m_nColumnSwizzleTable[2][16] = +{ + { 0, 2, 8, 10, 16, 18, 24, 26, 1, 3, 9, 11, 17, 19, 25, 27, }, + { 4, 6, 12, 14, 20, 22, 28, 30, 5, 7, 13, 15, 21, 23, 29, 31, }, +}; + +int CGSHandler::STORAGEPSMCT16S::m_nBlockSwizzleTable[8][4] = +{ + { 0, 2, 16, 18, }, + { 1, 3, 17, 19, }, + { 8, 10, 24, 26, }, + { 9, 11, 25, 27, }, + { 4, 6, 20, 22, }, + { 5, 7, 21, 23, }, + { 12, 14, 28, 30, }, + { 13, 15, 29, 31, }, +}; + +int CGSHandler::STORAGEPSMCT16S::m_nColumnSwizzleTable[2][16] = +{ + { 0, 2, 8, 10, 16, 18, 24, 26, 1, 3, 9, 11, 17, 19, 25, 27, }, + { 4, 6, 12, 14, 20, 22, 28, 30, 5, 7, 13, 15, 21, 23, 29, 31, }, +}; + +int CGSHandler::STORAGEPSMT8::m_nBlockSwizzleTable[4][8] = +{ + { 0, 1, 4, 5, 16, 17, 20, 21 }, + { 2, 3, 6, 7, 18, 19, 22, 23 }, + { 8, 9, 12, 13, 24, 25, 28, 29 }, + { 10, 11, 14, 15, 26, 27, 30, 31 }, +}; + +int CGSHandler::STORAGEPSMT8::m_nColumnWordTable[2][2][8] = +{ + { + { 0, 1, 4, 5, 8, 9, 12, 13, }, + { 2, 3, 6, 7, 10, 11, 14, 15, }, + }, + { + { 8, 9, 12, 13, 0, 1, 4, 5, }, + { 10, 11, 14, 15, 2, 3, 6, 7, }, + }, +}; + +int CGSHandler::STORAGEPSMT4::m_nBlockSwizzleTable[8][4] = +{ + { 0, 2, 8, 10, }, + { 1, 3, 9, 11, }, + { 4, 6, 12, 14, }, + { 5, 7, 13, 15, }, + { 16, 18, 24, 26, }, + { 17, 19, 25, 27, }, + { 20, 22, 28, 30, }, + { 21, 23, 29, 31, } +}; + +int CGSHandler::STORAGEPSMT4::m_nColumnWordTable[2][2][8] = +{ + { + { 0, 1, 4, 5, 8, 9, 12, 13, }, + { 2, 3, 6, 7, 10, 11, 14, 15, }, + }, + { + { 8, 9, 12, 13, 0, 1, 4, 5, }, + { 10, 11, 14, 15, 2, 3, 6, 7, }, + }, +}; + +CGSHandler::CGSHandler() : +m_thread(NULL), +m_enabled(true), +m_renderDone(false), +m_threadDone(false) +{ + m_pRAM = (uint8*)malloc(RAMSIZE); + + for(int i = 0; i < PSM_MAX; i++) + { + m_pTransferHandler[i] = &CGSHandler::TrxHandlerInvalid; + } + + m_pTransferHandler[PSMCT32] = &CGSHandler::TrxHandlerCopy; + m_pTransferHandler[PSMCT24] = &CGSHandler::TrxHandlerPSMCT24; + m_pTransferHandler[PSMCT16] = &CGSHandler::TrxHandlerCopy; + m_pTransferHandler[PSMT8] = &CGSHandler::TrxHandlerCopy; + m_pTransferHandler[PSMT4] = &CGSHandler::TrxHandlerPSMT4; + m_pTransferHandler[PSMT8H] = &CGSHandler::TrxHandlerPSMT8H; + m_pTransferHandler[PSMT4HL] = &CGSHandler::TrxHandlerPSMT4H<24, 0x0F000000>; + m_pTransferHandler[PSMT4HH] = &CGSHandler::TrxHandlerPSMT4H<28, 0xF0000000>; + + Reset(); + + m_thread = new boost::thread(bind(&CGSHandler::ThreadProc, this)); +} + +CGSHandler::~CGSHandler() +{ + m_threadDone = true; + m_thread->join(); + delete m_thread; + FREEPTR(m_pRAM); +} + +void CGSHandler::Reset() +{ + memset(m_nReg, 0, sizeof(uint64) * 0x80); + m_nReg[GS_REG_PRMODECONT] = 1; + memset(m_pRAM, 0, RAMSIZE); + m_nPMODE = 0; + m_nDISPFB1 = 0; + m_nDISPLAY1 = 0; + m_nDISPFB2 = 0; + m_nDISPLAY2 = 0; + m_nCSR = 0; + m_nIMR = 0; + m_nCrtIsInterlaced = false; + m_nCrtMode = 0; + m_nCrtIsFrameMode = false; + m_enabled = true; + m_renderDone = false; +} + +void CGSHandler::SetEnabled(bool enabled) +{ + m_enabled = enabled; +} + +bool CGSHandler::IsRenderDone() const +{ + return m_renderDone; +} + +void CGSHandler::SaveState(CZipArchiveWriter& archive) +{ + archive.InsertFile(new CMemoryStateFile(STATE_RAM, m_pRAM, RAMSIZE)); + archive.InsertFile(new CMemoryStateFile(STATE_REGS, m_nReg, sizeof(uint64) * 0x80)); + archive.InsertFile(new CMemoryStateFile(STATE_TRXCTX, &m_TrxCtx, sizeof(TRXCONTEXT))); + + { + CRegisterStateFile* registerFile = new CRegisterStateFile(STATE_PRIVREGS); + + registerFile->SetRegister64(STATE_PRIVREGS_PMODE, m_nPMODE); + registerFile->SetRegister64(STATE_PRIVREGS_DISPFB1, m_nDISPFB1); + registerFile->SetRegister64(STATE_PRIVREGS_DISPLAY1, m_nDISPLAY1); + registerFile->SetRegister64(STATE_PRIVREGS_DISPFB2, m_nDISPFB2); + registerFile->SetRegister64(STATE_PRIVREGS_DISPLAY2, m_nDISPLAY2); + registerFile->SetRegister64(STATE_PRIVREGS_CSR, m_nCSR); + registerFile->SetRegister64(STATE_PRIVREGS_IMR, m_nIMR); + registerFile->SetRegister32(STATE_PRIVREGS_CRTINTERLACED, m_nCrtIsInterlaced); + registerFile->SetRegister32(STATE_PRIVREGS_CRTMODE, m_nCrtMode); + registerFile->SetRegister32(STATE_PRIVREGS_CRTFRAMEMODE, m_nCrtIsFrameMode); + + archive.InsertFile(registerFile); + } +} + +void CGSHandler::LoadState(CZipArchiveReader& archive) +{ + archive.BeginReadFile(STATE_RAM )->Read(m_pRAM, RAMSIZE); + archive.BeginReadFile(STATE_REGS )->Read(m_nReg, sizeof(uint64) * 0x80); + archive.BeginReadFile(STATE_TRXCTX )->Read(&m_TrxCtx, sizeof(TRXCONTEXT)); + + { + CRegisterStateFile registerFile(*archive.BeginReadFile(STATE_PRIVREGS)); + m_nPMODE = registerFile.GetRegister64(STATE_PRIVREGS_PMODE); + m_nDISPFB1 = registerFile.GetRegister64(STATE_PRIVREGS_DISPFB1); + m_nDISPLAY1 = registerFile.GetRegister64(STATE_PRIVREGS_DISPLAY1); + m_nDISPFB2 = registerFile.GetRegister64(STATE_PRIVREGS_DISPFB2); + m_nDISPLAY2 = registerFile.GetRegister64(STATE_PRIVREGS_DISPLAY2); + m_nCSR = registerFile.GetRegister64(STATE_PRIVREGS_CSR); + m_nIMR = registerFile.GetRegister64(STATE_PRIVREGS_IMR); + m_nCrtIsInterlaced = registerFile.GetRegister32(STATE_PRIVREGS_CRTINTERLACED) != 0; + m_nCrtMode = registerFile.GetRegister32(STATE_PRIVREGS_CRTMODE); + m_nCrtIsFrameMode = registerFile.GetRegister32(STATE_PRIVREGS_CRTFRAMEMODE) != 0; + } + + UpdateViewport(); +} + +void CGSHandler::SetVBlank() +{ + m_nCSR |= 0x08; +// CINTC::AssertLine(CINTC::INTC_LINE_VBLANK_START); +} + +void CGSHandler::ResetVBlank() +{ + m_nCSR &= ~0x08; + + //Alternate current field + m_nCSR ^= 0x2000; +// CINTC::AssertLine(CINTC::INTC_LINE_VBLANK_END); +} + +uint32 CGSHandler::ReadPrivRegister(uint32 nAddress) +{ + uint32 nData; + switch(nAddress >> 4) + { + case 0x1200100: + //Force CSR to have the H-Blank bit set. + m_nCSR |= 0x04; + R_REG(nAddress, nData, m_nCSR); + break; + default: + CLog::GetInstance().Print(LOG_NAME, "Read an unhandled priviledged register (0x%0.8X).\r\n", nAddress); + nData = 0xCCCCCCCC; + break; + } + return nData; +} + +void CGSHandler::WritePrivRegister(uint32 nAddress, uint32 nData) +{ + switch(nAddress >> 4) + { + case 0x1200000: + W_REG(nAddress, nData, m_nPMODE); + if(!(nAddress & 0x4)) + { + if((m_nPMODE & 0x01) && (m_nPMODE & 0x02)) + { + CLog::GetInstance().Print(LOG_NAME, "Warning. Both read circuits were enabled. Using RC1 for display.\r\n"); + m_nPMODE &= ~0x02; + } + } + break; + case 0x1200007: + W_REG(nAddress, nData, m_nDISPFB1); + if(nAddress & 0x04) + { +#ifdef _DEBUG + DISPFB* dispfb; + dispfb = GetDispFb(0); + CLog::GetInstance().Print(LOG_NAME, "DISPFB1(FBP: 0x%0.8X, FBW: %i, PSM: %i, DBX: %i, DBY: %i);\r\n", \ + dispfb->GetBufPtr(), \ + dispfb->GetBufWidth(), \ + dispfb->nPSM, \ + dispfb->nX, \ + dispfb->nY); +#endif + } + break; + case 0x1200008: + W_REG(nAddress, nData, m_nDISPLAY1); + if(nAddress & 0x04) + { + UpdateViewport(); + } + break; + case 0x1200009: + W_REG(nAddress, nData, m_nDISPFB2); + if(nAddress & 0x04) + { +#ifdef _DEBUG + DISPFB* dispfb; + dispfb = GetDispFb(1); + CLog::GetInstance().Print(LOG_NAME, "DISPFB2(FBP: 0x%0.8X, FBW: %i, PSM: %i, DBX: %i, DBY: %i);\r\n", \ + dispfb->GetBufPtr(), \ + dispfb->GetBufWidth(), \ + dispfb->nPSM, \ + dispfb->nX, \ + dispfb->nY); +#endif + //Speed hack for Atelier Iris + Flip(); + } + break; + case 0x120000A: + W_REG(nAddress, nData, m_nDISPLAY2); + if(nAddress & 0x04) + { + UpdateViewport(); + } + break; + case 0x1200100: + W_REG(nAddress, nData, m_nCSR); + if(!(nAddress & 0x04)) + { + SetVBlank(); + //Flip(); + if(nData & 0x08) + { + ResetVBlank(); + } + } + break; + case 0x1200101: + W_REG(nAddress, nData, m_nIMR); + break; + default: + CLog::GetInstance().Print(LOG_NAME, "Wrote to an unhandled priviledged register (0x%0.8X, 0x%0.8X).\r\n", nAddress, nData); + break; + } +} + +void CGSHandler::Initialize() +{ + m_mailBox.SendCall(bind(&CGSHandler::InitializeImpl, this)); +} + +void CGSHandler::Release() +{ + m_mailBox.SendCall(bind(&CGSHandler::ReleaseImpl, this), true); +} + +void CGSHandler::Flip() +{ + OnNewFrame(); + if(!m_enabled) return; + while(m_mailBox.IsPending()) + { + //Flush all commands + boost::thread::yield(); + } + m_mailBox.SendCall(bind(&CGSHandler::FlipImpl, this)); +#ifdef _DEBUG + CLog::GetInstance().Print(LOG_NAME, "Frame Done.\r\n---------------------------------------------------------------------------------\r\n"); +#endif +} + +void CGSHandler::ForcedFlip() +{ + +} + +void CGSHandler::WriteRegister(uint8 registerId, uint64 value) +{ + m_mailBox.SendCall(bind(&CGSHandler::WriteRegisterImpl, this, registerId, value)); +} + +void CGSHandler::FeedImageData(void* data, uint32 length) +{ + uint8* buffer = new uint8[length]; + memcpy(buffer, data, length); + m_mailBox.SendCall(bind(&CGSHandler::FeedImageDataImpl, this, buffer, length)); +} + +void CGSHandler::WriteRegisterMassively(const RegisterWrite* writeList, unsigned int count) +{ + m_mailBox.SendCall(bind(&CGSHandler::WriteRegisterMassivelyImpl, this, writeList, count)); +} + +void CGSHandler::UpdateViewport() +{ + m_mailBox.SendCall(bind(&CGSHandler::UpdateViewportImpl, this)); +} + +void CGSHandler::WriteRegisterImpl(uint8 nRegister, uint64 nData) +{ + m_nReg[nRegister] = nData; + + switch(nRegister) + { + case GS_REG_TRXDIR: + BITBLTBUF* pBuf; + TRXREG* pReg; + unsigned int nPixelSize; + + pBuf = GetBitBltBuf(); + pReg = GetTrxReg(); + + //We need to figure out the pixel size of the source stream + switch(pBuf->nDstPsm) + { + case PSMCT32: + nPixelSize = 32; + break; + case PSMCT24: + nPixelSize = 24; + break; + case PSMCT16: + nPixelSize = 16; + break; + case PSMT8: + case PSMT8H: + nPixelSize = 8; + break; + case PSMT4: + case PSMT4HH: + case PSMT4HL: + nPixelSize = 4; + break; + default: + assert(0); + break; + } + + m_TrxCtx.nSize = (pReg->nRRW * pReg->nRRH * nPixelSize) / 8; + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY = 0; + m_TrxCtx.nDirty = false; + + break; + } + +#ifdef _DEBUG + DisassembleWrite(nRegister, nData); +#endif +} + +void CGSHandler::FeedImageDataImpl(void* pData, uint32 nLength) +{ + boost::scoped_array dataPtr(reinterpret_cast(pData)); + + if(m_TrxCtx.nSize == 0) + { +#ifdef _DEBUG + CLog::GetInstance().Print(LOG_NAME, "Warning. Received image data when no transfer was expected.\r\n"); +#endif + return; + } + + if(m_TrxCtx.nSize < nLength) + { + nLength = m_TrxCtx.nSize; + //assert(0); + //return; + } + + BITBLTBUF* pBuf(GetBitBltBuf()); + if(pBuf->nDstPsm == 1) return; + m_TrxCtx.nDirty |= ((this)->*(m_pTransferHandler[pBuf->nDstPsm]))(pData, nLength); + + m_TrxCtx.nSize -= nLength; + + if(m_TrxCtx.nSize == 0) + { + if(m_TrxCtx.nDirty) + { + BITBLTBUF* pBuf = GetBitBltBuf(); + TRXREG* pReg = GetTrxReg(); + + uint32 nSize = (pBuf->GetDstWidth() * pReg->nRRH * GetPsmPixelSize(pBuf->nDstPsm)) / 8; + + ProcessImageTransfer(pBuf->GetDstPtr(), nSize); + +#ifdef _DEBUG + CLog::GetInstance().Print(LOG_NAME, "Dirty image transfer at 0x%0.8X.\r\n", pBuf->GetDstPtr()); +#endif + } + } +} + +void CGSHandler::WriteRegisterMassivelyImpl(const RegisterWrite* writeList, unsigned int count) +{ + const RegisterWrite* writeIterator = writeList; + for(unsigned int i = 0; i < count; i++) + { + WriteRegisterImpl(writeIterator->first, writeIterator->second); + writeIterator++; + } + delete [] writeList; +} + +void CGSHandler::FetchImagePSMCT16(uint16* pDst, uint32 nBufPos, uint32 nBufWidth, uint32 nWidth, uint32 nHeight) +{ + CPixelIndexorPSMCT16 Indexor(m_pRAM, nBufPos, nBufWidth); + + for(unsigned int j = 0; j < nHeight; j++) + { + for(unsigned int i = 0; i < nWidth; i++) + { + pDst[i] = Indexor.GetPixel(i, j); + } + + pDst += (nWidth); + } +} + +void CGSHandler::FetchImagePSMCT16S(uint16* pDst, uint32 nBufPos, uint32 nBufWidth, uint32 nWidth, uint32 nHeight) +{ + CPixelIndexorPSMCT16S Indexor(m_pRAM, nBufPos, nBufWidth); + + for(unsigned int j = 0; j < nHeight; j++) + { + for(unsigned int i = 0; i < nWidth; i++) + { + pDst[i] = Indexor.GetPixel(i, j); + } + + pDst += (nWidth); + } +} + +void CGSHandler::FetchImagePSMCT32(uint32* pDst, uint32 nBufPos, uint32 nBufWidth, uint32 nWidth, uint32 nHeight) +{ + CPixelIndexorPSMCT32 Indexor(m_pRAM, nBufPos, nBufWidth); + + for(unsigned int j = 0; j < nHeight; j++) + { + for(unsigned int i = 0; i < nWidth; i++) + { + pDst[i] = Indexor.GetPixel(i, j); + } + + pDst += (nWidth); + } +} + +bool CGSHandler::TrxHandlerInvalid(void* pData, uint32 nLength) +{ + assert(0); + return false; +} + +template +bool CGSHandler::TrxHandlerCopy(void* pData, uint32 nLength) +{ + typename Storage::Unit* pSrc; + uint32 nX, nY; + TRXPOS* pTrxPos; + TRXREG* pTrxReg; + BITBLTBUF* pTrxBuf; + bool nDirty = false; + + nLength /= sizeof(typename Storage::Unit); + pTrxPos = GetTrxPos(); + pTrxReg = GetTrxReg(); + pTrxBuf = GetBitBltBuf(); + + CPixelIndexor Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); + + pSrc = (typename Storage::Unit*)pData; + + for(unsigned int i = 0; i < nLength; i++) + { + typename Storage::Unit* pPixel; + + nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; + nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; + + pPixel = Indexor.GetPixelAddress(nX, nY); + + if((*pPixel) != pSrc[i]) + { + (*pPixel) = pSrc[i]; + nDirty = true; + } + + m_TrxCtx.nRRX++; + if(m_TrxCtx.nRRX == pTrxReg->nRRW) + { + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY++; + } + } + + return nDirty; +} + +bool CGSHandler::TrxHandlerPSMCT24(void* pData, uint32 nLength) +{ + uint8* pSrc; + uint32* pDstPixel; + uint32 nSrcPixel; + uint32 nX, nY; + TRXPOS* pTrxPos; + TRXREG* pTrxReg; + BITBLTBUF* pTrxBuf; + + pTrxPos = GetTrxPos(); + pTrxReg = GetTrxReg(); + pTrxBuf = GetBitBltBuf(); + + CPixelIndexorPSMCT32 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); + + pSrc = (uint8*)pData; + + for(unsigned int i = 0; i < nLength; i += 3) + { + nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; + nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; + + pDstPixel = Indexor.GetPixelAddress(nX, nY); + nSrcPixel = (*(uint32*)&pSrc[i]) & 0x00FFFFFF; + (*pDstPixel) &= 0xFF000000; + (*pDstPixel) |= nSrcPixel; + + m_TrxCtx.nRRX++; + if(m_TrxCtx.nRRX == pTrxReg->nRRW) + { + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY++; + } + } + + return true; +} + +bool CGSHandler::TrxHandlerPSMT4(void* pData, uint32 nLength) +{ + //Gotta rewrite this + bool dirty = false; + TRXPOS* pTrxPos = GetTrxPos(); + TRXREG* pTrxReg = GetTrxReg(); + BITBLTBUF* pTrxBuf = GetBitBltBuf(); + + CPixelIndexorPSMT4 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); + +// assert(0); + + uint8* pSrc = (uint8*)pData; + + for(unsigned int i = 0; i < nLength; i++) + { + uint8 nPixel[2]; + + nPixel[0] = (pSrc[i] >> 0) & 0x0F; + nPixel[1] = (pSrc[i] >> 4) & 0x0F; + + for(unsigned int j = 0; j < 2; j++) + { + uint32 nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; + uint32 nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; + + uint8 currentPixel = Indexor.GetPixel(nX, nY); + if(currentPixel != nPixel[j]) + { + Indexor.SetPixel(nX, nY, nPixel[j]); + dirty = true; + } + + m_TrxCtx.nRRX++; + if(m_TrxCtx.nRRX == pTrxReg->nRRW) + { + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY++; + } + } + } + + return dirty; +} + +template +bool CGSHandler::TrxHandlerPSMT4H(void* pData, uint32 nLength) +{ + uint8* pSrc; + uint8 nSrcPixel; + uint32 nX, nY; + uint32* pDstPixel; + TRXPOS* pTrxPos; + TRXREG* pTrxReg; + BITBLTBUF* pTrxBuf; + + pTrxPos = GetTrxPos(); + pTrxReg = GetTrxReg(); + pTrxBuf = GetBitBltBuf(); + + CPixelIndexorPSMCT32 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); + + pSrc = (uint8*)pData; + + for(unsigned int i = 0; i < nLength; i++) + { + //Pixel 1 + nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; + nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; + + nSrcPixel = pSrc[i] & 0x0F; + + pDstPixel = Indexor.GetPixelAddress(nX, nY); + (*pDstPixel) &= ~nMask; + (*pDstPixel) |= (nSrcPixel << nShift); + + m_TrxCtx.nRRX++; + if(m_TrxCtx.nRRX == pTrxReg->nRRW) + { + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY++; + } + + //Pixel 2 + nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; + nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; + + nSrcPixel = (pSrc[i] & 0xF0); + + pDstPixel = Indexor.GetPixelAddress(nX, nY); + (*pDstPixel) &= ~nMask; + (*pDstPixel) |= (nSrcPixel << (nShift - 4)); + + m_TrxCtx.nRRX++; + if(m_TrxCtx.nRRX == pTrxReg->nRRW) + { + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY++; + } + } + + return true; +} + +bool CGSHandler::TrxHandlerPSMT8H(void* pData, uint32 nLength) +{ + uint8* pSrc; + uint8 nSrcPixel; + uint32 nX, nY; + uint32* pDstPixel; + TRXPOS* pTrxPos; + TRXREG* pTrxReg; + BITBLTBUF* pTrxBuf; + + pTrxPos = GetTrxPos(); + pTrxReg = GetTrxReg(); + pTrxBuf = GetBitBltBuf(); + + CPixelIndexorPSMCT32 Indexor(m_pRAM, pTrxBuf->GetDstPtr(), pTrxBuf->nDstWidth); + + pSrc = (uint8*)pData; + + for(unsigned int i = 0; i < nLength; i++) + { + nX = (m_TrxCtx.nRRX + pTrxPos->nDSAX) % 2048; + nY = (m_TrxCtx.nRRY + pTrxPos->nDSAY) % 2048; + + nSrcPixel = pSrc[i]; + + pDstPixel = Indexor.GetPixelAddress(nX, nY); + (*pDstPixel) &= ~0xFF000000; + (*pDstPixel) |= (nSrcPixel << 24); + + m_TrxCtx.nRRX++; + if(m_TrxCtx.nRRX == pTrxReg->nRRW) + { + m_TrxCtx.nRRX = 0; + m_TrxCtx.nRRY++; + } + } + + return true; +} + +void CGSHandler::SetCrt(bool nIsInterlaced, unsigned int nMode, bool nIsFrameMode) +{ + m_nCrtMode = nMode; + m_nCrtIsInterlaced = nIsInterlaced; + m_nCrtIsFrameMode = nIsFrameMode; + + UpdateViewport(); +} + +CGSHandler::DISPFB* CGSHandler::GetDispFb(unsigned int nUnit) +{ + switch(nUnit) + { + case 0: + return (DISPFB*)&m_nDISPFB1; + break; + case 1: + return (DISPFB*)&m_nDISPFB2; + break; + default: + assert(0); + return NULL; + break; + } +} + +CGSHandler::TEXCLUT* CGSHandler::GetTexClut() +{ + return (TEXCLUT*)&m_nReg[GS_REG_TEXCLUT]; +} + +CGSHandler::FOGCOL* CGSHandler::GetFogCol() +{ + return (FOGCOL*)&m_nReg[GS_REG_FOGCOL]; +} + +CGSHandler::FRAME* CGSHandler::GetFrame(unsigned int nUnit) +{ + assert(nUnit < 2); + return (FRAME*)&m_nReg[GS_REG_FRAME_1 + nUnit]; +} + +CGSHandler::TRXREG* CGSHandler::GetTrxReg() +{ + return (TRXREG*)&m_nReg[GS_REG_TRXREG]; +} + +CGSHandler::TRXPOS* CGSHandler::GetTrxPos() +{ + return (TRXPOS*)&m_nReg[GS_REG_TRXPOS]; +} + +CGSHandler::BITBLTBUF* CGSHandler::GetBitBltBuf() +{ + return (BITBLTBUF*)&m_nReg[GS_REG_BITBLTBUF]; +} + +unsigned int CGSHandler::GetCrtWidth() +{ + switch(m_nCrtMode) + { + case 0x02: + case 0x03: + case 0x1C: + return 640; + break; + default: + assert(0); + return 640; + break; + } +} + +unsigned int CGSHandler::GetCrtHeight() +{ + switch(m_nCrtMode) + { + case 0x02: + return 448; + break; + case 0x03: + return 512; + break; + case 0x1C: + return 480; + break; + default: + assert(0); + return 448; + break; + } +} + +bool CGSHandler::GetCrtIsInterlaced() +{ + return m_nCrtIsInterlaced; +} + +bool CGSHandler::GetCrtIsFrameMode() +{ + return m_nCrtIsFrameMode; +} + +unsigned int CGSHandler::GetPsmPixelSize(unsigned int nPSM) +{ + switch(nPSM) + { + case PSMCT32: + case PSMT4HH: + case PSMT4HL: + case PSMT8H: + return 32; + break; + case PSMCT24: + return 24; + break; + case PSMCT16: + case PSMCT16S: + return 16; + break; + case PSMT8: + return 8; + break; + case PSMT4: + return 4; + break; + default: + assert(0); + return 0; + break; + } +} + +void CGSHandler::DisassembleWrite(uint8 nRegister, uint64 nData) +{ + GSPRIM pr; + double nX, nY, nZ; + double nU, nV; + double nS, nT; + + //Filtering + //if(!((nRegister == GS_REG_FRAME_1) || (nRegister == GS_REG_FRAME_2))) return; + //if(!((nRegister == GS_REG_TEST_1) || (nRegister == GS_REG_TEST_2))) return; + + switch(nRegister) + { + case GS_REG_PRIM: + DECODE_PRIM(nData, pr); + CLog::GetInstance().Print(LOG_NAME, "PRIM(PRI: %i, IIP: %i, TME: %i, FGE: %i, ABE: %i, AA1: %i, FST: %i, CTXT: %i, FIX: %i);\r\n", \ + pr.nType, \ + pr.nShading, \ + pr.nTexture, \ + pr.nFog, \ + pr.nAlpha, \ + pr.nAntiAliasing, \ + pr.nUseUV, \ + pr.nContext, \ + pr.nUseFloat); + break; + case GS_REG_RGBAQ: + { + RGBAQ rgbaq; + rgbaq <<= nData; + CLog::GetInstance().Print(LOG_NAME, "RGBAQ(R: 0x%0.2X, G: 0x%0.2X, B: 0x%0.2X, A: 0x%0.2X, Q: %f);\r\n", \ + rgbaq.nR, + rgbaq.nG, + rgbaq.nB, + rgbaq.nA, + rgbaq.nQ); + } + break; + case GS_REG_ST: + DECODE_ST(nData, nS, nT); + CLog::GetInstance().Print(LOG_NAME, "ST(S: %f, T: %f);\r\n", \ + nS, \ + nT); + break; + case GS_REG_UV: + DECODE_UV(nData, nU, nV); + CLog::GetInstance().Print(LOG_NAME, "UV(U: %f, V: %f);\r\n", \ + nU, \ + nV); + break; + case GS_REG_XYZ2: + DECODE_XYZ2(nData, nX, nY, nZ); + CLog::GetInstance().Print(LOG_NAME, "XYZ2(%f, %f, %f);\r\n", \ + nX, \ + nY, \ + nZ); + break; + case GS_REG_XYZF2: + case GS_REG_XYZF3: + { + XYZF xyzf; + xyzf = *reinterpret_cast(&nData); + CLog::GetInstance().Print(LOG_NAME, "%s(%f, %f, %i, %i);\r\n", \ + (nRegister == GS_REG_XYZF2) ? "XYZF2" : "XYZF3", + xyzf.GetX(), + xyzf.GetY(), + xyzf.nZ, + xyzf.nF); + } + break; + case GS_REG_XYZ3: + DECODE_XYZ2(nData, nX, nY, nZ); + CLog::GetInstance().Print(LOG_NAME, "XYZ3(%f, %f, %f);\r\n", \ + nX, \ + nY, \ + nZ); + break; + case GS_REG_TEX0_1: + case GS_REG_TEX0_2: + { + TEX0 tex; + tex <<= nData; + CLog::GetInstance().Print(LOG_NAME, "TEX0_%i(TBP: 0x%0.8X, TBW: %i, PSM: %i, TW: %i, TH: %i, TCC: %i, TFX: %i, CBP: 0x%0.8X, CPSM: %i, CSM: %i, CSA: %i, CLD: %i);\r\n", \ + nRegister == GS_REG_TEX0_1 ? 1 : 2, \ + tex.GetBufPtr(), \ + tex.GetBufWidth(), \ + tex.nPsm, \ + tex.GetWidth(), \ + tex.GetHeight(), \ + tex.nColorComp, \ + tex.nFunction, \ + tex.GetCLUTPtr(), \ + tex.nCPSM, \ + tex.nCSM, \ + tex.nCSA, \ + tex.nCLD); + } + break; + case GS_REG_CLAMP_1: + case GS_REG_CLAMP_2: + { + CLAMP clamp; + clamp <<= nData; + CLog::GetInstance().Print(LOG_NAME, "CLAMP_%i(WMS: %i, WMT: %i, MINU: %i, MAXU: %i, MINV: %i, MAXV: %i);\r\n", \ + nRegister == GS_REG_CLAMP_1 ? 1 : 2, \ + clamp.nWMS, \ + clamp.nWMT, \ + clamp.GetMinU(), \ + clamp.GetMaxU(), \ + clamp.GetMinV(), \ + clamp.GetMaxV()); + } + break; + case GS_REG_TEX1_1: + case GS_REG_TEX1_2: + { + TEX1 tex1; + tex1 <<= nData; + CLog::GetInstance().Print(LOG_NAME, "TEX1_%i(LCM: %i, MXL: %i, MMAG: %i, MMIN: %i, MTBA: %i, L: %i, K: %i);\r\n", \ + nRegister == GS_REG_TEX1_1 ? 1 : 2, \ + tex1.nLODMethod, \ + tex1.nMaxMip, \ + tex1.nMagFilter, \ + tex1.nMinFilter, \ + tex1.nMipBaseAddr, \ + tex1.nLODL, \ + tex1.nLODK); + } + break; + case GS_REG_TEX2_1: + case GS_REG_TEX2_2: + TEX2 tex2; + tex2 = *(TEX2*)&nData; + CLog::GetInstance().Print(LOG_NAME, "TEX2_%i(PSM: %i, CBP: 0x%0.8X, CPSM: %i, CSM: %i, CSA: %i, CLD: %i);\r\n", \ + nRegister == GS_REG_TEX2_1 ? 1 : 2, \ + tex2.nPsm, \ + tex2.GetCLUTPtr(), \ + tex2.nCPSM, \ + tex2.nCSM, \ + tex2.nCSA, \ + tex2.nCLD); + break; + case GS_REG_XYOFFSET_1: + case GS_REG_XYOFFSET_2: + CLog::GetInstance().Print(LOG_NAME, "XYOFFSET_%i(%i, %i);\r\n", \ + nRegister == GS_REG_XYOFFSET_1 ? 1 : 2, \ + (uint32)((nData >> 0) & 0xFFFFFFFF), \ + (uint32)((nData >> 32) & 0xFFFFFFFF)); + break; + case GS_REG_PRMODECONT: + CLog::GetInstance().Print(LOG_NAME, "PRMODECONT(AC = %i);\r\n", \ + nData & 1); + break; + case GS_REG_PRMODE: + { + PRMODE prm; + prm <<= nData; + CLog::GetInstance().Print(LOG_NAME, "PRMODE(IIP: %i, TME: %i, FGE: %i, ABE: %i, AA1: %i, FST: %i, CTXT: %i, FIX: %i);\r\n", \ + prm.nShading, \ + prm.nTexture, \ + prm.nFog, \ + prm.nAlpha, \ + prm.nAntiAliasing, \ + prm.nUseUV, \ + prm.nContext, \ + prm.nUseFloat); + } + break; + case GS_REG_TEXCLUT: + TEXCLUT clut; + clut = *(TEXCLUT*)&nData; + CLog::GetInstance().Print(LOG_NAME, "TEXCLUT(CBW: %i, COU: %i, COV: %i);\r\n", \ + clut.nCBW, + clut.nCOU, + clut.nCOV); + break; + case GS_REG_FOGCOL: + FOGCOL fogcol; + fogcol = *(FOGCOL*)&nData; + CLog::GetInstance().Print(LOG_NAME, "FOGCOL(R: 0x%0.2X, G: 0x%0.2X, B: 0x%0.2X);\r\n", \ + fogcol.nFCR, + fogcol.nFCG, + fogcol.nFCB); + break; + case GS_REG_TEXA: + { + TEXA TexA; + TexA <<= nData; + CLog::GetInstance().Print(LOG_NAME, "TEXA(TA0: 0x%0.2X, AEM: %i, TA1: 0x%0.2X);\r\n", \ + TexA.nTA0, + TexA.nAEM, + TexA.nTA1); + } + break; + case GS_REG_TEXFLUSH: + CLog::GetInstance().Print(LOG_NAME, "TEXFLUSH();\r\n"); + break; + case GS_REG_ALPHA_1: + case GS_REG_ALPHA_2: + { + ALPHA alpha; + alpha <<= nData; + CLog::GetInstance().Print(LOG_NAME, "ALPHA_%i(A: %i, B: %i, C: %i, D: %i, FIX: 0x%0.2X);\r\n", \ + nRegister == GS_REG_ALPHA_1 ? 1 : 2, \ + alpha.nA, \ + alpha.nB, \ + alpha.nC, \ + alpha.nD, \ + alpha.nFix); + } + break; + case GS_REG_SCISSOR_1: + CLog::GetInstance().Print(LOG_NAME, "SCISSOR_1(%i, %i, %i, %i);\r\n", \ + (uint32)((nData >> 0) & 0xFFFF), \ + (uint32)((nData >> 16) & 0xFFFF), \ + (uint32)((nData >> 32) & 0xFFFF), \ + (uint32)((nData >> 48) & 0xFFFF)); + break; + case GS_REG_TEST_1: + case GS_REG_TEST_2: + { + TEST tst; + tst <<= nData; + CLog::GetInstance().Print(LOG_NAME, "TEST_%i(ATE: %i, ATST: %i, AREF: 0x%0.2X, AFAIL: %i, DATE: %i, DATM: %i, ZTE: %i, ZTST: %i);\r\n", \ + nRegister == GS_REG_TEST_1 ? 1 : 2, \ + tst.nAlphaEnabled, \ + tst.nAlphaMethod, \ + tst.nAlphaRef, \ + tst.nAlphaFail, \ + tst.nDestAlphaEnabled, \ + tst.nDestAlphaMode, \ + tst.nDepthEnabled, \ + tst.nDepthMethod); + } + break; + case GS_REG_FRAME_1: + case GS_REG_FRAME_2: + FRAME fr; + fr = *(FRAME*)&nData; + CLog::GetInstance().Print(LOG_NAME, "FRAME_%i(FBP: 0x%0.8X, FBW: %i, PSM: %i, FBMSK: %i);\r\n", \ + nRegister == GS_REG_FRAME_1 ? 1 : 2, \ + fr.GetBasePtr(), \ + fr.GetWidth(), \ + fr.nPsm, \ + fr.nMask); + break; + case GS_REG_ZBUF_1: + case GS_REG_ZBUF_2: + { + ZBUF zbuf; + zbuf = *(ZBUF*)&nData; + CLog::GetInstance().Print(LOG_NAME, "ZBUF_%i(ZBP: 0x%0.8X, PSM: %i, ZMSK: %i);\r\n", \ + nRegister == GS_REG_ZBUF_1 ? 1 : 2, \ + zbuf.GetBasePtr(), \ + zbuf.nPsm, \ + zbuf.nMask); + } + break; + case GS_REG_BITBLTBUF: + BITBLTBUF buf; + buf = *(BITBLTBUF*)&nData; + CLog::GetInstance().Print(LOG_NAME, "BITBLTBUF(0x%0.8X, %i, %i, 0x%0.8X, %i, %i);\r\n", \ + buf.GetSrcPtr(), \ + buf.GetSrcWidth(), \ + buf.nSrcPsm, \ + buf.GetDstPtr(), \ + buf.GetDstWidth(), \ + buf.nDstPsm); + break; + case GS_REG_TRXPOS: + CLog::GetInstance().Print(LOG_NAME, "TRXPOS(%i, %i, %i, %i, %i);\r\n", \ + (uint32)((nData >> 0) & 0xFFFF), \ + (uint32)((nData >> 16) & 0xFFFF), \ + (uint32)((nData >> 32) & 0xFFFF), \ + (uint32)((nData >> 48) & 0xFF), \ + (uint32)((nData >> 59) & 0x1)); + break; + case GS_REG_TRXREG: + CLog::GetInstance().Print(LOG_NAME, "TRXREG(%i, %i);\r\n", \ + (uint32)((nData >> 0) & 0xFFFFFFFF), + (uint32)((nData >> 32) & 0xFFFFFFFF)); + break; + case GS_REG_TRXDIR: + CLog::GetInstance().Print(LOG_NAME, "TRXDIR(%i);\r\n", \ + (uint32)((nData >> 0) & 0xFFFFFFFF)); + break; + default: + CLog::GetInstance().Print(LOG_NAME, "Unknown command (0x%X).\r\n", nRegister); + break; + } +} + +void CGSHandler::ThreadProc() +{ + while(!m_threadDone) + { + m_mailBox.WaitForCall(100); + while(m_mailBox.IsPending()) + { + m_mailBox.ReceiveCall(); + } + } +} diff --git a/Source/GSHandler.h b/Source/GSHandler.h index bf841915..20cbcb41 100644 --- a/Source/GSHandler.h +++ b/Source/GSHandler.h @@ -710,7 +710,8 @@ inline uint8 CGSHandler::CPixelIndexor::GetPixel(unsig return (uint8)(((uint32*)&m_pMemory[nAddress])[Storage::m_nColumnWordTable[nSubTable][nY][nX]] >> nShiftAmount) & 0x0F; } -template <> void CGSHandler::CPixelIndexor::SetPixel(unsigned int nX, unsigned int nY, uint8 nPixel) +template <> +inline void CGSHandler::CPixelIndexor::SetPixel(unsigned int nX, unsigned int nY, uint8 nPixel) { typedef STORAGEPSMT4 Storage; diff --git a/Source/MA_EE.cpp b/Source/MA_EE.cpp index 1bd78dcb..e6e0516b 100644 --- a/Source/MA_EE.cpp +++ b/Source/MA_EE.cpp @@ -657,47 +657,47 @@ void CMA_EE::PCPYH() CMA_EE::InstructionFuncConstant CMA_EE::m_pOpMmi0[0x20] = { //0x00 - &Illegal, &PSUBW, &Illegal, &Illegal, &PADDH, &Illegal, &PCGTH, &PMAXH, + &CMA_EE::Illegal, &CMA_EE::PSUBW, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PADDH, &CMA_EE::Illegal, &CMA_EE::PCGTH, &CMA_EE::PMAXH, //0x08 - &Illegal, &PSUBB, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::PSUBB, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x10 - &PADDSW, &Illegal, &PEXTLW, &Illegal, &Illegal, &Illegal, &PEXTLH, &PPACH, + &CMA_EE::PADDSW, &CMA_EE::Illegal, &CMA_EE::PEXTLW, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PEXTLH, &CMA_EE::PPACH, //0x18 - &Illegal, &Illegal, &PEXTLB, &PPACB, &Illegal, &Illegal, &PEXT5, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PEXTLB, &CMA_EE::PPACB, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PEXT5, &CMA_EE::Illegal, }; CMA_EE::InstructionFuncConstant CMA_EE::m_pOpMmi1[0x20] = { //0x00 - &Illegal, &Illegal, &PCEQW, &Illegal, &Illegal, &Illegal, &Illegal, &PMINH, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PCEQW, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PMINH, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x10 - &PADDUW, &Illegal, &PEXTUW, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::PADDUW, &CMA_EE::Illegal, &CMA_EE::PEXTUW, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x18 - &Illegal, &Illegal, &PEXTUB, &QFSRV, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PEXTUB, &CMA_EE::QFSRV, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, }; CMA_EE::InstructionFuncConstant CMA_EE::m_pOpMmi2[0x20] = { //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &PCPYLD, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PCPYLD, &CMA_EE::Illegal, //0x10 - &Illegal, &Illegal, &PAND, &PXOR, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PAND, &CMA_EE::PXOR, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &PROT3W, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PROT3W, }; CMA_EE::InstructionFuncConstant CMA_EE::m_pOpMmi3[0x20] = { //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &PCPYUD, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PCPYUD, &CMA_EE::Illegal, //0x10 - &Illegal, &Illegal, &POR, &PNOR, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::POR, &CMA_EE::PNOR, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, //0x18 - &Illegal, &Illegal, &Illegal, &PCPYH, &Illegal, &Illegal, &Illegal, &Illegal, + &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::PCPYH, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, &CMA_EE::Illegal, }; diff --git a/Source/MA_VU_Lower.cpp b/Source/MA_VU_Lower.cpp index 0236a513..61194d00 100644 --- a/Source/MA_VU_Lower.cpp +++ b/Source/MA_VU_Lower.cpp @@ -1,949 +1,949 @@ -#include -#include "MA_VU.h" -#include "VIF.h" -#include "MIPS.h" -#include "VUShared.h" -#include "CodeGen.h" -#include "offsetof_def.h" -#include "MemoryUtils.h" - -using namespace std; - -CMA_VU::CLower::CLower(bool maskDataAddress) : -CMIPSInstructionFactory(MIPS_REGSIZE_32), -m_maskDataAddress(maskDataAddress), -m_nImm5(0), -m_nImm11(0), -m_nImm12(0), -m_nImm15(0), -m_nImm15S(0), -m_nImm24(0), -m_nIT(0), -m_nIS(0), -m_nID(0), -m_nFSF(0), -m_nFTF(0), -m_nDest(0) -{ - -} - -CMA_VU::CLower::~CLower() -{ - -} - -void CMA_VU::CLower::GetQuadWord(uint32 address, CMIPS* ctx, uint32 dstRegister, uint32 dstMask) -{ - assert((address & 0x0F) == 0x00); - uint128* destination = &ctx->m_State.nCOP2[dstRegister]; - CMemoryMap::MEMORYMAPELEMENT* mapElement(ctx->m_pMemoryMap->GetReadMap(address)); - if((mapElement == NULL) || (mapElement->nType != CMemoryMap::MEMORYMAP_TYPE_MEMORY)) - { - destination->nV0 = 0xCCCCCCCC; - destination->nV1 = 0xCCCCCCCC; - destination->nV2 = 0xCCCCCCCC; - destination->nV3 = 0xCCCCCCCC; - return; - } - uint128* source = reinterpret_cast(&reinterpret_cast(mapElement->pPointer)[address - mapElement->nStart]); - if(dstMask == 0xF) - { - (*destination) = (*source); - } - else - { - for(unsigned int i = 0; i < 4; i++) - { - if(!VUShared::DestinationHasElement(static_cast(dstMask), i)) continue; - destination->nV[i] = source->nV[i]; - } - } -} - -void CMA_VU::CLower::SetQuadWord(uint32 address, CMIPS* ctx, uint32 srcRegister, uint32 dstMask) -{ - assert((address & 0x0F) == 0x00); - CMemoryMap::MEMORYMAPELEMENT* mapElement(ctx->m_pMemoryMap->GetWriteMap(address)); - if((mapElement == NULL) || (mapElement->nType != CMemoryMap::MEMORYMAP_TYPE_MEMORY)) - { - return; - } - uint128* source = &ctx->m_State.nCOP2[srcRegister]; - uint128* destination = reinterpret_cast(&reinterpret_cast(mapElement->pPointer)[address - mapElement->nStart]); - if(dstMask == 0xF) - { - (*destination) = (*source); - } - else - { - for(unsigned int i = 0; i < 4; i++) - { - if(!VUShared::DestinationHasElement(static_cast(dstMask), i)) continue; - destination->nV[i] = source->nV[i]; - } - } -} - -void CMA_VU::CLower::ComputeMemAccessAddr(unsigned int baseRegister, uint32 baseOffset, uint32 destOffset) -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[baseRegister])); - if(baseOffset != 0) - { - m_codeGen->PushCst(baseOffset); - m_codeGen->Add(); - } - m_codeGen->Shl(4); - - if(destOffset != 0) - { - m_codeGen->PushCst(destOffset); - m_codeGen->Add(); - } - -// if(m_maskDataAddress) - { - m_codeGen->PushCst(0x3FFF); - m_codeGen->And(); - } -} - -void CMA_VU::CLower::CompileInstruction(uint32 nAddress, CCodeGen* codeGen, CMIPS* pCtx) -{ - SetupQuickVariables(nAddress, codeGen, pCtx); - - uint32 nNextOpcode = pCtx->m_pMemoryMap->GetInstruction(nAddress + 4); - - if(nNextOpcode & 0x80000000) - { - return; - } - - m_nDest = (uint8 )((m_nOpcode >> 21) & 0x000F); - - m_nFSF = ((m_nDest >> 0) & 0x03); - m_nFTF = ((m_nDest >> 2) & 0x03); - - m_nIT = (uint8 )((m_nOpcode >> 16) & 0x001F); - m_nIS = (uint8 )((m_nOpcode >> 11) & 0x001F); - m_nID = (uint8 )((m_nOpcode >> 6) & 0x001F); - m_nImm5 = m_nID; - m_nImm11 = (uint16)((m_nOpcode >> 0) & 0x07FF); - m_nImm12 = (uint16)((m_nOpcode >> 0) & 0x0FFF); - m_nImm15 = (uint16)((m_nOpcode & 0x7FF) | (m_nOpcode & 0x01E00000) >> 10); - m_nImm15S = m_nImm15 | (m_nImm15 & 0x4000 ? 0x8000 : 0x0000); - m_nImm24 = m_nOpcode & 0x00FFFFFF; - - if(m_nOpcode != 0x8000033C) - { - ((this)->*(m_pOpGeneral[m_nOpcode >> 25]))(); - } -} - -void CMA_VU::CLower::SetBranchAddress(bool nCondition, int32 nOffset) -{ - const uint32 maxIAddr = 0x3FFF; - m_codeGen->BeginIfElse(nCondition); - { - m_codeGen->PushCst((m_nAddress + nOffset + 4) & maxIAddr); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); - } - m_codeGen->BeginIfElseAlt(); - { - m_codeGen->PushCst(MIPS_INVALID_PC); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); - } - m_codeGen->EndIf(); -} - -void CMA_VU::CLower::PushIntegerRegister(unsigned int nRegister) -{ - if(nRegister == 0) - { - m_codeGen->PushCst(0); - } - else - { - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[nRegister])); - } -} - -uint32 CMA_VU::CLower::GetDestOffset(uint8 nDest) -{ - if(nDest & 0x0001) return 0xC; - if(nDest & 0x0002) return 0x8; - if(nDest & 0x0004) return 0x4; - if(nDest & 0x0008) return 0x0; - - return 0; -} - -////////////////////////////////////////////////// -//General Instructions -////////////////////////////////////////////////// - -//00 -void CMA_VU::CLower::LQ() -{ - ComputeMemAccessAddr( - m_nIS, - static_cast(VUShared::GetImm11Offset(m_nImm11)), - 0); - m_codeGen->PushRef(m_pCtx); - m_codeGen->PushCst(m_nIT); - m_codeGen->PushCst(m_nDest); - m_codeGen->Call(reinterpret_cast(&GetQuadWord), 4, false); -} - -//01 -void CMA_VU::CLower::SQ() -{ - ComputeMemAccessAddr( - m_nIT, - static_cast(VUShared::GetImm11Offset(m_nImm11)), - 0); - m_codeGen->PushRef(m_pCtx); - m_codeGen->PushCst(m_nIS); - m_codeGen->PushCst(m_nDest); - m_codeGen->Call(reinterpret_cast(&SetQuadWord), 4, false); -} - -//04 -void CMA_VU::CLower::ILW() -{ - //Push context - m_codeGen->PushRef(m_pCtx); - - //Compute address - ComputeMemAccessAddr( - m_nIS, - static_cast(VUShared::GetImm11Offset(m_nImm11)), - GetDestOffset(m_nDest)); - - //Read memory - m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//05 -void CMA_VU::CLower::ISW() -{ - //Push context - m_codeGen->PushRef(m_pCtx); - - //Compute value - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - - //Compute address - ComputeMemAccessAddr( - m_nIS, - static_cast(VUShared::GetImm11Offset(m_nImm11)), - GetDestOffset(m_nDest)); - - m_codeGen->Call(reinterpret_cast(&CMemoryUtils::SetWordProxy), 3, false); -} - -//08 -void CMA_VU::CLower::IADDIU() -{ - PushIntegerRegister(m_nIS); - m_codeGen->PushCst(static_cast(m_nImm15)); - m_codeGen->Add(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//09 -void CMA_VU::CLower::ISUBIU() -{ - PushIntegerRegister(m_nIS); - m_codeGen->PushCst(static_cast(m_nImm15)); - m_codeGen->Sub(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//11 -void CMA_VU::CLower::FCSET() -{ - m_codeGen->PushCst(m_nImm24); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2CF)); -} - -//12 -void CMA_VU::CLower::FCAND() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF)); - m_codeGen->PushCst(m_nImm24); - m_codeGen->And(); - - m_codeGen->PushCst(0); - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - m_codeGen->BeginIfElse(false); - { - m_codeGen->PushCst(1); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); - } - m_codeGen->BeginIfElseAlt(); - { - m_codeGen->PushCst(0); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); - } - m_codeGen->EndIf(); -} - -//13 -void CMA_VU::CLower::FCOR() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF)); - m_codeGen->PushCst(m_nImm24); - m_codeGen->Or(); - m_codeGen->PushCst(0xFFFFFF); - m_codeGen->And(); - - m_codeGen->PushCst(0xFFFFFF); - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - m_codeGen->BeginIfElse(true); - { - m_codeGen->PushCst(1); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); - } - m_codeGen->BeginIfElseAlt(); - { - m_codeGen->PushCst(0); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); - } - m_codeGen->EndIf(); -} - -//16 -void CMA_VU::CLower::FSAND() -{ - printf("Warning: Using FSAND.\r\n"); - - m_codeGen->PushCst(0); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//1A -void CMA_VU::CLower::FMAND() -{ - printf("Warning: Using FMAND.\r\n"); - - //MAC flag temp - m_codeGen->PushCst(0); - - for(unsigned int i = 0; i < 4; i++) - { - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2SF.nV[3 - i])); - m_codeGen->PushCst(0); - m_codeGen->Cmp(CCodeGen::CONDITION_NE); - m_codeGen->Shl(4 + i); - m_codeGen->Or(); - } - - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->And(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//1C -void CMA_VU::CLower::FCGET() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF)); - m_codeGen->PushCst(0xFFF); - m_codeGen->And(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//20 -void CMA_VU::CLower::B() -{ - m_codeGen->PushCst(1); - SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); -} - -//21 -void CMA_VU::CLower::BAL() -{ - //Save PC - m_codeGen->PushCst((m_nAddress + 0x10) / 0x8); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - - m_codeGen->PushCst(1); - SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); -} - -//24 -void CMA_VU::CLower::JR() -{ - //Compute new PC - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - m_codeGen->Shl(3); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); -} - -//25 -void CMA_VU::CLower::JALR() -{ - //Save PC - m_codeGen->PushCst((m_nAddress + 0x10) / 0x8); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - - //Compute new PC - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - m_codeGen->Shl(3); -// m_codeGen->PushCst(0x4000); -// m_codeGen->Add(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); -} - -//28 -void CMA_VU::CLower::IBEQ() -{ - //Operand 1 - PushIntegerRegister(m_nIS); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - - //Operand 2 - PushIntegerRegister(m_nIT); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); -} - -//29 -void CMA_VU::CLower::IBNE() -{ - //Operand 1 - PushIntegerRegister(m_nIS); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - - //Operand 2 - PushIntegerRegister(m_nIT); - m_codeGen->PushCst(0xFFFF); - m_codeGen->And(); - - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - SetBranchAddress(false, VUShared::GetBranch(m_nImm11) + 4); -} - -//2C -void CMA_VU::CLower::IBLTZ() -{ - //TODO: Merge IBLTZ and IBGEZ - m_codeGen->PushCst(0); - - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushCst(0x8000); - m_codeGen->And(); - - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - SetBranchAddress(false, VUShared::GetBranch(m_nImm11) + 4); -} - -//2D -void CMA_VU::CLower::IBGTZ() -{ - //TODO: Merge IBGTZ and IBLEZ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->SeX16(); - - m_codeGen->PushCst(0); - m_codeGen->Cmp(CCodeGen::CONDITION_GT); - - SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); -} - -//2E -void CMA_VU::CLower::IBLEZ() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->SeX16(); - - m_codeGen->PushCst(0); - m_codeGen->Cmp(CCodeGen::CONDITION_GT); - - SetBranchAddress(false, VUShared::GetBranch(m_nImm11) + 4); -} - -//2F -void CMA_VU::CLower::IBGEZ() -{ - m_codeGen->PushCst(0); - - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushCst(0x8000); - m_codeGen->And(); - - m_codeGen->Cmp(CCodeGen::CONDITION_EQ); - - SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); -} - -//40 -void CMA_VU::CLower::LOWEROP() -{ - ((this)->*(m_pOpLower[m_nOpcode & 0x3F]))(); -} - -////////////////////////////////////////////////// -//LowerOp Instructions -////////////////////////////////////////////////// - -//30 -void CMA_VU::CLower::IADD() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - m_codeGen->Add(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); -} - -//31 -void CMA_VU::CLower::ISUB() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - m_codeGen->Sub(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); -} - -//32 -void CMA_VU::CLower::IADDI() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushCst(m_nImm5 | ((m_nImm5 & 0x10) != 0 ? 0xFFFFFFE0 : 0x0)); - m_codeGen->Add(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//34 -void CMA_VU::CLower::IAND() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - m_codeGen->And(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); -} - -//35 -void CMA_VU::CLower::IOR() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - m_codeGen->Or(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); -} - -//3C -void CMA_VU::CLower::VECTOR0() -{ - ((this)->*(m_pOpVector0[(m_nOpcode >> 6) & 0x1F]))(); -} - -//3D -void CMA_VU::CLower::VECTOR1() -{ - ((this)->*(m_pOpVector1[(m_nOpcode >> 6) & 0x1F]))(); -} - -//3E -void CMA_VU::CLower::VECTOR2() -{ - ((this)->*(m_pOpVector2[(m_nOpcode >> 6) & 0x1F]))(); -} - -//3F -void CMA_VU::CLower::VECTOR3() -{ - ((this)->*(m_pOpVector3[(m_nOpcode >> 6) & 0x1F]))(); -} - -////////////////////////////////////////////////// -//Vector0 Instructions -////////////////////////////////////////////////// - -//0C -void CMA_VU::CLower::MOVE() -{ - VUShared::MOVE(m_codeGen, m_nDest, m_nIT, m_nIS); -} - -//0D -void CMA_VU::CLower::LQI() -{ - ComputeMemAccessAddr(m_nIS, 0, 0); - m_codeGen->PushRef(m_pCtx); - m_codeGen->PushCst(m_nIT); - m_codeGen->PushCst(m_nDest); - m_codeGen->Call(reinterpret_cast(&GetQuadWord), 4, false); - - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - m_codeGen->PushCst(1); - m_codeGen->Add(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); -} - -//0E -void CMA_VU::CLower::DIV() -{ - VUShared::DIV(m_codeGen, m_nIS, m_nFSF, m_nIT, m_nFTF, m_nAddress, 2); -} - -//0F -void CMA_VU::CLower::MTIR() -{ - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[m_nFSF])); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//19 -void CMA_VU::CLower::MFP() -{ - for(unsigned int i = 0; i < 4; i++) - { - if(!VUShared::DestinationHasElement(m_nDest, i)) continue; - - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2P)); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2[m_nIT].nV[i])); - } -} - -//1A -void CMA_VU::CLower::XTOP() -{ - //Push context - m_codeGen->PushRef(m_pCtx); - - //Compute Address - m_codeGen->PushCst(CVIF::VU_TOP); - - m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//1B -void CMA_VU::CLower::XGKICK() -{ - //Push context - m_codeGen->PushRef(m_pCtx); - - //Push value - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); - - //Compute Address - m_codeGen->PushCst(CVIF::VU_XGKICK); - - m_codeGen->Call(reinterpret_cast(&CMemoryUtils::SetWordProxy), 3, false); -} - -//1F -void CMA_VU::CLower::ESIN() -{ - const unsigned int seriesLength = 5; - const uint32 seriesConstants[seriesLength] = - { - 0x3F800000, - 0xBE2AAAA4, - 0x3C08873E, - 0xB94FB21F, - 0x362E9C14 - }; - const unsigned int seriesExponents[seriesLength] = - { - 1, - 3, - 5, - 7, - 9 - }; - - - for(unsigned int i = 0; i < seriesLength; i++) - { - unsigned int exponent = seriesExponents[i]; - float constant = *reinterpret_cast(&seriesConstants[i]); - - m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[m_nFSF])); - for(unsigned int j = 0; j < exponent - 1; j++) - { - m_codeGen->PushTop(); - m_codeGen->FP_Mul(); - } - - m_codeGen->FP_PushCst(constant); - m_codeGen->FP_Mul(); - - if(i != 0) - { - m_codeGen->FP_Add(); - } - } - - m_codeGen->FP_PullSingle(offsetof(CMIPS, m_State.nCOP2P)); -} - -////////////////////////////////////////////////// -//Vector1 Instructions -////////////////////////////////////////////////// - -//0C -void CMA_VU::CLower::MR32() -{ - VUShared::MR32(m_codeGen, m_nDest, m_nIT, m_nIS); -} - -//0D -void CMA_VU::CLower::SQI() -{ - ComputeMemAccessAddr(m_nIT, 0, 0); - m_codeGen->PushRef(m_pCtx); - m_codeGen->PushCst(m_nIS); - m_codeGen->PushCst(m_nDest); - m_codeGen->Call(reinterpret_cast(&SetQuadWord), 4, false); - - m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); - m_codeGen->PushCst(1); - m_codeGen->Add(); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//0F -void CMA_VU::CLower::MFIR() -{ - for(unsigned int i = 0; i < 4; i++) - { - if(!VUShared::DestinationHasElement(m_nDest, i)) continue; - - PushIntegerRegister(m_nIS); - m_codeGen->SeX16(); - m_codeGen->PullRel(VUShared::GetVectorElement(m_nIT, i)); - } -} - -//10 -void CMA_VU::CLower::RGET() -{ - VUShared::RGET(m_codeGen, m_nDest, m_nIT); -} - -//1A -void CMA_VU::CLower::XITOP() -{ - //Push context - m_codeGen->PushRef(m_pCtx); - - //Compute Address - m_codeGen->PushCst(CVIF::VU_ITOP); - - m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -////////////////////////////////////////////////// -//Vector2 Instructions -////////////////////////////////////////////////// - -//0E -void CMA_VU::CLower::RSQRT() -{ - VUShared::RSQRT(m_codeGen, m_nIS, m_nFSF, m_nIT, m_nFTF, m_nAddress, 2); -} - -//0F -void CMA_VU::CLower::ILWR() -{ - //Push context - m_codeGen->PushRef(m_pCtx); - - //Compute address - ComputeMemAccessAddr(m_nIS, 0, GetDestOffset(m_nDest)); - - m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); - - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); -} - -//10 -void CMA_VU::CLower::RINIT() -{ - VUShared::RINIT(m_codeGen, m_nIS, m_nFSF); -} - -//1E -void CMA_VU::CLower::ERCPR() -{ - m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[m_nFSF])); - m_codeGen->FP_Rcpl(); - m_codeGen->FP_PullSingle(offsetof(CMIPS, m_State.nCOP2P)); -} - -////////////////////////////////////////////////// -//Vector3 Instructions -////////////////////////////////////////////////// - -//0E -void CMA_VU::CLower::WAITQ() -{ - VUShared::WAITQ(m_codeGen); -} - -//1C -void CMA_VU::CLower::ERLENG() -{ - /////////////////////////////////////////////////// - //Raise all components to the power of 2 - - m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[0])); - m_codeGen->PushTop(); - m_codeGen->FP_Mul(); - - m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[1])); - m_codeGen->PushTop(); - m_codeGen->FP_Mul(); - - m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[2])); - m_codeGen->PushTop(); - m_codeGen->FP_Mul(); - - /////////////////////////////////////////////////// - //Sum all components - - m_codeGen->FP_Add(); - m_codeGen->FP_Add(); - - /////////////////////////////////////////////////// - //Extract root, inverse - - m_codeGen->FP_Rsqrt(); - - m_codeGen->FP_PullSingle(offsetof(CMIPS, m_State.nCOP2P)); -} - -//1E -void CMA_VU::CLower::WAITP() -{ - //TODO: Flush pipe -} - -////////////////////////////////////////////////// -//Opcode Tables -////////////////////////////////////////////////// - -CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpGeneral[0x80] = -{ - //0x00 - &LQ, &SQ, &Illegal, &Illegal, &ILW, &ISW, &Illegal, &Illegal, - //0x08 - &IADDIU, &ISUBIU, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &FCSET, &FCAND, &FCOR, &Illegal, &Illegal, &FSAND, &Illegal, - //0x18 - &Illegal, &Illegal, &FMAND, &Illegal, &FCGET, &Illegal, &Illegal, &Illegal, - //0x20 - &B, &BAL, &Illegal, &Illegal, &JR, &JALR, &Illegal, &Illegal, - //0x28 - &IBEQ, &IBNE, &Illegal, &Illegal, &IBLTZ, &IBGTZ, &IBLEZ, &IBGEZ, - //0x30 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x38 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x40 - &LOWEROP, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x48 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x50 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x58 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x60 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x68 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x70 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x78 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpLower[0x40] = -{ - //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x20 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x28 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x30 - &IADD, &ISUB, &IADDI, &Illegal, &IAND, &IOR, &Illegal, &Illegal, - //0x38 - &Illegal, &Illegal, &Illegal, &Illegal, &VECTOR0, &VECTOR1, &VECTOR2, &VECTOR3, -}; - -CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector0[0x20] = -{ - //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &MOVE, &LQI, &DIV, &MTIR, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &MFP, &XTOP, &XGKICK, &Illegal, &Illegal, &Illegal, &ESIN, -}; - -CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector1[0x20] = -{ - //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &MR32, &SQI, &Illegal, &MFIR, - //0x10 - &RGET, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &XITOP, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector2[0x20] = -{ - //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &RSQRT, &ILWR, - //0x10 - &RINIT, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &ERCPR, &Illegal, -}; - -CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector3[0x20] = -{ - //0x00 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x08 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &WAITQ, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &ERLENG, &Illegal, &WAITP, &Illegal, -}; +#include +#include "MA_VU.h" +#include "VIF.h" +#include "MIPS.h" +#include "VUShared.h" +#include "CodeGen.h" +#include "offsetof_def.h" +#include "MemoryUtils.h" + +using namespace std; + +CMA_VU::CLower::CLower(bool maskDataAddress) : +CMIPSInstructionFactory(MIPS_REGSIZE_32), +m_maskDataAddress(maskDataAddress), +m_nImm5(0), +m_nImm11(0), +m_nImm12(0), +m_nImm15(0), +m_nImm15S(0), +m_nImm24(0), +m_nIT(0), +m_nIS(0), +m_nID(0), +m_nFSF(0), +m_nFTF(0), +m_nDest(0) +{ + +} + +CMA_VU::CLower::~CLower() +{ + +} + +void CMA_VU::CLower::GetQuadWord(uint32 address, CMIPS* ctx, uint32 dstRegister, uint32 dstMask) +{ + assert((address & 0x0F) == 0x00); + uint128* destination = &ctx->m_State.nCOP2[dstRegister]; + CMemoryMap::MEMORYMAPELEMENT* mapElement(ctx->m_pMemoryMap->GetReadMap(address)); + if((mapElement == NULL) || (mapElement->nType != CMemoryMap::MEMORYMAP_TYPE_MEMORY)) + { + destination->nV0 = 0xCCCCCCCC; + destination->nV1 = 0xCCCCCCCC; + destination->nV2 = 0xCCCCCCCC; + destination->nV3 = 0xCCCCCCCC; + return; + } + uint128* source = reinterpret_cast(&reinterpret_cast(mapElement->pPointer)[address - mapElement->nStart]); + if(dstMask == 0xF) + { + (*destination) = (*source); + } + else + { + for(unsigned int i = 0; i < 4; i++) + { + if(!VUShared::DestinationHasElement(static_cast(dstMask), i)) continue; + destination->nV[i] = source->nV[i]; + } + } +} + +void CMA_VU::CLower::SetQuadWord(uint32 address, CMIPS* ctx, uint32 srcRegister, uint32 dstMask) +{ + assert((address & 0x0F) == 0x00); + CMemoryMap::MEMORYMAPELEMENT* mapElement(ctx->m_pMemoryMap->GetWriteMap(address)); + if((mapElement == NULL) || (mapElement->nType != CMemoryMap::MEMORYMAP_TYPE_MEMORY)) + { + return; + } + uint128* source = &ctx->m_State.nCOP2[srcRegister]; + uint128* destination = reinterpret_cast(&reinterpret_cast(mapElement->pPointer)[address - mapElement->nStart]); + if(dstMask == 0xF) + { + (*destination) = (*source); + } + else + { + for(unsigned int i = 0; i < 4; i++) + { + if(!VUShared::DestinationHasElement(static_cast(dstMask), i)) continue; + destination->nV[i] = source->nV[i]; + } + } +} + +void CMA_VU::CLower::ComputeMemAccessAddr(unsigned int baseRegister, uint32 baseOffset, uint32 destOffset) +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[baseRegister])); + if(baseOffset != 0) + { + m_codeGen->PushCst(baseOffset); + m_codeGen->Add(); + } + m_codeGen->Shl(4); + + if(destOffset != 0) + { + m_codeGen->PushCst(destOffset); + m_codeGen->Add(); + } + +// if(m_maskDataAddress) + { + m_codeGen->PushCst(0x3FFF); + m_codeGen->And(); + } +} + +void CMA_VU::CLower::CompileInstruction(uint32 nAddress, CCodeGen* codeGen, CMIPS* pCtx) +{ + SetupQuickVariables(nAddress, codeGen, pCtx); + + uint32 nNextOpcode = pCtx->m_pMemoryMap->GetInstruction(nAddress + 4); + + if(nNextOpcode & 0x80000000) + { + return; + } + + m_nDest = (uint8 )((m_nOpcode >> 21) & 0x000F); + + m_nFSF = ((m_nDest >> 0) & 0x03); + m_nFTF = ((m_nDest >> 2) & 0x03); + + m_nIT = (uint8 )((m_nOpcode >> 16) & 0x001F); + m_nIS = (uint8 )((m_nOpcode >> 11) & 0x001F); + m_nID = (uint8 )((m_nOpcode >> 6) & 0x001F); + m_nImm5 = m_nID; + m_nImm11 = (uint16)((m_nOpcode >> 0) & 0x07FF); + m_nImm12 = (uint16)((m_nOpcode >> 0) & 0x0FFF); + m_nImm15 = (uint16)((m_nOpcode & 0x7FF) | (m_nOpcode & 0x01E00000) >> 10); + m_nImm15S = m_nImm15 | (m_nImm15 & 0x4000 ? 0x8000 : 0x0000); + m_nImm24 = m_nOpcode & 0x00FFFFFF; + + if(m_nOpcode != 0x8000033C) + { + ((this)->*(m_pOpGeneral[m_nOpcode >> 25]))(); + } +} + +void CMA_VU::CLower::SetBranchAddress(bool nCondition, int32 nOffset) +{ + const uint32 maxIAddr = 0x3FFF; + m_codeGen->BeginIfElse(nCondition); + { + m_codeGen->PushCst((m_nAddress + nOffset + 4) & maxIAddr); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); + } + m_codeGen->BeginIfElseAlt(); + { + m_codeGen->PushCst(MIPS_INVALID_PC); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); + } + m_codeGen->EndIf(); +} + +void CMA_VU::CLower::PushIntegerRegister(unsigned int nRegister) +{ + if(nRegister == 0) + { + m_codeGen->PushCst(0); + } + else + { + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[nRegister])); + } +} + +uint32 CMA_VU::CLower::GetDestOffset(uint8 nDest) +{ + if(nDest & 0x0001) return 0xC; + if(nDest & 0x0002) return 0x8; + if(nDest & 0x0004) return 0x4; + if(nDest & 0x0008) return 0x0; + + return 0; +} + +////////////////////////////////////////////////// +//General Instructions +////////////////////////////////////////////////// + +//00 +void CMA_VU::CLower::LQ() +{ + ComputeMemAccessAddr( + m_nIS, + static_cast(VUShared::GetImm11Offset(m_nImm11)), + 0); + m_codeGen->PushRef(m_pCtx); + m_codeGen->PushCst(m_nIT); + m_codeGen->PushCst(m_nDest); + m_codeGen->Call(reinterpret_cast(&GetQuadWord), 4, false); +} + +//01 +void CMA_VU::CLower::SQ() +{ + ComputeMemAccessAddr( + m_nIT, + static_cast(VUShared::GetImm11Offset(m_nImm11)), + 0); + m_codeGen->PushRef(m_pCtx); + m_codeGen->PushCst(m_nIS); + m_codeGen->PushCst(m_nDest); + m_codeGen->Call(reinterpret_cast(&SetQuadWord), 4, false); +} + +//04 +void CMA_VU::CLower::ILW() +{ + //Push context + m_codeGen->PushRef(m_pCtx); + + //Compute address + ComputeMemAccessAddr( + m_nIS, + static_cast(VUShared::GetImm11Offset(m_nImm11)), + GetDestOffset(m_nDest)); + + //Read memory + m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//05 +void CMA_VU::CLower::ISW() +{ + //Push context + m_codeGen->PushRef(m_pCtx); + + //Compute value + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + + //Compute address + ComputeMemAccessAddr( + m_nIS, + static_cast(VUShared::GetImm11Offset(m_nImm11)), + GetDestOffset(m_nDest)); + + m_codeGen->Call(reinterpret_cast(&CMemoryUtils::SetWordProxy), 3, false); +} + +//08 +void CMA_VU::CLower::IADDIU() +{ + PushIntegerRegister(m_nIS); + m_codeGen->PushCst(static_cast(m_nImm15)); + m_codeGen->Add(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//09 +void CMA_VU::CLower::ISUBIU() +{ + PushIntegerRegister(m_nIS); + m_codeGen->PushCst(static_cast(m_nImm15)); + m_codeGen->Sub(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//11 +void CMA_VU::CLower::FCSET() +{ + m_codeGen->PushCst(m_nImm24); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2CF)); +} + +//12 +void CMA_VU::CLower::FCAND() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF)); + m_codeGen->PushCst(m_nImm24); + m_codeGen->And(); + + m_codeGen->PushCst(0); + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + m_codeGen->BeginIfElse(false); + { + m_codeGen->PushCst(1); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); + } + m_codeGen->BeginIfElseAlt(); + { + m_codeGen->PushCst(0); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); + } + m_codeGen->EndIf(); +} + +//13 +void CMA_VU::CLower::FCOR() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF)); + m_codeGen->PushCst(m_nImm24); + m_codeGen->Or(); + m_codeGen->PushCst(0xFFFFFF); + m_codeGen->And(); + + m_codeGen->PushCst(0xFFFFFF); + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + m_codeGen->BeginIfElse(true); + { + m_codeGen->PushCst(1); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); + } + m_codeGen->BeginIfElseAlt(); + { + m_codeGen->PushCst(0); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[1])); + } + m_codeGen->EndIf(); +} + +//16 +void CMA_VU::CLower::FSAND() +{ + printf("Warning: Using FSAND.\r\n"); + + m_codeGen->PushCst(0); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//1A +void CMA_VU::CLower::FMAND() +{ + printf("Warning: Using FMAND.\r\n"); + + //MAC flag temp + m_codeGen->PushCst(0); + + for(unsigned int i = 0; i < 4; i++) + { + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2SF.nV[3 - i])); + m_codeGen->PushCst(0); + m_codeGen->Cmp(CCodeGen::CONDITION_NE); + m_codeGen->Shl(4 + i); + m_codeGen->Or(); + } + + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->And(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//1C +void CMA_VU::CLower::FCGET() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2CF)); + m_codeGen->PushCst(0xFFF); + m_codeGen->And(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//20 +void CMA_VU::CLower::B() +{ + m_codeGen->PushCst(1); + SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); +} + +//21 +void CMA_VU::CLower::BAL() +{ + //Save PC + m_codeGen->PushCst((m_nAddress + 0x10) / 0x8); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + + m_codeGen->PushCst(1); + SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); +} + +//24 +void CMA_VU::CLower::JR() +{ + //Compute new PC + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + m_codeGen->Shl(3); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); +} + +//25 +void CMA_VU::CLower::JALR() +{ + //Save PC + m_codeGen->PushCst((m_nAddress + 0x10) / 0x8); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + + //Compute new PC + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + m_codeGen->Shl(3); +// m_codeGen->PushCst(0x4000); +// m_codeGen->Add(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nDelayedJumpAddr)); +} + +//28 +void CMA_VU::CLower::IBEQ() +{ + //Operand 1 + PushIntegerRegister(m_nIS); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + + //Operand 2 + PushIntegerRegister(m_nIT); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); +} + +//29 +void CMA_VU::CLower::IBNE() +{ + //Operand 1 + PushIntegerRegister(m_nIS); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + + //Operand 2 + PushIntegerRegister(m_nIT); + m_codeGen->PushCst(0xFFFF); + m_codeGen->And(); + + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + SetBranchAddress(false, VUShared::GetBranch(m_nImm11) + 4); +} + +//2C +void CMA_VU::CLower::IBLTZ() +{ + //TODO: Merge IBLTZ and IBGEZ + m_codeGen->PushCst(0); + + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushCst(0x8000); + m_codeGen->And(); + + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + SetBranchAddress(false, VUShared::GetBranch(m_nImm11) + 4); +} + +//2D +void CMA_VU::CLower::IBGTZ() +{ + //TODO: Merge IBGTZ and IBLEZ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->SeX16(); + + m_codeGen->PushCst(0); + m_codeGen->Cmp(CCodeGen::CONDITION_GT); + + SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); +} + +//2E +void CMA_VU::CLower::IBLEZ() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->SeX16(); + + m_codeGen->PushCst(0); + m_codeGen->Cmp(CCodeGen::CONDITION_GT); + + SetBranchAddress(false, VUShared::GetBranch(m_nImm11) + 4); +} + +//2F +void CMA_VU::CLower::IBGEZ() +{ + m_codeGen->PushCst(0); + + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushCst(0x8000); + m_codeGen->And(); + + m_codeGen->Cmp(CCodeGen::CONDITION_EQ); + + SetBranchAddress(true, VUShared::GetBranch(m_nImm11) + 4); +} + +//40 +void CMA_VU::CLower::LOWEROP() +{ + ((this)->*(m_pOpLower[m_nOpcode & 0x3F]))(); +} + +////////////////////////////////////////////////// +//LowerOp Instructions +////////////////////////////////////////////////// + +//30 +void CMA_VU::CLower::IADD() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + m_codeGen->Add(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); +} + +//31 +void CMA_VU::CLower::ISUB() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + m_codeGen->Sub(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); +} + +//32 +void CMA_VU::CLower::IADDI() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushCst(m_nImm5 | ((m_nImm5 & 0x10) != 0 ? 0xFFFFFFE0 : 0x0)); + m_codeGen->Add(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//34 +void CMA_VU::CLower::IAND() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + m_codeGen->And(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); +} + +//35 +void CMA_VU::CLower::IOR() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + m_codeGen->Or(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nID])); +} + +//3C +void CMA_VU::CLower::VECTOR0() +{ + ((this)->*(m_pOpVector0[(m_nOpcode >> 6) & 0x1F]))(); +} + +//3D +void CMA_VU::CLower::VECTOR1() +{ + ((this)->*(m_pOpVector1[(m_nOpcode >> 6) & 0x1F]))(); +} + +//3E +void CMA_VU::CLower::VECTOR2() +{ + ((this)->*(m_pOpVector2[(m_nOpcode >> 6) & 0x1F]))(); +} + +//3F +void CMA_VU::CLower::VECTOR3() +{ + ((this)->*(m_pOpVector3[(m_nOpcode >> 6) & 0x1F]))(); +} + +////////////////////////////////////////////////// +//Vector0 Instructions +////////////////////////////////////////////////// + +//0C +void CMA_VU::CLower::MOVE() +{ + VUShared::MOVE(m_codeGen, m_nDest, m_nIT, m_nIS); +} + +//0D +void CMA_VU::CLower::LQI() +{ + ComputeMemAccessAddr(m_nIS, 0, 0); + m_codeGen->PushRef(m_pCtx); + m_codeGen->PushCst(m_nIT); + m_codeGen->PushCst(m_nDest); + m_codeGen->Call(reinterpret_cast(&GetQuadWord), 4, false); + + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + m_codeGen->PushCst(1); + m_codeGen->Add(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); +} + +//0E +void CMA_VU::CLower::DIV() +{ + VUShared::DIV(m_codeGen, m_nIS, m_nFSF, m_nIT, m_nFTF, m_nAddress, 2); +} + +//0F +void CMA_VU::CLower::MTIR() +{ + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[m_nFSF])); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//19 +void CMA_VU::CLower::MFP() +{ + for(unsigned int i = 0; i < 4; i++) + { + if(!VUShared::DestinationHasElement(m_nDest, i)) continue; + + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2P)); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2[m_nIT].nV[i])); + } +} + +//1A +void CMA_VU::CLower::XTOP() +{ + //Push context + m_codeGen->PushRef(m_pCtx); + + //Compute Address + m_codeGen->PushCst(CVIF::VU_TOP); + + m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//1B +void CMA_VU::CLower::XGKICK() +{ + //Push context + m_codeGen->PushRef(m_pCtx); + + //Push value + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIS])); + + //Compute Address + m_codeGen->PushCst(CVIF::VU_XGKICK); + + m_codeGen->Call(reinterpret_cast(&CMemoryUtils::SetWordProxy), 3, false); +} + +//1F +void CMA_VU::CLower::ESIN() +{ + const unsigned int seriesLength = 5; + const uint32 seriesConstants[seriesLength] = + { + 0x3F800000, + 0xBE2AAAA4, + 0x3C08873E, + 0xB94FB21F, + 0x362E9C14 + }; + const unsigned int seriesExponents[seriesLength] = + { + 1, + 3, + 5, + 7, + 9 + }; + + + for(unsigned int i = 0; i < seriesLength; i++) + { + unsigned int exponent = seriesExponents[i]; + float constant = *reinterpret_cast(&seriesConstants[i]); + + m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[m_nFSF])); + for(unsigned int j = 0; j < exponent - 1; j++) + { + m_codeGen->PushTop(); + m_codeGen->FP_Mul(); + } + + m_codeGen->FP_PushCst(constant); + m_codeGen->FP_Mul(); + + if(i != 0) + { + m_codeGen->FP_Add(); + } + } + + m_codeGen->FP_PullSingle(offsetof(CMIPS, m_State.nCOP2P)); +} + +////////////////////////////////////////////////// +//Vector1 Instructions +////////////////////////////////////////////////// + +//0C +void CMA_VU::CLower::MR32() +{ + VUShared::MR32(m_codeGen, m_nDest, m_nIT, m_nIS); +} + +//0D +void CMA_VU::CLower::SQI() +{ + ComputeMemAccessAddr(m_nIT, 0, 0); + m_codeGen->PushRef(m_pCtx); + m_codeGen->PushCst(m_nIS); + m_codeGen->PushCst(m_nDest); + m_codeGen->Call(reinterpret_cast(&SetQuadWord), 4, false); + + m_codeGen->PushRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); + m_codeGen->PushCst(1); + m_codeGen->Add(); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//0F +void CMA_VU::CLower::MFIR() +{ + for(unsigned int i = 0; i < 4; i++) + { + if(!VUShared::DestinationHasElement(m_nDest, i)) continue; + + PushIntegerRegister(m_nIS); + m_codeGen->SeX16(); + m_codeGen->PullRel(VUShared::GetVectorElement(m_nIT, i)); + } +} + +//10 +void CMA_VU::CLower::RGET() +{ + VUShared::RGET(m_codeGen, m_nDest, m_nIT); +} + +//1A +void CMA_VU::CLower::XITOP() +{ + //Push context + m_codeGen->PushRef(m_pCtx); + + //Compute Address + m_codeGen->PushCst(CVIF::VU_ITOP); + + m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +////////////////////////////////////////////////// +//Vector2 Instructions +////////////////////////////////////////////////// + +//0E +void CMA_VU::CLower::RSQRT() +{ + VUShared::RSQRT(m_codeGen, m_nIS, m_nFSF, m_nIT, m_nFTF, m_nAddress, 2); +} + +//0F +void CMA_VU::CLower::ILWR() +{ + //Push context + m_codeGen->PushRef(m_pCtx); + + //Compute address + ComputeMemAccessAddr(m_nIS, 0, GetDestOffset(m_nDest)); + + m_codeGen->Call(reinterpret_cast(&CMemoryUtils::GetWordProxy), 2, true); + + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2VI[m_nIT])); +} + +//10 +void CMA_VU::CLower::RINIT() +{ + VUShared::RINIT(m_codeGen, m_nIS, m_nFSF); +} + +//1E +void CMA_VU::CLower::ERCPR() +{ + m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[m_nFSF])); + m_codeGen->FP_Rcpl(); + m_codeGen->FP_PullSingle(offsetof(CMIPS, m_State.nCOP2P)); +} + +////////////////////////////////////////////////// +//Vector3 Instructions +////////////////////////////////////////////////// + +//0E +void CMA_VU::CLower::WAITQ() +{ + VUShared::WAITQ(m_codeGen); +} + +//1C +void CMA_VU::CLower::ERLENG() +{ + /////////////////////////////////////////////////// + //Raise all components to the power of 2 + + m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[0])); + m_codeGen->PushTop(); + m_codeGen->FP_Mul(); + + m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[1])); + m_codeGen->PushTop(); + m_codeGen->FP_Mul(); + + m_codeGen->FP_PushSingle(offsetof(CMIPS, m_State.nCOP2[m_nIS].nV[2])); + m_codeGen->PushTop(); + m_codeGen->FP_Mul(); + + /////////////////////////////////////////////////// + //Sum all components + + m_codeGen->FP_Add(); + m_codeGen->FP_Add(); + + /////////////////////////////////////////////////// + //Extract root, inverse + + m_codeGen->FP_Rsqrt(); + + m_codeGen->FP_PullSingle(offsetof(CMIPS, m_State.nCOP2P)); +} + +//1E +void CMA_VU::CLower::WAITP() +{ + //TODO: Flush pipe +} + +////////////////////////////////////////////////// +//Opcode Tables +////////////////////////////////////////////////// + +CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpGeneral[0x80] = +{ + //0x00 + &CMA_VU::CLower::LQ, &CMA_VU::CLower::SQ, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::ILW, &CMA_VU::CLower::ISW, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x08 + &CMA_VU::CLower::IADDIU, &CMA_VU::CLower::ISUBIU, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x10 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::FCSET, &CMA_VU::CLower::FCAND, &CMA_VU::CLower::FCOR, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::FSAND, &CMA_VU::CLower::Illegal, + //0x18 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::FMAND, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::FCGET, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x20 + &CMA_VU::CLower::B, &CMA_VU::CLower::BAL, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::JR, &CMA_VU::CLower::JALR, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x28 + &CMA_VU::CLower::IBEQ, &CMA_VU::CLower::IBNE, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::IBLTZ, &CMA_VU::CLower::IBGTZ, &CMA_VU::CLower::IBLEZ, &CMA_VU::CLower::IBGEZ, + //0x30 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x38 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x40 + &CMA_VU::CLower::LOWEROP, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x48 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x50 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x58 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x60 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x68 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x70 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x78 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, +}; + +CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpLower[0x40] = +{ + //0x00 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x08 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x10 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x18 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x20 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x28 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x30 + &CMA_VU::CLower::IADD, &CMA_VU::CLower::ISUB, &CMA_VU::CLower::IADDI, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::IAND, &CMA_VU::CLower::IOR, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x38 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::VECTOR0, &CMA_VU::CLower::VECTOR1, &CMA_VU::CLower::VECTOR2, &CMA_VU::CLower::VECTOR3, +}; + +CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector0[0x20] = +{ + //0x00 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x08 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::MOVE, &CMA_VU::CLower::LQI, &CMA_VU::CLower::DIV, &CMA_VU::CLower::MTIR, + //0x10 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x18 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::MFP, &CMA_VU::CLower::XTOP, &CMA_VU::CLower::XGKICK, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::ESIN, +}; + +CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector1[0x20] = +{ + //0x00 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x08 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::MR32, &CMA_VU::CLower::SQI, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::MFIR, + //0x10 + &CMA_VU::CLower::RGET, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x18 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::XITOP, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, +}; + +CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector2[0x20] = +{ + //0x00 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x08 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::RSQRT, &CMA_VU::CLower::ILWR, + //0x10 + &CMA_VU::CLower::RINIT, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x18 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::ERCPR, &CMA_VU::CLower::Illegal, +}; + +CMA_VU::CLower::InstructionFuncConstant CMA_VU::CLower::m_pOpVector3[0x20] = +{ + //0x00 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x08 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::WAITQ, &CMA_VU::CLower::Illegal, + //0x10 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, + //0x18 + &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::ERLENG, &CMA_VU::CLower::Illegal, &CMA_VU::CLower::WAITP, &CMA_VU::CLower::Illegal, +}; diff --git a/Source/MA_VU_Upper.cpp b/Source/MA_VU_Upper.cpp index b0353a5f..9ababf63 100644 --- a/Source/MA_VU_Upper.cpp +++ b/Source/MA_VU_Upper.cpp @@ -1,443 +1,443 @@ -#include "MA_VU.h" -#include "MIPS.h" -#include "VUShared.h" -#include "VIF.h" -#include "CodeGen.h" - -using namespace std; - -CMA_VU::CUpper::CUpper() : -CMIPSInstructionFactory(MIPS_REGSIZE_32), -m_nFT(0), -m_nFS(0), -m_nFD(0), -m_nBc(0), -m_nDest(0) -{ - -} - -void CMA_VU::CUpper::CompileInstruction(uint32 nAddress, CCodeGen* codeGen, CMIPS* pCtx) -{ - SetupQuickVariables(nAddress, codeGen, pCtx); - - m_nDest = (uint8 )((m_nOpcode >> 21) & 0x000F); - m_nFT = (uint8 )((m_nOpcode >> 16) & 0x001F); - m_nFS = (uint8 )((m_nOpcode >> 11) & 0x001F); - m_nFD = (uint8 )((m_nOpcode >> 6) & 0x001F); - - m_nBc = (uint8 )((m_nOpcode >> 0) & 0x0003); - - ((this)->*(m_pOpVector[m_nOpcode & 0x3F]))(); - - if(m_nOpcode & 0x80000000) - { - LOI(pCtx->m_pMemoryMap->GetInstruction(nAddress - 4)); - } - - if(m_nOpcode & 0x40000000) - { - //Force exception checking if microprogram is done - m_codeGen->PushCst(1); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nHasException)); - } -} - -void CMA_VU::CUpper::LOI(uint32 nValue) -{ - m_codeGen->PushCst(nValue); - m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2I)); -} - -////////////////////////////////////////////////// -//Vector Instructions -////////////////////////////////////////////////// - -//00 -//01 -//02 -//03 -void CMA_VU::CUpper::ADDbc() -{ - VUShared::ADDbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//04 -//05 -//06 -//07 -void CMA_VU::CUpper::SUBbc() -{ - VUShared::SUBbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//08 -//09 -//0A -//0B -void CMA_VU::CUpper::MADDbc() -{ - VUShared::MADDbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//0C -//0D -//0E -//0F -void CMA_VU::CUpper::MSUBbc() -{ - VUShared::MSUBbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//10 -//11 -//12 -//13 -void CMA_VU::CUpper::MAXbc() -{ - VUShared::MAXbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//14 -//15 -//16 -//17 -void CMA_VU::CUpper::MINIbc() -{ - VUShared::MINIbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//18 -//19 -//1A -//1B -void CMA_VU::CUpper::MULbc() -{ - VUShared::MULbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); -} - -//1C -void CMA_VU::CUpper::MULq() -{ - VUShared::MULq(m_codeGen, m_nDest, m_nFD, m_nFS, m_nAddress); -} - -//1E -void CMA_VU::CUpper::MULi() -{ - VUShared::MULi(m_codeGen, m_nDest, m_nFD, m_nFS); -} - -//1F -void CMA_VU::CUpper::MINIi() -{ - VUShared::MINIi(m_codeGen, m_nDest, m_nFD, m_nFS); -} - -//20 -void CMA_VU::CUpper::ADDq() -{ - VUShared::ADDq(m_codeGen, m_nDest, m_nFD, m_nFS, m_nAddress); -} - -//21 -void CMA_VU::CUpper::MADDq() -{ - VUShared::MADDq(m_codeGen, m_nDest, m_nFD, m_nFS, m_nAddress); -} - -//22 -void CMA_VU::CUpper::ADDi() -{ - VUShared::ADDi(m_codeGen, m_nDest, m_nFD, m_nFS); -} - -//26 -void CMA_VU::CUpper::SUBi() -{ - VUShared::SUBi(m_codeGen, m_nDest, m_nFD, m_nFS); -} - -//27 -void CMA_VU::CUpper::MSUBi() -{ - VUShared::MSUBi(m_codeGen, m_nDest, m_nFD, m_nFS); -} - -//28 -void CMA_VU::CUpper::ADD() -{ - VUShared::ADD(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); -} - -//29 -void CMA_VU::CUpper::MADD() -{ - VUShared::MADD(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); -} - -//2A -void CMA_VU::CUpper::MUL() -{ - VUShared::MUL(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); -} - -//2B -void CMA_VU::CUpper::MAX() -{ - VUShared::MAX(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); -} - -//2C -void CMA_VU::CUpper::SUB() -{ - VUShared::SUB(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); -} - -//2E -void CMA_VU::CUpper::OPMSUB() -{ - VUShared::OPMSUB(m_codeGen, m_nFD, m_nFS, m_nFT); -} - -//2F -void CMA_VU::CUpper::MINI() -{ - VUShared::MINI(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); -} - -//3C -void CMA_VU::CUpper::VECTOR0() -{ - ((this)->*(m_pOpVector0[(m_nOpcode >> 6) & 0x1F]))(); -} - -//3D -void CMA_VU::CUpper::VECTOR1() -{ - ((this)->*(m_pOpVector1[(m_nOpcode >> 6) & 0x1F]))(); -} - -//3E -void CMA_VU::CUpper::VECTOR2() -{ - ((this)->*(m_pOpVector2[(m_nOpcode >> 6) & 0x1F]))(); -} - -//3F -void CMA_VU::CUpper::VECTOR3() -{ - ((this)->*(m_pOpVector3[(m_nOpcode >> 6) & 0x1F]))(); -} - -////////////////////////////////////////////////// -//VectorX Common Instructions -////////////////////////////////////////////////// - -//00 -void CMA_VU::CUpper::ADDAbc() -{ - VUShared::ADDAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); -} - -//02 -void CMA_VU::CUpper::MADDAbc() -{ - VUShared::MADDAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); -} - -//03 -void CMA_VU::CUpper::MSUBAbc() -{ - VUShared::MSUBAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); -} - -//06 -void CMA_VU::CUpper::MULAbc() -{ - VUShared::MULAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); -} - -////////////////////////////////////////////////// -//Vector0 Instructions -////////////////////////////////////////////////// - -//04 -void CMA_VU::CUpper::ITOF0() -{ - VUShared::ITOF0(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//05 -void CMA_VU::CUpper::FTOI0() -{ - VUShared::FTOI0(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//0A -void CMA_VU::CUpper::ADDA() -{ - VUShared::ADDA(m_codeGen, m_nDest, m_nFS, m_nFT); -} - -////////////////////////////////////////////////// -//Vector1 Instructions -////////////////////////////////////////////////// - -//04 -void CMA_VU::CUpper::ITOF4() -{ - VUShared::ITOF4(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//05 -void CMA_VU::CUpper::FTOI4() -{ - VUShared::FTOI4(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//07 -void CMA_VU::CUpper::ABS() -{ - VUShared::ABS(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//0A -void CMA_VU::CUpper::MADDA() -{ - VUShared::MADDA(m_codeGen, m_nDest, m_nFS, m_nFT); -} - -////////////////////////////////////////////////// -//Vector2 Instructions -////////////////////////////////////////////////// - -//04 -void CMA_VU::CUpper::ITOF12() -{ - VUShared::ITOF12(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//05 -void CMA_VU::CUpper::FTOI12() -{ - VUShared::FTOI12(m_codeGen, m_nDest, m_nFT, m_nFS); -} - -//07 -void CMA_VU::CUpper::MULAi() -{ - VUShared::MULAi(m_codeGen, m_nDest, m_nFS); -} - -//0A -void CMA_VU::CUpper::MULA() -{ - VUShared::MULA(m_codeGen, m_nDest, m_nFS, m_nFT); -} - -//0B -void CMA_VU::CUpper::OPMULA() -{ - VUShared::OPMULA(m_codeGen, m_nFS, m_nFT); -} - -////////////////////////////////////////////////// -//Vector3 Instructions -////////////////////////////////////////////////// - -//07 -void CMA_VU::CUpper::CLIP() -{ - VUShared::CLIP(m_codeGen, m_nFS, m_nFT); -} - -//08 -void CMA_VU::CUpper::MADDAi() -{ - VUShared::MADDAi(m_codeGen, m_nDest, m_nFS); -} - -//09 -void CMA_VU::CUpper::MSUBAi() -{ - VUShared::MSUBAi(m_codeGen, m_nDest, m_nFS); -} - -//0B -void CMA_VU::CUpper::NOP() -{ - -} - -////////////////////////////////////////////////// -//Opcode Tables -////////////////////////////////////////////////// - -CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector[0x40] = -{ - //0x00 - &ADDbc, &ADDbc, &ADDbc, &ADDbc, &SUBbc, &SUBbc, &SUBbc, &SUBbc, - //0x08 - &MADDbc, &MADDbc, &MADDbc, &MADDbc, &MSUBbc, &MSUBbc, &MSUBbc, &MSUBbc, - //0x10 - &MAXbc, &Illegal, &Illegal, &MAXbc, &Illegal, &Illegal, &Illegal, &MINIbc, - //0x18 - &MULbc, &MULbc, &MULbc, &MULbc, &MULq, &Illegal, &MULi, &MINIi, - //0x20 - &ADDq, &MADDq, &ADDi, &Illegal, &Illegal, &Illegal, &SUBi, &MSUBi, - //0x28 - &ADD, &MADD, &MUL, &MAX, &SUB, &Illegal, &OPMSUB, &MINI, - //0x30 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x38 - &Illegal, &Illegal, &Illegal, &Illegal, &VECTOR0, &VECTOR1, &VECTOR2, &VECTOR3, -}; - -CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector0[0x20] = -{ - //0x00 - &ADDAbc, &Illegal, &Illegal, &MSUBAbc, &ITOF0, &FTOI0, &MULAbc, &Illegal, - //0x08 - &Illegal, &Illegal, &ADDA, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector1[0x20] = -{ - //0x00 - &ADDAbc, &Illegal, &MADDAbc, &MSUBAbc, &ITOF4, &FTOI4, &MULAbc, &ABS, - //0x08 - &Illegal, &Illegal, &MADDA, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector2[0x20] = -{ - //0x00 - &Illegal, &Illegal, &MADDAbc, &MSUBAbc, &ITOF12, &FTOI12, &MULAbc, &MULAi, - //0x08 - &Illegal, &Illegal, &MULA, &OPMULA, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; - -CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector3[0x20] = -{ - //0x00 - &Illegal, &Illegal, &MADDAbc, &MSUBAbc, &Illegal, &Illegal, &MULAbc, &CLIP, - //0x08 - &MADDAi, &MSUBAi, &Illegal, &NOP, &Illegal, &Illegal, &Illegal, &Illegal, - //0x10 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, - //0x18 - &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, &Illegal, -}; +#include "MA_VU.h" +#include "MIPS.h" +#include "VUShared.h" +#include "VIF.h" +#include "CodeGen.h" + +using namespace std; + +CMA_VU::CUpper::CUpper() : +CMIPSInstructionFactory(MIPS_REGSIZE_32), +m_nFT(0), +m_nFS(0), +m_nFD(0), +m_nBc(0), +m_nDest(0) +{ + +} + +void CMA_VU::CUpper::CompileInstruction(uint32 nAddress, CCodeGen* codeGen, CMIPS* pCtx) +{ + SetupQuickVariables(nAddress, codeGen, pCtx); + + m_nDest = (uint8 )((m_nOpcode >> 21) & 0x000F); + m_nFT = (uint8 )((m_nOpcode >> 16) & 0x001F); + m_nFS = (uint8 )((m_nOpcode >> 11) & 0x001F); + m_nFD = (uint8 )((m_nOpcode >> 6) & 0x001F); + + m_nBc = (uint8 )((m_nOpcode >> 0) & 0x0003); + + ((this)->*(m_pOpVector[m_nOpcode & 0x3F]))(); + + if(m_nOpcode & 0x80000000) + { + LOI(pCtx->m_pMemoryMap->GetInstruction(nAddress - 4)); + } + + if(m_nOpcode & 0x40000000) + { + //Force exception checking if microprogram is done + m_codeGen->PushCst(1); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nHasException)); + } +} + +void CMA_VU::CUpper::LOI(uint32 nValue) +{ + m_codeGen->PushCst(nValue); + m_codeGen->PullRel(offsetof(CMIPS, m_State.nCOP2I)); +} + +////////////////////////////////////////////////// +//Vector Instructions +////////////////////////////////////////////////// + +//00 +//01 +//02 +//03 +void CMA_VU::CUpper::ADDbc() +{ + VUShared::ADDbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//04 +//05 +//06 +//07 +void CMA_VU::CUpper::SUBbc() +{ + VUShared::SUBbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//08 +//09 +//0A +//0B +void CMA_VU::CUpper::MADDbc() +{ + VUShared::MADDbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//0C +//0D +//0E +//0F +void CMA_VU::CUpper::MSUBbc() +{ + VUShared::MSUBbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//10 +//11 +//12 +//13 +void CMA_VU::CUpper::MAXbc() +{ + VUShared::MAXbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//14 +//15 +//16 +//17 +void CMA_VU::CUpper::MINIbc() +{ + VUShared::MINIbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//18 +//19 +//1A +//1B +void CMA_VU::CUpper::MULbc() +{ + VUShared::MULbc(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT, m_nBc); +} + +//1C +void CMA_VU::CUpper::MULq() +{ + VUShared::MULq(m_codeGen, m_nDest, m_nFD, m_nFS, m_nAddress); +} + +//1E +void CMA_VU::CUpper::MULi() +{ + VUShared::MULi(m_codeGen, m_nDest, m_nFD, m_nFS); +} + +//1F +void CMA_VU::CUpper::MINIi() +{ + VUShared::MINIi(m_codeGen, m_nDest, m_nFD, m_nFS); +} + +//20 +void CMA_VU::CUpper::ADDq() +{ + VUShared::ADDq(m_codeGen, m_nDest, m_nFD, m_nFS, m_nAddress); +} + +//21 +void CMA_VU::CUpper::MADDq() +{ + VUShared::MADDq(m_codeGen, m_nDest, m_nFD, m_nFS, m_nAddress); +} + +//22 +void CMA_VU::CUpper::ADDi() +{ + VUShared::ADDi(m_codeGen, m_nDest, m_nFD, m_nFS); +} + +//26 +void CMA_VU::CUpper::SUBi() +{ + VUShared::SUBi(m_codeGen, m_nDest, m_nFD, m_nFS); +} + +//27 +void CMA_VU::CUpper::MSUBi() +{ + VUShared::MSUBi(m_codeGen, m_nDest, m_nFD, m_nFS); +} + +//28 +void CMA_VU::CUpper::ADD() +{ + VUShared::ADD(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); +} + +//29 +void CMA_VU::CUpper::MADD() +{ + VUShared::MADD(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); +} + +//2A +void CMA_VU::CUpper::MUL() +{ + VUShared::MUL(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); +} + +//2B +void CMA_VU::CUpper::MAX() +{ + VUShared::MAX(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); +} + +//2C +void CMA_VU::CUpper::SUB() +{ + VUShared::SUB(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); +} + +//2E +void CMA_VU::CUpper::OPMSUB() +{ + VUShared::OPMSUB(m_codeGen, m_nFD, m_nFS, m_nFT); +} + +//2F +void CMA_VU::CUpper::MINI() +{ + VUShared::MINI(m_codeGen, m_nDest, m_nFD, m_nFS, m_nFT); +} + +//3C +void CMA_VU::CUpper::VECTOR0() +{ + ((this)->*(m_pOpVector0[(m_nOpcode >> 6) & 0x1F]))(); +} + +//3D +void CMA_VU::CUpper::VECTOR1() +{ + ((this)->*(m_pOpVector1[(m_nOpcode >> 6) & 0x1F]))(); +} + +//3E +void CMA_VU::CUpper::VECTOR2() +{ + ((this)->*(m_pOpVector2[(m_nOpcode >> 6) & 0x1F]))(); +} + +//3F +void CMA_VU::CUpper::VECTOR3() +{ + ((this)->*(m_pOpVector3[(m_nOpcode >> 6) & 0x1F]))(); +} + +////////////////////////////////////////////////// +//VectorX Common Instructions +////////////////////////////////////////////////// + +//00 +void CMA_VU::CUpper::ADDAbc() +{ + VUShared::ADDAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); +} + +//02 +void CMA_VU::CUpper::MADDAbc() +{ + VUShared::MADDAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); +} + +//03 +void CMA_VU::CUpper::MSUBAbc() +{ + VUShared::MSUBAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); +} + +//06 +void CMA_VU::CUpper::MULAbc() +{ + VUShared::MULAbc(m_codeGen, m_nDest, m_nFS, m_nFT, m_nBc); +} + +////////////////////////////////////////////////// +//Vector0 Instructions +////////////////////////////////////////////////// + +//04 +void CMA_VU::CUpper::ITOF0() +{ + VUShared::ITOF0(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//05 +void CMA_VU::CUpper::FTOI0() +{ + VUShared::FTOI0(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//0A +void CMA_VU::CUpper::ADDA() +{ + VUShared::ADDA(m_codeGen, m_nDest, m_nFS, m_nFT); +} + +////////////////////////////////////////////////// +//Vector1 Instructions +////////////////////////////////////////////////// + +//04 +void CMA_VU::CUpper::ITOF4() +{ + VUShared::ITOF4(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//05 +void CMA_VU::CUpper::FTOI4() +{ + VUShared::FTOI4(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//07 +void CMA_VU::CUpper::ABS() +{ + VUShared::ABS(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//0A +void CMA_VU::CUpper::MADDA() +{ + VUShared::MADDA(m_codeGen, m_nDest, m_nFS, m_nFT); +} + +////////////////////////////////////////////////// +//Vector2 Instructions +////////////////////////////////////////////////// + +//04 +void CMA_VU::CUpper::ITOF12() +{ + VUShared::ITOF12(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//05 +void CMA_VU::CUpper::FTOI12() +{ + VUShared::FTOI12(m_codeGen, m_nDest, m_nFT, m_nFS); +} + +//07 +void CMA_VU::CUpper::MULAi() +{ + VUShared::MULAi(m_codeGen, m_nDest, m_nFS); +} + +//0A +void CMA_VU::CUpper::MULA() +{ + VUShared::MULA(m_codeGen, m_nDest, m_nFS, m_nFT); +} + +//0B +void CMA_VU::CUpper::OPMULA() +{ + VUShared::OPMULA(m_codeGen, m_nFS, m_nFT); +} + +////////////////////////////////////////////////// +//Vector3 Instructions +////////////////////////////////////////////////// + +//07 +void CMA_VU::CUpper::CLIP() +{ + VUShared::CLIP(m_codeGen, m_nFS, m_nFT); +} + +//08 +void CMA_VU::CUpper::MADDAi() +{ + VUShared::MADDAi(m_codeGen, m_nDest, m_nFS); +} + +//09 +void CMA_VU::CUpper::MSUBAi() +{ + VUShared::MSUBAi(m_codeGen, m_nDest, m_nFS); +} + +//0B +void CMA_VU::CUpper::NOP() +{ + +} + +////////////////////////////////////////////////// +//Opcode Tables +////////////////////////////////////////////////// + +CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector[0x40] = +{ + //0x00 + &CMA_VU::CUpper::ADDbc, &CMA_VU::CUpper::ADDbc, &CMA_VU::CUpper::ADDbc, &CMA_VU::CUpper::ADDbc, &CMA_VU::CUpper::SUBbc, &CMA_VU::CUpper::SUBbc, &CMA_VU::CUpper::SUBbc, &CMA_VU::CUpper::SUBbc, + //0x08 + &CMA_VU::CUpper::MADDbc, &CMA_VU::CUpper::MADDbc, &CMA_VU::CUpper::MADDbc, &CMA_VU::CUpper::MADDbc, &CMA_VU::CUpper::MSUBbc, &CMA_VU::CUpper::MSUBbc, &CMA_VU::CUpper::MSUBbc, &CMA_VU::CUpper::MSUBbc, + //0x10 + &CMA_VU::CUpper::MAXbc, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MAXbc, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MINIbc, + //0x18 + &CMA_VU::CUpper::MULbc, &CMA_VU::CUpper::MULbc, &CMA_VU::CUpper::MULbc, &CMA_VU::CUpper::MULbc, &CMA_VU::CUpper::MULq, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MULi, &CMA_VU::CUpper::MINIi, + //0x20 + &CMA_VU::CUpper::ADDq, &CMA_VU::CUpper::MADDq, &CMA_VU::CUpper::ADDi, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::SUBi, &CMA_VU::CUpper::MSUBi, + //0x28 + &CMA_VU::CUpper::ADD, &CMA_VU::CUpper::MADD, &CMA_VU::CUpper::MUL, &CMA_VU::CUpper::MAX, &CMA_VU::CUpper::SUB, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::OPMSUB, &CMA_VU::CUpper::MINI, + //0x30 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x38 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::VECTOR0, &CMA_VU::CUpper::VECTOR1, &CMA_VU::CUpper::VECTOR2, &CMA_VU::CUpper::VECTOR3, +}; + +CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector0[0x20] = +{ + //0x00 + &CMA_VU::CUpper::ADDAbc, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MSUBAbc, &CMA_VU::CUpper::ITOF0, &CMA_VU::CUpper::FTOI0, &CMA_VU::CUpper::MULAbc, &CMA_VU::CUpper::Illegal, + //0x08 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::ADDA, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x10 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x18 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, +}; + +CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector1[0x20] = +{ + //0x00 + &CMA_VU::CUpper::ADDAbc, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MADDAbc, &CMA_VU::CUpper::MSUBAbc, &CMA_VU::CUpper::ITOF4, &CMA_VU::CUpper::FTOI4, &CMA_VU::CUpper::MULAbc, &CMA_VU::CUpper::ABS, + //0x08 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MADDA, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x10 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x18 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, +}; + +CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector2[0x20] = +{ + //0x00 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MADDAbc, &CMA_VU::CUpper::MSUBAbc, &CMA_VU::CUpper::ITOF12, &CMA_VU::CUpper::FTOI12, &CMA_VU::CUpper::MULAbc, &CMA_VU::CUpper::MULAi, + //0x08 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MULA, &CMA_VU::CUpper::OPMULA, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x10 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x18 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, +}; + +CMA_VU::CUpper::InstructionFuncConstant CMA_VU::CUpper::m_pOpVector3[0x20] = +{ + //0x00 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MADDAbc, &CMA_VU::CUpper::MSUBAbc, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::MULAbc, &CMA_VU::CUpper::CLIP, + //0x08 + &CMA_VU::CUpper::MADDAi, &CMA_VU::CUpper::MSUBAi, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::NOP, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x10 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, + //0x18 + &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, &CMA_VU::CUpper::Illegal, +}; diff --git a/Source/VUShared.h b/Source/VUShared.h index a4b71c26..db4ea15c 100644 --- a/Source/VUShared.h +++ b/Source/VUShared.h @@ -6,6 +6,9 @@ #include "uint128.h" #include +#undef ABS +#undef MAX + namespace VUShared { enum VECTOR_COMP @@ -16,12 +19,12 @@ namespace VUShared VECTOR_COMPW = 3, }; - struct PIPEINFO - { - size_t value; - size_t heldValue; - size_t target; - }; + struct PIPEINFO + { + size_t value; + size_t heldValue; + size_t target; + }; struct OPERANDSET { @@ -62,7 +65,7 @@ namespace VUShared void ADDA_base(CCodeGen*, uint8, size_t, size_t, bool); void MADD_base(CCodeGen*, uint8, size_t, size_t, size_t, bool); - void MSUB_base(CCodeGen*, uint8, size_t, size_t, size_t, bool); + void MSUB_base(CCodeGen*, uint8, size_t, size_t, size_t, bool); //Shared instructions void ABS(CCodeGen*, uint8, uint8, uint8); @@ -94,7 +97,7 @@ namespace VUShared void MINIi(CCodeGen*, uint8, uint8, uint8); void MOVE(CCodeGen*, uint8, uint8, uint8); void MR32(CCodeGen*, uint8, uint8, uint8); - void MSUBbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8); + void MSUBbc(CCodeGen*, uint8, uint8, uint8, uint8, uint8); void MSUBi(CCodeGen*, uint8, uint8, uint8); void MSUBAbc(CCodeGen*, uint8, uint8, uint8, uint8); void MSUBAi(CCodeGen*, uint8, uint8); @@ -120,8 +123,8 @@ namespace VUShared void WAITQ(CCodeGen*); void FlushPipeline(const PIPEINFO&, CCodeGen*); - void QueueInPipeline(const PIPEINFO&, CCodeGen*, uint32); - void VerifyPipeline(const PIPEINFO&, CCodeGen*, uint32); + void QueueInPipeline(const PIPEINFO&, CCodeGen*, uint32); + void VerifyPipeline(const PIPEINFO&, CCodeGen*, uint32); //Shared addressing modes void ReflOpFdFsI(MIPSReflection::INSTRUCTION*, CMIPS*, uint32, uint32, char*, unsigned int); diff --git a/Source/VuBasicBlock.cpp b/Source/VuBasicBlock.cpp index b033801d..cacb4141 100644 --- a/Source/VuBasicBlock.cpp +++ b/Source/VuBasicBlock.cpp @@ -1,21 +1,22 @@ -#include "VuBasicBlock.h" -#include "MA_VU.h" - -CVuBasicBlock::CVuBasicBlock(CMIPS& context, uint32 begin, uint32 end) : -CBasicBlock(context, begin, end) -{ - -} - -CVuBasicBlock::~CVuBasicBlock() -{ - -} - -void CVuBasicBlock::CompileRange(CCodeGen& codeGen) -{ - assert((m_begin & 0x07) == 0); - assert(((m_end + 4) & 0x07) == 0); +#include "VuBasicBlock.h" +#include "MA_VU.h" +#include "offsetof_def.h" + +CVuBasicBlock::CVuBasicBlock(CMIPS& context, uint32 begin, uint32 end) : +CBasicBlock(context, begin, end) +{ + +} + +CVuBasicBlock::~CVuBasicBlock() +{ + +} + +void CVuBasicBlock::CompileRange(CCodeGen& codeGen) +{ + assert((m_begin & 0x07) == 0); + assert(((m_end + 4) & 0x07) == 0); CMA_VU* arch = static_cast(m_context.m_pArch); for(uint32 address = m_begin; address <= m_end; address += 8) { @@ -72,5 +73,5 @@ void CVuBasicBlock::CompileRange(CCodeGen& codeGen) //Sanity check assert(codeGen.IsStackEmpty()); - } -} + } +} diff --git a/Source/iop/Iop_PadMan.h b/Source/iop/Iop_PadMan.h index d48479ad..a81efdae 100644 --- a/Source/iop/Iop_PadMan.h +++ b/Source/iop/Iop_PadMan.h @@ -20,8 +20,8 @@ namespace Iop std::string GetFunctionName(unsigned int) const; void Invoke(CMIPS&, unsigned int); virtual bool Invoke(uint32, uint32*, uint32, uint32*, uint32, uint8*); - virtual void SaveState(CZipArchiveWriter&); - virtual void LoadState(CZipArchiveReader&); + virtual void SaveState(Framework::CZipArchiveWriter&); + virtual void LoadState(Framework::CZipArchiveReader&); virtual void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*); virtual void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*); diff --git a/Source/macosxui/DisAsmView.mm b/Source/macosxui/DisAsmView.mm index aeeed292..bd357c2c 100644 --- a/Source/macosxui/DisAsmView.mm +++ b/Source/macosxui/DisAsmView.mm @@ -179,7 +179,7 @@ using namespace std; break; case L'f': { - g_virtualMachine->Step(); + g_virtualMachine->StepEe(); return; } break; diff --git a/Source/macosxui/PH_HidMacOSX.cpp b/Source/macosxui/PH_HidMacOSX.cpp index 61b2c025..eae7b003 100644 --- a/Source/macosxui/PH_HidMacOSX.cpp +++ b/Source/macosxui/PH_HidMacOSX.cpp @@ -36,7 +36,7 @@ void CPH_HidMacOSX::Update(uint8* ram) uint32 currentBit = m_currentState & (1 << i); if(currentBit != previousBit) { - listener->SetButtonState(0, static_cast(1 << i), currentBit != 0, ram); + listener->SetButtonState(0, static_cast(1 << i), currentBit != 0, ram); } } } @@ -108,44 +108,44 @@ bool CPH_HidMacOSX::TranslateKey(uint32 scanCode, uint32& gameKey) switch(scanCode) { case kHIDUsage_KeyboardReturn: - gameKey = CPadListener::BUTTON_START; + gameKey = PS2::CControllerInfo::START; return true; break; case kHIDUsage_KeyboardLeftShift: case kHIDUsage_KeyboardRightShift: - gameKey = CPadListener::BUTTON_SELECT; + gameKey = PS2::CControllerInfo::SELECT; return true; break; case kHIDUsage_KeyboardLeftArrow: - gameKey = CPadListener::BUTTON_LEFT; + gameKey = PS2::CControllerInfo::DPAD_LEFT; return true; break; case kHIDUsage_KeyboardRightArrow: - gameKey = CPadListener::BUTTON_RIGHT; + gameKey = PS2::CControllerInfo::DPAD_RIGHT; return true; break; case kHIDUsage_KeyboardUpArrow: - gameKey = CPadListener::BUTTON_UP; + gameKey = PS2::CControllerInfo::DPAD_UP; return true; break; case kHIDUsage_KeyboardDownArrow: - gameKey = CPadListener::BUTTON_DOWN; + gameKey = PS2::CControllerInfo::DPAD_DOWN; return true; break; case kHIDUsage_KeyboardA: - gameKey = CPadListener::BUTTON_SQUARE; + gameKey = PS2::CControllerInfo::SQUARE; return true; break; case kHIDUsage_KeyboardZ: - gameKey = CPadListener::BUTTON_CROSS; + gameKey = PS2::CControllerInfo::CROSS; return true; break; case kHIDUsage_KeyboardS: - gameKey = CPadListener::BUTTON_TRIANGLE; + gameKey = PS2::CControllerInfo::TRIANGLE; return true; break; case kHIDUsage_KeyboardX: - gameKey = CPadListener::BUTTON_CIRCLE; + gameKey = PS2::CControllerInfo::CIRCLE; return true; break; } diff --git a/Source/macosxui/VfsManagerBindings.mm b/Source/macosxui/VfsManagerBindings.mm index 41c295a8..0552ccd2 100644 --- a/Source/macosxui/VfsManagerBindings.mm +++ b/Source/macosxui/VfsManagerBindings.mm @@ -1,5 +1,5 @@ #import "VfsManagerBindings.h" -#import "../Config.h" +#import "../AppConfig.h" #define PREFERENCE_CDROM0_PATH ("ps2.cdrom0.path") @@ -123,7 +123,7 @@ CVfsManagerDirectoryBinding* result = [super init]; m_deviceName = deviceName; m_preference = preferenceName; - const char* preferenceValue = CConfig::GetInstance().GetPreferenceString([preferenceName UTF8String]); + const char* preferenceValue = CAppConfig::GetInstance().GetPreferenceString([preferenceName UTF8String]); if(preferenceValue == NULL) { m_value = @""; @@ -176,7 +176,7 @@ -(void)save { - CConfig::GetInstance().SetPreferenceString([m_preference UTF8String], [m_value UTF8String]); + CAppConfig::GetInstance().SetPreferenceString([m_preference UTF8String], [m_value UTF8String]); } @end @@ -186,7 +186,7 @@ -(CVfsManagerCdrom0Binding*)init { CVfsManagerCdrom0Binding* result = [super init]; - const char* preferenceValue = CConfig::GetInstance().GetPreferenceString(PREFERENCE_CDROM0_PATH); + const char* preferenceValue = CAppConfig::GetInstance().GetPreferenceString(PREFERENCE_CDROM0_PATH); if(preferenceValue == NULL) { m_value = @""; @@ -235,7 +235,7 @@ -(void)save { - CConfig::GetInstance().SetPreferenceString(PREFERENCE_CDROM0_PATH, [m_value UTF8String]); + CAppConfig::GetInstance().SetPreferenceString(PREFERENCE_CDROM0_PATH, [m_value UTF8String]); } @end