summaryrefslogtreecommitdiff
path: root/arm9/asm/gf_rtc.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/gf_rtc.s')
-rw-r--r--arm9/asm/gf_rtc.s410
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