summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/citra/config.cpp5
-rw-r--r--src/citra_qt/config.cpp6
-rw-r--r--src/core/hle/service/apt/apt.cpp51
-rw-r--r--src/core/hle/service/apt/apt.h44
-rw-r--r--src/core/hle/service/apt/apt_a.cpp6
-rw-r--r--src/core/hle/service/apt/apt_s.cpp8
-rw-r--r--src/core/hle/service/apt/apt_u.cpp8
-rw-r--r--src/core/hle/service/ptm/ptm.cpp16
-rw-r--r--src/core/hle/service/ptm/ptm.h8
-rw-r--r--src/core/hle/service/ptm/ptm_sysm.cpp4
-rw-r--r--src/core/settings.h3
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
42static u32 cpu_percent; ///< CPU time available to the running application 43static 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
46static 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
45static MessageParameter next_parameter; 49static 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
390void 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
400void 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
382void GetAppletInfo(Service::Interface* self) { 409void 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
444void 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
458void 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
417void Init() { 467void 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 */
362void GetStartupArgument(Service::Interface* self); 362void 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 */
373void 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 */
383void 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 */
397void 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 */
406void CheckNew3DS(Service::Interface* self);
407
364/// Initialize the APT service 408/// Initialize the APT service
365void Init(); 409void 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
38APT_A_Interface::APT_A_Interface() { 42APT_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
100APT_S_Interface::APT_S_Interface() { 102APT_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
100APT_U_Interface::APT_U_Interface() { 102APT_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
92void 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
92void Init() { 106void 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 */
89void IsLegacyPowerOff(Interface* self); 89void 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 */
97void CheckNew3DS(Interface* self);
98
91/// Initialize the PTM service 99/// Initialize the PTM service
92void Init(); 100void 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
42struct Values { 42struct 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