diff --git a/configure.py b/configure.py index e2f016508..ad9dd4698 100644 --- a/configure.py +++ b/configure.py @@ -660,7 +660,7 @@ config.libs = [ Object(NonMatching, "JSystem/JAudio/JASProbe.cpp"), Object(NonMatching, "JSystem/JAudio/JASKernelDebug.cpp"), Object(NonMatching, "JSystem/JAudio/JASCmdStack.cpp"), - Object(NonMatching, "JSystem/JAudio/JASSystemHeap.cpp"), + Object(Matching, "JSystem/JAudio/JASSystemHeap.cpp"), Object(NonMatching, "JSystem/JAudio/JASNoteMgr.cpp"), Object(NonMatching, "JSystem/JAudio/JASOuterParam.cpp"), Object(NonMatching, "JSystem/JAudio/JASPlayer_impl.cpp"), diff --git a/include/JSystem/JAudio/JASSystemHeap.h b/include/JSystem/JAudio/JASSystemHeap.h new file mode 100644 index 000000000..e42bfc34a --- /dev/null +++ b/include/JSystem/JAudio/JASSystemHeap.h @@ -0,0 +1,27 @@ +#ifndef JASSYSTEMHEAP_H +#define JASSYSTEMHEAP_H + +#include "dolphin/types.h" + +class JKRSolidHeap; + +extern JKRSolidHeap* JASDram; + +namespace JASystem { + namespace Kernel { + class TSolidHeap; + + void sysDramSetup(JKRSolidHeap*); + void* allocFromSysDram(u32); + void sysAramSetup(u32); + void allocFromSysAramFull(u32*); + + extern TSolidHeap audioAramHeap; + extern u32 audioDramSize; + extern u32 audioAramSize; + extern int audioAramTop; + extern int CARD_SECURITY_BUFFER; + } +} + +#endif /* JASSYSTEMHEAP_H */ diff --git a/include/JSystem/JKernel/JKRStdHeap.h b/include/JSystem/JKernel/JKRStdHeap.h index c52c875bb..677e24c5e 100644 --- a/include/JSystem/JKernel/JKRStdHeap.h +++ b/include/JSystem/JKernel/JKRStdHeap.h @@ -5,6 +5,7 @@ #include "dolphin/os/OSAlloc.h" class JKRStdHeap : public JKRHeap { +public: static JKRStdHeap* create(u32, JKRHeap*, bool); void do_destroy(); JKRStdHeap(void*, u32, JKRHeap*, bool); @@ -31,4 +32,4 @@ class JKRStdHeap : public JKRHeap { OSHeapHandle mHeapHandle; }; -#endif /* JKRSTDHEAP_H */ \ No newline at end of file +#endif /* JKRSTDHEAP_H */ diff --git a/include/dolphin/ar/ar.h b/include/dolphin/ar/ar.h index c04e41f1d..a7c4f9242 100644 --- a/include/dolphin/ar/ar.h +++ b/include/dolphin/ar/ar.h @@ -14,6 +14,7 @@ u32 ARGetDMAStatus(void); void ARStartDMA(u32 type, u32 mainmem_addr, u32 aram_addr, u32 length); u32 ARInit(u32* stack_index_addr, u32 num_entries); u32 ARAlloc(u32 length); +u32 ARGetBaseAddress(); u32 ARGetSize(void); #ifdef __cplusplus diff --git a/src/JSystem/JAudio/JASSystemHeap.cpp b/src/JSystem/JAudio/JASSystemHeap.cpp index 53b46dd98..6f6daf828 100644 --- a/src/JSystem/JAudio/JASSystemHeap.cpp +++ b/src/JSystem/JAudio/JASSystemHeap.cpp @@ -3,31 +3,57 @@ // Translation Unit: JASSystemHeap.cpp // -#include "JASSystemHeap.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JAudio/JASHeapCtrl.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JKernel/JKRStdHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/ar/ar.h" +#include "dolphin/os/OS.h" + +u32 JASystem::Kernel::audioDramSize = 0x000C8000; +JKRSolidHeap* JASDram; /* 8027DB38-8027DB9C .text sysDramSetup__Q28JASystem6KernelFP12JKRSolidHeap */ -void JASystem::Kernel::sysDramSetup(JKRSolidHeap*) { +void JASystem::Kernel::sysDramSetup(JKRSolidHeap* heap) { /* Nonmatching */ + if (heap) { + JASDram = heap; + return; + } + OSReport("[JASKernel::sysDramSetup] メモリ指定がありませんので、システムからオーディオヒープを取得します。\n"); + JASDram = JKRSolidHeap::create(audioDramSize, JKRStdHeap::create(audioDramSize + 0x100, NULL, false), false); } /* 8027DB9C-8027DC30 .text allocFromSysDram__Q28JASystem6KernelFUl */ -void JASystem::Kernel::allocFromSysDram(unsigned long) { - /* Nonmatching */ +void* JASystem::Kernel::allocFromSysDram(u32 size) { + void* ptr; + BOOL enable = OSDisableInterrupts(); + ptr = new (JASDram, 0x20) u8[size]; + JUT_ASSERT(79, ptr != 0); + OSRestoreInterrupts(enable); + return ptr; } +JASystem::Kernel::TSolidHeap JASystem::Kernel::audioAramHeap; +u32 JASystem::Kernel::audioAramSize = 0x00400000; +int JASystem::Kernel::audioAramTop; +int JASystem::Kernel::CARD_SECURITY_BUFFER; + /* 8027DC30-8027DC84 .text sysAramSetup__Q28JASystem6KernelFUl */ -void JASystem::Kernel::sysAramSetup(unsigned long) { +void JASystem::Kernel::sysAramSetup(u32 param_1) { /* Nonmatching */ + if (!param_1) { + param_1 = audioAramSize; + } + audioAramTop = ARGetBaseAddress(); + CARD_SECURITY_BUFFER = 0x40; + audioAramHeap.init((u8*)audioAramTop, param_1 - audioAramTop); } /* 8027DC84-8027DCDC .text allocFromSysAramFull__Q28JASystem6KernelFPUl */ -void JASystem::Kernel::allocFromSysAramFull(unsigned long*) { - /* Nonmatching */ +void JASystem::Kernel::allocFromSysAramFull(u32* param_1) { + u32 size = audioAramHeap.getRemain(); + audioAramHeap.alloc(size - 0x20); + *param_1 = size - 0x20; } - -/* 8027DD18-8027DD54 .text __dt__Q38JASystem6Kernel10TSolidHeapFv */ -JASystem::Kernel::TSolidHeap::~TSolidHeap() { - /* Nonmatching */ -} -