summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/code_801DB040_asm.s80
-rw-r--r--src/code_801DB040.cpp69
2 files changed, 62 insertions, 87 deletions
diff --git a/asm/code_801DB040_asm.s b/asm/code_801DB040_asm.s
index ea30ca2..3855daa 100644
--- a/asm/code_801DB040_asm.s
+++ b/asm/code_801DB040_asm.s
@@ -2,86 +2,6 @@
.section .text, "ax" # 0x80006980 - 0x803E1E60
-.global func_801DB15C
-func_801DB15C:
-/* 801DB15C 001D6DBC 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DB160 001D6DC0 7C 08 02 A6 */ mflr r0
-/* 801DB164 001D6DC4 38 80 00 24 */ li r4, 0x24
-/* 801DB168 001D6DC8 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DB16C 001D6DCC 48 00 0C 09 */ bl func_801DBD74
-/* 801DB170 001D6DD0 90 6D A0 2C */ stw r3, lbl_8063F2EC-_SDA_BASE_(r13)
-/* 801DB174 001D6DD4 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801DB178 001D6DD8 7C 08 03 A6 */ mtlr r0
-/* 801DB17C 001D6DDC 38 21 00 10 */ addi r1, r1, 0x10
-/* 801DB180 001D6DE0 4E 80 00 20 */ blr
-
-.global func_801DB184
-func_801DB184:
-/* 801DB184 001D6DE4 94 21 FF E0 */ stwu r1, -0x20(r1)
-/* 801DB188 001D6DE8 7C 08 02 A6 */ mflr r0
-/* 801DB18C 001D6DEC 90 01 00 24 */ stw r0, 0x24(r1)
-/* 801DB190 001D6DF0 39 61 00 20 */ addi r11, r1, 0x20
-/* 801DB194 001D6DF4 4B FE BF 91 */ bl _savegpr_26
-/* 801DB198 001D6DF8 7C BC 2B 78 */ mr r28, r5
-/* 801DB19C 001D6DFC 7C DD 33 78 */ mr r29, r6
-/* 801DB1A0 001D6E00 7C 7A 1B 78 */ mr r26, r3
-/* 801DB1A4 001D6E04 7C 9B 23 78 */ mr r27, r4
-/* 801DB1A8 001D6E08 7C FE 3B 78 */ mr r30, r7
-/* 801DB1AC 001D6E0C 7F 83 E3 78 */ mr r3, r28
-/* 801DB1B0 001D6E10 7F A4 EB 78 */ mr r4, r29
-/* 801DB1B4 001D6E14 4B FF FE 8D */ bl func_801DB040
-/* 801DB1B8 001D6E18 2C 03 00 00 */ cmpwi r3, 0
-/* 801DB1BC 001D6E1C 41 82 00 0C */ beq lbl_801DB1C8
-/* 801DB1C0 001D6E20 38 60 00 00 */ li r3, 0
-/* 801DB1C4 001D6E24 48 00 00 94 */ b lbl_801DB258
-lbl_801DB1C8:
-/* 801DB1C8 001D6E28 80 6D A0 2C */ lwz r3, lbl_8063F2EC-_SDA_BASE_(r13)
-/* 801DB1CC 001D6E2C 48 00 0A 8D */ bl func_801DBC58
-/* 801DB1D0 001D6E30 2C 03 00 00 */ cmpwi r3, 0
-/* 801DB1D4 001D6E34 7C 7F 1B 78 */ mr r31, r3
-/* 801DB1D8 001D6E38 40 82 00 0C */ bne lbl_801DB1E4
-/* 801DB1DC 001D6E3C 38 60 00 00 */ li r3, 0
-/* 801DB1E0 001D6E40 48 00 00 78 */ b lbl_801DB258
-lbl_801DB1E4:
-/* 801DB1E4 001D6E44 7F 43 D3 78 */ mr r3, r26
-/* 801DB1E8 001D6E48 7F 64 DB 78 */ mr r4, r27
-/* 801DB1EC 001D6E4C 4B FF FA A9 */ bl func_801DAC94
-/* 801DB1F0 001D6E50 2C 03 00 00 */ cmpwi r3, 0
-/* 801DB1F4 001D6E54 90 7F 00 0C */ stw r3, 0xc(r31)
-/* 801DB1F8 001D6E58 40 82 00 18 */ bne lbl_801DB210
-/* 801DB1FC 001D6E5C 80 6D A0 2C */ lwz r3, lbl_8063F2EC-_SDA_BASE_(r13)
-/* 801DB200 001D6E60 7F E4 FB 78 */ mr r4, r31
-/* 801DB204 001D6E64 48 00 0A FD */ bl func_801DBD00
-/* 801DB208 001D6E68 38 60 00 00 */ li r3, 0
-/* 801DB20C 001D6E6C 48 00 00 4C */ b lbl_801DB258
-lbl_801DB210:
-/* 801DB210 001D6E70 80 6D A0 28 */ lwz r3, lbl_8063F2E8-_SDA_BASE_(r13)
-/* 801DB214 001D6E74 2C 03 00 00 */ cmpwi r3, 0
-/* 801DB218 001D6E78 41 82 00 08 */ beq lbl_801DB220
-/* 801DB21C 001D6E7C 93 E3 00 20 */ stw r31, 0x20(r3)
-lbl_801DB220:
-/* 801DB220 001D6E80 80 8D A0 28 */ lwz r4, lbl_8063F2E8-_SDA_BASE_(r13)
-/* 801DB224 001D6E84 38 60 00 00 */ li r3, 0
-/* 801DB228 001D6E88 38 00 00 01 */ li r0, 1
-/* 801DB22C 001D6E8C 90 9F 00 1C */ stw r4, 0x1c(r31)
-/* 801DB230 001D6E90 90 7F 00 20 */ stw r3, 0x20(r31)
-/* 801DB234 001D6E94 93 ED A0 28 */ stw r31, lbl_8063F2E8-_SDA_BASE_(r13)
-/* 801DB238 001D6E98 98 1F 00 00 */ stb r0, 0(r31)
-/* 801DB23C 001D6E9C 93 5F 00 08 */ stw r26, 8(r31)
-/* 801DB240 001D6EA0 98 7F 00 01 */ stb r3, 1(r31)
-/* 801DB244 001D6EA4 93 9F 00 10 */ stw r28, 0x10(r31)
-/* 801DB248 001D6EA8 93 BF 00 14 */ stw r29, 0x14(r31)
-/* 801DB24C 001D6EAC 93 DF 00 18 */ stw r30, 0x18(r31)
-/* 801DB250 001D6EB0 90 7F 00 04 */ stw r3, 4(r31)
-/* 801DB254 001D6EB4 80 7F 00 0C */ lwz r3, 0xc(r31)
-lbl_801DB258:
-/* 801DB258 001D6EB8 39 61 00 20 */ addi r11, r1, 0x20
-/* 801DB25C 001D6EBC 4B FE BF 15 */ bl _restgpr_26
-/* 801DB260 001D6EC0 80 01 00 24 */ lwz r0, 0x24(r1)
-/* 801DB264 001D6EC4 7C 08 03 A6 */ mtlr r0
-/* 801DB268 001D6EC8 38 21 00 20 */ addi r1, r1, 0x20
-/* 801DB26C 001D6ECC 4E 80 00 20 */ blr
-
.global func_801DB270
func_801DB270:
/* 801DB270 001D6ED0 94 21 FF D0 */ stwu r1, -0x30(r1)
diff --git a/src/code_801DB040.cpp b/src/code_801DB040.cpp
index 02094f0..8d7a03a 100644
--- a/src/code_801DB040.cpp
+++ b/src/code_801DB040.cpp
@@ -9,10 +9,12 @@ typedef u32 (*FuncPtr)(void*, u32, u32);
// TODO: func_801DBD00 might need this definition
struct unkClass
{
- u8 unk0;
- u8 unk1[0x7];
+ u8 unk0; // u8, u32, or union?
+ u8 unk1;
+ u8 unk2[0x2];
+ u32 unk4;
MEMHeapHandle unk8;
- void* unkC; // or, a more specific pointer
+ void* unkC; // or, a more specific pointer. ptr to heap allocated mem
u32 unk10;
u32 unk14;
FuncPtr unk18;
@@ -20,7 +22,18 @@ struct unkClass
unkClass* unk20; //prev?
};
-extern void func_801DBD00(u32 p1, unkClass* p2);
+struct unkClass2
+{
+ u8 pad[0x24];
+};
+
+
+// TODO: move to other headers
+unkClass* func_801DBC58(unkClass2* p1);
+void func_801DBD00(unkClass2* p1, unkClass* p2);
+unkClass2* func_801DBD74(u32 p1, u32 p2);
+
+
namespace
{
@@ -30,9 +43,11 @@ namespace
//unkStruct gUnk8063F2E0(1, 4, 0);
}
-// head of doubly linked list
+// head of doubly linked list?
extern unkClass* lbl_8063F2E8; //TODO: rename/define/internalize
-extern u32 lbl_8063F2EC; //TODO: rename/define/internalize
+
+// TODO: pointer to some class, a free pool?
+extern unkClass2* lbl_8063F2EC; //TODO: rename/define/internalize
@@ -42,6 +57,9 @@ extern u32 lbl_8063F2EC; //TODO: rename/define/internalize
//static
unkClass* func_801DB040(u32 p1, u32 p2);
unkClass* func_801DB07C(unkClass* p1, BOOL p2);
+void func_801DB15C(u32 p1);
+void* func_801DB184(MEMHeapHandle p1, u32 size, u32 p3, u32 p4, FuncPtr p5);
+
//static
unkClass* func_801DB040(u32 p1, u32 p2)
@@ -85,8 +103,45 @@ unkClass* func_801DB07C(unkClass* p1, BOOL p2)
return r31;
}
+void func_801DB15C(u32 p1)
+{
+ // TODO: magic number
+ lbl_8063F2EC = func_801DBD74(p1, 36);
+}
-
+// Add node to start of linked list
+//static
+void* func_801DB184(MEMHeapHandle p1, u32 size, u32 p3, u32 p4, FuncPtr p5)
+{
+ if (func_801DB040(p3, p4))
+ return NULL;
+ // allocate linked list node from free store?
+ unkClass* r31 = func_801DBC58(lbl_8063F2EC);
+ if (!r31)
+ return NULL;
+ // alloc
+ // void* func_801DAC94(MEMHeapHandle heap, u32 size)
+ if ((r31->unkC = func_801DAC94(p1, size)) == NULL) {
+ // return node to free store?
+ func_801DBD00(lbl_8063F2EC, r31);
+ return NULL;
+ }
+ if (lbl_8063F2E8)
+ lbl_8063F2E8->unk20 = r31;
+
+ r31->unk1C = lbl_8063F2E8;
+ r31->unk20 = NULL;
+ lbl_8063F2E8 = r31;
+
+ r31->unk0 = 1;
+ r31->unk8 = p1;
+ r31->unk1 = 0;
+ r31->unk10 = p3;
+ r31->unk14 = p4;
+ r31->unk18 = p5;
+ r31->unk4 = 0;
+ return r31->unkC;
+}