diff --git a/asm/readKeyInput.s b/asm/readKeyInput.s deleted file mode 100644 index 50e63e38..00000000 --- a/asm/readKeyInput.s +++ /dev/null @@ -1,54 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ReadKeyInput -ReadKeyInput: @ 0x0801D6C0 - push {lr} - ldr r0, _0801D6D4 @ =0x04000130 - ldrh r0, [r0] - ldr r1, _0801D6D8 @ =0x000003FF - bics r1, r0 - ldr r0, _0801D6DC @ =gUnk_03000FF0 - bl sub_0801D6E0 - pop {pc} - .align 2, 0 -_0801D6D4: .4byte 0x04000130 -_0801D6D8: .4byte 0x000003FF -_0801D6DC: .4byte gUnk_03000FF0 - - - thumb_func_start sub_0801D6E0 -sub_0801D6E0: @ 0x0801D6E0 - push {lr} - adds r2, r0, #0 - ldrh r0, [r2] - adds r3, r1, #0 - bics r3, r0 - strh r3, [r2, #2] - cmp r1, r0 - bne _0801D70A - ldrb r0, [r2, #7] - subs r0, #1 - strb r0, [r2, #7] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0801D704 - movs r0, #4 - strb r0, [r2, #7] - strh r1, [r2, #4] - b _0801D710 -_0801D704: - movs r0, #0 - strh r0, [r2, #4] - b _0801D710 -_0801D70A: - movs r0, #0x14 - strb r0, [r2, #7] - strh r3, [r2, #4] -_0801D710: - strh r1, [r2] - pop {pc} diff --git a/linker.ld b/linker.ld index c7f40ab1..58006a85 100644 --- a/linker.ld +++ b/linker.ld @@ -319,7 +319,7 @@ SECTIONS { src/_dmaFill32.o(.text); asm/sub_0801D630.o(.text); asm/sub_0801D66C.o(.text); - asm/readKeyInput.o(.text); + src/input.o(.text); asm/code_0801D714.o(.text); asm/code_0801D79C.o(.text); /* enemies */ diff --git a/src/input.c b/src/input.c new file mode 100644 index 00000000..df5b2290 --- /dev/null +++ b/src/input.c @@ -0,0 +1,44 @@ +#include "global.h" +#include "entity.h" + +typedef struct { + u16 field_0x0; + u16 field_0x2; + u16 field_0x4; + u8 field_0x6; + u8 field_0x7; +} Input; + +void StoreKeyInput(Input *pkeyInput, u32 ioKeyInput); + +extern Input gUnk_03000FF0; + +void ReadKeyInput(void) +{ + u32 reg = ~*(u16*)0x04000130 & 0x3FF; + Input* input = &gUnk_03000FF0; + StoreKeyInput(input, reg); +} + +void StoreKeyInput(Input *input, u32 ioKeyInput) +{ + u32 difference; + u32 temp = input->field_0x0; + + difference = ioKeyInput & ~temp; + input->field_0x2 = difference; + if (ioKeyInput == temp) { + if (--input->field_0x7 == 0) { + input->field_0x7 = 4; + input->field_0x4 = ioKeyInput; + } + else { + input->field_0x4 = 0; + } + } + else { + input->field_0x7 = 0x14; + input->field_0x4 = difference; + } + input->field_0x0 = ioKeyInput; +} \ No newline at end of file