Match some functions, relocate m_target to MxThread

This commit is contained in:
Christian Semmler 2023-10-29 09:56:00 -04:00
parent 80d853e440
commit 99a17a744d
6 changed files with 53 additions and 56 deletions

View File

@ -10,14 +10,13 @@ DECOMP_SIZE_ASSERT(MxDiskStreamProvider, 0x60);
// OFFSET: LEGO1 0x100d0f30 // OFFSET: LEGO1 0x100d0f30
MxResult MxDiskStreamProviderThread::Run() MxResult MxDiskStreamProviderThread::Run()
{ {
if (m_target != NULL) if (m_target)
m_target->WaitForWorkToComplete(); ((MxDiskStreamProvider*) m_target)->WaitForWorkToComplete();
MxThread::Run(); MxThread::Run();
// They should probably have writen "return MxThread::Run()" but they didn't. // They should probably have writen "return MxThread::Run()" but they didn't.
return SUCCESS; return SUCCESS;
} }
// Same offset with MxTickleThread::StartWithTarget is intentional
// OFFSET: LEGO1 0x100d0f50 // OFFSET: LEGO1 0x100d0f50
MxResult MxDiskStreamProviderThread::StartWithTarget(MxDiskStreamProvider* p_target) MxResult MxDiskStreamProviderThread::StartWithTarget(MxDiskStreamProvider* p_target)
{ {
@ -33,13 +32,44 @@ MxDiskStreamProvider::MxDiskStreamProvider()
this->m_unk35 = 0; this->m_unk35 = 0;
} }
// OFFSET: LEGO1 0x100d1240 // OFFSET: LEGO1 0x100d1240 STUB
MxDiskStreamProvider::~MxDiskStreamProvider() MxDiskStreamProvider::~MxDiskStreamProvider()
{ {
// TODO // TODO
} }
// Matching but with esi / edi swapped // OFFSET: LEGO1 0x100d13d0
MxResult MxDiskStreamProvider::SetResourceToGet(MxStreamController* p_resource)
{
MxResult result = FAILURE;
MxString path;
m_pLookup = p_resource;
path = (MxString(MxOmni::GetHD()) + p_resource->GetAtom().GetInternal() + ".si");
m_pFile = new MxDSFile(path.GetData(), 0);
if (m_pFile != NULL) {
if (m_pFile->Open(0) != 0) {
path = MxString(MxOmni::GetCD()) + p_resource->GetAtom().GetInternal() + ".si";
m_pFile->SetFileName(path.GetData());
if (m_pFile->Open(0) != 0)
goto done;
}
m_remainingWork = 1;
MxResult success = m_busySemaphore.Init(0, 100);
m_thread.StartWithTarget(this);
if (success == SUCCESS && p_resource != NULL) {
result = SUCCESS;
}
}
done:
return result;
}
// OFFSET: LEGO1 0x100d1750 // OFFSET: LEGO1 0x100d1750
MxResult MxDiskStreamProvider::WaitForWorkToComplete() MxResult MxDiskStreamProvider::WaitForWorkToComplete()
{ {
@ -57,34 +87,6 @@ void MxDiskStreamProvider::PerformWork()
// TODO // TODO
} }
// OFFSET: LEGO1 0x100d13d0
MxResult MxDiskStreamProvider::SetResourceToGet(MxStreamController* p_resource)
{
m_pLookup = p_resource;
MxString path = MxString(MxOmni::GetHD()) + p_resource->GetAtom().GetInternal() + ".si";
MxDSFile* file = new MxDSFile(path.GetData(), 0);
m_pFile = file;
if (file != NULL) {
if (file->Open(0) != 0) {
path = MxString(MxOmni::GetCD()) + p_resource->GetAtom().GetInternal() + ".si";
file->SetFileName(path);
if (file->Open(0) != 0) {
return FAILURE;
}
}
m_remainingWork = 1;
MxResult success = m_busySemaphore.Init(0, 100);
m_thread.StartWithTarget(this);
if (success == SUCCESS && p_resource != NULL) {
return SUCCESS;
}
}
return FAILURE;
}
// OFFSET: LEGO1 0x100d1e90 // OFFSET: LEGO1 0x100d1e90
MxU32 MxDiskStreamProvider::GetFileSize() MxU32 MxDiskStreamProvider::GetFileSize()
{ {

View File

@ -13,14 +13,11 @@ class MxDiskStreamProvider;
class MxDiskStreamProviderThread : public MxThread { class MxDiskStreamProviderThread : public MxThread {
public: public:
// Only inlined, no offset // Only inlined, no offset
inline MxDiskStreamProviderThread() : MxThread(), m_target(NULL) {} inline MxDiskStreamProviderThread() : MxThread() { m_target = NULL; }
MxResult Run() override; MxResult Run() override;
MxResult StartWithTarget(MxDiskStreamProvider* p_target); MxResult StartWithTarget(MxDiskStreamProvider* p_target);
private:
MxDiskStreamProvider* m_target;
}; };
// VTABLE 0x100dd138 // VTABLE 0x100dd138

View File

@ -32,7 +32,7 @@ class MxDSFile : public MxDSSource {
__declspec(dllexport) virtual MxULong GetBufferSize(); // vtable+0x28 __declspec(dllexport) virtual MxULong GetBufferSize(); // vtable+0x28
__declspec(dllexport) virtual MxULong GetStreamBuffersNum(); // vtable+0x2c __declspec(dllexport) virtual MxULong GetStreamBuffersNum(); // vtable+0x2c
inline void SetFileName(MxString p_filename) { m_filename = p_filename; } inline void SetFileName(const char* p_filename) { m_filename = p_filename; }
private: private:
MxLong ReadChunks(); MxLong ReadChunks();

View File

@ -18,15 +18,21 @@ MxResult MxRAMStreamController::Open(const char* p_filename)
if (MxStreamController::Open(p_filename) != SUCCESS) { if (MxStreamController::Open(p_filename) != SUCCESS) {
return FAILURE; return FAILURE;
} }
MxRAMStreamProvider* provider = new MxRAMStreamProvider();
m_provider = provider; m_provider = new MxRAMStreamProvider();
if (provider != NULL) { if (((MxRAMStreamProvider*) m_provider) != NULL) {
if (m_provider->SetResourceToGet(this) != SUCCESS) { if (m_provider->SetResourceToGet(this) != SUCCESS) {
return FAILURE; return FAILURE;
} }
FUN_100d0d80(provider->GetBufferOfFileSize(), provider->GetFileSize()); FUN_100d0d80(
m_buffer.FUN_100c6780(provider->GetBufferOfFileSize(), provider->GetFileSize()); ((MxRAMStreamProvider*) m_provider)->GetBufferOfFileSize(),
((MxRAMStreamProvider*) m_provider)->GetFileSize()
);
m_buffer.FUN_100c6780(
((MxRAMStreamProvider*) m_provider)->GetBufferOfFileSize(),
((MxRAMStreamProvider*) m_provider)->GetFileSize()
);
return SUCCESS; return SUCCESS;
} }

View File

@ -68,13 +68,6 @@ MxTickleThread::MxTickleThread(MxCore* p_target, int p_frequencyMS)
m_frequencyMS = p_frequencyMS; m_frequencyMS = p_frequencyMS;
} }
// OFFSET: LEGO1 0x100d0f50
MxResult MxTickleThread::StartWithTarget(MxCore* p_target)
{
m_target = p_target;
return Start(0x1000, 0);
}
// Match except for register allocation // Match except for register allocation
// OFFSET: LEGO1 0x100b8c90 // OFFSET: LEGO1 0x100b8c90
MxResult MxTickleThread::Run() MxResult MxTickleThread::Run()

View File

@ -7,6 +7,7 @@
class MxCore; class MxCore;
// VTABLE 0x100dc860
class MxThread { class MxThread {
public: public:
// Note: Comes before virtual destructor // Note: Comes before virtual destructor
@ -34,24 +35,22 @@ class MxThread {
MxU32 m_threadId; MxU32 m_threadId;
MxBool m_running; MxBool m_running;
MxSemaphore m_semaphore; MxSemaphore m_semaphore;
protected:
MxCore* m_target;
}; };
// VTABLE 0x100dc6d8
class MxTickleThread : public MxThread { class MxTickleThread : public MxThread {
public: public:
MxTickleThread(MxCore* p_target, int p_frequencyMS); MxTickleThread(MxCore* p_target, int p_frequencyMS);
// Unclear at this time whether this function and the m_target field are
// actually a general "userdata" pointer in the base MxThread, but it seems
// like the only usage is with an MxTickleThread.
MxResult StartWithTarget(MxCore* p_target);
// Only inlined, no offset // Only inlined, no offset
virtual ~MxTickleThread() {} virtual ~MxTickleThread() {}
MxResult Run() override; MxResult Run() override;
private: private:
MxCore* m_target;
MxS32 m_frequencyMS; MxS32 m_frequencyMS;
}; };