diff options
author | Max <mparisi@stevens.edu> | 2020-10-18 13:51:17 -0400 |
---|---|---|
committer | Max <mparisi@stevens.edu> | 2020-10-18 13:51:17 -0400 |
commit | 8568daeb69769a56131bb4451fe3e18a7a252fb0 (patch) | |
tree | b57894be502f275021cbab94d5f2cfbfd679cfc4 | |
parent | 3ac8c8de6aefd3d31498a8a638f196838cffd523 (diff) |
match func_801DAFAC using an inline asm block
-rw-r--r-- | asm/code_801DAAE0_asm.s | 64 | ||||
-rw-r--r-- | asm/ctors_2.s | 2 | ||||
-rw-r--r-- | asm/sbss_2.s | 15 | ||||
-rw-r--r-- | include/code_801DAAE0.h | 5 | ||||
-rw-r--r-- | include/unkStruct.h | 3 | ||||
-rw-r--r-- | src/code_801DAAE0.cpp | 88 |
6 files changed, 60 insertions, 117 deletions
diff --git a/asm/code_801DAAE0_asm.s b/asm/code_801DAAE0_asm.s index e66f191..4ea72fe 100644 --- a/asm/code_801DAAE0_asm.s +++ b/asm/code_801DAAE0_asm.s @@ -1,67 +1,3 @@ .include "macros.inc"
.section .text, "ax" # 0x80006980 - 0x803E1E60
-
-.global func_801DAF70
-func_801DAF70:
-/* 801DAF70 001D6BD0 94 21 FF E0 */ stwu r1, -0x20(r1)
-/* 801DAF74 001D6BD4 7C 08 02 A6 */ mflr r0
-/* 801DAF78 001D6BD8 3C C0 80 1E */ lis r6, lbl_801DAF1C@ha
-/* 801DAF7C 001D6BDC 90 01 00 24 */ stw r0, 0x24(r1)
-/* 801DAF80 001D6BE0 38 00 00 00 */ li r0, 0
-/* 801DAF84 001D6BE4 38 A1 00 08 */ addi r5, r1, 8
-/* 801DAF88 001D6BE8 B0 81 00 0C */ sth r4, 0xc(r1)
-/* 801DAF8C 001D6BEC 38 86 AF 1C */ addi r4, r6, lbl_801DAF1C@l
-/* 801DAF90 001D6BF0 90 61 00 08 */ stw r3, 8(r1)
-/* 801DAF94 001D6BF4 90 01 00 10 */ stw r0, 0x10(r1)
-/* 801DAF98 001D6BF8 48 0B C3 C5 */ bl MEMVisitAllocatedForExpHeap
-/* 801DAF9C 001D6BFC 80 01 00 24 */ lwz r0, 0x24(r1)
-/* 801DAFA0 001D6C00 7C 08 03 A6 */ mtlr r0
-/* 801DAFA4 001D6C04 38 21 00 20 */ addi r1, r1, 0x20
-/* 801DAFA8 001D6C08 4E 80 00 20 */ blr
-
-.global func_801DAFAC
-func_801DAFAC:
-/* 801DAFAC 001D6C0C 54 60 06 FF */ clrlwi. r0, r3, 0x1b
-/* 801DAFB0 001D6C10 40 82 00 14 */ bne lbl_801DAFC4
-/* 801DAFB4 001D6C14 54 80 06 FF */ clrlwi. r0, r4, 0x1b
-/* 801DAFB8 001D6C18 40 82 00 0C */ bne lbl_801DAFC4
-/* 801DAFBC 001D6C1C 54 A0 06 FF */ clrlwi. r0, r5, 0x1b
-/* 801DAFC0 001D6C20 41 82 00 08 */ beq lbl_801DAFC8
-lbl_801DAFC4:
-/* 801DAFC4 001D6C24 4B E2 90 3C */ b memcpy
-lbl_801DAFC8:
-/* 801DAFC8 001D6C28 54 A5 D9 7E */ srwi r5, r5, 5
-/* 801DAFCC 001D6C2C 7C A9 03 A6 */ mtctr r5
-/* 801DAFD0 001D6C30 38 63 FF FC */ addi r3, r3, -4
-/* 801DAFD4 001D6C34 38 84 FF FC */ addi r4, r4, -4
-lbl_801DAFD8:
-/* 801DAFD8 001D6C38 84 04 00 04 */ lwzu r0, 4(r4)
-/* 801DAFDC 001D6C3C 84 A4 00 04 */ lwzu r5, 4(r4)
-/* 801DAFE0 001D6C40 84 C4 00 04 */ lwzu r6, 4(r4)
-/* 801DAFE4 001D6C44 84 E4 00 04 */ lwzu r7, 4(r4)
-/* 801DAFE8 001D6C48 85 04 00 04 */ lwzu r8, 4(r4)
-/* 801DAFEC 001D6C4C 85 24 00 04 */ lwzu r9, 4(r4)
-/* 801DAFF0 001D6C50 85 44 00 04 */ lwzu r10, 4(r4)
-/* 801DAFF4 001D6C54 85 64 00 04 */ lwzu r11, 4(r4)
-/* 801DAFF8 001D6C58 94 03 00 04 */ stwu r0, 4(r3)
-/* 801DAFFC 001D6C5C 94 A3 00 04 */ stwu r5, 4(r3)
-/* 801DB000 001D6C60 94 C3 00 04 */ stwu r6, 4(r3)
-/* 801DB004 001D6C64 94 E3 00 04 */ stwu r7, 4(r3)
-/* 801DB008 001D6C68 95 03 00 04 */ stwu r8, 4(r3)
-/* 801DB00C 001D6C6C 95 23 00 04 */ stwu r9, 4(r3)
-/* 801DB010 001D6C70 95 43 00 04 */ stwu r10, 4(r3)
-/* 801DB014 001D6C74 95 63 00 04 */ stwu r11, 4(r3)
-/* 801DB018 001D6C78 42 00 FF C0 */ bdnz lbl_801DAFD8
-/* 801DB01C 001D6C7C 4E 80 00 20 */ blr
-
-.global func_801DB020
-func_801DB020:
-/* 801DB020 001D6C80 38 A0 00 01 */ li r5, 1
-/* 801DB024 001D6C84 38 6D A0 10 */ addi r3, r13, lbl_8063F2D0-_SDA_BASE_
-/* 801DB028 001D6C88 38 80 00 04 */ li r4, 4
-/* 801DB02C 001D6C8C 38 00 00 00 */ li r0, 0
-/* 801DB030 001D6C90 98 AD A0 10 */ stb r5, lbl_8063F2D0-_SDA_BASE_(r13)
-/* 801DB034 001D6C94 B0 83 00 02 */ sth r4, 2(r3)
-/* 801DB038 001D6C98 98 03 00 04 */ stb r0, 4(r3)
-/* 801DB03C 001D6C9C 4E 80 00 20 */ blr
diff --git a/asm/ctors_2.s b/asm/ctors_2.s index ae5eae4..5f24e74 100644 --- a/asm/ctors_2.s +++ b/asm/ctors_2.s @@ -2,7 +2,7 @@ .section .ctors, "wa" # 0x803E1E60 - 0x803E22A0
-.4byte func_801DB020, func_801DB7FC, func_801DBB1C, func_801DBE70
+.4byte func_801DB7FC, func_801DBB1C, 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 eb7438a..1a94e0d 100644 --- a/asm/sbss_2.s +++ b/asm/sbss_2.s @@ -1,20 +1,5 @@ .section .sbss, "wa" # 0x80474F00 - 0x80643050
-.global lbl_8063F2D0
-lbl_8063F2D0:
- .skip 0x6
-.global lbl_8063F2D6
-lbl_8063F2D6:
- .skip 0x1
-.global lbl_8063F2D7
-lbl_8063F2D7:
- .skip 0x1
-.global lbl_8063F2D8
-lbl_8063F2D8:
- .skip 0x4
-.global lbl_8063F2DC
-lbl_8063F2DC:
- .skip 0x4
.global lbl_8063F2E0
lbl_8063F2E0:
.skip 0x8
diff --git a/include/code_801DAAE0.h b/include/code_801DAAE0.h index 94b9794..93d9fef 100644 --- a/include/code_801DAAE0.h +++ b/include/code_801DAAE0.h @@ -20,6 +20,7 @@ struct unkClass2 {
MEMHeapHandle heap;
u16 groupID;
+ u32 unk8;
};
@@ -49,8 +50,8 @@ void func_801DAEA4(void *memBlock); u32 func_801DAEE0(const void *memBlock);
u32 func_801DAEF8(void);
void lbl_801DAF1C(void *memBlock, MEMHeapHandle, u32 p3);
-
-
+void func_801DAF70(MEMHeapHandle heap, u16 groupID);
+void func_801DAFAC(void *dest, const void *src, size_t n);
void func_801DAEA4(void*);
#ifdef __cplusplus
diff --git a/include/unkStruct.h b/include/unkStruct.h index 73d3cfc..34b40f1 100644 --- a/include/unkStruct.h +++ b/include/unkStruct.h @@ -4,7 +4,7 @@ // Note: Many instances of this class appear in .sbss, and they are partially initialized
// by the static initializers in .ctors
-class unkStruct
+struct unkStruct
{
u8 unk0;
u16 unk2;
@@ -12,7 +12,6 @@ class unkStruct u8 unk5;
u8 unk6;
u8 unk7;
-public:
unkStruct(u8 p1, u16 p2, u8 p3)
: unk0(p1), unk2(p2), unk4(p3) { }
};
diff --git a/src/code_801DAAE0.cpp b/src/code_801DAAE0.cpp index d999cdc..795607d 100644 --- a/src/code_801DAAE0.cpp +++ b/src/code_801DAAE0.cpp @@ -6,16 +6,19 @@ extern "C" {
-// unkStruct gUnk8063F2D0(1, 4, 0);
+unkStruct gUnk8063F2D0(1, 4, 0);
+MEMHeapHandle lbl_8063F2D8;
+u16 lbl_8063F2DC;
+
// TODO: move to headers
extern MEMHeapHandle lbl_8063E8E8;
extern MEMHeapHandle lbl_8063E8EC;
-extern u8 lbl_8063F2D6;
-extern u8 lbl_8063F2D7;
-extern MEMHeapHandle lbl_8063F2D8;
-extern u16 lbl_8063F2DC;
+
+
+typedef void (*MEMHeapVisitor)(void *memBlock, MEMHeapHandle heap, u32 userParam);
void *memset(void *s, int c, size_t n);
+void *memcpy(void *dest, const void *src, size_t n);
MEMHeapHandle MEMCreateExpHeapEx(void* p1, u32 p2, u16 p3);
u16 MEMSetGroupIDForExpHeap(MEMHeapHandle heap, u16 groupID);
void *MEMAllocFromExpHeapEx(MEMHeapHandle heap, u32 size, int alignment);
@@ -24,7 +27,7 @@ void MEMFreeToExpHeap(MEMHeapHandle heap, void *memBlock); u32 MEMGetSizeForMBlockExpHeap(const void *memBlock);
u32 MEMGetTotalFreeSizeForExpHeap(MEMHeapHandle heap);
u16 MEMGetGroupIDForMBlockExpHeap(const void *memBlock);
-//void MEMVisitAllocatedForExpHeap(MEMHeapHandle heap, MEMHeapVisitor visitor, u32 userParam);
+void MEMVisitAllocatedForExpHeap(MEMHeapHandle heap, MEMHeapVisitor visitor, u32 userParam);
unkClass gUnk804912B0[16];
@@ -39,7 +42,7 @@ unkClass* func_801DAAE0(void) BOOL func_801DAB28(void)
{
- return lbl_8063F2D6;
+ return gUnk8063F2D0.unk6;
}
void func_801DAB30(void)
@@ -47,8 +50,8 @@ void func_801DAB30(void) memset(gUnk804912B0, 0, sizeof(gUnk804912B0));
lbl_8063F2D8 = 0;
lbl_8063F2DC = 0;
- lbl_8063F2D6 = 1;
- lbl_8063F2D7 = 0;
+ gUnk8063F2D0.unk6 = 1;
+ gUnk8063F2D0.unk7 = 0;
}
MEMHeapHandle func_801DAB78(void* p1, u32 p2, u16 p3)
@@ -190,30 +193,49 @@ void lbl_801DAF1C(void *memBlock, MEMHeapHandle, u32 p3) MEMFreeToExpHeap(((unkClass2 *)p3)->heap, memBlock);
}
-/*
-func_801DAF70
-{
- lbl_801DAF1C
+void func_801DAF70(MEMHeapHandle heap, u16 groupID)
+{
+ unkClass2 param;
+ param.heap = heap;
+ param.groupID = groupID;
+ param.unk8 = 0;
+ MEMVisitAllocatedForExpHeap(heap, lbl_801DAF1C, (u32)¶m);
+}
+
+void func_801DAFAC(register void *dest, register const void *src, register size_t n)
+{
+ if ((u32)dest & 0x1f || (u32)src & 0x1f || n & 0x1f) {
+ memcpy(dest, src, n);
+ } else {
+ n /= 32;
+ // Note: reg0 prevents the previous if condition from using
+ // r12 as its scratch register instead of r0
+ register u32 reg0;
+ asm
+ {
+ mtctr n
+ addi r3, dest, -4
+ addi r4, src, -4
+ lbl_801DAFD8:
+ lwzu reg0, 4(r4)
+ lwzu r5, 4(r4)
+ lwzu r6, 4(r4)
+ lwzu r7, 4(r4)
+ lwzu r8, 4(r4)
+ lwzu r9, 4(r4)
+ lwzu r10, 4(r4)
+ lwzu r11, 4(r4)
+ stwu reg0, 4(r3)
+ stwu r5, 4(r3)
+ stwu r6, 4(r3)
+ stwu r7, 4(r3)
+ stwu r8, 4(r3)
+ stwu r9, 4(r3)
+ stwu r10, 4(r3)
+ stwu r11, 4(r3)
+ bdnz lbl_801DAFD8
+ }
+ }
}
-*/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
}
|