From fcc7009d8b2ae4e71af6ce391522b0baf4bd86d5 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Wed, 19 Aug 2026 08:51:31 -0700 Subject: [PATCH] Match few funcs of overlay_30 Thanks to @taxicat for matching ov30_02382874 --- asm/overlay_30.s | 146 ------------------------------------------ include/overlay_30.h | 10 +++ main.lsf | 1 + src/overlay_30_init.c | 95 +++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 146 deletions(-) create mode 100644 include/overlay_30.h create mode 100644 src/overlay_30_init.c diff --git a/asm/overlay_30.s b/asm/overlay_30.s index 20820f59..3e37cdb4 100644 --- a/asm/overlay_30.s +++ b/asm/overlay_30.s @@ -3,152 +3,6 @@ .text - arm_func_start ov30_02382820 -ov30_02382820: ; 0x02382820 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r0, #0x10 - mov r1, #5 - mov r4, r2 - bl MemAlloc - ldr r1, _02382870 ; =ov30_023860A0 - mov r2, #0 - str r0, [r1] - str r6, [r0, #4] - ldr r0, [r1] - str r5, [r0, #8] - ldr r0, [r1] - strb r2, [r0, #0xc] - ldr r0, [r1] - strb r4, [r0, #0xd] - ldr r0, [r1] - str r2, [r0] - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_02382870: .word ov30_023860A0 - arm_func_end ov30_02382820 - - arm_func_start ov30_02382874 -ov30_02382874: ; 0x02382874 - stmdb sp!, {r3, lr} - ldr r0, _02382974 ; =ov30_023860A0 - ldr r1, [r0] - ldr r0, [r1] - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _0238296C -_02382890: ; jump table - b _023828A0 ; case 0 - b _02382948 ; case 1 - b _0238296C ; case 2 - b _02382964 ; case 3 -_023828A0: - ldmib r1, {r0, r1} - bl ReadQuickSaveInfo - cmp r0, #0 - bne _023828D4 - ldr r2, _02382974 ; =ov30_023860A0 - ldr r1, _02382978 ; =0x21061522 - ldr r3, [r2] - ldr r2, [r3, #8] - ldr r3, [r3, #4] - sub r2, r2, #4 - ldr r2, [r3, r2] - cmp r2, r1 - movne r0, #4 -_023828D4: - cmp r0, #0 - bne _023828FC - ldr r0, _02382974 ; =ov30_023860A0 - mov r3, #1 - ldr r2, [r0] - mov r1, #3 - strb r3, [r2, #0xc] - ldr r0, [r0] - str r1, [r0] - b _0238296C -_023828FC: - cmp r0, #1 - mov r2, #0 - bne _02382928 - ldr r0, _0238297C ; =0x0000040C -#ifdef JAPAN - add r1, r0, #0xcc -#else - ldr r1, _02382980 ; =0x00000247 -#endif - bl sub_02034EB4 - ldr r0, _02382974 ; =ov30_023860A0 - mov r1, #2 - ldr r0, [r0] - str r1, [r0] - b _0238296C -_02382928: - ldr r0, _02382984 ; =0x0000061C - ldr r1, _02382988 ; =0x0000024D - bl sub_02034EB4 - ldr r0, _02382974 ; =ov30_023860A0 - mov r1, #1 - ldr r0, [r0] - str r1, [r0] - b _0238296C -_02382948: - bl sub_02034DA8 - cmp r0, #0 - ldreq r0, _02382974 ; =ov30_023860A0 - moveq r1, #3 - ldreq r0, [r0] - streq r1, [r0] - b _0238296C -_02382964: - mov r0, #0 - ldmia sp!, {r3, pc} -_0238296C: - mov r0, #1 - ldmia sp!, {r3, pc} - .align 2, 0 -_02382974: .word ov30_023860A0 -#ifdef JAPAN -_02382978: .word 0x20111122 -_0238297C: .word 0x0000040C -_02382984: .word 0x0000061C -_02382988: .word 0x000004DE -#else -_02382978: .word 0x21061522 -_0238297C: .word 0x0000040C -_02382980: .word 0x00000247 -_02382984: .word 0x0000061C -_02382988: .word 0x0000024D -#endif - arm_func_end ov30_02382874 - - arm_func_start ov30_0238298C -ov30_0238298C: ; 0x0238298C - ldr r0, _0238299C ; =ov30_023860A0 - ldr r0, [r0] - ldrb r0, [r0, #0xc] - bx lr - .align 2, 0 -_0238299C: .word ov30_023860A0 - arm_func_end ov30_0238298C - - arm_func_start ov30_023829A0 -ov30_023829A0: ; 0x023829A0 - stmdb sp!, {r3, lr} - ldr r0, _023829C8 ; =ov30_023860A0 - ldr r0, [r0] - cmp r0, #0 - ldmeqia sp!, {r3, pc} - bl MemFree - ldr r0, _023829C8 ; =ov30_023860A0 - mov r1, #0 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_023829C8: .word ov30_023860A0 - arm_func_end ov30_023829A0 - arm_func_start ov30_023829CC ov30_023829CC: ; 0x023829CC stmdb sp!, {r4, r5, r6, lr} diff --git a/include/overlay_30.h b/include/overlay_30.h new file mode 100644 index 00000000..47cec58f --- /dev/null +++ b/include/overlay_30.h @@ -0,0 +1,10 @@ +#ifndef PMD_SKY_OVERLAY_30_H +#define PMD_SKY_OVERLAY_30_H + +void ov30_02382820(s32 arg0, s32 arg1, s32 isGameModeRescue); +s32 ov30_02382874(void); +u8 ov30_0238298C(void); +void ov30_023829A0(void); + + +#endif // PMD_SKY_OVERLAY_30_H diff --git a/main.lsf b/main.lsf index 112bc170..8cc52435 100644 --- a/main.lsf +++ b/main.lsf @@ -1294,6 +1294,7 @@ Overlay OVY_29 Overlay OVY_30 { After OVY_29 + Object src/overlay_30_init.o Object asm/overlay_30.o } Overlay OVY_31 diff --git a/src/overlay_30_init.c b/src/overlay_30_init.c new file mode 100644 index 00000000..7fd7153e --- /dev/null +++ b/src/overlay_30_init.c @@ -0,0 +1,95 @@ +#include "overlay_30.h" + + +struct Overlay30Main { + s32 state; + s32 unk4; + s32 unk8; + u8 unkC; + s8 isGameModeRescue; // GAME_MODE_RESCUE +}; + +extern struct Overlay30Main* ov30_023860A0; + +extern s32 ReadQuickSaveInfo(s32, s32); +extern s32 sub_02034DA8(); +extern void sub_02034EB4(s32, s32, s32); +extern void* MemAlloc(u32 len, u32 flags); +extern void MemFree(void *); + +#ifdef JAPAN + #define SAVE_CHECKSUM 0x20111122 +#else + #define SAVE_CHECKSUM 0x21061522 +#endif + +#define SAVE_VALID 1 +#define SAVE_INVALID_CHECKSUM 4 + +void ov30_02382820(s32 arg0, s32 arg1, s32 isGameModeRescue) +{ + + ov30_023860A0 = MemAlloc(sizeof(struct Overlay30Main), 5); + ov30_023860A0->unk4 = arg0; + ov30_023860A0->unk8 = arg1; + ov30_023860A0->unkC = 0; + ov30_023860A0->isGameModeRescue = isGameModeRescue; + ov30_023860A0->state = 0; +} + +s32 ov30_02382874(void) +{ + s32 saveStatus; + + switch (ov30_023860A0->state) { + default: + case 2: + break; + case 0: + saveStatus = ReadQuickSaveInfo(ov30_023860A0->unk4, ov30_023860A0->unk8); + if ((saveStatus == 0) && (*(u32*)(ov30_023860A0->unk4 + (ov30_023860A0->unk8 - 4)) != SAVE_CHECKSUM)) { + saveStatus = SAVE_INVALID_CHECKSUM; + } + if (saveStatus == 0) { + ov30_023860A0->unkC = 1; + ov30_023860A0->state = 3; + } else if (saveStatus == SAVE_VALID) { +#ifdef JAPAN + sub_02034EB4(0x40C, 0x4D8, 0); +#else + sub_02034EB4(0x40C, 0x247, 0); +#endif + ov30_023860A0->state = 2; + } else { +#ifdef JAPAN + sub_02034EB4(0x61C, 0x4DE, 0); +#else + sub_02034EB4(0x61C, 0x24D, 0); +#endif + ov30_023860A0->state = 1; + } + break; + case 1: + if (sub_02034DA8() == 0) { + ov30_023860A0->state = 3; + } + break; + case 3: + return 0; + } + return 1; +} + +u8 ov30_0238298C(void) +{ + return ov30_023860A0->unkC; +} + +void ov30_023829A0(void) +{ + if(ov30_023860A0 != NULL) + { + MemFree(ov30_023860A0); + ov30_023860A0 = NULL; + } +}