diff --git a/src/xenia/kernel/sources.gypi b/src/xenia/kernel/sources.gypi index e60e6772e..5880d03d7 100644 --- a/src/xenia/kernel/sources.gypi +++ b/src/xenia/kernel/sources.gypi @@ -21,6 +21,8 @@ 'xam_input.h', 'xam_module.cc', 'xam_module.h', + 'xam_msg.cc', + 'xam_msg.h', 'xam_net.cc', 'xam_net.h', 'xam_notify.cc', diff --git a/src/xenia/kernel/xam_module.cc b/src/xenia/kernel/xam_module.cc index 32bce4bab..494863fd3 100644 --- a/src/xenia/kernel/xam_module.cc +++ b/src/xenia/kernel/xam_module.cc @@ -34,6 +34,7 @@ XamModule::XamModule(Emulator* emulator, KernelState* kernel_state) : RegisterContentExports(export_resolver_, kernel_state); RegisterInfoExports(export_resolver_, kernel_state); RegisterInputExports(export_resolver_, kernel_state); + RegisterMsgExports(export_resolver_, kernel_state); RegisterNetExports(export_resolver_, kernel_state); RegisterNotifyExports(export_resolver_, kernel_state); RegisterUserExports(export_resolver_, kernel_state); diff --git a/src/xenia/kernel/xam_msg.cc b/src/xenia/kernel/xam_msg.cc new file mode 100644 index 000000000..8be215dfc --- /dev/null +++ b/src/xenia/kernel/xam_msg.cc @@ -0,0 +1,81 @@ +/** + ****************************************************************************** + * 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. * + ****************************************************************************** + */ + +#include + +#include +#include +#include + + +using namespace xe; +using namespace xe::kernel; +using namespace xe::kernel::xam; + + +namespace xe { +namespace kernel { + + +SHIM_CALL XMsgInProcessCall_shim( + PPCContext* ppc_state, KernelState* state) { + uint32_t app = SHIM_GET_ARG_32(0); + uint32_t message = SHIM_GET_ARG_32(1); + uint32_t arg1 = SHIM_GET_ARG_32(2); + uint32_t arg2 = SHIM_GET_ARG_32(3); + + XELOGD( + "XMsgInProcessCall(%.8X, %.8X, %.8X, %.8X)", + app, message, arg1, arg2); + + bool handled = false; + + // TODO(benvanik): build XMsg pump? async/sync/etc + if (app == 0xFA) { + // XMP = music + // http://freestyledash.googlecode.com/svn-history/r1/trunk/Freestyle/Scenes/Media/Music/ScnMusic.cpp + if (message == 0x00070009) { + uint32_t a = SHIM_MEM_32(arg1 + 0); // 0x00000002 + uint32_t b = SHIM_MEM_32(arg1 + 4); // out ptr to 4b - expect 0 + XELOGD("XMPGetStatusEx(%.8X, %.8X)", a, b); + XEASSERTZERO(arg2); + XEASSERT(a == 2); + SHIM_SET_MEM_32(b, 0); + handled = true; + } else if (message == 0x0007001A) { + // dcz + // arg1 = ? + // arg2 = 0 + } else if (message == 0x0007001B) { + uint32_t a = SHIM_MEM_32(arg1 + 0); // 0x00000002 + uint32_t b = SHIM_MEM_32(arg1 + 4); // out ptr to 4b - expect 0 + XELOGD("XMPGetStatus(%.8X, %.8X)", a, b); + XEASSERTZERO(arg2); + XEASSERT(a == 2); + SHIM_SET_MEM_32(b, 0); + handled = true; + } + } + + if (!handled) { + XELOGE("Unimplemented XMsgInProcessCall message!"); + } + + SHIM_SET_RETURN(handled ? X_ERROR_SUCCESS : X_ERROR_NOT_FOUND); +} + + +} // namespace kernel +} // namespace xe + + +void xe::kernel::xam::RegisterMsgExports( + ExportResolver* export_resolver, KernelState* state) { + SHIM_SET_MAPPING("xam.xex", XMsgInProcessCall, state); +} diff --git a/src/xenia/kernel/xam_msg.h b/src/xenia/kernel/xam_msg.h new file mode 100644 index 000000000..fb5f3b327 --- /dev/null +++ b/src/xenia/kernel/xam_msg.h @@ -0,0 +1,29 @@ +/** + ****************************************************************************** + * 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_XAM_MSG_H_ +#define XENIA_KERNEL_XAM_MSG_H_ + +#include +#include + +#include + + +namespace xe { +namespace kernel { + + + + +} // namespace kernel +} // namespace xe + + +#endif // XENIA_KERNEL_XAM_MSG_H_ diff --git a/src/xenia/kernel/xam_private.h b/src/xenia/kernel/xam_private.h index 43953c5f8..d1cc95ce7 100644 --- a/src/xenia/kernel/xam_private.h +++ b/src/xenia/kernel/xam_private.h @@ -26,6 +26,7 @@ namespace xam { void RegisterContentExports(ExportResolver* export_resolver, KernelState* state); void RegisterInfoExports(ExportResolver* export_resolver, KernelState* state); void RegisterInputExports(ExportResolver* export_resolver, KernelState* state); +void RegisterMsgExports(ExportResolver* export_resolver, KernelState* state); void RegisterNetExports(ExportResolver* export_resolver, KernelState* state); void RegisterNotifyExports(ExportResolver* export_resolver, KernelState* state); void RegisterUserExports(ExportResolver* export_resolver, KernelState* state);