summaryrefslogtreecommitdiff
path: root/src/f_pc/f_pc_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/f_pc/f_pc_base.cpp')
-rw-r--r--src/f_pc/f_pc_base.cpp254
1 files changed, 98 insertions, 156 deletions
diff --git a/src/f_pc/f_pc_base.cpp b/src/f_pc/f_pc_base.cpp
index 2ee8862dfb..3717aa51e8 100644
--- a/src/f_pc/f_pc_base.cpp
+++ b/src/f_pc/f_pc_base.cpp
@@ -7,193 +7,135 @@
#include "dol2asm.h"
#include "dolphin/types.h"
#include "SSystem/SComponent/c_malloc.h"
-
-//
-// Types:
-//
-
-struct process_priority_class {};
-
-struct process_method_class {};
-
-struct line_tag {};
-
-struct layer_management_tag_class {};
-
-struct layer_class {};
-
-struct delete_tag_class {};
-
-struct base_process_class {};
-
-//
-// Forward References:
-//
-
-void fpcBs_Is_JustOfType(int, int);
-void fpcBs_MakeOfType(int*);
-void fpcBs_MakeOfId();
-void fpcBs_Execute(base_process_class*);
-static void fpcBs_DeleteAppend(base_process_class*);
-void fpcBs_IsDelete(base_process_class*);
-void fpcBs_Delete(base_process_class*);
-void fpcBs_Create(s16, unsigned int, void*);
-void fpcBs_SubCreate(base_process_class*);
-
-extern "C" void fpcBs_Is_JustOfType__Fii();
-extern "C" void fpcBs_MakeOfType__FPi();
-extern "C" void fpcBs_MakeOfId__Fv();
-extern "C" void fpcBs_Execute__FP18base_process_class();
-extern "C" static void fpcBs_DeleteAppend__FP18base_process_class();
-extern "C" void fpcBs_IsDelete__FP18base_process_class();
-extern "C" void fpcBs_Delete__FP18base_process_class();
-extern "C" void fpcBs_Create__FsUiPv();
-extern "C" void fpcBs_SubCreate__FP18base_process_class();
-
-//
-// External References:
-//
-
-void fpcDtTg_Init(delete_tag_class*, void*);
-void fpcLy_SetCurrentLayer(layer_class*);
-void fpcLy_CurrentLayer();
-void fpcLyTg_Init(layer_management_tag_class*, unsigned int, void*);
-void fpcMtd_Execute(process_method_class*, void*);
-void fpcMtd_IsDelete(process_method_class*, void*);
-void fpcMtd_Delete(process_method_class*, void*);
-void fpcMtd_Create(process_method_class*, void*);
-void fpcPi_Init(process_priority_class*, void*, unsigned int, u16, u16);
-void fpcPf_Get(s16);
-void fpcLnTg_Init(line_tag*, void*);
-void fpcPause_Init(void*);
-void sBs_ClearArea(void*, u32);
-
-extern "C" void fpcDtTg_Init__FP16delete_tag_classPv();
-extern "C" void fpcLy_SetCurrentLayer__FP11layer_class();
-extern "C" void fpcLy_CurrentLayer__Fv();
-extern "C" void fpcLyTg_Init__FP26layer_management_tag_classUiPv();
-extern "C" void fpcMtd_Execute__FP20process_method_classPv();
-extern "C" void fpcMtd_IsDelete__FP20process_method_classPv();
-extern "C" void fpcMtd_Delete__FP20process_method_classPv();
-extern "C" void fpcMtd_Create__FP20process_method_classPv();
-extern "C" void fpcPi_Init__FP22process_priority_classPvUiUsUs();
-extern "C" void fpcPf_Get__Fs();
-extern "C" void fpcLnTg_Init__FP8line_tagPv();
-extern "C" void fpcPause_Init__FPv();
-extern "C" void memalignB__3cMlFiUl();
-extern "C" void free__3cMlFPv();
-extern "C" void sBs_ClearArea__FPvUl();
-extern "C" void _savegpr_26();
-extern "C" void _restgpr_26();
+#include "f_pc/f_pc_pause.h"
+#include "SSystem/SComponent/c_phase.h"
+#include "SSystem/SStandard/s_basic.h"
+
+// hack to make functions that return comparisons as int match
+extern int __cntlzw(unsigned int);
+inline BOOL checkEqual(s32 a, s32 b) {
+ return (u32)__cntlzw(a - b) >> 5;
+}
//
// Declarations:
//
/* 8002064C-8002065C 0010+00 s=0 e=14 z=0 None .text fpcBs_Is_JustOfType__Fii */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_Is_JustOfType(int param_0, int param_1) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_Is_JustOfType__Fii.s"
+BOOL fpcBs_Is_JustOfType(int pType1, int pType2) {
+ return checkEqual(pType1, pType2);
}
-#pragma pop
/* ############################################################################################## */
/* 80450D00-80450D04 0004+00 s=1 e=0 z=0 None .sbss g_fpcBs_type */
-static u8 g_fpcBs_type[4];
-
-/* 80450D04-80450D08 0004+00 s=1 e=0 z=0 None .sbss t_type$2207 */
-static u8 t_type[4];
-
-/* 80450D08-80450D0C 0004+00 s=1 e=0 z=0 None .sbss None */
-static u8 data_80450D08[4];
+static int g_fpcBs_type;
/* 8002065C-8002069C 0040+00 s=1 e=5 z=0 None .text fpcBs_MakeOfType__FPi */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_MakeOfType(int* param_0) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_MakeOfType__FPi.s"
+s32 fpcBs_MakeOfType(int* pType) {
+ static s32 t_type = 0x9130000;
+ if (*pType == 0) {
+ *pType = ++t_type;
+ }
+ return *pType;
}
-#pragma pop
-
-/* ############################################################################################## */
-/* 80450D0C-80450D10 0004+00 s=1 e=0 z=0 None .sbss process_id$2216 */
-static u8 process_id[4];
-
-/* 80450D10-80450D18 0008+00 s=1 e=0 z=0 None .sbss None */
-static u8 data_80450D10[8];
/* 8002069C-800206C4 0028+00 s=0 e=2 z=0 None .text fpcBs_MakeOfId__Fv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_MakeOfId() {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_MakeOfId__Fv.s"
+s32 fpcBs_MakeOfId(void) {
+ static s32 process_id = 1;
+ return process_id++;
}
-#pragma pop
/* 800206C4-80020720 005C+00 s=0 e=1 z=0 None .text fpcBs_Execute__FP18base_process_class */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_Execute(base_process_class* param_0) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_Execute__FP18base_process_class.s"
+s32 fpcBs_Execute(base_process_class* pProc) {
+ s32 result;
+ layer_class* savedLayer = fpcLy_CurrentLayer();
+ fpcLy_SetCurrentLayer(pProc->mLyTg.mpLayer);
+ result = fpcMtd_Execute(pProc->mpPcMtd, pProc);
+ fpcLy_SetCurrentLayer(savedLayer);
+ return result;
}
-#pragma pop
/* 80020720-80020760 0040+00 s=2 e=0 z=0 None .text fpcBs_DeleteAppend__FP18base_process_class
*/
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm static void fpcBs_DeleteAppend(base_process_class* param_0) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_DeleteAppend__FP18base_process_class.s"
+void fpcBs_DeleteAppend(base_process_class* pProc) {
+ if (pProc->mpUserData != NULL) {
+ cMl::free(pProc->mpUserData);
+ pProc->mpUserData = NULL;
+ }
}
-#pragma pop
/* 80020760-800207BC 005C+00 s=0 e=1 z=0 None .text fpcBs_IsDelete__FP18base_process_class */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_IsDelete(base_process_class* param_0) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_IsDelete__FP18base_process_class.s"
+s32 fpcBs_IsDelete(base_process_class* pProc) {
+ s32 result;
+ layer_class* savedLayer = fpcLy_CurrentLayer();
+ fpcLy_SetCurrentLayer(pProc->mLyTg.mpLayer);
+ result = fpcMtd_IsDelete(pProc->mpPcMtd, pProc);
+ fpcLy_SetCurrentLayer(savedLayer);
+ return result;
}
-#pragma pop
/* 800207BC-80020820 0064+00 s=0 e=2 z=0 None .text fpcBs_Delete__FP18base_process_class */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_Delete(base_process_class* param_0) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_Delete__FP18base_process_class.s"
+s32 fpcBs_Delete(base_process_class* pProc) {
+ s32 deleteResult = fpcMtd_Delete(pProc->mpPcMtd, pProc);
+ if (deleteResult == 1) {
+ fpcBs_DeleteAppend(pProc);
+ pProc->mBsType = 0;
+ cMl::free(pProc);
+ }
+ return deleteResult;
}
-#pragma pop
/* 80020820-8002091C 00FC+00 s=0 e=2 z=0 None .text fpcBs_Create__FsUiPv */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_Create(s16 param_0, unsigned int param_1, void* param_2) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_Create__FsUiPv.s"
+base_process_class* fpcBs_Create(s16 pProcTypeID, unsigned int pProcID, void* pData) {
+ process_profile_definition* procProfDef;
+ base_process_class* procClass;
+ u32 size;
+
+ procProfDef = fpcPf_Get(pProcTypeID);
+ size = procProfDef->mSize + procProfDef->mSizeOther;
+ procClass = (base_process_class*)cMl::memalignB(-4, size);
+ if (procClass == NULL) {
+ return NULL;
+ } else {
+ sBs_ClearArea(procClass, size);
+ fpcLyTg_Init(&procClass->mLyTg, procProfDef->mLayerID, procClass);
+ fpcLnTg_Init(&procClass->mLnTg, procClass);
+ fpcDtTg_Init(&procClass->mDtTg, procClass);
+ fpcPi_Init(&procClass->mPi, procClass, procProfDef->mLayerID, procProfDef->mListID,
+ procProfDef->mListPrio);
+ procClass->mInitState = 0;
+ procClass->mUnk0 = 0;
+ procClass->mBsPcId = pProcID;
+ procClass->mBsTypeId = pProcTypeID;
+ procClass->mBsType = fpcBs_MakeOfType(&g_fpcBs_type);
+ procClass->mProcName = procProfDef->mProcName;
+ fpcPause_Init(procClass);
+ procClass->mpPcMtd = procProfDef->mpPcMtd;
+ procClass->mpProf = procProfDef;
+ procClass->mpUserData = pData;
+ procClass->mParameters = procProfDef->mParameters;
+ return procClass;
+ }
}
-#pragma pop
-/* 8002091C-800209C8 00AC+00 s=0 e=2 z=0 None .text fpcBs_SubCreate__FP18base_process_class */
-#pragma push
-#pragma optimization_level 0
-#pragma optimizewithasm off
-asm void fpcBs_SubCreate(base_process_class* param_0) {
- nofralloc
-#include "asm/f_pc/f_pc_base/fpcBs_SubCreate__FP18base_process_class.s"
+s32 fpcBs_SubCreate(base_process_class* pProc) {
+ switch (fpcMtd_Create(pProc->mpPcMtd, pProc)) {
+ case 2:
+ case cPhs_COMPLEATE_e:
+ fpcBs_DeleteAppend(pProc);
+ pProc->mUnk2 = 2;
+ return 2;
+ case cPhs_ZERO_e:
+ case 1:
+ pProc->mInitState = 1;
+ pProc->mUnk2 = 0;
+ return cPhs_ZERO_e;
+ case 3:
+ pProc->mUnk2 = 3;
+ return 3;
+ case cPhs_ERROR_e:
+ default:
+ pProc->mUnk2 = 5;
+ return cPhs_ERROR_e;
+ }
}
-#pragma pop