Decompile UpdateInput

and some other minor stuff.
This commit is contained in:
Mateusz Naściszewski
2020-12-26 06:57:02 +01:00
committed by Seth Barberee
parent b64320b043
commit 6362345b04
10 changed files with 113 additions and 264 deletions

View File

@@ -1,15 +0,0 @@
.include "constants/gba_constants.inc"
.include "asm/macros.inc"
.syntax unified
.text
@ Unused
thumb_func_start sub_80001DC
sub_80001DC:
mov r0, sp
bx lr
thumb_func_end sub_80001DC
.align 2, 0 @ Don't pad with nop.

View File

@@ -1,183 +0,0 @@
.include "constants/gba_constants.inc"
.include "asm/macros.inc"
.syntax unified
.text
thumb_func_start UpdateInput
UpdateInput:
push {r4-r6,lr}
ldr r4, =gUnknown_2025658
ldr r5, =gUnknown_2025648
adds r1, r4, 0
adds r0, r5, 0
ldm r0!, {r2,r3,r6}
stm r1!, {r2,r3,r6}
ldr r0, [r0]
str r0, [r1]
adds r0, r5, 0
bl ReadKeyInput
ldrh r0, [r4]
ldrh r3, [r5]
eors r0, r3
ands r0, r3
strh r0, [r5, 0x2]
lsls r0, r3, 16
lsrs r0, 16
cmp r0, 0
beq _080049A8
ldrh r1, [r5, 0x8]
movs r0, 0xF0
adds r2, r0, 0
ands r2, r3
ands r0, r1
cmp r0, r2
bne _080049A0
ldr r0, [r5, 0xC]
cmp r0, 0x31
bgt _080049AC
adds r0, 0x1
str r0, [r5, 0xC]
b _080049AC
.align 2, 0
.pool
_080049A0:
strh r2, [r5, 0x8]
movs r0, 0x1
str r0, [r5, 0xC]
b _080049AC
_080049A8:
str r0, [r5, 0xC]
strh r0, [r5, 0x8]
_080049AC:
ldr r0, =gUnknown_2025648
ldr r2, [r0, 0xC]
adds r3, r0, 0
cmp r2, 0x1
bne _080049C8
ldrh r0, [r3, 0x8]
movs r1, 0xF0
ands r1, r0
ldrh r0, [r3, 0x2]
orrs r1, r0
strh r1, [r3, 0x4]
b _080049E0
.align 2, 0
.pool
_080049C8:
cmp r2, 0x30
bne _080049DC
movs r0, 0x2B
str r0, [r3, 0xC]
ldrh r1, [r3, 0x8]
movs r0, 0xF0
ands r0, r1
ldrh r1, [r3, 0x2]
orrs r0, r1
b _080049DE
_080049DC:
movs r0, 0
_080049DE:
strh r0, [r3, 0x4]
_080049E0:
movs r0, 0
strh r0, [r3, 0x6]
ldrh r1, [r3]
movs r5, 0x2
adds r0, r5, 0
ands r0, r1
lsls r0, 16
lsrs r2, r0, 16
cmp r2, 0
beq _08004A0C
ldr r0, =gUnknown_2025668
ldrh r2, [r0]
movs r4, 0
ldrsh r1, [r0, r4]
adds r4, r0, 0
cmp r1, 0x63
bgt _08004A20
adds r0, r2, 0x1
strh r0, [r4]
b _08004A20
.align 2, 0
.pool
_08004A0C:
ldr r1, =gUnknown_2025668
ldrh r0, [r1]
subs r0, 0x2
lsls r0, 16
lsrs r0, 16
adds r4, r1, 0
cmp r0, 0x9
bhi _08004A1E
strh r5, [r3, 0x6]
_08004A1E:
strh r2, [r4]
_08004A20:
ldrh r1, [r3]
movs r5, 0x80
lsls r5, 1
adds r0, r5, 0
ands r0, r1
lsls r0, 16
lsrs r2, r0, 16
cmp r2, 0
beq _08004A48
ldrh r1, [r4, 0x2]
movs r6, 0x2
ldrsh r0, [r4, r6]
cmp r0, 0x63
bgt _08004A5E
adds r0, r1, 0x1
strh r0, [r4, 0x2]
b _08004A5E
.align 2, 0
.pool
_08004A48:
ldrh r0, [r4, 0x2]
subs r0, 0x2
lsls r0, 16
lsrs r0, 16
cmp r0, 0x9
bhi _08004A5C
ldrh r1, [r3, 0x6]
adds r0, r5, 0
orrs r0, r1
strh r0, [r3, 0x6]
_08004A5C:
strh r2, [r4, 0x2]
_08004A5E:
ldr r2, =gUnknown_2025638
ldrh r0, [r2]
ldrh r1, [r3]
orrs r0, r1
strh r0, [r2]
ldrh r0, [r2, 0x2]
ldrh r1, [r3, 0x2]
orrs r0, r1
strh r0, [r2, 0x2]
ldrh r0, [r2, 0x4]
ldrh r1, [r3, 0x4]
orrs r0, r1
strh r0, [r2, 0x4]
ldrh r0, [r2, 0x6]
ldrh r1, [r3, 0x6]
orrs r0, r1
strh r0, [r2, 0x6]
ldr r2, =gUnknown_202562C
ldrh r0, [r3]
ldr r1, =0x054a1c41
orrs r0, r1
ldr r1, [r2]
muls r0, r1
str r0, [r2]
pop {r4-r6}
pop {r0}
bx r0
.align 2, 0
.pool
thumb_func_end UpdateInput
.align 2, 0 @ Don't pad with nop.

View File

@@ -3,19 +3,19 @@
struct UnkInputStruct1
{
/* 0x0 */ u16 unk0;
/* 0x2 */ u16 unk2;
/* 0x0 */ u16 held;
/* 0x2 */ u16 pressed;
/* 0x4 */ u16 unk4;
/* 0x6 */ u16 unk6;
/* 0x8 */ u16 unk8;
/* 0xA */ u16 unkA;
/* 0xC */ u32 unkC;
/* 0xC */ s32 repeatTimer;
};
struct UnkInputStruct2
{
/* 0x0 */ u16 unk0;
/* 0x2 */ u16 unk2;
/* 0x0 */ s16 holdTimerB;
/* 0x2 */ s16 holdTimerR;
/* 0x4 */ u16 unk4;
/* 0x6 */ u16 unk6;
};

View File

@@ -40,8 +40,7 @@ SECTIONS {
ALIGN(4)
{
asm/crt0.o(.text);
asm/code.o(.text);
src/code_80001E0.o(.text);
src/code_80001DC.o(.text);
asm/arm_func.o(.text);
asm/code_2.o(.text);
src/code.o(.text);
@@ -56,7 +55,6 @@ SECTIONS {
src/util.o(.text);
src/bg_palette_buffer.o(.text);
src/input.o(.text);
asm/input.o(.text);
asm/code_8004AA0.o(.text);
src/sprite.o(.text);
asm/sprite.o(.text);

View File

@@ -2,6 +2,11 @@
extern u32 gUnknown_3004000;
// unused, returns stack pointer
u32 sub_80001DC() {
return (u32)__builtin_frame_address(0);
}
u32 *sub_80001E0(void)
{
return &gUnknown_3004000;

View File

@@ -9,7 +9,7 @@ struct unkStruct_809CC88
u16 unk6;
};
extern u16 gUnknown_203B0BC;
extern u16 gRawKeyInput;
extern u8 gUnknown_202D6B8;
extern u8 gUnknown_202D6B9;
extern u16 gUnknown_202D7FA;
@@ -22,58 +22,39 @@ extern struct unkStruct_809CC88 gUnknown_202D6B0;
void ReadKeyInput(struct UnkInputStruct1 *r0)
{
u16 keyInput = REG_KEYINPUT ^ KEYS_MASK;
r0->unk0 = 0;
r0->held = 0;
if((keyInput & DPAD_UP) != 0)
{
r0->unk0 = DPAD_UP;
}
r0->held = DPAD_UP;
if((keyInput & DPAD_DOWN) != 0)
{
r0->unk0 |= DPAD_DOWN;
}
r0->held |= DPAD_DOWN;
if((keyInput & DPAD_LEFT) != 0)
{
r0->unk0 |= DPAD_LEFT;
}
r0->held |= DPAD_LEFT;
if((keyInput & DPAD_RIGHT) != 0)
{
r0->unk0 |= DPAD_RIGHT;
}
r0->held |= DPAD_RIGHT;
if((keyInput & A_BUTTON) != 0)
{
r0->unk0 |= A_BUTTON;
}
r0->held |= A_BUTTON;
if((keyInput & B_BUTTON) != 0)
{
r0->unk0 |= B_BUTTON;
}
r0->held |= B_BUTTON;
if((keyInput & START_BUTTON) != 0)
{
r0->unk0 |= START_BUTTON;
}
r0->held |= START_BUTTON;
if((keyInput & SELECT_BUTTON) != 0)
{
r0->unk0 |= SELECT_BUTTON;
}
r0->held |= SELECT_BUTTON;
if((keyInput & R_BUTTON) != 0)
{
r0->unk0 |= R_BUTTON;
}
r0->held |= R_BUTTON;
if((keyInput & L_BUTTON) != 0)
{
r0->unk0 |= L_BUTTON;
}
gUnknown_203B0BC = keyInput;
r0->held |= L_BUTTON;
gRawKeyInput = keyInput;
}
void sub_800CC44(s32 r0, s32 r1)

View File

@@ -4,23 +4,26 @@
EWRAM_DATA struct Input gUnknown_2025600;
EWRAM_DATA struct UnkInputStruct1 gUnknown_20255F0;
EWRAM_DATA struct UnkInputStruct1 gUnknown_2025638;
EWRAM_DATA struct UnkInputStruct1 gUnknown_2025648;
EWRAM_DATA struct UnkInputStruct1 gCurrentInputs;
EWRAM_DATA struct UnkInputStruct1 gLastInputs;
EWRAM_DATA struct UnkInputStruct2 gUnknown_2025668;
EWRAM_DATA u32 gUnknown_202562C;
EWRAM_DATA u32 gUnusedScrambledInputJunk;
void ReadKeyInput(struct UnkInputStruct1 *r0);
void InitInput(void)
{
gUnknown_20255F0.unk0 = 0;
gUnknown_20255F0.unk2 = 0;
gUnknown_20255F0.held = 0;
gUnknown_20255F0.pressed = 0;
gUnknown_20255F0.unk4 = 0;
gUnknown_20255F0.unk6 = 0;
gUnknown_2025638.unk0 = 0;
gUnknown_2025638.unk2 = 0;
gUnknown_2025638.held = 0;
gUnknown_2025638.pressed = 0;
gUnknown_2025638.unk4 = 0;
gUnknown_2025638.unk6 = 0;
gUnknown_202562C = 4854977; // ????? (0x4a14c1)
gUnusedScrambledInputJunk = 0x4a14c1; // seems like random keyboard mashing (see UpdateInput)
gUnknown_2025600.unk20 = 0;
gUnknown_2025600.unk0 = 0xffff; // probably a mask
@@ -40,16 +43,16 @@ void InitInput(void)
gUnknown_2025600.unk28 = 0;
gUnknown_2025600.unk29 = 0;
gUnknown_2025668.unk0 = 0;
gUnknown_2025668.unk2 = 0;
gUnknown_2025668.holdTimerB = 0;
gUnknown_2025668.holdTimerR = 0;
}
void sub_800485C(void)
{
gUnknown_20255F0 = gUnknown_2025638;
gUnknown_2025638.unk0 = 0;
gUnknown_2025638.unk2 = 0;
gUnknown_2025638.held = 0;
gUnknown_2025638.pressed = 0;
gUnknown_2025638.unk4 = 0;
gUnknown_2025638.unk6 = 0;
@@ -107,18 +110,18 @@ u8 sub_80048CC(void)
void sub_80048D0(void)
{
gUnknown_20255F0.unk4 = 0;
gUnknown_2025648.unkC = 0;
gUnknown_2025648.unk8 = 0;
gUnknown_2025668.unk0 = 0x3e7;
gUnknown_2025668.unk2 = 0x3e7;
gCurrentInputs.repeatTimer = 0;
gCurrentInputs.unk8 = 0;
gUnknown_2025668.holdTimerB = 999;
gUnknown_2025668.holdTimerR = 999;
}
void sub_80048F8(void)
{
gUnknown_20255F0.unk2 = 0;
gUnknown_2025638.unk2 = 0;
gUnknown_2025648.unk2 = 0;
gUnknown_20255F0.pressed = 0;
gUnknown_2025638.pressed = 0;
gCurrentInputs.pressed = 0;
}
void sub_8004914(void)
@@ -142,3 +145,63 @@ void sub_8004914(void)
gUnknown_2025600.unk29 = 0;
}
void UpdateInput(void)
{
gLastInputs = gCurrentInputs;
ReadKeyInput(&gCurrentInputs);
gCurrentInputs.pressed = (gLastInputs.held ^ gCurrentInputs.held) & gCurrentInputs.held;
if (gCurrentInputs.held) {
// 0xF0 -- DPAD buttons
if ((gCurrentInputs.unk8 & 0xf0) == (gCurrentInputs.held & 0xf0)) {
if (gCurrentInputs.repeatTimer < 50)
gCurrentInputs.repeatTimer = gCurrentInputs.repeatTimer + 1;
} else {
gCurrentInputs.unk8 = gCurrentInputs.held & 0xf0;
gCurrentInputs.repeatTimer = 1;
}
} else {
gCurrentInputs.repeatTimer = 0;
gCurrentInputs.unk8 = 0;
}
if (gCurrentInputs.repeatTimer == 1) {
gCurrentInputs.unk4 = (gCurrentInputs.unk8 & 0xf0) | gCurrentInputs.pressed;
} else if (gCurrentInputs.repeatTimer == 48) {
gCurrentInputs.repeatTimer = 43;
gCurrentInputs.unk4 = (gCurrentInputs.unk8 & 0xf0) | gCurrentInputs.pressed;
} else {
gCurrentInputs.unk4 = 0;
}
gCurrentInputs.unk6 = 0;
if (gCurrentInputs.held & B_BUTTON) {
if (gUnknown_2025668.holdTimerB < 100)
gUnknown_2025668.holdTimerB++;
} else if (1 < gUnknown_2025668.holdTimerB && gUnknown_2025668.holdTimerB < 12) {
gCurrentInputs.unk6 = B_BUTTON;
gUnknown_2025668.holdTimerB = 0;
} else {
gUnknown_2025668.holdTimerB = 0;
}
if (gCurrentInputs.held & R_BUTTON) {
if (gUnknown_2025668.holdTimerR < 100)
gUnknown_2025668.holdTimerR++;
} else if (1 < gUnknown_2025668.holdTimerR && gUnknown_2025668.holdTimerR < 12) {
gCurrentInputs.unk6 |= R_BUTTON;
gUnknown_2025668.holdTimerR = 0;
} else {
gUnknown_2025668.holdTimerR = 0;
}
gUnknown_2025638.held |= gCurrentInputs.held;
gUnknown_2025638.pressed |= gCurrentInputs.pressed;
gUnknown_2025638.unk4 |= gCurrentInputs.unk4;
gUnknown_2025638.unk6 |= gCurrentInputs.unk6;
gUnusedScrambledInputJunk *= gCurrentInputs.held | 0x54a1c41; // very similar to odd constant in InitInput - probably keymashing
}

View File

@@ -20,7 +20,7 @@ extern u16 gUnknown_202D68A;
extern u16 gUnknown_202D690;
extern u8 gUnknown_202D694;
extern u32 gUnknown_203B0B8;
extern u16 gUnknown_203B0BC;
extern u16 gRawKeyInput;
bool8 IsBGSong(u32);
bool8 sub_800CAAC(u32);
@@ -183,7 +183,7 @@ void sub_800CB20(void)
{
sub_800BA5C();
gUnknown_203B0B8++;
if((gUnknown_203B0BC & 5) != 0)
if((gRawKeyInput & 5) != 0)
{
Random();
}

View File

@@ -43,16 +43,16 @@ gUnknown_20255F0 = .; /* 20255F0 */
gUnknown_2025600 = .; /* 2025600 */
. += 0x2C;
gUnknown_202562C = .; /* 202562C */
gUnusedScrambledInputJunk = .; /* 202562C */
. += 0xC;
gUnknown_2025638 = .; /* 2025638 */
. += 0x10;
gUnknown_2025648 = .; /* 2025648 */
gCurrentInputs = .; /* 2025648 */
. += 0x10;
gUnknown_2025658 = .; /* 2025658 */
gLastInputs = .; /* 2025658 */
. += 0x10;
gUnknown_2025668 = .; /* 2025668 */

View File

@@ -131,7 +131,7 @@ gFlashEnabled = .; /* 203B0B4 */
gUnknown_203B0B8 = .; /* 203B0B8 */
. += 0x4;
gUnknown_203B0BC = .; /* 203B0BC */
gRawKeyInput = .; /* 203B0BC */
. += 0x2;
gUnknown_203B0BE = .; /* 203B0BE */