Merge pull request #221 from hatal175/screenDemo

Work on screenDemo.c
This commit is contained in:
notyourav 2021-12-27 19:54:14 -08:00 committed by GitHub
commit 2b45a8c992
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 138 additions and 41 deletions

View File

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

View File

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

View File

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

View File

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