diff options
-rw-r--r-- | asm/code_801DB040_asm.s (renamed from asm/code_801DB040.s) | 88 | ||||
-rw-r--r-- | obj_files.mk | 3 | ||||
-rw-r--r-- | src/code_801DB040.cpp | 99 |
3 files changed, 101 insertions, 89 deletions
diff --git a/asm/code_801DB040.s b/asm/code_801DB040_asm.s index 189cbdb..ea30ca2 100644 --- a/asm/code_801DB040.s +++ b/asm/code_801DB040_asm.s @@ -2,94 +2,6 @@ .section .text, "ax" # 0x80006980 - 0x803E1E60
-.global func_801DB040
-func_801DB040:
-/* 801DB040 001D6CA0 80 AD A0 28 */ lwz r5, lbl_8063F2E8-_SDA_BASE_(r13)
-/* 801DB044 001D6CA4 48 00 00 28 */ b lbl_801DB06C
-lbl_801DB048:
-/* 801DB048 001D6CA8 80 05 00 10 */ lwz r0, 0x10(r5)
-/* 801DB04C 001D6CAC 7C 00 18 40 */ cmplw r0, r3
-/* 801DB050 001D6CB0 40 82 00 18 */ bne lbl_801DB068
-/* 801DB054 001D6CB4 80 05 00 14 */ lwz r0, 0x14(r5)
-/* 801DB058 001D6CB8 7C 00 20 40 */ cmplw r0, r4
-/* 801DB05C 001D6CBC 40 82 00 0C */ bne lbl_801DB068
-/* 801DB060 001D6CC0 7C A3 2B 78 */ mr r3, r5
-/* 801DB064 001D6CC4 4E 80 00 20 */ blr
-lbl_801DB068:
-/* 801DB068 001D6CC8 80 A5 00 1C */ lwz r5, 0x1c(r5)
-lbl_801DB06C:
-/* 801DB06C 001D6CCC 2C 05 00 00 */ cmpwi r5, 0
-/* 801DB070 001D6CD0 40 82 FF D8 */ bne lbl_801DB048
-/* 801DB074 001D6CD4 38 60 00 00 */ li r3, 0
-/* 801DB078 001D6CD8 4E 80 00 20 */ blr
-
-.global func_801DB07C
-func_801DB07C:
-/* 801DB07C 001D6CDC 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DB080 001D6CE0 7C 08 02 A6 */ mflr r0
-/* 801DB084 001D6CE4 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DB088 001D6CE8 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801DB08C 001D6CEC 7C 9F 23 78 */ mr r31, r4
-/* 801DB090 001D6CF0 93 C1 00 08 */ stw r30, 8(r1)
-/* 801DB094 001D6CF4 7C 7E 1B 78 */ mr r30, r3
-/* 801DB098 001D6CF8 81 83 00 18 */ lwz r12, 0x18(r3)
-/* 801DB09C 001D6CFC 2C 0C 00 00 */ cmpwi r12, 0
-/* 801DB0A0 001D6D00 41 82 00 28 */ beq lbl_801DB0C8
-/* 801DB0A4 001D6D04 80 63 00 0C */ lwz r3, 0xc(r3)
-/* 801DB0A8 001D6D08 80 9E 00 10 */ lwz r4, 0x10(r30)
-/* 801DB0AC 001D6D0C 80 BE 00 14 */ lwz r5, 0x14(r30)
-/* 801DB0B0 001D6D10 7D 89 03 A6 */ mtctr r12
-/* 801DB0B4 001D6D14 4E 80 04 21 */ bctrl
-/* 801DB0B8 001D6D18 2C 03 00 00 */ cmpwi r3, 0
-/* 801DB0BC 001D6D1C 40 82 00 0C */ bne lbl_801DB0C8
-/* 801DB0C0 001D6D20 80 7E 00 1C */ lwz r3, 0x1c(r30)
-/* 801DB0C4 001D6D24 48 00 00 80 */ b lbl_801DB144
-lbl_801DB0C8:
-/* 801DB0C8 001D6D28 88 1E 00 00 */ lbz r0, 0(r30)
-/* 801DB0CC 001D6D2C 2C 00 00 00 */ cmpwi r0, 0
-/* 801DB0D0 001D6D30 41 82 00 28 */ beq lbl_801DB0F8
-/* 801DB0D4 001D6D34 80 9E 00 0C */ lwz r4, 0xc(r30)
-/* 801DB0D8 001D6D38 2C 04 00 00 */ cmpwi r4, 0
-/* 801DB0DC 001D6D3C 41 82 00 14 */ beq lbl_801DB0F0
-/* 801DB0E0 001D6D40 80 7E 00 08 */ lwz r3, 8(r30)
-/* 801DB0E4 001D6D44 4B FF FC 65 */ bl func_801DAD48
-/* 801DB0E8 001D6D48 38 00 00 00 */ li r0, 0
-/* 801DB0EC 001D6D4C 90 1E 00 0C */ stw r0, 0xc(r30)
-lbl_801DB0F0:
-/* 801DB0F0 001D6D50 38 00 00 00 */ li r0, 0
-/* 801DB0F4 001D6D54 98 1E 00 00 */ stb r0, 0(r30)
-lbl_801DB0F8:
-/* 801DB0F8 001D6D58 38 00 00 00 */ li r0, 0
-/* 801DB0FC 001D6D5C 2C 1F 00 00 */ cmpwi r31, 0
-/* 801DB100 001D6D60 90 1E 00 0C */ stw r0, 0xc(r30)
-/* 801DB104 001D6D64 83 FE 00 1C */ lwz r31, 0x1c(r30)
-/* 801DB108 001D6D68 41 82 00 38 */ beq lbl_801DB140
-/* 801DB10C 001D6D6C 80 7E 00 20 */ lwz r3, 0x20(r30)
-/* 801DB110 001D6D70 2C 03 00 00 */ cmpwi r3, 0
-/* 801DB114 001D6D74 41 82 00 0C */ beq lbl_801DB120
-/* 801DB118 001D6D78 93 E3 00 1C */ stw r31, 0x1c(r3)
-/* 801DB11C 001D6D7C 48 00 00 08 */ b lbl_801DB124
-lbl_801DB120:
-/* 801DB120 001D6D80 93 ED A0 28 */ stw r31, lbl_8063F2E8-_SDA_BASE_(r13)
-lbl_801DB124:
-/* 801DB124 001D6D84 2C 1F 00 00 */ cmpwi r31, 0
-/* 801DB128 001D6D88 41 82 00 0C */ beq lbl_801DB134
-/* 801DB12C 001D6D8C 80 1E 00 20 */ lwz r0, 0x20(r30)
-/* 801DB130 001D6D90 90 1F 00 20 */ stw r0, 0x20(r31)
-lbl_801DB134:
-/* 801DB134 001D6D94 80 6D A0 2C */ lwz r3, lbl_8063F2EC-_SDA_BASE_(r13)
-/* 801DB138 001D6D98 7F C4 F3 78 */ mr r4, r30
-/* 801DB13C 001D6D9C 48 00 0B C5 */ bl func_801DBD00
-lbl_801DB140:
-/* 801DB140 001D6DA0 7F E3 FB 78 */ mr r3, r31
-lbl_801DB144:
-/* 801DB144 001D6DA4 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801DB148 001D6DA8 83 E1 00 0C */ lwz r31, 0xc(r1)
-/* 801DB14C 001D6DAC 83 C1 00 08 */ lwz r30, 8(r1)
-/* 801DB150 001D6DB0 7C 08 03 A6 */ mtlr r0
-/* 801DB154 001D6DB4 38 21 00 10 */ addi r1, r1, 0x10
-/* 801DB158 001D6DB8 4E 80 00 20 */ blr
-
.global func_801DB15C
func_801DB15C:
/* 801DB15C 001D6DBC 94 21 FF F0 */ stwu r1, -0x10(r1)
diff --git a/obj_files.mk b/obj_files.mk index aeee1b5..3b6b060 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -219,7 +219,8 @@ SPLIT_O_FILES := \ $(BUILD_DIR)/asm/SDK/NdevExi2A/exi2.o \ $(BUILD_DIR)/src/code_801DAA30.o \ $(BUILD_DIR)/src/code_801DAAE0.o \ - $(BUILD_DIR)/asm/code_801DB040.o \ + $(BUILD_DIR)/src/code_801DB040.o \ + $(BUILD_DIR)/asm/code_801DB040_asm.o \ $(BUILD_DIR)/asm/code_801DB81C.o \ $(BUILD_DIR)/asm/code_801DBB3C.o \ $(BUILD_DIR)/asm/code_801DBE90.o \ diff --git a/src/code_801DB040.cpp b/src/code_801DB040.cpp new file mode 100644 index 0000000..61b2d05 --- /dev/null +++ b/src/code_801DB040.cpp @@ -0,0 +1,99 @@ +#include "types.h"
+#include "unkStruct.h"
+#include "code_801DAAE0.h"
+
+extern "C" {
+
+typedef u32 (*FuncPtr)(void*, u32, u32);
+
+// TODO: func_801DBD00 might need this definition
+struct unkClass
+{
+ u8 unk0;
+ u8 unk1[0x7];
+ MEMHeapHandle unk8;
+ void* unkC; // or, a more specific pointer
+ u32 unk10;
+ u32 unk14;
+ FuncPtr unk18;
+ unkClass* unk1C;
+ unkClass* unk20;
+};
+
+extern void func_801DBD00(u32 p1, unkClass* p2);
+
+namespace
+{
+
+
+
+ //unkStruct gUnk8063F2E0(1, 4, 0);
+}
+
+extern unkClass* lbl_8063F2E8; //TODO: rename/define/internalize
+extern u32 lbl_8063F2EC; //TODO: rename/define/internalize
+
+
+
+
+
+
+//static
+unkClass* func_801DB040(u32 p1, u32 p2);
+unkClass* func_801DB07C(unkClass* p1, u32 p2);
+
+//static
+unkClass* func_801DB040(u32 p1, u32 p2)
+{
+ for (unkClass* r5 = lbl_8063F2E8; r5; r5 = r5->unk1C)
+ if (r5->unk10 == p1 && r5->unk14 == p2)
+ return r5;
+ return NULL;
+}
+
+unkClass* func_801DB07C(unkClass* p1, u32 p2)
+{
+ unkClass* r31;
+ if (p1->unk18 && p1->unk18(p1->unkC, p1->unk10, p1->unk14) == 0)
+ return p1->unk1C;
+ if (p1->unk0) {
+ if (p1->unkC) {
+ // free
+ // void func_801DAD48(MEMHeapHandle heap, void* memBlock);
+ func_801DAD48(p1->unk8, p1->unkC);
+ p1->unkC = NULL;
+ }
+ p1->unk0 = 0;
+ }
+ p1->unkC = NULL;
+ r31 = p1->unk1C;
+ if (p2) {
+ unkClass* r3 = p1->unk20;
+ if (r3)
+ r3->unk1C = r31;
+ else
+ lbl_8063F2E8 = r31;
+
+ if (r31)
+ r31->unk20 = p1->unk20;
+
+ func_801DBD00(lbl_8063F2EC, p1);
+ }
+ return r31;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} //extern "C"
|