diff options
author | Max <mparisi@stevens.edu> | 2020-10-23 15:43:52 -0400 |
---|---|---|
committer | Max <mparisi@stevens.edu> | 2020-10-23 15:43:52 -0400 |
commit | d93b0c1aac1148a9b609baec3914c2f33f546519 (patch) | |
tree | 79670080b55dc5cc41d31c096adc65ebb979091c | |
parent | 1a76bb3162479a8897272ca4928ef2e0be849e21 (diff) |
bring func_801DBB48 closer to matching
-rw-r--r-- | asm/bss_2.s | 3 | ||||
-rw-r--r-- | asm/code_801DBB3C_asm.s | 11 | ||||
-rw-r--r-- | asm/ctors_2.s | 1 | ||||
-rw-r--r-- | asm/sbss_2.s | 9 | ||||
-rw-r--r-- | include/code_801DBB3C.h | 7 | ||||
-rw-r--r-- | src/code_801DB040.cpp | 2 | ||||
-rw-r--r-- | src/code_801DBB3C.cpp | 91 |
7 files changed, 43 insertions, 81 deletions
diff --git a/asm/bss_2.s b/asm/bss_2.s index d2c9f39..0879621 100644 --- a/asm/bss_2.s +++ b/asm/bss_2.s @@ -1,8 +1,5 @@ .section .bss, "wa" # 0x80474F00 - 0x80643050
-.global lbl_80491470
-lbl_80491470:
- .skip 0x380
.global lbl_804917F0
lbl_804917F0:
.skip 0x40
diff --git a/asm/code_801DBB3C_asm.s b/asm/code_801DBB3C_asm.s index 394cdb1..4ea72fe 100644 --- a/asm/code_801DBB3C_asm.s +++ b/asm/code_801DBB3C_asm.s @@ -1,14 +1,3 @@ .include "macros.inc"
.section .text, "ax" # 0x80006980 - 0x803E1E60
-
-.global func_801DBE70
-func_801DBE70:
-/* 801DBE70 001D7AD0 38 A0 00 01 */ li r5, 1
-/* 801DBE74 001D7AD4 38 6D A0 50 */ addi r3, r13, lbl_8063F310-_SDA_BASE_
-/* 801DBE78 001D7AD8 38 80 00 04 */ li r4, 4
-/* 801DBE7C 001D7ADC 38 00 00 00 */ li r0, 0
-/* 801DBE80 001D7AE0 98 AD A0 50 */ stb r5, lbl_8063F310-_SDA_BASE_(r13)
-/* 801DBE84 001D7AE4 B0 83 00 02 */ sth r4, 2(r3)
-/* 801DBE88 001D7AE8 98 03 00 04 */ stb r0, 4(r3)
-/* 801DBE8C 001D7AEC 4E 80 00 20 */ blr
diff --git a/asm/ctors_2.s b/asm/ctors_2.s index bc10cf0..d0465f4 100644 --- a/asm/ctors_2.s +++ b/asm/ctors_2.s @@ -2,7 +2,6 @@ .section .ctors, "wa" # 0x803E1E60 - 0x803E22A0
-.4byte func_801DBE70
.4byte func_801DCE4C, func_801DD5A8, func_801DD8A0, func_801DDF58
.4byte func_801DF020, func_801E07C8, func_801E07F0, func_801E0A34
.4byte func_801E4308, func_801E472C, func_801E5F5C, func_801E6BD8
diff --git a/asm/sbss_2.s b/asm/sbss_2.s index 48ba9f2..4f0b423 100644 --- a/asm/sbss_2.s +++ b/asm/sbss_2.s @@ -1,11 +1,8 @@ .section .sbss, "wa" # 0x80474F00 - 0x80643050
-.global lbl_8063F30C
-lbl_8063F30C:
- .skip 0x4
-.global lbl_8063F310
-lbl_8063F310:
- .skip 0x8
+.global lbl_8063F316
+lbl_8063F316:
+ .skip 0x2
.global lbl_8063F318
lbl_8063F318:
.skip 0x6
diff --git a/include/code_801DBB3C.h b/include/code_801DBB3C.h index 1c387cf..dc96371 100644 --- a/include/code_801DBB3C.h +++ b/include/code_801DBB3C.h @@ -11,7 +11,7 @@ extern "C" { struct gUnkClass3
{
gUnkClass3* unk0; // pointer to the next free block
- gUnkClass1 unk4;
+ gUnkClass1 unk4; // flexible array member to make this generic?
};
// linked list node free store?
@@ -19,9 +19,10 @@ struct gUnkClass2 {
u32 unk0; // counter for blocks currently allocated?
u32 unk4; // maximum number of blocks allocated so far?
- u32 unk8; // checked heavily in func_801DBD74
+ u32 unk8; // number of linked list nodes initially requested
size_t unkC; // block size
- u8 unk10[0x8];
+ u8* unk10; // TODO: change to gUnkClass3* for unk10 and unk14?
+ u8* unk14; // pointer to "end" block?
gUnkClass3* unk18; // head of the linked list of free nodes
};
diff --git a/src/code_801DB040.cpp b/src/code_801DB040.cpp index 088dc2a..ce9740a 100644 --- a/src/code_801DB040.cpp +++ b/src/code_801DB040.cpp @@ -53,7 +53,7 @@ gUnkClass1* func_801DB07C(gUnkClass1* p1, BOOL p2) void func_801DB15C(u32 p1)
{
- gUnk8063F2EC = func_801DBD74(p1, 36);
+ gUnk8063F2EC = func_801DBD74(p1, sizeof(gUnkClass1));
}
static void* func_801DB184(MEMHeapHandle heap, u32 size, u32 p3, u32 p4, gFuncPtr1 p5)
diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp index 6ab2959..5d0c4a1 100644 --- a/src/code_801DBB3C.cpp +++ b/src/code_801DBB3C.cpp @@ -5,35 +5,9 @@ #include "code_801DB040.h"
#include "code_801DBB3C.h"
-namespace
-{
-
- // might be same as above
- struct unkClass2
- {
- unkClass2* unk0;
- gUnkClass1* unk4;
- u8 unk8[4];
- size_t unkC;
-
-
- };
-
- // gUnkClass2?
- struct unkClass
- {
- u8 pad[0x8];
- u32 unk8;
- u32 unkC;
- void* unk10;
- u32 unk14;
- unkClass2* unk18;
- };
-
-
-
-}
-
+// array of free stores
+static gUnkClass2 gUnk80491470[32];
+static ctorStruct gUnk8063F310(1, 4, 0);
extern "C" {
@@ -50,30 +24,38 @@ void func_801DBB44(u32) }
//static
+#define NONMATCHING
#ifdef NONMATCHING
-void func_801DBB48(gUnkClass2* p1, u32 p2, u32 p3)
+void func_801DBB48(gUnkClass2* p1, size_t nodes, size_t size)
{
- //p2 = r30
- u32 r31 = (p3+7) & ~0x3; // element size
- p1->unk8 = p2; // number of elements
+ size_t r31, r30;
+ gUnkClass2* r29;
+ // nodes in r30
+ // element size + 4, rounded up (for gUnkClass3)
+ size += 7;
+ r31 = size & ~0x3;
+ r30 = nodes;
+ r29 = p1;
+ p1->unk8 = nodes; // number of elements
p1->unkC = r31;
// void* func_801DAD98(u32 size); allocate and 0 fill
- void* data = func_801DAD98((p2+1) * r31); //r3
- p1->unk10 = data;
- p1->unk18 = data;
- p1->unk14 = (u8*)data + p2 * r31;
- if (p2) {
- if (p2 > 8) {
- u32 r4 = p2 - 8;
- if (r4 > 0) {
- for (size_t i = (r4+7)/8; i != 0; i--) {
- // 8 stores per iteration
-
-
- }
- }
- }
+ // allocate memory blocks for free store. Extra node at the end
+ // represents stop?
+ u8* data = (u8*)func_801DAD98((nodes+1) * r31); //r3
+ r29->unk10 = data;
+ r29->unk18 = (gUnkClass3*)data;
+ r29->unk14 = data + (r30 * r31);
+ gUnkClass3* r8 = NULL;
+ size_t i;
+ u8* curr = data;
+ u8* next = data + r31;
+ for (i = 0; i < r30; curr = next, next += r31, i++) {
+ // TODO: compiler is precomputing offsets into the array before the
+ // loop beings but I want it to compute all offsets within the loop
+ ((gUnkClass3*)curr)->unk0 = (gUnkClass3*)next;
+ r8 = (gUnkClass3*)curr;
}
+ r8->unk0 = NULL;
}
#else
asm void func_801DBB48(gUnkClass2* p1, u32 p2, u32 p3)
@@ -190,20 +172,17 @@ 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)
-{
+gUnkClass2* func_801DBD74(u32 nodes, u32 size)
+{
size_t i;
for (i = 0; i < 32; i++)
- if (lbl_80491470[i].unk8 == 0)
+ if (gUnk80491470[i].unk8 == 0)
break;
- gUnkClass2* r31 = &lbl_80491470[i];
+ gUnkClass2* r31 = &gUnk80491470[i];
if (r31->unk8)
return NULL;
- func_801DBB48(r31, p1, p2);
+ func_801DBB48(r31, nodes, size);
return r31;
}
|