summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax <mparisi@stevens.edu>2020-10-23 12:13:48 -0400
committerMax <mparisi@stevens.edu>2020-10-23 12:13:48 -0400
commit1a76bb3162479a8897272ca4928ef2e0be849e21 (patch)
treeffbd9c9352f2c6c6ffc8997f560b0527b8d0180d
parent7a613ce73c573c18567b77adf1ecc99e1f65de21 (diff)
match func_801DBD74
-rw-r--r--asm/code_801DBB3C_asm.s70
-rw-r--r--include/code_801DBB3C.h12
-rw-r--r--src/code_801DBB3C.cpp25
3 files changed, 27 insertions, 80 deletions
diff --git a/asm/code_801DBB3C_asm.s b/asm/code_801DBB3C_asm.s
index 970f84a..394cdb1 100644
--- a/asm/code_801DBB3C_asm.s
+++ b/asm/code_801DBB3C_asm.s
@@ -2,76 +2,6 @@
.section .text, "ax" # 0x80006980 - 0x803E1E60
-.global func_801DBD74
-func_801DBD74:
-/* 801DBD74 001D79D4 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DBD78 001D79D8 7C 08 02 A6 */ mflr r0
-/* 801DBD7C 001D79DC 3C C0 80 49 */ lis r6, lbl_80491470@ha
-/* 801DBD80 001D79E0 7C 67 1B 78 */ mr r7, r3
-/* 801DBD84 001D79E4 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DBD88 001D79E8 38 00 00 04 */ li r0, 4
-/* 801DBD8C 001D79EC 7C 85 23 78 */ mr r5, r4
-/* 801DBD90 001D79F0 38 C6 14 70 */ addi r6, r6, lbl_80491470@l
-/* 801DBD94 001D79F4 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801DBD98 001D79F8 38 60 00 00 */ li r3, 0
-/* 801DBD9C 001D79FC 7C 09 03 A6 */ mtctr r0
-lbl_801DBDA0:
-/* 801DBDA0 001D7A00 80 06 00 08 */ lwz r0, 8(r6)
-/* 801DBDA4 001D7A04 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBDA8 001D7A08 41 82 00 80 */ beq lbl_801DBE28
-/* 801DBDAC 001D7A0C 80 06 00 24 */ lwz r0, 0x24(r6)
-/* 801DBDB0 001D7A10 38 63 00 01 */ addi r3, r3, 1
-/* 801DBDB4 001D7A14 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBDB8 001D7A18 41 82 00 70 */ beq lbl_801DBE28
-/* 801DBDBC 001D7A1C 80 06 00 40 */ lwz r0, 0x40(r6)
-/* 801DBDC0 001D7A20 38 63 00 01 */ addi r3, r3, 1
-/* 801DBDC4 001D7A24 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBDC8 001D7A28 41 82 00 60 */ beq lbl_801DBE28
-/* 801DBDCC 001D7A2C 80 06 00 5C */ lwz r0, 0x5c(r6)
-/* 801DBDD0 001D7A30 38 63 00 01 */ addi r3, r3, 1
-/* 801DBDD4 001D7A34 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBDD8 001D7A38 41 82 00 50 */ beq lbl_801DBE28
-/* 801DBDDC 001D7A3C 80 06 00 78 */ lwz r0, 0x78(r6)
-/* 801DBDE0 001D7A40 38 63 00 01 */ addi r3, r3, 1
-/* 801DBDE4 001D7A44 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBDE8 001D7A48 41 82 00 40 */ beq lbl_801DBE28
-/* 801DBDEC 001D7A4C 80 06 00 94 */ lwz r0, 0x94(r6)
-/* 801DBDF0 001D7A50 38 63 00 01 */ addi r3, r3, 1
-/* 801DBDF4 001D7A54 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBDF8 001D7A58 41 82 00 30 */ beq lbl_801DBE28
-/* 801DBDFC 001D7A5C 80 06 00 B0 */ lwz r0, 0xb0(r6)
-/* 801DBE00 001D7A60 38 63 00 01 */ addi r3, r3, 1
-/* 801DBE04 001D7A64 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBE08 001D7A68 41 82 00 20 */ beq lbl_801DBE28
-/* 801DBE0C 001D7A6C 80 06 00 CC */ lwz r0, 0xcc(r6)
-/* 801DBE10 001D7A70 38 63 00 01 */ addi r3, r3, 1
-/* 801DBE14 001D7A74 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBE18 001D7A78 41 82 00 10 */ beq lbl_801DBE28
-/* 801DBE1C 001D7A7C 38 C6 00 E0 */ addi r6, r6, 0xe0
-/* 801DBE20 001D7A80 38 63 00 01 */ addi r3, r3, 1
-/* 801DBE24 001D7A84 42 00 FF 7C */ bdnz lbl_801DBDA0
-lbl_801DBE28:
-/* 801DBE28 001D7A88 1C 03 00 1C */ mulli r0, r3, 0x1c
-/* 801DBE2C 001D7A8C 3C 60 80 49 */ lis r3, lbl_80491470@ha
-/* 801DBE30 001D7A90 38 63 14 70 */ addi r3, r3, lbl_80491470@l
-/* 801DBE34 001D7A94 7F E3 02 14 */ add r31, r3, r0
-/* 801DBE38 001D7A98 80 1F 00 08 */ lwz r0, 8(r31)
-/* 801DBE3C 001D7A9C 2C 00 00 00 */ cmpwi r0, 0
-/* 801DBE40 001D7AA0 41 82 00 0C */ beq lbl_801DBE4C
-/* 801DBE44 001D7AA4 38 60 00 00 */ li r3, 0
-/* 801DBE48 001D7AA8 48 00 00 14 */ b lbl_801DBE5C
-lbl_801DBE4C:
-/* 801DBE4C 001D7AAC 7F E3 FB 78 */ mr r3, r31
-/* 801DBE50 001D7AB0 7C E4 3B 78 */ mr r4, r7
-/* 801DBE54 001D7AB4 4B FF FC F5 */ bl func_801DBB48
-/* 801DBE58 001D7AB8 7F E3 FB 78 */ mr r3, r31
-lbl_801DBE5C:
-/* 801DBE5C 001D7ABC 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801DBE60 001D7AC0 83 E1 00 0C */ lwz r31, 0xc(r1)
-/* 801DBE64 001D7AC4 7C 08 03 A6 */ mtlr r0
-/* 801DBE68 001D7AC8 38 21 00 10 */ addi r1, r1, 0x10
-/* 801DBE6C 001D7ACC 4E 80 00 20 */ blr
-
.global func_801DBE70
func_801DBE70:
/* 801DBE70 001D7AD0 38 A0 00 01 */ li r5, 1
diff --git a/include/code_801DBB3C.h b/include/code_801DBB3C.h
index bbf2c39..1c387cf 100644
--- a/include/code_801DBB3C.h
+++ b/include/code_801DBB3C.h
@@ -10,19 +10,19 @@ extern "C" {
// free store block?
struct gUnkClass3
{
- gUnkClass3* unk0;
+ gUnkClass3* unk0; // pointer to the next free block
gUnkClass1 unk4;
};
// linked list node free store?
struct gUnkClass2
{
- u32 unk0; // counter?
- u32 unk4;
- u8 pad[0x4];
+ u32 unk0; // counter for blocks currently allocated?
+ u32 unk4; // maximum number of blocks allocated so far?
+ u32 unk8; // checked heavily in func_801DBD74
size_t unkC; // block size
- u8 pad2[0x8];
- gUnkClass3* unk18; // next block?
+ u8 unk10[0x8];
+ gUnkClass3* unk18; // head of the linked list of free nodes
};
gUnkClass1* func_801DBC58(gUnkClass2* p1);
diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp
index 8400bc9..6ab2959 100644
--- a/src/code_801DBB3C.cpp
+++ b/src/code_801DBB3C.cpp
@@ -51,7 +51,7 @@ void func_801DBB44(u32)
//static
#ifdef NONMATCHING
-void func_801DBB48(unkClass *p1, u32 p2, u32 p3)
+void func_801DBB48(gUnkClass2* p1, u32 p2, u32 p3)
{
//p2 = r30
u32 r31 = (p3+7) & ~0x3; // element size
@@ -69,14 +69,14 @@ void func_801DBB48(unkClass *p1, u32 p2, u32 p3)
for (size_t i = (r4+7)/8; i != 0; i--) {
// 8 stores per iteration
- ...
+
}
}
}
}
}
#else
-asm void func_801DBB48(unkClass *p1, u32 p2, u32 p3)
+asm void func_801DBB48(gUnkClass2* p1, u32 p2, u32 p3)
{
/* 801DBB48 001D77A8 94 21 FF E0 */ stwu r1, -0x20(r1)
/* 801DBB4C 001D77AC 7C 08 02 A6 */ mflr r0
@@ -174,7 +174,8 @@ passCheck:
return &r31->unk4;
}
-// return node p2 to free store p1
+// return node p2 to free store p1, making it the new head of the
+// free node linked list
void func_801DBD00(gUnkClass2* p1, gUnkClass1* p2)
{
u32 r31;
@@ -189,6 +190,22 @@ void func_801DBD00(gUnkClass2* p1, gUnkClass1* p2)
}
}
+// array
+extern gUnkClass2 lbl_80491470[32];
+
+// allocate the free store given number of elements and size of each?
+gUnkClass2* func_801DBD74(u32 p1, u32 p2)
+{
+ size_t i;
+ for (i = 0; i < 32; i++)
+ if (lbl_80491470[i].unk8 == 0)
+ break;
+ gUnkClass2* r31 = &lbl_80491470[i];
+ if (r31->unk8)
+ return NULL;
+ func_801DBB48(r31, p1, p2);
+ return r31;
+}
}