mirror of
https://github.com/pret/pmd-red.git
synced 2026-08-22 16:54:36 -05:00
Decompile UpdateInput
and some other minor stuff.
This commit is contained in:
committed by
Seth Barberee
parent
b64320b043
commit
6362345b04
15
asm/code.s
15
asm/code.s
@@ -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.
|
||||
183
asm/input.s
183
asm/input.s
@@ -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.
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
@@ -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)
|
||||
|
||||
99
src/input.c
99
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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -131,7 +131,7 @@ gFlashEnabled = .; /* 203B0B4 */
|
||||
gUnknown_203B0B8 = .; /* 203B0B8 */
|
||||
. += 0x4;
|
||||
|
||||
gUnknown_203B0BC = .; /* 203B0BC */
|
||||
gRawKeyInput = .; /* 203B0BC */
|
||||
. += 0x2;
|
||||
|
||||
gUnknown_203B0BE = .; /* 203B0BE */
|
||||
|
||||
Reference in New Issue
Block a user