diff --git a/src/CxbxKrnl/CxbxKrnl.cpp b/src/CxbxKrnl/CxbxKrnl.cpp index cf99313f7..8eda3c0ed 100644 --- a/src/CxbxKrnl/CxbxKrnl.cpp +++ b/src/CxbxKrnl/CxbxKrnl.cpp @@ -357,6 +357,10 @@ extern "C" CXBXKRNL_API void CxbxKrnlInit #endif } +#ifdef _DEBUG_TRACE + VerifyHLEDataBase(); +#endif + { // Create a fake kernel header for XapiRestrictCodeSelectorLimit // Thanks advancingdragon / DirtBox diff --git a/src/CxbxKrnl/EmuKrnlEx.cpp b/src/CxbxKrnl/EmuKrnlEx.cpp index 6b43c81a4..6a5d9f93f 100644 --- a/src/CxbxKrnl/EmuKrnlEx.cpp +++ b/src/CxbxKrnl/EmuKrnlEx.cpp @@ -290,6 +290,7 @@ DWORD EEPROM_XboxLanguage = 0x01; // = English DWORD EEPROM_XboxVideo = 0x10; // = Letterbox DWORD EEPROM_XboxAudio = 0; // = Stereo, no AC3, no DTS DWORD EEPROM_ParentalControlGames = 0; // = XC_PC_ESRB_ALL +DWORD EEPROM_ParentalControlMovies = 0; // = XC_PC_ESRB_ALL DWORD EEPROM_XboxMisc = 0; // No automatic power down DWORD EEPROM_XboxFactoryAvRegion = 0x01; // = NTSC_M DWORD EEPROM_XboxFactoryGameRegion = 1; // = North America @@ -308,6 +309,7 @@ static const EEPROMInfo EEPROMInfos[] = { { xboxkrnl::XC_VIDEO, &EEPROM_XboxVideo, REG_DWORD, sizeof(DWORD) }, { xboxkrnl::XC_AUDIO, &EEPROM_XboxAudio, REG_DWORD, sizeof(DWORD) }, { xboxkrnl::XC_P_CONTROL_GAMES, &EEPROM_ParentalControlGames, REG_DWORD, sizeof(DWORD) }, // Zapper queries this. TODO : Should this be REG_NONE? + { xboxkrnl::XC_P_CONTROL_MOVIES, &EEPROM_ParentalControlMovies, REG_DWORD, sizeof(DWORD) }, // Xbox Dashboard queries this. { xboxkrnl::XC_MISC, &EEPROM_XboxMisc, REG_DWORD, sizeof(DWORD) }, { xboxkrnl::XC_FACTORY_AV_REGION, &EEPROM_XboxFactoryAvRegion, REG_DWORD, sizeof(DWORD) }, { xboxkrnl::XC_FACTORY_GAME_REGION, &EEPROM_XboxFactoryGameRegion, REG_DWORD, sizeof(DWORD) }, diff --git a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4034.inl b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4034.inl index 02e67b892..8a0712a83 100644 --- a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4034.inl +++ b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4034.inl @@ -1096,8 +1096,6 @@ OOVPATable D3D8_1_0_4034[] = { OOVPA_TABLE_PATCH(IDirect3DDevice8_Clear_1_0_4034, XTL::EmuIDirect3DDevice8_Clear), // IDirect3DResource8::Register OOVPA_TABLE_PATCH(IDirect3DResource8_Register_1_0_3925, XTL::EmuIDirect3DResource8_Register), - // IDirect3DDevice8::CreatePalette - OOVPA_TABLE_PATCH(IDirect3DDevice8_CreatePalette_1_0_3925, XTL::EmuIDirect3DDevice8_CreatePalette), // ********************** BEG WARNING UNTESTED!!! ******************* #if 0 @@ -1316,8 +1314,6 @@ OOVPATable D3D8_1_0_4034[] = { OOVPA_TABLE_PATCH(Direct3D_SetPushBufferSize_1_0_4034, XTL::EmuIDirect3D8_SetPushBufferSize), // Get2DSurfacDesc OOVPA_TABLE_PATCH(Get2DSurfaceDesc_1_0_4034, XTL::EmuGet2DSurfaceDesc), - // IDirect3DTexture8::GetSurfaceLevel (* unchanged since 3925 *) - OOVPA_TABLE_PATCH(IDirect3DTexture8_GetSurfaceLevel_1_0_3925, XTL::EmuIDirect3DTexture8_GetSurfaceLevel), // D3DDevice_SetRenderState_ZEnable OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_ZEnable_1_0_4034, XTL::EmuIDirect3DDevice8_SetRenderState_ZEnable), // D3DDevice_LightEnable @@ -1328,8 +1324,6 @@ OOVPATable D3D8_1_0_4034[] = { OOVPA_TABLE_PATCH(Direct3D_GetAdapterIdentifier_1_0_3925, XTL::EmuIDirect3D8_GetAdapterIdentifier), // IDirect3DSurface8::GetDesc (* unchanged since 3925 *) OOVPA_TABLE_PATCH(D3DSurface_GetDesc_1_0_3925, XTL::EmuIDirect3DSurface8_GetDesc), - // Get2DSurfacDesc - OOVPA_TABLE_PATCH(Get2DSurfaceDesc_1_0_4034, XTL::EmuGet2DSurfaceDesc), // IDirect3DDevice8::SetLight OOVPA_TABLE_PATCH(IDirect3DDevice8_SetLight_1_0_4034, XTL::EmuIDirect3DDevice8_SetLight), // IDirect3DVertexBuffer8::Lock diff --git a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4134.inl b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4134.inl index 640f9e09f..bc5ce7ba7 100644 --- a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4134.inl +++ b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4134.inl @@ -2035,8 +2035,6 @@ OOVPATable D3D8_1_0_4134[] = { OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_FrontFace_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_FrontFace), // IDirect3DDevice8::SetRenderState_LogicOp OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_LogicOp_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_LogicOp), - // IDirect3DDevice8::SetRenderState_StencilFail - OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_StencilFail_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_StencilFail), // IDirect3DDevice8::SetRenderState_OcclusionCullEnable OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_OcclusionCullEnable_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_OcclusionCullEnable), // IDirect3DDevice8::SetRenderState_StencilCullEnable diff --git a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4432.inl b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4432.inl index 7056e7d97..f73631b35 100644 --- a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4432.inl +++ b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4432.inl @@ -748,8 +748,6 @@ OOVPATable D3D8_1_0_4432[] { OOVPA_TABLE_PATCH(IDirect3DDevice8_GetCreationParameters_1_0_4034, XTL::EmuIDirect3DDevice8_GetCreationParameters), // IDirect3DDevice8::GetVisibilityTestResult (* unchanged since 3925 *) OOVPA_TABLE_PATCH(IDirect3DDevice8_GetVisibilityTestResult_1_0_3925, XTL::EmuIDirect3DDevice8_GetVisibilityTestResult), - // IDirect3DDevice8::SetTextureState_BumpEnv (* unchanged since 4361 *) - OOVPA_TABLE_PATCH(IDirect3DDevice8_SetTextureState_BumpEnv_1_0_4361, XTL::EmuIDirect3DDevice8_SetTextureState_BumpEnv), // IDirect3DDevice8::SetRenderState_EdgeAntiAlias (* unchanged since 4361 *) OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_EdgeAntiAlias_1_0_4361, XTL::EmuIDirect3DDevice8_SetRenderState_EdgeAntiAlias), // IDirect3DDevice8::SetRenderState_FillMode (* unchanged since 4361 *) diff --git a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl index ec1d82726..d6b472b5f 100644 --- a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl +++ b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.4627.inl @@ -1013,6 +1013,10 @@ OOVPA_END; // ****************************************************************** OOVPA_NO_XREF(IDirect3DDevice8_Begin_1_0_4627, 14) + // IDirect3DDevice8_Begin+0x19 : shl edx, 6 + { 0x19, 0xD1 }, // (Offset,Value)-Pair #7 + { 0x1A, 0xE8 }, // (Offset,Value)-Pair #8 + // IDirect3DDevice8_Begin+0x25 : mov dword ptr [eax], 0x417FC { 0x25, 0xC7 }, // (Offset,Value)-Pair #1 { 0x26, 0x00 }, // (Offset,Value)-Pair #2 @@ -1021,10 +1025,6 @@ OOVPA_NO_XREF(IDirect3DDevice8_Begin_1_0_4627, 14) { 0x29, 0x04 }, // (Offset,Value)-Pair #5 { 0x2A, 0x00 }, // (Offset,Value)-Pair #6 - // IDirect3DDevice8_Begin+0x19 : shl edx, 6 - { 0x19, 0xD1 }, // (Offset,Value)-Pair #7 - { 0x1A, 0xE8 }, // (Offset,Value)-Pair #8 - // IDirect3DDevice8_Begin+0x33 : or dword ptr [esi+8], 0x800 { 0x33, 0x81 }, // (Offset,Value)-Pair #9 { 0x34, 0x4E }, // (Offset,Value)-Pair #10 @@ -3479,8 +3479,6 @@ OOVPATable D3D8_1_0_4627[] = { OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_RopZRead_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_RopZRead), // IDirect3DDevice8::SetRenderState_DoNotCullUncompressed (* unchanged since 4134 *) OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_DoNotCullUncompressed_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_DoNotCullUncompressed), - // IDirect3DDevice8::DeletePixelShader (* unchanged since 4134 *) - OOVPA_TABLE_PATCH(IDirect3DDevice8_DeletePixelShader_1_0_4134, XTL::EmuIDirect3DDevice8_DeletePixelShader), // D3DDevice_PersistDisplay OOVPA_TABLE_PATCH(D3DDevice_PersistDisplay_1_0_4627, XTL::EmuIDirect3DDevice8_PersistDisplay), // D3DDevice_PersistDisplay diff --git a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl index 5d756bbe7..99db466b0 100644 --- a/src/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl +++ b/src/CxbxKrnl/HLEDataBase/D3D8.1.0.5849.inl @@ -1478,8 +1478,6 @@ OOVPATable D3D8_1_0_5849[] = { OOVPA_TABLE_PATCH(D3DDevice_SetRenderState_StencilFail_1_0_5849, XTL::EmuIDirect3DDevice8_SetRenderState_StencilFail), // D3DDevice_SetRenderState_VertexBlend OOVPA_TABLE_PATCH(D3DDevice_SetRenderState_VertexBlend_1_0_5849, XTL::EmuIDirect3DDevice8_SetRenderState_VertexBlend), - // D3DDevice_SetRenderState_VertexBlend - OOVPA_TABLE_PATCH(D3DDevice_SetRenderState_VertexBlend_1_0_5849, XTL::EmuIDirect3DDevice8_SetRenderState_VertexBlend), // IDirect3DDevice8::Reset (* unchanged since 4134 *) OOVPA_TABLE_PATCH(IDirect3DDevice8_Reset_1_0_4134, XTL::EmuIDirect3DDevice8_Reset), // IDirect3DDevice::Release @@ -1580,14 +1578,8 @@ OOVPATable D3D8_1_0_5849[] = { OOVPA_TABLE_PATCH(D3DDevice_DeleteStateBlock_1_0_5849, XTL::EmuIDirect3DDevice8_DeleteStateBlock), // IDirect3DDevice8::SetRenderState_StencilCullEnable (* unchanged since 4134 *) OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_StencilCullEnable_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_StencilCullEnable), - // IDirect3DDevice8::SetRenderState_OcclusionCullEnable (* unchanged since 4134 *) - OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_OcclusionCullEnable_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_OcclusionCullEnable), // IDirect3DDevice8::SetRenderState_RopZCmpAlwaysRead OOVPA_TABLE_PATCH(D3DDevice_SetRenderState_RopZCmpAlwaysRead_1_0_5849, XTL::EmuIDirect3DDevice8_SetRenderState_RopZCmpAlwaysRead), - // IDirect3DDevice8::SetRenderState_RopZRead (* unchanged since 4134 *) - OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_RopZRead_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_RopZRead), - // IDirect3DDevice8::SetRenderState_DoNotCullUncompressed (* unchanged since 4134 *) - OOVPA_TABLE_PATCH(IDirect3DDevice8_SetRenderState_DoNotCullUncompressed_1_0_4134, XTL::EmuIDirect3DDevice8_SetRenderState_DoNotCullUncompressed), // D3DDevice_GetTexture2 OOVPA_TABLE_PATCH(D3DDevice_GetTexture2_1_0_5849, XTL::EmuIDirect3DDevice8_GetTexture2), // IDirect3DDevice8::SetRenderTargetFast (* unchanged since 5344 *) diff --git a/src/CxbxKrnl/HLEDataBase/D3D8LTCG.1.0.5849.inl b/src/CxbxKrnl/HLEDataBase/D3D8LTCG.1.0.5849.inl index 4a67f9a06..a63ca2964 100644 --- a/src/CxbxKrnl/HLEDataBase/D3D8LTCG.1.0.5849.inl +++ b/src/CxbxKrnl/HLEDataBase/D3D8LTCG.1.0.5849.inl @@ -1033,10 +1033,6 @@ OOVPATable D3D8LTCG_1_0_5849[] = { OOVPA_TABLE_PATCH(IDirect3DDevice8_SetTextureState_ColorKeyColor_1_0_5849_LTCG, XTL::EmuIDirect3DDevice8_SetTextureState_ColorKeyColor), // IDirect3DDevice8::Clear OOVPA_TABLE_PATCH(IDirect3DDevice8_Clear_1_0_5849_LTCG, XTL::EmuIDirect3DDevice8_Clear), - // IDirect3DVertexBuffer8::Lock2 - OOVPA_TABLE_PATCH(IDirect3DVertexBuffer8_Lock2_1_0_5849_LTCG, XTL::EmuIDirect3DVertexBuffer8_Lock2), - // IDirect3DDevice8::SetVertexShader - OOVPA_TABLE_PATCH(IDirect3DDevice8_SetVertexShader_1_0_5849_LTCG, XTL::EmuIDirect3DDevice8_SetVertexShader), }; uint32 D3D8LTCG_1_0_5849_SIZE = sizeof(D3D8LTCG_1_0_5849); \ No newline at end of file diff --git a/src/CxbxKrnl/HLEDataBase/DSound.1.0.3936.inl b/src/CxbxKrnl/HLEDataBase/DSound.1.0.3936.inl index d6d99ed79..54783a985 100644 --- a/src/CxbxKrnl/HLEDataBase/DSound.1.0.3936.inl +++ b/src/CxbxKrnl/HLEDataBase/DSound.1.0.3936.inl @@ -1763,6 +1763,11 @@ OOVPA_XREF(CDirectSoundStream_SetVelocityC_1_0_3936, 12, XREF_DSSTREAMSETVELOCITY1C, XRefZero) + // CDirectSoundStream_SetVelocityC+0x09 : movsd; movsd; movsd + { 0x09, 0xA5 }, // (Offset,Value)-Pair #8 + { 0x0A, 0xA5 }, // (Offset,Value)-Pair #9 + { 0x0B, 0xA5 }, // (Offset,Value)-Pair #10 + // CDirectSoundStream_SetVelocityC+0x0C : or byte ptr [ecx+0x80], 0x40 { 0x0C, 0x83 }, // (Offset,Value)-Pair #1 { 0x0D, 0x89 }, // (Offset,Value)-Pair #2 @@ -1772,11 +1777,6 @@ OOVPA_XREF(CDirectSoundStream_SetVelocityC_1_0_3936, 12, { 0x11, 0x00 }, // (Offset,Value)-Pair #6 { 0x12, 0x40 }, // (Offset,Value)-Pair #7 - // CDirectSoundStream_SetVelocityC+0x09 : movsd; movsd; movsd - { 0x09, 0xA5 }, // (Offset,Value)-Pair #8 - { 0x0A, 0xA5 }, // (Offset,Value)-Pair #9 - { 0x0B, 0xA5 }, // (Offset,Value)-Pair #10 - // CDirectSoundStream_SetVelocityC+0x25 : retn 0x08 { 0x25, 0xC2 }, // (Offset,Value)-Pair #11 { 0x26, 0x08 }, // (Offset,Value)-Pair #12 diff --git a/src/CxbxKrnl/HLEDataBase/DSound.1.0.5233.inl b/src/CxbxKrnl/HLEDataBase/DSound.1.0.5233.inl index b41007ec6..ec7597601 100644 --- a/src/CxbxKrnl/HLEDataBase/DSound.1.0.5233.inl +++ b/src/CxbxKrnl/HLEDataBase/DSound.1.0.5233.inl @@ -937,8 +937,6 @@ OOVPATable DSound_1_0_5233[] = { OOVPA_TABLE_XREF(CDirectSoundStream_FlushEx_1_0_5233), // IDirectSoundBuffer8::StopEx OOVPA_TABLE_PATCH(IDirectSoundBuffer8_StopEx_1_0_5233, XTL::EmuIDirectSoundBuffer8_StopEx), - // IDirectSound8::Release (* unchanged since 3936 *) - OOVPA_TABLE_PATCH(IDirectSound8_Release_1_0_3936, XTL::EmuIDirectSound8_Release), // DirectSound::CDirectSound::EnableHeadphones (XRef) OOVPA_TABLE_XREF(CDirectSound_EnableHeadphones_1_0_5233), // IDirectSound8::EnableHeadphones diff --git a/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5233.inl b/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5233.inl index 81d20aef5..5a7a716ce 100644 --- a/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5233.inl +++ b/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5233.inl @@ -50,17 +50,7 @@ OOVPA_END; // ****************************************************************** // * XNetGetEthernetLinkStatus // ****************************************************************** -OOVPA_NO_XREF(XNetGetEthernetLinkStatus_1_0_5344, 8) - - { 0x08, 0x33 }, - { 0x10, 0x8A }, - { 0x19, 0x00 }, - { 0x22, 0x56 }, - { 0x2B, 0xFF }, - { 0x34, 0xF0 }, - { 0x3D, 0x24 }, - { 0x46, 0x5B }, -OOVPA_END; +#define XNetGetEthernetLinkStatus_1_0_5344 XNetGetEthernetLinkStatus_1_0_4627 // ****************************************************************** // * CXo::XOnlineLogon diff --git a/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5849.inl b/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5849.inl index e6c8f4fb5..5987c6058 100644 --- a/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5849.inl +++ b/src/CxbxKrnl/HLEDataBase/XOnline.1.0.5849.inl @@ -82,17 +82,7 @@ OOVPA_END; // ****************************************************************** // * XNetGetEthernetLinkStatus // ****************************************************************** -OOVPA_NO_XREF(XNetGetEthernetLinkStatus_1_0_5849, 8) - - { 0x08, 0x33 }, - { 0x10, 0x8A }, - { 0x19, 0x00 }, - { 0x22, 0x56 }, - { 0x2B, 0xFF }, - { 0x34, 0xF0 }, - { 0x3D, 0x24 }, - { 0x46, 0x5B }, -OOVPA_END; +#define XNetGetEthernetLinkStatus_1_0_5849 XNetGetEthernetLinkStatus_1_0_4627 // ****************************************************************** // * XOnline_1_0_5849 diff --git a/src/CxbxKrnl/HLEDataBase/Xapi.1.0.3911.inl b/src/CxbxKrnl/HLEDataBase/Xapi.1.0.3911.inl index ac7d6bffe..3ce34b796 100644 --- a/src/CxbxKrnl/HLEDataBase/Xapi.1.0.3911.inl +++ b/src/CxbxKrnl/HLEDataBase/Xapi.1.0.3911.inl @@ -1017,8 +1017,6 @@ OOVPATable XAPI_1_0_3911[] = { OOVPA_TABLE_PATCH(SetThreadPriorityBoost_1_0_3911, XTL::EmuSetThreadPriorityBoost), // GetThreadPriority OOVPA_TABLE_PATCH(GetThreadPriority_1_0_3911, XTL::EmuGetThreadPriority), - // XGetDevices - OOVPA_TABLE_PATCH(XGetDevices_1_0_3911, XTL::EmuXGetDevices), // CreateFiber OOVPA_TABLE_PATCH(CreateFiber_1_0_3911, XTL::EmuCreateFiber), // DeleteFiber @@ -1027,8 +1025,6 @@ OOVPATable XAPI_1_0_3911[] = { OOVPA_TABLE_PATCH(SwitchToFiber_1_0_3911, XTL::EmuSwitchToFiber), // ConvertThreadToFiber OOVPA_TABLE_PATCH(ConvertThreadToFiber_1_0_3911, XTL::EmuConvertThreadToFiber), - // XInputGetCapabilities - OOVPA_TABLE_PATCH(XInputGetCapabilities_1_0_3911, XTL::EmuXInputGetCapabilities), // SignalObjectAndWait OOVPA_TABLE_PATCH(SignalObjectAndWait_1_0_3911, XTL::EmuSignalObjectAndWait), // QueueUserAPC diff --git a/src/CxbxKrnl/HLEDataBase/Xapi.1.0.5558.inl b/src/CxbxKrnl/HLEDataBase/Xapi.1.0.5558.inl index aadee969d..4346aee64 100644 --- a/src/CxbxKrnl/HLEDataBase/Xapi.1.0.5558.inl +++ b/src/CxbxKrnl/HLEDataBase/Xapi.1.0.5558.inl @@ -282,8 +282,6 @@ OOVPATable XAPI_1_0_5558[] = { OOVPA_TABLE_PATCH(GetThreadPriority_1_0_4627, XTL::EmuGetThreadPriority), // GetTimeZoneInformation (* unchanged since 3911 *) OOVPA_TABLE_PATCH(GetTimeZoneInformation_1_0_3911, XTL::EmuGetTimeZoneInformation), - // SetThreadPriority (* unchanged since 3911 *) - OOVPA_TABLE_PATCH(SetThreadPriority_1_0_3911, XTL::EmuSetThreadPriority), // XMountMUA OOVPA_TABLE_PATCH(XMountMUA_1_0_5558, XTL::EmuXMountMUA), // CreateFiber diff --git a/src/CxbxKrnl/HLEIntercept.cpp b/src/CxbxKrnl/HLEIntercept.cpp index 0159e0644..efee83274 100644 --- a/src/CxbxKrnl/HLEIntercept.cpp +++ b/src/CxbxKrnl/HLEIntercept.cpp @@ -759,3 +759,204 @@ static void EmuXRefFailure() CxbxKrnlCleanup("XRef-only function body reached. Fatal Error."); } +#ifdef _DEBUG_TRACE + +struct HLEVerifyContext { + const HLEData *main_data; + OOVPA *oovpa, *against; + const HLEData *against_data; + uint32 main_index, against_index; +}; + +std::string HLEErrorString(const HLEData *data, uint32 index) +{ + std::string result = + "OOVPATable " + (std::string)(data->Library) + "_1_0_" + std::to_string(data->BuildVersion) + + "[" + std::to_string(index) + "] " + + (std::string)(data->OovpaTable[index].szFuncName); + + return result; +} + +void HLEError(HLEVerifyContext *context, char *format, ...) +{ + std::string output = "HLE Error "; + if (context->main_data != nullptr) + output += "in " + HLEErrorString(context->main_data, context->main_index); + + if (context->against != nullptr && context->against_data != nullptr) + output += ", comparing against " + HLEErrorString(context->against_data, context->against_index); + + // format specific error message + char buffer[200]; + va_list args; + va_start(args, format); + vsprintf(buffer, format, args); + va_end(args); + + output += " : " + (std::string)buffer + (std::string)"\n"; + printf(output.c_str()); +} + +void VerifyHLEDataBaseAgainst(HLEVerifyContext *context); // forward + +void VerifyHLEOOVPA(HLEVerifyContext *context, OOVPA *oovpa) +{ + if (context->against == nullptr) { + // TODO : verify XRefSaveIndex and XRef's (how?) + + // verify offsets are in increasing order + uint32 prev_offset; + uint08 dummy_value; + GetOovpaEntry(oovpa, oovpa->XRefCount, prev_offset, dummy_value); + for (int p = oovpa->XRefCount + 1; p < oovpa->Count; p++) { + uint32 curr_offset; + GetOovpaEntry(oovpa, p, curr_offset, dummy_value); + if (!(curr_offset > prev_offset)) { + HLEError(context, "%s[%d] : Offset (0x%x) must be larger then previous offset (0x%x)", + (oovpa->Type = Large) ? "Lovp" : "Sovp", p, curr_offset, prev_offset); + } + } + + // find duplicate OOVPA's across all other data-table-oovpa's + context->oovpa = oovpa; + context->against = oovpa; + VerifyHLEDataBaseAgainst(context); + context->against = nullptr; // reset scanning state + return; + } + + // prevent checking an oovpa against itself + if (context->against == oovpa) + return; + + // compare {Offset, Value}-pairs between two OOVPA's + OOVPA *left = context->against, *right = oovpa; + int l = 0, r = 0; + uint32 left_offset, right_offset; + uint08 left_value, right_value; + GetOovpaEntry(left, l, left_offset, left_value); + GetOovpaEntry(right, r, right_offset, right_value); + int unique_offset_left = 0; + int unique_offset_right = 0; + int equal_offset_value = 0; + int equal_offset_different_value = 0; + while (true) { + bool left_next = true; + bool right_next = true; + + if (left_offset < right_offset) { + unique_offset_left++; + right_next = false; + } + else if (left_offset > right_offset) { + unique_offset_right++; + left_next = false; + } + else if (left_value == right_value) { + equal_offset_value++; + } + else { + equal_offset_different_value++; + } + + // increment r before use (in left_next) + if (right_next) + r++; + + if (left_next) { + l++; + if (l >= left->Count) { + unique_offset_right += right->Count - r; + break; + } + + GetOovpaEntry(left, l, left_offset, left_value); + } + + if (right_next) { + if (r >= right->Count) { + unique_offset_left += left->Count - l; + break; + } + + GetOovpaEntry(right, r, right_offset, right_value); + } + } + + // no mismatching values on identical offsets? + if (equal_offset_different_value == 0) + // enough matching OV-pairs? + if (equal_offset_value > 4) + { + // no unique OV-pairs on either side? + if (unique_offset_left + unique_offset_right == 0) + HLEError(context, "OOVPA's are identical", + unique_offset_left, + unique_offset_right); + else + // not too many new OV-pairs on the left side? + if (unique_offset_left < 6) + // not too many new OV-parirs on the right side? + if (unique_offset_right < 6) + HLEError(context, "OOVPA's are expanded (left +%d, right +%d)", + unique_offset_left, + unique_offset_right); + } +} + +void VerifyHLEDataEntry(HLEVerifyContext *context, const OOVPATable *table, uint32 index, uint32 count) +{ + if (context->against == nullptr) { + context->main_index = index; + // does this entry specify a redirection (patch)? + void * entry_redirect = table[index].lpRedirect; + if (entry_redirect != nullptr) { + // check no patch occurs twice in this table + for (uint32 t = index + 1; t < count; t++) { + if (entry_redirect == table[t].lpRedirect) { + if (table[index].Oovpa == table[t].Oovpa) { + HLEError(context, "Patch registered again (with same OOVPA) at index %d", + t); + } else { + HLEError(context, "Patch also used for another OOVPA at index %d", + t); + } + } + } + } + } + else + context->against_index = index; + + // verify the OOVPA of this entry + VerifyHLEOOVPA(context, table[index].Oovpa); +} + +void VerifyHLEData(HLEVerifyContext *context, const HLEData *data) +{ + if (context->against == nullptr) { + context->main_data = data; + } else { + context->against_data = data; + } + + // verify each entry in this HLEData + uint32 count = data->OovpaTableSize / sizeof(OOVPATable); + for (uint32 e = 0; e < count; e++) + VerifyHLEDataEntry(context, data->OovpaTable, e, count); +} + +void VerifyHLEDataBaseAgainst(HLEVerifyContext *context) +{ + // verify all HLEData's + for (uint32 d = 0; d < HLEDataBaseCount; d++) + VerifyHLEData(context, &HLEDataBase[d]); +} + +void VerifyHLEDataBase() +{ + HLEVerifyContext context = { 0 }; + VerifyHLEDataBaseAgainst(&context); +} +#endif // _DEBUG_TRACE diff --git a/src/CxbxKrnl/HLEIntercept.h b/src/CxbxKrnl/HLEIntercept.h index fdbfb3c7c..07f0aa77e 100644 --- a/src/CxbxKrnl/HLEIntercept.h +++ b/src/CxbxKrnl/HLEIntercept.h @@ -40,4 +40,8 @@ extern bool bLLE_JIT; // Set this to true for experimental JIT void EmuHLEIntercept(Xbe::LibraryVersion *LibraryVersion, Xbe::Header *XbeHeader); +#ifdef _DEBUG_TRACE +void VerifyHLEDataBase(); #endif + +#endif // HLEINTERCEPT_H