summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Naściszewski <matin1111@wp.pl>2020-12-26 06:57:02 +0100
committerSeth Barberee <seth.barberee@gmail.com>2020-12-28 20:13:22 -0600
commit6362345b04a04fefec25fdb29fd1b1bb9f8da163 (patch)
tree84059fefe70ebab180e8f5efcc5d2208abd28275
parentb64320b043fe0a774327d7d880e9f16605db54ee (diff)
Decompile UpdateInput
and some other minor stuff.
-rw-r--r--asm/code.s15
-rw-r--r--asm/input.s183
-rw-r--r--include/input.h10
-rwxr-xr-xld_script.txt4
-rw-r--r--src/code_80001DC.c (renamed from src/code_80001E0.c)5
-rw-r--r--src/code_800C9CC.c49
-rw-r--r--src/input.c99
-rw-r--r--src/music.c4
-rw-r--r--sym_ewram.txt6
-rw-r--r--sym_ewram2.txt2
10 files changed, 113 insertions, 264 deletions
diff --git a/asm/code.s b/asm/code.s
deleted file mode 100644
index c5ba01e..0000000
--- a/asm/code.s
+++ /dev/null
@@ -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.
diff --git a/asm/input.s b/asm/input.s
deleted file mode 100644
index 5ebe3dc..0000000
--- a/asm/input.s
+++ /dev/null
@@ -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.
diff --git a/include/input.h b/include/input.h
index 0c4208d..1d8547a 100644
--- a/include/input.h
+++ b/include/input.h
@@ -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;
};
diff --git a/ld_script.txt b/ld_script.txt
index 12b80e5..c53b23c 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -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);
diff --git a/src/code_80001E0.c b/src/code_80001DC.c
index 417853a..6bcdcc9 100644
--- a/src/code_80001E0.c
+++ b/src/code_80001DC.c
@@ -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;
diff --git a/src/code_800C9CC.c b/src/code_800C9CC.c
index 27445f0..593728e 100644
--- a/src/code_800C9CC.c
+++ b/src/code_800C9CC.c
@@ -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)
diff --git a/src/input.c b/src/input.c
index 99d894b..91b20ac 100644
--- a/src/input.c
+++ b/src/input.c
@@ -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
+}
diff --git a/src/music.c b/src/music.c
index 8997887..48929fe 100644
--- a/src/music.c
+++ b/src/music.c
@@ -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();
}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index b3ce7fe..79db77c 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -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 */
diff --git a/sym_ewram2.txt b/sym_ewram2.txt
index 5b938b3..6496bca 100644
--- a/sym_ewram2.txt
+++ b/sym_ewram2.txt
@@ -131,7 +131,7 @@ gFlashEnabled = .; /* 203B0B4 */
gUnknown_203B0B8 = .; /* 203B0B8 */
. += 0x4;
-gUnknown_203B0BC = .; /* 203B0BC */
+gRawKeyInput = .; /* 203B0BC */
. += 0x2;
gUnknown_203B0BE = .; /* 203B0BE */