diff options
-rw-r--r-- | asm/code.s | 15 | ||||
-rw-r--r-- | asm/input.s | 183 | ||||
-rw-r--r-- | include/input.h | 10 | ||||
-rwxr-xr-x | ld_script.txt | 4 | ||||
-rw-r--r-- | src/code_80001DC.c (renamed from src/code_80001E0.c) | 5 | ||||
-rw-r--r-- | src/code_800C9CC.c | 49 | ||||
-rw-r--r-- | src/input.c | 99 | ||||
-rw-r--r-- | src/music.c | 4 | ||||
-rw-r--r-- | sym_ewram.txt | 6 | ||||
-rw-r--r-- | sym_ewram2.txt | 2 |
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 */ |