diff options
| author | Jcw87 <Jcw87@users.noreply.github.com> | 2023-10-22 13:48:03 -0700 |
|---|---|---|
| committer | Jcw87 <Jcw87@users.noreply.github.com> | 2023-10-23 00:05:04 -0700 |
| commit | 73a595b83cf3376d799faa68e25dbb52239344f2 (patch) | |
| tree | 9219da512d6c33e1cfd348e5e93042c2472906e9 /src/JSystem/JAudio/JASCmdStack.cpp | |
| parent | c31675d24b6dc0a2c3b22b3ad61b9cccf9c0a488 (diff) | |
JASCmdStack
Diffstat (limited to 'src/JSystem/JAudio/JASCmdStack.cpp')
| -rw-r--r-- | src/JSystem/JAudio/JASCmdStack.cpp | 103 |
1 files changed, 84 insertions, 19 deletions
diff --git a/src/JSystem/JAudio/JASCmdStack.cpp b/src/JSystem/JAudio/JASCmdStack.cpp index d7f67331..71e10166 100644 --- a/src/JSystem/JAudio/JASCmdStack.cpp +++ b/src/JSystem/JAudio/JASCmdStack.cpp @@ -3,56 +3,121 @@ // Translation Unit: JASCmdStack.cpp // -#include "JASCmdStack.h" +#include "JSystem/JAudio/JASCmdStack.h" +#include "JSystem/JAudio/JASCallback.h" +#include "JSystem/JUtility/JUTAssert.h" #include "dolphin/types.h" /* 8027D6F4-8027D70C .text __ct__Q38JASystem6Kernel8TPortCmdFv */ JASystem::Kernel::TPortCmd::TPortCmd() { - /* Nonmatching */ + field_0x0 = NULL; + field_0x4 = NULL; + field_0x8 = NULL; + field_0xc = NULL; } +JASystem::Kernel::TPortHead cmd_once; + /* 8027D70C-8027D730 .text addPortCmdOnce__Q38JASystem6Kernel8TPortCmdFv */ -void JASystem::Kernel::TPortCmd::addPortCmdOnce() { - /* Nonmatching */ +bool JASystem::Kernel::TPortCmd::addPortCmdOnce() { + return addPortCmd(&cmd_once); } /* 8027D730-8027D7E8 .text setPortCmd__Q38JASystem6Kernel8TPortCmdFPFPQ38JASystem6Kernel9TPortArgs_vPQ38JASystem6Kernel9TPortArgs */ -void JASystem::Kernel::TPortCmd::setPortCmd(void (*)(JASystem::Kernel::TPortArgs*), JASystem::Kernel::TPortArgs*) { - /* Nonmatching */ +bool JASystem::Kernel::TPortCmd::setPortCmd(void (*func)(JASystem::Kernel::TPortArgs*), JASystem::Kernel::TPortArgs* pargs) { + JUT_ASSERT(83, func != 0); + JUT_ASSERT(84, pargs != 0); + field_0x8 = func; + field_0xc = pargs; + field_0x0 = NULL; + return 1; } /* 8027D7E8-8027D8A4 .text addPortCmd__Q38JASystem6Kernel8TPortCmdFPQ38JASystem6Kernel9TPortHead */ -void JASystem::Kernel::TPortCmd::addPortCmd(JASystem::Kernel::TPortHead*) { +bool JASystem::Kernel::TPortCmd::addPortCmd(JASystem::Kernel::TPortHead* phead) { /* Nonmatching */ + JUT_ASSERT(105, phead != 0); + BOOL enable = OSDisableInterrupts(); + if (field_0x0) { + OSRestoreInterrupts(enable); + return false; + } + if (phead->field_0x4) { + phead->field_0x4->field_0x4 = this; + } else { + phead->field_0x0 = this; + } + phead->field_0x4 = this; + field_0x4 = NULL; + field_0x0 = phead; + OSRestoreInterrupts(enable); + return true; } /* 8027D8A4-8027D924 .text portCmdProcOnce__Q28JASystem6KernelFPQ38JASystem6Kernel9TPortHead */ -void JASystem::Kernel::portCmdProcOnce(JASystem::Kernel::TPortHead*) { - /* Nonmatching */ +void JASystem::Kernel::portCmdProcOnce(JASystem::Kernel::TPortHead* phead) { + JUT_ASSERT(223, phead != 0); + while (true) { + TPortCmd* cmd = getPortCmd(phead); + if (!cmd) { + break; + } + cmd->field_0x8(cmd->field_0xc); + } } /* 8027D924-8027D9A4 .text portCmdProcStay__Q28JASystem6KernelFPQ38JASystem6Kernel9TPortHead */ -void JASystem::Kernel::portCmdProcStay(JASystem::Kernel::TPortHead*) { - /* Nonmatching */ +void JASystem::Kernel::portCmdProcStay(JASystem::Kernel::TPortHead* phead) { + JUT_ASSERT(245, phead != 0); + TPortCmd* cmd = phead->field_0x0; + while (true) { + if (!cmd) { + break; + } + cmd->field_0x8(cmd->field_0xc); + cmd = cmd->field_0x4; + } } /* 8027D9A4-8027DA0C .text portHeadInit__Q28JASystem6KernelFPQ38JASystem6Kernel9TPortHead */ -void JASystem::Kernel::portHeadInit(JASystem::Kernel::TPortHead*) { - /* Nonmatching */ +void JASystem::Kernel::portHeadInit(JASystem::Kernel::TPortHead* phead) { + JUT_ASSERT(267, phead != 0); + phead->field_0x0 = NULL; + phead->field_0x4 = NULL; } +JASystem::Kernel::TPortHead cmd_stay; + /* 8027DA0C-8027DA48 .text portCmdInit__Q28JASystem6KernelFv */ void JASystem::Kernel::portCmdInit() { - /* Nonmatching */ + portHeadInit(&cmd_once); + portHeadInit(&cmd_stay); + registerDspCallback(portCmdMain, NULL); } /* 8027DA48-8027DB08 .text getPortCmd__Q28JASystem6KernelFPQ38JASystem6Kernel9TPortHead */ -void JASystem::Kernel::getPortCmd(JASystem::Kernel::TPortHead*) { - /* Nonmatching */ +JASystem::Kernel::TPortCmd* JASystem::Kernel::getPortCmd(JASystem::Kernel::TPortHead* phead) { + TPortCmd* r31; + TPortCmd* r30 = NULL; + JUT_ASSERT(311, phead != 0); + r31 = phead->field_0x0; + if (r31) { + r30 = r31; + phead->field_0x0 = r31->field_0x4; + if (!phead->field_0x0) { + phead->field_0x4 = NULL; + } + if (phead != r31->field_0x0) { + OSReport("[JASKernel::getPortCmd] 不正な登録データブロックです。\n"); + } + r31->field_0x0 = NULL; + } + return r30; } /* 8027DB08-8027DB38 .text portCmdMain__Q28JASystem6KernelFPv */ -void JASystem::Kernel::portCmdMain(void*) { - /* Nonmatching */ +s32 JASystem::Kernel::portCmdMain(void*) { + portCmdProcOnce(&cmd_once); + portCmdProcStay(&cmd_stay); + return 0; } - |
