Match few funcs of overlay_30

Thanks to @taxicat for matching ov30_02382874
This commit is contained in:
Seth Barberee
2026-08-19 08:51:31 -07:00
parent 8588664e24
commit fcc7009d8b
4 changed files with 106 additions and 146 deletions

View File

@@ -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}

10
include/overlay_30.h Normal file
View File

@@ -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

View File

@@ -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

95
src/overlay_30_init.c Normal file
View File

@@ -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;
}
}