decompile code_801DB81C, and revamp the source file layout template and type naming convention. Rename unkStruct to ctorStruct

This commit is contained in:
Max 2020-10-22 14:47:56 -04:00
parent d777bee871
commit e59582e061
9 changed files with 102 additions and 118 deletions

View File

@ -1,8 +1,5 @@
.section .bss, "wa" # 0x80474F00 - 0x80643050
.global lbl_80491370
lbl_80491370:
.skip 0x100
.global lbl_80491470
lbl_80491470:
.skip 0x380

View File

@ -1,11 +1,8 @@
.section .sbss, "wa" # 0x80474F00 - 0x80643050
.global lbl_8063F304
lbl_8063F304:
.global lbl_8063F30C
lbl_8063F30C:
.skip 0x4
.global lbl_8063F308
lbl_8063F308:
.skip 0x8
.global lbl_8063F310
lbl_8063F310:
.skip 0x8

View File

@ -7,9 +7,9 @@ extern "C" {
#include "SDK/mem.h"
typedef u32 (*FuncPtr)(void*, u32, u32);
typedef u32 (*gFuncPtr1)(void*, u32, u32);
struct unkClass
struct gUnkClass1
{
u8 unk0;
u8 unk1;
@ -19,24 +19,24 @@ struct unkClass
void* unkC;
u32 unk10;
u32 unk14;
FuncPtr unk18;
unkClass* unk1C;
unkClass* unk20;
gFuncPtr1 unk18;
gUnkClass1* unk1C;
gUnkClass1* unk20;
};
unkClass* func_801DB07C(unkClass* p1, BOOL p2);
gUnkClass1* func_801DB07C(gUnkClass1* p1, BOOL p2);
void func_801DB15C(u32 p1);
void* func_801DB270(MEMHeapHandle heap, u32 size, int align, u32 p4, u32 p5, FuncPtr p6);
void* func_801DB360(u32 size, int align, u32 p3, u32 p4, FuncPtr p5);
void func_801DB3BC(void* p1, u32 p2, u32 p3, FuncPtr p4);
void* func_801DB270(MEMHeapHandle heap, u32 size, int align, u32 p4, u32 p5, gFuncPtr1 p6);
void* func_801DB360(u32 size, int align, u32 p3, u32 p4, gFuncPtr1 p5);
void func_801DB3BC(void* p1, u32 p2, u32 p3, gFuncPtr1 p4);
void* func_801DB4BC(u32 p1, u32 p2);
u32 func_801DB4FC(u32 p1, u32 p2);
u32 func_801DB548(u32 p1, u32 p2);
u32 func_801DB5E4(u32 p1, u32 p2);
void func_801DB644(u32 p1, u32 p2);
void func_801DB674(u32 p1);
BOOL func_801DB6D0(u32 p1, u32 p2, MEMHeapHandle p3, u32 p4, u32 p5, FuncPtr p6);
BOOL func_801DB6D0(u32 p1, u32 p2, MEMHeapHandle p3, u32 p4, u32 p5, gFuncPtr1 p6);
void func_801DB79C(u32 p1, u32 p2);
void func_801DB7CC(u32 p1, u32 p2);

View File

@ -7,14 +7,14 @@ extern "C" {
#include "code_801DB040.h"
struct unkClass2
struct gUnkClass2
{
u8 pad[0x24];
};
unkClass* func_801DBC58(unkClass2* p1);
void func_801DBD00(unkClass2* p1, unkClass* p2);
unkClass2* func_801DBD74(u32 p1, u32 p2);
gUnkClass1* func_801DBC58(gUnkClass2* p1);
void func_801DBD00(gUnkClass2* p1, gUnkClass1* p2);
gUnkClass2* func_801DBD74(u32 p1, u32 p2);
#ifdef __cplusplus
}

View File

@ -1,17 +1,17 @@
#ifndef POKEREVO_CODE_UNKSTRUCT_H
#define POKEREVO_CODE_UNKSTRUCT_H
#ifndef POKEREVO_CODE_CTORSTRUCT_H
#define POKEREVO_CODE_CTORSTRUCT_H
// Note: Many instances of this class appear in .sbss, and they are partially initialized
// by the static initializers in .ctors
struct unkStruct
struct ctorStruct
{
u8 unk0;
u16 unk2;
u8 unk4;
u8 unk5;
unkStruct(u8 p1, u16 p2, u8 p3)
ctorStruct(u8 p1, u16 p2, u8 p3)
: unk0(p1), unk2(p2), unk4(p3) { }
};
#endif //POKEREVO_CODE_UNKSTRUCT_H
#endif //POKEREVO_CODE_CTORSTRUCT_H

View File

@ -1,11 +1,8 @@
#include "types.h"
#include "unkStruct.h"
#include "ctorStruct.h"
#include "code_801DAAE0.h"
namespace
{
unkStruct gUnk8063F2C8(1, 4, 0);
}
static ctorStruct gUnk8063F2C8(1, 4, 0);
void* operator new(size_t sz)
{

View File

@ -1,5 +1,5 @@
#include "types.h"
#include "unkStruct.h"
#include "ctorStruct.h"
#include "Runtime/__mem.h"
#include "SDK/mem.h"
#include "code_801DAAE0.h"
@ -19,17 +19,22 @@ namespace
u16 groupID;
u32 unk8;
};
const size_t ARR_SIZE = 16;
unkClass gUnk804912B0[ARR_SIZE];
unkStruct gUnk8063F2D0(1, 4, 0);
u8 gUnk8063F2D6;
u8 gUnk8063F2D7;
MEMHeapHandle gUnk8063F2D8;
u16 gUnk8063F2DC;
}
static unkClass* func_801DAAE0(void);
static void* lbl_801DAC9C(MEMHeapHandle heap, u32 size, int fill);
static BOOL func_801DAD1C(MEMHeapHandle heap, void* memBlock, u32 size);
static u32 func_801DAD60(MEMHeapHandle heap);
static void lbl_801DAF1C(void* memBlock, MEMHeapHandle, u32 p3);
static const size_t ARR_SIZE = 16;
static unkClass gUnk804912B0[ARR_SIZE];
static ctorStruct gUnk8063F2D0(1, 4, 0);
static u8 gUnk8063F2D6;
static u8 gUnk8063F2D7;
static MEMHeapHandle gUnk8063F2D8;
static u16 gUnk8063F2DC;
extern "C" {
static unkClass* func_801DAAE0(void)

View File

@ -1,31 +1,30 @@
#include "types.h"
#include "unkStruct.h"
#include "ctorStruct.h"
#include "Runtime/__mem.h"
#include "SDK/mem.h"
#include "code_801DAAE0.h"
#include "code_801DBB3C.h"
#include "code_801DB040.h"
static gUnkClass1* func_801DB040(u32 p1, u32 p2);
static ctorStruct gUnk8063F2E0(1, 4, 0);
static gUnkClass1* gUnk8063F2E8;
static gUnkClass2* gUnk8063F2EC;
extern "C" {
namespace
static gUnkClass1* func_801DB040(u32 p1, u32 p2)
{
unkStruct gUnk8063F2E0(1, 4, 0);
unkClass* gUnk8063F2E8;
unkClass2* gUnk8063F2EC;
}
static unkClass* func_801DB040(u32 p1, u32 p2)
{
for (unkClass* r5 = gUnk8063F2E8; r5; r5 = r5->unk1C)
for (gUnkClass1* r5 = gUnk8063F2E8; r5; r5 = r5->unk1C)
if (r5->unk10 == p1 && r5->unk14 == p2)
return r5;
return NULL;
}
unkClass* func_801DB07C(unkClass* p1, BOOL p2)
gUnkClass1* func_801DB07C(gUnkClass1* p1, BOOL p2)
{
unkClass* r31;
gUnkClass1* r31;
if (p1->unk18 && p1->unk18(p1->unkC, p1->unk10, p1->unk14) == 0)
return p1->unk1C;
if (p1->unk0) {
@ -38,7 +37,7 @@ unkClass* func_801DB07C(unkClass* p1, BOOL p2)
p1->unkC = NULL;
r31 = p1->unk1C;
if (p2) {
unkClass* r3 = p1->unk20;
gUnkClass1* r3 = p1->unk20;
if (r3)
r3->unk1C = r31;
else
@ -57,11 +56,11 @@ void func_801DB15C(u32 p1)
gUnk8063F2EC = func_801DBD74(p1, 36);
}
static void* func_801DB184(MEMHeapHandle heap, u32 size, u32 p3, u32 p4, FuncPtr p5)
static void* func_801DB184(MEMHeapHandle heap, u32 size, u32 p3, u32 p4, gFuncPtr1 p5)
{
if (func_801DB040(p3, p4))
return NULL;
unkClass* r31 = func_801DBC58(gUnk8063F2EC);
gUnkClass1* r31 = func_801DBC58(gUnk8063F2EC);
if (!r31)
return NULL;
if ((r31->unkC = func_801DAC94(heap, size)) == NULL) {
@ -85,11 +84,11 @@ static void* func_801DB184(MEMHeapHandle heap, u32 size, u32 p3, u32 p4, FuncPtr
return r31->unkC;
}
void* func_801DB270(MEMHeapHandle heap, u32 size, int align, u32 p4, u32 p5, FuncPtr p6)
void* func_801DB270(MEMHeapHandle heap, u32 size, int align, u32 p4, u32 p5, gFuncPtr1 p6)
{
if (func_801DB040(p4, p5))
return NULL;
unkClass* r31 = func_801DBC58(gUnk8063F2EC);
gUnkClass1* r31 = func_801DBC58(gUnk8063F2EC);
if (!r31)
return NULL;
if ((r31->unkC = func_801DAD08(heap, size, align)) == NULL) {
@ -112,14 +111,14 @@ void* func_801DB270(MEMHeapHandle heap, u32 size, int align, u32 p4, u32 p5, Fun
return r31->unkC;
}
void* func_801DB360(u32 size, int align, u32 p3, u32 p4, FuncPtr p5)
void* func_801DB360(u32 size, int align, u32 p3, u32 p4, gFuncPtr1 p5)
{
return func_801DB270(func_801DAC0C(), size, align, p3, p4, p5);
}
void func_801DB3BC(void* p1, u32 p2, u32 p3, FuncPtr p4)
void func_801DB3BC(void* p1, u32 p2, u32 p3, gFuncPtr1 p4)
{
unkClass* r31 = func_801DB040(p2, p3);
gUnkClass1* r31 = func_801DB040(p2, p3);
if (!p1) {
if (r31)
func_801DB07C(r31, TRUE);
@ -136,7 +135,7 @@ void func_801DB3BC(void* p1, u32 p2, u32 p3, FuncPtr p4)
r31->unk18 = p4;
}
} else {
unkClass* r3 = func_801DBC58(gUnk8063F2EC);
gUnkClass1* r3 = func_801DBC58(gUnk8063F2EC);
if (r3) {
if (gUnk8063F2E8)
gUnk8063F2E8->unk20 = r3;
@ -155,7 +154,7 @@ void func_801DB3BC(void* p1, u32 p2, u32 p3, FuncPtr p4)
void* func_801DB4BC(u32 p1, u32 p2)
{
unkClass* r3 = func_801DB040(p1, p2);
gUnkClass1* r3 = func_801DB040(p1, p2);
if (!r3 || r3->unk1)
return NULL;
return r3->unkC;
@ -163,7 +162,7 @@ void* func_801DB4BC(u32 p1, u32 p2)
u32 func_801DB4FC(u32 p1, u32 p2)
{
unkClass* r3 = func_801DB040(p1, p2);
gUnkClass1* r3 = func_801DB040(p1, p2);
if (!r3 || r3->unk1)
return 0;
return ++r3->unk4;
@ -171,7 +170,7 @@ u32 func_801DB4FC(u32 p1, u32 p2)
u32 func_801DB548(u32 p1, u32 p2)
{
unkClass* r31 = func_801DB040(p1, p2);
gUnkClass1* r31 = func_801DB040(p1, p2);
if (!r31 || r31->unk1)
return 0;
if (r31->unk4 == 0) {
@ -185,7 +184,7 @@ u32 func_801DB548(u32 p1, u32 p2)
u32 func_801DB5E4(u32 p1, u32 p2)
{
unkClass* r3 = func_801DB040(p1, p2);
gUnkClass1* r3 = func_801DB040(p1, p2);
if (!r3)
return 0;
if (!r3->unkC)
@ -197,21 +196,21 @@ u32 func_801DB5E4(u32 p1, u32 p2)
void func_801DB644(u32 p1, u32 p2)
{
unkClass* r3 = func_801DB040(p1, p2);
gUnkClass1* r3 = func_801DB040(p1, p2);
if (r3)
func_801DB07C(r3, TRUE);
}
void func_801DB674(u32 p1)
{
unkClass* p = gUnk8063F2E8;
gUnkClass1* p = gUnk8063F2E8;
while (p)
p = (p->unk10 == p1) ? func_801DB07C(p, TRUE) : p->unk1C;
}
BOOL func_801DB6D0(u32 p1, u32 p2, MEMHeapHandle heap, u32 p4, u32 p5, FuncPtr p6)
BOOL func_801DB6D0(u32 p1, u32 p2, MEMHeapHandle heap, u32 p4, u32 p5, gFuncPtr1 p6)
{
unkClass* r31 = func_801DB040(p1, p2);
gUnkClass1* r31 = func_801DB040(p1, p2);
if (!r31 || r31->unk1 || !r31->unkC || !r31->unk0)
return FALSE;
u32 blockSize = func_801DAEE0(r31->unkC);
@ -226,14 +225,14 @@ BOOL func_801DB6D0(u32 p1, u32 p2, MEMHeapHandle heap, u32 p4, u32 p5, FuncPtr p
void func_801DB79C(u32 p1, u32 p2)
{
unkClass* r3 = func_801DB040(p1, p2);
gUnkClass1* r3 = func_801DB040(p1, p2);
if (r3)
r3->unk1 = 1;
}
void func_801DB7CC(u32 p1, u32 p2)
{
unkClass* r3 = func_801DB040(p1, p2);
gUnkClass1* r3 = func_801DB040(p1, p2);
if (r3)
r3->unk1 = 0;
}

View File

@ -1,44 +1,33 @@
#include "types.h"
#include "unkStruct.h"
#include "ctorStruct.h"
#include "SDK/os.h"
#include "code_801DB81C.h"
#pragma unsafe_global_reg_vars off
#pragma ignore_global_reg_vars on
extern "C" {
typedef void (*FuncPtr2)(u32, u32, u8);
namespace
{
struct unkClass3
typedef void (*funcPtr)(u32, u32, u8);
struct unkClass
{
u8 unk0;
u8 unk1;
FuncPtr2 unk4;
funcPtr unk4;
};
unkStruct gUnk8063F2F0(1, 4, 0);
u32 gUnk8063F2F8;
u32 gUnk8063F2FC;
}
u32 gUnk8063F300 asm("r14"); // TODO: how do you reference this from inline asm
extern u8 lbl_8063F304;
extern u32 lbl_8063F308;
// TODO: define, rename, localize
extern unkClass3 lbl_80491370[32];
static void func_801DB81C(u8 p1);
static void func_801DB92C(u8 start, u8 width, u32 setOrClear);
static unkClass gUnk80491370[32];
static ctorStruct gUnk8063F2F0(1, 4, 0);
static u32 gUnk8063F2F8;
static u32 gUnk8063F2FC;
static u32 gUnk8063F300;
static u8 gUnk8063F304;
static u32 gUnk8063F308;
extern "C" {
static void func_801DB81C(u8 p1)
{
size_t i;
@ -50,8 +39,8 @@ static void func_801DB81C(u8 p1)
new_var = 0;
new_var5 = &i;
for (i = new_var; i < 32; i++) {
lbl_8063F308 = new_var;
lbl_80491370[i].unk0 = 0xff;
gUnk8063F308 = new_var;
gUnk80491370[i].unk0 = 0xff;
}
LCEnable();
@ -67,11 +56,11 @@ static void func_801DB81C(u8 p1)
new_var4 = new_var3;
new_var2 = *new_var4;
func_801DB92C(0 & 0xFFu, (u8)new_var2, 1);
lbl_80491370[0].unk0 = 0;
lbl_80491370[0].unk1 = (u8)*new_var3;
gUnk80491370[0].unk0 = 0;
gUnk80491370[0].unk1 = (u8)*new_var3;
}
lbl_8063F304 = 0;
gUnk8063F304 = 0;
}
static void func_801DB92C(u8 start, u8 width, u32 setOrClear)
@ -80,7 +69,7 @@ static void func_801DB92C(u8 start, u8 width, u32 setOrClear)
while (start--)
bit >>= 1;
while (width--) {
lbl_8063F308 = (setOrClear == 1) ? lbl_8063F308 | bit : lbl_8063F308 & ~bit;
gUnk8063F308 = (setOrClear == 1) ? gUnk8063F308 | bit : gUnk8063F308 & ~bit;
bit >>= 1;
}
}
@ -104,8 +93,8 @@ asm u32 func_801DB978(u8 p1)
/* 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)
/* 801DB9B4 001D7614 80 6D A0 3C */ lwz r3, gUnk8063F2FC
/* 801DB9B8 001D7618 80 AD A0 38 */ lwz r5, gUnk8063F2F8
/* 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
@ -135,22 +124,22 @@ void func_801DB9FC(void)
u32 new_var4;
u32 *new_var5;
new_var = 0xff;
if (lbl_8063F304 != 1) {
if (gUnk8063F304 != 1) {
new_var2 = 9;
i = 31, j = 0;
new_var3 = &i;
new_var5 = &new_var4;
do {
unsigned char r0 = lbl_80491370[j].unk0;
unsigned char r0 = gUnk80491370[j].unk0;
new_var4 = *new_var3;
if ((((u32) r0) != new_var) && lbl_80491370[j].unk4) {
lbl_80491370[j].unk4(0, gUnk8063F2FC + (r0 << new_var2), lbl_80491370[j].unk1);
if ((((u32) r0) != new_var) && gUnk80491370[j].unk4) {
gUnk80491370[j].unk4(0, gUnk8063F2FC + (r0 << new_var2), gUnk80491370[j].unk1);
}
i = *new_var5;
j++;
} while ((i--) != 0);
lbl_8063F304 = 1;
gUnk8063F304 = 1;
}
}
@ -164,23 +153,23 @@ void func_801DBA8C(void)
u32 new_var4;
u32 *new_var5;
new_var = 0xff;
if (lbl_8063F304 != 0) {
if (gUnk8063F304 != 0) {
new_var2 = 9;
i = 31, j = 0;
new_var3 = &i;
new_var5 = &new_var4;
do {
unsigned char r0 = lbl_80491370[j].unk0;
unsigned char r0 = gUnk80491370[j].unk0;
new_var4 = *new_var3;
if ((((u32) r0) != new_var) && lbl_80491370[j].unk4) {
lbl_80491370[j].unk4(1, gUnk8063F2FC + (r0 << new_var2), lbl_80491370[j].unk1);
if ((((u32) r0) != new_var) && gUnk80491370[j].unk4) {
gUnk80491370[j].unk4(1, gUnk8063F2FC + (r0 << new_var2), gUnk80491370[j].unk1);
}
i = *new_var5;
j++;
} while ((i--) != 0);
lbl_8063F304 = 0;
gUnk8063F304 = 0;
}
}
}
} //extern "C"