diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/citra/config.cpp | 5 | ||||
| -rw-r--r-- | src/citra_qt/config.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt.cpp | 51 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt.h | 44 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt_a.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt_s.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt_u.cpp | 8 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/ptm.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/ptm.h | 8 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/ptm_sysm.cpp | 4 | ||||
| -rw-r--r-- | src/core/settings.h | 3 |
11 files changed, 145 insertions, 14 deletions
diff --git a/src/citra/config.cpp b/src/citra/config.cpp index 6b6617352..ebea5f840 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp | |||
| @@ -73,8 +73,9 @@ void Config::ReadValues() { | |||
| 73 | // Data Storage | 73 | // Data Storage |
| 74 | Settings::values.use_virtual_sd = sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true); | 74 | Settings::values.use_virtual_sd = sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true); |
| 75 | 75 | ||
| 76 | // System Region | 76 | // System |
| 77 | Settings::values.region_value = sdl2_config->GetInteger("System Region", "region_value", 1); | 77 | Settings::values.is_new3ds = sdl2_config->GetBoolean("System", "is_new3ds", false); |
| 78 | Settings::values.region_value = sdl2_config->GetInteger("System", "region_value", 1); | ||
| 78 | 79 | ||
| 79 | // Miscellaneous | 80 | // Miscellaneous |
| 80 | Settings::values.log_filter = sdl2_config->Get("Miscellaneous", "log_filter", "*:Info"); | 81 | Settings::values.log_filter = sdl2_config->Get("Miscellaneous", "log_filter", "*:Info"); |
diff --git a/src/citra_qt/config.cpp b/src/citra_qt/config.cpp index 8e247ff5c..66271aa7b 100644 --- a/src/citra_qt/config.cpp +++ b/src/citra_qt/config.cpp | |||
| @@ -55,7 +55,8 @@ void Config::ReadValues() { | |||
| 55 | Settings::values.use_virtual_sd = qt_config->value("use_virtual_sd", true).toBool(); | 55 | Settings::values.use_virtual_sd = qt_config->value("use_virtual_sd", true).toBool(); |
| 56 | qt_config->endGroup(); | 56 | qt_config->endGroup(); |
| 57 | 57 | ||
| 58 | qt_config->beginGroup("System Region"); | 58 | qt_config->beginGroup("System"); |
| 59 | Settings::values.is_new3ds = qt_config->value("is_new3ds", false).toBool(); | ||
| 59 | Settings::values.region_value = qt_config->value("region_value", 1).toInt(); | 60 | Settings::values.region_value = qt_config->value("region_value", 1).toInt(); |
| 60 | qt_config->endGroup(); | 61 | qt_config->endGroup(); |
| 61 | 62 | ||
| @@ -95,7 +96,8 @@ void Config::SaveValues() { | |||
| 95 | qt_config->setValue("use_virtual_sd", Settings::values.use_virtual_sd); | 96 | qt_config->setValue("use_virtual_sd", Settings::values.use_virtual_sd); |
| 96 | qt_config->endGroup(); | 97 | qt_config->endGroup(); |
| 97 | 98 | ||
| 98 | qt_config->beginGroup("System Region"); | 99 | qt_config->beginGroup("System"); |
| 100 | qt_config->setValue("is_new3ds", Settings::values.is_new3ds); | ||
| 99 | qt_config->setValue("region_value", Settings::values.region_value); | 101 | qt_config->setValue("region_value", Settings::values.region_value); |
| 100 | qt_config->endGroup(); | 102 | qt_config->endGroup(); |
| 101 | 103 | ||
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 6d72e8188..e6fcbc714 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include "core/hle/service/apt/apt_s.h" | 13 | #include "core/hle/service/apt/apt_s.h" |
| 14 | #include "core/hle/service/apt/apt_u.h" | 14 | #include "core/hle/service/apt/apt_u.h" |
| 15 | #include "core/hle/service/fs/archive.h" | 15 | #include "core/hle/service/fs/archive.h" |
| 16 | #include "core/hle/service/ptm/ptm.h" | ||
| 16 | 17 | ||
| 17 | #include "core/hle/kernel/event.h" | 18 | #include "core/hle/kernel/event.h" |
| 18 | #include "core/hle/kernel/mutex.h" | 19 | #include "core/hle/kernel/mutex.h" |
| @@ -41,6 +42,9 @@ static std::shared_ptr<std::vector<u8>> shared_font; | |||
| 41 | 42 | ||
| 42 | static u32 cpu_percent; ///< CPU time available to the running application | 43 | static u32 cpu_percent; ///< CPU time available to the running application |
| 43 | 44 | ||
| 45 | // APT::CheckNew3DSApp will check this unknown_ns_state_field to determine processing mode | ||
| 46 | static u8 unknown_ns_state_field; | ||
| 47 | |||
| 44 | /// Parameter data to be returned in the next call to Glance/ReceiveParameter | 48 | /// Parameter data to be returned in the next call to Glance/ReceiveParameter |
| 45 | static MessageParameter next_parameter; | 49 | static MessageParameter next_parameter; |
| 46 | 50 | ||
| @@ -264,6 +268,10 @@ void PrepareToStartApplication(Service::Interface* self) { | |||
| 264 | u32 title_info4 = cmd_buff[4]; | 268 | u32 title_info4 = cmd_buff[4]; |
| 265 | u32 flags = cmd_buff[5]; | 269 | u32 flags = cmd_buff[5]; |
| 266 | 270 | ||
| 271 | if (flags & 0x00000100) { | ||
| 272 | unknown_ns_state_field = 1; | ||
| 273 | } | ||
| 274 | |||
| 267 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error | 275 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error |
| 268 | 276 | ||
| 269 | LOG_WARNING(Service_APT, "(STUBBED) called title_info1=0x%08X, title_info2=0x%08X, title_info3=0x%08X," | 277 | LOG_WARNING(Service_APT, "(STUBBED) called title_info1=0x%08X, title_info2=0x%08X, title_info3=0x%08X," |
| @@ -379,6 +387,25 @@ void StartLibraryApplet(Service::Interface* self) { | |||
| 379 | cmd_buff[1] = applet->Start(parameter).raw; | 387 | cmd_buff[1] = applet->Start(parameter).raw; |
| 380 | } | 388 | } |
| 381 | 389 | ||
| 390 | void SetNSStateField(Service::Interface* self) { | ||
| 391 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 392 | |||
| 393 | unknown_ns_state_field = cmd_buff[1]; | ||
| 394 | |||
| 395 | cmd_buff[0] = IPC::MakeHeader(0x55, 1, 0); | ||
| 396 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 397 | LOG_WARNING(Service_APT, "(STUBBED) unknown_ns_state_field=%u", unknown_ns_state_field); | ||
| 398 | } | ||
| 399 | |||
| 400 | void GetNSStateField(Service::Interface* self) { | ||
| 401 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 402 | |||
| 403 | cmd_buff[0] = IPC::MakeHeader(0x56, 2, 0); | ||
| 404 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 405 | cmd_buff[8] = unknown_ns_state_field; | ||
| 406 | LOG_WARNING(Service_APT, "(STUBBED) unknown_ns_state_field=%u", unknown_ns_state_field); | ||
| 407 | } | ||
| 408 | |||
| 382 | void GetAppletInfo(Service::Interface* self) { | 409 | void GetAppletInfo(Service::Interface* self) { |
| 383 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 410 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 384 | auto app_id = static_cast<AppletId>(cmd_buff[1]); | 411 | auto app_id = static_cast<AppletId>(cmd_buff[1]); |
| @@ -414,6 +441,29 @@ void GetStartupArgument(Service::Interface* self) { | |||
| 414 | cmd_buff[2] = (parameter_size > 0) ? 1 : 0; | 441 | cmd_buff[2] = (parameter_size > 0) ? 1 : 0; |
| 415 | } | 442 | } |
| 416 | 443 | ||
| 444 | void CheckNew3DSApp(Service::Interface* self) { | ||
| 445 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 446 | |||
| 447 | if (unknown_ns_state_field) { | ||
| 448 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 449 | cmd_buff[2] = 0; | ||
| 450 | } else { | ||
| 451 | PTM::CheckNew3DS(self); | ||
| 452 | } | ||
| 453 | |||
| 454 | cmd_buff[0] = IPC::MakeHeader(0x101, 2, 0); | ||
| 455 | LOG_WARNING(Service_APT, "(STUBBED) called"); | ||
| 456 | } | ||
| 457 | |||
| 458 | void CheckNew3DS(Service::Interface* self) { | ||
| 459 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 460 | |||
| 461 | PTM::CheckNew3DS(self); | ||
| 462 | |||
| 463 | cmd_buff[0] = IPC::MakeHeader(0x102, 2, 0); | ||
| 464 | LOG_WARNING(Service_APT, "(STUBBED) called"); | ||
| 465 | } | ||
| 466 | |||
| 417 | void Init() { | 467 | void Init() { |
| 418 | AddService(new APT_A_Interface); | 468 | AddService(new APT_A_Interface); |
| 419 | AddService(new APT_S_Interface); | 469 | AddService(new APT_S_Interface); |
| @@ -449,6 +499,7 @@ void Init() { | |||
| 449 | lock = Kernel::Mutex::Create(false, "APT_U:Lock"); | 499 | lock = Kernel::Mutex::Create(false, "APT_U:Lock"); |
| 450 | 500 | ||
| 451 | cpu_percent = 0; | 501 | cpu_percent = 0; |
| 502 | unknown_ns_state_field = 0; | ||
| 452 | 503 | ||
| 453 | // TODO(bunnei): Check if these are created in Initialize or on APT process startup. | 504 | // TODO(bunnei): Check if these are created in Initialize or on APT process startup. |
| 454 | notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification"); | 505 | notification_event = Kernel::Event::Create(Kernel::ResetType::OneShot, "APT_U:Notification"); |
diff --git a/src/core/hle/service/apt/apt.h b/src/core/hle/service/apt/apt.h index 668b4a66f..fd3c2bd37 100644 --- a/src/core/hle/service/apt/apt.h +++ b/src/core/hle/service/apt/apt.h | |||
| @@ -361,6 +361,50 @@ void StartLibraryApplet(Service::Interface* self); | |||
| 361 | */ | 361 | */ |
| 362 | void GetStartupArgument(Service::Interface* self); | 362 | void GetStartupArgument(Service::Interface* self); |
| 363 | 363 | ||
| 364 | /** | ||
| 365 | * APT::SetNSStateField service function | ||
| 366 | * Inputs: | ||
| 367 | * 1 : u8 NS state field | ||
| 368 | * Outputs: | ||
| 369 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 370 | * Note: | ||
| 371 | * This writes the input u8 to a NS state field. | ||
| 372 | */ | ||
| 373 | void SetNSStateField(Service::Interface* self); | ||
| 374 | |||
| 375 | /** | ||
| 376 | * APT::GetNSStateField service function | ||
| 377 | * Outputs: | ||
| 378 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 379 | * 8 : u8 NS state field | ||
| 380 | * Note: | ||
| 381 | * This returns a u8 NS state field(which can be set by cmd 0x00550040), at cmdreply+8. | ||
| 382 | */ | ||
| 383 | void GetNSStateField(Service::Interface* self); | ||
| 384 | |||
| 385 | /** | ||
| 386 | * APT::CheckNew3DSApp service function | ||
| 387 | * Outputs: | ||
| 388 | * 1: Result code, 0 on success, otherwise error code | ||
| 389 | * 2: u8 output: 0 = Old3DS, 1 = New3DS. | ||
| 390 | * Note: | ||
| 391 | * This uses PTMSYSM:CheckNew3DS. | ||
| 392 | * When a certain NS state field is non-zero, the output value is zero, | ||
| 393 | * Otherwise the output is from PTMSYSM:CheckNew3DS. | ||
| 394 | * Normally this NS state field is zero, however this state field is set to 1 | ||
| 395 | * when APT:PrepareToStartApplication is used with flags bit8 is set. | ||
| 396 | */ | ||
| 397 | void CheckNew3DSApp(Service::Interface* self); | ||
| 398 | |||
| 399 | /** | ||
| 400 | * Wrapper for PTMSYSM:CheckNew3DS | ||
| 401 | * APT::CheckNew3DS service function | ||
| 402 | * Outputs: | ||
| 403 | * 1: Result code, 0 on success, otherwise error code | ||
| 404 | * 2: u8 output: 0 = Old3DS, 1 = New3DS. | ||
| 405 | */ | ||
| 406 | void CheckNew3DS(Service::Interface* self); | ||
| 407 | |||
| 364 | /// Initialize the APT service | 408 | /// Initialize the APT service |
| 365 | void Init(); | 409 | void Init(); |
| 366 | 410 | ||
diff --git a/src/core/hle/service/apt/apt_a.cpp b/src/core/hle/service/apt/apt_a.cpp index 9ff47701a..223c0a8bd 100644 --- a/src/core/hle/service/apt/apt_a.cpp +++ b/src/core/hle/service/apt/apt_a.cpp | |||
| @@ -21,6 +21,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 21 | {0x000D0080, ReceiveParameter, "ReceiveParameter"}, | 21 | {0x000D0080, ReceiveParameter, "ReceiveParameter"}, |
| 22 | {0x000E0080, GlanceParameter, "GlanceParameter"}, | 22 | {0x000E0080, GlanceParameter, "GlanceParameter"}, |
| 23 | {0x000F0100, CancelParameter, "CancelParameter"}, | 23 | {0x000F0100, CancelParameter, "CancelParameter"}, |
| 24 | {0x00150140, PrepareToStartApplication, "PrepareToStartApplication"}, | ||
| 24 | {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, | 25 | {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, |
| 25 | {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, | 26 | {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, |
| 26 | {0x001E0084, StartLibraryApplet, "StartLibraryApplet"}, | 27 | {0x001E0084, StartLibraryApplet, "StartLibraryApplet"}, |
| @@ -32,7 +33,10 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 32 | {0x004F0080, SetAppCpuTimeLimit, "SetAppCpuTimeLimit"}, | 33 | {0x004F0080, SetAppCpuTimeLimit, "SetAppCpuTimeLimit"}, |
| 33 | {0x00500040, GetAppCpuTimeLimit, "GetAppCpuTimeLimit"}, | 34 | {0x00500040, GetAppCpuTimeLimit, "GetAppCpuTimeLimit"}, |
| 34 | {0x00510080, GetStartupArgument, "GetStartupArgument"}, | 35 | {0x00510080, GetStartupArgument, "GetStartupArgument"}, |
| 35 | {0x00550040, nullptr, "WriteInputToNsState?"}, | 36 | {0x00550040, SetNSStateField, "SetNSStateField?"}, |
| 37 | {0x00560000, GetNSStateField, "GetNSStateField?"}, | ||
| 38 | {0x01010000, CheckNew3DSApp, "CheckNew3DSApp"}, | ||
| 39 | {0x01020000, CheckNew3DS, "CheckNew3DS"} | ||
| 36 | }; | 40 | }; |
| 37 | 41 | ||
| 38 | APT_A_Interface::APT_A_Interface() { | 42 | APT_A_Interface::APT_A_Interface() { |
diff --git a/src/core/hle/service/apt/apt_s.cpp b/src/core/hle/service/apt/apt_s.cpp index ca54e593c..f5c52fa3d 100644 --- a/src/core/hle/service/apt/apt_s.cpp +++ b/src/core/hle/service/apt/apt_s.cpp | |||
| @@ -29,7 +29,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 29 | {0x00120040, nullptr, "SetHomeMenuAppletIdForDebug"}, | 29 | {0x00120040, nullptr, "SetHomeMenuAppletIdForDebug"}, |
| 30 | {0x00130000, nullptr, "GetPreparationState"}, | 30 | {0x00130000, nullptr, "GetPreparationState"}, |
| 31 | {0x00140040, nullptr, "SetPreparationState"}, | 31 | {0x00140040, nullptr, "SetPreparationState"}, |
| 32 | {0x00150140, nullptr, "PrepareToStartApplication"}, | 32 | {0x00150140, PrepareToStartApplication, "PrepareToStartApplication"}, |
| 33 | {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, | 33 | {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, |
| 34 | {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, | 34 | {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, |
| 35 | {0x00180040, PrepareToStartLibraryApplet,"PrepareToStartLibraryApplet"}, | 35 | {0x00180040, PrepareToStartLibraryApplet,"PrepareToStartLibraryApplet"}, |
| @@ -92,9 +92,11 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 92 | {0x00510080, GetStartupArgument, "GetStartupArgument"}, | 92 | {0x00510080, GetStartupArgument, "GetStartupArgument"}, |
| 93 | {0x00520104, nullptr, "Wrap1"}, | 93 | {0x00520104, nullptr, "Wrap1"}, |
| 94 | {0x00530104, nullptr, "Unwrap1"}, | 94 | {0x00530104, nullptr, "Unwrap1"}, |
| 95 | {0x00550040, SetNSStateField, "SetNSStateField?" }, | ||
| 96 | {0x00560000, GetNSStateField, "GetNSStateField?" }, | ||
| 95 | {0x00580002, nullptr, "GetProgramID"}, | 97 | {0x00580002, nullptr, "GetProgramID"}, |
| 96 | {0x01010000, nullptr, "CheckNew3DSApp"}, | 98 | {0x01010000, CheckNew3DSApp, "CheckNew3DSApp"}, |
| 97 | {0x01020000, nullptr, "CheckNew3DS"} | 99 | {0x01020000, CheckNew3DS, "CheckNew3DS"} |
| 98 | }; | 100 | }; |
| 99 | 101 | ||
| 100 | APT_S_Interface::APT_S_Interface() { | 102 | APT_S_Interface::APT_S_Interface() { |
diff --git a/src/core/hle/service/apt/apt_u.cpp b/src/core/hle/service/apt/apt_u.cpp index 0e85c6d08..0e60bd34f 100644 --- a/src/core/hle/service/apt/apt_u.cpp +++ b/src/core/hle/service/apt/apt_u.cpp | |||
| @@ -29,7 +29,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 29 | {0x00120040, nullptr, "SetHomeMenuAppletIdForDebug"}, | 29 | {0x00120040, nullptr, "SetHomeMenuAppletIdForDebug"}, |
| 30 | {0x00130000, nullptr, "GetPreparationState"}, | 30 | {0x00130000, nullptr, "GetPreparationState"}, |
| 31 | {0x00140040, nullptr, "SetPreparationState"}, | 31 | {0x00140040, nullptr, "SetPreparationState"}, |
| 32 | {0x00150140, nullptr, "PrepareToStartApplication"}, | 32 | {0x00150140, PrepareToStartApplication, "PrepareToStartApplication"}, |
| 33 | {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, | 33 | {0x00160040, PreloadLibraryApplet, "PreloadLibraryApplet"}, |
| 34 | {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, | 34 | {0x00170040, nullptr, "FinishPreloadingLibraryApplet"}, |
| 35 | {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, | 35 | {0x00180040, PrepareToStartLibraryApplet, "PrepareToStartLibraryApplet"}, |
| @@ -92,9 +92,11 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 92 | {0x00510080, GetStartupArgument, "GetStartupArgument"}, | 92 | {0x00510080, GetStartupArgument, "GetStartupArgument"}, |
| 93 | {0x00520104, nullptr, "Wrap1"}, | 93 | {0x00520104, nullptr, "Wrap1"}, |
| 94 | {0x00530104, nullptr, "Unwrap1"}, | 94 | {0x00530104, nullptr, "Unwrap1"}, |
| 95 | {0x00550040, SetNSStateField, "SetNSStateField?"}, | ||
| 96 | {0x00560000, GetNSStateField, "GetNSStateField?"}, | ||
| 95 | {0x00580002, nullptr, "GetProgramID"}, | 97 | {0x00580002, nullptr, "GetProgramID"}, |
| 96 | {0x01010000, nullptr, "CheckNew3DSApp"}, | 98 | {0x01010000, CheckNew3DSApp, "CheckNew3DSApp"}, |
| 97 | {0x01020000, nullptr, "CheckNew3DS"} | 99 | {0x01020000, CheckNew3DS, "CheckNew3DS"} |
| 98 | }; | 100 | }; |
| 99 | 101 | ||
| 100 | APT_U_Interface::APT_U_Interface() { | 102 | APT_U_Interface::APT_U_Interface() { |
diff --git a/src/core/hle/service/ptm/ptm.cpp b/src/core/hle/service/ptm/ptm.cpp index 94f494690..3a0331ee1 100644 --- a/src/core/hle/service/ptm/ptm.cpp +++ b/src/core/hle/service/ptm/ptm.cpp | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/logging/log.h" | 5 | #include "common/logging/log.h" |
| 6 | 6 | #include "core/settings.h" | |
| 7 | #include "core/file_sys/file_backend.h" | 7 | #include "core/file_sys/file_backend.h" |
| 8 | #include "core/hle/service/fs/archive.h" | 8 | #include "core/hle/service/fs/archive.h" |
| 9 | #include "core/hle/service/ptm/ptm.h" | 9 | #include "core/hle/service/ptm/ptm.h" |
| @@ -89,6 +89,20 @@ void IsLegacyPowerOff(Service::Interface* self) { | |||
| 89 | LOG_WARNING(Service_PTM, "(STUBBED) called"); | 89 | LOG_WARNING(Service_PTM, "(STUBBED) called"); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | void CheckNew3DS(Service::Interface* self) { | ||
| 93 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 94 | const bool is_new_3ds = Settings::values.is_new3ds; | ||
| 95 | |||
| 96 | if (is_new_3ds) { | ||
| 97 | LOG_CRITICAL(Service_PTM, "The option 'is_new3ds' is enabled as part of the 'System' settings. Citra does not fully support New3DS emulation yet!"); | ||
| 98 | } | ||
| 99 | |||
| 100 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 101 | cmd_buff[2] = is_new_3ds ? 1 : 0; | ||
| 102 | |||
| 103 | LOG_WARNING(Service_PTM, "(STUBBED) called isNew3DS = 0x%08x", static_cast<u32>(is_new_3ds)); | ||
| 104 | } | ||
| 105 | |||
| 92 | void Init() { | 106 | void Init() { |
| 93 | AddService(new PTM_Play_Interface); | 107 | AddService(new PTM_Play_Interface); |
| 94 | AddService(new PTM_Sysm_Interface); | 108 | AddService(new PTM_Sysm_Interface); |
diff --git a/src/core/hle/service/ptm/ptm.h b/src/core/hle/service/ptm/ptm.h index 4cf7383d1..7ef8877c7 100644 --- a/src/core/hle/service/ptm/ptm.h +++ b/src/core/hle/service/ptm/ptm.h | |||
| @@ -88,6 +88,14 @@ void GetTotalStepCount(Interface* self); | |||
| 88 | */ | 88 | */ |
| 89 | void IsLegacyPowerOff(Interface* self); | 89 | void IsLegacyPowerOff(Interface* self); |
| 90 | 90 | ||
| 91 | /** | ||
| 92 | * PTM::CheckNew3DS service function | ||
| 93 | * Outputs: | ||
| 94 | * 1: Result code, 0 on success, otherwise error code | ||
| 95 | * 2: u8 output: 0 = Old3DS, 1 = New3DS. | ||
| 96 | */ | ||
| 97 | void CheckNew3DS(Interface* self); | ||
| 98 | |||
| 91 | /// Initialize the PTM service | 99 | /// Initialize the PTM service |
| 92 | void Init(); | 100 | void Init(); |
| 93 | 101 | ||
diff --git a/src/core/hle/service/ptm/ptm_sysm.cpp b/src/core/hle/service/ptm/ptm_sysm.cpp index fe76dd108..cc4ef1101 100644 --- a/src/core/hle/service/ptm/ptm_sysm.cpp +++ b/src/core/hle/service/ptm/ptm_sysm.cpp | |||
| @@ -18,7 +18,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 18 | {0x040700C0, nullptr, "ShutdownAsync"}, | 18 | {0x040700C0, nullptr, "ShutdownAsync"}, |
| 19 | {0x04080000, nullptr, "Awake"}, | 19 | {0x04080000, nullptr, "Awake"}, |
| 20 | {0x04090080, nullptr, "RebootAsync"}, | 20 | {0x04090080, nullptr, "RebootAsync"}, |
| 21 | {0x040A0000, nullptr, "CheckNew3DS"}, | 21 | {0x040A0000, CheckNew3DS, "CheckNew3DS"}, |
| 22 | {0x08010640, nullptr, "SetInfoLEDPattern"}, | 22 | {0x08010640, nullptr, "SetInfoLEDPattern"}, |
| 23 | {0x08020040, nullptr, "SetInfoLEDPatternHeader"}, | 23 | {0x08020040, nullptr, "SetInfoLEDPatternHeader"}, |
| 24 | {0x08030000, nullptr, "GetInfoLEDStatus"}, | 24 | {0x08030000, nullptr, "GetInfoLEDStatus"}, |
| @@ -35,7 +35,7 @@ const Interface::FunctionInfo FunctionTable[] = { | |||
| 35 | {0x080E0140, nullptr, "NotifyPlayEvent"}, | 35 | {0x080E0140, nullptr, "NotifyPlayEvent"}, |
| 36 | {0x080F0000, IsLegacyPowerOff, "IsLegacyPowerOff"}, | 36 | {0x080F0000, IsLegacyPowerOff, "IsLegacyPowerOff"}, |
| 37 | {0x08100000, nullptr, "ClearLegacyPowerOff"}, | 37 | {0x08100000, nullptr, "ClearLegacyPowerOff"}, |
| 38 | {0x08110000, nullptr, "GetShellStatus"}, | 38 | {0x08110000, GetShellState, "GetShellState"}, |
| 39 | {0x08120000, nullptr, "IsShutdownByBatteryEmpty"}, | 39 | {0x08120000, nullptr, "IsShutdownByBatteryEmpty"}, |
| 40 | {0x08130000, nullptr, "FormatSavedata"}, | 40 | {0x08130000, nullptr, "FormatSavedata"}, |
| 41 | {0x08140000, nullptr, "GetLegacyJumpProhibitedFlag"}, | 41 | {0x08140000, nullptr, "GetLegacyJumpProhibitedFlag"}, |
diff --git a/src/core/settings.h b/src/core/settings.h index 97ddcdff9..4034b795a 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -40,6 +40,9 @@ static const std::array<Values, NUM_INPUTS> All = {{ | |||
| 40 | 40 | ||
| 41 | 41 | ||
| 42 | struct Values { | 42 | struct Values { |
| 43 | // CheckNew3DS | ||
| 44 | bool is_new3ds; | ||
| 45 | |||
| 43 | // Controls | 46 | // Controls |
| 44 | std::array<int, NativeInput::NUM_INPUTS> input_mappings; | 47 | std::array<int, NativeInput::NUM_INPUTS> input_mappings; |
| 45 | 48 | ||