match func_801DB81C

This commit is contained in:
Max 2020-10-21 22:01:08 -04:00
parent 64b05c65e1
commit f249496438
2 changed files with 47 additions and 23 deletions

View File

@ -222,7 +222,7 @@ SPLIT_O_FILES := \
$(BUILD_DIR)/src/code_801DB040.o \
$(BUILD_DIR)/src/code_801DB81C.o \
$(BUILD_DIR)/asm/code_801DB81C_asm.o \
$(BUILD_DIR)/src/func_801DB9FC.o \
$(BUILD_DIR)/src/func_801DB81C.o \
$(BUILD_DIR)/asm/code_801DBB3C.o \
$(BUILD_DIR)/asm/code_801DBE90.o \
$(BUILD_DIR)/asm/code_801DCE6C.o \

View File

@ -34,27 +34,52 @@ u32 func_801DB978(u8 p1);
void func_801DB9FC(void);
void func_801DBA8C(void);
#ifdef NONMATCHING
#define NONMATCHING2
#ifdef NONMATCHING2
// 1. wrong instruction order: loading lbl_80491370@ha before 0
// 2. r30/r31 register swap
//static
void func_801DB81C(u8 p1)
{
for (size_t i = 0; i < 31; i++)
lbl_80491370[i].unk0 = 0xff;
lbl_8063F308 = 0;
lbl_80491370[31].unk0 = 0xff;
LCEnable();
lbl_8063F2FC = 0xE0000000;
lbl_8063F2F8 = p1 << 9;
if (p1) {
func_801DB92C(0, p1, 1);
lbl_80491370[0].unk0 = 0;
lbl_80491370[0].unk1 = p1;
}
lbl_8063F304 = 0;
size_t i;
int 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++)
{
lbl_8063F308 = new_var;
lbl_80491370[i].unk0 = 0xff;
}
LCEnable();
if (i)
{
}
lbl_8063F2FC = 0xE0000000;
i = p1;
new_var = 9;
lbl_8063F2F8 = 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, new_var2, 1);
lbl_80491370[0].unk0 = 0;
lbl_80491370[0].unk1 = *new_var3;
}
lbl_8063F304 = 0;
}
#else
asm void func_801DB81C(u8 p1)
{
@ -132,17 +157,16 @@ asm void func_801DB81C(u8 p1)
#pragma peephole on
#endif
// 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)
// set/clear a field of bits in lbl_8063F308 given the
// specified starting bit (0 MSB ... 31 LSB) and width.
// if setOrClear == 1, set the range,
// else clear the range
static void func_801DB92C(u8 start, u8 width, u32 setOrClear)
{
u32 r6 = 0x80000000;
while (left--)
while (start--)
r6 >>= 1;
while (right--) {
while (width--) {
lbl_8063F308 = (setOrClear == 1) ? lbl_8063F308 | r6 : lbl_8063F308 & ~r6;
r6 >>= 1;
}