diff options
Diffstat (limited to 'src')
-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 |
4 files changed, 103 insertions, 54 deletions
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(); } |