From c21a422bb9b25baf18ff4987971ac4daa7f3066d Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 17 Jul 2024 15:40:51 +0200 Subject: [PATCH 1/2] sub_809D25C --- asm/code_809D148.s | 294 ------------------------------------------- src/code_809D148.c | 302 ++++++++++++++++++++++++--------------------- 2 files changed, 160 insertions(+), 436 deletions(-) diff --git a/asm/code_809D148.s b/asm/code_809D148.s index 0d44ee538..d782dc82a 100644 --- a/asm/code_809D148.s +++ b/asm/code_809D148.s @@ -5,300 +5,6 @@ .text - thumb_func_start sub_809D25C -sub_809D25C: - push {r4-r6,lr} - sub sp, 0x24 - ldr r4, _0809D274 - ldr r0, [r4] - cmp r0, 0x2 - beq _0809D28C - cmp r0, 0x2 - bhi _0809D278 - cmp r0, 0x1 - beq _0809D27E - b _0809D2B2 - .align 2, 0 -_0809D274: .4byte gUnknown_20399E8 -_0809D278: - cmp r0, 0x3 - beq _0809D29A - b _0809D2B2 -_0809D27E: - movs r1, 0x4 - ldrsh r0, [r4, r1] - adds r1, r4, 0 - adds r1, 0x1C - bl sub_80A8FD8 - b _0809D2A6 -_0809D28C: - movs r1, 0x4 - ldrsh r0, [r4, r1] - adds r1, r4, 0 - adds r1, 0x1C - bl sub_80AC448 - b _0809D2A6 -_0809D29A: - movs r1, 0x4 - ldrsh r0, [r4, r1] - adds r1, r4, 0 - adds r1, 0x1C - bl sub_80AD360 -_0809D2A6: - lsls r0, 16 - ldr r1, _0809D2C4 - cmp r0, r1 - bne _0809D2B2 - movs r0, 0 - str r0, [r4] -_0809D2B2: - ldr r4, _0809D2C8 - ldr r0, [r4, 0x8] - cmp r0, 0x2 - beq _0809D356 - cmp r0, 0x2 - bhi _0809D2CC - cmp r0, 0x1 - beq _0809D2D2 - b _0809D388 - .align 2, 0 -_0809D2C4: .4byte 0xffff0000 -_0809D2C8: .4byte gUnknown_20399E8 -_0809D2CC: - cmp r0, 0x3 - beq _0809D314 - b _0809D388 -_0809D2D2: - ldr r0, [r4, 0x1C] - ldr r1, [r4, 0x14] - subs r0, r1 - str r0, [sp, 0x4] - ldr r0, [r4, 0x20] - ldr r1, [r4, 0x18] - subs r0, r1 - str r0, [sp, 0x8] - ldr r1, [r4, 0xC] - add r0, sp, 0x4 - bl sub_800290C - ldr r0, [sp, 0x4] - cmp r0, 0 - bne _0809D2FA - ldr r0, [sp, 0x8] - cmp r0, 0 - bne _0809D2FA - str r0, [r4, 0x8] - b _0809D392 -_0809D2FA: - ldr r2, _0809D310 - ldr r0, [r2, 0x14] - ldr r1, [sp, 0x4] - adds r0, r1 - str r0, [r2, 0x14] - ldr r0, [r2, 0x18] - ldr r1, [sp, 0x8] - adds r0, r1 - str r0, [r2, 0x18] - b _0809D392 - .align 2, 0 -_0809D310: .4byte gUnknown_20399E8 -_0809D314: - ldr r1, [r4, 0x1C] - ldr r0, [r4, 0x14] - subs r0, r1, r0 - cmp r0, 0 - bge _0809D320 - adds r0, 0xFF -_0809D320: - asrs r2, r0, 8 - ldr r1, [r4, 0x20] - ldr r0, [r4, 0x18] - subs r1, r0 - cmp r1, 0 - bge _0809D32E - adds r1, 0xFF -_0809D32E: - asrs r1, 8 - lsls r0, r2, 8 - lsls r1, 8 - bl sub_8009FB8 - cmp r0, 0 - bge _0809D33E - adds r0, 0xFF -_0809D33E: - asrs r0, 8 - lsls r0, 8 - ldr r1, [r4, 0xC] - bl __divsi3 - str r0, [r4, 0x10] - cmp r0, 0 - bgt _0809D352 - movs r0, 0x1 - str r0, [r4, 0x10] -_0809D352: - movs r0, 0x2 - str r0, [r4, 0x8] -_0809D356: - add r0, sp, 0xC - ldr r1, _0809D384 - adds r2, r1, 0 - adds r2, 0x8 - adds r5, r1, 0 - subs r5, 0x14 - ldr r3, [r5, 0x10] - movs r4, 0x1 - str r4, [sp] - bl sub_8002934 - ldr r0, [sp, 0xC] - ldr r1, [sp, 0x10] - str r0, [r5, 0x14] - str r1, [r5, 0x18] - ldr r0, [r5, 0x10] - subs r0, 0x1 - str r0, [r5, 0x10] - cmp r0, 0 - bgt _0809D392 - movs r0, 0 - str r0, [r5, 0x8] - b _0809D392 - .align 2, 0 -_0809D384: .4byte gUnknown_20399FC -_0809D388: - ldr r2, _0809D3A4 - ldr r0, [r2, 0x1C] - ldr r1, [r2, 0x20] - str r0, [r2, 0x14] - str r1, [r2, 0x18] -_0809D392: - ldr r5, _0809D3A4 - ldr r0, [r5, 0x24] - cmp r0, 0x1 - beq _0809D3A8 - cmp r0, 0x2 - beq _0809D3D2 - movs r0, 0 - str r0, [r5, 0x34] - b _0809D402 - .align 2, 0 -_0809D3A4: .4byte gUnknown_20399E8 -_0809D3A8: - ldr r0, [r5, 0x30] - subs r0, 0x1 - str r0, [r5, 0x30] - cmp r0, 0 - bgt _0809D404 - movs r0, 0x4 - str r0, [r5, 0x30] - movs r4, 0x2 - negs r4, r4 - adds r0, r4, 0 - movs r1, 0x2 - bl OtherRandRange - lsls r0, 10 - str r0, [r5, 0x34] - adds r0, r4, 0 - movs r1, 0x2 - bl OtherRandRange - lsls r0, 10 - b _0809D402 -_0809D3D2: - ldr r0, [r5, 0x30] - subs r0, 0x1 - str r0, [r5, 0x30] - cmp r0, 0 - bgt _0809D404 - ldr r0, [r5, 0x2C] - str r0, [r5, 0x30] - movs r4, 0x2 - negs r4, r4 - adds r0, r4, 0 - movs r1, 0x2 - bl OtherRandRange - ldr r1, [r5, 0x28] - muls r0, r1 - lsls r0, 8 - str r0, [r5, 0x34] - adds r0, r4, 0 - movs r1, 0x2 - bl OtherRandRange - ldr r1, [r5, 0x28] - muls r0, r1 - lsls r0, 8 -_0809D402: - str r0, [r5, 0x38] -_0809D404: - add r5, sp, 0x14 - add r6, sp, 0x1C - adds r0, r5, 0 - adds r1, r6, 0 - bl sub_80A579C - lsls r0, 24 - cmp r0, 0 - beq _0809D474 - ldr r4, _0809D47C - ldr r0, [r4, 0x14] - ldr r1, [r4, 0x34] - adds r0, r1 - adds r2, r0, 0 - subs r2, 0x80 - ldr r0, [r4, 0x18] - ldr r1, [r4, 0x38] - adds r0, r1 - ldr r1, _0809D480 - adds r3, r0, r1 - ldr r0, [sp, 0x14] - cmp r2, r0 - bge _0809D434 - adds r2, r0, 0 -_0809D434: - ldr r0, [sp, 0x1C] - cmp r2, r0 - blt _0809D43C - subs r2, r0, 0x1 -_0809D43C: - ldr r0, [r5, 0x4] - cmp r3, r0 - bge _0809D444 - adds r3, r0, 0 -_0809D444: - ldr r1, [r6, 0x4] - cmp r3, r1 - blt _0809D44C - subs r3, r1, 0x1 -_0809D44C: - ldr r1, _0809D484 - adds r0, r2, r1 - cmp r0, 0 - bge _0809D458 - adds r1, 0xFF - adds r0, r2, r1 -_0809D458: - asrs r0, 8 - str r0, [r4, 0x3C] - ldr r1, _0809D488 - adds r0, r3, r1 - cmp r0, 0 - bge _0809D468 - adds r1, 0xFF - adds r0, r3, r1 -_0809D468: - asrs r0, 8 - str r0, [r4, 0x40] - adds r1, r4, 0 - adds r1, 0x44 - movs r0, 0x1 - strb r0, [r1] -_0809D474: - add sp, 0x24 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0809D47C: .4byte gUnknown_20399E8 -_0809D480: .4byte 0xfffff480 -_0809D484: .4byte 0xffff8700 -_0809D488: .4byte 0xffffb000 - thumb_func_end sub_809D25C - thumb_func_start nullsub_120 nullsub_120: bx lr diff --git a/src/code_809D148.c b/src/code_809D148.c index 35331a92e..70fe4e6d8 100644 --- a/src/code_809D148.c +++ b/src/code_809D148.c @@ -1,37 +1,35 @@ #include "global.h" +#include "other_random.h" + +struct unkStruct_809D158 +{ + s32 a0; + s32 a4; +}; struct unkStruct_20399E8 { u32 unk0; - u32 unk4; + s32 unk4; u32 unk8; - u32 unkC; - u32 unk10; - u32 unk14; - u32 unk18; - u32 unk1C; - u32 unk20; - + s32 unkC; + s32 unk10; + struct unkStruct_809D158 unk14; + struct unkStruct_809D158 unk1C; u32 unk24; u32 unk28; - u32 unk2C; - u32 unk30; - u32 unk34; - u32 unk38; - u32 unk3C; - u32 unk40; + s32 unk2C; + s32 unk30; + s32 unk34; + s32 unk38; + struct unkStruct_809D158 unk3C; u8 unk44; }; -struct unkStruct_809D158 -{ - u32 unk0; - u32 unk4; -}; - extern struct unkStruct_20399E8 gUnknown_20399E8; void sub_809D0BC(void); +void sub_809D158(u32 r0, const struct unkStruct_809D158 *r1); s32 sub_809CFE8(u16 param_1) { @@ -104,70 +102,23 @@ void nullsub_119(void) { } -#ifndef NONMATCHING -NAKED -#endif +extern const struct unkStruct_809D158 gUnknown_8116478; + void sub_809D0BC(void) { -#ifdef NONMATCHING - struct unkStruct_20399E8 *pre_load_203; - - u32 temp; - u32 temp1; - - pre_load_203 = &gUnknown_20399E8; - - // TODO regswap.. should be r2/r3, not r0, r1 - temp = gUnknown_8116478.unk0; - temp1 = gUnknown_8116478.unk4; - - pre_load_203->unk3C = temp; - pre_load_203->unk40 = temp1; - pre_load_203->unk44 = 0; - sub_809D158(0); - pre_load_203->unk8 = 0; - pre_load_203->unkC = 0; - pre_load_203->unk10 = 0; - pre_load_203->unk4 = -1; - pre_load_203->unk24 = 0; - pre_load_203->unk28 = 0; - pre_load_203->unk2C = 0; - pre_load_203->unk30 = 0; - pre_load_203->unk34 = 0; - pre_load_203->unk38 = 0; -#else - asm_unified("\tpush {r4,r5,lr}\n" - "\tldr r5, _0809D0F8\n" - "\tldr r1, _0809D0FC\n" - "\tldr r2, [r1]\n" - "\tldr r3, [r1, 0x4]\n" - "\tstr r2, [r5, 0x3C]\n" - "\tstr r3, [r5, 0x40]\n" - "\tadds r0, r5, 0\n" - "\tadds r0, 0x44\n" - "\tmovs r4, 0\n" - "\tstrb r4, [r0]\n" - "\tmovs r0, 0\n" - "\tbl sub_809D158\n" - "\tstr r4, [r5, 0x8]\n" - "\tstr r4, [r5, 0xC]\n" - "\tstr r4, [r5, 0x10]\n" - "\tmovs r0, 0x1\n" - "\tnegs r0, r0\n" - "\tstr r0, [r5, 0x4]\n" - "\tstr r4, [r5, 0x24]\n" - "\tstr r4, [r5, 0x28]\n" - "\tstr r4, [r5, 0x2C]\n" - "\tstr r4, [r5, 0x30]\n" - "\tstr r4, [r5, 0x34]\n" - "\tstr r4, [r5, 0x38]\n" - "\tpop {r4,r5}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" -"_0809D0F8: .4byte gUnknown_20399E8\n" -"_0809D0FC: .4byte gUnknown_8116478\n"); -#endif + gUnknown_20399E8.unk3C = gUnknown_8116478; + gUnknown_20399E8.unk44 = 0; + sub_809D158(0, &gUnknown_8116478); + gUnknown_20399E8.unk8 = 0; + gUnknown_20399E8.unkC = 0; + gUnknown_20399E8.unk10 = 0; + gUnknown_20399E8.unk4 = -1; + gUnknown_20399E8.unk24 = 0; + gUnknown_20399E8.unk28 = 0; + gUnknown_20399E8.unk2C = 0; + gUnknown_20399E8.unk30 = 0; + gUnknown_20399E8.unk34 = 0; + gUnknown_20399E8.unk38 = 0; } void sub_809D100(u32 r0) @@ -203,18 +154,16 @@ void sub_809D148(u32 r0) } -void sub_809D158(u32 r0, struct unkStruct_809D158 *r1) +struct Test1 +{ + u64 ukn0; +}; + +void sub_809D158(u32 r0, const struct unkStruct_809D158 *r1) { - u32 temp; - u32 temp1; gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 0; - - // Load both first and then store - temp = r1->unk0; - temp1 = r1->unk4; - gUnknown_20399E8.unk1C = temp; - gUnknown_20399E8.unk20 = temp1; + gUnknown_20399E8.unk1C = *r1; } void sub_809D170(u32 r0, u32 r1) @@ -233,17 +182,10 @@ void sub_809D180(u32 r0, u32 r1) void sub_809D190(u32 r0, struct unkStruct_809D158 *r1, u32 r2) { - u32 temp; - u32 temp1; gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 1; gUnknown_20399E8.unkC = r2; - - // Load both first and then store - temp = r1->unk0; - temp1 = r1->unk4; - gUnknown_20399E8.unk14 = temp; - gUnknown_20399E8.unk18 = temp1; + gUnknown_20399E8.unk14 = *r1; } void sub_809D1A8(u32 r0, u32 r1, u32 r2) @@ -263,18 +205,10 @@ void sub_809D1BC(u32 r0, u32 r1) void sub_809D1CC(u32 r0, struct unkStruct_809D158 *r1, u32 r2) { - u32 temp; - u32 temp1; - gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 2; gUnknown_20399E8.unk10 = r2; - - // Load both first and then store - temp = r1->unk0; - temp1 = r1->unk4; - gUnknown_20399E8.unk14 = temp; - gUnknown_20399E8.unk18 = temp1; + gUnknown_20399E8.unk14 = *r1; } void sub_809D1E4(u32 r0, u32 r1, u32 r2) @@ -294,18 +228,10 @@ void sub_809D1F8(u32 r0, u32 r1) void sub_809D208(u32 r0, struct unkStruct_809D158 *r1, u32 r2) { - u32 temp; - u32 temp1; - gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 3; gUnknown_20399E8.unkC = r2; - - // Load both first and then store - temp = r1->unk0; - temp1 = r1->unk4; - gUnknown_20399E8.unk14 = temp; - gUnknown_20399E8.unk18 = temp1; + gUnknown_20399E8.unk14 = *r1; } void sub_809D220(u32 r0, u32 r1, u32 r2) @@ -321,32 +247,124 @@ bool32 sub_809D234(void) return gUnknown_20399E8.unk8 != 0; } -// TODO regswap but matches otherwise -// Loads struct into R1... should be R3 -#ifndef NONMATCHING -NAKED -#endif u8 sub_809D248(struct unkStruct_809D158 *r0) { -#ifdef NONMATCHING - u32 temp; - u32 temp1; - - temp = gUnknown_20399E8.unk3C; - temp1 = gUnknown_20399E8.unk40; - r0->unk0 = temp; - r0->unk4 = temp1; + *r0 = gUnknown_20399E8.unk3C; return gUnknown_20399E8.unk44; -#else - asm_unified("\tldr r3, _0809D258\n" - "\tldr r1, [r3, 0x3C]\n" - "\tldr r2, [r3, 0x40]\n" - "\tstr r1, [r0]\n" - "\tstr r2, [r0, 0x4]\n" - "\tadds r3, 0x44\n" - "\tldrb r0, [r3]\n" - "\tbx lr\n" - "\t.align 2, 0\n" -"_0809D258: .4byte gUnknown_20399E8"); -#endif +} + +s32 sub_80A8FD8(s16 a0, struct unkStruct_809D158 *a1); +s32 sub_80AC448(s16 a0, struct unkStruct_809D158 *a1); +s32 sub_80AD360(s16 a0, struct unkStruct_809D158 *a1); +void sub_800290C(struct unkStruct_809D158 *a0, s32 a1); +void sub_8002934(struct unkStruct_809D158 *a0, struct unkStruct_809D158 *a1, struct unkStruct_809D158 *a2, u32 a3, u32 a4); +s32 sub_8009FB8(s32 a0, s32 a1); +bool8 sub_80A579C(struct unkStruct_809D158 *a0, struct unkStruct_809D158 *a1); + +void sub_809D25C(void) +{ + s32 r2, r1, r3; + struct unkStruct_809D158 sp4; + struct unkStruct_809D158 spC; + struct unkStruct_809D158 sp14; + struct unkStruct_809D158 sp1C; + u16 val; + // For some reason I have to compare with 0xFFFF instead of -1. Maybe it has to do with return value of the functions? + switch (gUnknown_20399E8.unk0) + { + case 1: + val = sub_80A8FD8(gUnknown_20399E8.unk4, &gUnknown_20399E8.unk1C); + if (val == (u16) -1) + gUnknown_20399E8.unk0 = 0; + break; + case 2: + val = sub_80AC448(gUnknown_20399E8.unk4, &gUnknown_20399E8.unk1C); + if (val == (u16) -1) + gUnknown_20399E8.unk0 = 0; + break; + case 3: + val = sub_80AD360(gUnknown_20399E8.unk4, &gUnknown_20399E8.unk1C); + if (val == (u16) -1) + gUnknown_20399E8.unk0 = 0; + break; + } + + switch (gUnknown_20399E8.unk8) + { + case 1: + sp4.a0 = gUnknown_20399E8.unk1C.a0 - gUnknown_20399E8.unk14.a0; + sp4.a4 = gUnknown_20399E8.unk1C.a4 - gUnknown_20399E8.unk14.a4; + sub_800290C(&sp4, gUnknown_20399E8.unkC); + if (sp4.a0 == 0 && sp4.a4 == 0) + { + gUnknown_20399E8.unk8 = 0; + } + else + { + gUnknown_20399E8.unk14.a0 += sp4.a0; + gUnknown_20399E8.unk14.a4 += sp4.a4; + } + break; + case 3: + r2 = (gUnknown_20399E8.unk1C.a0 - gUnknown_20399E8.unk14.a0) / 256; + r1 = (gUnknown_20399E8.unk1C.a4 - gUnknown_20399E8.unk14.a4) / 256; + gUnknown_20399E8.unk10 = ((sub_8009FB8(r2 << 8, r1 << 8) / 256) << 8) / gUnknown_20399E8.unkC; + if (gUnknown_20399E8.unk10 <= 0) + gUnknown_20399E8.unk10 = 1; + gUnknown_20399E8.unk8 = 2; + // Breakthrough + case 2: + sub_8002934(&spC, &gUnknown_20399E8.unk14, &gUnknown_20399E8.unk1C, gUnknown_20399E8.unk10, 1); + gUnknown_20399E8.unk14 = spC; + if (--gUnknown_20399E8.unk10 <= 0) + gUnknown_20399E8.unk8 = 0; + break; + default: + gUnknown_20399E8.unk14 = gUnknown_20399E8.unk1C; + break; + } + + switch (gUnknown_20399E8.unk24) + { + default: + gUnknown_20399E8.unk34 = 0; + gUnknown_20399E8.unk38 = 0; + break; + case 1: + if (--gUnknown_20399E8.unk30 <= 0) + { + gUnknown_20399E8.unk30 = 4; + gUnknown_20399E8.unk34 = OtherRandRange(-2, 2) << 0xA; + gUnknown_20399E8.unk38 = OtherRandRange(-2, 2) << 0xA; + } + break; + case 2: + if (--gUnknown_20399E8.unk30 <= 0) + { + gUnknown_20399E8.unk30 = gUnknown_20399E8.unk2C; + gUnknown_20399E8.unk34 = (OtherRandRange(-2, 2) * gUnknown_20399E8.unk28) << 0x8; + gUnknown_20399E8.unk38 = (OtherRandRange(-2, 2) * gUnknown_20399E8.unk28) << 0x8; + } + break; + } + + if (sub_80A579C(&sp14, &sp1C)) + { + r2 = gUnknown_20399E8.unk14.a0 + gUnknown_20399E8.unk34 - 0x80; + r3 = gUnknown_20399E8.unk14.a4 + gUnknown_20399E8.unk38 - 2944; + + if (r2 < sp14.a0) + r2 = sp14.a0; + if (r2 >= sp1C.a0) + r2 = sp1C.a0 - 1; + + if (r3 < sp14.a4) + r3 = sp14.a4; + if (r3 >= sp1C.a4) + r3 = sp1C.a4 - 1; + + gUnknown_20399E8.unk3C.a0 = (r2 - 30976) / 256; + gUnknown_20399E8.unk3C.a4 = (r3 - 20480) / 256; + gUnknown_20399E8.unk44 = 1; + } } From 2de2dc0cb95994aea84edc0084ffc53672c567a2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 17 Jul 2024 16:44:25 +0200 Subject: [PATCH 2/2] decompile more of code_809D148 --- asm/code_809D148.s | 203 ---------------------------------------- include/ground_script.h | 34 ++++++- src/code_809D148.c | 163 +++++++++++++++++++++++++++----- 3 files changed, 171 insertions(+), 229 deletions(-) diff --git a/asm/code_809D148.s b/asm/code_809D148.s index d782dc82a..d3b488498 100644 --- a/asm/code_809D148.s +++ b/asm/code_809D148.s @@ -5,211 +5,8 @@ .text - thumb_func_start nullsub_120 -nullsub_120: - bx lr - thumb_func_end nullsub_120 - thumb_func_start sub_809D490 -sub_809D490: - push {r4,lr} - ldr r4, _0809D4AC - movs r0, 0x80 - lsls r0, 3 - movs r1, 0x6 - bl MemoryAlloc - str r0, [r4] - bl sub_809D4B0 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0809D4AC: .4byte gUnknown_203B4B0 - thumb_func_end sub_809D490 - thumb_func_start sub_809D4B0 -sub_809D4B0: - push {r4,r5,lr} - ldr r0, _0809D4EC - movs r2, 0x1 - negs r2, r2 - adds r1, r2, 0 - strh r1, [r0] - ldr r0, _0809D4F0 - strh r1, [r0] - ldr r0, _0809D4F4 - strh r1, [r0] - ldr r1, _0809D4F8 - movs r0, 0 - strb r0, [r1] - movs r1, 0 - ldr r5, _0809D4FC - movs r2, 0 - ldr r3, _0809D500 - ldr r4, _0809D504 -_0809D4D4: - adds r0, r1, r5 - strb r2, [r0] - adds r0, r1, r3 - strb r2, [r0] - stm r4!, {r2} - adds r1, 0x1 - cmp r1, 0x80 - ble _0809D4D4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0809D4EC: .4byte gUnknown_2039A30 -_0809D4F0: .4byte gUnknown_2039A32 -_0809D4F4: .4byte gUnknown_2039A34 -_0809D4F8: .4byte gUnknown_2039A36 -_0809D4FC: .4byte gUnknown_2039A38 -_0809D500: .4byte gUnknown_2039AC0 -_0809D504: .4byte gUnknown_2039B48 - thumb_func_end sub_809D4B0 - - thumb_func_start sub_809D508 -sub_809D508: - push {r4,lr} - ldr r4, _0809D51C - ldr r0, [r4] - bl MemoryFree - movs r0, 0 - str r0, [r4] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0809D51C: .4byte gUnknown_203B4B0 - thumb_func_end sub_809D508 - - thumb_func_start sub_809D520 -sub_809D520: - ldr r1, _0809D528 - strh r1, [r0] - bx lr - .align 2, 0 -_0809D528: .4byte 0x0000ffff - thumb_func_end sub_809D520 - - thumb_func_start sub_809D52C -sub_809D52C: - push {lr} - movs r2, 0 - ldrsh r1, [r0, r2] - cmp r1, 0x1 - beq _0809D544 - cmp r1, 0x1 - ble _0809D562 - cmp r1, 0x2 - beq _0809D54E - cmp r1, 0x3 - beq _0809D558 - b _0809D562 -_0809D544: - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl sub_80A882C - b _0809D564 -_0809D54E: - movs r2, 0x2 - ldrsh r0, [r0, r2] - bl sub_80AC240 - b _0809D564 -_0809D558: - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl sub_80AD158 - b _0809D564 -_0809D562: - movs r0, 0 -_0809D564: - pop {r1} - bx r1 - thumb_func_end sub_809D52C - - thumb_func_start sub_809D568 -sub_809D568: - push {lr} - adds r3, r0, 0 - ldr r0, _0809D5B4 - strh r0, [r3] - movs r2, 0 - movs r0, 0 - strh r0, [r3, 0x2] - str r0, [r3, 0x8] - str r0, [r3, 0x4] - str r0, [r3, 0x14] - str r0, [r3, 0x10] - adds r1, r3, 0 - adds r1, 0x20 - strb r2, [r1] - str r0, [r3, 0x1C] - movs r1, 0x1 - negs r1, r1 - strh r1, [r3, 0x22] - strh r0, [r3, 0x24] - adds r2, r3, 0 - adds r2, 0x26 - movs r1, 0xFF - strb r1, [r2] - strh r0, [r3, 0x28] - strh r0, [r3, 0x2A] - strh r0, [r3, 0x2C] - str r0, [r3, 0x30] - movs r2, 0 - movs r1, 0x3 - adds r0, r3, 0 - adds r0, 0x5C -_0809D5A6: - str r2, [r0] - subs r0, 0x4 - subs r1, 0x1 - cmp r1, 0 - bge _0809D5A6 - pop {r0} - bx r0 - .align 2, 0 -_0809D5B4: .4byte 0x0000ffff - thumb_func_end sub_809D568 - - thumb_func_start sub_809D5B8 -sub_809D5B8: - push {r4,lr} - adds r4, r0, 0 - movs r0, 0 - str r0, [r4] - str r0, [r4, 0x4] - ldr r0, _0809D5FC - strh r0, [r4, 0x10] - movs r0, 0xFF - strb r0, [r4, 0x12] - adds r0, r4, 0 - adds r0, 0xC - bl sub_809D520 - movs r2, 0 - movs r1, 0x3 - adds r0, r4, 0 - adds r0, 0x20 -_0809D5DA: - str r2, [r0] - subs r0, 0x4 - subs r1, 0x1 - cmp r1, 0 - bge _0809D5DA - adds r0, r4, 0 - adds r0, 0x24 - bl sub_809D568 - adds r0, r4, 0 - adds r0, 0x84 - bl sub_809D568 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0809D5FC: .4byte 0x0000ffff - thumb_func_end sub_809D5B8 thumb_func_start sub_809D600 sub_809D600: diff --git a/include/ground_script.h b/include/ground_script.h index f3090ad09..3624dc61b 100644 --- a/include/ground_script.h +++ b/include/ground_script.h @@ -29,6 +29,34 @@ typedef struct __attribute__((packed)) GroundScript_ExecutePP_1_sub u8 fill50[0x60 - 0x2A]; } GroundScript_ExecutePP_1_sub; +// Needed for sub_809D568, possibly could be merged with GroundScript_ExecutePP_1_sub? +typedef struct GroundScript_ExecutePP_1_sub_not_packed +{ + // size: 0x60 + /* 0x0 */ s16 scriptType; + /* 0x2 */ s16 unk2; + /* 0x4 */ u8 *scriptPointer1; + /* 0x8 */ u8 *scriptPointer2; + /* 0xC */ u16 unkC; + /* 0xE */ u8 unkE; + /* 0xF */ u8 fillF; + /* 0x10 */ u32 unk10; + /* 0x14 */ u8 *unk14; + /* 0x18 */ u8 fill18[2]; + /* 0x1C */ u32 unk1C; + /* 0x20 */ u8 unk20; + /* 0x22 */ u16 unk22; + /* 0x24 */ u16 unk24; + /* 0x26 */ u8 unk26; + /* 0x28 */ u16 unk28; + /* 0x2A */ u16 unk2A; + /* 0x2C */ u16 unk2C; + /* 0x2E */ u16 unk2E; + /* 0x30 */ u32 unk30; + u8 fill34[0x1C]; + u32 unk5C[4]; +} GroundScript_ExecutePP_1_sub_not_packed; + typedef void (*Callback)(u32, void *); typedef struct GroundScript_ExecutePP_1_sub2 { @@ -40,7 +68,7 @@ typedef struct GroundScript_ExecutePP_1 { GroundScript_ExecutePP_1_sub2 *unk0; u32 unk4; - u32 fill8; + u16 unk8; u32 unkC; u16 unk10; u8 unk12; @@ -51,6 +79,8 @@ typedef struct GroundScript_ExecutePP_1 u8 fillE8[0x110 - 0xE8]; } GroundScript_ExecutePP_1; +#include "debug.h" + bool8 GroundScript_ExecutePP(GroundScript_ExecutePP_1 *, s32 *, GroundScript_ExecutePP_3 *, const DebugLocation *unused); -#endif // GUARD_GROUND_SCRIPT_H \ No newline at end of file +#endif // GUARD_GROUND_SCRIPT_H diff --git a/src/code_809D148.c b/src/code_809D148.c index 70fe4e6d8..b9572086b 100644 --- a/src/code_809D148.c +++ b/src/code_809D148.c @@ -1,5 +1,7 @@ #include "global.h" #include "other_random.h" +#include "memory.h" +#include "ground_script.h" struct unkStruct_809D158 { @@ -16,8 +18,8 @@ struct unkStruct_20399E8 s32 unk10; struct unkStruct_809D158 unk14; struct unkStruct_809D158 unk1C; - u32 unk24; - u32 unk28; + s32 unk24; + s32 unk28; s32 unk2C; s32 unk30; s32 unk34; @@ -29,7 +31,8 @@ struct unkStruct_20399E8 extern struct unkStruct_20399E8 gUnknown_20399E8; void sub_809D0BC(void); -void sub_809D158(u32 r0, const struct unkStruct_809D158 *r1); +void sub_809D4B0(void); +void sub_809D158(s32 r0, const struct unkStruct_809D158 *r1); s32 sub_809CFE8(u16 param_1) { @@ -121,7 +124,7 @@ void sub_809D0BC(void) gUnknown_20399E8.unk38 = 0; } -void sub_809D100(u32 r0) +void sub_809D100(s32 r0) { if(gUnknown_20399E8.unk24 != r0) { @@ -134,7 +137,7 @@ void sub_809D100(u32 r0) } } -void sub_809D124(u32 r0, u32 r1, u32 r2) +void sub_809D124(s32 r0, s32 r1, s32 r2) { if(gUnknown_20399E8.unk24 != r0) { @@ -147,7 +150,7 @@ void sub_809D124(u32 r0, u32 r1, u32 r2) gUnknown_20399E8.unk2C = r2; } -void sub_809D148(u32 r0) +void sub_809D148(s32 r0) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 0; @@ -159,28 +162,28 @@ struct Test1 u64 ukn0; }; -void sub_809D158(u32 r0, const struct unkStruct_809D158 *r1) +void sub_809D158(s32 r0, const struct unkStruct_809D158 *r1) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 0; gUnknown_20399E8.unk1C = *r1; } -void sub_809D170(u32 r0, u32 r1) +void sub_809D170(s32 r0, s32 r1) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 0; gUnknown_20399E8.unk4 = r1; } -void sub_809D180(u32 r0, u32 r1) +void sub_809D180(s32 r0, s32 r1) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 1; gUnknown_20399E8.unkC = r1; } -void sub_809D190(u32 r0, struct unkStruct_809D158 *r1, u32 r2) +void sub_809D190(s32 r0, struct unkStruct_809D158 *r1, s32 r2) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 1; @@ -188,7 +191,7 @@ void sub_809D190(u32 r0, struct unkStruct_809D158 *r1, u32 r2) gUnknown_20399E8.unk14 = *r1; } -void sub_809D1A8(u32 r0, u32 r1, u32 r2) +void sub_809D1A8(s32 r0, s32 r1, s32 r2) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 1; @@ -196,14 +199,14 @@ void sub_809D1A8(u32 r0, u32 r1, u32 r2) gUnknown_20399E8.unk4 = r1; } -void sub_809D1BC(u32 r0, u32 r1) +void sub_809D1BC(s32 r0, s32 r1) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 2; gUnknown_20399E8.unk10 = r1; } -void sub_809D1CC(u32 r0, struct unkStruct_809D158 *r1, u32 r2) +void sub_809D1CC(s32 r0, struct unkStruct_809D158 *r1, s32 r2) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 2; @@ -211,7 +214,7 @@ void sub_809D1CC(u32 r0, struct unkStruct_809D158 *r1, u32 r2) gUnknown_20399E8.unk14 = *r1; } -void sub_809D1E4(u32 r0, u32 r1, u32 r2) +void sub_809D1E4(s32 r0, s32 r1, s32 r2) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 2; @@ -219,14 +222,14 @@ void sub_809D1E4(u32 r0, u32 r1, u32 r2) gUnknown_20399E8.unk4 = r1; } -void sub_809D1F8(u32 r0, u32 r1) +void sub_809D1F8(s32 r0, s32 r1) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 3; gUnknown_20399E8.unkC = r1; } -void sub_809D208(u32 r0, struct unkStruct_809D158 *r1, u32 r2) +void sub_809D208(s32 r0, struct unkStruct_809D158 *r1, s32 r2) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 3; @@ -234,7 +237,7 @@ void sub_809D208(u32 r0, struct unkStruct_809D158 *r1, u32 r2) gUnknown_20399E8.unk14 = *r1; } -void sub_809D220(u32 r0, u32 r1, u32 r2) +void sub_809D220(s32 r0, s32 r1, s32 r2) { gUnknown_20399E8.unk0 = r0; gUnknown_20399E8.unk8 = 3; @@ -253,13 +256,14 @@ u8 sub_809D248(struct unkStruct_809D158 *r0) return gUnknown_20399E8.unk44; } -s32 sub_80A8FD8(s16 a0, struct unkStruct_809D158 *a1); -s32 sub_80AC448(s16 a0, struct unkStruct_809D158 *a1); -s32 sub_80AD360(s16 a0, struct unkStruct_809D158 *a1); -void sub_800290C(struct unkStruct_809D158 *a0, s32 a1); -void sub_8002934(struct unkStruct_809D158 *a0, struct unkStruct_809D158 *a1, struct unkStruct_809D158 *a2, u32 a3, u32 a4); -s32 sub_8009FB8(s32 a0, s32 a1); -bool8 sub_80A579C(struct unkStruct_809D158 *a0, struct unkStruct_809D158 *a1); +// Todo: move these to appropriate header files +extern s32 sub_80A8FD8(s16 a0, struct unkStruct_809D158 *a1); +extern s32 sub_80AC448(s16 a0, struct unkStruct_809D158 *a1); +extern s32 sub_80AD360(s16 a0, struct unkStruct_809D158 *a1); +extern void sub_800290C(struct unkStruct_809D158 *a0, s32 a1); +extern void sub_8002934(struct unkStruct_809D158 *a0, struct unkStruct_809D158 *a1, struct unkStruct_809D158 *a2, u32 a3, u32 a4); +extern s32 sub_8009FB8(s32 a0, s32 a1); +extern bool8 sub_80A579C(struct unkStruct_809D158 *a0, struct unkStruct_809D158 *a1); void sub_809D25C(void) { @@ -368,3 +372,114 @@ void sub_809D25C(void) gUnknown_20399E8.unk44 = 1; } } + +void nullsub_120(void) +{} + +// Different file below? + +extern void *gUnknown_203B4B0; + +void sub_809D490(void) +{ + UNUSED void *oldPtr = gUnknown_203B4B0; // Needed to match + gUnknown_203B4B0 = MemoryAlloc(0x400, 6); + sub_809D4B0(); +} + +extern s16 gUnknown_2039A30; +extern s16 gUnknown_2039A32; +extern s16 gUnknown_2039A34; +extern u8 gUnknown_2039A36; +extern u8 gUnknown_2039A38[]; +extern u8 gUnknown_2039AC0[]; +extern u32 gUnknown_2039B48[]; + +void sub_809D4B0(void) +{ + s32 i; + + gUnknown_2039A30 = -1; + gUnknown_2039A32 = -1; + gUnknown_2039A34 = -1; + gUnknown_2039A36 = 0; + for (i = 0; i < 0x81; i++) { + gUnknown_2039A38[i] = 0; + gUnknown_2039AC0[i] = 0; + gUnknown_2039B48[i] = 0; + } +} + +void sub_809D508(void) +{ + MemoryFree(gUnknown_203B4B0); + gUnknown_203B4B0 = NULL; +} + +// -1 didn't match +void sub_809D520(void *a0) +{ + u16 *ptr = a0; + u16 v = 0xFFFF; + *ptr = v; +} + +extern s32 sub_80A882C(s16); +extern s32 sub_80AC240(s16); +extern s32 sub_80AD158(s16); + +s32 sub_809D52C(void *a0) +{ + s16 *ptr = a0; + + switch (ptr[0]) + { + case 0: return 0; + case 1: return sub_80A882C(ptr[1]); + case 2: return sub_80AC240(ptr[1]); + case 3: return sub_80AD158(ptr[1]); + } + return 0; +} + +void sub_809D568(GroundScript_ExecutePP_1_sub_not_packed *a0) +{ + s32 i; + + a0->scriptType = -1; + a0->unk2 = 0; + a0->scriptPointer2 = 0; + a0->scriptPointer1 = 0; + a0->unk14 = 0; + a0->unk10 = 0; + a0->unk20 = 0; + a0->unk1C = 0; + a0->unk22 = -1; + a0->unk24 = 0; + a0->unk26 = 0xFF; + a0->unk28 = 0; + a0->unk2A = 0; + a0->unk2C = 0; + a0->unk30 = 0; + for (i = 0; i < 4; i++) { + a0->unk5C[i] = 0; + } +} + +void sub_809D5B8(GroundScript_ExecutePP_1 *a0) +{ + s32 i; + + a0->unk0 = 0; + a0->unk4 = 0; + a0->unk10 = -1; + a0->unk12 = 0xFF; + sub_809D520(&a0->unkC); + + for (i = 0; i < 4; i++) { + a0->unk14[i] = 0; + } + + sub_809D568((void *) &a0->unk24); // Casting to void* because packed/not packed + sub_809D568((void *) &a0->unk84); // Casting to void* because packed/not packed +}