summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
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();
}