From a91a754b246775e50c8a3d642908d35268a2c696 Mon Sep 17 00:00:00 2001 From: Ben Vanik Date: Mon, 1 Jun 2015 20:56:57 -0700 Subject: [PATCH] Converting some exports to the new way. --- libxenia.vcxproj | 1 - libxenia.vcxproj.filters | 3 - src/xenia/kernel/util/shim_utils.h | 30 +- src/xenia/kernel/xam_info.cc | 8 - src/xenia/kernel/xam_module.cc | 2 - src/xenia/kernel/xam_private.h | 4 - src/xenia/kernel/xam_video.cc | 23 +- src/xenia/kernel/xam_voice.cc | 48 +- src/xenia/kernel/xboxkrnl_debug.cc | 260 +--- src/xenia/kernel/xboxkrnl_error.cc | 1663 +++++++++++--------------- src/xenia/kernel/xboxkrnl_error.h | 21 - src/xenia/kernel/xboxkrnl_hal.cc | 13 +- src/xenia/kernel/xboxkrnl_module.cc | 4 - src/xenia/kernel/xboxkrnl_private.h | 8 - src/xenia/kernel/xboxkrnl_strings.cc | 23 + src/xenia/kernel/xboxkrnl_usbcam.cc | 27 +- src/xenia/kernel/xboxkrnl_video.cc | 44 +- 17 files changed, 857 insertions(+), 1325 deletions(-) delete mode 100644 src/xenia/kernel/xboxkrnl_error.h diff --git a/libxenia.vcxproj b/libxenia.vcxproj index 2a6e568bb..f6514e97e 100644 --- a/libxenia.vcxproj +++ b/libxenia.vcxproj @@ -388,7 +388,6 @@ - diff --git a/libxenia.vcxproj.filters b/libxenia.vcxproj.filters index 42cf5c742..f5c621472 100644 --- a/libxenia.vcxproj.filters +++ b/libxenia.vcxproj.filters @@ -1341,9 +1341,6 @@ third_party\xbyak\xbyak - - src\xenia\kernel - src\xenia\apu diff --git a/src/xenia/kernel/util/shim_utils.h b/src/xenia/kernel/util/shim_utils.h index 664709a30..95908c996 100644 --- a/src/xenia/kernel/util/shim_utils.h +++ b/src/xenia/kernel/util/shim_utils.h @@ -107,6 +107,7 @@ template class ParamBase : public Param { public: ParamBase() : Param(), value_(0) {} + ParamBase(T value) : Param(), value_(value) {} ParamBase(Init& init) : Param(init) { LoadValue(init); } ParamBase& operator=(const T& other) { value_ = other; @@ -206,6 +207,31 @@ class PrimitivePointerParam : public ParamBase { xe::be* host_ptr_; }; +template +class StringPointerParam : public ParamBase { + public: + StringPointerParam(Init& init) : ParamBase(init) { + host_ptr_ = value_ ? reinterpret_cast( + init.ppc_context->virtual_membase + value_) + : nullptr; + } + StringPointerParam(CHAR* host_ptr) : ParamBase(), host_ptr_(host_ptr) {} + StringPointerParam& operator=(const CHAR*& other) { + host_ptr_ = other; + return *this; + } + uint32_t guest_address() const { return value_; } + uintptr_t host_address() const { + return reinterpret_cast(host_ptr_); + } + STR value() const { return STR(host_ptr_); } + operator CHAR*() const { return host_ptr_; } + operator bool() const { return host_ptr_ != nullptr; } + + protected: + CHAR* host_ptr_; +}; + template class TypedPointerParam : public ParamBase { public: @@ -265,9 +291,11 @@ using lpdword_t = const shim::PrimitivePointerParam&; using lpqword_t = const shim::PrimitivePointerParam&; using lpfloat_t = const shim::PrimitivePointerParam&; using lpdouble_t = const shim::PrimitivePointerParam&; +using lpstring_t = const shim::StringPointerParam&; +using lpwstring_t = const shim::StringPointerParam&; using function_t = const shim::ParamBase&; using unknown_t = const shim::ParamBase&; -using unknown_pointer_t = const shim::PointerParam&; +using lpunknown_t = const shim::PointerParam&; template using pointer_t = const shim::TypedPointerParam&; diff --git a/src/xenia/kernel/xam_info.cc b/src/xenia/kernel/xam_info.cc index ccee2b23d..008956582 100644 --- a/src/xenia/kernel/xam_info.cc +++ b/src/xenia/kernel/xam_info.cc @@ -65,13 +65,6 @@ SHIM_CALL XGetLanguage_shim(PPCContext* ppc_context, SHIM_SET_RETURN_32(desired_language); } -SHIM_CALL XamVoiceIsActiveProcess_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - XELOGD("XamVoiceIsActiveProcess()"); - // Returning 0 here will short-circuit a bunch of voice stuff. - SHIM_SET_RETURN_32(0); -} - SHIM_CALL XamGetExecutionId_shim(PPCContext* ppc_context, KernelState* kernel_state) { uint32_t info_ptr = SHIM_GET_ARG_32(0); @@ -217,7 +210,6 @@ void xe::kernel::xam::RegisterInfoExports( SHIM_SET_MAPPING("xam.xex", XGetGameRegion, state); SHIM_SET_MAPPING("xam.xex", XGetLanguage, state); - SHIM_SET_MAPPING("xam.xex", XamVoiceIsActiveProcess, state); SHIM_SET_MAPPING("xam.xex", XamGetExecutionId, state); SHIM_SET_MAPPING("xam.xex", XamLoaderSetLaunchData, state); diff --git a/src/xenia/kernel/xam_module.cc b/src/xenia/kernel/xam_module.cc index 4ec00c02a..be48c4a44 100644 --- a/src/xenia/kernel/xam_module.cc +++ b/src/xenia/kernel/xam_module.cc @@ -29,8 +29,6 @@ XamModule::XamModule(Emulator* emulator, KernelState* kernel_state) xam::RegisterNotifyExports(export_resolver_, kernel_state_); xam::RegisterUIExports(export_resolver_, kernel_state_); xam::RegisterUserExports(export_resolver_, kernel_state_); - xam::RegisterVideoExports(export_resolver_, kernel_state_); - xam::RegisterVoiceExports(export_resolver_, kernel_state_); } std::vector xam_exports; diff --git a/src/xenia/kernel/xam_private.h b/src/xenia/kernel/xam_private.h index 1167f68e0..3b889f44b 100644 --- a/src/xenia/kernel/xam_private.h +++ b/src/xenia/kernel/xam_private.h @@ -38,10 +38,6 @@ void RegisterUIExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); void RegisterUserExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); -void RegisterVideoExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state); -void RegisterVoiceExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state); } // namespace xam } // namespace kernel diff --git a/src/xenia/kernel/xam_video.cc b/src/xenia/kernel/xam_video.cc index eda28bd75..e43818439 100644 --- a/src/xenia/kernel/xam_video.cc +++ b/src/xenia/kernel/xam_video.cc @@ -18,27 +18,14 @@ namespace kernel { // TODO(benvanik): actually check to see if these are the same. void VdQueryVideoMode(pointer_t video_mode); -SHIM_CALL XGetVideoMode_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t video_mode_ptr = SHIM_GET_ARG_32(0); - X_VIDEO_MODE* video_mode = (X_VIDEO_MODE*)SHIM_MEM_ADDR(video_mode_ptr); - XELOGD("XGetVideoMode(%.8X)", video_mode_ptr); - - VdQueryVideoMode(video_mode); +void XGetVideoMode(pointer_t video_mode) { + VdQueryVideoMode(std::move(video_mode)); } +DECLARE_XAM_EXPORT(XGetVideoMode, ExportTag::kVideo | ExportTag::kStub); -SHIM_CALL XGetVideoCapabilities_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - XELOGD("XGetVideoCapabilities()"); - SHIM_SET_RETURN_32(0); -} +dword_result_t XGetVideoCapabilities() { return 0; } +DECLARE_XAM_EXPORT(XGetVideoCapabilities, ExportTag::kVideo | ExportTag::kStub); } // namespace kernel } // namespace xe - -void xe::kernel::xam::RegisterVideoExports( - xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - SHIM_SET_MAPPING("xam.xex", XGetVideoCapabilities, state); - SHIM_SET_MAPPING("xam.xex", XGetVideoMode, state); -} diff --git a/src/xenia/kernel/xam_voice.cc b/src/xenia/kernel/xam_voice.cc index 3aa4d446c..2eabee165 100644 --- a/src/xenia/kernel/xam_voice.cc +++ b/src/xenia/kernel/xam_voice.cc @@ -17,44 +17,26 @@ namespace xe { namespace kernel { -SHIM_CALL XamVoiceCreate_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t unk1 = SHIM_GET_ARG_32(0); // 0 - uint32_t unk2 = SHIM_GET_ARG_32(1); // 0xF - uint32_t out_voice_ptr = SHIM_GET_ARG_32(2); - - XELOGD("XamVoiceCreate(%.8X, %.8X, %.8X)", unk1, unk2, out_voice_ptr); +dword_result_t XamVoiceIsActiveProcess() { + // Returning 0 here will short-circuit a bunch of voice stuff. + return 0; +} +DECLARE_XAM_EXPORT(XamVoiceIsActiveProcess, ExportTag::kStub); +dword_result_t XamVoiceCreate(unknown_t unk1, // 0 + unknown_t unk2, // 0xF + lpdword_t out_voice_ptr) { // Null out the ptr. - SHIM_SET_MEM_32(out_voice_ptr, 0); - - SHIM_SET_RETURN_32(X_ERROR_ACCESS_DENIED); + out_voice_ptr.Zero(); + return X_ERROR_ACCESS_DENIED; } +DECLARE_XAM_EXPORT(XamVoiceCreate, ExportTag::kStub); -SHIM_CALL XamVoiceClose_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t voice_ptr = SHIM_GET_ARG_32(0); +dword_result_t XamVoiceClose(lpunknown_t voice_ptr) { return 0; } +DECLARE_XAM_EXPORT(XamVoiceClose, ExportTag::kStub); - XELOGD("XamVoiceClose(%.8X)", voice_ptr); - - SHIM_SET_RETURN_32(0); -} - -SHIM_CALL XamVoiceHeadsetPresent_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t voice_ptr = SHIM_GET_ARG_32(0); - - XELOGD("XamVoiceHeadsetPresent(%.8X)", voice_ptr); - - SHIM_SET_RETURN_32(0); -} +dword_result_t XamVoiceHeadsetPresent(lpunknown_t voice_ptr) { return 0; } +DECLARE_XAM_EXPORT(XamVoiceHeadsetPresent, ExportTag::kStub); } // namespace kernel } // namespace xe - -void xe::kernel::xam::RegisterVoiceExports( - xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - SHIM_SET_MAPPING("xam.xex", XamVoiceCreate, state); - SHIM_SET_MAPPING("xam.xex", XamVoiceClose, state); - SHIM_SET_MAPPING("xam.xex", XamVoiceHeadsetPresent, state); -} diff --git a/src/xenia/kernel/xboxkrnl_debug.cc b/src/xenia/kernel/xboxkrnl_debug.cc index 9c9cde089..9353b8fe8 100644 --- a/src/xenia/kernel/xboxkrnl_debug.cc +++ b/src/xenia/kernel/xboxkrnl_debug.cc @@ -17,210 +17,15 @@ namespace xe { namespace kernel { -#define SHIM_GPR_32(n) (uint32_t)(ppc_context->r[n]) - -// TODO: clean me up! -SHIM_CALL DbgPrint_shim(PPCContext* ppc_context, KernelState* kernel_state) { - uint32_t format_ptr = SHIM_GET_ARG_32(0); - if (format_ptr == 0) { - SHIM_SET_RETURN_32(-1); - return; - } - - const char* format = (const char*)SHIM_MEM_ADDR(format_ptr); - - int arg_index = 0; - - char buffer[512]; // TODO: ensure it never writes past the end of the - // buffer... - char* b = buffer; - for (; *format != '\0'; ++format) { - const char* start = format; - - if (*format != '%') { - *b++ = *format; - continue; - } - - ++format; - if (*format == '\0') { - break; - } - - if (*format == '%') { - *b++ = *format; - continue; - } - - const char* end; - end = format; - - // skip flags - while (*end == '-' || *end == '+' || *end == ' ' || *end == '#' || - *end == '0') { - ++end; - } - - if (*end == '\0') { - break; - } - - int arg_extras = 0; - - // skip width - if (*end == '*') { - ++end; - arg_extras++; - } else { - while (*end >= '0' && *end <= '9') { - ++end; - } - } - - if (*end == '\0') { - break; - } - - // skip precision - if (*end == '.') { - ++end; - - if (*end == '*') { - ++end; - ++arg_extras; - } else { - while (*end >= '0' && *end <= '9') { - ++end; - } - } - } - - if (*end == '\0') { - break; - } - - // get length - int arg_size = 4; - - if (*end == 'h') { - ++end; - arg_size = 4; - if (*end == 'h') { - ++end; - } - } else if (*end == 'l') { - ++end; - arg_size = 4; - if (*end == 'l') { - ++end; - arg_size = 8; - } - } else if (*end == 'j') { - arg_size = 8; - ++end; - } else if (*end == 'z') { - arg_size = 4; - ++end; - } else if (*end == 't') { - arg_size = 8; - ++end; - } else if (*end == 'L') { - arg_size = 8; - ++end; - } - - if (*end == '\0') { - break; - } - - if (*end == 'd' || *end == 'i' || *end == 'u' || *end == 'o' || - *end == 'x' || *end == 'X' || *end == 'f' || *end == 'F' || - *end == 'e' || *end == 'E' || *end == 'g' || *end == 'G' || - *end == 'a' || *end == 'A' || *end == 'c') { - char local[512]; - local[0] = '\0'; - strncat(local, start, end + 1 - start); - - assert_true(arg_size == 8 || arg_size == 4); - if (arg_size == 8) { - if (arg_extras == 0) { - uint64_t value = - arg_index < 7 - ? SHIM_GET_ARG_64(1 + arg_index) - : SHIM_MEM_32(SHIM_GPR_32(1) + 16 + ((1 + arg_index) * 8)); - int result = sprintf(b, local, value); - b += result; - arg_index++; - } else { - assert_true(false); - } - } else if (arg_size == 4) { - if (arg_extras == 0) { - uint64_t value = - arg_index < 7 - ? SHIM_GET_ARG_64(1 + arg_index) - : SHIM_MEM_32(SHIM_GPR_32(1) + 16 + ((1 + arg_index) * 8)); - int result = sprintf(b, local, (uint32_t)value); - b += result; - arg_index++; - } else { - assert_true(false); - } - } - } else if (*end == 'n') { - assert_true(arg_size == 4); - if (arg_extras == 0) { - uint32_t value = arg_index < 7 - ? SHIM_GET_ARG_32(1 + arg_index) - : (uint32_t)SHIM_MEM_64(SHIM_GPR_32(1) + 16 + - ((1 + arg_index) * 8)); - SHIM_SET_MEM_32(value, (uint32_t)((b - buffer) / sizeof(char))); - arg_index++; - } else { - assert_true(false); - } - } else if (*end == 's' || *end == 'p') { - char local[512]; - local[0] = '\0'; - strncat(local, start, end + 1 - start); - - assert_true(arg_size == 4); - if (arg_extras == 0) { - uint32_t value = arg_index < 7 - ? SHIM_GET_ARG_32(1 + arg_index) - : (uint32_t)SHIM_MEM_64(SHIM_GPR_32(1) + 16 + - ((1 + arg_index) * 8)); - const void* pointer = (const void*)SHIM_MEM_ADDR(value); - int result = sprintf(b, local, pointer); - b += result; - arg_index++; - } else { - assert_true(false); - } - } else { - assert_true(false); - break; - } - - format = end; - } - *b++ = '\0'; - - XELOGD("(DbgPrint) %s", buffer); -} - -SHIM_CALL DbgBreakPoint_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - XELOGD("DbgBreakPoint()"); - DebugBreak(); -} +void DbgBreakPoint() { DebugBreak(); } +DECLARE_XBOXKRNL_EXPORT(DbgBreakPoint, ExportTag::kImportant); // https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx typedef struct { - xe::be type; - xe::be name_ptr; - xe::be thread_id; - xe::be flags; + xe::be type; + xe::be name_ptr; + xe::be thread_id; + xe::be flags; } X_THREADNAME_INFO; static_assert_size(X_THREADNAME_INFO, 0x10); @@ -234,24 +39,24 @@ typedef struct { xe::be exception_information[15]; } X_EXCEPTION_RECORD; static_assert_size(X_EXCEPTION_RECORD, 0x50); +void AppendParam(StringBuffer& string_buffer, + pointer_t record) { + string_buffer.AppendFormat("%.8X(%.8X)", record.guest_address(), + record->exception_code); +} -SHIM_CALL RtlRaiseException_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t record_ptr = SHIM_GET_ARG_32(0); - - auto record = reinterpret_cast(SHIM_MEM_ADDR(record_ptr)); - - XELOGD("RtlRaiseException(%.8X(%.8X))", record_ptr, record->exception_code); - +void RtlRaiseException(pointer_t record) { if (record->exception_code == 0x406D1388) { // SetThreadName. FFS. // https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx // TODO: check record->number_parameters to make sure it's a correct size - auto thread_info = reinterpret_cast(&record->exception_information[0]); + auto thread_info = + reinterpret_cast(&record->exception_information[0]); assert_true(thread_info->type == 0x1000); - const char* name = (const char*)SHIM_MEM_ADDR(thread_info->name_ptr); + auto name = + kernel_memory()->TranslateVirtual(thread_info->name_ptr); object_ref thread; if (thread_info->thread_id == -1) { @@ -259,7 +64,7 @@ SHIM_CALL RtlRaiseException_shim(PPCContext* ppc_context, thread = retain_object(XThread::GetCurrentThread()); } else { // Lookup thread by ID. - thread = kernel_state->GetThreadByID(thread_info->thread_id); + thread = kernel_state()->GetThreadByID(thread_info->thread_id); } if (thread) { @@ -282,39 +87,20 @@ SHIM_CALL RtlRaiseException_shim(PPCContext* ppc_context, // This is going to suck. DebugBreak(); } +DECLARE_XBOXKRNL_EXPORT(RtlRaiseException, ExportTag::kImportant); -void xeKeBugCheckEx(uint32_t code, uint32_t param1, uint32_t param2, - uint32_t param3, uint32_t param4) { +void KeBugCheckEx(dword_t code, dword_t param1, dword_t param2, dword_t param3, + dword_t param4) { XELOGD("*** STOP: 0x%.8X (0x%.8X, 0x%.8X, 0x%.8X, 0x%.8X)", code, param1, param2, param3, param4); fflush(stdout); DebugBreak(); assert_always(); } +DECLARE_XBOXKRNL_EXPORT(KeBugCheckEx, ExportTag::kImportant); -SHIM_CALL KeBugCheck_shim(PPCContext* ppc_context, KernelState* kernel_state) { - uint32_t code = SHIM_GET_ARG_32(0); - xeKeBugCheckEx(code, 0, 0, 0, 0); -} - -SHIM_CALL KeBugCheckEx_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t code = SHIM_GET_ARG_32(0); - uint32_t param1 = SHIM_GET_ARG_32(1); - uint32_t param2 = SHIM_GET_ARG_32(2); - uint32_t param3 = SHIM_GET_ARG_32(3); - uint32_t param4 = SHIM_GET_ARG_32(4); - xeKeBugCheckEx(code, param1, param2, param3, param4); -} +void KeBugCheck(dword_t code) { KeBugCheckEx(code, 0, 0, 0, 0); } +DECLARE_XBOXKRNL_EXPORT(KeBugCheck, ExportTag::kImportant); } // namespace kernel } // namespace xe - -void xe::kernel::xboxkrnl::RegisterDebugExports( - xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - SHIM_SET_MAPPING("xboxkrnl.exe", DbgPrint, state); - SHIM_SET_MAPPING("xboxkrnl.exe", DbgBreakPoint, state); - SHIM_SET_MAPPING("xboxkrnl.exe", RtlRaiseException, state); - SHIM_SET_MAPPING("xboxkrnl.exe", KeBugCheck, state); - SHIM_SET_MAPPING("xboxkrnl.exe", KeBugCheckEx, state); -} diff --git a/src/xenia/kernel/xboxkrnl_error.cc b/src/xenia/kernel/xboxkrnl_error.cc index 3edddb180..888a7257e 100644 --- a/src/xenia/kernel/xboxkrnl_error.cc +++ b/src/xenia/kernel/xboxkrnl_error.cc @@ -7,8 +7,6 @@ ****************************************************************************** */ -#include "xenia/kernel/xboxkrnl_error.h" - #include #include "xenia/base/atomic.h" @@ -24,979 +22,785 @@ namespace xe { namespace kernel { -struct error_lookup_table -{ - uint32_t base_code; - size_t count; - const uint32_t* entries; +struct error_lookup_table { + uint32_t base_code; + size_t count; + const uint32_t* entries; }; // TODO(gibbed): replace these with named error codes const uint32_t error_table_0x00000103[] = { - 0x000003E5, // 0x00000103 - 0, - 0x000000EA, // 0x00000105 - 0x00000514, // 0x00000106 - 0x00000515, // 0x00000107 - 0, - 0, - 0, - 0, - 0x000003FE, // 0x0000010C - 0x00000516, // 0x0000010D + 0x000003E5, // 0x00000103 + 0, + 0x000000EA, // 0x00000105 + 0x00000514, // 0x00000106 + 0x00000515, // 0x00000107 + 0, 0, 0, 0, + 0x000003FE, // 0x0000010C + 0x00000516, // 0x0000010D }; const uint32_t error_table_0x40000002[] = { - 0x00000057, // 0x40000002 - 0, - 0, - 0, - 0x00000517, // 0x40000006 - 0, - 0x00000460, // 0x40000008 - 0x000003F6, // 0x40000009 - 0, - 0, - 0x00000461, // 0x4000000C - 0x00000518, // 0x4000000D + 0x00000057, // 0x40000002 + 0, 0, 0, + 0x00000517, // 0x40000006 + 0, + 0x00000460, // 0x40000008 + 0x000003F6, // 0x40000009 + 0, 0, + 0x00000461, // 0x4000000C + 0x00000518, // 0x4000000D }; const uint32_t error_table_0x40020056[] = { - 0x00000720, // 0x40020056 + 0x00000720, // 0x40020056 }; const uint32_t error_table_0x400200AF[] = { - 0x00000779, // 0x400200AF + 0x00000779, // 0x400200AF }; const uint32_t error_table_0x80000001[] = { - 0x80000001, // 0x80000001 - 0x000003E6, // 0x80000002 - 0x80000003, // 0x80000003 - 0x80000004, // 0x80000004 - 0x000000EA, // 0x80000005 - 0x00000012, // 0x80000006 - 0, - 0, - 0, - 0, - 0x0000056F, // 0x8000000B - 0, - 0x0000012B, // 0x8000000D - 0x0000001C, // 0x8000000E - 0x00000015, // 0x8000000F - 0x00000015, // 0x80000010 - 0x000000AA, // 0x80000011 - 0x00000103, // 0x80000012 - 0x000000FE, // 0x80000013 - 0x000000FF, // 0x80000014 - 0x000000FF, // 0x80000015 - 0x00000456, // 0x80000016 - 0, - 0, - 0, - 0x00000103, // 0x8000001A - 0x0000044D, // 0x8000001B - 0x00000456, // 0x8000001C - 0x00000457, // 0x8000001D - 0x0000044C, // 0x8000001E - 0x0000044E, // 0x8000001F - 0, - 0x0000044F, // 0x80000021 - 0x00000450, // 0x80000022 - 0, - 0, - 0x00000962, // 0x80000025 + 0x80000001, // 0x80000001 + 0x000003E6, // 0x80000002 + 0x80000003, // 0x80000003 + 0x80000004, // 0x80000004 + 0x000000EA, // 0x80000005 + 0x00000012, // 0x80000006 + 0, 0, 0, 0, + 0x0000056F, // 0x8000000B + 0, + 0x0000012B, // 0x8000000D + 0x0000001C, // 0x8000000E + 0x00000015, // 0x8000000F + 0x00000015, // 0x80000010 + 0x000000AA, // 0x80000011 + 0x00000103, // 0x80000012 + 0x000000FE, // 0x80000013 + 0x000000FF, // 0x80000014 + 0x000000FF, // 0x80000015 + 0x00000456, // 0x80000016 + 0, 0, 0, + 0x00000103, // 0x8000001A + 0x0000044D, // 0x8000001B + 0x00000456, // 0x8000001C + 0x00000457, // 0x8000001D + 0x0000044C, // 0x8000001E + 0x0000044E, // 0x8000001F + 0, + 0x0000044F, // 0x80000021 + 0x00000450, // 0x80000022 + 0, 0, + 0x00000962, // 0x80000025 }; const uint32_t error_table_0x80000288[] = { - 0x0000048D, // 0x80000288 - 0x0000048E, // 0x80000289 + 0x0000048D, // 0x80000288 + 0x0000048E, // 0x80000289 }; const uint32_t error_table_0x80090300[] = { - 0x000005AA, // 0x80090300 - 0x00000006, // 0x80090301 - 0x00000001, // 0x80090302 - 0x00000035, // 0x80090303 - 0x0000054F, // 0x80090304 - 0x00000554, // 0x80090305 - 0x00000120, // 0x80090306 - 0x00000554, // 0x80090307 - 0x00000057, // 0x80090308 - 0x00000057, // 0x80090309 - 0x00000032, // 0x8009030A - 0x00000558, // 0x8009030B - 0x0000052E, // 0x8009030C - 0x00000057, // 0x8009030D - 0x00000520, // 0x8009030E - 0x00000005, // 0x8009030F - 0x00000005, // 0x80090310 - 0x0000051F, // 0x80090311 - 0, - 0, - 0, - 0, - 0x00000554, // 0x80090316 - 0, - 0x000006F8, // 0x80090318 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x00000057, // 0x80090320 - 0x0000007A, // 0x80090321 - 0x00000574, // 0x80090322 - 0, - 0, - 0x000006FE, // 0x80090325 - 0x00000057, // 0x80090326 - 0x00000057, // 0x80090327 - 0x00000532, // 0x80090328 - 0x00001770, // 0x80090329 - 0, - 0, - 0, - 0, - 0, - 0, - 0x00001771, // 0x80090330 - 0x00000001, // 0x80090331 + 0x000005AA, // 0x80090300 + 0x00000006, // 0x80090301 + 0x00000001, // 0x80090302 + 0x00000035, // 0x80090303 + 0x0000054F, // 0x80090304 + 0x00000554, // 0x80090305 + 0x00000120, // 0x80090306 + 0x00000554, // 0x80090307 + 0x00000057, // 0x80090308 + 0x00000057, // 0x80090309 + 0x00000032, // 0x8009030A + 0x00000558, // 0x8009030B + 0x0000052E, // 0x8009030C + 0x00000057, // 0x8009030D + 0x00000520, // 0x8009030E + 0x00000005, // 0x8009030F + 0x00000005, // 0x80090310 + 0x0000051F, // 0x80090311 + 0, 0, 0, 0, + 0x00000554, // 0x80090316 + 0, + 0x000006F8, // 0x80090318 + 0, 0, 0, 0, 0, 0, 0, + 0x00000057, // 0x80090320 + 0x0000007A, // 0x80090321 + 0x00000574, // 0x80090322 + 0, 0, + 0x000006FE, // 0x80090325 + 0x00000057, // 0x80090326 + 0x00000057, // 0x80090327 + 0x00000532, // 0x80090328 + 0x00001770, // 0x80090329 + 0, 0, 0, 0, 0, 0, + 0x00001771, // 0x80090330 + 0x00000001, // 0x80090331 }; const uint32_t error_table_0xC0000001[] = { - 0x0000001F, // 0xC0000001 - 0x00000001, // 0xC0000002 - 0x00000057, // 0xC0000003 - 0x00000018, // 0xC0000004 - 0x000003E6, // 0xC0000005 - 0x000003E7, // 0xC0000006 - 0x000005AE, // 0xC0000007 - 0x00000006, // 0xC0000008 - 0x000003E9, // 0xC0000009 - 0x000000C1, // 0xC000000A - 0x00000057, // 0xC000000B - 0, - 0x00000057, // 0xC000000D - 0x00000002, // 0xC000000E - 0x00000002, // 0xC000000F - 0x00000001, // 0xC0000010 - 0x00000026, // 0xC0000011 - 0x00000022, // 0xC0000012 - 0x00000015, // 0xC0000013 - 0x000006F9, // 0xC0000014 - 0x0000001B, // 0xC0000015 - 0x000000EA, // 0xC0000016 - 0x00000008, // 0xC0000017 - 0x000001E7, // 0xC0000018 - 0x000001E7, // 0xC0000019 - 0x00000057, // 0xC000001A - 0x00000057, // 0xC000001B - 0x00000001, // 0xC000001C - 0xC000001D, // 0xC000001D - 0x00000005, // 0xC000001E - 0x00000005, // 0xC000001F - 0x000000C1, // 0xC0000020 - 0x00000005, // 0xC0000021 - 0x00000005, // 0xC0000022 - 0x0000007A, // 0xC0000023 - 0x00000006, // 0xC0000024 - 0xC0000025, // 0xC0000025 - 0xC0000026, // 0xC0000026 - 0, - 0, - 0, - 0x0000009E, // 0xC000002A - 0xC000002B, // 0xC000002B - 0x000001E7, // 0xC000002C - 0x000001E7, // 0xC000002D - 0, - 0, - 0x00000057, // 0xC0000030 - 0, - 0x00000571, // 0xC0000032 - 0x0000007B, // 0xC0000033 - 0x00000002, // 0xC0000034 - 0x000000B7, // 0xC0000035 - 0, - 0x00000006, // 0xC0000037 - 0, - 0x000000A1, // 0xC0000039 - 0x00000003, // 0xC000003A - 0x000000A1, // 0xC000003B - 0x0000045D, // 0xC000003C - 0x0000045D, // 0xC000003D - 0x00000017, // 0xC000003E - 0x00000017, // 0xC000003F - 0x00000008, // 0xC0000040 - 0x00000005, // 0xC0000041 - 0x00000006, // 0xC0000042 - 0x00000020, // 0xC0000043 - 0x00000718, // 0xC0000044 - 0x00000057, // 0xC0000045 - 0x00000120, // 0xC0000046 - 0x0000012A, // 0xC0000047 - 0x00000057, // 0xC0000048 - 0x00000057, // 0xC0000049 - 0x0000009C, // 0xC000004A - 0x00000005, // 0xC000004B - 0x00000057, // 0xC000004C - 0x00000057, // 0xC000004D - 0x00000057, // 0xC000004E - 0x0000011A, // 0xC000004F - 0x000000FF, // 0xC0000050 - 0x00000570, // 0xC0000051 - 0x00000570, // 0xC0000052 - 0x00000570, // 0xC0000053 - 0x00000021, // 0xC0000054 - 0x00000021, // 0xC0000055 - 0x00000005, // 0xC0000056 - 0x00000032, // 0xC0000057 - 0x00000519, // 0xC0000058 - 0x0000051A, // 0xC0000059 - 0x0000051B, // 0xC000005A - 0x0000051C, // 0xC000005B - 0x0000051D, // 0xC000005C - 0x0000051E, // 0xC000005D - 0x0000051F, // 0xC000005E - 0x00000520, // 0xC000005F - 0x00000521, // 0xC0000060 - 0x00000522, // 0xC0000061 - 0x00000523, // 0xC0000062 - 0x00000524, // 0xC0000063 - 0x00000525, // 0xC0000064 - 0x00000526, // 0xC0000065 - 0x00000527, // 0xC0000066 - 0x00000528, // 0xC0000067 - 0x00000529, // 0xC0000068 - 0x0000052A, // 0xC0000069 - 0x00000056, // 0xC000006A - 0x0000052C, // 0xC000006B - 0x0000052D, // 0xC000006C - 0x0000052E, // 0xC000006D - 0x0000052F, // 0xC000006E - 0x00000530, // 0xC000006F - 0x00000531, // 0xC0000070 - 0x00000532, // 0xC0000071 - 0x00000533, // 0xC0000072 - 0x00000534, // 0xC0000073 - 0x00000535, // 0xC0000074 - 0x00000536, // 0xC0000075 - 0x00000537, // 0xC0000076 - 0x00000538, // 0xC0000077 - 0x00000539, // 0xC0000078 - 0x0000053A, // 0xC0000079 - 0x0000007F, // 0xC000007A - 0x000000C1, // 0xC000007B - 0x000003F0, // 0xC000007C - 0x0000053C, // 0xC000007D - 0x0000009E, // 0xC000007E - 0x00000070, // 0xC000007F - 0x0000053D, // 0xC0000080 - 0x0000053E, // 0xC0000081 - 0x00000044, // 0xC0000082 - 0x00000103, // 0xC0000083 - 0x0000053F, // 0xC0000084 - 0x00000103, // 0xC0000085 - 0x0000009A, // 0xC0000086 - 0x0000000E, // 0xC0000087 - 0x000001E7, // 0xC0000088 - 0x00000714, // 0xC0000089 - 0x00000715, // 0xC000008A - 0x00000716, // 0xC000008B - 0xC000008C, // 0xC000008C - 0xC000008D, // 0xC000008D - 0xC000008E, // 0xC000008E - 0xC000008F, // 0xC000008F - 0xC0000090, // 0xC0000090 - 0xC0000091, // 0xC0000091 - 0xC0000092, // 0xC0000092 - 0xC0000093, // 0xC0000093 - 0xC0000094, // 0xC0000094 - 0x00000216, // 0xC0000095 - 0xC0000096, // 0xC0000096 - 0x00000008, // 0xC0000097 - 0x000003EE, // 0xC0000098 - 0x00000540, // 0xC0000099 - 0x000005AA, // 0xC000009A - 0x00000003, // 0xC000009B - 0x00000017, // 0xC000009C - 0x0000048F, // 0xC000009D - 0x00000015, // 0xC000009E - 0x000001E7, // 0xC000009F - 0x000001E7, // 0xC00000A0 - 0x000005AD, // 0xC00000A1 - 0x00000013, // 0xC00000A2 - 0x00000015, // 0xC00000A3 - 0x00000541, // 0xC00000A4 - 0x00000542, // 0xC00000A5 - 0x00000543, // 0xC00000A6 - 0x00000544, // 0xC00000A7 - 0x00000545, // 0xC00000A8 - 0x00000057, // 0xC00000A9 - 0, - 0x000000E7, // 0xC00000AB - 0x000000E7, // 0xC00000AC - 0x000000E6, // 0xC00000AD - 0x000000E7, // 0xC00000AE - 0x00000001, // 0xC00000AF - 0x000000E9, // 0xC00000B0 - 0x000000E8, // 0xC00000B1 - 0x00000217, // 0xC00000B2 - 0x00000218, // 0xC00000B3 - 0x000000E6, // 0xC00000B4 - 0x00000079, // 0xC00000B5 - 0x00000026, // 0xC00000B6 - 0, - 0, - 0, - 0x00000005, // 0xC00000BA - 0x00000032, // 0xC00000BB - 0x00000033, // 0xC00000BC - 0x00000034, // 0xC00000BD - 0x00000035, // 0xC00000BE - 0x00000036, // 0xC00000BF - 0x00000037, // 0xC00000C0 - 0x00000038, // 0xC00000C1 - 0x00000039, // 0xC00000C2 - 0x0000003A, // 0xC00000C3 - 0x0000003B, // 0xC00000C4 - 0x0000003C, // 0xC00000C5 - 0x0000003D, // 0xC00000C6 - 0x0000003E, // 0xC00000C7 - 0x0000003F, // 0xC00000C8 - 0x00000040, // 0xC00000C9 - 0x00000041, // 0xC00000CA - 0x00000042, // 0xC00000CB - 0x00000043, // 0xC00000CC - 0x00000044, // 0xC00000CD - 0x00000045, // 0xC00000CE - 0x00000046, // 0xC00000CF - 0x00000047, // 0xC00000D0 - 0x00000048, // 0xC00000D1 - 0x00000058, // 0xC00000D2 - 0, - 0x00000011, // 0xC00000D4 - 0x00000005, // 0xC00000D5 - 0x000000F0, // 0xC00000D6 - 0x00000546, // 0xC00000D7 - 0, - 0x000000E8, // 0xC00000D9 - 0x00000547, // 0xC00000DA - 0, - 0x00000548, // 0xC00000DC - 0x00000549, // 0xC00000DD - 0x0000054A, // 0xC00000DE - 0x0000054B, // 0xC00000DF - 0x0000054C, // 0xC00000E0 - 0x0000054D, // 0xC00000E1 - 0x0000012C, // 0xC00000E2 - 0x0000012D, // 0xC00000E3 - 0x0000054E, // 0xC00000E4 - 0x0000054F, // 0xC00000E5 - 0x00000550, // 0xC00000E6 - 0x00000551, // 0xC00000E7 - 0x000006F8, // 0xC00000E8 - 0, - 0, - 0, - 0, - 0x00000552, // 0xC00000ED - 0x00000553, // 0xC00000EE - 0x00000057, // 0xC00000EF - 0x00000057, // 0xC00000F0 - 0x00000057, // 0xC00000F1 - 0x00000057, // 0xC00000F2 - 0x00000057, // 0xC00000F3 - 0x00000057, // 0xC00000F4 - 0x00000057, // 0xC00000F5 - 0x00000057, // 0xC00000F6 - 0x00000057, // 0xC00000F7 - 0x00000057, // 0xC00000F8 - 0x00000057, // 0xC00000F9 - 0x00000057, // 0xC00000FA - 0x00000003, // 0xC00000FB - 0, - 0x000003E9, // 0xC00000FD - 0x00000554, // 0xC00000FE - 0, - 0x000000CB, // 0xC0000100 - 0x00000091, // 0xC0000101 - 0x00000570, // 0xC0000102 - 0x0000010B, // 0xC0000103 - 0x00000555, // 0xC0000104 - 0x00000556, // 0xC0000105 - 0x000000CE, // 0xC0000106 - 0x00000961, // 0xC0000107 - 0x00000964, // 0xC0000108 - 0x0000013D, // 0xC0000109 - 0x00000005, // 0xC000010A - 0x00000557, // 0xC000010B - 0, - 0x00000558, // 0xC000010D - 0x00000420, // 0xC000010E - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x000005A4, // 0xC0000117 - 0, - 0, - 0, - 0, - 0, - 0, - 0x000003EE, // 0xC000011E - 0x00000004, // 0xC000011F - 0x000003E3, // 0xC0000120 - 0x00000005, // 0xC0000121 - 0x000004BA, // 0xC0000122 - 0x00000005, // 0xC0000123 - 0x0000055B, // 0xC0000124 - 0x0000055C, // 0xC0000125 - 0x0000055D, // 0xC0000126 - 0x0000055E, // 0xC0000127 - 0x00000006, // 0xC0000128 - 0, - 0, - 0x0000055F, // 0xC000012B - 0, - 0x000005AF, // 0xC000012D - 0, - 0, - 0x000000C1, // 0xC0000130 - 0, - 0, - 0x00000576, // 0xC0000133 - 0, - 0x0000007E, // 0xC0000135 - 0, - 0, - 0x000000B6, // 0xC0000138 - 0x0000007F, // 0xC0000139 - 0, - 0x00000040, // 0xC000013B - 0x00000040, // 0xC000013C - 0x00000033, // 0xC000013D - 0x0000003B, // 0xC000013E - 0x0000003B, // 0xC000013F - 0x0000003B, // 0xC0000140 - 0x0000003B, // 0xC0000141 - 0x0000045A, // 0xC0000142 - 0, - 0, - 0, - 0, - 0, - 0x0000007C, // 0xC0000148 - 0x00000056, // 0xC0000149 - 0, - 0x0000006D, // 0xC000014B - 0x000003F1, // 0xC000014C - 0x000003F8, // 0xC000014D - 0, - 0x000003ED, // 0xC000014F - 0x0000045E, // 0xC0000150 - 0x00000560, // 0xC0000151 - 0x00000561, // 0xC0000152 - 0x00000562, // 0xC0000153 - 0x00000563, // 0xC0000154 - 0x00000564, // 0xC0000155 - 0x00000565, // 0xC0000156 - 0x00000566, // 0xC0000157 - 0x00000567, // 0xC0000158 - 0x000003EF, // 0xC0000159 - 0x00000568, // 0xC000015A - 0x00000569, // 0xC000015B - 0x000003F9, // 0xC000015C - 0x0000056A, // 0xC000015D - 0, - 0, - 0, - 0, - 0x00000459, // 0xC0000162 - 0, - 0, - 0, - 0, - 0, - 0, - 0x00000466, // 0xC0000169 - 0x00000467, // 0xC000016A - 0x00000468, // 0xC000016B - 0x0000045F, // 0xC000016C - 0, - 0, - 0, - 0, - 0, - 0x00000451, // 0xC0000172 - 0x00000452, // 0xC0000173 - 0x00000453, // 0xC0000174 - 0x00000454, // 0xC0000175 - 0x00000455, // 0xC0000176 - 0x00000469, // 0xC0000177 - 0x00000458, // 0xC0000178 - 0, - 0x0000056B, // 0xC000017A - 0x0000056C, // 0xC000017B - 0x000003FA, // 0xC000017C - 0x000003FB, // 0xC000017D - 0x0000056D, // 0xC000017E - 0x0000056E, // 0xC000017F - 0x000003FC, // 0xC0000180 - 0x000003FD, // 0xC0000181 - 0x00000057, // 0xC0000182 - 0x0000045D, // 0xC0000183 - 0x00000016, // 0xC0000184 - 0x0000045D, // 0xC0000185 - 0x0000045D, // 0xC0000186 - 0, - 0x000005DE, // 0xC0000188 - 0x00000013, // 0xC0000189 - 0x000006FA, // 0xC000018A - 0x000006FB, // 0xC000018B - 0x000006FC, // 0xC000018C - 0x000006FD, // 0xC000018D - 0x000005DC, // 0xC000018E - 0x000005DD, // 0xC000018F - 0x000006FE, // 0xC0000190 - 0, - 0x00000700, // 0xC0000192 - 0x00000701, // 0xC0000193 - 0x0000046B, // 0xC0000194 - 0x000004C3, // 0xC0000195 - 0x000004C4, // 0xC0000196 - 0x000005DF, // 0xC0000197 - 0x0000070F, // 0xC0000198 - 0x00000710, // 0xC0000199 - 0x00000711, // 0xC000019A - 0x00000712, // 0xC000019B + 0x0000001F, // 0xC0000001 + 0x00000001, // 0xC0000002 + 0x00000057, // 0xC0000003 + 0x00000018, // 0xC0000004 + 0x000003E6, // 0xC0000005 + 0x000003E7, // 0xC0000006 + 0x000005AE, // 0xC0000007 + 0x00000006, // 0xC0000008 + 0x000003E9, // 0xC0000009 + 0x000000C1, // 0xC000000A + 0x00000057, // 0xC000000B + 0, + 0x00000057, // 0xC000000D + 0x00000002, // 0xC000000E + 0x00000002, // 0xC000000F + 0x00000001, // 0xC0000010 + 0x00000026, // 0xC0000011 + 0x00000022, // 0xC0000012 + 0x00000015, // 0xC0000013 + 0x000006F9, // 0xC0000014 + 0x0000001B, // 0xC0000015 + 0x000000EA, // 0xC0000016 + 0x00000008, // 0xC0000017 + 0x000001E7, // 0xC0000018 + 0x000001E7, // 0xC0000019 + 0x00000057, // 0xC000001A + 0x00000057, // 0xC000001B + 0x00000001, // 0xC000001C + 0xC000001D, // 0xC000001D + 0x00000005, // 0xC000001E + 0x00000005, // 0xC000001F + 0x000000C1, // 0xC0000020 + 0x00000005, // 0xC0000021 + 0x00000005, // 0xC0000022 + 0x0000007A, // 0xC0000023 + 0x00000006, // 0xC0000024 + 0xC0000025, // 0xC0000025 + 0xC0000026, // 0xC0000026 + 0, 0, 0, + 0x0000009E, // 0xC000002A + 0xC000002B, // 0xC000002B + 0x000001E7, // 0xC000002C + 0x000001E7, // 0xC000002D + 0, 0, + 0x00000057, // 0xC0000030 + 0, + 0x00000571, // 0xC0000032 + 0x0000007B, // 0xC0000033 + 0x00000002, // 0xC0000034 + 0x000000B7, // 0xC0000035 + 0, + 0x00000006, // 0xC0000037 + 0, + 0x000000A1, // 0xC0000039 + 0x00000003, // 0xC000003A + 0x000000A1, // 0xC000003B + 0x0000045D, // 0xC000003C + 0x0000045D, // 0xC000003D + 0x00000017, // 0xC000003E + 0x00000017, // 0xC000003F + 0x00000008, // 0xC0000040 + 0x00000005, // 0xC0000041 + 0x00000006, // 0xC0000042 + 0x00000020, // 0xC0000043 + 0x00000718, // 0xC0000044 + 0x00000057, // 0xC0000045 + 0x00000120, // 0xC0000046 + 0x0000012A, // 0xC0000047 + 0x00000057, // 0xC0000048 + 0x00000057, // 0xC0000049 + 0x0000009C, // 0xC000004A + 0x00000005, // 0xC000004B + 0x00000057, // 0xC000004C + 0x00000057, // 0xC000004D + 0x00000057, // 0xC000004E + 0x0000011A, // 0xC000004F + 0x000000FF, // 0xC0000050 + 0x00000570, // 0xC0000051 + 0x00000570, // 0xC0000052 + 0x00000570, // 0xC0000053 + 0x00000021, // 0xC0000054 + 0x00000021, // 0xC0000055 + 0x00000005, // 0xC0000056 + 0x00000032, // 0xC0000057 + 0x00000519, // 0xC0000058 + 0x0000051A, // 0xC0000059 + 0x0000051B, // 0xC000005A + 0x0000051C, // 0xC000005B + 0x0000051D, // 0xC000005C + 0x0000051E, // 0xC000005D + 0x0000051F, // 0xC000005E + 0x00000520, // 0xC000005F + 0x00000521, // 0xC0000060 + 0x00000522, // 0xC0000061 + 0x00000523, // 0xC0000062 + 0x00000524, // 0xC0000063 + 0x00000525, // 0xC0000064 + 0x00000526, // 0xC0000065 + 0x00000527, // 0xC0000066 + 0x00000528, // 0xC0000067 + 0x00000529, // 0xC0000068 + 0x0000052A, // 0xC0000069 + 0x00000056, // 0xC000006A + 0x0000052C, // 0xC000006B + 0x0000052D, // 0xC000006C + 0x0000052E, // 0xC000006D + 0x0000052F, // 0xC000006E + 0x00000530, // 0xC000006F + 0x00000531, // 0xC0000070 + 0x00000532, // 0xC0000071 + 0x00000533, // 0xC0000072 + 0x00000534, // 0xC0000073 + 0x00000535, // 0xC0000074 + 0x00000536, // 0xC0000075 + 0x00000537, // 0xC0000076 + 0x00000538, // 0xC0000077 + 0x00000539, // 0xC0000078 + 0x0000053A, // 0xC0000079 + 0x0000007F, // 0xC000007A + 0x000000C1, // 0xC000007B + 0x000003F0, // 0xC000007C + 0x0000053C, // 0xC000007D + 0x0000009E, // 0xC000007E + 0x00000070, // 0xC000007F + 0x0000053D, // 0xC0000080 + 0x0000053E, // 0xC0000081 + 0x00000044, // 0xC0000082 + 0x00000103, // 0xC0000083 + 0x0000053F, // 0xC0000084 + 0x00000103, // 0xC0000085 + 0x0000009A, // 0xC0000086 + 0x0000000E, // 0xC0000087 + 0x000001E7, // 0xC0000088 + 0x00000714, // 0xC0000089 + 0x00000715, // 0xC000008A + 0x00000716, // 0xC000008B + 0xC000008C, // 0xC000008C + 0xC000008D, // 0xC000008D + 0xC000008E, // 0xC000008E + 0xC000008F, // 0xC000008F + 0xC0000090, // 0xC0000090 + 0xC0000091, // 0xC0000091 + 0xC0000092, // 0xC0000092 + 0xC0000093, // 0xC0000093 + 0xC0000094, // 0xC0000094 + 0x00000216, // 0xC0000095 + 0xC0000096, // 0xC0000096 + 0x00000008, // 0xC0000097 + 0x000003EE, // 0xC0000098 + 0x00000540, // 0xC0000099 + 0x000005AA, // 0xC000009A + 0x00000003, // 0xC000009B + 0x00000017, // 0xC000009C + 0x0000048F, // 0xC000009D + 0x00000015, // 0xC000009E + 0x000001E7, // 0xC000009F + 0x000001E7, // 0xC00000A0 + 0x000005AD, // 0xC00000A1 + 0x00000013, // 0xC00000A2 + 0x00000015, // 0xC00000A3 + 0x00000541, // 0xC00000A4 + 0x00000542, // 0xC00000A5 + 0x00000543, // 0xC00000A6 + 0x00000544, // 0xC00000A7 + 0x00000545, // 0xC00000A8 + 0x00000057, // 0xC00000A9 + 0, + 0x000000E7, // 0xC00000AB + 0x000000E7, // 0xC00000AC + 0x000000E6, // 0xC00000AD + 0x000000E7, // 0xC00000AE + 0x00000001, // 0xC00000AF + 0x000000E9, // 0xC00000B0 + 0x000000E8, // 0xC00000B1 + 0x00000217, // 0xC00000B2 + 0x00000218, // 0xC00000B3 + 0x000000E6, // 0xC00000B4 + 0x00000079, // 0xC00000B5 + 0x00000026, // 0xC00000B6 + 0, 0, 0, + 0x00000005, // 0xC00000BA + 0x00000032, // 0xC00000BB + 0x00000033, // 0xC00000BC + 0x00000034, // 0xC00000BD + 0x00000035, // 0xC00000BE + 0x00000036, // 0xC00000BF + 0x00000037, // 0xC00000C0 + 0x00000038, // 0xC00000C1 + 0x00000039, // 0xC00000C2 + 0x0000003A, // 0xC00000C3 + 0x0000003B, // 0xC00000C4 + 0x0000003C, // 0xC00000C5 + 0x0000003D, // 0xC00000C6 + 0x0000003E, // 0xC00000C7 + 0x0000003F, // 0xC00000C8 + 0x00000040, // 0xC00000C9 + 0x00000041, // 0xC00000CA + 0x00000042, // 0xC00000CB + 0x00000043, // 0xC00000CC + 0x00000044, // 0xC00000CD + 0x00000045, // 0xC00000CE + 0x00000046, // 0xC00000CF + 0x00000047, // 0xC00000D0 + 0x00000048, // 0xC00000D1 + 0x00000058, // 0xC00000D2 + 0, + 0x00000011, // 0xC00000D4 + 0x00000005, // 0xC00000D5 + 0x000000F0, // 0xC00000D6 + 0x00000546, // 0xC00000D7 + 0, + 0x000000E8, // 0xC00000D9 + 0x00000547, // 0xC00000DA + 0, + 0x00000548, // 0xC00000DC + 0x00000549, // 0xC00000DD + 0x0000054A, // 0xC00000DE + 0x0000054B, // 0xC00000DF + 0x0000054C, // 0xC00000E0 + 0x0000054D, // 0xC00000E1 + 0x0000012C, // 0xC00000E2 + 0x0000012D, // 0xC00000E3 + 0x0000054E, // 0xC00000E4 + 0x0000054F, // 0xC00000E5 + 0x00000550, // 0xC00000E6 + 0x00000551, // 0xC00000E7 + 0x000006F8, // 0xC00000E8 + 0, 0, 0, 0, + 0x00000552, // 0xC00000ED + 0x00000553, // 0xC00000EE + 0x00000057, // 0xC00000EF + 0x00000057, // 0xC00000F0 + 0x00000057, // 0xC00000F1 + 0x00000057, // 0xC00000F2 + 0x00000057, // 0xC00000F3 + 0x00000057, // 0xC00000F4 + 0x00000057, // 0xC00000F5 + 0x00000057, // 0xC00000F6 + 0x00000057, // 0xC00000F7 + 0x00000057, // 0xC00000F8 + 0x00000057, // 0xC00000F9 + 0x00000057, // 0xC00000FA + 0x00000003, // 0xC00000FB + 0, + 0x000003E9, // 0xC00000FD + 0x00000554, // 0xC00000FE + 0, + 0x000000CB, // 0xC0000100 + 0x00000091, // 0xC0000101 + 0x00000570, // 0xC0000102 + 0x0000010B, // 0xC0000103 + 0x00000555, // 0xC0000104 + 0x00000556, // 0xC0000105 + 0x000000CE, // 0xC0000106 + 0x00000961, // 0xC0000107 + 0x00000964, // 0xC0000108 + 0x0000013D, // 0xC0000109 + 0x00000005, // 0xC000010A + 0x00000557, // 0xC000010B + 0, + 0x00000558, // 0xC000010D + 0x00000420, // 0xC000010E + 0, 0, 0, 0, 0, 0, 0, 0, + 0x000005A4, // 0xC0000117 + 0, 0, 0, 0, 0, 0, + 0x000003EE, // 0xC000011E + 0x00000004, // 0xC000011F + 0x000003E3, // 0xC0000120 + 0x00000005, // 0xC0000121 + 0x000004BA, // 0xC0000122 + 0x00000005, // 0xC0000123 + 0x0000055B, // 0xC0000124 + 0x0000055C, // 0xC0000125 + 0x0000055D, // 0xC0000126 + 0x0000055E, // 0xC0000127 + 0x00000006, // 0xC0000128 + 0, 0, + 0x0000055F, // 0xC000012B + 0, + 0x000005AF, // 0xC000012D + 0, 0, + 0x000000C1, // 0xC0000130 + 0, 0, + 0x00000576, // 0xC0000133 + 0, + 0x0000007E, // 0xC0000135 + 0, 0, + 0x000000B6, // 0xC0000138 + 0x0000007F, // 0xC0000139 + 0, + 0x00000040, // 0xC000013B + 0x00000040, // 0xC000013C + 0x00000033, // 0xC000013D + 0x0000003B, // 0xC000013E + 0x0000003B, // 0xC000013F + 0x0000003B, // 0xC0000140 + 0x0000003B, // 0xC0000141 + 0x0000045A, // 0xC0000142 + 0, 0, 0, 0, 0, + 0x0000007C, // 0xC0000148 + 0x00000056, // 0xC0000149 + 0, + 0x0000006D, // 0xC000014B + 0x000003F1, // 0xC000014C + 0x000003F8, // 0xC000014D + 0, + 0x000003ED, // 0xC000014F + 0x0000045E, // 0xC0000150 + 0x00000560, // 0xC0000151 + 0x00000561, // 0xC0000152 + 0x00000562, // 0xC0000153 + 0x00000563, // 0xC0000154 + 0x00000564, // 0xC0000155 + 0x00000565, // 0xC0000156 + 0x00000566, // 0xC0000157 + 0x00000567, // 0xC0000158 + 0x000003EF, // 0xC0000159 + 0x00000568, // 0xC000015A + 0x00000569, // 0xC000015B + 0x000003F9, // 0xC000015C + 0x0000056A, // 0xC000015D + 0, 0, 0, 0, + 0x00000459, // 0xC0000162 + 0, 0, 0, 0, 0, 0, + 0x00000466, // 0xC0000169 + 0x00000467, // 0xC000016A + 0x00000468, // 0xC000016B + 0x0000045F, // 0xC000016C + 0, 0, 0, 0, 0, + 0x00000451, // 0xC0000172 + 0x00000452, // 0xC0000173 + 0x00000453, // 0xC0000174 + 0x00000454, // 0xC0000175 + 0x00000455, // 0xC0000176 + 0x00000469, // 0xC0000177 + 0x00000458, // 0xC0000178 + 0, + 0x0000056B, // 0xC000017A + 0x0000056C, // 0xC000017B + 0x000003FA, // 0xC000017C + 0x000003FB, // 0xC000017D + 0x0000056D, // 0xC000017E + 0x0000056E, // 0xC000017F + 0x000003FC, // 0xC0000180 + 0x000003FD, // 0xC0000181 + 0x00000057, // 0xC0000182 + 0x0000045D, // 0xC0000183 + 0x00000016, // 0xC0000184 + 0x0000045D, // 0xC0000185 + 0x0000045D, // 0xC0000186 + 0, + 0x000005DE, // 0xC0000188 + 0x00000013, // 0xC0000189 + 0x000006FA, // 0xC000018A + 0x000006FB, // 0xC000018B + 0x000006FC, // 0xC000018C + 0x000006FD, // 0xC000018D + 0x000005DC, // 0xC000018E + 0x000005DD, // 0xC000018F + 0x000006FE, // 0xC0000190 + 0, + 0x00000700, // 0xC0000192 + 0x00000701, // 0xC0000193 + 0x0000046B, // 0xC0000194 + 0x000004C3, // 0xC0000195 + 0x000004C4, // 0xC0000196 + 0x000005DF, // 0xC0000197 + 0x0000070F, // 0xC0000198 + 0x00000710, // 0xC0000199 + 0x00000711, // 0xC000019A + 0x00000712, // 0xC000019B }; const uint32_t error_table_0xC0000202[] = { - 0x00000572, // 0xC0000202 - 0x0000003B, // 0xC0000203 - 0x00000717, // 0xC0000204 - 0x0000046A, // 0xC0000205 - 0x000006F8, // 0xC0000206 - 0x000004BE, // 0xC0000207 - 0x000004BE, // 0xC0000208 - 0x00000044, // 0xC0000209 - 0x00000034, // 0xC000020A - 0x00000040, // 0xC000020B - 0x00000040, // 0xC000020C - 0x00000040, // 0xC000020D - 0x00000044, // 0xC000020E - 0x0000003B, // 0xC000020F - 0x0000003B, // 0xC0000210 - 0x0000003B, // 0xC0000211 - 0x0000003B, // 0xC0000212 - 0x0000003B, // 0xC0000213 - 0x0000003B, // 0xC0000214 - 0x0000003B, // 0xC0000215 - 0x00000032, // 0xC0000216 - 0x00000032, // 0xC0000217 - 0, - 0, - 0, - 0, - 0x000017E6, // 0xC000021C - 0, - 0, - 0, - 0x0000046C, // 0xC0000220 - 0x000000C1, // 0xC0000221 - 0, - 0, - 0x00000773, // 0xC0000224 - 0x00000490, // 0xC0000225 - 0, - 0, - 0, - 0, - 0xC000022A, // 0xC000022A - 0xC000022B, // 0xC000022B - 0, - 0x000004D5, // 0xC000022D - 0, - 0, - 0x00000492, // 0xC0000230 - 0, - 0, - 0x00000774, // 0xC0000233 - 0x00000775, // 0xC0000234 - 0x00000006, // 0xC0000235 - 0x000004C9, // 0xC0000236 - 0x000004CA, // 0xC0000237 - 0x000004CB, // 0xC0000238 - 0x000004CC, // 0xC0000239 - 0x000004CD, // 0xC000023A - 0x000004CE, // 0xC000023B - 0x000004CF, // 0xC000023C - 0x000004D0, // 0xC000023D - 0x000004D1, // 0xC000023E - 0x000004D2, // 0xC000023F - 0x000004D3, // 0xC0000240 - 0x000004D4, // 0xC0000241 - 0, - 0x000004C8, // 0xC0000243 - 0, - 0, - 0x000004D6, // 0xC0000246 - 0x000004D7, // 0xC0000247 - 0x000004D8, // 0xC0000248 - 0x000000C1, // 0xC0000249 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x0000054F, // 0xC0000253 - 0, - 0, - 0, - 0x000004D0, // 0xC0000257 - 0, - 0x00000573, // 0xC0000259 - 0, - 0, - 0, - 0, - 0x00000422, // 0xC000025E - 0, - 0, - 0, - 0x000000B6, // 0xC0000262 - 0x0000007F, // 0xC0000263 - 0x00000120, // 0xC0000264 - 0x00000476, // 0xC0000265 - 0, - 0x000010FE, // 0xC0000267 - 0, - 0, - 0, - 0, - 0x000007D1, // 0xC000026C - 0x000004B1, // 0xC000026D - 0x00000015, // 0xC000026E - 0, - 0, - 0, - 0x00000491, // 0xC0000272 - 0, - 0, - 0x00001126, // 0xC0000275 - 0x00001129, // 0xC0000276 - 0x0000112A, // 0xC0000277 - 0x00001128, // 0xC0000278 - 0x00000780, // 0xC0000279 - 0, - 0, - 0, - 0, - 0, - 0, - 0x00000781, // 0xC0000280 - 0x000000A1, // 0xC0000281 - 0, - 0x00000488, // 0xC0000283 - 0x00000489, // 0xC0000284 - 0x0000048A, // 0xC0000285 - 0x0000048B, // 0xC0000286 - 0x0000048C, // 0xC0000287 - 0, - 0, - 0x00000005, // 0xC000028A - 0x00000005, // 0xC000028B - 0, - 0x00000005, // 0xC000028D - 0x00000005, // 0xC000028E - 0x00000005, // 0xC000028F - 0x00000005, // 0xC0000290 - 0x00001777, // 0xC0000291 - 0x00001778, // 0xC0000292 - 0x00001772, // 0xC0000293 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x00000001, // 0xC000029C - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x00001127, // 0xC00002B2 - 0, - 0, - 0, - 0x00000651, // 0xC00002B6 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x00000575, // 0xC00002C3 - 0, - 0x000003E6, // 0xC00002C5 - 0, - 0, - 0, - 0, - 0x000010E8, // 0xC00002CA - 0, - 0x000004E3, // 0xC00002CC - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x00000052, // 0xC00002EA + 0x00000572, // 0xC0000202 + 0x0000003B, // 0xC0000203 + 0x00000717, // 0xC0000204 + 0x0000046A, // 0xC0000205 + 0x000006F8, // 0xC0000206 + 0x000004BE, // 0xC0000207 + 0x000004BE, // 0xC0000208 + 0x00000044, // 0xC0000209 + 0x00000034, // 0xC000020A + 0x00000040, // 0xC000020B + 0x00000040, // 0xC000020C + 0x00000040, // 0xC000020D + 0x00000044, // 0xC000020E + 0x0000003B, // 0xC000020F + 0x0000003B, // 0xC0000210 + 0x0000003B, // 0xC0000211 + 0x0000003B, // 0xC0000212 + 0x0000003B, // 0xC0000213 + 0x0000003B, // 0xC0000214 + 0x0000003B, // 0xC0000215 + 0x00000032, // 0xC0000216 + 0x00000032, // 0xC0000217 + 0, 0, 0, 0, + 0x000017E6, // 0xC000021C + 0, 0, 0, + 0x0000046C, // 0xC0000220 + 0x000000C1, // 0xC0000221 + 0, 0, + 0x00000773, // 0xC0000224 + 0x00000490, // 0xC0000225 + 0, 0, 0, 0, + 0xC000022A, // 0xC000022A + 0xC000022B, // 0xC000022B + 0, + 0x000004D5, // 0xC000022D + 0, 0, + 0x00000492, // 0xC0000230 + 0, 0, + 0x00000774, // 0xC0000233 + 0x00000775, // 0xC0000234 + 0x00000006, // 0xC0000235 + 0x000004C9, // 0xC0000236 + 0x000004CA, // 0xC0000237 + 0x000004CB, // 0xC0000238 + 0x000004CC, // 0xC0000239 + 0x000004CD, // 0xC000023A + 0x000004CE, // 0xC000023B + 0x000004CF, // 0xC000023C + 0x000004D0, // 0xC000023D + 0x000004D1, // 0xC000023E + 0x000004D2, // 0xC000023F + 0x000004D3, // 0xC0000240 + 0x000004D4, // 0xC0000241 + 0, + 0x000004C8, // 0xC0000243 + 0, 0, + 0x000004D6, // 0xC0000246 + 0x000004D7, // 0xC0000247 + 0x000004D8, // 0xC0000248 + 0x000000C1, // 0xC0000249 + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x0000054F, // 0xC0000253 + 0, 0, 0, + 0x000004D0, // 0xC0000257 + 0, + 0x00000573, // 0xC0000259 + 0, 0, 0, 0, + 0x00000422, // 0xC000025E + 0, 0, 0, + 0x000000B6, // 0xC0000262 + 0x0000007F, // 0xC0000263 + 0x00000120, // 0xC0000264 + 0x00000476, // 0xC0000265 + 0, + 0x000010FE, // 0xC0000267 + 0, 0, 0, 0, + 0x000007D1, // 0xC000026C + 0x000004B1, // 0xC000026D + 0x00000015, // 0xC000026E + 0, 0, 0, + 0x00000491, // 0xC0000272 + 0, 0, + 0x00001126, // 0xC0000275 + 0x00001129, // 0xC0000276 + 0x0000112A, // 0xC0000277 + 0x00001128, // 0xC0000278 + 0x00000780, // 0xC0000279 + 0, 0, 0, 0, 0, 0, + 0x00000781, // 0xC0000280 + 0x000000A1, // 0xC0000281 + 0, + 0x00000488, // 0xC0000283 + 0x00000489, // 0xC0000284 + 0x0000048A, // 0xC0000285 + 0x0000048B, // 0xC0000286 + 0x0000048C, // 0xC0000287 + 0, 0, + 0x00000005, // 0xC000028A + 0x00000005, // 0xC000028B + 0, + 0x00000005, // 0xC000028D + 0x00000005, // 0xC000028E + 0x00000005, // 0xC000028F + 0x00000005, // 0xC0000290 + 0x00001777, // 0xC0000291 + 0x00001778, // 0xC0000292 + 0x00001772, // 0xC0000293 + 0, 0, 0, 0, 0, 0, 0, 0, + 0x00000001, // 0xC000029C + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x00001127, // 0xC00002B2 + 0, 0, 0, + 0x00000651, // 0xC00002B6 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x00000575, // 0xC00002C3 + 0, + 0x000003E6, // 0xC00002C5 + 0, 0, 0, 0, + 0x000010E8, // 0xC00002CA + 0, + 0x000004E3, // 0xC00002CC + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0x00000052, // 0xC00002EA }; const uint32_t error_table_0xC0020001[] = { - 0x000006A4, // 0xC0020001 - 0x000006A5, // 0xC0020002 - 0x00000006, // 0xC0020003 - 0x000006A7, // 0xC0020004 - 0x000006A8, // 0xC0020005 - 0x000006A9, // 0xC0020006 - 0x000006AA, // 0xC0020007 - 0x000006AB, // 0xC0020008 - 0x000006AC, // 0xC0020009 - 0x000006AD, // 0xC002000A - 0x000006AE, // 0xC002000B - 0x000006AF, // 0xC002000C - 0x000006B0, // 0xC002000D - 0x000006B1, // 0xC002000E - 0x000006B2, // 0xC002000F - 0x000006B3, // 0xC0020010 - 0x000006B4, // 0xC0020011 - 0x000006B5, // 0xC0020012 - 0x000006B6, // 0xC0020013 - 0x000006B7, // 0xC0020014 - 0x000006B8, // 0xC0020015 - 0x000006B9, // 0xC0020016 - 0x000006BA, // 0xC0020017 - 0x000006BB, // 0xC0020018 - 0x000006BC, // 0xC0020019 - 0x000006BD, // 0xC002001A - 0x000006BE, // 0xC002001B - 0x000006BF, // 0xC002001C - 0x000006C0, // 0xC002001D - 0, - 0x000006C2, // 0xC002001F - 0, - 0x000006C4, // 0xC0020021 - 0x000006C5, // 0xC0020022 - 0x000006C6, // 0xC0020023 - 0x000006C7, // 0xC0020024 - 0x000006C8, // 0xC0020025 - 0x000006C9, // 0xC0020026 - 0, - 0x000006CB, // 0xC0020028 - 0x000006CC, // 0xC0020029 - 0x000006CD, // 0xC002002A - 0x000006CE, // 0xC002002B - 0x000006CF, // 0xC002002C - 0x000006D0, // 0xC002002D - 0x000006D1, // 0xC002002E - 0x000006D2, // 0xC002002F - 0x000006D3, // 0xC0020030 - 0x000006D4, // 0xC0020031 - 0x000006D5, // 0xC0020032 - 0x000006D6, // 0xC0020033 - 0x000006D7, // 0xC0020034 - 0x000006D8, // 0xC0020035 - 0x000006D9, // 0xC0020036 - 0x000006DA, // 0xC0020037 - 0x000006DB, // 0xC0020038 - 0x000006DC, // 0xC0020039 - 0x000006DD, // 0xC002003A - 0x000006DE, // 0xC002003B - 0x000006DF, // 0xC002003C - 0x000006E0, // 0xC002003D - 0x000006E1, // 0xC002003E - 0x000006E2, // 0xC002003F - 0x000006E3, // 0xC0020040 - 0x000006E4, // 0xC0020041 - 0x000006E5, // 0xC0020042 - 0x000006E6, // 0xC0020043 - 0x000006E7, // 0xC0020044 - 0x000006E8, // 0xC0020045 - 0x000006E9, // 0xC0020046 - 0x000006EA, // 0xC0020047 - 0x000006EB, // 0xC0020048 - 0x000006FF, // 0xC0020049 - 0x0000070E, // 0xC002004A - 0x0000076A, // 0xC002004B - 0x0000076B, // 0xC002004C - 0x0000076C, // 0xC002004D - 0, - 0x00000719, // 0xC002004F - 0x0000071A, // 0xC0020050 - 0x0000071B, // 0xC0020051 - 0x0000071C, // 0xC0020052 - 0x0000071D, // 0xC0020053 - 0x0000071E, // 0xC0020054 - 0x0000071F, // 0xC0020055 - 0, - 0x00000721, // 0xC0020057 - 0x00000722, // 0xC0020058 - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0x0000077A, // 0xC0020062 - 0x0000077B, // 0xC0020063 + 0x000006A4, // 0xC0020001 + 0x000006A5, // 0xC0020002 + 0x00000006, // 0xC0020003 + 0x000006A7, // 0xC0020004 + 0x000006A8, // 0xC0020005 + 0x000006A9, // 0xC0020006 + 0x000006AA, // 0xC0020007 + 0x000006AB, // 0xC0020008 + 0x000006AC, // 0xC0020009 + 0x000006AD, // 0xC002000A + 0x000006AE, // 0xC002000B + 0x000006AF, // 0xC002000C + 0x000006B0, // 0xC002000D + 0x000006B1, // 0xC002000E + 0x000006B2, // 0xC002000F + 0x000006B3, // 0xC0020010 + 0x000006B4, // 0xC0020011 + 0x000006B5, // 0xC0020012 + 0x000006B6, // 0xC0020013 + 0x000006B7, // 0xC0020014 + 0x000006B8, // 0xC0020015 + 0x000006B9, // 0xC0020016 + 0x000006BA, // 0xC0020017 + 0x000006BB, // 0xC0020018 + 0x000006BC, // 0xC0020019 + 0x000006BD, // 0xC002001A + 0x000006BE, // 0xC002001B + 0x000006BF, // 0xC002001C + 0x000006C0, // 0xC002001D + 0, + 0x000006C2, // 0xC002001F + 0, + 0x000006C4, // 0xC0020021 + 0x000006C5, // 0xC0020022 + 0x000006C6, // 0xC0020023 + 0x000006C7, // 0xC0020024 + 0x000006C8, // 0xC0020025 + 0x000006C9, // 0xC0020026 + 0, + 0x000006CB, // 0xC0020028 + 0x000006CC, // 0xC0020029 + 0x000006CD, // 0xC002002A + 0x000006CE, // 0xC002002B + 0x000006CF, // 0xC002002C + 0x000006D0, // 0xC002002D + 0x000006D1, // 0xC002002E + 0x000006D2, // 0xC002002F + 0x000006D3, // 0xC0020030 + 0x000006D4, // 0xC0020031 + 0x000006D5, // 0xC0020032 + 0x000006D6, // 0xC0020033 + 0x000006D7, // 0xC0020034 + 0x000006D8, // 0xC0020035 + 0x000006D9, // 0xC0020036 + 0x000006DA, // 0xC0020037 + 0x000006DB, // 0xC0020038 + 0x000006DC, // 0xC0020039 + 0x000006DD, // 0xC002003A + 0x000006DE, // 0xC002003B + 0x000006DF, // 0xC002003C + 0x000006E0, // 0xC002003D + 0x000006E1, // 0xC002003E + 0x000006E2, // 0xC002003F + 0x000006E3, // 0xC0020040 + 0x000006E4, // 0xC0020041 + 0x000006E5, // 0xC0020042 + 0x000006E6, // 0xC0020043 + 0x000006E7, // 0xC0020044 + 0x000006E8, // 0xC0020045 + 0x000006E9, // 0xC0020046 + 0x000006EA, // 0xC0020047 + 0x000006EB, // 0xC0020048 + 0x000006FF, // 0xC0020049 + 0x0000070E, // 0xC002004A + 0x0000076A, // 0xC002004B + 0x0000076B, // 0xC002004C + 0x0000076C, // 0xC002004D + 0, + 0x00000719, // 0xC002004F + 0x0000071A, // 0xC0020050 + 0x0000071B, // 0xC0020051 + 0x0000071C, // 0xC0020052 + 0x0000071D, // 0xC0020053 + 0x0000071E, // 0xC0020054 + 0x0000071F, // 0xC0020055 + 0, + 0x00000721, // 0xC0020057 + 0x00000722, // 0xC0020058 + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0x0000077A, // 0xC0020062 + 0x0000077B, // 0xC0020063 }; const uint32_t error_table_0xC0030001[] = { - 0x000006EC, // 0xC0030001 - 0x000006ED, // 0xC0030002 - 0x000006EE, // 0xC0030003 - 0x00000006, // 0xC0030004 - 0x00000006, // 0xC0030005 - 0x000006F1, // 0xC0030006 - 0x000006F2, // 0xC0030007 - 0x000006F3, // 0xC0030008 - 0x000006F4, // 0xC0030009 - 0x000006F5, // 0xC003000A - 0x000006F6, // 0xC003000B - 0x000006F7, // 0xC003000C + 0x000006EC, // 0xC0030001 + 0x000006ED, // 0xC0030002 + 0x000006EE, // 0xC0030003 + 0x00000006, // 0xC0030004 + 0x00000006, // 0xC0030005 + 0x000006F1, // 0xC0030006 + 0x000006F2, // 0xC0030007 + 0x000006F3, // 0xC0030008 + 0x000006F4, // 0xC0030009 + 0x000006F5, // 0xC003000A + 0x000006F6, // 0xC003000B + 0x000006F7, // 0xC003000C }; const uint32_t error_table_0xC0030059[] = { - 0x00000723, // 0xC0030059 - 0x00000724, // 0xC003005A - 0x00000725, // 0xC003005B - 0x00000726, // 0xC003005C - 0, - 0x00000728, // 0xC003005E - 0x0000077C, // 0xC003005F - 0x0000077D, // 0xC0030060 - 0x0000077E, // 0xC0030061 + 0x00000723, // 0xC0030059 + 0x00000724, // 0xC003005A + 0x00000725, // 0xC003005B + 0x00000726, // 0xC003005C + 0, + 0x00000728, // 0xC003005E + 0x0000077C, // 0xC003005F + 0x0000077D, // 0xC0030060 + 0x0000077E, // 0xC0030061 }; const uint32_t error_table_0xC0050003[] = { - 0x0000045D, // 0xC0050003 - 0x00000456, // 0xC0050004 + 0x0000045D, // 0xC0050003 + 0x00000456, // 0xC0050004 }; const uint32_t error_table_0xC0980001[] = { - 0x00000037, // 0xC0980001 - 0x00000037, // 0xC0980002 - 0, - 0, - 0, - 0, - 0, - 0x00000037, // 0xC0980008 + 0x00000037, // 0xC0980001 + 0x00000037, // 0xC0980002 + 0, 0, 0, 0, 0, + 0x00000037, // 0xC0980008 }; -#define MAKE_ENTRY(x) { ##x, xe::countof(error_table_##x), error_table_##x } +#define MAKE_ENTRY(x) \ + { ##x, xe::countof(error_table_##x), error_table_##x } const error_lookup_table error_tables[] = { - MAKE_ENTRY(0x00000103), - MAKE_ENTRY(0x40000002), - MAKE_ENTRY(0x40020056), - MAKE_ENTRY(0x400200AF), - MAKE_ENTRY(0x80000001), - MAKE_ENTRY(0x80000288), - MAKE_ENTRY(0x80090300), - MAKE_ENTRY(0xC0000001), - MAKE_ENTRY(0xC0000202), - MAKE_ENTRY(0xC0020001), - MAKE_ENTRY(0xC0030001), - MAKE_ENTRY(0xC0030059), - MAKE_ENTRY(0xC0050003), - MAKE_ENTRY(0xC0980001), - { 0, 0, nullptr }, + MAKE_ENTRY(0x00000103), + MAKE_ENTRY(0x40000002), + MAKE_ENTRY(0x40020056), + MAKE_ENTRY(0x400200AF), + MAKE_ENTRY(0x80000001), + MAKE_ENTRY(0x80000288), + MAKE_ENTRY(0x80090300), + MAKE_ENTRY(0xC0000001), + MAKE_ENTRY(0xC0000202), + MAKE_ENTRY(0xC0020001), + MAKE_ENTRY(0xC0030001), + MAKE_ENTRY(0xC0030059), + MAKE_ENTRY(0xC0050003), + MAKE_ENTRY(0xC0980001), + {0, 0, nullptr}, }; #undef MAKE_ENTRY -SHIM_CALL RtlNtStatusToDosError_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t status = SHIM_GET_ARG_32(0); - - XELOGD("RtlNtStatusToDosError(%.4X)", status); - +dword_result_t RtlNtStatusToDosError(dword_t source_status) { + uint32_t status = source_status; if (!status || (status & 0x20000000)) { - SHIM_SET_RETURN_32(status); - return; + return status & 0xFFFF; } - + if ((status >> 16) == 0x8007) { - SHIM_SET_RETURN_32(status & 0xFFFF); - return; + return status & 0xFFFF; } if ((status & 0xF0000000) == 0xD0000000) { @@ -1016,25 +820,20 @@ SHIM_CALL RtlNtStatusToDosError_shim(PPCContext* ppc_context, break; } XELOGE("RtlNtStatusToDosError => %X", result); - SHIM_SET_RETURN_32(result); - return; + return result; } ++error_table; } if ((status >> 16) == 0xC001) { - SHIM_SET_RETURN_32(status & 0xFFFF); - return; + return status & 0xFFFF; } XELOGE("RtlNtStatusToDosError lookup NOT IMPLEMENTED"); - SHIM_SET_RETURN_32(317); // ERROR_MR_MID_NOT_FOUND + return 317; // ERROR_MR_MID_NOT_FOUND } +DECLARE_XBOXKRNL_EXPORT(RtlNtStatusToDosError, + ExportTag::kImportant | ExportTag::kLogResult); } // namespace kernel } // namespace xe - -void xe::kernel::xboxkrnl::RegisterErrorExports( - xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - SHIM_SET_MAPPING("xboxkrnl.exe", RtlNtStatusToDosError, state); -} diff --git a/src/xenia/kernel/xboxkrnl_error.h b/src/xenia/kernel/xboxkrnl_error.h deleted file mode 100644 index c76a569b4..000000000 --- a/src/xenia/kernel/xboxkrnl_error.h +++ /dev/null @@ -1,21 +0,0 @@ -/** - ****************************************************************************** - * Xenia : Xbox 360 Emulator Research Project * - ****************************************************************************** - * Copyright 2013 Ben Vanik. All rights reserved. * - * Released under the BSD license - see LICENSE in the root for more details. * - ****************************************************************************** - */ - -#ifndef XENIA_KERNEL_XBOXKRNL_ERROR_H_ -#define XENIA_KERNEL_XBOXKRNL_ERROR_H_ - -#include "xenia/xbox.h" - -namespace xe { -namespace kernel { - -} // namespace kernel -} // namespace xe - -#endif // XENIA_KERNEL_XBOXKRNL_ERROR_H_ diff --git a/src/xenia/kernel/xboxkrnl_hal.cc b/src/xenia/kernel/xboxkrnl_hal.cc index 2655f3b4b..df341dd44 100644 --- a/src/xenia/kernel/xboxkrnl_hal.cc +++ b/src/xenia/kernel/xboxkrnl_hal.cc @@ -16,12 +16,7 @@ namespace xe { namespace kernel { -SHIM_CALL HalReturnToFirmware_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t routine = SHIM_GET_ARG_32(0); - - XELOGD("HalReturnToFirmware(%d)", routine); - +void HalReturnToFirmware(dword_t routine) { // void // IN FIRMWARE_REENTRY Routine @@ -33,11 +28,7 @@ SHIM_CALL HalReturnToFirmware_shim(PPCContext* ppc_context, XELOGE("Game requested shutdown via HalReturnToFirmware"); exit(0); } +DECLARE_XBOXKRNL_EXPORT(HalReturnToFirmware, ExportTag::kImportant); } // namespace kernel } // namespace xe - -void xe::kernel::xboxkrnl::RegisterHalExports( - xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - SHIM_SET_MAPPING("xboxkrnl.exe", HalReturnToFirmware, state); -} diff --git a/src/xenia/kernel/xboxkrnl_module.cc b/src/xenia/kernel/xboxkrnl_module.cc index c14cbcdfc..464c12cc3 100644 --- a/src/xenia/kernel/xboxkrnl_module.cc +++ b/src/xenia/kernel/xboxkrnl_module.cc @@ -30,9 +30,6 @@ XboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state) // Register all exported functions. xboxkrnl::RegisterAudioExports(export_resolver_, kernel_state_); xboxkrnl::RegisterAudioXmaExports(export_resolver_, kernel_state_); - xboxkrnl::RegisterDebugExports(export_resolver_, kernel_state_); - xboxkrnl::RegisterErrorExports(export_resolver_, kernel_state_); - xboxkrnl::RegisterHalExports(export_resolver_, kernel_state_); xboxkrnl::RegisterIoExports(export_resolver_, kernel_state_); xboxkrnl::RegisterMemoryExports(export_resolver_, kernel_state_); xboxkrnl::RegisterMiscExports(export_resolver_, kernel_state_); @@ -41,7 +38,6 @@ XboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state) xboxkrnl::RegisterRtlExports(export_resolver_, kernel_state_); xboxkrnl::RegisterStringExports(export_resolver_, kernel_state_); xboxkrnl::RegisterThreadingExports(export_resolver_, kernel_state_); - xboxkrnl::RegisterUsbcamExports(export_resolver_, kernel_state_); xboxkrnl::RegisterVideoExports(export_resolver_, kernel_state_); // KeDebugMonitorData (?*) diff --git a/src/xenia/kernel/xboxkrnl_private.h b/src/xenia/kernel/xboxkrnl_private.h index be0ff9267..501cb221a 100644 --- a/src/xenia/kernel/xboxkrnl_private.h +++ b/src/xenia/kernel/xboxkrnl_private.h @@ -25,12 +25,6 @@ void RegisterAudioExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); void RegisterAudioXmaExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); -void RegisterDebugExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state); -void RegisterErrorExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state); -void RegisterHalExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state); void RegisterIoExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); void RegisterMemoryExports(xe::cpu::ExportResolver* export_resolver, @@ -47,8 +41,6 @@ void RegisterStringExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); void RegisterThreadingExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); -void RegisterUsbcamExports(xe::cpu::ExportResolver* export_resolver, - KernelState* kernel_state); void RegisterVideoExports(xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state); } // namespace xboxkrnl diff --git a/src/xenia/kernel/xboxkrnl_strings.cc b/src/xenia/kernel/xboxkrnl_strings.cc index ee823aef6..e87bca78c 100644 --- a/src/xenia/kernel/xboxkrnl_strings.cc +++ b/src/xenia/kernel/xboxkrnl_strings.cc @@ -961,6 +961,28 @@ SHIM_CALL _vscwprintf_shim(PPCContext* ppc_context, KernelState* kernel_state) { SHIM_SET_RETURN_32(count); } +SHIM_CALL DbgPrint_shim(PPCContext* ppc_context, KernelState* kernel_state) { + uint32_t format_ptr = SHIM_GET_ARG_32(0); + if (!format_ptr) { + SHIM_SET_RETURN_32(X_STATUS_INVALID_PARAMETER); + return; + } + auto format = (const uint8_t*)SHIM_MEM_ADDR(format_ptr); + + StackArgList args(ppc_context); + StringFormatData data(format); + + int32_t count = format_core(ppc_context, data, args, false); + if (count <= 0) { + SHIM_SET_RETURN_32(X_STATUS_SUCCESS); + return; + } + + XELOGD("(DbgPrint) %s", data.str().c_str()); + + SHIM_SET_RETURN_32(X_STATUS_SUCCESS); +} + } // namespace kernel } // namespace xe @@ -971,4 +993,5 @@ void xe::kernel::xboxkrnl::RegisterStringExports( SHIM_SET_MAPPING("xboxkrnl.exe", _vsnprintf, state); SHIM_SET_MAPPING("xboxkrnl.exe", vswprintf, state); SHIM_SET_MAPPING("xboxkrnl.exe", _vscwprintf, state); + SHIM_SET_MAPPING("xboxkrnl.exe", DbgPrint, state); } diff --git a/src/xenia/kernel/xboxkrnl_usbcam.cc b/src/xenia/kernel/xboxkrnl_usbcam.cc index 976b58bb7..c118c7a9c 100644 --- a/src/xenia/kernel/xboxkrnl_usbcam.cc +++ b/src/xenia/kernel/xboxkrnl_usbcam.cc @@ -16,30 +16,19 @@ namespace xe { namespace kernel { -SHIM_CALL XUsbcamCreate_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - uint32_t unk1 = SHIM_GET_ARG_32(0); // E - uint32_t unk2 = SHIM_GET_ARG_32(1); // 0x4B000 - uint32_t unk3_ptr = SHIM_GET_ARG_32(3); - - XELOGD("XUsbcamCreate(%.8X, %.8X, %.8X)", unk1, unk2, unk3_ptr); - +dword_result_t XUsbcamCreate(unknown_t unk1, // E + unknown_t unk2, // 0x4B000 + lpunknown_t unk3_ptr) { // 0 = success. - SHIM_SET_RETURN_32(X_ERROR_DEVICE_NOT_CONNECTED); + return X_ERROR_DEVICE_NOT_CONNECTED; } +DECLARE_XBOXKRNL_EXPORT(XUsbcamCreate, ExportTag::kStub); -SHIM_CALL XUsbcamGetState_shim(PPCContext* ppc_context, - KernelState* kernel_state) { - XELOGD("XUsbcamGetState()"); +dword_result_t XUsbcamGetState() { // 0 = not connected. - SHIM_SET_RETURN_32(0); + return 0; } +DECLARE_XBOXKRNL_EXPORT(XUsbcamGetState, ExportTag::kStub); } // namespace kernel } // namespace xe - -void xe::kernel::xboxkrnl::RegisterUsbcamExports( - xe::cpu::ExportResolver* export_resolver, KernelState* kernel_state) { - SHIM_SET_MAPPING("xboxkrnl.exe", XUsbcamCreate, state); - SHIM_SET_MAPPING("xboxkrnl.exe", XUsbcamGetState, state); -} diff --git a/src/xenia/kernel/xboxkrnl_video.cc b/src/xenia/kernel/xboxkrnl_video.cc index d225d003d..47f2c8089 100644 --- a/src/xenia/kernel/xboxkrnl_video.cc +++ b/src/xenia/kernel/xboxkrnl_video.cc @@ -115,8 +115,8 @@ DECLARE_XBOXKRNL_EXPORT(VdSetDisplayModeOverride, ExportTag::kVideo | ExportTag::kStub); dword_result_t VdInitializeEngines(unknown_t unk0, function_t callback, - unknown_t unk1, unknown_pointer_t unk2_ptr, - unknown_pointer_t unk3_ptr) { + unknown_t unk1, lpunknown_t unk2_ptr, + lpunknown_t unk3_ptr) { // r3 = 0x4F810000 // r4 = function ptr (cleanup callback?) // r5 = 0 @@ -175,8 +175,7 @@ void VdEnableRingBufferRPtrWriteBack(lpvoid_t ptr, int_t block_size) { } DECLARE_XBOXKRNL_EXPORT(VdEnableRingBufferRPtrWriteBack, ExportTag::kVideo); -void VdGetSystemCommandBuffer(unknown_pointer_t p0_ptr, - unknown_pointer_t p1_ptr) { +void VdGetSystemCommandBuffer(lpunknown_t p0_ptr, lpunknown_t p1_ptr) { p0_ptr.Zero(0x94); xe::store_and_swap(p0_ptr, 0xBEEF0000); xe::store_and_swap(p1_ptr, 0xBEEF0001); @@ -184,7 +183,7 @@ void VdGetSystemCommandBuffer(unknown_pointer_t p0_ptr, DECLARE_XBOXKRNL_EXPORT(VdGetSystemCommandBuffer, ExportTag::kVideo | ExportTag::kStub); -void VdSetSystemCommandBufferGpuIdentifierAddress(unknown_pointer_t unk) { +void VdSetSystemCommandBufferGpuIdentifierAddress(lpunknown_t unk) { // r3 = 0x2B10(d3d?) + 8 } DECLARE_XBOXKRNL_EXPORT(VdSetSystemCommandBufferGpuIdentifierAddress, @@ -196,16 +195,16 @@ DECLARE_XBOXKRNL_EXPORT(VdSetSystemCommandBufferGpuIdentifierAddress, // no op? dword_result_t VdInitializeScalerCommandBuffer( - unknown_t unk0, // 0? - unknown_t unk1, // 0x050002d0 size of ? - unknown_t unk2, // 0? - unknown_t unk3, // 0x050002d0 size of ? - unknown_t unk4, // 0x050002d0 size of ? - unknown_t unk5, // 7? - unknown_pointer_t unk6, // 0x2004909c <-- points to zeros? - unknown_t unk7, // 7? - lpvoid_t dest_ptr // Points to the first 80000000h where the memcpy - // sources from. + unknown_t unk0, // 0? + unknown_t unk1, // 0x050002d0 size of ? + unknown_t unk2, // 0? + unknown_t unk3, // 0x050002d0 size of ? + unknown_t unk4, // 0x050002d0 size of ? + unknown_t unk5, // 7? + lpunknown_t unk6, // 0x2004909c <-- points to zeros? + unknown_t unk7, // 7? + lpvoid_t dest_ptr // Points to the first 80000000h where the memcpy + // sources from. ) { // We could fake the commands here, but I'm not sure the game checks for // anything but success (non-zero ret). @@ -290,14 +289,13 @@ dword_result_t VdRetrainEDRAM(unknown_t unk0, unknown_t unk1, unknown_t unk2, } DECLARE_XBOXKRNL_EXPORT(VdRetrainEDRAM, ExportTag::kVideo | ExportTag::kStub); -void VdSwap( - lpvoid_t buffer_ptr, // ptr into primary ringbuffer - lpvoid_t fetch_ptr, // frontbuffer texture fetch - unknown_t unk2, // - unknown_pointer_t unk3, // buffer from VdGetSystemCommandBuffer - unknown_pointer_t unk4, // from VdGetSystemCommandBuffer (0xBEEF0001) - lpdword_t frontbuffer_ptr, // ptr to frontbuffer address - lpdword_t color_format_ptr, lpdword_t color_space_ptr) { +void VdSwap(lpvoid_t buffer_ptr, // ptr into primary ringbuffer + lpvoid_t fetch_ptr, // frontbuffer texture fetch + unknown_t unk2, // + lpunknown_t unk3, // buffer from VdGetSystemCommandBuffer + lpunknown_t unk4, // from VdGetSystemCommandBuffer (0xBEEF0001) + lpdword_t frontbuffer_ptr, // ptr to frontbuffer address + lpdword_t color_format_ptr, lpdword_t color_space_ptr) { gpu::xenos::xe_gpu_texture_fetch_t fetch; xe::copy_and_swap_32_unaligned( reinterpret_cast(&fetch),