diff options
-rw-r--r-- | asm/code_801DB81C_asm.s | 80 | ||||
-rw-r--r-- | src/code_801DB81C.cpp | 96 |
2 files changed, 84 insertions, 92 deletions
diff --git a/asm/code_801DB81C_asm.s b/asm/code_801DB81C_asm.s index 30007ec..496da65 100644 --- a/asm/code_801DB81C_asm.s +++ b/asm/code_801DB81C_asm.s @@ -2,86 +2,6 @@ .section .text, "ax" # 0x80006980 - 0x803E1E60
-.global func_801DB978
-func_801DB978:
-/* 801DB978 001D75D8 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DB97C 001D75DC 7C 08 02 A6 */ mflr r0
-/* 801DB980 001D75E0 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DB984 001D75E4 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801DB988 001D75E8 7C 3F 0B 78 */ mr r31, r1
-/* 801DB98C 001D75EC 93 C1 00 08 */ stw r30, 8(r1)
-/* 801DB990 001D75F0 7C 7E 1B 78 */ mr r30, r3
-/* 801DB994 001D75F4 7C 68 02 A6 */ mflr r3
-/* 801DB998 001D75F8 90 6D A0 40 */ stw r3, lbl_8063F300-_SDA_BASE_(r13)
-/* 801DB99C 001D75FC 7F C3 F3 78 */ mr r3, r30
-/* 801DB9A0 001D7600 4B FF FE 7D */ bl func_801DB81C
-/* 801DB9A4 001D7604 2C 1E 00 00 */ cmpwi r30, 0
-/* 801DB9A8 001D7608 40 82 00 0C */ bne lbl_801DB9B4
-/* 801DB9AC 001D760C 38 60 00 01 */ li r3, 1
-/* 801DB9B0 001D7610 48 00 00 2C */ b lbl_801DB9DC
-lbl_801DB9B4:
-/* 801DB9B4 001D7614 80 6D A0 3C */ lwz r3, lbl_8063F2FC-_SDA_BASE_(r13)
-/* 801DB9B8 001D7618 80 AD A0 38 */ lwz r5, lbl_8063F2F8-_SDA_BASE_(r13)
-/* 801DB9BC 001D761C 7C 63 2A 14 */ add r3, r3, r5
-/* 801DB9C0 001D7620 38 23 FF F8 */ addi r1, r3, -8
-/* 801DB9C4 001D7624 38 60 FF FF */ li r3, -1
-/* 801DB9C8 001D7628 90 61 00 00 */ stw r3, 0(r1)
-/* 801DB9CC 001D762C 80 6D A0 40 */ lwz r3, lbl_8063F300-_SDA_BASE_(r13)
-/* 801DB9D0 001D7630 7C 68 03 A6 */ mtlr r3
-/* 801DB9D4 001D7634 4E 80 00 20 */ blr
-/* 801DB9D8 001D7638 38 60 00 01 */ li r3, 1
-lbl_801DB9DC:
-/* 801DB9DC 001D763C 7F EA FB 78 */ mr r10, r31
-/* 801DB9E0 001D7640 83 FF 00 0C */ lwz r31, 0xc(r31)
-/* 801DB9E4 001D7644 83 CA 00 08 */ lwz r30, 8(r10)
-/* 801DB9E8 001D7648 81 41 00 00 */ lwz r10, 0(r1)
-/* 801DB9EC 001D764C 80 0A 00 04 */ lwz r0, 4(r10)
-/* 801DB9F0 001D7650 7D 41 53 78 */ mr r1, r10
-/* 801DB9F4 001D7654 7C 08 03 A6 */ mtlr r0
-/* 801DB9F8 001D7658 4E 80 00 20 */ blr
-
-.global func_801DB9FC
-func_801DB9FC:
-/* 801DB9FC 001D765C 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DBA00 001D7660 7C 08 02 A6 */ mflr r0
-/* 801DBA04 001D7664 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DBA08 001D7668 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801DBA0C 001D766C 93 C1 00 08 */ stw r30, 8(r1)
-/* 801DBA10 001D7670 88 0D A0 44 */ lbz r0, lbl_8063F304-_SDA_BASE_(r13)
-/* 801DBA14 001D7674 28 00 00 01 */ cmplwi r0, 1
-/* 801DBA18 001D7678 41 82 00 5C */ beq lbl_801DBA74
-/* 801DBA1C 001D767C 3F C0 80 49 */ lis r30, lbl_80491370@ha
-/* 801DBA20 001D7680 3B E0 00 1F */ li r31, 0x1f
-/* 801DBA24 001D7684 3B DE 13 70 */ addi r30, r30, lbl_80491370@l
-lbl_801DBA28:
-/* 801DBA28 001D7688 88 1E 00 00 */ lbz r0, 0(r30)
-/* 801DBA2C 001D768C 28 00 00 FF */ cmplwi r0, 0xff
-/* 801DBA30 001D7690 41 82 00 2C */ beq lbl_801DBA5C
-/* 801DBA34 001D7694 81 9E 00 04 */ lwz r12, 4(r30)
-/* 801DBA38 001D7698 2C 0C 00 00 */ cmpwi r12, 0
-/* 801DBA3C 001D769C 41 82 00 20 */ beq lbl_801DBA5C
-/* 801DBA40 001D76A0 80 6D A0 3C */ lwz r3, lbl_8063F2FC-_SDA_BASE_(r13)
-/* 801DBA44 001D76A4 54 00 4B EC */ rlwinm r0, r0, 9, 0xf, 0x16
-/* 801DBA48 001D76A8 88 BE 00 01 */ lbz r5, 1(r30)
-/* 801DBA4C 001D76AC 7C 83 02 14 */ add r4, r3, r0
-/* 801DBA50 001D76B0 38 60 00 00 */ li r3, 0
-/* 801DBA54 001D76B4 7D 89 03 A6 */ mtctr r12
-/* 801DBA58 001D76B8 4E 80 04 21 */ bctrl
-lbl_801DBA5C:
-/* 801DBA5C 001D76BC 2C 1F 00 00 */ cmpwi r31, 0
-/* 801DBA60 001D76C0 3B FF FF FF */ addi r31, r31, -1
-/* 801DBA64 001D76C4 3B DE 00 08 */ addi r30, r30, 8
-/* 801DBA68 001D76C8 40 82 FF C0 */ bne lbl_801DBA28
-/* 801DBA6C 001D76CC 38 00 00 01 */ li r0, 1
-/* 801DBA70 001D76D0 98 0D A0 44 */ stb r0, lbl_8063F304-_SDA_BASE_(r13)
-lbl_801DBA74:
-/* 801DBA74 001D76D4 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801DBA78 001D76D8 83 E1 00 0C */ lwz r31, 0xc(r1)
-/* 801DBA7C 001D76DC 83 C1 00 08 */ lwz r30, 8(r1)
-/* 801DBA80 001D76E0 7C 08 03 A6 */ mtlr r0
-/* 801DBA84 001D76E4 38 21 00 10 */ addi r1, r1, 0x10
-/* 801DBA88 001D76E8 4E 80 00 20 */ blr
-
.global func_801DBA8C
func_801DBA8C:
/* 801DBA8C 001D76EC 94 21 FF F0 */ stwu r1, -0x10(r1)
diff --git a/src/code_801DB81C.cpp b/src/code_801DB81C.cpp index 8940b1d..3870e58 100644 --- a/src/code_801DB81C.cpp +++ b/src/code_801DB81C.cpp @@ -3,30 +3,35 @@ #include "SDK/os.h"
extern "C" {
+
+typedef void (*FuncPtr2)(u32, u32, u8);
// TODO: rename
struct unkClass3
{
u8 unk0;
u8 unk1;
- u32 unk4;
+ FuncPtr2 unk4;
};
// TODO: define, rename, localize
-// extern unkClass3 lbl_80491370[32];
-extern u8 lbl_80491370;
+extern unkClass3 lbl_80491370[32];
extern u32 lbl_8063F2F8;
extern u32 lbl_8063F2FC;
-
+extern u32 lbl_8063F300;
extern u8 lbl_8063F304;
extern u32 lbl_8063F308;
+
+
+
//static
void func_801DB81C(u8 p1);
-
-void func_801DB92C(u8 p1, u8 p2, u32 p3);
+static void func_801DB92C(u8 p1, u8 p2, u32 p3);
+u32 func_801DB978(u8 p1);
+void func_801DB9FC(void);
@@ -129,20 +134,87 @@ asm void func_801DB81C(u8 p1) #pragma peephole on
#endif
-//static
-void func_801DB92C(u8 p1, u8 p2, u32 p3)
+// set/clear a field of bits in lbl_8063F308 from
+// left to right.
+// setOrClear == 1
+// else clear the specfied range
+
+static void func_801DB92C(u8 left, u8 right, u32 setOrClear)
{
u32 r6 = 0x80000000;
- while (p1--)
+ while (left--)
r6 >>= 1;
- while (p2--) {
- lbl_8063F308 = (p3 == 1) ? lbl_8063F308 | r6 : lbl_8063F308 & ~r6;
+ while (right--) {
+ lbl_8063F308 = (setOrClear == 1) ? lbl_8063F308 | r6 : lbl_8063F308 & ~r6;
r6 >>= 1;
}
}
+#ifdef NONMATCHING
+// This function directly accesses the stack pointer and link register.
+// Possibly handwritten assembly.
+u32 func_801DB978(u8 p1)
+{
+ func_801DB81C(p1);
+ if (p1)
+ return 1;
+}
+#else
+asm u32 func_801DB978(u8 p1)
+{
+ nofralloc
+ /* 801DB978 001D75D8 94 21 FF F0 */ stwu r1, -0x10(r1)
+ /* 801DB97C 001D75DC 7C 08 02 A6 */ mflr r0
+ /* 801DB980 001D75E0 90 01 00 14 */ stw r0, 0x14(r1)
+ /* 801DB984 001D75E4 93 E1 00 0C */ stw r31, 0xc(r1)
+ /* 801DB988 001D75E8 7C 3F 0B 78 */ mr r31, r1
+ /* 801DB98C 001D75EC 93 C1 00 08 */ stw r30, 8(r1)
+ /* 801DB990 001D75F0 7C 7E 1B 78 */ mr r30, r3
+ /* 801DB994 001D75F4 7C 68 02 A6 */ mflr r3
+ /* 801DB998 001D75F8 90 6D A0 40 */ stw r3, 0xA040(r13)
+ /* 801DB99C 001D75FC 7F C3 F3 78 */ mr r3, r30
+ /* 801DB9A0 001D7600 4B FF FE 7D */ bl func_801DB81C
+ /* 801DB9A4 001D7604 2C 1E 00 00 */ cmpwi r30, 0
+ /* 801DB9A8 001D7608 40 82 00 0C */ bne lbl_801DB9B4
+ /* 801DB9AC 001D760C 38 60 00 01 */ li r3, 1
+ /* 801DB9B0 001D7610 48 00 00 2C */ b lbl_801DB9DC
+ lbl_801DB9B4:
+ /* 801DB9B4 001D7614 80 6D A0 3C */ lwz r3, 0xA03C(r13)
+ /* 801DB9B8 001D7618 80 AD A0 38 */ lwz r5, 0xA038(r13)
+ /* 801DB9BC 001D761C 7C 63 2A 14 */ add r3, r3, r5
+ /* 801DB9C0 001D7620 38 23 FF F8 */ addi r1, r3, -8
+ /* 801DB9C4 001D7624 38 60 FF FF */ li r3, -1
+ /* 801DB9C8 001D7628 90 61 00 00 */ stw r3, 0(r1)
+ /* 801DB9CC 001D762C 80 6D A0 40 */ lwz r3, 0xA040(r13)
+ /* 801DB9D0 001D7630 7C 68 03 A6 */ mtlr r3
+ /* 801DB9D4 001D7634 4E 80 00 20 */ blr
+ /* 801DB9D8 001D7638 38 60 00 01 */ li r3, 1
+ lbl_801DB9DC:
+ /* 801DB9DC 001D763C 7F EA FB 78 */ mr r10, r31
+ /* 801DB9E0 001D7640 83 FF 00 0C */ lwz r31, 0xc(r31)
+ /* 801DB9E4 001D7644 83 CA 00 08 */ lwz r30, 8(r10)
+ /* 801DB9E8 001D7648 81 41 00 00 */ lwz r10, 0(r1)
+ /* 801DB9EC 001D764C 80 0A 00 04 */ lwz r0, 4(r10)
+ /* 801DB9F0 001D7650 7D 41 53 78 */ mr r1, r10
+ /* 801DB9F4 001D7654 7C 08 03 A6 */ mtlr r0
+ /* 801DB9F8 001D7658 4E 80 00 20 */ blr
+}
+#pragma peephole on
+#endif
-
+void func_801DB9FC(void)
+{
+ if (lbl_8063F304 != 1) {
+ u32 i = 31, j = 0;
+ do
+ {
+ if (lbl_80491370[j].unk0 != 0xff && lbl_80491370[j].unk4)
+ lbl_80491370[j].unk4(0, lbl_8063F2FC + lbl_80491370[j].unk0 << 9, lbl_80491370[j].unk1);
+ j++;
+ } while (i-- != 0);
+ }
+ lbl_8063F304 = 1;
+}
}
|