summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@users.noreply.github.com>2020-07-06 16:26:39 -0400
committerGitHub <noreply@github.com>2020-07-06 16:26:39 -0400
commit6b4bf8b5a0fe88dfe6adc769ea82bc2aeb527752 (patch)
tree873500ec67f14572021e773b87f1590b0cc428eb
parent8ae925315e82abdb9f07442d200f4a7bcae97559 (diff)
parent85c37c87a3c79f97c9603129701f91785abd0ddc (diff)
Merge pull request #223 from Cleverking2003/master
Decompile PAD_xyButton
-rw-r--r--arm7/asm/EXI_genPort.s19
-rw-r--r--arm7/asm/PAD_xyButton.s60
-rw-r--r--arm7/global.inc2
-rw-r--r--arm7/lib/include/OS_alarm.h3
-rw-r--r--arm7/lib/include/PAD_xyButton.h12
-rw-r--r--arm7/lib/include/mmap.h1
-rw-r--r--arm7/lib/include/registers.h8
-rw-r--r--arm7/lib/src/PAD_xyButton.c33
8 files changed, 58 insertions, 80 deletions
diff --git a/arm7/asm/EXI_genPort.s b/arm7/asm/EXI_genPort.s
index ff2a46f7..ced58086 100644
--- a/arm7/asm/EXI_genPort.s
+++ b/arm7/asm/EXI_genPort.s
@@ -23,22 +23,3 @@ EXIi_SetBitRcnt0L: ; 0x037FB90C
strh r0, [r2]
bx lr
_037FB928: .word 0x04000134
-
- arm_func_start FUN_037FB92C
-FUN_037FB92C: ; 0x037FB92C
- stmdb sp!, {r4, lr}
- mov r4, #0
- mov r0, #32768 ; 0x8000
- bl EXIi_SelectRcnt
- ldr r0, _037FB964 ; =0x04000136
- ldrh r1, [r0]
- ands r0, r1, #128 ; 0x80
- movne r4, #32768 ; 0x8000
- and r0, r1, #11
- orr r1, r4, r0, lsl #10
- ldr r0, _037FB968 ; =0x027FFFA8
- strh r1, [r0]
- ldmia sp!, {r4, lr}
- bx lr
-_037FB964: .word 0x04000136
-_037FB968: .word 0x027FFFA8
diff --git a/arm7/asm/PAD_xyButton.s b/arm7/asm/PAD_xyButton.s
deleted file mode 100644
index 66dc0a61..00000000
--- a/arm7/asm/PAD_xyButton.s
+++ /dev/null
@@ -1,60 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global PADi_XYButtonAvailable
-PADi_XYButtonAvailable: ;0x038079DC
- .space 0x038079E0 - 0x038079DC
-
- .global _038079E0
-_038079E0: ;0x038079E0
- .space 0x03807A0C - 0x038079E0
-
- .section .text
-
- arm_func_start PAD_InitXYButton
-PAD_InitXYButton: ; 0x037FB96C
- stmfd sp!, {lr}
- sub sp, sp, #12
- bl OS_IsTickAvailable
- cmp r0, #0
- beq _037FB98C
- bl OS_IsAlarmAvailable
- cmp r0, #0
- bne _037FB994
-_037FB98C:
- mov r0, #0
- b _037FB9F0
-_037FB994:
- ldr r0, _037FB9FC ; =PADi_XYButtonAvailable
- ldr r0, [r0]
- cmp r0, #0
- movne r0, #0
- bne _037FB9F0
- ldr r0, _037FBA00 ; =_038079E0
- bl OS_CreateAlarm
- bl OS_GetTick
- mov r2, r0
- ldr r0, _037FBA04 ; =FUN_037FB92C
- str r0, [sp, #4]
- mov r0, #0
- str r0, [sp, #8]
- ldr r3, _037FBA08 ; =0x0000082E
- str r0, [sp]
- ldr r0, _037FBA00 ; =_038079E0
- adds ip, r2, r3
- adc r2, r1, #0
- mov r1, ip
- bl OS_SetPeriodicAlarm
- mov r0, #1
- ldr r1, _037FB9FC ; =PADi_XYButtonAvailable
- str r0, [r1]
-_037FB9F0:
- add sp, sp, #12
- ldmia sp!, {lr}
- bx lr
-_037FB9FC: .word PADi_XYButtonAvailable
-_037FBA00: .word _038079E0
-_037FBA04: .word FUN_037FB92C
-_037FBA08: .word 0x0000082E
diff --git a/arm7/global.inc b/arm7/global.inc
index b21c60fc..11f0b8e2 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -123,7 +123,7 @@
.extern PXI_SetFifoRecvCallback
.extern EXIi_SelectRcnt
.extern EXIi_SetBitRcnt0L
-.extern FUN_037FB92C
+.extern PADi_xyButtonAlarmHandler
.extern SNDi_LockMutex
.extern SNDi_SetPlayerParam
.extern SNDi_SetSurroundDecay
diff --git a/arm7/lib/include/OS_alarm.h b/arm7/lib/include/OS_alarm.h
index 8ae89e97..a4566348 100644
--- a/arm7/lib/include/OS_alarm.h
+++ b/arm7/lib/include/OS_alarm.h
@@ -1,9 +1,12 @@
#ifndef POKEDIAMOND_ARM7_OS_ALARM_H
#define POKEDIAMOND_ARM7_OS_ALARM_H
+#include "OS_thread.h"
#include "nitro/OS_alarm_shared.h"
void OS_CreateAlarm(OSAlarm *alarm);
+BOOL OS_IsAlarmAvailable(void);
void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg);
+void OS_SetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler, void *arg);
#endif //POKEDIAMOND_ARM7_OS_ALARM_H
diff --git a/arm7/lib/include/PAD_xyButton.h b/arm7/lib/include/PAD_xyButton.h
new file mode 100644
index 00000000..6d8c0d38
--- /dev/null
+++ b/arm7/lib/include/PAD_xyButton.h
@@ -0,0 +1,12 @@
+#ifndef POKEDIAMOND_PAD_XYBUTTON_H
+#define POKEDIAMOND_PAD_XYBUTTON_H
+
+#include "mmap.h"
+#include "nitro/types.h"
+
+#define BUTTON_XY_BUF (*(vu16 *) HW_BUTTON_XY_BUF)
+
+BOOL PAD_InitXYButton(void);
+void PADi_xyButtonAlarmHandler(void);
+
+#endif
diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h
index 1b403dc5..f43b4bc4 100644
--- a/arm7/lib/include/mmap.h
+++ b/arm7/lib/include/mmap.h
@@ -24,6 +24,7 @@
#define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE)
#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM + 0x007ffc3c)
+#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007FFFA8)
#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8)
#endif //POKEDIAMOND_ARM7_MMAP_H
diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h
index 4ef8bdfb..1fb1e9ca 100644
--- a/arm7/lib/include/registers.h
+++ b/arm7/lib/include/registers.h
@@ -3,4 +3,12 @@
#include "nitro/registers_shared.h"
+#define reg_EXTKEYIN (*(REGType16v *)0x4000136)
+
+#define EXTKEYIN_X (1<<0)
+#define EXTKEYIN_Y (1<<1)
+#define EXTKEYIN_DEBUG (1<<3)
+#define EXTKEYIN_PEN (1<<6)
+#define EXTKEYIN_HINGE (1<<7)
+
#endif //POKEDIAMOND_ARM7_REGISTERS_H
diff --git a/arm7/lib/src/PAD_xyButton.c b/arm7/lib/src/PAD_xyButton.c
new file mode 100644
index 00000000..7c3eeac8
--- /dev/null
+++ b/arm7/lib/src/PAD_xyButton.c
@@ -0,0 +1,33 @@
+#include "function_target.h"
+#include "OS_alarm.h"
+#include "OS_tick.h"
+#include "PAD_xyButton.h"
+#include "registers.h"
+
+static BOOL PADi_XYButtonAvailable;
+static OSAlarm PADi_Alarm;
+
+void EXIi_SelectRcnt(u16);
+
+ARM_FUNC BOOL PAD_InitXYButton(void) {
+ OSTick tick;
+ if (!OS_IsTickAvailable() || !OS_IsAlarmAvailable())
+ return FALSE;
+ else if (PADi_XYButtonAvailable)
+ return FALSE;
+ else {
+ OS_CreateAlarm(&PADi_Alarm);
+ tick = OS_GetTick();
+ OS_SetPeriodicAlarm(&PADi_Alarm, tick + 0x82e, 0x82e, (OSAlarmHandler)PADi_xyButtonAlarmHandler, NULL);
+ PADi_XYButtonAvailable = TRUE;
+ return TRUE;
+ }
+}
+
+void PADi_xyButtonAlarmHandler(void) {
+ u16 r4 = 0, r1;
+ EXIi_SelectRcnt(0x8000);
+ r1 = reg_EXTKEYIN;
+ if(r1 & EXTKEYIN_HINGE) r4 = 0x8000;
+ BUTTON_XY_BUF = (u16)(r4 | ((r1 & (EXTKEYIN_X | EXTKEYIN_Y | EXTKEYIN_DEBUG)) << 10));
+}