mirror of https://github.com/zeldaret/tmc.git
commit
2b45a8c992
|
@ -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
|
|
|
@ -6,11 +6,17 @@
|
||||||
#include "save.h"
|
#include "save.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
u8 filler0[0x5];
|
u8 unk_0x0;
|
||||||
|
u8 filler0[0x4];
|
||||||
u8 state;
|
u8 state;
|
||||||
u8 subState;
|
u8 subState;
|
||||||
u16 timer;
|
u16 timer;
|
||||||
u8 fillerA[0x26];
|
u8 fillerA[0x5];
|
||||||
|
s16 unk_0x10;
|
||||||
|
u16 unk_0x12;
|
||||||
|
u8 fillerB[0xC];
|
||||||
|
u8 unk_0x20;
|
||||||
|
u8 fillerC[0xF];
|
||||||
} ChooseFileState;
|
} ChooseFileState;
|
||||||
static_assert(sizeof(ChooseFileState) == 0x30);
|
static_assert(sizeof(ChooseFileState) == 0x30);
|
||||||
|
|
||||||
|
|
|
@ -70,15 +70,18 @@ typedef struct {
|
||||||
/*0x78*/ u32 _78;
|
/*0x78*/ u32 _78;
|
||||||
} Screen;
|
} Screen;
|
||||||
|
|
||||||
struct OAMCommand {
|
typedef struct {
|
||||||
u16 x;
|
u16 x;
|
||||||
u16 y;
|
u16 y;
|
||||||
u16 _4;
|
u16 _4;
|
||||||
u16 _6;
|
u16 _6;
|
||||||
u16 _8;
|
u16 _8;
|
||||||
} extern gOamCmd;
|
} OAMCommand;
|
||||||
|
|
||||||
extern BgControls gBgControls;
|
extern BgControls gBgControls;
|
||||||
extern Screen gScreen;
|
extern Screen gScreen;
|
||||||
|
extern OAMCommand gOamCmd;
|
||||||
|
|
||||||
|
extern void sub_080ADA04(OAMCommand*, void*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
128
src/demoScreen.c
128
src/demoScreen.c
|
@ -21,6 +21,10 @@ extern void gUnk_089FD2F4;
|
||||||
|
|
||||||
extern u8 gUnk_02000006;
|
extern u8 gUnk_02000006;
|
||||||
|
|
||||||
|
extern u16 gUnk_08127CC8[4];
|
||||||
|
extern void* gUnk_08127C98;
|
||||||
|
extern u8 gUnk_08A068BF[129];
|
||||||
|
|
||||||
void HandleChooseDemoScreen(void) {
|
void HandleChooseDemoScreen(void) {
|
||||||
FlushSprites();
|
FlushSprites();
|
||||||
demoFunctions[gMain.funcIndex]();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue