From ad63244f06faaf566506dfbba2c8c8e71226180c Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 2 Nov 2020 11:05:00 -0500 Subject: start decompiling code_801DD8C0.o --- src/code_801DD8C0.cpp | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/code_801DD8C0.cpp (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp new file mode 100644 index 0000000..8636ccc --- /dev/null +++ b/src/code_801DD8C0.cpp @@ -0,0 +1,127 @@ +#include +#include "code_801DAAE0.h" +#include "code_801DD5C8.h" + +// TODO: C++ + +extern "C" { + +// TODO: determine file that defines this +extern MEMHeapHandle lbl_8063E8F8; + +struct gUnkClass10 +{ + gUnkClass8* unk0; // TODO: check type + gUnkClass7* unk4; +}; + +// TODO: gUnkClass10 constructor? +gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) +{ + p1->unk0 = p2; + p1->unk4 = 0; + if (p2) { + gUnkClass7* r3; + if (func_801DAB28()) + r3 = (gUnkClass7*)func_801DAC94(lbl_8063E8F8, sizeof(gUnkClass7)); + else + r3 = NULL; + + if (r3) { + r3->unk0 = NULL; + r3->unk4 = 0; + r3->unk6 = 0xC; + r3->unk8 = 1.0f; + r3->unkC = 0.0f; + } + p1->unk4 = r3; + } + return p1; +} + +// TODO: Destructor. Get mwcc to generate parts of this function implicitly +gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) +{ + if (p1) { + if (p1->unk4) { + func_801DAD48(lbl_8063E8F8, p1->unk4); + p1->unk4 = NULL; + } + if (p2 > 0) + func_801DAD48(lbl_8063E8F8, p1); + } + return p1; +} + +// NONMATCHING +void func_801DD9C8(gUnkClass10* p1, float p2) +{ + if (p1->unk4) { + BOOL flag = FALSE; + if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) + flag = TRUE; + if (flag) { + func_801DD5C8(p1->unk4, p2); + func_801DD7FC(p1->unk4, p1, 0); + BOOL flag2 = TRUE; //r4 + if (!(p1->unk4->unk6 & 0x8)) { + BOOL flag3 = FALSE; //r3 + if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) { + flag3 = TRUE; + } + if (flag3) + flag2 = FALSE; + if (flag2 && !(p1->unk4->unk6 & 0x10)) { + p1->unk4->unk6 &= ~0x1; + } + } + } + } +} + +// TODO: assuming gUnkClass8* member here +//static +gUnkClass8* func_801DDA94(gUnkClass10* p1, u16 p2) +{ + gUnkClass8* p = p1->unk0; + while (p) { + if (p->unk0 == p2) + return p; + p = p->next; + } + return NULL; +} + +func_801DDABC +{ + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} //extern "C" -- cgit v1.2.3 From 0e08bf4c6af66095cf6294df9354cf77adaf992a Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 5 Nov 2020 12:14:26 -0500 Subject: decompile code_801DD8C0 with some nonmatchings --- src/code_801DD8C0.cpp | 186 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 169 insertions(+), 17 deletions(-) (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index 8636ccc..cd42f0f 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -1,9 +1,12 @@ +#include "ctorStruct.h" #include #include "code_801DAAE0.h" #include "code_801DD5C8.h" // TODO: C++ +static ctorStruct gUnk8063F350(1, 4, 0); + extern "C" { // TODO: determine file that defines this @@ -13,20 +16,25 @@ struct gUnkClass10 { gUnkClass8* unk0; // TODO: check type gUnkClass7* unk4; + + // TODO: begin derived class? + gUnkClass7* unk8; + float unkC; }; // TODO: gUnkClass10 constructor? gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) { p1->unk0 = p2; - p1->unk4 = 0; + p1->unk4 = NULL; if (p2) { gUnkClass7* r3; if (func_801DAB28()) r3 = (gUnkClass7*)func_801DAC94(lbl_8063E8F8, sizeof(gUnkClass7)); else r3 = NULL; - + + // TODO: inlined gUnkClass7 constructor? if (r3) { r3->unk0 = NULL; r3->unk4 = 0; @@ -39,7 +47,7 @@ gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) return p1; } -// TODO: Destructor. Get mwcc to generate parts of this function implicitly +// TODO: gUnkClass10 destructor? Get mwcc to generate parts of this function implicitly gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) { if (p1) { @@ -53,23 +61,28 @@ gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) return p1; } +// Note: inferred static inline functions +static inline BOOL helper_1(gUnkClass7* p1) +{ + return p1->unk0 && (p1->unk6 & 0x1); +} + +static inline BOOL helper_2(gUnkClass7* p1) +{ + return !helper_1(p1) && !(p1->unk6 & 0x10); +} + +// TODO: "flag"s are the results of inline functions? // NONMATCHING void func_801DD9C8(gUnkClass10* p1, float p2) { if (p1->unk4) { - BOOL flag = FALSE; - if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) - flag = TRUE; - if (flag) { + if (helper_1(p1->unk4)) { func_801DD5C8(p1->unk4, p2); func_801DD7FC(p1->unk4, p1, 0); BOOL flag2 = TRUE; //r4 if (!(p1->unk4->unk6 & 0x8)) { - BOOL flag3 = FALSE; //r3 - if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) { - flag3 = TRUE; - } - if (flag3) + if (helper_1(p1->unk4)) flag2 = FALSE; if (flag2 && !(p1->unk4->unk6 & 0x10)) { p1->unk4->unk6 &= ~0x1; @@ -80,6 +93,7 @@ void func_801DD9C8(gUnkClass10* p1, float p2) } // TODO: assuming gUnkClass8* member here +// search linked list //static gUnkClass8* func_801DDA94(gUnkClass10* p1, u16 p2) { @@ -92,20 +106,158 @@ gUnkClass8* func_801DDA94(gUnkClass10* p1, u16 p2) return NULL; } -func_801DDABC +// allocate gUnkClass8 from heap, set unk4 member of p1 +// TODO: parameterized base class constructor? +void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) { - + gUnkClass7* r6 = p1->unk4; + if (r6) { + if (!(r6->unk6 & 0x10)) + r6->unk6 &= ~0x1; + gUnkClass8* r3 = func_801DDA94(p1, p2); + if (r3) { + gUnkClass7* r4 = p1->unk4; + if (!(r4->unk6 & 0x10)) { + r4->unk0 = r3; + r4->unkC = p4; + r4->unk8 = p5; + r4->unk4 = p3 & 0xFF; + r4->unk6 = 3; + } + } + } } +// TODO: derived class constructor? +gUnkClass10* func_801DDB64(gUnkClass10* p1, gUnkClass8* p2) +{ + func_801DD8C0(p1, p2); + p1->unk8 = NULL; + p1->unkC = 0.0f; + if (p1->unk4) { + gUnkClass7* r3; + if (func_801DAB28()) + r3 = (gUnkClass7*)func_801DAC94(lbl_8063E8F8, sizeof(gUnkClass7)); + else + r3 = NULL; + if (r3) { + r3->unk0 = NULL; + r3->unk4 = 0; + r3->unk6 = 0xC; + r3->unk8 = 1.0f; + r3->unkC = 0.0f; + } + p1->unk8 = r3; + } + return p1; +} +// TODO: derived class destructor? +gUnkClass10* func_801DDC08(gUnkClass10* p1, s32 p2) +{ + if (p1) { + if (p1->unk8) { + func_801DAD48(lbl_8063E8F8, p1->unk8); + p1->unk8 = NULL; + } + func_801DD958(p1, 0); + if (p2 > 0) + func_801DAD48(lbl_8063E8F8, p1); + } + return p1; +} +// derived class method calling base class method? +// NONMATCHING +void func_801DDC84(gUnkClass10* p1, float p2) +{ + if (p1->unk4) { + BOOL r29 = helper_1(p1->unk4); + + BOOL r30 = FALSE; + if (p1->unk8) { + BOOL r3 = helper_1(p1->unk8); + if (r3) + r30 = TRUE; + if (r29) + func_801DD5C8(p1->unk4, p2); + if (r30) { + func_801DD5C8(p1->unk8, p2); + r29 = TRUE; + p1->unk4->unk6 |= 0x2; + } + // inlined function call? + if (r29) { + func_801DD7FC(p1->unk4, p1, 0); + BOOL r4 = TRUE; + if (!(p1->unk4->unk6 & 0x8)) { + BOOL r3 = helper_1(p1->unk4); + if (r3) + r4 = FALSE; + } + if (r4 && !(p1->unk4->unk6 & 0x10)) { + p1->unk4->unk6 &= ~0x1; + } + } + if (r30) { + func_801DD7FC(p1->unk8, p1, 0); + BOOL r4 = TRUE; + if (!(p1->unk8->unk6 & 0x8)) { + BOOL r3 = helper_1(p1->unk8); + if (r3) + r4 = FALSE; + } + if (r4 && !(p1->unk8->unk6 & 0x10)) { + p1->unk8->unk6 &= ~0x1; + } + } + } + } +} +// TODO: inlining +// TODO: parameterized derived class constructor? +// This matches +void func_801DDE4C(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) +{ + if (p1->unk8) { + BOOL r6 = FALSE; + p1->unkC = 0.0f; + if (p1->unk8->unk0 && (p1->unk8->unk6 & 0x1)) { + r6 = TRUE; + } + if (r6 && !(p1->unk8->unk6 & 0x10)) { + p1->unk8->unk6 &= ~0x1; + } + } + func_801DDABC(p1, p2, p3, p4, p5); +} - - - +// derived class method? +// matches +void func_801DDEA0(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5, float p6) +{ + if (p1->unk8) { + if (!(p1->unk8->unk6 & 0x10)) { + p1->unk8->unk6 &= ~0x1; + } + gUnkClass8* r3 = func_801DDA94(p1, p2); + + if (r3) { + gUnkClass7* r4 = p1->unk8; + if (!(r4->unk6 & 0x10)) { + r4->unk0 = r3; + r4->unkC = p4; + r4->unk8 = p5; + r4->unk4 = p3 & 0xFF; + r4->unk6 = 3; + } + } + p1->unkC = p6; + } +} -- cgit v1.2.3 From aa7ebd0cf214f260a49d10333268c171621436ab Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 5 Nov 2020 14:43:29 -0500 Subject: fix control flow in func_801DD9C8 --- src/code_801DD8C0.cpp | 110 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 89 insertions(+), 21 deletions(-) (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index cd42f0f..43f6fa4 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -22,12 +22,16 @@ struct gUnkClass10 float unkC; }; + +#if 1 + // TODO: gUnkClass10 constructor? gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) { p1->unk0 = p2; p1->unk4 = NULL; if (p2) { + // TODO: inlined call to an overloaded new? gUnkClass7* r3; if (func_801DAB28()) r3 = (gUnkClass7*)func_801DAC94(lbl_8063E8F8, sizeof(gUnkClass7)); @@ -61,6 +65,9 @@ gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) return p1; } +#endif + + // Note: inferred static inline functions static inline BOOL helper_1(gUnkClass7* p1) { @@ -73,24 +80,99 @@ static inline BOOL helper_2(gUnkClass7* p1) } // TODO: "flag"s are the results of inline functions? -// NONMATCHING +#define NONMATCHING +#ifdef NONMATCHING void func_801DD9C8(gUnkClass10* p1, float p2) { if (p1->unk4) { - if (helper_1(p1->unk4)) { + BOOL flag = FALSE; + if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) + flag = TRUE; + if (flag) { func_801DD5C8(p1->unk4, p2); func_801DD7FC(p1->unk4, p1, 0); BOOL flag2 = TRUE; //r4 if (!(p1->unk4->unk6 & 0x8)) { - if (helper_1(p1->unk4)) + flag = FALSE; + if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) + flag = TRUE; + if (flag) flag2 = FALSE; - if (flag2 && !(p1->unk4->unk6 & 0x10)) { - p1->unk4->unk6 &= ~0x1; + } + if (flag2) { + gUnkClass7* r3 = p1->unk4; + if (!(r3->unk6 & 0x10)) { + r3->unk6 &= ~0x1; } } } } } +#else +asm void func_801DD9C8(gUnkClass10* p1, float p2) +{ + nofralloc +/* 801DD9C8 001D9628 94 21 FF F0 */ stwu r1, -0x10(r1) +/* 801DD9CC 001D962C 7C 08 02 A6 */ mflr r0 +/* 801DD9D0 001D9630 90 01 00 14 */ stw r0, 0x14(r1) +/* 801DD9D4 001D9634 93 E1 00 0C */ stw r31, 0xc(r1) +/* 801DD9D8 001D9638 7C 7F 1B 78 */ mr r31, r3 +/* 801DD9DC 001D963C 80 83 00 04 */ lwz r4, 4(r3) +/* 801DD9E0 001D9640 2C 04 00 00 */ cmpwi r4, 0 +/* 801DD9E4 001D9644 41 82 00 9C */ beq lbl_801DDA80 +/* 801DD9E8 001D9648 80 04 00 00 */ lwz r0, 0(r4) +/* 801DD9EC 001D964C 38 60 00 00 */ li r3, 0 +/* 801DD9F0 001D9650 2C 00 00 00 */ cmpwi r0, 0 +/* 801DD9F4 001D9654 41 82 00 14 */ beq lbl_801DDA08 +/* 801DD9F8 001D9658 A0 04 00 06 */ lhz r0, 6(r4) +/* 801DD9FC 001D965C 54 00 07 FF */ clrlwi. r0, r0, 0x1f +/* 801DDA00 001D9660 41 82 00 08 */ beq lbl_801DDA08 +/* 801DDA04 001D9664 38 60 00 01 */ li r3, 1 +lbl_801DDA08: +/* 801DDA08 001D9668 2C 03 00 00 */ cmpwi r3, 0 +/* 801DDA0C 001D966C 41 82 00 74 */ beq lbl_801DDA80 +/* 801DDA10 001D9670 7C 83 23 78 */ mr r3, r4 +/* 801DDA14 001D9674 4B FF FB B5 */ bl func_801DD5C8 +/* 801DDA18 001D9678 80 7F 00 04 */ lwz r3, 4(r31) +/* 801DDA1C 001D967C 7F E4 FB 78 */ mr r4, r31 +/* 801DDA20 001D9680 38 A0 00 00 */ li r5, 0 +/* 801DDA24 001D9684 4B FF FD D9 */ bl func_801DD7FC +/* 801DDA28 001D9688 80 DF 00 04 */ lwz r6, 4(r31) +/* 801DDA2C 001D968C 38 80 00 01 */ li r4, 1 +/* 801DDA30 001D9690 A0 A6 00 06 */ lhz r5, 6(r6) +/* 801DDA34 001D9694 54 A0 07 39 */ rlwinm. r0, r5, 0, 0x1c, 0x1c +/* 801DDA38 001D9698 40 82 00 2C */ bne lbl_801DDA64 +/* 801DDA3C 001D969C 80 06 00 00 */ lwz r0, 0(r6) +/* 801DDA40 001D96A0 38 60 00 00 */ li r3, 0 +/* 801DDA44 001D96A4 2C 00 00 00 */ cmpwi r0, 0 +/* 801DDA48 001D96A8 41 82 00 10 */ beq lbl_801DDA58 +/* 801DDA4C 001D96AC 54 A0 07 FF */ clrlwi. r0, r5, 0x1f +/* 801DDA50 001D96B0 41 82 00 08 */ beq lbl_801DDA58 +/* 801DDA54 001D96B4 38 60 00 01 */ li r3, 1 +lbl_801DDA58: +/* 801DDA58 001D96B8 2C 03 00 00 */ cmpwi r3, 0 +/* 801DDA5C 001D96BC 41 82 00 08 */ beq lbl_801DDA64 +/* 801DDA60 001D96C0 38 80 00 00 */ li r4, 0 +lbl_801DDA64: +/* 801DDA64 001D96C4 2C 04 00 00 */ cmpwi r4, 0 +/* 801DDA68 001D96C8 41 82 00 18 */ beq lbl_801DDA80 +/* 801DDA6C 001D96CC A0 66 00 06 */ lhz r3, 6(r6) +/* 801DDA70 001D96D0 54 60 06 F7 */ rlwinm. r0, r3, 0, 0x1b, 0x1b +/* 801DDA74 001D96D4 40 82 00 0C */ bne lbl_801DDA80 +/* 801DDA78 001D96D8 54 60 04 3C */ rlwinm r0, r3, 0, 0x10, 0x1e +/* 801DDA7C 001D96DC B0 06 00 06 */ sth r0, 6(r6) +lbl_801DDA80: +/* 801DDA80 001D96E0 80 01 00 14 */ lwz r0, 0x14(r1) +/* 801DDA84 001D96E4 83 E1 00 0C */ lwz r31, 0xc(r1) +/* 801DDA88 001D96E8 7C 08 03 A6 */ mtlr r0 +/* 801DDA8C 001D96EC 38 21 00 10 */ addi r1, r1, 0x10 +/* 801DDA90 001D96F0 4E 80 00 20 */ blr +} +#pragma peephole on +#endif + + +#if 1 // TODO: assuming gUnkClass8* member here // search linked list @@ -106,7 +188,7 @@ gUnkClass8* func_801DDA94(gUnkClass10* p1, u16 p2) return NULL; } -// allocate gUnkClass8 from heap, set unk4 member of p1 +// set unk4 member of p1 // TODO: parameterized base class constructor? void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) { @@ -260,20 +342,6 @@ void func_801DDEA0(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5, float p6 } - - - - - - - - - - - - - - - +#endif } //extern "C" -- cgit v1.2.3 From 60cfed1d6cfa6e6d0270994e9b8b8fb97468a490 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 5 Nov 2020 23:28:38 -0500 Subject: add two nonmatching ifdefs to code_801DD8C0 --- src/code_801DD8C0.cpp | 204 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 179 insertions(+), 25 deletions(-) (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index 43f6fa4..f27222e 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -25,6 +25,7 @@ struct gUnkClass10 #if 1 +// caller provides a linked list of gUnkClass8 // TODO: gUnkClass10 constructor? gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) { @@ -79,22 +80,33 @@ static inline BOOL helper_2(gUnkClass7* p1) return !helper_1(p1) && !(p1->unk6 & 0x10); } + +static inline BOOL TestFunction(gUnkClass7* ptr) +{ + return ptr->unk0 && ptr->unk6 & 0x1; +} + +// if bit 4 is cleared, clear bit 0 +static inline void ClearFunction(gUnkClass7* ptr) +{ + if (!(ptr->unk6 & 0x10)) + ptr->unk6 &= ~0x1; +} + // TODO: "flag"s are the results of inline functions? -#define NONMATCHING #ifdef NONMATCHING +// r4/r6 regswap void func_801DD9C8(gUnkClass10* p1, float p2) { if (p1->unk4) { - BOOL flag = FALSE; - if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) - flag = TRUE; - if (flag) { + if (TestFunction(p1->unk4)) { func_801DD5C8(p1->unk4, p2); func_801DD7FC(p1->unk4, p1, 0); BOOL flag2 = TRUE; //r4 + u16* new_var = &p1->unk4->unk6; if (!(p1->unk4->unk6 & 0x8)) { - flag = FALSE; - if (p1->unk4->unk0 && (p1->unk4->unk6 & 0x1)) + BOOL flag = FALSE; + if (p1->unk4->unk0 && (*new_var & 0x1)) flag = TRUE; if (flag) flag2 = FALSE; @@ -189,7 +201,6 @@ gUnkClass8* func_801DDA94(gUnkClass10* p1, u16 p2) } // set unk4 member of p1 -// TODO: parameterized base class constructor? void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) { gUnkClass7* r6 = p1->unk4; @@ -204,7 +215,7 @@ void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) r4->unkC = p4; r4->unk8 = p5; r4->unk4 = p3 & 0xFF; - r4->unk6 = 3; + r4->unk6 = 0x3; } } } @@ -250,9 +261,23 @@ gUnkClass10* func_801DDC08(gUnkClass10* p1, s32 p2) return p1; } +static inline void InlineFunction(gUnkClass10* p1, gUnkClass7* p2) +{ + func_801DD7FC(p2, p1, 0); + BOOL r4 = TRUE; + if (!(p2->unk6 & 0x8)) { + BOOL r3 = helper_1(p2); + if (r3) + r4 = FALSE; + } + if (r4 && !(p2->unk6 & 0x10)) { + p2->unk6 &= ~0x1; + } +} // derived class method calling base class method? -// NONMATCHING +#ifdef NONMATCHING +// regswaps and instruction ordering void func_801DDC84(gUnkClass10* p1, float p2) { if (p1->unk4) { @@ -275,7 +300,7 @@ void func_801DDC84(gUnkClass10* p1, float p2) func_801DD7FC(p1->unk4, p1, 0); BOOL r4 = TRUE; if (!(p1->unk4->unk6 & 0x8)) { - BOOL r3 = helper_1(p1->unk4); + BOOL r3 = p1->unk4->unk0 && (p1->unk4->unk6 & 0x1); if (r3) r4 = FALSE; } @@ -287,7 +312,7 @@ void func_801DDC84(gUnkClass10* p1, float p2) func_801DD7FC(p1->unk8, p1, 0); BOOL r4 = TRUE; if (!(p1->unk8->unk6 & 0x8)) { - BOOL r3 = helper_1(p1->unk8); + BOOL r3 = p1->unk8->unk0 && (p1->unk8->unk6 & 0x1); if (r3) r4 = FALSE; } @@ -298,35 +323,164 @@ void func_801DDC84(gUnkClass10* p1, float p2) } } } +#else +asm void func_801DDC84(gUnkClass10* p1, float p2) +{ + nofralloc +/* 801DDC84 001D98E4 94 21 FF E0 */ stwu r1, -0x20(r1) +/* 801DDC88 001D98E8 7C 08 02 A6 */ mflr r0 +/* 801DDC8C 001D98EC 90 01 00 24 */ stw r0, 0x24(r1) +/* 801DDC90 001D98F0 DB E1 00 18 */ stfd f31, 0x18(r1) +/* 801DDC94 001D98F4 FF E0 08 90 */ fmr f31, f1 +/* 801DDC98 001D98F8 93 E1 00 14 */ stw r31, 0x14(r1) +/* 801DDC9C 001D98FC 7C 7F 1B 78 */ mr r31, r3 +/* 801DDCA0 001D9900 93 C1 00 10 */ stw r30, 0x10(r1) +/* 801DDCA4 001D9904 93 A1 00 0C */ stw r29, 0xc(r1) +/* 801DDCA8 001D9908 80 83 00 04 */ lwz r4, 4(r3) +/* 801DDCAC 001D990C 2C 04 00 00 */ cmpwi r4, 0 +/* 801DDCB0 001D9910 41 82 01 7C */ beq lbl_801DDE2C +/* 801DDCB4 001D9914 80 04 00 00 */ lwz r0, 0(r4) +/* 801DDCB8 001D9918 3B A0 00 00 */ li r29, 0 +/* 801DDCBC 001D991C 2C 00 00 00 */ cmpwi r0, 0 +/* 801DDCC0 001D9920 41 82 00 14 */ beq lbl_801DDCD4 +/* 801DDCC4 001D9924 A0 04 00 06 */ lhz r0, 6(r4) +/* 801DDCC8 001D9928 54 00 07 FF */ clrlwi. r0, r0, 0x1f +/* 801DDCCC 001D992C 41 82 00 08 */ beq lbl_801DDCD4 +/* 801DDCD0 001D9930 3B A0 00 01 */ li r29, 1 +lbl_801DDCD4: +/* 801DDCD4 001D9934 80 A3 00 08 */ lwz r5, 8(r3) +/* 801DDCD8 001D9938 3B C0 00 00 */ li r30, 0 +/* 801DDCDC 001D993C 2C 05 00 00 */ cmpwi r5, 0 +/* 801DDCE0 001D9940 41 82 00 30 */ beq lbl_801DDD10 +/* 801DDCE4 001D9944 80 05 00 00 */ lwz r0, 0(r5) +/* 801DDCE8 001D9948 38 60 00 00 */ li r3, 0 +/* 801DDCEC 001D994C 2C 00 00 00 */ cmpwi r0, 0 +/* 801DDCF0 001D9950 41 82 00 14 */ beq lbl_801DDD04 +/* 801DDCF4 001D9954 A0 05 00 06 */ lhz r0, 6(r5) +/* 801DDCF8 001D9958 54 00 07 FF */ clrlwi. r0, r0, 0x1f +/* 801DDCFC 001D995C 41 82 00 08 */ beq lbl_801DDD04 +/* 801DDD00 001D9960 38 60 00 01 */ li r3, 1 +lbl_801DDD04: +/* 801DDD04 001D9964 2C 03 00 00 */ cmpwi r3, 0 +/* 801DDD08 001D9968 41 82 00 08 */ beq lbl_801DDD10 +/* 801DDD0C 001D996C 3B C0 00 01 */ li r30, 1 +lbl_801DDD10: +/* 801DDD10 001D9970 2C 1D 00 00 */ cmpwi r29, 0 +/* 801DDD14 001D9974 41 82 00 10 */ beq lbl_801DDD24 +/* 801DDD18 001D9978 FC 20 F8 90 */ fmr f1, f31 +/* 801DDD1C 001D997C 7C 83 23 78 */ mr r3, r4 +/* 801DDD20 001D9980 4B FF F8 A9 */ bl func_801DD5C8 +lbl_801DDD24: +/* 801DDD24 001D9984 2C 1E 00 00 */ cmpwi r30, 0 +/* 801DDD28 001D9988 41 82 00 24 */ beq lbl_801DDD4C +/* 801DDD2C 001D998C FC 20 F8 90 */ fmr f1, f31 +/* 801DDD30 001D9990 80 7F 00 08 */ lwz r3, 8(r31) +/* 801DDD34 001D9994 4B FF F8 95 */ bl func_801DD5C8 +/* 801DDD38 001D9998 80 7F 00 04 */ lwz r3, 4(r31) +/* 801DDD3C 001D999C 3B A0 00 01 */ li r29, 1 +/* 801DDD40 001D99A0 A0 03 00 06 */ lhz r0, 6(r3) +/* 801DDD44 001D99A4 60 00 00 02 */ ori r0, r0, 2 +/* 801DDD48 001D99A8 B0 03 00 06 */ sth r0, 6(r3) +lbl_801DDD4C: +/* 801DDD4C 001D99AC 2C 1D 00 00 */ cmpwi r29, 0 +/* 801DDD50 001D99B0 41 82 00 6C */ beq lbl_801DDDBC +/* 801DDD54 001D99B4 80 7F 00 04 */ lwz r3, 4(r31) +/* 801DDD58 001D99B8 7F E4 FB 78 */ mr r4, r31 +/* 801DDD5C 001D99BC 38 A0 00 00 */ li r5, 0 +/* 801DDD60 001D99C0 4B FF FA 9D */ bl func_801DD7FC +/* 801DDD64 001D99C4 80 DF 00 04 */ lwz r6, 4(r31) +/* 801DDD68 001D99C8 38 80 00 01 */ li r4, 1 +/* 801DDD6C 001D99CC A0 A6 00 06 */ lhz r5, 6(r6) +/* 801DDD70 001D99D0 54 A0 07 39 */ rlwinm. r0, r5, 0, 0x1c, 0x1c +/* 801DDD74 001D99D4 40 82 00 2C */ bne lbl_801DDDA0 +/* 801DDD78 001D99D8 80 06 00 00 */ lwz r0, 0(r6) +/* 801DDD7C 001D99DC 38 60 00 00 */ li r3, 0 +/* 801DDD80 001D99E0 2C 00 00 00 */ cmpwi r0, 0 +/* 801DDD84 001D99E4 41 82 00 10 */ beq lbl_801DDD94 +/* 801DDD88 001D99E8 54 A0 07 FF */ clrlwi. r0, r5, 0x1f +/* 801DDD8C 001D99EC 41 82 00 08 */ beq lbl_801DDD94 +/* 801DDD90 001D99F0 38 60 00 01 */ li r3, 1 +lbl_801DDD94: +/* 801DDD94 001D99F4 2C 03 00 00 */ cmpwi r3, 0 +/* 801DDD98 001D99F8 41 82 00 08 */ beq lbl_801DDDA0 +/* 801DDD9C 001D99FC 38 80 00 00 */ li r4, 0 +lbl_801DDDA0: +/* 801DDDA0 001D9A00 2C 04 00 00 */ cmpwi r4, 0 +/* 801DDDA4 001D9A04 41 82 00 18 */ beq lbl_801DDDBC +/* 801DDDA8 001D9A08 A0 66 00 06 */ lhz r3, 6(r6) +/* 801DDDAC 001D9A0C 54 60 06 F7 */ rlwinm. r0, r3, 0, 0x1b, 0x1b +/* 801DDDB0 001D9A10 40 82 00 0C */ bne lbl_801DDDBC +/* 801DDDB4 001D9A14 54 60 04 3C */ rlwinm r0, r3, 0, 0x10, 0x1e +/* 801DDDB8 001D9A18 B0 06 00 06 */ sth r0, 6(r6) +lbl_801DDDBC: +/* 801DDDBC 001D9A1C 2C 1E 00 00 */ cmpwi r30, 0 +/* 801DDDC0 001D9A20 41 82 00 6C */ beq lbl_801DDE2C +/* 801DDDC4 001D9A24 80 7F 00 08 */ lwz r3, 8(r31) +/* 801DDDC8 001D9A28 7F E4 FB 78 */ mr r4, r31 +/* 801DDDCC 001D9A2C 38 A0 00 01 */ li r5, 1 +/* 801DDDD0 001D9A30 4B FF FA 2D */ bl func_801DD7FC +/* 801DDDD4 001D9A34 80 DF 00 08 */ lwz r6, 8(r31) +/* 801DDDD8 001D9A38 38 80 00 01 */ li r4, 1 +/* 801DDDDC 001D9A3C A0 A6 00 06 */ lhz r5, 6(r6) +/* 801DDDE0 001D9A40 54 A0 07 39 */ rlwinm. r0, r5, 0, 0x1c, 0x1c +/* 801DDDE4 001D9A44 40 82 00 2C */ bne lbl_801DDE10 +/* 801DDDE8 001D9A48 80 06 00 00 */ lwz r0, 0(r6) +/* 801DDDEC 001D9A4C 38 60 00 00 */ li r3, 0 +/* 801DDDF0 001D9A50 2C 00 00 00 */ cmpwi r0, 0 +/* 801DDDF4 001D9A54 41 82 00 10 */ beq lbl_801DDE04 +/* 801DDDF8 001D9A58 54 A0 07 FF */ clrlwi. r0, r5, 0x1f +/* 801DDDFC 001D9A5C 41 82 00 08 */ beq lbl_801DDE04 +/* 801DDE00 001D9A60 38 60 00 01 */ li r3, 1 +lbl_801DDE04: +/* 801DDE04 001D9A64 2C 03 00 00 */ cmpwi r3, 0 +/* 801DDE08 001D9A68 41 82 00 08 */ beq lbl_801DDE10 +/* 801DDE0C 001D9A6C 38 80 00 00 */ li r4, 0 +lbl_801DDE10: +/* 801DDE10 001D9A70 2C 04 00 00 */ cmpwi r4, 0 +/* 801DDE14 001D9A74 41 82 00 18 */ beq lbl_801DDE2C +/* 801DDE18 001D9A78 A0 66 00 06 */ lhz r3, 6(r6) +/* 801DDE1C 001D9A7C 54 60 06 F7 */ rlwinm. r0, r3, 0, 0x1b, 0x1b +/* 801DDE20 001D9A80 40 82 00 0C */ bne lbl_801DDE2C +/* 801DDE24 001D9A84 54 60 04 3C */ rlwinm r0, r3, 0, 0x10, 0x1e +/* 801DDE28 001D9A88 B0 06 00 06 */ sth r0, 6(r6) +lbl_801DDE2C: +/* 801DDE2C 001D9A8C 80 01 00 24 */ lwz r0, 0x24(r1) +/* 801DDE30 001D9A90 CB E1 00 18 */ lfd f31, 0x18(r1) +/* 801DDE34 001D9A94 83 E1 00 14 */ lwz r31, 0x14(r1) +/* 801DDE38 001D9A98 83 C1 00 10 */ lwz r30, 0x10(r1) +/* 801DDE3C 001D9A9C 83 A1 00 0C */ lwz r29, 0xc(r1) +/* 801DDE40 001D9AA0 7C 08 03 A6 */ mtlr r0 +/* 801DDE44 001D9AA4 38 21 00 20 */ addi r1, r1, 0x20 +/* 801DDE48 001D9AA8 4E 80 00 20 */ blr +} +#pragma peephole on +#endif + // TODO: inlining -// TODO: parameterized derived class constructor? // This matches void func_801DDE4C(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) { if (p1->unk8) { - BOOL r6 = FALSE; p1->unkC = 0.0f; - if (p1->unk8->unk0 && (p1->unk8->unk6 & 0x1)) { - r6 = TRUE; - } - if (r6 && !(p1->unk8->unk6 & 0x10)) { - p1->unk8->unk6 &= ~0x1; + if (TestFunction(p1->unk8)) { + ClearFunction(p1->unk8); } } func_801DDABC(p1, p2, p3, p4, p5); } +// NOTE: nearly identical to func_801DDABC. Modifies unk8 instead of unk4, and initializes p1->unkC + +// Populate structure referenced by unk8, attaching it to a gUnkClass8 with the matching id // derived class method? // matches -void func_801DDEA0(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5, float p6) +void func_801DDEA0(gUnkClass10* p1, u16 id, u16 p3, float p4, float p5, float p6) { if (p1->unk8) { - if (!(p1->unk8->unk6 & 0x10)) { - p1->unk8->unk6 &= ~0x1; - } - gUnkClass8* r3 = func_801DDA94(p1, p2); - + ClearFunction(p1->unk8); + // TODO: 5 parameter inline function? + gUnkClass8* r3 = func_801DDA94(p1, id); if (r3) { gUnkClass7* r4 = p1->unk8; if (!(r4->unk6 & 0x10)) { -- cgit v1.2.3 From aef4ef49d3bca9b729c9228012419533adefef4c Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 6 Nov 2020 12:36:14 -0500 Subject: add GShierMemObject.h, and implement constructors for GSanimationObject and GSblendObject --- src/code_801DD8C0.cpp | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index f27222e..f0a428d 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -1,6 +1,6 @@ #include "ctorStruct.h" #include -#include "code_801DAAE0.h" +#include "GShierMemObject.h" #include "code_801DD5C8.h" // TODO: C++ @@ -9,24 +9,46 @@ static ctorStruct gUnk8063F350(1, 4, 0); extern "C" { -// TODO: determine file that defines this -extern MEMHeapHandle lbl_8063E8F8; +// GSanimationObject +class GSanimationObject : public GShierMemObject +{ +protected: + gUnkClass8* unk0; + gUnkClass7* unk4; +public: + GSanimationObject(gUnkClass8* list); +}; + +class GSblendObject : public GSanimationObject +{ + gUnkClass7* unk8; + float unkC; +public: + GSblendObject(gUnkClass8* list); +}; +// TODO: replace this struct gUnkClass10 { - gUnkClass8* unk0; // TODO: check type + gUnkClass8* unk0; gUnkClass7* unk4; - - // TODO: begin derived class? gUnkClass7* unk8; float unkC; }; - #if 1 +// func_801DD8C0 +GSanimationObject::GSanimationObject(gUnkClass8* list) : unk0(list), unk4(NULL) +{ + if (list) + unk4 = new gUnkClass7; +} + +#if 0 // caller provides a linked list of gUnkClass8 // TODO: gUnkClass10 constructor? +// GSanimationObject? gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) { p1->unk0 = p2; @@ -51,6 +73,7 @@ gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) } return p1; } +#endif // TODO: gUnkClass10 destructor? Get mwcc to generate parts of this function implicitly gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) @@ -221,7 +244,17 @@ void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) } } + // TODO: derived class constructor? +// GSblendObject? + +GSblendObject::GSblendObject(gUnkClass8* list) : GSanimationObject(list), unk8(NULL), unkC(0.0f) +{ + if (unk4) + unk8 = new gUnkClass7; +} + +#if 0 gUnkClass10* func_801DDB64(gUnkClass10* p1, gUnkClass8* p2) { func_801DD8C0(p1, p2); @@ -245,6 +278,7 @@ gUnkClass10* func_801DDB64(gUnkClass10* p1, gUnkClass8* p2) } return p1; } +#endif // TODO: derived class destructor? gUnkClass10* func_801DDC08(gUnkClass10* p1, s32 p2) -- cgit v1.2.3 From 2b3b7eb1888430659fd6839e220542f19b22ae3c Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 6 Nov 2020 20:28:24 -0500 Subject: C++ refactoring, adding nonmatching #ifdefs for ctors/dtor using operator delete for now --- src/code_801DD8C0.cpp | 278 ++++++++++++++++---------------------------------- 1 file changed, 88 insertions(+), 190 deletions(-) (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index f0a428d..9a77009 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -9,7 +9,6 @@ static ctorStruct gUnk8063F350(1, 4, 0); extern "C" { -// GSanimationObject class GSanimationObject : public GShierMemObject { protected: @@ -17,6 +16,10 @@ protected: gUnkClass7* unk4; public: GSanimationObject(gUnkClass8* list); + ~GSanimationObject(); + void func_801DD9C8(float p2); + gUnkClass8* func_801DDA94(u16 id); + void func_801DDABC(u16 id, u16 p3, float p4, float p5); }; class GSblendObject : public GSanimationObject @@ -25,117 +28,69 @@ class GSblendObject : public GSanimationObject float unkC; public: GSblendObject(gUnkClass8* list); + ~GSblendObject(); + void func_801DDC84(float p2); + void func_801DDE4C(u16 id, u16 p3, float p4, float p5); + void func_801DDEA0(u16 id, u16 p3, float p4, float p5, float p6); }; -// TODO: replace this -struct gUnkClass10 -{ - gUnkClass8* unk0; - gUnkClass7* unk4; - gUnkClass7* unk8; - float unkC; -}; - -#if 1 - -// func_801DD8C0 GSanimationObject::GSanimationObject(gUnkClass8* list) : unk0(list), unk4(NULL) { if (list) unk4 = new gUnkClass7; } -#if 0 -// caller provides a linked list of gUnkClass8 -// TODO: gUnkClass10 constructor? -// GSanimationObject? -gUnkClass10* func_801DD8C0(gUnkClass10* p1, gUnkClass8* p2) +#ifdef NONMATCHING +// Can't get this to match with an operator delete +// because mwcc adds an extra beq instruction +GSanimationObject::~GSanimationObject() { - p1->unk0 = p2; - p1->unk4 = NULL; - if (p2) { - // TODO: inlined call to an overloaded new? - gUnkClass7* r3; - if (func_801DAB28()) - r3 = (gUnkClass7*)func_801DAC94(lbl_8063E8F8, sizeof(gUnkClass7)); - else - r3 = NULL; - - // TODO: inlined gUnkClass7 constructor? - if (r3) { - r3->unk0 = NULL; - r3->unk4 = 0; - r3->unk6 = 0xC; - r3->unk8 = 1.0f; - r3->unkC = 0.0f; - } - p1->unk4 = r3; + if (unk4) { + delete unk4; + unk4 = NULL; } - return p1; } -#endif - -// TODO: gUnkClass10 destructor? Get mwcc to generate parts of this function implicitly -gUnkClass10* func_801DD958(gUnkClass10* p1, s32 p2) +#else +GSanimationObject::~GSanimationObject() { - if (p1) { - if (p1->unk4) { - func_801DAD48(lbl_8063E8F8, p1->unk4); - p1->unk4 = NULL; - } - if (p2 > 0) - func_801DAD48(lbl_8063E8F8, p1); + if (unk4) { + func_801DAD48(lbl_8063E8F8, unk4); + unk4 = NULL; } - return p1; } - #endif - // Note: inferred static inline functions -static inline BOOL helper_1(gUnkClass7* p1) -{ - return p1->unk0 && (p1->unk6 & 0x1); -} - -static inline BOOL helper_2(gUnkClass7* p1) -{ - return !helper_1(p1) && !(p1->unk6 & 0x10); -} - - -static inline BOOL TestFunction(gUnkClass7* ptr) +static inline BOOL inline_TestFunction(gUnkClass7* ptr) { return ptr->unk0 && ptr->unk6 & 0x1; } -// if bit 4 is cleared, clear bit 0 -static inline void ClearFunction(gUnkClass7* ptr) +static inline void inline_ClearFunction(gUnkClass7* ptr) { if (!(ptr->unk6 & 0x10)) ptr->unk6 &= ~0x1; } -// TODO: "flag"s are the results of inline functions? #ifdef NONMATCHING // r4/r6 regswap -void func_801DD9C8(gUnkClass10* p1, float p2) +void GSanimationObject::func_801DD9C8(float p2) { - if (p1->unk4) { - if (TestFunction(p1->unk4)) { - func_801DD5C8(p1->unk4, p2); - func_801DD7FC(p1->unk4, p1, 0); - BOOL flag2 = TRUE; //r4 - u16* new_var = &p1->unk4->unk6; - if (!(p1->unk4->unk6 & 0x8)) { + if (unk4) { + if (inline_TestFunction(unk4)) { + func_801DD5C8(unk4, p2); + func_801DD7FC(unk4, this, 0); + BOOL flag2 = TRUE; + u16* new_var = &unk4->unk6; + if (!(unk4->unk6 & 0x8)) { BOOL flag = FALSE; - if (p1->unk4->unk0 && (*new_var & 0x1)) + if (unk4->unk0 && (*new_var & 0x1)) flag = TRUE; if (flag) flag2 = FALSE; } if (flag2) { - gUnkClass7* r3 = p1->unk4; + gUnkClass7* r3 = unk4; if (!(r3->unk6 & 0x10)) { r3->unk6 &= ~0x1; } @@ -144,7 +99,7 @@ void func_801DD9C8(gUnkClass10* p1, float p2) } } #else -asm void func_801DD9C8(gUnkClass10* p1, float p2) +asm void GSanimationObject::func_801DD9C8(float p2) { nofralloc /* 801DD9C8 001D9628 94 21 FF F0 */ stwu r1, -0x10(r1) @@ -206,33 +161,28 @@ lbl_801DDA80: #pragma peephole on #endif - -#if 1 - -// TODO: assuming gUnkClass8* member here -// search linked list -//static -gUnkClass8* func_801DDA94(gUnkClass10* p1, u16 p2) +// Search the linked list referenced by unk0 for a node with the specified id +gUnkClass8* GSanimationObject::func_801DDA94(u16 id) { - gUnkClass8* p = p1->unk0; + gUnkClass8* p = unk0; while (p) { - if (p->unk0 == p2) + if (p->unk0 == id) return p; p = p->next; } return NULL; } -// set unk4 member of p1 -void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) +// Populate unk4 member +void GSanimationObject::func_801DDABC(u16 id, u16 p3, float p4, float p5) { - gUnkClass7* r6 = p1->unk4; + gUnkClass7* r6 = unk4; if (r6) { if (!(r6->unk6 & 0x10)) r6->unk6 &= ~0x1; - gUnkClass8* r3 = func_801DDA94(p1, p2); + gUnkClass8* r3 = func_801DDA94(id); if (r3) { - gUnkClass7* r4 = p1->unk4; + gUnkClass7* r4 = unk4; if (!(r4->unk6 & 0x10)) { r4->unk0 = r3; r4->unkC = p4; @@ -244,121 +194,80 @@ void func_801DDABC(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) } } - -// TODO: derived class constructor? -// GSblendObject? - GSblendObject::GSblendObject(gUnkClass8* list) : GSanimationObject(list), unk8(NULL), unkC(0.0f) { if (unk4) unk8 = new gUnkClass7; } -#if 0 -gUnkClass10* func_801DDB64(gUnkClass10* p1, gUnkClass8* p2) -{ - func_801DD8C0(p1, p2); - p1->unk8 = NULL; - p1->unkC = 0.0f; - if (p1->unk4) { - gUnkClass7* r3; - if (func_801DAB28()) - r3 = (gUnkClass7*)func_801DAC94(lbl_8063E8F8, sizeof(gUnkClass7)); - else - r3 = NULL; - - if (r3) { - r3->unk0 = NULL; - r3->unk4 = 0; - r3->unk6 = 0xC; - r3->unk8 = 1.0f; - r3->unkC = 0.0f; - } - p1->unk8 = r3; - } - return p1; -} -#endif - -// TODO: derived class destructor? -gUnkClass10* func_801DDC08(gUnkClass10* p1, s32 p2) +#ifdef NONMATCHING +// Same issue as ~GSanimationObject()... extra beq instruction +GSblendObject::~GSblendObject() { - if (p1) { - if (p1->unk8) { - func_801DAD48(lbl_8063E8F8, p1->unk8); - p1->unk8 = NULL; - } - func_801DD958(p1, 0); - if (p2 > 0) - func_801DAD48(lbl_8063E8F8, p1); + if (unk8) { + delete unk8; + unk8 = NULL; } - return p1; } - -static inline void InlineFunction(gUnkClass10* p1, gUnkClass7* p2) +#else +GSblendObject::~GSblendObject() { - func_801DD7FC(p2, p1, 0); - BOOL r4 = TRUE; - if (!(p2->unk6 & 0x8)) { - BOOL r3 = helper_1(p2); - if (r3) - r4 = FALSE; - } - if (r4 && !(p2->unk6 & 0x10)) { - p2->unk6 &= ~0x1; + if (unk8) { + func_801DAD48(lbl_8063E8F8, unk8); + unk8 = NULL; } } +#endif -// derived class method calling base class method? #ifdef NONMATCHING -// regswaps and instruction ordering -void func_801DDC84(gUnkClass10* p1, float p2) +// regswaps and instruction ordering issue near if (r4 && !(unk4->unk6 & 0x10)) +void GSblendObject::func_801DDC84(float p2) { - if (p1->unk4) { - BOOL r29 = helper_1(p1->unk4); + if (unk4) { + BOOL r29 = inline_TestFunction(unk4); BOOL r30 = FALSE; - if (p1->unk8) { - BOOL r3 = helper_1(p1->unk8); + if (unk8) { + BOOL r3 = inline_TestFunction(unk8); if (r3) r30 = TRUE; if (r29) - func_801DD5C8(p1->unk4, p2); + func_801DD5C8(unk4, p2); if (r30) { - func_801DD5C8(p1->unk8, p2); + func_801DD5C8(unk8, p2); r29 = TRUE; - p1->unk4->unk6 |= 0x2; + unk4->unk6 |= 0x2; } - // inlined function call? + // Note: inlined function call? if (r29) { - func_801DD7FC(p1->unk4, p1, 0); + func_801DD7FC(unk4, this, 0); BOOL r4 = TRUE; - if (!(p1->unk4->unk6 & 0x8)) { - BOOL r3 = p1->unk4->unk0 && (p1->unk4->unk6 & 0x1); + if (!(unk4->unk6 & 0x8)) { + BOOL r3 = unk4->unk0 && (unk4->unk6 & 0x1); if (r3) r4 = FALSE; } - if (r4 && !(p1->unk4->unk6 & 0x10)) { - p1->unk4->unk6 &= ~0x1; + if (r4 && !(unk4->unk6 & 0x10)) { + unk4->unk6 &= ~0x1; } } if (r30) { - func_801DD7FC(p1->unk8, p1, 0); + func_801DD7FC(unk8, this, 0); BOOL r4 = TRUE; - if (!(p1->unk8->unk6 & 0x8)) { - BOOL r3 = p1->unk8->unk0 && (p1->unk8->unk6 & 0x1); + if (!(unk8->unk6 & 0x8)) { + BOOL r3 = unk8->unk0 && (unk8->unk6 & 0x1); if (r3) r4 = FALSE; } - if (r4 && !(p1->unk8->unk6 & 0x10)) { - p1->unk8->unk6 &= ~0x1; + if (r4 && !(unk8->unk6 & 0x10)) { + unk8->unk6 &= ~0x1; } } } } } #else -asm void func_801DDC84(gUnkClass10* p1, float p2) +asm void GSblendObject::func_801DDC84(float p2) { nofralloc /* 801DDC84 001D98E4 94 21 FF E0 */ stwu r1, -0x20(r1) @@ -490,33 +399,25 @@ lbl_801DDE2C: #pragma peephole on #endif - -// TODO: inlining -// This matches -void func_801DDE4C(gUnkClass10* p1, u16 p2, u16 p3, float p4, float p5) +void GSblendObject::func_801DDE4C(u16 id, u16 p3, float p4, float p5) { - if (p1->unk8) { - p1->unkC = 0.0f; - if (TestFunction(p1->unk8)) { - ClearFunction(p1->unk8); - } + if (unk8) { + unkC = 0.0f; + if (inline_TestFunction(unk8)) + inline_ClearFunction(unk8); } - func_801DDABC(p1, p2, p3, p4, p5); + func_801DDABC(id, p3, p4, p5); } -// NOTE: nearly identical to func_801DDABC. Modifies unk8 instead of unk4, and initializes p1->unkC - +// NOTE: nearly identical to func_801DDABC. Modifies unk8 instead of unk4, and initializes unkC // Populate structure referenced by unk8, attaching it to a gUnkClass8 with the matching id -// derived class method? -// matches -void func_801DDEA0(gUnkClass10* p1, u16 id, u16 p3, float p4, float p5, float p6) +void GSblendObject::func_801DDEA0(u16 id, u16 p3, float p4, float p5, float p6) { - if (p1->unk8) { - ClearFunction(p1->unk8); - // TODO: 5 parameter inline function? - gUnkClass8* r3 = func_801DDA94(p1, id); + if (unk8) { + inline_ClearFunction(unk8); + gUnkClass8* r3 = func_801DDA94(id); if (r3) { - gUnkClass7* r4 = p1->unk8; + gUnkClass7* r4 = unk8; if (!(r4->unk6 & 0x10)) { r4->unk0 = r3; r4->unkC = p4; @@ -525,11 +426,8 @@ void func_801DDEA0(gUnkClass10* p1, u16 id, u16 p3, float p4, float p5, float p6 r4->unk6 = 3; } } - p1->unkC = p6; + unkC = p6; } } - -#endif - } //extern "C" -- cgit v1.2.3 From 2f182e1a106325772fa3f93c01f0d153b839d5a6 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 6 Nov 2020 20:42:51 -0500 Subject: add headers for GSanimationObject and GSblendObject --- src/code_801DD8C0.cpp | 39 +++++---------------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) (limited to 'src/code_801DD8C0.cpp') diff --git a/src/code_801DD8C0.cpp b/src/code_801DD8C0.cpp index 9a77009..dc82f62 100644 --- a/src/code_801DD8C0.cpp +++ b/src/code_801DD8C0.cpp @@ -1,39 +1,11 @@ #include "ctorStruct.h" -#include -#include "GShierMemObject.h" -#include "code_801DD5C8.h" +#include "GSanimationObject.h" +#include "GSblendObject.h" -// TODO: C++ +// GSanimationObject and GSblendObject implementations static ctorStruct gUnk8063F350(1, 4, 0); -extern "C" { - -class GSanimationObject : public GShierMemObject -{ -protected: - gUnkClass8* unk0; - gUnkClass7* unk4; -public: - GSanimationObject(gUnkClass8* list); - ~GSanimationObject(); - void func_801DD9C8(float p2); - gUnkClass8* func_801DDA94(u16 id); - void func_801DDABC(u16 id, u16 p3, float p4, float p5); -}; - -class GSblendObject : public GSanimationObject -{ - gUnkClass7* unk8; - float unkC; -public: - GSblendObject(gUnkClass8* list); - ~GSblendObject(); - void func_801DDC84(float p2); - void func_801DDE4C(u16 id, u16 p3, float p4, float p5); - void func_801DDEA0(u16 id, u16 p3, float p4, float p5, float p6); -}; - GSanimationObject::GSanimationObject(gUnkClass8* list) : unk0(list), unk4(NULL) { if (list) @@ -187,7 +159,7 @@ void GSanimationObject::func_801DDABC(u16 id, u16 p3, float p4, float p5) r4->unk0 = r3; r4->unkC = p4; r4->unk8 = p5; - r4->unk4 = p3 & 0xFF; + r4->unk4 = (u16)(p3 & 0xFF); r4->unk6 = 0x3; } } @@ -422,7 +394,7 @@ void GSblendObject::func_801DDEA0(u16 id, u16 p3, float p4, float p5, float p6) r4->unk0 = r3; r4->unkC = p4; r4->unk8 = p5; - r4->unk4 = p3 & 0xFF; + r4->unk4 = (u16)(p3 & 0xFF); r4->unk6 = 3; } } @@ -430,4 +402,3 @@ void GSblendObject::func_801DDEA0(u16 id, u16 p3, float p4, float p5, float p6) } } -} //extern "C" -- cgit v1.2.3