diff options
Diffstat (limited to 'arm9/asm/gf_rtc.s')
-rw-r--r-- | arm9/asm/gf_rtc.s | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/arm9/asm/gf_rtc.s b/arm9/asm/gf_rtc.s new file mode 100644 index 00000000..a73a4801 --- /dev/null +++ b/arm9/asm/gf_rtc.s @@ -0,0 +1,410 @@ + .include "asm/macros.inc" + .include "global.inc" + + .rodata + + .global sMaxTime +sMaxTime: ; 0x020ED498 + ; 23:59:59 + .word 23, 59, 59 + + .global sMaxDate +sMaxDate: ; 0x020ED4A4 + ; 31 December, 2099 + .word 99, 12, 31, 0 + + .global sGF_DaysPerMonth +sGF_DaysPerMonth: ; 0x020ED4B2 + .short 0 + .short 31 + .short 59 + .short 90 + .short 120 + .short 151 + .short 181 + .short 212 + .short 243 + .short 273 + .short 304 + .short 334 + + .global sTimeOfDayByHour +sTimeOfDayByHour: ; 0x020ED4CC + ; 00:00 - 03:59 + .byte 0x04, 0x04, 0x04, 0x04 + ; 04:00 - 09:59 + .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + ; 10:00 - 16:59 + .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 + ; 17:00 - 19:59 + .byte 0x02, 0x02, 0x02 + ; 20:00 - 23:59 + .byte 0x03, 0x03, 0x03, 0x03 + + .section .bss + + .global sGFRTCWork +sGFRTCWork: ; 0x021C4808 + .space 0x48 + + .text + + thumb_func_start GF_InitRTCWork +GF_InitRTCWork: ; 0x0201259C + push {r3, lr} + bl RTC_Init + ldr r3, _020125CC ; =sGFRTCWork + mov r0, #0x0 + add r2, r3, #0x0 + add r1, r0, #0x0 + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + stmia r2!, {r0-r1} + ldr r1, _020125D0 ; =sGFRTCWork + str r0, [r1, #0x0] + str r0, [r1, #0x4] + str r0, [r1, #0x8] + add r0, r3, #0x0 + bl GF_RTC_GetDateTime + pop {r3, pc} + .balign 4 +_020125CC: .word sGFRTCWork +_020125D0: .word sGFRTCWork + + thumb_func_start GF_RTC_UpdateOnFrame +GF_RTC_UpdateOnFrame: ; 0x020125D4 + push {r3, lr} + ldr r0, _020125F4 ; =sGFRTCWork + ldr r1, [r0, #0x4] + cmp r1, #0x0 + bne _020125F2 + ldr r1, [r0, #0x8] + add r1, r1, #0x1 + str r1, [r0, #0x8] + cmp r1, #0xa + ble _020125F2 + mov r1, #0x0 + str r1, [r0, #0x8] + ldr r0, _020125F8 ; =sGFRTCWork + bl GF_RTC_GetDateTime +_020125F2: + pop {r3, pc} + .balign 4 +_020125F4: .word sGFRTCWork +_020125F8: .word sGFRTCWork + + thumb_func_start GF_RTC_GetDateTime_Callback +GF_RTC_GetDateTime_Callback: ; 0x020125FC + push {r4, lr} + add r4, r1, #0x0 + str r0, [r4, #0xc] + cmp r0, #0x0 + beq _0201260A + bl ErrorHandling +_0201260A: + add r3, r4, #0x0 + mov r0, #0x1 + add r2, r4, #0x0 + add r3, #0x2c + str r0, [r4, #0x0] + ldmia r3!, {r0-r1} + add r2, #0x10 + stmia r2!, {r0-r1} + ldmia r3!, {r0-r1} + stmia r2!, {r0-r1} + add r3, r4, #0x0 + add r3, #0x3c + add r2, r4, #0x0 + ldmia r3!, {r0-r1} + add r2, #0x20 + stmia r2!, {r0-r1} + ldr r0, [r3, #0x0] + str r0, [r2, #0x0] + mov r0, #0x0 + str r0, [r4, #0x4] + pop {r4, pc} + + thumb_func_start GF_RTC_GetDateTime +GF_RTC_GetDateTime: ; 0x02012634 + push {r4, lr} + add r4, r0, #0x0 + mov r0, #0x1 + str r0, [r4, #0x4] + add r0, r4, #0x0 + add r1, r4, #0x0 + ldr r2, _02012658 ; =GF_RTC_GetDateTime_Callback + add r0, #0x2c + add r1, #0x3c + add r3, r4, #0x0 + bl RTC_GetDateTimeAsync + str r0, [r4, #0xc] + cmp r0, #0x0 + beq _02012656 + bl ErrorHandling +_02012656: + pop {r4, pc} + .balign 4 +_02012658: .word GF_RTC_GetDateTime_Callback + + thumb_func_start GF_RTC_CopyDateTime +GF_RTC_CopyDateTime: ; 0x0201265C + push {r3-r5, lr} + add r5, r0, #0x0 + ldr r0, _02012684 ; =sGFRTCWork + add r4, r1, #0x0 + ldr r0, [r0, #0x0] + cmp r0, #0x1 + beq _0201266E + bl ErrorHandling +_0201266E: + ldr r2, _02012688 ; =sGFRTCWork + 16 + ldmia r2!, {r0-r1} + stmia r5!, {r0-r1} + ldmia r2!, {r0-r1} + ldr r2, _0201268C ; =sGFRTCWork + 32 + stmia r5!, {r0-r1} + ldmia r2!, {r0-r1} + stmia r4!, {r0-r1} + ldr r0, [r2, #0x0] + str r0, [r4, #0x0] + pop {r3-r5, pc} + .balign 4 +_02012684: .word sGFRTCWork +_02012688: .word sGFRTCWork + 16 +_0201268C: .word sGFRTCWork + 32 + + thumb_func_start GF_RTC_CopyTime +GF_RTC_CopyTime: ; 0x02012690 + push {r4, lr} + add r4, r0, #0x0 + ldr r0, _020126AC ; =sGFRTCWork + ldr r0, [r0, #0x0] + cmp r0, #0x1 + beq _020126A0 + bl ErrorHandling +_020126A0: + ldr r2, _020126B0 ; =sGFRTCWork + 32 + ldmia r2!, {r0-r1} + stmia r4!, {r0-r1} + ldr r0, [r2, #0x0] + str r0, [r4, #0x0] + pop {r4, pc} + .balign 4 +_020126AC: .word sGFRTCWork +_020126B0: .word sGFRTCWork + 32 + + thumb_func_start GF_RTC_CopyDate +GF_RTC_CopyDate: ; 0x020126B4 + push {r4, lr} + add r4, r0, #0x0 + ldr r0, _020126D0 ; =sGFRTCWork + ldr r0, [r0, #0x0] + cmp r0, #0x1 + beq _020126C4 + bl ErrorHandling +_020126C4: + ldr r2, _020126D4 ; =sGFRTCWork + 16 + ldmia r2!, {r0-r1} + stmia r4!, {r0-r1} + ldmia r2!, {r0-r1} + stmia r4!, {r0-r1} + pop {r4, pc} + .balign 4 +_020126D0: .word sGFRTCWork +_020126D4: .word sGFRTCWork + 16 + + thumb_func_start GF_RTC_TimeToSec +GF_RTC_TimeToSec: ; 0x020126D8 + push {r3-r4} + ldr r4, _020126F8 ; =sGFRTCWork + 32 + mov r0, #0x3c + ldr r1, [r4, #0x4] + ldr r3, [r4, #0x8] + add r2, r1, #0x0 + mul r2, r0 + mov r0, #0xe1 + ldr r1, [r4, #0x0] + lsl r0, r0, #0x4 + mul r0, r1 + add r0, r2, r0 + add r0, r3, r0 + pop {r3-r4} + bx lr + nop +_020126F8: .word sGFRTCWork + 32 + + thumb_func_start GF_RTC_DateTimeToSec +GF_RTC_DateTimeToSec: ; 0x020126FC + ldr r3, _02012704 ; =RTC_ConvertDateTimeToSecond + ldr r0, _02012708 ; =sGFRTCWork + 16 + ldr r1, _0201270C ; =sGFRTCWork + 32 + bx r3 + .balign 4 +_02012704: .word RTC_ConvertDateTimeToSecond +_02012708: .word sGFRTCWork + 16 +_0201270C: .word sGFRTCWork + 32 + + thumb_func_start FUN_02012710 +FUN_02012710: ; 0x02012710 + push {r4-r6, lr} + sub sp, #0x10 + add r5, r0, #0x0 + ldr r2, [r5, #0x4] + ldr r0, _02012778 ; =sGF_DaysPerMonth - 2 + lsl r1, r2, #0x1 + ldrh r0, [r0, r1] + ldr r3, [r5, #0x8] + add r4, r3, r0 + cmp r2, #0x3 + blo _02012752 + ldr r6, [r5, #0x0] + mov r0, #0x1e + lsr r2, r6, #0x1f + lsl r1, r6, #0x1e + sub r1, r1, r2 + ror r1, r0 + add r0, r2, r1 + bne _02012742 + add r0, r6, #0x0 + mov r1, #0x64 + bl _s32_div_f + cmp r1, #0x0 + bne _02012750 +_02012742: + mov r1, #0x19 + add r0, r6, #0x0 + lsl r1, r1, #0x4 + bl _s32_div_f + cmp r1, #0x0 + bne _02012752 +_02012750: + add r4, r4, #0x1 +_02012752: + add r6, r5, #0x0 + add r3, sp, #0x0 + add r2, r3, #0x0 + ldmia r6!, {r0-r1} + stmia r3!, {r0-r1} + ldmia r6!, {r0-r1} + stmia r3!, {r0-r1} + mov r0, #0x1 + str r0, [sp, #0x4] + str r0, [sp, #0x8] + add r0, r2, #0x0 + bl RTC_ConvertDateToDay + add r0, r5, #0x0 + bl RTC_ConvertDateToDay + add r0, r4, #0x0 + add sp, #0x10 + pop {r4-r6, pc} + .balign 4 +_02012778: .word sGF_DaysPerMonth - 2 + + thumb_func_start IsNighttime +IsNighttime: ; 0x0201277C + push {r3, lr} + bl GF_RTC_GetTimeOfDay + cmp r0, #0x3 + beq _0201278A + cmp r0, #0x4 + bne _0201278E +_0201278A: + mov r0, #0x1 + pop {r3, pc} +_0201278E: + mov r0, #0x0 + pop {r3, pc} + .balign 4 + + thumb_func_start GF_RTC_GetTimeOfDay +GF_RTC_GetTimeOfDay: ; 0x02012794 + push {lr} + sub sp, #0xc + add r0, sp, #0x0 + bl GF_RTC_CopyTime + ldr r0, [sp, #0x0] + bl GF_RTC_GetTimeOfDayByHour + add sp, #0xc + pop {pc} + + thumb_func_start GF_RTC_GetTimeOfDayByHour +GF_RTC_GetTimeOfDayByHour: ; 0x020127A8 + push {r4, lr} + add r4, r0, #0x0 + bmi _020127B2 + cmp r4, #0x18 + blt _020127B6 +_020127B2: + bl ErrorHandling +_020127B6: + ldr r0, _020127BC ; =sTimeOfDayByHour + ldrb r0, [r0, r4] + pop {r4, pc} + .balign 4 +_020127BC: .word sTimeOfDayByHour + + thumb_func_start FUN_020127C0 +FUN_020127C0: ; 0x020127C0 + push {r4-r7, lr} + sub sp, #0x24 + add r6, r3, #0x0 + ldr r3, _0201282C ; =sMaxDate + add r4, r0, #0x0 + add r7, r1, #0x0 + add r5, r2, #0x0 + add r2, sp, #0x14 + ldmia r3!, {r0-r1} + str r2, [sp, #0x0] + stmia r2!, {r0-r1} + ldmia r3!, {r0-r1} + stmia r2!, {r0-r1} + ldr r3, _02012830 ; =sMaxTime + add r2, sp, #0x8 + ldmia r3!, {r0-r1} + str r2, [sp, #0x4] + stmia r2!, {r0-r1} + ldr r0, [r3, #0x0] + ldr r1, [sp, #0x4] + str r0, [r2, #0x0] + ldr r0, [sp, #0x0] + bl RTC_ConvertDateTimeToSecond + add r2, r1, #0x0 + add r3, r0, #0x0 + mov r1, #0x0 + ldr r0, _02012834 ; =0xBC19137F + eor r1, r2 + eor r0, r3 + orr r0, r1 + beq _02012804 + bl ErrorHandling +_02012804: + sub r0, r4, r5 + mov r12, r7 + mov r0, r12 + sbc r0, r6 + bge _02012818 + sub r0, r5, r4 + sbc r6, r7 + add sp, #0x24 + add r1, r6, #0x0 + pop {r4-r7, pc} +_02012818: + ldr r0, _02012834 ; =0xBC19137F + mov r1, #0x0 + sub r0, r0, r4 + sbc r1, r7 + add r0, r5, r0 + adc r6, r1 + add r1, r6, #0x0 + add sp, #0x24 + pop {r4-r7, pc} + nop +_0201282C: .word sMaxDate +_02012830: .word sMaxTime +_02012834: .word 0xBC19137F |