diff --git a/src/xenia/apu/audio_system.cc b/src/xenia/apu/audio_system.cc index f19be8b5c..7a1209238 100644 --- a/src/xenia/apu/audio_system.cc +++ b/src/xenia/apu/audio_system.cc @@ -104,13 +104,20 @@ bool AudioSystem::HandlesRegister(uint32_t addr) { return (addr & 0xFFFF0000) == 0x7FEA0000; } +// free60 may be useful here, however it looks like it's using a different +// piece of hardware: +// https://github.com/Free60Project/libxenon/blob/master/libxenon/drivers/xenon_sound/sound.c + uint64_t AudioSystem::ReadRegister(uint32_t addr) { uint32_t r = addr & 0xFFFF; XELOGAPU("ReadRegister(%.4X)", r); + // 1800h is read on startup and stored -- context? buffers? + // 1818h is read during a lock? return 0; } void AudioSystem::WriteRegister(uint32_t addr, uint64_t value) { uint32_t r = addr & 0xFFFF; XELOGAPU("WriteRegister(%.4X, %.8X)", r, value); + // 1804h is written to with 0x02000000 and 0x03000000 around a lock operation } \ No newline at end of file diff --git a/src/xenia/kernel/xboxkrnl/sources.gypi b/src/xenia/kernel/xboxkrnl/sources.gypi index 0482574bf..95fad3a1d 100644 --- a/src/xenia/kernel/xboxkrnl/sources.gypi +++ b/src/xenia/kernel/xboxkrnl/sources.gypi @@ -7,6 +7,8 @@ 'kernel_state.h', 'object_table.cc', 'object_table.h', + 'xboxkrnl_audio.cc', + 'xboxkrnl_audio.h', 'xboxkrnl_debug.cc', 'xboxkrnl_debug.h', 'xboxkrnl_hal.cc', diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_audio.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_audio.cc new file mode 100644 index 000000000..16e4bdcef --- /dev/null +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_audio.cc @@ -0,0 +1,83 @@ +/** + ****************************************************************************** + * 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 +#include + + +using namespace xe; +using namespace xe::apu; +using namespace xe::kernel; +using namespace xe::kernel::xboxkrnl; + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +SHIM_CALL XMACreateContext_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + uint32_t context_ptr = SHIM_GET_ARG_32(0); + + XELOGD( + "XMACreateContext(%.8X)", + context_ptr); + + // TODO(benvanik): allocate and return -- see if size required or just dummy? + + SHIM_SET_RETURN(X_ERROR_ACCESS_DENIED); +} + + +SHIM_CALL XMAReleaseContext_shim( + xe_ppc_state_t* ppc_state, KernelState* state) { + uint32_t context_ptr = SHIM_GET_ARG_32(0); + + XELOGD( + "XMAReleaseContext(%.8X)", + context_ptr); + + // TODO(benvanik): free +} + + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +void xe::kernel::xboxkrnl::RegisterAudioExports( + ExportResolver* export_resolver, KernelState* state) { + SHIM_SET_MAPPING("xboxkrnl.exe", XMACreateContext, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAInitializeContext, state); + SHIM_SET_MAPPING("xboxkrnl.exe", XMAReleaseContext, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAEnableContext, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMADisableContext, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAGetOutputBufferWriteOffset, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetOutputBufferReadOffset, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAGetOutputBufferReadOffset, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetOutputBufferValid, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAIsOutputBufferValid, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetInputBuffer0Valid, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAIsInputBuffer0Valid, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetInputBuffer1Valid, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAIsInputBuffer1Valid, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetInputBuffer0, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetInputBuffer1, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAGetPacketMetadata, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMABlockWhileInUse, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetLoopData, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMASetInputBufferReadOffset, state); + // SHIM_SET_MAPPING("xboxkrnl.exe", XMAGetInputBufferReadOffset, state); +} diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_audio.h b/src/xenia/kernel/xboxkrnl/xboxkrnl_audio.h new file mode 100644 index 000000000..24068e20a --- /dev/null +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_audio.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_XBOXKRNL_AUDIO_H_ +#define XENIA_KERNEL_XBOXKRNL_AUDIO_H_ + +#include +#include + +#include + + +namespace xe { +namespace kernel { +namespace xboxkrnl { + + +} // namespace xboxkrnl +} // namespace kernel +} // namespace xe + + +#endif // XENIA_KERNEL_XBOXKRNL_AUDIO_H_ diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_private.h b/src/xenia/kernel/xboxkrnl/xboxkrnl_private.h index 02fb79521..cd0782ee2 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_private.h +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_private.h @@ -29,6 +29,7 @@ class KernelState; extern KernelState* shared_kernel_state_; // Registration functions, one per file. +void RegisterAudioExports(ExportResolver* export_resolver, KernelState* state); void RegisterDebugExports(ExportResolver* export_resolver, KernelState* state); void RegisterHalExports(ExportResolver* export_resolver, KernelState* state); void RegisterIoExports(ExportResolver* export_resolver, KernelState* state);