summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio/JASCmdStack.cpp
diff options
context:
space:
mode:
authorJcw87 <Jcw87@users.noreply.github.com>2023-10-22 13:48:03 -0700
committerJcw87 <Jcw87@users.noreply.github.com>2023-10-23 00:05:04 -0700
commit73a595b83cf3376d799faa68e25dbb52239344f2 (patch)
tree9219da512d6c33e1cfd348e5e93042c2472906e9 /src/JSystem/JAudio/JASCmdStack.cpp
parentc31675d24b6dc0a2c3b22b3ad61b9cccf9c0a488 (diff)
JASCmdStack
Diffstat (limited to 'src/JSystem/JAudio/JASCmdStack.cpp')
-rw-r--r--src/JSystem/JAudio/JASCmdStack.cpp103
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;
}
-