[Xboxkrnl/Xconfig] - add xboxkrnl_xconfig.h

- Add xboxkrnl_xconfig.h to hold known Xconfig flags
- Implement more xeExGetXConfigSetting cases
This commit is contained in:
The-Little-Wolf 2025-01-25 23:59:15 -08:00
parent 403c9500bb
commit 32d3c8d665
2 changed files with 187 additions and 7 deletions

View File

@ -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<uint32_t>(value, 0x00400100);
xe::store_and_swap<uint32_t>(value, X_AV_REGION::NTSCM);
break;
case 2: // NTSCJ
xe::store_and_swap<uint32_t>(value, 0x00400200);
xe::store_and_swap<uint32_t>(value, X_AV_REGION::NTSCJ);
break;
case 3: // PAL
xe::store_and_swap<uint32_t>(
value, cvars::use_50Hz_mode ? 0x00800300 : 0x00400400);
xe::store_and_swap<uint32_t>(value, cvars::use_50Hz_mode
? X_AV_REGION::PAL_50
: X_AV_REGION::PAL);
break;
default:
xe::store_and_swap<uint32_t>(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<uint32_t>(
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<uint8_t>(cvars::user_country);
break;
case 0x000F: // XCONFIG_USER_PC_FLAGS
setting_size = 1;
xe::store_and_swap<uint8_t>(value, 0);
break;
case 0x001B: // XCONFIG_USER_PC_HINT
setting_size = 1;
xe::store_and_swap<uint8_t>(value, 0);
break;
case 0x0029: // XCONFIG_USER_VIDEO_OUTPUT_BLACK_LEVELS
setting_size = 4;
xe::store_and_swap<uint32_t>(value, X_BLACK_LEVEL::LevelNormal);
break;
default:
XELOGW("An unimplemented setting 0x{:04X} in XCONFIG USER CATEGORY",
static_cast<uint16_t>(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<int16_t>(value, X_SCREENSAVER::ScreensaverOff);
break;
case 0x0002: // XCONFIG_CONSOLE_AUTO_SHUTDOWN
setting_size = 2;
xe::store_and_swap<int16_t>(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<uint32_t>(value, X_CAMERA_FLAGS::AutoAll);
break;
case 0x0007: // XCONFIG_CONSOLE_KEYBOARD_LAYOUT
setting_size = 2;
xe::store_and_swap<int16_t>(value,
X_KEYBOARD_LAYOUT::KeyboardDefault);
break;
default:
XELOGW(
"An unimplemented setting 0x{:04X} in XCONFIG CONSOLE CATEGORY",
static_cast<uint16_t>(setting));
assert_unhandled_case(setting);
return X_STATUS_INVALID_PARAMETER_2;
}
break;
default:
XELOGW("An unimplemented category 0x{:04X}",
static_cast<uint16_t>(category));

View File

@ -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_