decomp sub_14488, sub_14740 (#137)
Some checks are pending
CI / build (push) Waiting to run

* decomp sub_14488

* decomp sub_14AF4

* small cleanup

---------

Co-authored-by: Marcus Huderle <huderlem@gmail.com>
This commit is contained in:
Retnuhytnuob 2025-07-23 09:23:06 -05:00 committed by GitHub
parent 2d144060c8
commit ffcc92878d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 161 additions and 356 deletions

View File

@ -6,356 +6,6 @@
.text
thumb_func_start sub_14488
sub_14488: @ 0x08014488
push {r4, r5, r6, r7, lr}
mov r7, sl
mov r6, sb
mov r5, r8
push {r5, r6, r7}
sub sp, #0x10
adds r7, r0, #0
adds r4, r1, #0
ldr r1, _08014510 @ =0xFFFF0000
mov r0, r8
ands r0, r1
mov r8, r0
movs r0, #1
mov r2, r8
orrs r2, r0
mov r8, r2
ldr r2, _08014514 @ =0x0000FFFF
mov r3, r8
ands r3, r2
movs r0, #0x80
lsls r0, r0, #9
orrs r3, r0
mov r8, r3
lsls r0, r4, #0x10
cmp r0, #0
bge _080144CA
orrs r3, r2
mov r8, r3
rsbs r0, r4, #0
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ands r4, r1
orrs r4, r0
_080144CA:
asrs r0, r4, #0x10
cmp r0, #0
bge _080144DE
mov r3, r8
orrs r3, r1
mov r8, r3
rsbs r0, r0, #0
lsls r0, r0, #0x10
ands r4, r2
orrs r4, r0
_080144DE:
lsls r0, r4, #0x10
asrs r0, r0, #0x10
asrs r1, r4, #0x10
movs r2, #1
str r2, [sp, #8]
cmp r0, r1
ble _080144F0
movs r3, #0
str r3, [sp, #8]
_080144F0:
ldr r2, _08014518 @ =gCurrentPinballGame
ldr r0, [r2]
adds r0, #0x22
movs r1, #0
strb r1, [r0]
ldr r0, [r2]
adds r0, #0x23
strb r1, [r0]
ldr r1, _0801451C @ =gUnknown_086ACE0C
ldr r0, _08014520 @ =gMain
ldrb r0, [r0, #4]
lsls r0, r0, #2
adds r0, r0, r1
ldr r0, [r0]
str r0, [sp, #0xc]
b _080145CC
.align 2, 0
_08014510: .4byte 0xFFFF0000
_08014514: .4byte 0x0000FFFF
_08014518: .4byte gCurrentPinballGame
_0801451C: .4byte gUnknown_086ACE0C
_08014520: .4byte gMain
_08014524:
ldrh r0, [r5]
strh r0, [r7]
ldrh r0, [r5, #2]
strh r0, [r7, #2]
mov r1, sp
mov r2, sb
ldrh r0, [r2]
strh r0, [r1]
b _0801456E
_08014536:
ldr r5, _080145A0 @ =gCurrentPinballGame
ldr r0, [r5]
adds r0, #0x22
strb r1, [r0]
adds r0, r7, #0
mov r1, sp
bl sub_1467C
lsls r0, r0, #0x10
cmp r0, #0
beq _0801454E
b _08014668
_0801454E:
ldr r0, [r5]
ldr r3, _080145A4 @ =0x000005F2
adds r0, r0, r3
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
cmp r0, #0
beq _0801456E
adds r0, r7, #0
mov r1, sp
bl sub_14740
lsls r0, r0, #0x10
cmp r0, #0
beq _0801456E
b _08014668
_0801456E:
lsls r0, r4, #0x10
cmp r0, #0
bgt _0801457A
asrs r0, r4, #0x10
cmp r0, #0
ble _08014668
_0801457A:
ldr r0, [sp, #8]
cmp r0, #0
bne _080145AC
ldrh r0, [r7]
add r0, r8
strh r0, [r7]
subs r1, r4, #1
lsls r1, r1, #0x10
lsrs r1, r1, #0x10
ldr r0, _080145A8 @ =0xFFFF0000
ands r4, r0
orrs r4, r1
asrs r0, r4, #0x10
cmp r0, #0
ble _080145CC
movs r1, #1
str r1, [sp, #8]
b _080145CC
.align 2, 0
_080145A0: .4byte gCurrentPinballGame
_080145A4: .4byte 0x000005F2
_080145A8: .4byte 0xFFFF0000
_080145AC:
mov r2, r8
asrs r0, r2, #0x10
ldrh r3, [r7, #2]
adds r0, r0, r3
strh r0, [r7, #2]
asrs r1, r4, #0x10
subs r1, #1
lsls r1, r1, #0x10
ldr r0, _08014658 @ =0x0000FFFF
ands r4, r0
orrs r4, r1
lsls r0, r4, #0x10
cmp r0, #0
ble _080145CC
movs r0, #0
str r0, [sp, #8]
_080145CC:
adds r0, r7, #0
mov r1, sp
ldr r2, [sp, #0xc]
bl _call_via_r2
lsls r0, r0, #0x10
asrs r1, r0, #0x10
cmp r1, #0
beq _08014536
ldr r0, _0801465C @ =gCurrentPinballGame
ldr r1, [r0]
adds r0, r1, #0
adds r0, #0x22
ldrb r0, [r0]
lsls r0, r0, #0x18
asrs r0, r0, #0x18
cmp r0, #1
bne _08014668
adds r0, r1, #0
adds r0, #0x23
ldrb r0, [r0]
cmp r0, #3
bne _0801456E
movs r6, #0
add r5, sp, #4
movs r3, #2
add r3, sp
mov sb, r3
ldr r0, _08014658 @ =0x0000FFFF
mov sl, r0
_08014608:
ldr r0, _08014660 @ =gUnknown_086ACE60
lsls r3, r6, #2
adds r3, r3, r0
ldrh r1, [r3]
ldrh r2, [r7]
adds r1, r1, r2
lsls r1, r1, #0x10
lsrs r1, r1, #0x10
ldr r2, _08014664 @ =0xFFFF0000
ldr r0, [sp, #4]
ands r0, r2
orrs r0, r1
str r0, [sp, #4]
ldrh r1, [r3, #2]
ldrh r3, [r7, #2]
adds r1, r1, r3
lsls r1, r1, #0x10
mov r2, sl
ands r0, r2
orrs r0, r1
str r0, [sp, #4]
adds r0, r5, #0
mov r1, sb
ldr r3, [sp, #0xc]
bl _call_via_r3
ldr r0, _0801465C @ =gCurrentPinballGame
ldr r0, [r0]
ldrh r1, [r0, #0x22]
mov r0, sl
ands r0, r1
cmp r0, #1
bne _0801464C
b _08014524
_0801464C:
adds r0, r6, #1
lsls r0, r0, #0x10
lsrs r6, r0, #0x10
cmp r6, #3
bls _08014608
b _0801456E
.align 2, 0
_08014658: .4byte 0x0000FFFF
_0801465C: .4byte gCurrentPinballGame
_08014660: .4byte gUnknown_086ACE60
_08014664: .4byte 0xFFFF0000
_08014668:
mov r0, sp
ldrh r0, [r0]
add sp, #0x10
pop {r3, r4, r5}
mov r8, r3
mov sb, r4
mov sl, r5
pop {r4, r5, r6, r7}
pop {r1}
bx r1
thumb_func_start sub_1467C
sub_1467C: @ 0x0801467C
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
mov r8, r1
movs r7, #0
ldr r4, _08014734 @ =gUnknown_02031520
movs r1, #0x22
ldrsh r2, [r4, r1]
lsls r2, r2, #1
ldrh r3, [r0]
subs r2, r3, r2
lsls r2, r2, #0x10
mov ip, r2
movs r2, #0x24
ldrsh r1, [r4, r2]
lsls r1, r1, #1
subs r3, r3, r1
lsls r3, r3, #0x10
movs r2, #0x20
ldrsh r1, [r4, r2]
lsls r1, r1, #1
ldrh r0, [r0, #2]
subs r0, r0, r1
lsls r0, r0, #0x10
mov r1, ip
lsrs r6, r1, #0x10
orrs r6, r0
lsrs r1, r0, #0x10
lsrs r5, r3, #0x10
orrs r5, r0
cmp r1, #0x5f
bhi _08014724
lsls r0, r6, #0x10
lsrs r0, r0, #0x10
cmp r0, #0x5f
bhi _080146E8
ldr r4, _08014738 @ =gCurrentPinballGame
ldr r0, [r4]
ldrb r1, [r0, #0x1e]
adds r1, #1
adds r0, r6, #0
mov r2, r8
movs r3, #0
bl sub_14AF4
lsls r0, r0, #0x10
cmp r0, #0
beq _080146E8
ldr r0, [r4]
adds r0, #0x22
movs r1, #3
strb r1, [r0]
movs r7, #1
_080146E8:
cmp r7, #0
bne _08014724
lsls r0, r5, #0x10
lsrs r0, r0, #0x10
cmp r0, #0x5f
bhi _08014724
movs r0, #0x5f
subs r0, r0, r5
lsls r0, r0, #0x10
lsrs r0, r0, #0x10
ldr r1, _0801473C @ =0xFFFF0000
ands r5, r1
orrs r5, r0
ldr r4, _08014738 @ =gCurrentPinballGame
ldr r0, [r4]
ldrb r1, [r0, #0x1e]
adds r1, #1
adds r0, r5, #0
mov r2, r8
movs r3, #1
bl sub_14AF4
lsls r0, r0, #0x10
cmp r0, #0
beq _08014724
ldr r0, [r4]
adds r0, #0x22
movs r1, #4
strb r1, [r0]
movs r7, #1
_08014724:
adds r0, r7, #0
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7}
pop {r1}
bx r1
.align 2, 0
_08014734: .4byte gUnknown_02031520
_08014738: .4byte gCurrentPinballGame
_0801473C: .4byte 0xFFFF0000
thumb_func_start sub_14740
sub_14740: @ 0x08014740
push {r4, r5, r6, r7, lr}

Binary file not shown.

Binary file not shown.

View File

@ -380,10 +380,10 @@ extern void sub_13B28(struct Vector16*, struct Vector16*, s16);
extern void sub_13D24(u16, struct Vector16*, struct Vector16*);
extern void sub_14074(u16, struct Vector32*, u16);
extern u16 sub_14488(struct Vector16*, struct Vector16);
//extern ? sub_1467C();
//extern ? sub_14740();
extern u16 sub_1467C(struct Vector16*, u16*);
extern u16 sub_14740(struct Vector16*, u16*);
extern void sub_1493C(void);
//extern ? sub_14AF4();
extern u16 sub_14AF4(struct Vector16 r0, s16 r1, s16 *r2 /* s16 or u16 */, s16 r3);
//extern ? sub_14B84();
//extern ? sub_14E08();
//extern ? sub_15054();

View File

@ -442,7 +442,7 @@ struct PinballGame
/*0x5B2*/ u8 unk5B2;
/*0x5B3*/ u8 filler5B3[0x3D];
/*0x5F0*/ u16 caughtMonCount; // Number of mons caught in this game
/*0x5F2*/ u8 filler5F2[0x1];
/*0x5F2*/ s8 unk5F2;
/*0x5F3*/ s8 unk5F3;
/*0x5F4*/ u8 filler5F4[0x2];
/*0x5F6*/ s8 unk5F6;
@ -655,5 +655,9 @@ extern u16 gUnknown_084EDACC[];
extern u16 gUnknown_08494E4C[];
extern u8 gUnknown_084FF30C[];
typedef s16 (*Unk86ACE0C)(struct Vector16*, u16*);
extern Unk86ACE0C gUnknown_086ACE0C[8];
extern struct Vector16 gUnknown_086ACE60[4];
#endif // GUARD_GLOBAL_H

View File

@ -7,7 +7,7 @@ void sub_13D24(u16,struct Vector16*, struct Vector16*);
void sub_13934(struct Vector16 *arg0, struct Vector16 *arg1, u16 angle);
void sub_1493C(void);
u16 sub_14488(struct Vector16*, struct Vector16);
u16 sub_14AF4(struct Vector16 r0, s16 r1, s16 *r2 /* s16 or u16 */, s16 r3);
void sub_14B84(u32 r0, s16 r1, struct Vector16 *r2, u16 r3);
void sub_1332C()

View File

@ -269,4 +269,155 @@ void sub_14074(u16 arg0, struct Vector32 *arg1, u16 arg2)
arg1->x = vMagSquared * Cos(angle) / VECTORSCALEDOWN;
arg1->y = -vMagSquared * Sin(angle) / VECTORSCALEDOWN;
}
}
}
// TODO: Hopefully we can match this properly without "goto" usage in the future...
u16 sub_14488(struct Vector16* arg0, struct Vector16 arg1) {
struct Vector16 r8;
u32 toggleShiftMode;
s16 (*spC)(struct Vector16*, u16*);
u16 sp0_return;
r8.x =1;
r8.y =1;
if (arg1.x < 0)
{
r8.x = -1;
arg1.x = -arg1.x;
}
if (arg1.y < 0)
{
r8.y = -1;
arg1.y = -arg1.y ;
}
if (arg1.x > arg1.y)
toggleShiftMode = 0;
else
toggleShiftMode = 1;
gCurrentPinballGame->unk22 = 0;
gCurrentPinballGame->unk23 = 0;
spC = gUnknown_086ACE0C[gMain.selectedField];
do{
goto Lab_144;
Lab_AE:
{
gCurrentPinballGame->unk22 = 0;
if (sub_1467C(arg0, &sp0_return) != 0 ||
(gCurrentPinballGame->unk5F2 != 0 && sub_14740(arg0, &sp0_return) != 0))
goto Lab_1E0;
goto Lab_E6;
}
Lab_E6:
{
if (!(arg1.x > 0 || arg1.y > 0))
goto Lab_1E0;
if (toggleShiftMode == 0)
{
arg0->x = r8.x + arg0->x;
arg1.x--;
if (arg1.y >0)
toggleShiftMode = 1;
}
else
{
arg0->y = arg0->y + r8.y;
arg1.y--;
if (arg1.x > 0)
toggleShiftMode = 0;
}
}
Lab_144:
{
if(spC(arg0, &sp0_return) == 0)
{
goto Lab_AE;
}
else if (gCurrentPinballGame->unk22 == 1)
{
if (gCurrentPinballGame->unk23 == 3)
{
u16 j;
u16 sp2_testRes;
struct Vector16 sp4_testPos;
for(j=0; j < 4; j++)
{
sp4_testPos.x = arg0->x + gUnknown_086ACE60[j].x;
sp4_testPos.y = arg0->y + gUnknown_086ACE60[j].y;
spC(&sp4_testPos, &sp2_testRes);
if (gCurrentPinballGame->unk22 == 1 && gCurrentPinballGame->unk23 == 0)
{
Lab_9C:
arg0->x = sp4_testPos.x;
arg0->y = sp4_testPos.y;
sp0_return = sp2_testRes;
break;
}
}
}
goto Lab_E6;
}
else {
break;
}
}
} while(1);
Lab_1E0:
return sp0_return;
}
u16 sub_1467C(struct Vector16* arg0, u16* arg1)
{
u16 res;
struct Vector16 vec1;
struct Vector16 vec2;
res = 0;
vec1.x = arg0->x - gUnknown_02031520.unk14.unk22 * 2;
vec2.x = arg0->x - gUnknown_02031520.unk14.unk24 * 2;
vec1.y = arg0->y - gUnknown_02031520.unk14.unk20 * 2;
vec2.y = vec1.y;
if (vec1.y <= 95 && vec1.y >= 0)
{
if (vec1.x <= 95 && vec1.x >= 0)
{
if(sub_14AF4(vec1, gCurrentPinballGame->unk1E + 1, arg1, 0))
{
gCurrentPinballGame->unk22 = 3;
res = 1;
}
}
if (res == 0)
{
if (vec2.x <= 95 && vec2.x >= 0)
{
vec2.x = 95 - vec2.x;
if (sub_14AF4(vec2, gCurrentPinballGame->unk1E + 1, arg1, 1))
{
gCurrentPinballGame->unk22 = 4;
res = 1;
}
}
}
}
return res;
}