diff --git a/asm/code_8004E9F0.s b/asm/code_8004E9F0.s index a6483b0..f61cc2a 100644 --- a/asm/code_8004E9F0.s +++ b/asm/code_8004E9F0.s @@ -61,7 +61,7 @@ func_8004EA94: /* 8004EAAC 0004A70C 2C 00 00 00 */ cmpwi r0, 0 /* 8004EAB0 0004A710 41 82 00 14 */ beq lbl_8004EAC4 /* 8004EAB4 0004A714 7C 03 03 78 */ mr r3, r0 -/* 8004EAB8 0004A718 48 19 1E 4D */ bl func_801E0904 +/* 8004EAB8 0004A718 48 19 1E 4D */ bl func_801E0904__11gUnkClass20Fv /* 8004EABC 0004A71C 38 00 00 00 */ li r0, 0 /* 8004EAC0 0004A720 90 1F 00 00 */ stw r0, 0(r31) lbl_8004EAC4: @@ -145,12 +145,12 @@ func_8004EBA0: /* 8004EBD4 0004A834 38 80 00 00 */ li r4, 0 /* 8004EBD8 0004A838 38 A0 00 00 */ li r5, 0 /* 8004EBDC 0004A83C 38 C0 00 00 */ li r6, 0 -/* 8004EBE0 0004A840 48 19 1C 31 */ bl func_801E0810 +/* 8004EBE0 0004A840 48 19 1C 31 */ bl func_801E0810__11gUnkClass20FUlUcUc /* 8004EBE4 0004A844 90 7E 00 00 */ stw r3, 0(r30) /* 8004EBE8 0004A848 48 00 00 0C */ b lbl_8004EBF4 lbl_8004EBEC: /* 8004EBEC 0004A84C 7F E4 FB 78 */ mr r4, r31 -/* 8004EBF0 0004A850 48 19 1D ED */ bl func_801E09DC +/* 8004EBF0 0004A850 48 19 1D ED */ bl func_801E09DC__11gUnkClass20CFP11gUnkClass21 lbl_8004EBF4: /* 8004EBF4 0004A854 80 01 00 14 */ lwz r0, 0x14(r1) /* 8004EBF8 0004A858 83 E1 00 0C */ lwz r31, 0xc(r1) @@ -184,12 +184,12 @@ func_8004EC0C: /* 8004EC5C 0004A8BC 98 01 00 09 */ stb r0, 9(r1) /* 8004EC60 0004A8C0 98 01 00 0A */ stb r0, 0xa(r1) /* 8004EC64 0004A8C4 98 01 00 0B */ stb r0, 0xb(r1) -/* 8004EC68 0004A8C8 48 19 1B A9 */ bl func_801E0810 +/* 8004EC68 0004A8C8 48 19 1B A9 */ bl func_801E0810__11gUnkClass20FUlUcUc /* 8004EC6C 0004A8CC 90 7D 00 00 */ stw r3, 0(r29) lbl_8004EC70: /* 8004EC70 0004A8D0 80 7D 00 00 */ lwz r3, 0(r29) /* 8004EC74 0004A8D4 38 81 00 08 */ addi r4, r1, 8 -/* 8004EC78 0004A8D8 48 19 1D 01 */ bl func_801E0978 +/* 8004EC78 0004A8D8 48 19 1D 01 */ bl func_801E0978__11gUnkClass20CFP11gUnkClass21 /* 8004EC7C 0004A8DC 7F A3 EB 78 */ mr r3, r29 /* 8004EC80 0004A8E0 7F C4 F3 78 */ mr r4, r30 /* 8004EC84 0004A8E4 38 A1 00 10 */ addi r5, r1, 0x10 @@ -242,7 +242,7 @@ func_8004ECE0: /* 8004ED28 0004A988 4B FF FE 1D */ bl func_8004EB44 /* 8004ED2C 0004A98C 80 7F 00 00 */ lwz r3, 0(r31) /* 8004ED30 0004A990 38 81 00 08 */ addi r4, r1, 8 -/* 8004ED34 0004A994 48 19 1C A9 */ bl func_801E09DC +/* 8004ED34 0004A994 48 19 1C A9 */ bl func_801E09DC__11gUnkClass20CFP11gUnkClass21 lbl_8004ED38: /* 8004ED38 0004A998 80 01 00 24 */ lwz r0, 0x24(r1) /* 8004ED3C 0004A99C 83 E1 00 1C */ lwz r31, 0x1c(r1) diff --git a/asm/code_801E0810_asm.s b/asm/code_801E0810_asm.s deleted file mode 100644 index 4ea72fe..0000000 --- a/asm/code_801E0810_asm.s +++ /dev/null @@ -1,3 +0,0 @@ -.include "macros.inc" - -.section .text, "ax" # 0x80006980 - 0x803E1E60 diff --git a/include/GSfilterModule.h b/include/GSfilterModule.h new file mode 100644 index 0000000..6b9af03 --- /dev/null +++ b/include/GSfilterModule.h @@ -0,0 +1,24 @@ +#ifndef POKEREVO_GSFILTERMODULE_H +#define POKEREVO_GSFILTERMODULE_H + +#include "gUnkClass20.h" + +struct GSfilterModule +{ + u8 unk0[0x10]; // pad + u32 unk10; + u8 unk14[0x3D8]; // pad + gUnkClass20* unk3EC; // pointer to array + gUnkClass21* unk3F0; + u8 unk3F4[0x18]; // pad + u8 unk40C; // counter +}; + +extern "C" +{ +extern GSfilterModule* lbl_8063F410; +// TODO: member function +gUnkClass20* func_801FB80C(GSfilterModule*); +} + +#endif //POKEREVO_GSFILTERMODULE_H diff --git a/include/gUnkClass20.h b/include/gUnkClass20.h new file mode 100644 index 0000000..141aff8 --- /dev/null +++ b/include/gUnkClass20.h @@ -0,0 +1,30 @@ +#ifndef POKEREVO_GUNKCLASS20_H +#define POKEREVO_GUNKCLASS20_H + +// size == 0x4 +struct gUnkClass21 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; +}; + +// size == 0x8 +struct gUnkClass20 +{ + u8 unk0; // index into an array of gUnkClass21. + // id? + u8 unk1; // func_801FB80C returns first instance where this is 0. + // "allocated" flag? + u8 unk2; + u8 unk3; + u32 unk4; + + gUnkClass20* func_801E0810(u32 p2, u8 p3, u8 p4); + void func_801E0904(); + void func_801E0978(gUnkClass21* p2) const; + void func_801E09DC(gUnkClass21* p2) const; +}; + +#endif //POKEREVO_GUNKCLASS20_H diff --git a/obj_files.mk b/obj_files.mk index 1e27ac4..d8cb71a 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -234,8 +234,7 @@ SPLIT_O_FILES := \ $(BUILD_DIR)/asm/GSvolume_ctors.o \ $(BUILD_DIR)/asm/GSvolume_sbss.o \ $(BUILD_DIR)/src/code_801E07E8.o \ - $(BUILD_DIR)/src/code_801E0810.o \ - $(BUILD_DIR)/asm/code_801E0810_asm.o \ + $(BUILD_DIR)/src/gUnkClass20.o \ $(BUILD_DIR)/asm/code_801E0A54.o \ $(BUILD_DIR)/asm/code_801E4360.o \ $(BUILD_DIR)/asm/code_801E474C.o \ diff --git a/src/code_801E0810.cpp b/src/code_801E0810.cpp deleted file mode 100644 index 9095c63..0000000 --- a/src/code_801E0810.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "ctorStruct.h" -#include -#include - -static ctorStruct gUnk8063F370(1, 4, 0); - -// size == 0x4 -struct unkClass3 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -}; - -// size == 0x8 -struct unkClass2 -{ - u8 unk0; // index into unkClass3 array - u8 unk1; // func_801FB80C returns first instance when this is 0 - u8 unk2; - u8 unk3; - u32 unk4; -}; - -struct GSfilterModule -{ - u8 unk0[0x10]; // pad - u32 unk10; - u8 unk14[0x3D8]; // pad - unkClass2* unk3EC; // pointer to array - unkClass3* unk3F0; - u8 unk3F4[0x18]; // pad - u8 unk40C; // counter -}; - -extern "C" -{ - -extern GSfilterModule* lbl_8063F410; -unkClass2* func_801FB80C(GSfilterModule*); - -void* func_8023B058(u8); -void func_8023B3B8(void*, u32); -void func_8023B420(void*, u32); - -// NONMATCHING: r29/r30 regswaps - -// TODO: type of p1? - -unkClass2* func_801E0810(unkClass2* p1, u32 p2, u8 p3, u8 p4) -{ - u32 r30; - - if (!lbl_8063F410) - return NULL; - unkClass2* r29 = func_801FB80C(lbl_8063F410); - if (!r29) - return NULL; - r29->unk1 = 1; - r29->unk2 = p3; - r29->unk3 = p4; - r29->unk4 = p2; - if (r29->unk3) { - r30 = lbl_8063F410->unk10; - void* r3 = func_8023B058(static_cast(r30 >> 16)); - if (r3) - func_8023B3B8(r3, r30); - } - - unkClass* r3 = lbl_8063F410; - unkClass3* r4 = (r29->unk1) ? &r3->unk3F0[r29->unk0] : NULL; - - r4->unk0 = p1->unk0; - r4->unk1 = p1->unk1; - r4->unk2 = p1->unk2; - r4->unk3 = p1->unk3; - return r29; -} - -// TODO: p1 type? - -void func_801E0904(unkClass2* p1) -{ - if (p1->unk1) { - if (p1->unk3) { - u32 r31 = lbl_8063F410->unk10; - void* r3 = func_8023B058(static_cast(r31 >> 16)); - if (r3) - func_8023B420(r3, r31); - } - p1->unk1 = 0; - p1->unk4 = NULL; - } -} - -// TODO: p1 type? - -void func_801E0978(const unkClass2* p1, unkClass3* p2) -{ - if (p1->unk1) { - unkClass3* r3; - unkClass* r5 = lbl_8063F410; - if (p1->unk1) { - r3 = &r5->unk3F0[p1->unk0]; - } else { - r3 = NULL; - } - p2->unk0 = r3->unk0; - p2->unk1 = r3->unk1; - p2->unk2 = r3->unk2; - p2->unk3 = r3->unk3; - return; - } - memset(p2, 0, sizeof(unkClass3)); -} - -void func_801E09DC(const unkClass2* p1, unkClass3* p2) -{ - if (!p1->unk1) - return; - unkClass* r5 = lbl_8063F410; - unkClass3* r3 = (p1->unk1) ? &r5->unk3F0[p1->unk0] : NULL; - r3->unk0 = p2->unk0; - r3->unk1 = p2->unk1; - r3->unk2 = p2->unk2; - r3->unk3 = p2->unk3; - DCFlushRange(r3, sizeof(unkClass3)); -} - -} //extern "C" diff --git a/src/gUnkClass20.cpp b/src/gUnkClass20.cpp new file mode 100644 index 0000000..960e593 --- /dev/null +++ b/src/gUnkClass20.cpp @@ -0,0 +1,84 @@ +#include "ctorStruct.h" +#include +#include +#include "GSfilterModule.h" +#include "gUnkClass20.h" + +static ctorStruct gUnk8063F370(1, 4, 0); + +extern "C" +{ +// TODO: move to proper header +void* func_8023B058(u8); +void func_8023B3B8(void*, u32); +void func_8023B420(void*, u32); +} + +// "constructor" ? +gUnkClass20* gUnkClass20::func_801E0810(u32 p2, u8 p3, u8 p4) +{ + u32 r30; + + if (!lbl_8063F410) + return NULL; + gUnkClass20* r29 = func_801FB80C(lbl_8063F410); + if (!r29) + return NULL; + r29->unk1 = 1; + r29->unk2 = p3; + r29->unk3 = p4; + r29->unk4 = p2; + if (r29->unk3) { + r30 = lbl_8063F410->unk10; + void* r3 = func_8023B058(static_cast(r30 >> 16)); + if (r3) + func_8023B3B8(r3, r30); + } + + const GSfilterModule* r3 = lbl_8063F410; + gUnkClass21* r4 = (r29->unk1) ? &r3->unk3F0[r29->unk0] : NULL; + + r4->unk0 = unk0; + r4->unk1 = unk1; + r4->unk2 = unk2; + r4->unk3 = unk3; + return r29; +} + +// "destructor" ? +void gUnkClass20::func_801E0904() +{ + if (unk1) { + if (unk3) { + u32 r31 = lbl_8063F410->unk10; + void* r3 = func_8023B058(static_cast(r31 >> 16)); + if (r3) + func_8023B420(r3, r31); + } + unk1 = 0; + unk4 = NULL; + } +} + +// read into p2 +void gUnkClass20::func_801E0978(gUnkClass21* p2) const +{ + if (unk1) { + const GSfilterModule* r5 = lbl_8063F410; + const gUnkClass21* r3 = (unk1) ? &r5->unk3F0[unk0] : NULL; + *p2 = *r3; + return; + } + memset(p2, 0, sizeof(gUnkClass21)); +} + +// write from p2 +void gUnkClass20::func_801E09DC(gUnkClass21* p2) const +{ + if (!unk1) + return; + const GSfilterModule* r5 = lbl_8063F410; + gUnkClass21* r3 = (unk1) ? &r5->unk3F0[unk0] : NULL; + *r3 = *p2; + DCFlushRange(r3, sizeof(gUnkClass21)); +}