diff options
-rw-r--r-- | arm9/asm/unk_02000E0C.s | 127 | ||||
-rw-r--r-- | arm9/lib/include/PAD_pad.h | 38 | ||||
-rw-r--r-- | arm9/lib/include/SPI_pm.h | 12 | ||||
-rw-r--r-- | arm9/lib/include/registers.h | 65 | ||||
-rw-r--r-- | arm9/src/main.c | 73 |
5 files changed, 186 insertions, 129 deletions
diff --git a/arm9/asm/unk_02000E0C.s b/arm9/asm/unk_02000E0C.s index 71700146..b13ce736 100644 --- a/arm9/asm/unk_02000E0C.s +++ b/arm9/asm/unk_02000E0C.s @@ -5,133 +5,6 @@ .extern FUN_02000E9C .extern FUN_02000EC8 - thumb_func_start FUN_02000FA4 -FUN_02000FA4: ; 0x02000FA4 - push {r4-r5, lr} - sub sp, #0x1c - add r0, sp, #0xc - add r1, sp, #0x0 - bl FUN_0201265C - ldr r0, _02000FE4 ; =0x021C48B8 - ldr r3, [sp, #0x10] - ldr r4, [r0, #0x2c] - ldr r1, [sp, #0x4] - ldr r0, [sp, #0x8] - ldr r5, [sp, #0x14] - add r0, r1, r0 - lsl r2, r0, #0x18 - ldr r0, [sp, #0x0] - lsl r3, r3, #0x8 - lsl r1, r0, #0x10 - mul r3, r5 - ldr r0, [sp, #0xc] - lsl r3, r3, #0x10 - add r0, r0, r3 - add r0, r1, r0 - add r5, r2, r0 - add r0, r4, r5 - bl FUN_0201BA1C - add r0, r4, r5 - bl FUN_0201B9E0 - add sp, #0x1c - pop {r4-r5, pc} - nop -_02000FE4: .word 0x021C48B8 - - thumb_func_start FUN_02000FE8 -FUN_02000FE8: ; 0x02000FE8 - push {r3-r7, lr} - sub sp, #0x8 - ldr r0, _0200109C ; =0x027FFFA8 - ldrh r1, [r0, #0x0] - mov r0, #0x2 - lsl r0, r0, #0xe - and r0, r1 - asr r0, r0, #0xf - beq _0200107E - ldr r0, _020010A0 ; =0x021C4918 - ldrb r0, [r0, #0x7] - cmp r0, #0x0 - bne _02001064 - bl FUN_0201CE04 - blx CTRDG_IsPulledOut - cmp r0, #0x1 - bne _02001014 - ldr r0, _020010A4 ; =0x02106FA0 - mov r1, #0x1 - str r1, [r0, #0x4] -_02001014: - ldr r6, _020010A4 ; =0x02106FA0 - mov r0, #0xc - ldr r1, [r6, #0x4] - ldr r4, _0200109C ; =0x027FFFA8 - mov r2, #0x10 - add r5, r0, #0x0 - ldr r7, _020010A0 ; =0x021C4918 - orr r5, r2 -_02001024: - ldrb r2, [r7, #0x6] - mov r0, #0xc - cmp r2, #0x0 - beq _02001032 - cmp r1, #0x0 - bne _02001032 - add r0, r5, #0x0 -_02001032: - mov r1, #0x0 - add r2, r1, #0x0 - blx PM_GoSleepMode - blx CARD_IsPulledOut - cmp r0, #0x0 - beq _02001048 - blx PM_ForceToPowerOff - b _0200105C -_02001048: - ldrh r1, [r4, #0x0] - mov r0, #0x2 - lsl r0, r0, #0xe - and r0, r1 - asr r0, r0, #0xf - beq _0200105C - mov r0, #0x1 - str r0, [r6, #0x4] - add r1, r0, #0x0 - b _02001024 -_0200105C: - bl FUN_0201CDD0 - add sp, #0x8 - pop {r3-r7, pc} -_02001064: - add r0, sp, #0x4 - add r1, sp, #0x0 - blx PM_GetBackLight - ldr r0, [sp, #0x4] - cmp r0, #0x1 - bne _02001096 - mov r0, #0x2 - mov r1, #0x0 - blx PM_SetBackLight - add sp, #0x8 - pop {r3-r7, pc} -_0200107E: - add r0, sp, #0x4 - add r1, sp, #0x0 - blx PM_GetBackLight - ldr r0, [sp, #0x4] - cmp r0, #0x0 - bne _02001096 - ldr r1, _020010A4 ; =0x02106FA0 - mov r0, #0x2 - ldr r1, [r1, #0x0] - blx PM_SetBackLight -_02001096: - add sp, #0x8 - pop {r3-r7, pc} - nop -_0200109C: .word 0x027FFFA8 -_020010A0: .word 0x021C4918 -_020010A4: .word 0x02106FA0 - thumb_func_start FUN_020010A8 FUN_020010A8: ; 0x020010A8 push {r3-r7, lr} diff --git a/arm9/lib/include/PAD_pad.h b/arm9/lib/include/PAD_pad.h new file mode 100644 index 00000000..0cb8a6f0 --- /dev/null +++ b/arm9/lib/include/PAD_pad.h @@ -0,0 +1,38 @@ +#ifndef NITRO_PAD_PAD_H_ +#define NITRO_PAD_PAD_H_ + + +//================================================================================ +// BUTTONS + +//---- masked value +#define PAD_PLUS_KEY_MASK 0x00f0 // mask : cross keys +#define PAD_BUTTON_MASK 0x2f0f // mask : buttons +#define PAD_DEBUG_BUTTON_MASK 0x2000 // mask : debug button +#define PAD_ALL_MASK 0x2fff // mask : all buttons +#define PAD_RCNTPORT_MASK 0x2c00 // mask : factors ARM7 can read from RCNT register +#define PAD_KEYPORT_MASK 0x03ff // mask : factors ARM7/9 can read from KEY register + +#define PAD_DETECT_FOLD_MASK 0x8000 // mask : folding + +//---- button and key +#define PAD_BUTTON_A 0x0001 // A +#define PAD_BUTTON_B 0x0002 // B +#define PAD_BUTTON_SELECT 0x0004 // SELECT +#define PAD_BUTTON_START 0x0008 // START +#define PAD_KEY_RIGHT 0x0010 // RIGHT of cross key +#define PAD_KEY_LEFT 0x0020 // LEFT of cross key +#define PAD_KEY_UP 0x0040 // UP of cross key +#define PAD_KEY_DOWN 0x0080 // DOWN of cross key +#define PAD_BUTTON_R 0x0100 // R +#define PAD_BUTTON_L 0x0200 // L +#define PAD_BUTTON_X 0x0400 // X +#define PAD_BUTTON_Y 0x0800 // Y +#define PAD_BUTTON_DEBUG 0x2000 // Debug button + +static inline BOOL PAD_DetectFold(void) +{ + return (BOOL)((*(vu16 *)HW_BUTTON_XY_BUF & PAD_DETECT_FOLD_MASK) >> 15); +} + +#endif //NITRO_PAD_PAD_H_ diff --git a/arm9/lib/include/SPI_pm.h b/arm9/lib/include/SPI_pm.h index 1cf37f02..25fe470a 100644 --- a/arm9/lib/include/SPI_pm.h +++ b/arm9/lib/include/SPI_pm.h @@ -3,6 +3,17 @@ ENUMS_ALWAYS_INT_ON +#define PM_TRIGGER_KEY (1 << 0) +#define PM_TRIGGER_RTC_ALARM (1 << 1) +#define PM_TRIGGER_COVER_OPEN (1 << 2) +#define PM_TRIGGER_CARD (1 << 3) +#define PM_TRIGGER_CARTRIDGE (1 << 4) +typedef u32 PMWakeUpTrigger; + +#define PM_PAD_LOGIC_OR (0 << REG_PAD_KEYCNT_LOGIC_SHIFT) +#define PM_PAD_LOGIC_AND (1 << REG_PAD_KEYCNT_LOGIC_SHIFT) +typedef u32 PMLogic; + typedef enum { PM_BACKLIGHT_OFF = 0, @@ -10,6 +21,7 @@ typedef enum } PMBackLightSwitch; void PM_GetBackLight(PMBackLightSwitch * top, PMBackLightSwitch * bottom); +void PM_GoSleepMode(PMWakeUpTrigger trigger, PMLogic logic, u16 keyPattern); ENUMS_ALWAYS_INT_RESET diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h index a28f9800..d59411e6 100644 --- a/arm9/lib/include/registers.h +++ b/arm9/lib/include/registers.h @@ -107,4 +107,69 @@ ((u32)(a) << REG_PAD_KEYINPUT_A_SHIFT)) #endif +#define REG_PAD_KEYCNT_LOGIC_SHIFT 15 +#define REG_PAD_KEYCNT_LOGIC_SIZE 1 +#define REG_PAD_KEYCNT_LOGIC_MASK 0x8000 + +#define REG_PAD_KEYCNT_INTR_SHIFT 14 +#define REG_PAD_KEYCNT_INTR_SIZE 1 +#define REG_PAD_KEYCNT_INTR_MASK 0x4000 + +#define REG_PAD_KEYCNT_L_SHIFT 9 +#define REG_PAD_KEYCNT_L_SIZE 1 +#define REG_PAD_KEYCNT_L_MASK 0x0200 + +#define REG_PAD_KEYCNT_R_SHIFT 8 +#define REG_PAD_KEYCNT_R_SIZE 1 +#define REG_PAD_KEYCNT_R_MASK 0x0100 + +#define REG_PAD_KEYCNT_DOWN_SHIFT 7 +#define REG_PAD_KEYCNT_DOWN_SIZE 1 +#define REG_PAD_KEYCNT_DOWN_MASK 0x0080 + +#define REG_PAD_KEYCNT_UP_SHIFT 6 +#define REG_PAD_KEYCNT_UP_SIZE 1 +#define REG_PAD_KEYCNT_UP_MASK 0x0040 + +#define REG_PAD_KEYCNT_LEFT_SHIFT 5 +#define REG_PAD_KEYCNT_LEFT_SIZE 1 +#define REG_PAD_KEYCNT_LEFT_MASK 0x0020 + +#define REG_PAD_KEYCNT_RIGHT_SHIFT 4 +#define REG_PAD_KEYCNT_RIGHT_SIZE 1 +#define REG_PAD_KEYCNT_RIGHT_MASK 0x0010 + +#define REG_PAD_KEYCNT_START_SHIFT 3 +#define REG_PAD_KEYCNT_START_SIZE 1 +#define REG_PAD_KEYCNT_START_MASK 0x0008 + +#define REG_PAD_KEYCNT_SEL_SHIFT 2 +#define REG_PAD_KEYCNT_SEL_SIZE 1 +#define REG_PAD_KEYCNT_SEL_MASK 0x0004 + +#define REG_PAD_KEYCNT_B_SHIFT 1 +#define REG_PAD_KEYCNT_B_SIZE 1 +#define REG_PAD_KEYCNT_B_MASK 0x0002 + +#define REG_PAD_KEYCNT_A_SHIFT 0 +#define REG_PAD_KEYCNT_A_SIZE 1 +#define REG_PAD_KEYCNT_A_MASK 0x0001 + +#ifndef SDK_ASM +#define REG_PAD_KEYCNT_FIELD( logic, intr, l, r, down, up, left, right, start, sel, b, a ) \ + (u16)( \ + ((u32)(logic) << REG_PAD_KEYCNT_LOGIC_SHIFT) | \ + ((u32)(intr) << REG_PAD_KEYCNT_INTR_SHIFT) | \ + ((u32)(l) << REG_PAD_KEYCNT_L_SHIFT) | \ + ((u32)(r) << REG_PAD_KEYCNT_R_SHIFT) | \ + ((u32)(down) << REG_PAD_KEYCNT_DOWN_SHIFT) | \ + ((u32)(up) << REG_PAD_KEYCNT_UP_SHIFT) | \ + ((u32)(left) << REG_PAD_KEYCNT_LEFT_SHIFT) | \ + ((u32)(right) << REG_PAD_KEYCNT_RIGHT_SHIFT) | \ + ((u32)(start) << REG_PAD_KEYCNT_START_SHIFT) | \ + ((u32)(sel) << REG_PAD_KEYCNT_SEL_SHIFT) | \ + ((u32)(b) << REG_PAD_KEYCNT_B_SHIFT) | \ + ((u32)(a) << REG_PAD_KEYCNT_A_SHIFT)) +#endif + #endif //POKEDIAMOND_REGISTERS_H diff --git a/arm9/src/main.c b/arm9/src/main.c index 3236fdaa..74d0bfe7 100644 --- a/arm9/src/main.c +++ b/arm9/src/main.c @@ -1,17 +1,22 @@ #include "global.h" #include "main.h" #include "FS_overlay.h" +#include "PAD_pad.h" +#include "CARD_pullOut.h" FS_EXTERN_OVERLAY(MODULE_52); FS_EXTERN_OVERLAY(MODULE_63); -#define SOFT_RESET_KEY (REG_PAD_KEYINPUT_L_MASK | REG_PAD_KEYINPUT_R_MASK | REG_PAD_KEYINPUT_START_MASK | REG_PAD_KEYINPUT_SEL_MASK) +#define SOFT_RESET_KEY (PAD_BUTTON_L | PAD_BUTTON_R | PAD_BUTTON_START | PAD_BUTTON_SELECT) extern struct Unk21C48B8 gUnknown21C48B8; extern struct { s32 unk0; - s32 unk4; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; u8 unk8; } gUnk021C4918; @@ -258,3 +263,67 @@ THUMB_FUNC void FUN_02000F4C(int arg0, int arg1) } FUN_02000F18(arg0); } + +void FUN_02000FA4(void) +{ + struct Unk21C4818 spC; + struct Unk21C4828 sp0; + FUN_0201265C(&spC, &sp0); + { + int r4 = gUnknown21C48B8.unk2C; + int r5 = ((sp0.unk4 + sp0.unk8) << 24) + (spC.unk0 + ((256 * spC.unk4 * spC.unk8) << 16) + (sp0.unk0 << 16)); + FUN_0201BA1C(r4 + r5); + FUN_0201B9E0(r4 + r5); + } +} + +void FUN_02000FE8(void) +{ + PMBackLightSwitch top, bottom; + if (PAD_DetectFold()) + { + if (!gUnk021C4918.unk7) + { + FUN_0201CE04(); + if (CTRDG_IsPulledOut() == TRUE) + { + gBacklightTop.unk4 = 1; + } + { + int r1 = gBacklightTop.unk4; + while (1) + { + PMWakeUpTrigger trigger = PM_TRIGGER_COVER_OPEN | PM_TRIGGER_CARD; + if (gUnk021C4918.unk6 && !r1) + trigger |= PM_TRIGGER_CARTRIDGE; + PM_GoSleepMode(trigger, PM_PAD_LOGIC_OR, 0); + if (CARD_IsPulledOut()) + { + PM_ForceToPowerOff(); + break; + } + else if (PAD_DetectFold()) + { + r1 = gBacklightTop.unk4 = 1; + } + else + break; + } + FUN_0201CDD0(); + return; + } + } + else + { + PM_GetBackLight(&top, &bottom); + if (top == PM_BACKLIGHT_ON) + PM_SetBackLight(2, PM_BACKLIGHT_OFF); + } + } + else + { + PM_GetBackLight(&top, &bottom); + if (top == PM_BACKLIGHT_OFF) + PM_SetBackLight(2, gBacklightTop.unk0); + } +} |