diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc index 2c52aec22..13b44642a 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.cc @@ -7,6 +7,7 @@ ****************************************************************************** */ +#include "xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h" #include "xenia/base/logging.h" #include "xenia/cpu/processor.h" #include "xenia/kernel/kernel_state.h" @@ -79,14 +80,15 @@ X_STATUS xeExGetXConfigSetting(uint16_t category, uint16_t setting, setting_size = 4; switch (cvars::video_standard) { case 1: // NTSCM - xe::store_and_swap(value, 0x00400100); + xe::store_and_swap(value, X_AV_REGION::NTSCM); break; case 2: // NTSCJ - xe::store_and_swap(value, 0x00400200); + xe::store_and_swap(value, X_AV_REGION::NTSCJ); break; case 3: // PAL - xe::store_and_swap( - value, cvars::use_50Hz_mode ? 0x00800300 : 0x00400400); + xe::store_and_swap(value, cvars::use_50Hz_mode + ? X_AV_REGION::PAL_50 + : X_AV_REGION::PAL); break; default: xe::store_and_swap(value, 0); @@ -121,10 +123,9 @@ X_STATUS xeExGetXConfigSetting(uint16_t category, uint16_t setting, break; case 0x000A: // XCONFIG_USER_VIDEO_FLAGS setting_size = 4; - // 0x00040000 normal - // 0x00050000 widescreen xe::store_and_swap( - value, cvars::widescreen ? 0x00050000 : 0x00040000); + value, cvars::widescreen ? X_VIDEO_ASPECT_RATIO::Widescreen + : X_VIDEO_ASPECT_RATIO::RatioNormal); break; case 0x000B: // XCONFIG_USER_AUDIO_FLAGS setting_size = 4; @@ -139,6 +140,18 @@ X_STATUS xeExGetXConfigSetting(uint16_t category, uint16_t setting, setting_size = 1; value[0] = static_cast(cvars::user_country); break; + case 0x000F: // XCONFIG_USER_PC_FLAGS + setting_size = 1; + xe::store_and_swap(value, 0); + break; + case 0x001B: // XCONFIG_USER_PC_HINT + setting_size = 1; + xe::store_and_swap(value, 0); + break; + case 0x0029: // XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS + setting_size = 4; + xe::store_and_swap(value, X_BLACK_LEVEL::LevelNormal); + break; default: XELOGW("An unimplemented setting 0x{:04X} in XCONFIG USER CATEGORY", static_cast(setting)); @@ -146,6 +159,35 @@ X_STATUS xeExGetXConfigSetting(uint16_t category, uint16_t setting, return X_STATUS_INVALID_PARAMETER_2; } break; + case 0x0007: + // XCONFIG_CONSOLE_SETTINGS + switch (setting) { + case 0x0001: // XCONFIG_CONSOLE_SCREENSAVER + setting_size = 2; + xe::store_and_swap(value, X_SCREENSAVER::ScreensaverOff); + break; + case 0x0002: // XCONFIG_CONSOLE_AUTO_SHUTDOWN + setting_size = 2; + xe::store_and_swap(value, X_AUTO_SHUTDOWN::AutoShutdownOff); + break; + case 0x0004: // XCONFIG_CONSOLE_CAMERA_SETTINGS + // Camera Flags are added together and last byte is always 0x1 + setting_size = 4; + xe::store_and_swap(value, X_CAMERA_FLAGS::AutoAll); + break; + case 0x0007: // XCONFIG_CONSOLE_KEYBOARD_LAYOUT + setting_size = 2; + xe::store_and_swap(value, + X_KEYBOARD_LAYOUT::KeyboardDefault); + break; + default: + XELOGW( + "An unimplemented setting 0x{:04X} in XCONFIG CONSOLE CATEGORY", + static_cast(setting)); + assert_unhandled_case(setting); + return X_STATUS_INVALID_PARAMETER_2; + } + break; default: XELOGW("An unimplemented category 0x{:04X}", static_cast(category)); diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h new file mode 100644 index 000000000..4902605e6 --- /dev/null +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_xconfig.h @@ -0,0 +1,138 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2025 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_XBOXKRNL_XBOXKRNL_XCONFIG_H_ +#define XENIA_KERNEL_XBOXKRNL_XBOXKRNL_XCONFIG_H_ + +#include "xenia/kernel/util/shim_utils.h" +#include "xenia/xbox.h" + +namespace xe { +namespace kernel { +namespace xboxkrnl { + +// XCONFIG_SECURED_AV_REGION +enum X_AV_REGION : uint32_t { + NTSCM = 0x00400100, + NTSCJ = 0x00400200, + PAL = 0x00400400, + PAL_50 = 0x00800300, +}; + +// XCONFIG_USER_VIDEO_FLAGS +enum X_VIDEO_ASPECT_RATIO : uint32_t { + RatioNormal = 0x00400100, + Widescreen = 0x00400200, +}; + +// XCONFIG_USER_AUDIO_FLAGS +enum X_AUDIO_FLAGS : uint32_t { + // Audio Mode Analog + DolbyProLogic = 0x00000001, + AnalogMono = 0x00000002, + // Audio Mode Digital + DigitalStereo = 0x00000000, + DolbyDigital = 0x00010000, + DolbyDigitalWithWMAPRO = 0x00030000, + // Special Flags + StereoBypass = 0x00000003, + LowLatency = 0x80000000, +}; + +// XCONFIG_USER_RETAIL_FLAGS +enum X_RETAIL_FLAGS : uint32_t { + // Clock + DSTOff = 0x00000002, + TwentyFourHourClock = 0x00000008, + + // Startup + DashboardStartup = 0x00000080, + IPTVStartup = 0x00000800, + DiscStartup = 0x00002000, + MCXDownloaderStartup = 0x00020000, + // IPTV + IPTVEnabled = 0x00001000, + IPTVDVRENABLED = 0x00080000, + IPTVDisabled = 0x02000000, + // Kinect + KinectInitialized = 0x20000000, + KinectDisabled = 0x80000000, + + // Other + DashboardInitialized = 0x00000040, + BackgroundDownloadOn = 0X00010000, +}; + +// XCONFIG_USER_PC_FLAGS +enum X_PC_FLAGS : uint8_t { + XBLAllowed = 0x01, + XBLMembershipCreationAllowed = 0x02, + PCEnabled = 0x80, +}; + +enum X_PC_HINTS : uint8_t { + FavoriteFictionalCharactar = 0, + FavoritePersonFromHistory = 1, + FavoriteChildhoodBookOrStory = 2, + FavoriteMovie = 3, + FavoriteFood = 4 +}; + +// XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS +enum X_BLACK_LEVEL : uint32_t { + High = 0x00000100, + Intermediate = 0x00000200, + LevelNormal = 0x00000300, +}; + +// XCONFIG_CONSOLE_SCREENSAVER +enum X_SCREENSAVER : uint32_t { + ScreensaverOn = 0x000A, + ScreensaverOff = 0X1000, +}; + +// XCONFIG_CONSOLE_AUTO_SHUTDOWN +enum X_AUTO_SHUTDOWN : uint32_t { + AutoShutdownOff = 0x0000, + AutoShutdownOneHr = 0x003C, + AutoShutdownSixHr = 0x0168, +}; + +// XCONFIG_CONSOLE_CAMERA_SETTINGS +enum X_CAMERA_FLAGS : uint32_t { + // Room + RoomAuto = 0x00000000, + DarkWall = 0x00000001, + LightWall = 0x00000002, + // Lighting + LightingAuto = 0x00000000, + Incandescent = 0x00000004, + Flourescent = 0x00000008, + Daylight = 0x0000000C, + // Flourescent Anti-Flicker + AntiFlickerAuto = 0x00000000, + AntiFlickerOn = 0x00000001, + AntiFlickerOff = 0x00000002, + // Default + AutoAll = 0x00000001, +}; + +// XCONFIG_CONSOLE_KEYBOARD_LAYOUT +enum X_KEYBOARD_LAYOUT : uint16_t { + KeyboardDefault = 0x0000, + EnglishQWERTY = 0x0001, +}; + +// XCONFIG_CONSOLE_KEYBOARD_LAYOUT + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + +#endif // XENIA_KERNEL_XBOXKRNL_XBOXKRNL_XCONFIG_H_