From 0a9f2e5071ce96169c74758e38d83a98ca1fa255 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 22 Oct 2020 21:27:26 -0400 Subject: add LC_BASE macro to OSCache.h, and condense func_801DB81C --- include/SDK/OS/OSCache.h | 3 +++ src/code_801DB81C.cpp | 34 ++++++++-------------------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/include/SDK/OS/OSCache.h b/include/SDK/OS/OSCache.h index 489ed0b..a6fb490 100644 --- a/include/SDK/OS/OSCache.h +++ b/include/SDK/OS/OSCache.h @@ -6,6 +6,9 @@ extern "C" { #endif void LCEnable(void); +#define LC_BASE (0xE000 << 16) +#define LCGetBase() ((void*)LC_BASE) + #ifdef __cplusplus } diff --git a/src/code_801DB81C.cpp b/src/code_801DB81C.cpp index 678fafa..3adbe21 100644 --- a/src/code_801DB81C.cpp +++ b/src/code_801DB81C.cpp @@ -30,36 +30,17 @@ extern "C" { static void func_801DB81C(u8 p1) { - size_t i; - size_t new_var; - size_t new_var2; - size_t *new_var3; - size_t *new_var4; - size_t *new_var5; - new_var = 0; - new_var5 = &i; - for (i = new_var; i < 32; i++) { - gUnk8063F308 = new_var; + gUnk8063F308 = 0; + for (size_t i = 0; i < 32; i++) gUnk80491370[i].unk0 = 0xff; - } - LCEnable(); - - gUnk8063F2FC = 0xE0000000; - i = p1; - new_var = 9; - gUnk8063F2F8 = i << new_var; - if (i) { - new_var3 = new_var5; - new_var4 = new_var3; - new_var3 = new_var4; - new_var4 = new_var3; - new_var2 = *new_var4; - func_801DB92C(0 & 0xFFu, (u8)new_var2, 1); + gUnk8063F2FC = (u32)LCGetBase(); + gUnk8063F2F8 = (u32)(p1 << 9); + if (p1) { + func_801DB92C(0, p1, 1); gUnk80491370[0].unk0 = 0; - gUnk80491370[0].unk1 = (u8)*new_var3; + gUnk80491370[0].unk1 = p1; } - gUnk8063F304 = 0; } @@ -113,6 +94,7 @@ asm u32 func_801DB978(u8 p1) /* 801DB9F4 001D7654 7C 08 03 A6 */ mtlr r0 /* 801DB9F8 001D7658 4E 80 00 20 */ blr } +#pragma peephole on void func_801DB9FC(void) { -- cgit v1.2.3 From a7f8bf4f63f0008926c9e15b93fac4893d416a10 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 22 Oct 2020 21:58:32 -0400 Subject: slightly condense func_801DB9FC and func_801DBA8C --- src/code_801DB81C.cpp | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/code_801DB81C.cpp b/src/code_801DB81C.cpp index 3adbe21..95af182 100644 --- a/src/code_801DB81C.cpp +++ b/src/code_801DB81C.cpp @@ -18,7 +18,8 @@ namespace static void func_801DB81C(u8 p1); static void func_801DB92C(u8 start, u8 width, u32 setOrClear); -static unkClass gUnk80491370[32]; +static const size_t ARR_SIZE = 32; +static unkClass gUnk80491370[ARR_SIZE]; static ctorStruct gUnk8063F2F0(1, 4, 0); static u32 gUnk8063F2F8; static u32 gUnk8063F2FC; @@ -31,7 +32,7 @@ extern "C" { static void func_801DB81C(u8 p1) { gUnk8063F308 = 0; - for (size_t i = 0; i < 32; i++) + for (size_t i = 0; i < ARR_SIZE; i++) gUnk80491370[i].unk0 = 0xff; LCEnable(); gUnk8063F2FC = (u32)LCGetBase(); @@ -100,24 +101,19 @@ void func_801DB9FC(void) { u32 i; short j; - unsigned short new_var; - char new_var2; u32 *new_var3; u32 new_var4; u32 *new_var5; - new_var = 0xff; if (gUnk8063F304 != 1) { - new_var2 = 9; - i = 31, j = 0; + i = ARR_SIZE-1, j = 0; new_var3 = &i; new_var5 = &new_var4; do { unsigned char r0 = gUnk80491370[j].unk0; new_var4 = *new_var3; - if ((((u32) r0) != new_var) && gUnk80491370[j].unk4) { - gUnk80491370[j].unk4(0, gUnk8063F2FC + (r0 << new_var2), gUnk80491370[j].unk1); + if ((((u32) r0) != 0xff) && gUnk80491370[j].unk4) { + gUnk80491370[j].unk4(0, gUnk8063F2FC + (r0 << 9), gUnk80491370[j].unk1); } - i = *new_var5; j++; } while ((i--) != 0); @@ -129,24 +125,19 @@ void func_801DBA8C(void) { u32 i; short j; - unsigned short new_var; - char new_var2; u32 *new_var3; u32 new_var4; u32 *new_var5; - new_var = 0xff; if (gUnk8063F304 != 0) { - new_var2 = 9; - i = 31, j = 0; + i = ARR_SIZE-1, j = 0; new_var3 = &i; new_var5 = &new_var4; do { unsigned char r0 = gUnk80491370[j].unk0; new_var4 = *new_var3; - if ((((u32) r0) != new_var) && gUnk80491370[j].unk4) { - gUnk80491370[j].unk4(1, gUnk8063F2FC + (r0 << new_var2), gUnk80491370[j].unk1); + if ((((u32) r0) != 0xff) && gUnk80491370[j].unk4) { + gUnk80491370[j].unk4(1, gUnk8063F2FC + (r0 << 9), gUnk80491370[j].unk1); } - i = *new_var5; j++; } while ((i--) != 0); -- cgit v1.2.3 From b889dc5418ad7a072e6b2b47d7a866ba08c05a15 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 01:30:30 -0400 Subject: match func_801DBC58 --- asm/code_801DBB3C.s | 250 ------------------------------------------------ asm/code_801DBB3C_asm.s | 117 ++++++++++++++++++++++ include/code_801DBB3C.h | 15 ++- obj_files.mk | 3 +- src/code_801DBB3C.cpp | 184 +++++++++++++++++++++++++++++++++++ 5 files changed, 317 insertions(+), 252 deletions(-) delete mode 100644 asm/code_801DBB3C.s create mode 100644 asm/code_801DBB3C_asm.s create mode 100644 src/code_801DBB3C.cpp diff --git a/asm/code_801DBB3C.s b/asm/code_801DBB3C.s deleted file mode 100644 index 6a84265..0000000 --- a/asm/code_801DBB3C.s +++ /dev/null @@ -1,250 +0,0 @@ -.include "macros.inc" - -.section .text, "ax" # 0x80006980 - 0x803E1E60 - -.global func_801DBB3C -func_801DBB3C: -/* 801DBB3C 001D779C 38 60 00 00 */ li r3, 0 -/* 801DBB40 001D77A0 4E 80 00 20 */ blr - -.global func_801DBB44 -func_801DBB44: -/* 801DBB44 001D77A4 4E 80 00 20 */ blr - -.global func_801DBB48 -func_801DBB48: -/* 801DBB48 001D77A8 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 801DBB4C 001D77AC 7C 08 02 A6 */ mflr r0 -/* 801DBB50 001D77B0 38 A5 00 07 */ addi r5, r5, 7 -/* 801DBB54 001D77B4 90 01 00 24 */ stw r0, 0x24(r1) -/* 801DBB58 001D77B8 38 04 00 01 */ addi r0, r4, 1 -/* 801DBB5C 001D77BC 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 801DBB60 001D77C0 54 BF 00 3A */ rlwinm r31, r5, 0, 0, 0x1d -/* 801DBB64 001D77C4 93 C1 00 18 */ stw r30, 0x18(r1) -/* 801DBB68 001D77C8 7C 9E 23 78 */ mr r30, r4 -/* 801DBB6C 001D77CC 93 A1 00 14 */ stw r29, 0x14(r1) -/* 801DBB70 001D77D0 7C 7D 1B 78 */ mr r29, r3 -/* 801DBB74 001D77D4 90 83 00 08 */ stw r4, 8(r3) -/* 801DBB78 001D77D8 93 E3 00 0C */ stw r31, 0xc(r3) -/* 801DBB7C 001D77DC 7C 60 F9 D6 */ mullw r3, r0, r31 -/* 801DBB80 001D77E0 4B FF F2 19 */ bl func_801DAD98 -/* 801DBB84 001D77E4 7C 1E F9 D6 */ mullw r0, r30, r31 -/* 801DBB88 001D77E8 2C 1E 00 00 */ cmpwi r30, 0 -/* 801DBB8C 001D77EC 90 7D 00 10 */ stw r3, 0x10(r29) -/* 801DBB90 001D77F0 39 00 00 00 */ li r8, 0 -/* 801DBB94 001D77F4 38 E0 00 00 */ li r7, 0 -/* 801DBB98 001D77F8 90 7D 00 18 */ stw r3, 0x18(r29) -/* 801DBB9C 001D77FC 7C 03 02 14 */ add r0, r3, r0 -/* 801DBBA0 001D7800 90 1D 00 14 */ stw r0, 0x14(r29) -/* 801DBBA4 001D7804 41 82 00 90 */ beq lbl_801DBC34 -/* 801DBBA8 001D7808 28 1E 00 08 */ cmplwi r30, 8 -/* 801DBBAC 001D780C 38 9E FF F8 */ addi r4, r30, -8 -/* 801DBBB0 001D7810 40 81 00 60 */ ble lbl_801DBC10 -/* 801DBBB4 001D7814 38 04 00 07 */ addi r0, r4, 7 -/* 801DBBB8 001D7818 54 00 E8 FE */ srwi r0, r0, 3 -/* 801DBBBC 001D781C 7C 09 03 A6 */ mtctr r0 -/* 801DBBC0 001D7820 28 04 00 00 */ cmplwi r4, 0 -/* 801DBBC4 001D7824 40 81 00 4C */ ble lbl_801DBC10 -lbl_801DBBC8: -/* 801DBBC8 001D7828 7C A3 FA 14 */ add r5, r3, r31 -/* 801DBBCC 001D782C 38 E7 00 08 */ addi r7, r7, 8 -/* 801DBBD0 001D7830 90 A3 00 00 */ stw r5, 0(r3) -/* 801DBBD4 001D7834 7C 85 FA 14 */ add r4, r5, r31 -/* 801DBBD8 001D7838 7C 64 FA 14 */ add r3, r4, r31 -/* 801DBBDC 001D783C 90 85 00 00 */ stw r4, 0(r5) -/* 801DBBE0 001D7840 7C C3 FA 14 */ add r6, r3, r31 -/* 801DBBE4 001D7844 7C A6 FA 14 */ add r5, r6, r31 -/* 801DBBE8 001D7848 90 64 00 00 */ stw r3, 0(r4) -/* 801DBBEC 001D784C 7C 85 FA 14 */ add r4, r5, r31 -/* 801DBBF0 001D7850 7D 04 FA 14 */ add r8, r4, r31 -/* 801DBBF4 001D7854 90 C3 00 00 */ stw r6, 0(r3) -/* 801DBBF8 001D7858 7C 68 FA 14 */ add r3, r8, r31 -/* 801DBBFC 001D785C 90 A6 00 00 */ stw r5, 0(r6) -/* 801DBC00 001D7860 7C 86 F9 2E */ stwx r4, r6, r31 -/* 801DBC04 001D7864 7D 05 F9 2E */ stwx r8, r5, r31 -/* 801DBC08 001D7868 7C 64 F9 2E */ stwx r3, r4, r31 -/* 801DBC0C 001D786C 42 00 FF BC */ bdnz lbl_801DBBC8 -lbl_801DBC10: -/* 801DBC10 001D7870 7C 07 F0 50 */ subf r0, r7, r30 -/* 801DBC14 001D7874 7C 09 03 A6 */ mtctr r0 -/* 801DBC18 001D7878 7C 07 F0 40 */ cmplw r7, r30 -/* 801DBC1C 001D787C 40 80 00 18 */ bge lbl_801DBC34 -lbl_801DBC20: -/* 801DBC20 001D7880 7C 03 FA 14 */ add r0, r3, r31 -/* 801DBC24 001D7884 7C 68 1B 78 */ mr r8, r3 -/* 801DBC28 001D7888 90 03 00 00 */ stw r0, 0(r3) -/* 801DBC2C 001D788C 7C 03 03 78 */ mr r3, r0 -/* 801DBC30 001D7890 42 00 FF F0 */ bdnz lbl_801DBC20 -lbl_801DBC34: -/* 801DBC34 001D7894 38 00 00 00 */ li r0, 0 -/* 801DBC38 001D7898 90 08 00 00 */ stw r0, 0(r8) -/* 801DBC3C 001D789C 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 801DBC40 001D78A0 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 801DBC44 001D78A4 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 801DBC48 001D78A8 80 01 00 24 */ lwz r0, 0x24(r1) -/* 801DBC4C 001D78AC 7C 08 03 A6 */ mtlr r0 -/* 801DBC50 001D78B0 38 21 00 20 */ addi r1, r1, 0x20 -/* 801DBC54 001D78B4 4E 80 00 20 */ blr - -.global func_801DBC58 -func_801DBC58: -/* 801DBC58 001D78B8 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 801DBC5C 001D78BC 7C 08 02 A6 */ mflr r0 -/* 801DBC60 001D78C0 90 01 00 24 */ stw r0, 0x24(r1) -/* 801DBC64 001D78C4 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 801DBC68 001D78C8 93 C1 00 18 */ stw r30, 0x18(r1) -/* 801DBC6C 001D78CC 93 A1 00 14 */ stw r29, 0x14(r1) -/* 801DBC70 001D78D0 7C 7D 1B 78 */ mr r29, r3 -/* 801DBC74 001D78D4 83 E3 00 18 */ lwz r31, 0x18(r3) -/* 801DBC78 001D78D8 4B FF FE C5 */ bl func_801DBB3C -/* 801DBC7C 001D78DC 7C 7E 1B 78 */ mr r30, r3 -/* 801DBC80 001D78E0 38 60 00 00 */ li r3, 0 -/* 801DBC84 001D78E4 4B FF FE C1 */ bl func_801DBB44 -/* 801DBC88 001D78E8 2C 1F 00 00 */ cmpwi r31, 0 -/* 801DBC8C 001D78EC 41 82 00 10 */ beq lbl_801DBC9C -/* 801DBC90 001D78F0 80 1F 00 00 */ lwz r0, 0(r31) -/* 801DBC94 001D78F4 90 1D 00 18 */ stw r0, 0x18(r29) -/* 801DBC98 001D78F8 48 00 00 14 */ b lbl_801DBCAC -lbl_801DBC9C: -/* 801DBC9C 001D78FC 7F C3 F3 78 */ mr r3, r30 -/* 801DBCA0 001D7900 4B FF FE A5 */ bl func_801DBB44 -/* 801DBCA4 001D7904 38 60 00 00 */ li r3, 0 -/* 801DBCA8 001D7908 48 00 00 3C */ b lbl_801DBCE4 -lbl_801DBCAC: -/* 801DBCAC 001D790C 7F C3 F3 78 */ mr r3, r30 -/* 801DBCB0 001D7910 4B FF FE 95 */ bl func_801DBB44 -/* 801DBCB4 001D7914 80 BD 00 0C */ lwz r5, 0xc(r29) -/* 801DBCB8 001D7918 7F E3 FB 78 */ mr r3, r31 -/* 801DBCBC 001D791C 38 80 00 00 */ li r4, 0 -/* 801DBCC0 001D7920 4B E2 84 45 */ bl memset -/* 801DBCC4 001D7924 80 7D 00 00 */ lwz r3, 0(r29) -/* 801DBCC8 001D7928 80 1D 00 04 */ lwz r0, 4(r29) -/* 801DBCCC 001D792C 38 63 00 01 */ addi r3, r3, 1 -/* 801DBCD0 001D7930 7C 03 00 40 */ cmplw r3, r0 -/* 801DBCD4 001D7934 90 7D 00 00 */ stw r3, 0(r29) -/* 801DBCD8 001D7938 40 81 00 08 */ ble lbl_801DBCE0 -/* 801DBCDC 001D793C 90 7D 00 04 */ stw r3, 4(r29) -lbl_801DBCE0: -/* 801DBCE0 001D7940 38 7F 00 04 */ addi r3, r31, 4 -lbl_801DBCE4: -/* 801DBCE4 001D7944 80 01 00 24 */ lwz r0, 0x24(r1) -/* 801DBCE8 001D7948 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 801DBCEC 001D794C 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 801DBCF0 001D7950 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 801DBCF4 001D7954 7C 08 03 A6 */ mtlr r0 -/* 801DBCF8 001D7958 38 21 00 20 */ addi r1, r1, 0x20 -/* 801DBCFC 001D795C 4E 80 00 20 */ blr - -.global func_801DBD00 -func_801DBD00: -/* 801DBD00 001D7960 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 801DBD04 001D7964 7C 08 02 A6 */ mflr r0 -/* 801DBD08 001D7968 2C 04 00 00 */ cmpwi r4, 0 -/* 801DBD0C 001D796C 90 01 00 24 */ stw r0, 0x24(r1) -/* 801DBD10 001D7970 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 801DBD14 001D7974 93 C1 00 18 */ stw r30, 0x18(r1) -/* 801DBD18 001D7978 93 A1 00 14 */ stw r29, 0x14(r1) -/* 801DBD1C 001D797C 7C 7D 1B 78 */ mr r29, r3 -/* 801DBD20 001D7980 41 82 00 38 */ beq lbl_801DBD58 -/* 801DBD24 001D7984 80 03 00 18 */ lwz r0, 0x18(r3) -/* 801DBD28 001D7988 3B C4 FF FC */ addi r30, r4, -4 -/* 801DBD2C 001D798C 90 04 FF FC */ stw r0, -4(r4) -/* 801DBD30 001D7990 80 83 00 00 */ lwz r4, 0(r3) -/* 801DBD34 001D7994 38 04 FF FF */ addi r0, r4, -1 -/* 801DBD38 001D7998 90 03 00 00 */ stw r0, 0(r3) -/* 801DBD3C 001D799C 4B FF FE 01 */ bl func_801DBB3C -/* 801DBD40 001D79A0 7C 7F 1B 78 */ mr r31, r3 -/* 801DBD44 001D79A4 38 60 00 00 */ li r3, 0 -/* 801DBD48 001D79A8 4B FF FD FD */ bl func_801DBB44 -/* 801DBD4C 001D79AC 93 DD 00 18 */ stw r30, 0x18(r29) -/* 801DBD50 001D79B0 7F E3 FB 78 */ mr r3, r31 -/* 801DBD54 001D79B4 4B FF FD F1 */ bl func_801DBB44 -lbl_801DBD58: -/* 801DBD58 001D79B8 80 01 00 24 */ lwz r0, 0x24(r1) -/* 801DBD5C 001D79BC 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 801DBD60 001D79C0 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 801DBD64 001D79C4 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 801DBD68 001D79C8 7C 08 03 A6 */ mtlr r0 -/* 801DBD6C 001D79CC 38 21 00 20 */ addi r1, r1, 0x20 -/* 801DBD70 001D79D0 4E 80 00 20 */ blr - -.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 -/* 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/code_801DBB3C_asm.s b/asm/code_801DBB3C_asm.s new file mode 100644 index 0000000..a9ea533 --- /dev/null +++ b/asm/code_801DBB3C_asm.s @@ -0,0 +1,117 @@ +.include "macros.inc" + +.section .text, "ax" # 0x80006980 - 0x803E1E60 + +.global func_801DBD00 +func_801DBD00: +/* 801DBD00 001D7960 94 21 FF E0 */ stwu r1, -0x20(r1) +/* 801DBD04 001D7964 7C 08 02 A6 */ mflr r0 +/* 801DBD08 001D7968 2C 04 00 00 */ cmpwi r4, 0 +/* 801DBD0C 001D796C 90 01 00 24 */ stw r0, 0x24(r1) +/* 801DBD10 001D7970 93 E1 00 1C */ stw r31, 0x1c(r1) +/* 801DBD14 001D7974 93 C1 00 18 */ stw r30, 0x18(r1) +/* 801DBD18 001D7978 93 A1 00 14 */ stw r29, 0x14(r1) +/* 801DBD1C 001D797C 7C 7D 1B 78 */ mr r29, r3 +/* 801DBD20 001D7980 41 82 00 38 */ beq lbl_801DBD58 +/* 801DBD24 001D7984 80 03 00 18 */ lwz r0, 0x18(r3) +/* 801DBD28 001D7988 3B C4 FF FC */ addi r30, r4, -4 +/* 801DBD2C 001D798C 90 04 FF FC */ stw r0, -4(r4) +/* 801DBD30 001D7990 80 83 00 00 */ lwz r4, 0(r3) +/* 801DBD34 001D7994 38 04 FF FF */ addi r0, r4, -1 +/* 801DBD38 001D7998 90 03 00 00 */ stw r0, 0(r3) +/* 801DBD3C 001D799C 4B FF FE 01 */ bl func_801DBB3C +/* 801DBD40 001D79A0 7C 7F 1B 78 */ mr r31, r3 +/* 801DBD44 001D79A4 38 60 00 00 */ li r3, 0 +/* 801DBD48 001D79A8 4B FF FD FD */ bl func_801DBB44 +/* 801DBD4C 001D79AC 93 DD 00 18 */ stw r30, 0x18(r29) +/* 801DBD50 001D79B0 7F E3 FB 78 */ mr r3, r31 +/* 801DBD54 001D79B4 4B FF FD F1 */ bl func_801DBB44 +lbl_801DBD58: +/* 801DBD58 001D79B8 80 01 00 24 */ lwz r0, 0x24(r1) +/* 801DBD5C 001D79BC 83 E1 00 1C */ lwz r31, 0x1c(r1) +/* 801DBD60 001D79C0 83 C1 00 18 */ lwz r30, 0x18(r1) +/* 801DBD64 001D79C4 83 A1 00 14 */ lwz r29, 0x14(r1) +/* 801DBD68 001D79C8 7C 08 03 A6 */ mtlr r0 +/* 801DBD6C 001D79CC 38 21 00 20 */ addi r1, r1, 0x20 +/* 801DBD70 001D79D0 4E 80 00 20 */ blr + +.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 +/* 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/include/code_801DBB3C.h b/include/code_801DBB3C.h index 394bd32..34ffe6a 100644 --- a/include/code_801DBB3C.h +++ b/include/code_801DBB3C.h @@ -7,9 +7,22 @@ extern "C" { #include "code_801DB040.h" +// free store block? +struct gUnkClass3 +{ + gUnkClass3* unk0; + gUnkClass1 unk4; +}; + +// linked list node free store? struct gUnkClass2 { - u8 pad[0x24]; + u32 unk0; + u32 unk4; + u8 pad[0x4]; + size_t unkC; + u8 pad2[0x8]; + gUnkClass3* unk18; }; gUnkClass1* func_801DBC58(gUnkClass2* p1); diff --git a/obj_files.mk b/obj_files.mk index 9cf946e..836f6a3 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -221,7 +221,8 @@ SPLIT_O_FILES := \ $(BUILD_DIR)/src/code_801DAAE0.o \ $(BUILD_DIR)/src/code_801DB040.o \ $(BUILD_DIR)/src/code_801DB81C.o \ - $(BUILD_DIR)/asm/code_801DBB3C.o \ + $(BUILD_DIR)/src/code_801DBB3C.o \ + $(BUILD_DIR)/asm/code_801DBB3C_asm.o \ $(BUILD_DIR)/asm/code_801DBE90.o \ $(BUILD_DIR)/asm/code_801DCE6C.o \ $(BUILD_DIR)/asm/code_801DD5C8.o \ diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp new file mode 100644 index 0000000..589d09a --- /dev/null +++ b/src/code_801DBB3C.cpp @@ -0,0 +1,184 @@ +#include "types.h" +#include "ctorStruct.h" +#include "Runtime/__mem.h" +#include "code_801DAAE0.h" +#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; + }; + + + +} + + +extern "C" { + +//static +unkClass* func_801DBB3C(void) +{ + return 0; +} + +//static +void func_801DBB44(unkClass*) +{ + +} + +//static +#ifdef NONMATCHING +void func_801DBB48(unkClass *p1, u32 p2, u32 p3) +{ + //p2 = r30 + u32 r31 = (p3+7) & ~0x3; // element size + p1->unk8 = p2; // 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 + + ... + } + } + } + } +} +#else +asm void func_801DBB48(unkClass *p1, u32 p2, u32 p3) +{ + /* 801DBB48 001D77A8 94 21 FF E0 */ stwu r1, -0x20(r1) + /* 801DBB4C 001D77AC 7C 08 02 A6 */ mflr r0 + /* 801DBB50 001D77B0 38 A5 00 07 */ addi r5, r5, 7 + /* 801DBB54 001D77B4 90 01 00 24 */ stw r0, 0x24(r1) + /* 801DBB58 001D77B8 38 04 00 01 */ addi r0, r4, 1 + /* 801DBB5C 001D77BC 93 E1 00 1C */ stw r31, 0x1c(r1) + /* 801DBB60 001D77C0 54 BF 00 3A */ rlwinm r31, r5, 0, 0, 0x1d + /* 801DBB64 001D77C4 93 C1 00 18 */ stw r30, 0x18(r1) + /* 801DBB68 001D77C8 7C 9E 23 78 */ mr r30, r4 + /* 801DBB6C 001D77CC 93 A1 00 14 */ stw r29, 0x14(r1) + /* 801DBB70 001D77D0 7C 7D 1B 78 */ mr r29, r3 + /* 801DBB74 001D77D4 90 83 00 08 */ stw r4, 8(r3) + /* 801DBB78 001D77D8 93 E3 00 0C */ stw r31, 0xc(r3) + /* 801DBB7C 001D77DC 7C 60 F9 D6 */ mullw r3, r0, r31 + /* 801DBB80 001D77E0 4B FF F2 19 */ bl func_801DAD98 + /* 801DBB84 001D77E4 7C 1E F9 D6 */ mullw r0, r30, r31 + /* 801DBB88 001D77E8 2C 1E 00 00 */ cmpwi r30, 0 + /* 801DBB8C 001D77EC 90 7D 00 10 */ stw r3, 0x10(r29) + /* 801DBB90 001D77F0 39 00 00 00 */ li r8, 0 + /* 801DBB94 001D77F4 38 E0 00 00 */ li r7, 0 + /* 801DBB98 001D77F8 90 7D 00 18 */ stw r3, 0x18(r29) + /* 801DBB9C 001D77FC 7C 03 02 14 */ add r0, r3, r0 + /* 801DBBA0 001D7800 90 1D 00 14 */ stw r0, 0x14(r29) + /* 801DBBA4 001D7804 41 82 00 90 */ beq lbl_801DBC34 + /* 801DBBA8 001D7808 28 1E 00 08 */ cmplwi r30, 8 + /* 801DBBAC 001D780C 38 9E FF F8 */ addi r4, r30, -8 + /* 801DBBB0 001D7810 40 81 00 60 */ ble lbl_801DBC10 + /* 801DBBB4 001D7814 38 04 00 07 */ addi r0, r4, 7 + /* 801DBBB8 001D7818 54 00 E8 FE */ srwi r0, r0, 3 + /* 801DBBBC 001D781C 7C 09 03 A6 */ mtctr r0 + /* 801DBBC0 001D7820 28 04 00 00 */ cmplwi r4, 0 + /* 801DBBC4 001D7824 40 81 00 4C */ ble lbl_801DBC10 + lbl_801DBBC8: + /* 801DBBC8 001D7828 7C A3 FA 14 */ add r5, r3, r31 + /* 801DBBCC 001D782C 38 E7 00 08 */ addi r7, r7, 8 + /* 801DBBD0 001D7830 90 A3 00 00 */ stw r5, 0(r3) + /* 801DBBD4 001D7834 7C 85 FA 14 */ add r4, r5, r31 + /* 801DBBD8 001D7838 7C 64 FA 14 */ add r3, r4, r31 + /* 801DBBDC 001D783C 90 85 00 00 */ stw r4, 0(r5) + /* 801DBBE0 001D7840 7C C3 FA 14 */ add r6, r3, r31 + /* 801DBBE4 001D7844 7C A6 FA 14 */ add r5, r6, r31 + /* 801DBBE8 001D7848 90 64 00 00 */ stw r3, 0(r4) + /* 801DBBEC 001D784C 7C 85 FA 14 */ add r4, r5, r31 + /* 801DBBF0 001D7850 7D 04 FA 14 */ add r8, r4, r31 + /* 801DBBF4 001D7854 90 C3 00 00 */ stw r6, 0(r3) + /* 801DBBF8 001D7858 7C 68 FA 14 */ add r3, r8, r31 + /* 801DBBFC 001D785C 90 A6 00 00 */ stw r5, 0(r6) + /* 801DBC00 001D7860 7C 86 F9 2E */ stwx r4, r6, r31 + /* 801DBC04 001D7864 7D 05 F9 2E */ stwx r8, r5, r31 + /* 801DBC08 001D7868 7C 64 F9 2E */ stwx r3, r4, r31 + /* 801DBC0C 001D786C 42 00 FF BC */ bdnz lbl_801DBBC8 + lbl_801DBC10: + /* 801DBC10 001D7870 7C 07 F0 50 */ subf r0, r7, r30 + /* 801DBC14 001D7874 7C 09 03 A6 */ mtctr r0 + /* 801DBC18 001D7878 7C 07 F0 40 */ cmplw r7, r30 + /* 801DBC1C 001D787C 40 80 00 18 */ bge lbl_801DBC34 + lbl_801DBC20: + /* 801DBC20 001D7880 7C 03 FA 14 */ add r0, r3, r31 + /* 801DBC24 001D7884 7C 68 1B 78 */ mr r8, r3 + /* 801DBC28 001D7888 90 03 00 00 */ stw r0, 0(r3) + /* 801DBC2C 001D788C 7C 03 03 78 */ mr r3, r0 + /* 801DBC30 001D7890 42 00 FF F0 */ bdnz lbl_801DBC20 + lbl_801DBC34: + /* 801DBC34 001D7894 38 00 00 00 */ li r0, 0 + /* 801DBC38 001D7898 90 08 00 00 */ stw r0, 0(r8) + /* 801DBC3C 001D789C 83 E1 00 1C */ lwz r31, 0x1c(r1) + /* 801DBC40 001D78A0 83 C1 00 18 */ lwz r30, 0x18(r1) + /* 801DBC44 001D78A4 83 A1 00 14 */ lwz r29, 0x14(r1) + /* 801DBC48 001D78A8 80 01 00 24 */ lwz r0, 0x24(r1) + /* 801DBC4C 001D78AC 7C 08 03 A6 */ mtlr r0 + /* 801DBC50 001D78B0 38 21 00 20 */ addi r1, r1, 0x20 + /* 801DBC54 001D78B4 4E 80 00 20 */ blr +} +#pragma peephole on +#endif + +// allocate a linked list node from the free store +gUnkClass1* func_801DBC58(gUnkClass2* p1) +{ + gUnkClass3* r31 = p1->unk18; + unkClass* r30 = func_801DBB3C(); + func_801DBB44(0); + if (r31) { + p1->unk18 = r31->unk0; + goto bcac; + } + func_801DBB44(r30); + return NULL; +bcac: + func_801DBB44(r30); + memset(r31, 0, p1->unkC); + if (++p1->unk0 > p1->unk4) + p1->unk4 = p1->unk0; + return &r31->unk4; +} +/* +func_801DBD00 +{ + +} +*/ + + +} -- cgit v1.2.3 From cabc694f5a8b403648532bb8cf42cf88f1272e5f Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 01:31:58 -0400 Subject: match func_801DBC58 --- src/code_801DBB3C.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp index 589d09a..d821a9e 100644 --- a/src/code_801DBB3C.cpp +++ b/src/code_801DBB3C.cpp @@ -162,11 +162,11 @@ gUnkClass1* func_801DBC58(gUnkClass2* p1) func_801DBB44(0); if (r31) { p1->unk18 = r31->unk0; - goto bcac; + goto passCheck; } func_801DBB44(r30); return NULL; -bcac: +passCheck: func_801DBB44(r30); memset(r31, 0, p1->unkC); if (++p1->unk0 > p1->unk4) -- cgit v1.2.3 From 047d52bd174f2b8553b9f2958a98639d6dc3e4ec Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 01:52:33 -0400 Subject: match func_801DBD00 --- asm/code_801DBB3C_asm.s | 33 --------------------------------- include/code_801DBB3C.h | 6 +++--- src/code_801DBB3C.cpp | 26 ++++++++++++++++++-------- 3 files changed, 21 insertions(+), 44 deletions(-) diff --git a/asm/code_801DBB3C_asm.s b/asm/code_801DBB3C_asm.s index a9ea533..970f84a 100644 --- a/asm/code_801DBB3C_asm.s +++ b/asm/code_801DBB3C_asm.s @@ -2,39 +2,6 @@ .section .text, "ax" # 0x80006980 - 0x803E1E60 -.global func_801DBD00 -func_801DBD00: -/* 801DBD00 001D7960 94 21 FF E0 */ stwu r1, -0x20(r1) -/* 801DBD04 001D7964 7C 08 02 A6 */ mflr r0 -/* 801DBD08 001D7968 2C 04 00 00 */ cmpwi r4, 0 -/* 801DBD0C 001D796C 90 01 00 24 */ stw r0, 0x24(r1) -/* 801DBD10 001D7970 93 E1 00 1C */ stw r31, 0x1c(r1) -/* 801DBD14 001D7974 93 C1 00 18 */ stw r30, 0x18(r1) -/* 801DBD18 001D7978 93 A1 00 14 */ stw r29, 0x14(r1) -/* 801DBD1C 001D797C 7C 7D 1B 78 */ mr r29, r3 -/* 801DBD20 001D7980 41 82 00 38 */ beq lbl_801DBD58 -/* 801DBD24 001D7984 80 03 00 18 */ lwz r0, 0x18(r3) -/* 801DBD28 001D7988 3B C4 FF FC */ addi r30, r4, -4 -/* 801DBD2C 001D798C 90 04 FF FC */ stw r0, -4(r4) -/* 801DBD30 001D7990 80 83 00 00 */ lwz r4, 0(r3) -/* 801DBD34 001D7994 38 04 FF FF */ addi r0, r4, -1 -/* 801DBD38 001D7998 90 03 00 00 */ stw r0, 0(r3) -/* 801DBD3C 001D799C 4B FF FE 01 */ bl func_801DBB3C -/* 801DBD40 001D79A0 7C 7F 1B 78 */ mr r31, r3 -/* 801DBD44 001D79A4 38 60 00 00 */ li r3, 0 -/* 801DBD48 001D79A8 4B FF FD FD */ bl func_801DBB44 -/* 801DBD4C 001D79AC 93 DD 00 18 */ stw r30, 0x18(r29) -/* 801DBD50 001D79B0 7F E3 FB 78 */ mr r3, r31 -/* 801DBD54 001D79B4 4B FF FD F1 */ bl func_801DBB44 -lbl_801DBD58: -/* 801DBD58 001D79B8 80 01 00 24 */ lwz r0, 0x24(r1) -/* 801DBD5C 001D79BC 83 E1 00 1C */ lwz r31, 0x1c(r1) -/* 801DBD60 001D79C0 83 C1 00 18 */ lwz r30, 0x18(r1) -/* 801DBD64 001D79C4 83 A1 00 14 */ lwz r29, 0x14(r1) -/* 801DBD68 001D79C8 7C 08 03 A6 */ mtlr r0 -/* 801DBD6C 001D79CC 38 21 00 20 */ addi r1, r1, 0x20 -/* 801DBD70 001D79D0 4E 80 00 20 */ blr - .global func_801DBD74 func_801DBD74: /* 801DBD74 001D79D4 94 21 FF F0 */ stwu r1, -0x10(r1) diff --git a/include/code_801DBB3C.h b/include/code_801DBB3C.h index 34ffe6a..bbf2c39 100644 --- a/include/code_801DBB3C.h +++ b/include/code_801DBB3C.h @@ -17,12 +17,12 @@ struct gUnkClass3 // linked list node free store? struct gUnkClass2 { - u32 unk0; + u32 unk0; // counter? u32 unk4; u8 pad[0x4]; - size_t unkC; + size_t unkC; // block size u8 pad2[0x8]; - gUnkClass3* unk18; + gUnkClass3* unk18; // next block? }; gUnkClass1* func_801DBC58(gUnkClass2* p1); diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp index d821a9e..8400bc9 100644 --- a/src/code_801DBB3C.cpp +++ b/src/code_801DBB3C.cpp @@ -38,13 +38,13 @@ namespace extern "C" { //static -unkClass* func_801DBB3C(void) +u32 func_801DBB3C(void) { return 0; } //static -void func_801DBB44(unkClass*) +void func_801DBB44(u32) { } @@ -158,10 +158,10 @@ asm void func_801DBB48(unkClass *p1, u32 p2, u32 p3) gUnkClass1* func_801DBC58(gUnkClass2* p1) { gUnkClass3* r31 = p1->unk18; - unkClass* r30 = func_801DBB3C(); + u32 r30 = func_801DBB3C(); func_801DBB44(0); if (r31) { - p1->unk18 = r31->unk0; + p1->unk18 = r31->unk0; // point unk18 to possible next free block? goto passCheck; } func_801DBB44(r30); @@ -173,12 +173,22 @@ passCheck: p1->unk4 = p1->unk0; return &r31->unk4; } -/* -func_801DBD00 + +// return node p2 to free store p1 +void func_801DBD00(gUnkClass2* p1, gUnkClass1* p2) { - + u32 r31; + if (p2) { + gUnkClass3* r30 = (gUnkClass3*)((u8*)p2 - 4); + r30->unk0 = p1->unk18; + p1->unk0--; + r31 = func_801DBB3C(); + func_801DBB44(0); + p1->unk18 = r30; + func_801DBB44(r31); + } } -*/ + } -- cgit v1.2.3 From 1a76bb3162479a8897272ca4928ef2e0be849e21 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 12:13:48 -0400 Subject: match func_801DBD74 --- asm/code_801DBB3C_asm.s | 70 ------------------------------------------------- include/code_801DBB3C.h | 12 ++++----- src/code_801DBB3C.cpp | 25 +++++++++++++++--- 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; +} } -- cgit v1.2.3 From d93b0c1aac1148a9b609baec3914c2f33f546519 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 15:43:52 -0400 Subject: bring func_801DBB48 closer to matching --- asm/bss_2.s | 3 -- asm/code_801DBB3C_asm.s | 11 ------ asm/ctors_2.s | 1 - asm/sbss_2.s | 9 ++--- include/code_801DBB3C.h | 7 ++-- src/code_801DB040.cpp | 2 +- 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; } -- cgit v1.2.3 From e3def2d7a360b72359c64924e11ebd67c94843c9 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 22:33:42 -0400 Subject: match func_801DBB48 --- obj_files.mk | 1 - src/code_801DBB3C.cpp | 147 ++++++++++++-------------------------------------- 2 files changed, 34 insertions(+), 114 deletions(-) diff --git a/obj_files.mk b/obj_files.mk index 836f6a3..b8fa1bf 100644 --- a/obj_files.mk +++ b/obj_files.mk @@ -222,7 +222,6 @@ SPLIT_O_FILES := \ $(BUILD_DIR)/src/code_801DB040.o \ $(BUILD_DIR)/src/code_801DB81C.o \ $(BUILD_DIR)/src/code_801DBB3C.o \ - $(BUILD_DIR)/asm/code_801DBB3C_asm.o \ $(BUILD_DIR)/asm/code_801DBE90.o \ $(BUILD_DIR)/asm/code_801DCE6C.o \ $(BUILD_DIR)/asm/code_801DD5C8.o \ diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp index 5d0c4a1..8e10633 100644 --- a/src/code_801DBB3C.cpp +++ b/src/code_801DBB3C.cpp @@ -8,9 +8,7 @@ // array of free stores static gUnkClass2 gUnk80491470[32]; static ctorStruct gUnk8063F310(1, 4, 0); - extern "C" { - //static u32 func_801DBB3C(void) { @@ -22,119 +20,43 @@ void func_801DBB44(u32) { } - //static -#define NONMATCHING -#ifdef NONMATCHING -void func_801DBB48(gUnkClass2* p1, size_t nodes, size_t size) +void func_801DBB48(gUnkClass2 *p1, size_t nodes, size_t size) { - 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 - // 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) -{ - /* 801DBB48 001D77A8 94 21 FF E0 */ stwu r1, -0x20(r1) - /* 801DBB4C 001D77AC 7C 08 02 A6 */ mflr r0 - /* 801DBB50 001D77B0 38 A5 00 07 */ addi r5, r5, 7 - /* 801DBB54 001D77B4 90 01 00 24 */ stw r0, 0x24(r1) - /* 801DBB58 001D77B8 38 04 00 01 */ addi r0, r4, 1 - /* 801DBB5C 001D77BC 93 E1 00 1C */ stw r31, 0x1c(r1) - /* 801DBB60 001D77C0 54 BF 00 3A */ rlwinm r31, r5, 0, 0, 0x1d - /* 801DBB64 001D77C4 93 C1 00 18 */ stw r30, 0x18(r1) - /* 801DBB68 001D77C8 7C 9E 23 78 */ mr r30, r4 - /* 801DBB6C 001D77CC 93 A1 00 14 */ stw r29, 0x14(r1) - /* 801DBB70 001D77D0 7C 7D 1B 78 */ mr r29, r3 - /* 801DBB74 001D77D4 90 83 00 08 */ stw r4, 8(r3) - /* 801DBB78 001D77D8 93 E3 00 0C */ stw r31, 0xc(r3) - /* 801DBB7C 001D77DC 7C 60 F9 D6 */ mullw r3, r0, r31 - /* 801DBB80 001D77E0 4B FF F2 19 */ bl func_801DAD98 - /* 801DBB84 001D77E4 7C 1E F9 D6 */ mullw r0, r30, r31 - /* 801DBB88 001D77E8 2C 1E 00 00 */ cmpwi r30, 0 - /* 801DBB8C 001D77EC 90 7D 00 10 */ stw r3, 0x10(r29) - /* 801DBB90 001D77F0 39 00 00 00 */ li r8, 0 - /* 801DBB94 001D77F4 38 E0 00 00 */ li r7, 0 - /* 801DBB98 001D77F8 90 7D 00 18 */ stw r3, 0x18(r29) - /* 801DBB9C 001D77FC 7C 03 02 14 */ add r0, r3, r0 - /* 801DBBA0 001D7800 90 1D 00 14 */ stw r0, 0x14(r29) - /* 801DBBA4 001D7804 41 82 00 90 */ beq lbl_801DBC34 - /* 801DBBA8 001D7808 28 1E 00 08 */ cmplwi r30, 8 - /* 801DBBAC 001D780C 38 9E FF F8 */ addi r4, r30, -8 - /* 801DBBB0 001D7810 40 81 00 60 */ ble lbl_801DBC10 - /* 801DBBB4 001D7814 38 04 00 07 */ addi r0, r4, 7 - /* 801DBBB8 001D7818 54 00 E8 FE */ srwi r0, r0, 3 - /* 801DBBBC 001D781C 7C 09 03 A6 */ mtctr r0 - /* 801DBBC0 001D7820 28 04 00 00 */ cmplwi r4, 0 - /* 801DBBC4 001D7824 40 81 00 4C */ ble lbl_801DBC10 - lbl_801DBBC8: - /* 801DBBC8 001D7828 7C A3 FA 14 */ add r5, r3, r31 - /* 801DBBCC 001D782C 38 E7 00 08 */ addi r7, r7, 8 - /* 801DBBD0 001D7830 90 A3 00 00 */ stw r5, 0(r3) - /* 801DBBD4 001D7834 7C 85 FA 14 */ add r4, r5, r31 - /* 801DBBD8 001D7838 7C 64 FA 14 */ add r3, r4, r31 - /* 801DBBDC 001D783C 90 85 00 00 */ stw r4, 0(r5) - /* 801DBBE0 001D7840 7C C3 FA 14 */ add r6, r3, r31 - /* 801DBBE4 001D7844 7C A6 FA 14 */ add r5, r6, r31 - /* 801DBBE8 001D7848 90 64 00 00 */ stw r3, 0(r4) - /* 801DBBEC 001D784C 7C 85 FA 14 */ add r4, r5, r31 - /* 801DBBF0 001D7850 7D 04 FA 14 */ add r8, r4, r31 - /* 801DBBF4 001D7854 90 C3 00 00 */ stw r6, 0(r3) - /* 801DBBF8 001D7858 7C 68 FA 14 */ add r3, r8, r31 - /* 801DBBFC 001D785C 90 A6 00 00 */ stw r5, 0(r6) - /* 801DBC00 001D7860 7C 86 F9 2E */ stwx r4, r6, r31 - /* 801DBC04 001D7864 7D 05 F9 2E */ stwx r8, r5, r31 - /* 801DBC08 001D7868 7C 64 F9 2E */ stwx r3, r4, r31 - /* 801DBC0C 001D786C 42 00 FF BC */ bdnz lbl_801DBBC8 - lbl_801DBC10: - /* 801DBC10 001D7870 7C 07 F0 50 */ subf r0, r7, r30 - /* 801DBC14 001D7874 7C 09 03 A6 */ mtctr r0 - /* 801DBC18 001D7878 7C 07 F0 40 */ cmplw r7, r30 - /* 801DBC1C 001D787C 40 80 00 18 */ bge lbl_801DBC34 - lbl_801DBC20: - /* 801DBC20 001D7880 7C 03 FA 14 */ add r0, r3, r31 - /* 801DBC24 001D7884 7C 68 1B 78 */ mr r8, r3 - /* 801DBC28 001D7888 90 03 00 00 */ stw r0, 0(r3) - /* 801DBC2C 001D788C 7C 03 03 78 */ mr r3, r0 - /* 801DBC30 001D7890 42 00 FF F0 */ bdnz lbl_801DBC20 - lbl_801DBC34: - /* 801DBC34 001D7894 38 00 00 00 */ li r0, 0 - /* 801DBC38 001D7898 90 08 00 00 */ stw r0, 0(r8) - /* 801DBC3C 001D789C 83 E1 00 1C */ lwz r31, 0x1c(r1) - /* 801DBC40 001D78A0 83 C1 00 18 */ lwz r30, 0x18(r1) - /* 801DBC44 001D78A4 83 A1 00 14 */ lwz r29, 0x14(r1) - /* 801DBC48 001D78A8 80 01 00 24 */ lwz r0, 0x24(r1) - /* 801DBC4C 001D78AC 7C 08 03 A6 */ mtlr r0 - /* 801DBC50 001D78B0 38 21 00 20 */ addi r1, r1, 0x20 - /* 801DBC54 001D78B4 4E 80 00 20 */ blr + size_t r31; + size_t r30; + gUnkClass2 *r29; + unsigned int new_var; + int new_var2; + u8 **new_var3; + size += 7; + r30 = size & (~0x3); + new_var = r30; + r31 = new_var; + r30 = nodes; + r29 = p1; + p1->unk8 = nodes; + new_var2 = nodes + 1; + p1->unkC = r31; + u8 *data = (u8 *) func_801DAD98(new_var2 * r31); + r29->unk10 = data; + r29->unk18 = (gUnkClass3 *) data; + r29->unk14 = data + (r30 * r31); + u8 *curr = data; + u8 *next; + size_t i; + new_var3 = &next; + gUnkClass3 *r8 = 0; + for (i = 0; i < r30; i++) + { + next = curr + r31; + r8 = (gUnkClass3 *) curr; + ((gUnkClass3 *) curr)->unk0 = (gUnkClass3 *) (*new_var3); + curr = *new_var3; + } + + r8->unk0 = 0; } -#pragma peephole on -#endif // allocate a linked list node from the free store gUnkClass1* func_801DBC58(gUnkClass2* p1) @@ -186,5 +108,4 @@ gUnkClass2* func_801DBD74(u32 nodes, u32 size) return r31; } - } -- cgit v1.2.3 From 813f6a67a079e00b4003952e612bd7177f707fc6 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 23:22:36 -0400 Subject: cleanup --- include/code_801DBB3C.h | 20 ++++++-------- src/code_801DBB3C.cpp | 73 +++++++++++++++++++------------------------------ 2 files changed, 37 insertions(+), 56 deletions(-) diff --git a/include/code_801DBB3C.h b/include/code_801DBB3C.h index dc96371..fbc1996 100644 --- a/include/code_801DBB3C.h +++ b/include/code_801DBB3C.h @@ -7,23 +7,21 @@ extern "C" { #include "code_801DB040.h" -// free store block? struct gUnkClass3 { - gUnkClass3* unk0; // pointer to the next free block - gUnkClass1 unk4; // flexible array member to make this generic? + gUnkClass3* unk0; + gUnkClass1 unk4; }; -// linked list node free store? struct gUnkClass2 { - u32 unk0; // counter for blocks currently allocated? - u32 unk4; // maximum number of blocks allocated so far? - u32 unk8; // number of linked list nodes initially requested - size_t unkC; // block size - 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 + u32 unk0; + u32 unk4; + u32 unk8; + size_t unkC; + u8* unk10; + u8* unk14; + gUnkClass3* unk18; }; gUnkClass1* func_801DBC58(gUnkClass2* p1); diff --git a/src/code_801DBB3C.cpp b/src/code_801DBB3C.cpp index 8e10633..5037b5a 100644 --- a/src/code_801DBB3C.cpp +++ b/src/code_801DBB3C.cpp @@ -5,67 +5,53 @@ #include "code_801DB040.h" #include "code_801DBB3C.h" -// array of free stores +static u32 func_801DBB3C(void); +static void func_801DBB44(u32); +static void func_801DBB48(gUnkClass2 *p1, size_t nodes, size_t size); + static gUnkClass2 gUnk80491470[32]; static ctorStruct gUnk8063F310(1, 4, 0); + extern "C" { -//static -u32 func_801DBB3C(void) + +static u32 func_801DBB3C(void) { return 0; } -//static -void func_801DBB44(u32) +static void func_801DBB44(u32) { } -//static -void func_801DBB48(gUnkClass2 *p1, size_t nodes, size_t size) +static void func_801DBB48(gUnkClass2 *p1, size_t nodes, size_t size) { - size_t r31; - size_t r30; - gUnkClass2 *r29; - unsigned int new_var; - int new_var2; - u8 **new_var3; - size += 7; - r30 = size & (~0x3); - new_var = r30; - r31 = new_var; - r30 = nodes; - r29 = p1; - p1->unk8 = nodes; - new_var2 = nodes + 1; - p1->unkC = r31; - u8 *data = (u8 *) func_801DAD98(new_var2 * r31); - r29->unk10 = data; - r29->unk18 = (gUnkClass3 *) data; - r29->unk14 = data + (r30 * r31); - u8 *curr = data; - u8 *next; - size_t i; - new_var3 = &next; - gUnkClass3 *r8 = 0; - for (i = 0; i < r30; i++) - { - next = curr + r31; - r8 = (gUnkClass3 *) curr; - ((gUnkClass3 *) curr)->unk0 = (gUnkClass3 *) (*new_var3); - curr = *new_var3; - } - - r8->unk0 = 0; + size_t blockSize = (size+7) & ~0x3; + p1->unk8 = nodes; + p1->unkC = blockSize; + u8* data = (u8*)func_801DAD98((nodes + 1) * blockSize); + p1->unk10 = data; + p1->unk18 = (gUnkClass3*)data; + p1->unk14 = data + (nodes * blockSize); + u8* next; + u8** pnext = &next; + size_t i; + gUnkClass3* r8 = NULL; + for (i = 0; i < nodes; i++) { + *pnext = data + blockSize; + r8 = (gUnkClass3*)data; + ((gUnkClass3*)data)->unk0 = (gUnkClass3*)(*pnext); + data = *pnext; + } + r8->unk0 = 0; } -// allocate a linked list node from the free store gUnkClass1* func_801DBC58(gUnkClass2* p1) { gUnkClass3* r31 = p1->unk18; u32 r30 = func_801DBB3C(); func_801DBB44(0); if (r31) { - p1->unk18 = r31->unk0; // point unk18 to possible next free block? + p1->unk18 = r31->unk0; goto passCheck; } func_801DBB44(r30); @@ -78,8 +64,6 @@ passCheck: return &r31->unk4; } -// 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; @@ -94,7 +78,6 @@ void func_801DBD00(gUnkClass2* p1, gUnkClass1* p2) } } -// allocate the free store given number of elements and size of each? gUnkClass2* func_801DBD74(u32 nodes, u32 size) { size_t i; -- cgit v1.2.3 From 828020713c213b3e02af7f8c87f473c2a3ce26ba Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 23 Oct 2020 23:24:52 -0400 Subject: delete code_801DBB3C_asm.s --- asm/code_801DBB3C_asm.s | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 asm/code_801DBB3C_asm.s diff --git a/asm/code_801DBB3C_asm.s b/asm/code_801DBB3C_asm.s deleted file mode 100644 index 4ea72fe..0000000 --- a/asm/code_801DBB3C_asm.s +++ /dev/null @@ -1,3 +0,0 @@ -.include "macros.inc" - -.section .text, "ax" # 0x80006980 - 0x803E1E60 -- cgit v1.2.3