diff --git a/asm/non_matching/demoScreen/sub_080A3198.inc b/asm/non_matching/demoScreen/sub_080A3198.inc deleted file mode 100644 index 449195ea..00000000 --- a/asm/non_matching/demoScreen/sub_080A3198.inc +++ /dev/null @@ -1,34 +0,0 @@ - .syntax unified - push {r4, r5, lr} - ldr r1, _080A31D0 @ =0x08127CC8 - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r4, [r0] - ldr r1, _080A31D4 @ =gChooseFileState - ldrh r0, [r1, #0x12] - cmp r0, r4 - beq _080A31CC - strh r4, [r1, #0x12] - ldr r5, _080A31D8 @ =something2 - ldr r0, [r5] - subs r0, #0x1e - movs r1, #0xc0 - lsls r1, r1, #1 - bl MemClear - cmp r4, #0 - beq _080A31C6DEMO - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_0805F46C -_080A31C6DEMO: - ldr r1, _080A31DC @ =gScreen - movs r0, #1 - strh r0, [r1, #0xe] -_080A31CC: - pop {r4, r5, pc} - .align 2, 0 -_080A31D0: .4byte gUnk_08127CC8 -_080A31D4: .4byte gChooseFileState -_080A31D8: .4byte gUnk_08127C98 -_080A31DC: .4byte gScreen - .syntax divided diff --git a/include/fileScreen.h b/include/fileScreen.h index 04cfa4ba..8d67cf82 100644 --- a/include/fileScreen.h +++ b/include/fileScreen.h @@ -6,11 +6,17 @@ #include "save.h" typedef struct { - u8 filler0[0x5]; + u8 unk_0x0; + u8 filler0[0x4]; u8 state; u8 subState; u16 timer; - u8 fillerA[0x26]; + u8 fillerA[0x5]; + s16 unk_0x10; + u16 unk_0x12; + u8 fillerB[0xC]; + u8 unk_0x20; + u8 fillerC[0xF]; } ChooseFileState; static_assert(sizeof(ChooseFileState) == 0x30); diff --git a/include/screen.h b/include/screen.h index 18962f80..e057442a 100644 --- a/include/screen.h +++ b/include/screen.h @@ -70,15 +70,18 @@ typedef struct { /*0x78*/ u32 _78; } Screen; -struct OAMCommand { +typedef struct { u16 x; u16 y; u16 _4; u16 _6; u16 _8; -} extern gOamCmd; +} OAMCommand; extern BgControls gBgControls; extern Screen gScreen; +extern OAMCommand gOamCmd; + +extern void sub_080ADA04(OAMCommand*, void*); #endif diff --git a/src/demoScreen.c b/src/demoScreen.c index b10bd35f..efc3368d 100644 --- a/src/demoScreen.c +++ b/src/demoScreen.c @@ -21,6 +21,10 @@ extern void gUnk_089FD2F4; extern u8 gUnk_02000006; +extern u16 gUnk_08127CC8[4]; +extern void* gUnk_08127C98; +extern u8 gUnk_08A068BF[129]; + void HandleChooseDemoScreen(void) { FlushSprites(); demoFunctions[gMain.funcIndex](); @@ -89,8 +93,126 @@ void sub_080A2F8C(void) { } } -ASM_FUNC("asm/non_matching/demoScreen/sub_080A2FD0.inc", void sub_080A2FD0(void)) +// The condition on the left dpad is very convuluted for some reason (instead oj just an equality check). +// This causes the entire function heirarchy to change on a whim and I couldn't quite figure out +// the correct conditions/code to make it like the original function. +NONMATCH("asm/non_matching/demoScreen/sub_080A2FD0.inc", void sub_080A2FD0(void)) { + s32 tmp; + u32 tmp2; + u32 val; + s32 tmp3; + u32 unk_0x0; + u32 tmp4; + s32 tmp5; + u32 keys; -ASM_FUNC("asm/non_matching/demoScreen/sub_080A30AC.inc", void sub_080A30AC(void)) + if (gFadeControl.active == 0) { + val = 0; + keys = gInput.heldKeys; + switch (keys) { + case DPAD_RIGHT: { + if (gChooseFileState.unk_0x0 == 0) { + val = 1; + gChooseFileState.unk_0x20 = 4; + SoundReq(SFX_TEXTBOX_CHOICE); + } + } + case DPAD_LEFT: { + if (gChooseFileState.unk_0x0 == 0) { + val = -1; + gChooseFileState.unk_0x20 = 0xfc; + SoundReq(SFX_TEXTBOX_CHOICE); + } + } + case START_BUTTON: + case A_BUTTON: { + if (gChooseFileState.unk_0x0 == 0) { + gMain.screen = 2; + gMain.funcIndex = gChooseFileState.unk_0x0; + SoundReq(SFX_TEXTBOX_SELECT); + } + } + } + tmp = gSaveHeader->saveFileId; + tmp2 = val + 3; + tmp += tmp2; + gSaveHeader->saveFileId = tmp % 3; -ASM_FUNC("asm/non_matching/demoScreen/sub_080A3198.inc", void sub_080A3198(u32 param_1, u32 param_2)) + tmp3 = gChooseFileState.unk_0x10; + + tmp = gSaveHeader->saveFileId; + tmp *= 0x68; + + if (tmp != tmp3) { + tmp5 = gChooseFileState.unk_0x20; + tmp5 += tmp3; + gChooseFileState.unk_0x10 = (tmp5 + (0x9c << 1)) % (0x9c << 1); + unk_0x0 = 1; + } else { + unk_0x0 = 0; + } + + gChooseFileState.unk_0x0 = unk_0x0; + sub_080A3198(gSaveHeader->saveFileId, 0); + } +} +END_NONMATCH + +NONMATCH("asm/non_matching/demoScreen/sub_080A30AC.inc", void sub_080A30AC(void)) { + u32 unk_0x10; + u8* ptr; + u8* currentPtr; + u32 offset; + u32 xoffset; + gOamCmd._4 = 0x2000; + gOamCmd._6 = 0; + gOamCmd._8 = 0xc00; + gOamCmd.y = 0x40; + unk_0x10 = gChooseFileState.unk_0x10; + gOamCmd.x = 0xFFFFFED8 - unk_0x10; + offset = *(u32*)gUnk_08A068BF; + ptr = gUnk_08A068BF - 0xc; + sub_080ADA04(&gOamCmd, ptr + offset); + // FIX: original assembly uses r1 for xoffset for no apparent reason. Could not make it compile to do the same. + // Maybe the original code was some sort of loop unrolling. + xoffset = -0xc0; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4)); + xoffset = -0x58; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8)); + xoffset = 0x10; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(gUnk_08A068BF)); + xoffset = 0x78; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4)); + xoffset = 0xe0; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8)); + xoffset = 0xa4 << 1; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(gUnk_08A068BF)); + xoffset = 0xd8 << 1; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4)); + xoffset = 0x86 << 2; + gOamCmd.x = xoffset - unk_0x10; + sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8)); +} +END_NONMATCH + +void sub_080A3198(u32 param_1, u32 param_2) { + u16 r4 = gUnk_08127CC8[param_1]; + + if (gChooseFileState.unk_0x12 != r4) { + gChooseFileState.unk_0x12 = r4; + MemClear(gUnk_08127C98 - 0x1e, 0x180); + + if (r4 != 0) { + sub_0805F46C(r4, &gUnk_08127C98); + } + + gScreen.bg0.updated = 1; + } +}