Decompile sub_19048, IdlePinballGameMain, sub_19190, sub_19288 and sub_19304 (#114)

* decompile IdlePinballGameMain
documented gMain.subState
Broken state due to gIdlePinballGameStateFuncs definition

* Fixed definition of gIdlePinballGameStateFuncs

* Decimpile sub_19048

* Decomp sub_19190

* Fixed the io_reg macro name for joystick without LR as an input check.

* used proper macro's for field checks

* Decompile sub_19288 and sub_19304

* cleanup

---------

Co-authored-by: Marcus Huderle <huderlem@gmail.com>
This commit is contained in:
Smileynator 2025-06-19 17:17:05 +02:00 committed by GitHub
parent a18ce7ed26
commit 1c0a9314f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 186 additions and 387 deletions

View File

@ -9523,378 +9523,7 @@ _08018778: .4byte 0x000004B4
_0801877C: .4byte 0x000004B6
_08018780: .4byte 0x000004A4
.section .text19028
thumb_func_start IdlePinballGameMain
IdlePinballGameMain: @ 0x08019028
push {lr}
ldr r1, _08019040 @ =gIdlePinballGameStateFuncs
ldr r0, _08019044 @ =gMain
ldrb r0, [r0, #3]
lsls r0, r0, #2
adds r0, r0, r1
ldr r0, [r0]
bl _call_via_r0
pop {r0}
bx r0
.align 2, 0
_08019040: .4byte gIdlePinballGameStateFuncs
_08019044: .4byte gMain
thumb_func_start sub_19048
sub_19048: @ 0x08019048
push {r4, r5, lr}
ldr r1, _080190A4 @ =gMain
movs r2, #0
str r2, [r1, #0x54]
movs r0, #1
strb r0, [r1, #0xd]
ldr r0, _080190A8 @ =gUnknown_02031510
str r2, [r0]
adds r5, r1, #0
ldr r4, _080190AC @ =gUnknown_02031520
adds r3, r5, #7
_0801905E:
lsls r0, r2, #0x10
asrs r0, r0, #0x10
adds r2, r0, r4
adds r1, r0, r3
ldrb r1, [r1]
strb r1, [r2]
adds r0, #1
lsls r0, r0, #0x10
lsrs r2, r0, #0x10
asrs r0, r0, #0x10
cmp r0, #4
ble _0801905E
adds r4, r5, #0
ldrh r0, [r4, #0x30]
cmp r0, #0
bne _0801908E
bl Random
ldr r1, [r4, #0x4c]
adds r0, r0, r1
movs r1, #0x1e
bl __umodsi3
strh r0, [r4, #0x30]
_0801908E:
ldrh r4, [r5, #0x30]
movs r0, #3
ands r4, r0
adds r0, r4, #0
cmp r0, #1
beq _080190D8
cmp r0, #1
bgt _080190B0
cmp r0, #0
beq _080190BA
b _0801911E
.align 2, 0
_080190A4: .4byte gMain
_080190A8: .4byte gUnknown_02031510
_080190AC: .4byte gUnknown_02031520
_080190B0:
cmp r0, #2
beq _080190F4
cmp r0, #3
beq _08019110
b _0801911E
_080190BA:
ldr r1, _080190C8 @ =gUnknown_02031520
ldr r0, _080190CC @ =0x00000A14
strh r0, [r1, #6]
ldr r0, _080190D0 @ =gUnknown_081450F4
str r0, [r1, #0x10]
ldr r0, _080190D4 @ =gUnknown_081531F4
b _0801911C
.align 2, 0
_080190C8: .4byte gUnknown_02031520
_080190CC: .4byte 0x00000A14
_080190D0: .4byte gUnknown_081450F4
_080190D4: .4byte gUnknown_081531F4
_080190D8:
ldr r1, _080190E8 @ =gUnknown_02031520
movs r0, #0xf0
lsls r0, r0, #4
strh r0, [r1, #6]
ldr r0, _080190EC @ =gUnknown_0814F9B4
str r0, [r1, #0x10]
ldr r0, _080190F0 @ =gUnknown_08156E60
b _0801911C
.align 2, 0
_080190E8: .4byte gUnknown_02031520
_080190EC: .4byte gUnknown_0814F9B4
_080190F0: .4byte gUnknown_08156E60
_080190F4:
ldr r1, _08019104 @ =gUnknown_02031520
movs r0, #0xd2
lsls r0, r0, #4
strh r0, [r1, #6]
ldr r0, _08019108 @ =gUnknown_08148934
str r0, [r1, #0x10]
ldr r0, _0801910C @ =gUnknown_08154618
b _0801911C
.align 2, 0
_08019104: .4byte gUnknown_02031520
_08019108: .4byte gUnknown_08148934
_0801910C: .4byte gUnknown_08154618
_08019110:
ldr r1, _08019134 @ =gUnknown_02031520
ldr r0, _08019138 @ =0x00000E4C
strh r0, [r1, #6]
ldr r0, _0801913C @ =gUnknown_0814C174
str r0, [r1, #0x10]
ldr r0, _08019140 @ =gUnknown_08155A3C
_0801911C:
str r0, [r1, #0xc]
_0801911E:
bl sub_49ED4
adds r1, r4, #0
cmp r1, #1
beq _0801914E
cmp r1, #1
bgt _08019144
cmp r1, #0
beq _08019156
b _08019164
.align 2, 0
_08019134: .4byte gUnknown_02031520
_08019138: .4byte 0x00000E4C
_0801913C: .4byte gUnknown_0814C174
_08019140: .4byte gUnknown_08155A3C
_08019144:
cmp r1, #2
beq _08019156
cmp r1, #3
beq _0801915E
b _08019164
_0801914E:
movs r0, MUS_FIELD_SAPPHIRE
bl m4aSongNumStart
b _08019164
_08019156:
movs r0, MUS_FIELD_RUBY
bl m4aSongNumStart
b _08019164
_0801915E:
movs r0, MUS_FIELD_SAPPHIRE
bl m4aSongNumStart
_08019164:
ldr r3, _08019188 @ =gUnknown_02031520
ldr r1, _0801918C @ =gMain+0x74
movs r0, #0xcd
adds r0, r0, r1
mov ip, r0
ldrb r0, [r0]
movs r2, #0
strb r0, [r3, #5]
mov r0, ip
strb r2, [r0]
subs r1, #0x74
ldrh r0, [r1, #0x30]
adds r0, #1
strh r0, [r1, #0x30]
pop {r4, r5}
pop {r0}
bx r0
.align 2, 0
_08019188: .4byte gUnknown_02031520
_0801918C: .4byte gMain+0x74
thumb_func_start sub_19190
sub_19190: @ 0x08019190
push {r4, r5, lr}
ldr r0, _080191A8 @ =gCurrentPinballGame
ldr r2, [r0]
ldrb r1, [r2, #0x1d]
cmp r1, #1
beq _080191C0
cmp r1, #1
bgt _080191AC
cmp r1, #0
beq _080191B2
b _0801927C
.align 2, 0
_080191A8: .4byte gCurrentPinballGame
_080191AC:
cmp r1, #2
beq _08019274
b _0801927C
_080191B2:
movs r0, #1
strb r0, [r2, #0x1d]
ldr r0, _080191BC @ =gMain
strb r1, [r0, #0xe]
b _0801927C
.align 2, 0
_080191BC: .4byte gMain
_080191C0:
ldr r0, _080191D0 @ =gMain
ldrb r0, [r0, #4]
cmp r0, #1
bhi _080191D4
bl sub_4ACF0
b _080191D8
.align 2, 0
_080191D0: .4byte gMain
_080191D4:
bl sub_4B000
_080191D8:
ldr r3, _08019214 @ =gMain
ldr r0, [r3, #0x54]
ldr r1, _08019218 @ =gUnknown_02031520
movs r4, #6
ldrsh r2, [r1, r4]
adds r1, r0, #0
adds r0, #1
str r0, [r3, #0x54]
cmp r1, r2
bls _080191F0
movs r0, #1
strb r0, [r3, #0xe]
_080191F0:
ldrb r0, [r3, #0x1c]
cmp r0, #0
beq _080191FA
movs r0, #1
strb r0, [r3, #0xe]
_080191FA:
ldrb r0, [r3, #0xe]
cmp r0, #0
beq _0801927C
ldrb r0, [r3, #4]
cmp r0, #1
bhi _0801921C
bl sub_1D4D0
movs r0, #0
bl sub_31BE8
b _08019224
.align 2, 0
_08019214: .4byte gMain
_08019218: .4byte gUnknown_02031520
_0801921C:
cmp r0, #3
bne _08019224
bl sub_356A0
_08019224:
ldr r4, _0801925C @ =gMain
ldrb r1, [r4, #0xf]
movs r3, #2
adds r0, r3, #0
ands r0, r1
ldr r2, _08019260 @ =gCurrentPinballGame
cmp r0, #0
beq _08019248
ldr r1, _08019264 @ =0x040000D4
ldr r0, [r2]
ldr r5, _08019268 @ =0x0000111A
adds r0, r0, r5
str r0, [r1]
ldr r0, _0801926C @ =0x05000200
str r0, [r1, #4]
ldr r0, _08019270 @ =0x80000100
str r0, [r1, #8]
ldr r0, [r1, #8]
_08019248:
ldr r0, [r2]
strb r3, [r0, #0x1d]
ldrb r0, [r4, #0xe]
cmp r0, #2
bne _0801927C
movs r0, #1
bl sub_4B408
b _0801927C
.align 2, 0
_0801925C: .4byte gMain
_08019260: .4byte gCurrentPinballGame
_08019264: .4byte 0x040000D4
_08019268: .4byte 0x0000111A
_0801926C: .4byte 0x05000200
_08019270: .4byte 0x80000100
_08019274:
ldr r1, _08019284 @ =gMain
ldrb r0, [r1, #3]
adds r0, #1
strb r0, [r1, #3]
_0801927C:
pop {r4, r5}
pop {r0}
bx r0
.align 2, 0
_08019284: .4byte gMain
thumb_func_start sub_19288
sub_19288: @ 0x08019288
push {r4, r5, lr}
ldr r1, _080192E0 @ =gMain
adds r2, r1, #0
adds r2, #0x36
movs r0, #0
strb r0, [r2]
ldr r2, _080192E4 @ =gUnknown_02031520
ldrb r0, [r2, #5]
ldr r4, _080192E8 @ =0x00000141
adds r3, r1, r4
strb r0, [r3]
movs r3, #0
adds r5, r1, #7
adds r4, r2, #0
_080192A4:
lsls r0, r3, #0x10
asrs r0, r0, #0x10
adds r2, r0, r5
adds r1, r0, r4
ldrb r1, [r1]
strb r1, [r2]
adds r0, #1
lsls r0, r0, #0x10
lsrs r3, r0, #0x10
asrs r0, r0, #0x10
cmp r0, #4
ble _080192A4
bl sub_02B4
bl m4aMPlayAllStop
bl sub_0D10
ldr r2, _080192E0 @ =gMain
ldr r0, _080192E4 @ =gUnknown_02031520
movs r3, #6
ldrsh r1, [r0, r3]
ldr r0, [r2, #0x54]
cmp r0, r1
bhs _080192EC
movs r0, STATE_TITLE
bl SetMainGameState
b _080192F2
.align 2, 0
_080192E0: .4byte gMain
_080192E4: .4byte gUnknown_02031520
_080192E8: .4byte 0x00000141
_080192EC:
movs r0, STATE_SCORES_IDLE
bl SetMainGameState
_080192F2:
ldr r1, _08019300 @ =gMain
movs r0, #0
str r0, [r1, #0x54]
pop {r4, r5}
pop {r0}
bx r0
.align 2, 0
_08019300: .4byte gMain
thumb_func_start sub_19304
sub_19304: @ 0x08019304
push {lr}
ldr r0, _08019318 @ =gMain
ldrb r0, [r0, #4]
cmp r0, #1
bls _08019312
bl sub_19734
_08019312:
pop {r0}
bx r0
.align 2, 0
_08019318: .4byte gMain
.section .text1931C
thumb_func_start sub_1931C
sub_1931C: @ 0x0801931C

View File

@ -4,11 +4,12 @@
#define FIELD_RUBY 0
#define FIELD_SAPPHIRE 1
#define MAIN_FIELD_COUNT 2
#define FIELD_DUSCLOPS (MAIN_FIELD_COUNT + 0)
#define FIELD_KECLEON (MAIN_FIELD_COUNT + 1)
#define FIELD_KYOGRE (MAIN_FIELD_COUNT + 2)
#define FIELD_GROUDON (MAIN_FIELD_COUNT + 3)
#define FIELD_RAYQUAZA (MAIN_FIELD_COUNT + 4)
#define FIELD_SPHEAL (MAIN_FIELD_COUNT + 5)
#define FIELD_BONUS_START 2
#define FIELD_DUSCLOPS (FIELD_BONUS_START + 0)
#define FIELD_KECLEON (FIELD_BONUS_START + 1)
#define FIELD_KYOGRE (FIELD_BONUS_START + 2)
#define FIELD_GROUDON (FIELD_BONUS_START + 3)
#define FIELD_RAYQUAZA (FIELD_BONUS_START + 4)
#define FIELD_SPHEAL (FIELD_BONUS_START + 5)
#endif // GUARD_CONSTANTS_FIELDS_H

View File

@ -409,15 +409,16 @@ extern void sub_18AE0(u8, u16*, u16*);
extern s16 sub_18B50(struct Vector16*, u16*);
extern void sub_18DAC(struct Vector16*, u16*, u8*);
extern void sub_18F38(u8, u16*, u16*);
//extern ? IdlePinballGameMain();
//extern ? sub_19048();
//extern ? sub_19190();
//extern ? sub_19288();
extern void IdlePinballGameMain();
extern void sub_19048();//gMain.subState = 0
extern void sub_19190();//gMain.subState = 1
extern void sub_4ABC8();//gMain.subState = 2
extern void sub_19288();//gMain.subState = 3
//extern ? sub_19304();
//extern ? sub_1931C();
//extern ? sub_19490();
//extern ? sub_195C4();
//extern ? sub_19734();
extern void sub_19734();
//extern ? sub_19894();
//extern ? sub_19A20();
//extern ? sub_19B10();
@ -447,6 +448,7 @@ extern void sub_1C5AC();
//extern ? sub_1C73C();
extern void sub_1C7F4(u16, u16);
extern void sub_1D128();
extern void sub_1D4D0();
//extern ? sub_1D5D8();
//extern ? sub_1DA74();
//extern ? sub_1DAD8();
@ -578,6 +580,7 @@ extern void sub_340EC();
extern void sub_34450();
extern void sub_350F0();
extern void sub_351A8();
extern void sub_356A0();
//extern ? sub_357B8();
//extern ? sub_35860();
//extern ? sub_35AA4();
@ -636,8 +639,12 @@ extern void sub_472E4();
//extern ? sub_497BC();
//extern ? sub_49850();
//extern ? sub_49A34();
extern void sub_4ACF0();
extern void sub_4B000();
extern void sub_4B408(s16);
//extern ? sub_4CEA8();
//extern ? sub_4CEB4();
extern void sub_49ED4(void);
//extern ? sub_4D3D0();
//extern ? sub_4D648();
//extern ? sub_4D6C4();

View File

@ -700,7 +700,8 @@
#define KEY_OR_INTR 0x0000
#define KEY_AND_INTR 0x8000
#define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN))
#define JOY_EXCL_DPAD 0x030F
#define JOY_EXCL_LR (KEYS_MASK & ~(R_BUTTON | L_BUTTON))
#define JOY_EXCL_DPAD (KEYS_MASK & ~(DPAD_ANY))
// interrupt flags
#define INTR_FLAG_VBLANK (1 << 0)

View File

@ -506,7 +506,9 @@ struct Unk02031520_unk10
struct Unk02031520
{
/*0x00*/ u8 filler0[0x8];
/*0x00*/ u8 eReaderBonuses[NUM_EREADER_CARDS];
/*0x05*/ bool8 rumbleEnabled;
/*0x06*/ s16 unk6;
/*0x08*/ s16 unk8;
/*0x0A*/ u8 fillerA[0x2];
/*0x0C*/ struct PinballGame *unkC;
@ -530,12 +532,21 @@ struct Unk02031590
};
extern struct PinballGame *gCurrentPinballGame;
extern const StateFunc gIdlePinballGameStateFuncs[];
extern u32 gUnknown_02031510;
extern struct Unk02031520 gUnknown_02031520;
extern struct Unk02031590 gUnknown_02031590;
extern u16 gUnknown_08137B3C[][6][16];
extern const u8 gUnknown_08137E14[][0x20];
extern const u8 gUnknown_08138834[0x2000];
extern struct Unk02031520_unk10 gUnknown_081450F4;
extern struct Unk02031520_unk10 gUnknown_08148934;
extern struct Unk02031520_unk10 gUnknown_0814C174;
extern struct Unk02031520_unk10 gUnknown_0814F9B4;
extern struct PinballGame gUnknown_081531F4;
extern struct PinballGame gUnknown_08154618;
extern struct PinballGame gUnknown_08155A3C;
extern struct PinballGame gUnknown_08156E60;
extern s32 gUnknown_081B36A4[64];
extern s32 gUnknown_082EE0E0[0x3E0];
extern const u16 gUnknown_08391A4C[0x1000];

View File

@ -74,7 +74,7 @@ struct Main
/*0x48*/ int rngValue;
/*0x4C*/ u32 systemFrameCount;
/*0x50*/ int fieldFrameCount;
/*0x54*/ u8 filler54[0x4];
/*0x54*/ u32 unk54;
/*0x58*/ u32 unk58;
/*0x5C*/ u32 unk5C;

View File

@ -49,7 +49,7 @@ SECTIONS
src/rom_17634.o(.text);
asm/rom_11B9C.o(.text176B0);
src/rom_18784.o(.text);
asm/rom_11B9C.o(.text19028);
asm/rom_11B9C.o(.text1931C);
src/rom_19B64.o(.text);
src/rom_19D04.o(.text);
asm/rom_11B9C.o(.text19E10);

View File

@ -599,6 +599,7 @@ void sub_4AAD8(void)
sub_11FC();
}
//gMain.subState = 2
void sub_4ABC8(void)
{
sub_111C();

View File

@ -2,6 +2,8 @@
#include "variables.h"
#include "types.h"
#include "main.h"
#include "m4a.h"
#include "constants/bg_music.h"
void sub_18784(u8 arg0)
{
@ -374,3 +376,150 @@ void sub_18F38(u8 arg0_enum, u16 *arg1, u16 *arg2)
break;
}
}
void IdlePinballGameMain(void)
{
gIdlePinballGameStateFuncs[gMain.subState]();
}
void sub_19048(void)
{
s16 i;
s16 unk30;
s8 unk30LowerBits;
gMain.unk54 = 0;
gMain.unkD = 1;
gUnknown_02031510 = 0;
for (i = 0; i < NUM_EREADER_CARDS; i++)
gUnknown_02031520.eReaderBonuses[i] = gMain.eReaderBonuses[i];
if (gMain.unk30 == 0)
gMain.unk30 = (Random() + gMain.systemFrameCount) % 30;
unk30 = gMain.unk30;
unk30LowerBits = unk30 & 3;
switch (unk30LowerBits)
{
case 0:
gUnknown_02031520.unk6 = 0xA14;
gUnknown_02031520.unk10 = &gUnknown_081450F4;
gUnknown_02031520.unkC = &gUnknown_081531F4;
break;
case 1:
gUnknown_02031520.unk6 = 0xF00;
gUnknown_02031520.unk10 = &gUnknown_0814F9B4;
gUnknown_02031520.unkC = &gUnknown_08156E60;
break;
case 2:
gUnknown_02031520.unk6 = 0xD20;
gUnknown_02031520.unk10 = &gUnknown_08148934;
gUnknown_02031520.unkC = &gUnknown_08154618;
break;
case 3:
gUnknown_02031520.unk6 = 0xE4C;
gUnknown_02031520.unk10 = &gUnknown_0814C174;
gUnknown_02031520.unkC = &gUnknown_08155A3C;
break;
}
sub_49ED4();
switch (unk30LowerBits)
{
case 0:
m4aSongNumStart(MUS_FIELD_RUBY);
break;
case 1:
m4aSongNumStart(MUS_FIELD_SAPPHIRE);
break;
case 2:
m4aSongNumStart(MUS_FIELD_RUBY);
break;
case 3:
m4aSongNumStart(MUS_FIELD_SAPPHIRE);
break;
}
gUnknown_02031520.rumbleEnabled = gMain_saveData.rumbleEnabled;
gMain_saveData.rumbleEnabled = 0;
gMain.unk30++;
}
void sub_19190()
{
u8 unk1D;
unk1D = gCurrentPinballGame->unk1D;
switch (unk1D)
{
case 0:
gCurrentPinballGame->unk1D = 1;
gMain.unkE = unk1D;
break;
case 1:
if (gMain.selectedField < MAIN_FIELD_COUNT)
sub_4ACF0();
else
sub_4B000();
if (gMain.unk54++ > gUnknown_02031520.unk6)
gMain.unkE = 1;
if (gMain.heldKeys & JOY_EXCL_LR)
gMain.unkE = 1;
if (gMain.unkE != 0)
{
if (gMain.selectedField < MAIN_FIELD_COUNT)
{
sub_1D4D0();
sub_31BE8(0);
}
else if (gMain.selectedField == FIELD_KECLEON)
{
sub_356A0();
}
if ((gMain.unkF & 2) != 0)
{
DmaCopy16(3, gCurrentPinballGame->unk111A, (void *)OBJ_PLTT, OBJ_PLTT_SIZE);
}
gCurrentPinballGame->unk1D = 2;
if (gMain.unkE == 2)
sub_4B408(1);
}
break;
case 2:
gMain.subState++;
break;
}
}
void sub_19288(void)
{
s16 i;
gMain.unk36 = 0;
gMain_saveData.rumbleEnabled = gUnknown_02031520.rumbleEnabled;
for (i = 0; i < NUM_EREADER_CARDS; i++)
gMain.eReaderBonuses[i] = gUnknown_02031520.eReaderBonuses[i];
sub_02B4();
m4aMPlayAllStop();
sub_0D10();
if (gMain.unk54 < gUnknown_02031520.unk6)
SetMainGameState(STATE_TITLE);
else
SetMainGameState(STATE_SCORES_IDLE);
gMain.unk54 = 0;
}
void sub_19304(void)
{
if (gMain.selectedField >= FIELD_BONUS_START)
sub_19734();
}