summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/clock.s10
-rw-r--r--asm/main_menu.s2
-rw-r--r--asm/new_game.s2
-rw-r--r--asm/pokemon_3.s8
-rw-r--r--asm/reset_rtc_screen.s16
-rw-r--r--asm/rom6.s10
-rw-r--r--asm/rom_8184DA4.s10
-rw-r--r--asm/roulette.s10
-rw-r--r--asm/rtc.s819
-rw-r--r--asm/scrcmd.s6
-rw-r--r--asm/tv.s2
-rw-r--r--asm/wallclock.s6
-rw-r--r--data/rtc.inc4
-rw-r--r--include/global.h11
-rw-r--r--include/pokemon.h7
-rw-r--r--include/rtc.h2
-rw-r--r--ld_script.txt2
-rw-r--r--src/rtc.c329
-rw-r--r--sym_bss.txt8
-rw-r--r--sym_common.txt2
20 files changed, 396 insertions, 870 deletions
diff --git a/asm/clock.s b/asm/clock.s
index c0a94d090..9a40213f5 100644
--- a/asm/clock.s
+++ b/asm/clock.s
@@ -10,11 +10,11 @@ sub_809E778: @ 809E778
push {lr}
ldr r0, =0x00000895
bl FlagSet
- bl GameFreakRTC_CalcLocalDateTime
+ bl RtcCalcLocalTime
ldr r0, =gSaveBlock2Ptr
ldr r2, [r0]
adds r2, 0xA0
- ldr r3, =gUnknown_03005CF8
+ ldr r3, =gLocalTime
ldr r0, [r3]
ldr r1, [r3, 0x4]
str r0, [r2]
@@ -39,8 +39,8 @@ sub_809E7B0: @ 809E7B0
lsls r0, 24
cmp r0, 0
bne _0809E7DA
- bl GameFreakRTC_CalcLocalDateTime
- ldr r4, =gUnknown_03005CF8
+ bl RtcCalcLocalTime
+ ldr r4, =gLocalTime
adds r0, r4, 0
bl sub_809E7E8
adds r0, r4, 0
@@ -111,7 +111,7 @@ sub_809E858: @ 809E858
adds r1, 0xA0
mov r0, sp
adds r2, r5, 0
- bl GameFreakRTC_GetDelta
+ bl CalcTimeDifference
mov r0, sp
movs r2, 0
ldrsh r1, [r0, r2]
diff --git a/asm/main_menu.s b/asm/main_menu.s
index 2709edfc4..559c351ef 100644
--- a/asm/main_menu.s
+++ b/asm/main_menu.s
@@ -479,7 +479,7 @@ Task_MainMenuCheckBattery: @ 802FAB0
movs r0, 0x54
movs r1, 0x7
bl SetGpuReg
- bl GameFreakRTC_GetErrorFlags
+ bl RtcGetErrorStatus
movs r1, 0xFF
lsls r1, 4
ands r1, r0
diff --git a/asm/new_game.s b/asm/new_game.s
index 732ea5837..3faf99744 100644
--- a/asm/new_game.s
+++ b/asm/new_game.s
@@ -256,7 +256,7 @@ NewGameInitData: @ 80844A0
cmp r0, 0x2
bne _080844B2
_080844AE:
- bl GameFreakRTC_Reset
+ bl RtcReset
_080844B2:
ldr r1, =gUnknown_020322D4
movs r0, 0x1
diff --git a/asm/pokemon_3.s b/asm/pokemon_3.s
index 6b02a99de..ca77a64a4 100644
--- a/asm/pokemon_3.s
+++ b/asm/pokemon_3.s
@@ -2507,8 +2507,8 @@ _0806D1DC:
adds r0, r3
b _0806D228
_0806D1E6:
- bl GameFreakRTC_CalcLocalDateTime
- ldr r0, =gUnknown_03005CF8
+ bl RtcCalcLocalTime
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
subs r0, 0xC
lsls r0, 24
@@ -2525,8 +2525,8 @@ _0806D202:
b _0806D21E
.pool
_0806D208:
- bl GameFreakRTC_CalcLocalDateTime
- ldr r0, =gUnknown_03005CF8
+ bl RtcCalcLocalTime
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
cmp r0, 0xB
bls _0806D216
diff --git a/asm/reset_rtc_screen.s b/asm/reset_rtc_screen.s
index 92658d4b8..06fba72d5 100644
--- a/asm/reset_rtc_screen.s
+++ b/asm/reset_rtc_screen.s
@@ -707,7 +707,7 @@ _0809EE66:
ands r0, r1
cmp r0, 0
beq _0809EEF4
- ldr r1, =gUnknown_03005CF8
+ ldr r1, =gLocalTime
ldrh r0, [r5, 0x6]
strh r0, [r1]
ldrh r0, [r5, 0x8]
@@ -787,7 +787,7 @@ sub_809EF00: @ 809EF00
adds r5, r6, r0
movs r0, 0
strh r0, [r5]
- ldr r1, =gUnknown_03005CF8
+ ldr r1, =gLocalTime
ldrh r0, [r1]
strh r0, [r5, 0x6]
movs r0, 0x2
@@ -1021,7 +1021,7 @@ _0809F11C:
movs r1, 0x1
movs r3, 0
bl Print
- ldr r1, =gUnknown_03005CF8
+ ldr r1, =gLocalTime
ldrh r3, [r1]
ldrb r0, [r1, 0x2]
str r0, [sp]
@@ -1168,7 +1168,7 @@ _0809F282:
b _0809F404
.pool
_0809F29C:
- bl GameFreakRTC_CalcLocalDateTime
+ bl RtcCalcLocalTime
ldr r0, =sub_809F0F8
movs r1, 0x50
bl CreateTask
@@ -1195,7 +1195,7 @@ _0809F2CA:
bl sub_8198070
ldr r0, =gUnknown_085ECA38
bl sub_809F0C0
- ldr r2, =gUnknown_03005CF8
+ ldr r2, =gLocalTime
ldr r0, =gSaveBlock2Ptr
ldr r0, [r0]
adds r0, 0xA0
@@ -1239,8 +1239,8 @@ _0809F334:
_0809F340:
ldrb r0, [r5, 0x2]
bl DestroyTask
- bl GameFreakRTC_Reset
- ldr r4, =gUnknown_03005CF8
+ bl RtcReset
+ ldr r4, =gLocalTime
movs r1, 0
ldrsh r0, [r4, r1]
movs r1, 0x2
@@ -1249,7 +1249,7 @@ _0809F340:
ldrsb r2, [r4, r2]
movs r3, 0x4
ldrsb r3, [r4, r3]
- bl GameFreakRTC_CalcRTCToLocalDelta
+ bl RtcCalcLocalTimeOffset
ldr r0, =gSaveBlock2Ptr
ldr r2, [r0]
adds r2, 0xA0
diff --git a/asm/rom6.s b/asm/rom6.s
index 2907db9e2..e192a4738 100644
--- a/asm/rom6.s
+++ b/asm/rom6.s
@@ -4321,9 +4321,9 @@ sub_8137988: @ 8137988
lsls r0, 24
cmp r0, 0
beq _081379CE
- bl GameFreakRTC_CalcLocalDateTime
+ bl RtcCalcLocalTime
ldr r1, =gUnknown_085B2B44
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
lsls r0, 24
asrs r0, 24
@@ -6517,7 +6517,7 @@ sub_8138BC8: @ 8138BC8
thumb_func_start sub_8138BDC
sub_8138BDC: @ 8138BDC
push {lr}
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
movs r1, 0
ldrsh r0, [r0, r1]
movs r1, 0x7
@@ -7960,7 +7960,7 @@ sub_813970C: @ 813970C
lsls r0, 16
lsrs r0, 16
adds r3, r0, 0
- ldr r2, =gUnknown_03005CF8
+ ldr r2, =gLocalTime
movs r1, 0
ldrsh r0, [r2, r1]
subs r0, r3
@@ -7993,7 +7993,7 @@ _0813974C:
sub_8139754: @ 8139754
push {r4,lr}
ldr r0, =0x000040c2
- ldr r4, =gUnknown_03005CF8
+ ldr r4, =gLocalTime
ldrh r1, [r4]
bl VarSet
ldrh r0, [r4]
diff --git a/asm/rom_8184DA4.s b/asm/rom_8184DA4.s
index a84ea33d8..dcbad8efb 100644
--- a/asm/rom_8184DA4.s
+++ b/asm/rom_8184DA4.s
@@ -31564,8 +31564,8 @@ _08195E06:
thumb_func_start sub_8195E10
sub_8195E10: @ 8195E10
push {lr}
- bl GameFreakRTC_CalcLocalDateTime
- ldr r0, =gUnknown_03005CF8
+ bl RtcCalcLocalTime
+ ldr r0, =gLocalTime
bl sub_8195E34
ldr r1, =gUnknown_0203CD80
adds r0, 0xA
@@ -31602,8 +31602,8 @@ sub_8195E34: @ 8195E34
thumb_func_start sub_8195E58
sub_8195E58: @ 8195E58
push {lr}
- bl GameFreakRTC_CalcLocalDateTime
- ldr r0, =gUnknown_03005CF8
+ bl RtcCalcLocalTime
+ ldr r0, =gLocalTime
bl sub_8195E34
adds r1, r0, 0
ldr r2, =gUnknown_0203CD80
@@ -33538,7 +33538,7 @@ sub_8196D74: @ 8196D74
bl sub_8196D4C
cmp r0, 0x4
ble _08196DF4
- bl GameFreakRTC_GetNumDays
+ bl RtcGetLocalDayCount
adds r4, r0, 0
ldr r0, =gSaveBlock2Ptr
ldr r0, [r0]
diff --git a/asm/roulette.s b/asm/roulette.s
index b09ce9f38..a0edead88 100644
--- a/asm/roulette.s
+++ b/asm/roulette.s
@@ -383,7 +383,7 @@ _081405B6:
lsrs r4, r0, 24
cmp r4, 0x5
bls _0814056C
- bl GameFreakRTC_CalcLocalDateTime
+ bl RtcCalcLocalTime
add sp, 0x8
pop {r4-r6}
pop {r0}
@@ -1770,7 +1770,7 @@ _081411AC:
beq _08141214
b _08141280
_081411B2:
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
subs r0, 0x4
lsls r0, 24
@@ -1817,7 +1817,7 @@ _08141200:
b _0814133A
.pool
_08141214:
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
subs r0, 0x4
lsls r0, 24
@@ -1868,7 +1868,7 @@ _08141268:
b _0814133A
.pool
_08141280:
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
subs r0, 0x4
lsls r0, 24
@@ -2020,7 +2020,7 @@ sub_8141344: @ 8141344
subs r0, r4
lsls r0, 24
lsrs r4, r0, 24
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
lsls r0, 24
asrs r0, 24
diff --git a/asm/rtc.s b/asm/rtc.s
index 22b0f1ddc..e69de29bb 100644
--- a/asm/rtc.s
+++ b/asm/rtc.s
@@ -1,819 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start GameFreakRTC_ClearIME
-@ void GameFreakRTC_ClearIME()
-GameFreakRTC_ClearIME: @ 802F0CC
- ldr r2, =gUnknown_03000DCE
- ldr r1, =0x04000208
- ldrh r0, [r1]
- strh r0, [r2]
- movs r0, 0
- strh r0, [r1]
- bx lr
- .pool
- thumb_func_end GameFreakRTC_ClearIME
-
- thumb_func_start GameFreakRTC_RestoreIME
-@ void GameFreakRTC_RestoreIME()
-GameFreakRTC_RestoreIME: @ 802F0E4
- ldr r0, =0x04000208
- ldr r1, =gUnknown_03000DCE
- ldrh r1, [r1]
- strh r1, [r0]
- bx lr
- .pool
- thumb_func_end GameFreakRTC_RestoreIME
-
- thumb_func_start GameFreakRTC_ConvertFromBCD
-@ u8 GameFreakRTC_ConvertFromBCD(u8 bcdByte)
-GameFreakRTC_ConvertFromBCD: @ 802F0F8
- push {lr}
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0x9F
- bhi _0802F10A
- movs r3, 0xF
- ands r3, r2
- cmp r3, 0x9
- bls _0802F10E
-_0802F10A:
- movs r0, 0xFF
- b _0802F11C
-_0802F10E:
- lsrs r1, r0, 28
- movs r0, 0xF
- ands r1, r0
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 1
- adds r0, r3
-_0802F11C:
- pop {r1}
- bx r1
- thumb_func_end GameFreakRTC_ConvertFromBCD
-
- thumb_func_start GameFreakRTC_IsLeapYear
-@ bool8 GameFreakRTC_IsLeapYear(u32 year)
-GameFreakRTC_IsLeapYear: @ 802F120
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x3
- ands r0, r4
- cmp r0, 0
- bne _0802F138
- adds r0, r4, 0
- movs r1, 0x64
- bl __umodsi3
- cmp r0, 0
- bne _0802F146
-_0802F138:
- movs r1, 0xC8
- lsls r1, 1
- adds r0, r4, 0
- bl __umodsi3
- cmp r0, 0
- bne _0802F14A
-_0802F146:
- movs r0, 0x1
- b _0802F14C
-_0802F14A:
- movs r0, 0
-_0802F14C:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GameFreakRTC_IsLeapYear
-
- thumb_func_start GameFreakRTC_ConvertYearMonthDayToNumDays
-@ u16 GameFreakRTC_ConvertYearMonthDayToNumDays(u8 year, u8 month, u8 dayOfMonth)
-GameFreakRTC_ConvertYearMonthDayToNumDays: @ 802F154
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- lsls r0, 24
- lsrs r7, r0, 24
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r2, 24
- mov r8, r2
- movs r5, 0
- subs r4, r7, 0x1
- cmp r4, 0
- blt _0802F192
-_0802F170:
- ldr r1, =0x0000016d
- adds r0, r5, r1
- lsls r0, 16
- lsrs r5, r0, 16
- adds r0, r4, 0
- bl GameFreakRTC_IsLeapYear
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _0802F18C
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
-_0802F18C:
- subs r4, 0x1
- cmp r4, 0
- bge _0802F170
-_0802F192:
- subs r0, r6, 0x1
- cmp r0, 0
- ble _0802F1AA
- ldr r1, =gDaysInEachMonth
- adds r4, r0, 0
-_0802F19C:
- ldm r1!, {r0}
- adds r0, r5, r0
- lsls r0, 16
- lsrs r5, r0, 16
- subs r4, 0x1
- cmp r4, 0
- bne _0802F19C
-_0802F1AA:
- cmp r6, 0x2
- bls _0802F1C2
- adds r0, r7, 0
- bl GameFreakRTC_IsLeapYear
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _0802F1C2
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
-_0802F1C2:
- mov r1, r8
- adds r0, r5, r1
- lsls r0, 16
- lsrs r5, r0, 16
- adds r0, r5, 0
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .pool
- thumb_func_end GameFreakRTC_ConvertYearMonthDayToNumDays
-
- thumb_func_start GameFreakRTC_GetNumDaysInternal
-@ u16 GameFreakRTC_GetNumDaysInternal(struct RTCInfo *rtc)
-GameFreakRTC_GetNumDaysInternal: @ 802F1E0
- push {r4-r6,lr}
- adds r6, r0, 0
- ldrb r0, [r6]
- bl GameFreakRTC_ConvertFromBCD
- adds r5, r0, 0
- lsls r5, 24
- lsrs r5, 24
- ldrb r0, [r6, 0x1]
- bl GameFreakRTC_ConvertFromBCD
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- ldrb r0, [r6, 0x2]
- bl GameFreakRTC_ConvertFromBCD
- adds r2, r0, 0
- lsls r2, 24
- lsrs r2, 24
- adds r0, r5, 0
- adds r1, r4, 0
- bl GameFreakRTC_ConvertYearMonthDayToNumDays
- lsls r0, 16
- lsrs r0, 16
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end GameFreakRTC_GetNumDaysInternal
-
- thumb_func_start RtcInit
-@ void GameFreakRTC_Init()
-RtcInit: @ 802F21C
- push {r4,r5,lr}
- ldr r5, =gUnknown_03000DB8
- movs r0, 0
- strh r0, [r5]
- bl GameFreakRTC_ClearIME
- bl SiiRtcUnprotect
- bl SiiRtcProbe
- ldr r4, =gUnknown_03000DCC
- strb r0, [r4]
- bl GameFreakRTC_RestoreIME
- ldrb r4, [r4]
- movs r0, 0xF
- ands r0, r4
- cmp r0, 0x1
- beq _0802F250
- movs r0, 0x1
- strh r0, [r5]
- b _0802F26E
- .pool
-_0802F250:
- movs r0, 0xF0
- ands r0, r4
- cmp r0, 0
- beq _0802F25A
- movs r0, 0x2
-_0802F25A:
- strh r0, [r5]
- ldr r4, =gUnknown_03000DC0
- adds r0, r4, 0
- bl GameFreakRTC_GetControlRegAndRTCDateTime
- adds r0, r4, 0
- bl GameFreakRTC_TestForErrors
- ldr r1, =gUnknown_03000DB8
- strh r0, [r1]
-_0802F26E:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end RtcInit
-
- thumb_func_start GameFreakRTC_GetErrorFlags
-@ u16 GameFreakRTC_GetErrorFlags()
-GameFreakRTC_GetErrorFlags: @ 802F27C
- ldr r0, =gUnknown_03000DB8
- ldrh r0, [r0]
- bx lr
- .pool
- thumb_func_end GameFreakRTC_GetErrorFlags
-
- thumb_func_start GameFreakRTC_GetRTCDateTime
-@ void GameFreakRTC_GetRTCDateTime(struct RTCInfo *rtc)
-GameFreakRTC_GetRTCDateTime: @ 802F288
- push {r4,lr}
- adds r2, r0, 0
- ldr r0, =gUnknown_03000DB8
- ldrh r1, [r0]
- movs r0, 0xFF
- lsls r0, 4
- ands r0, r1
- cmp r0, 0
- beq _0802F2AC
- adds r1, r2, 0
- ldr r0, =gDefaultRTCInfo
- ldm r0!, {r2-r4}
- stm r1!, {r2-r4}
- b _0802F2B2
- .pool
-_0802F2AC:
- adds r0, r2, 0
- bl GameFreakRTC_GetControlRegAndRTCDateTime
-_0802F2B2:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_GetRTCDateTime
-
- thumb_func_start GameFreakRTC_GetRTCDateTimeInternal
-@ void GameFreakRTC_GetRTCDateTimeInternal(struct RTCInfo *rtc)
-GameFreakRTC_GetRTCDateTimeInternal: @ 802F2B8
- push {r4,lr}
- adds r4, r0, 0
- bl GameFreakRTC_ClearIME
- adds r0, r4, 0
- bl SiiRtcGetDateTime
- bl GameFreakRTC_RestoreIME
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_GetRTCDateTimeInternal
-
- thumb_func_start GameFreakRTC_GetControlReg
-@ void GameFreakRTC_GetControlReg(struct RTCInfo *rtc)
-GameFreakRTC_GetControlReg: @ 802F2D0
- push {r4,lr}
- adds r4, r0, 0
- bl GameFreakRTC_ClearIME
- adds r0, r4, 0
- bl SiiRtcGetStatus
- bl GameFreakRTC_RestoreIME
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_GetControlReg
-
- thumb_func_start GameFreakRTC_GetControlRegAndRTCDateTime
-@ void GameFreakRTC_GetControlRegAndRTCDateTime(struct RTCInfo *rtc)
-GameFreakRTC_GetControlRegAndRTCDateTime: @ 802F2E8
- push {r4,lr}
- adds r4, r0, 0
- bl GameFreakRTC_GetControlReg
- adds r0, r4, 0
- bl GameFreakRTC_GetRTCDateTimeInternal
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_GetControlRegAndRTCDateTime
-
- thumb_func_start GameFreakRTC_TestForErrors
-@ u16 GameFreakRTC_TestForErrors(struct RTCInfo *rtc)
-GameFreakRTC_TestForErrors: @ 802F2FC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r7, r0, 0
- ldrb r1, [r7, 0x7]
- movs r0, 0x80
- ands r0, r1
- lsls r0, 24
- lsrs r0, 24
- negs r0, r0
- asrs r4, r0, 31
- movs r0, 0x20
- ands r4, r0
- movs r0, 0x40
- ands r0, r1
- cmp r0, 0
- bne _0802F322
- movs r0, 0x10
- orrs r4, r0
-_0802F322:
- ldrb r0, [r7]
- bl GameFreakRTC_ConvertFromBCD
- mov r8, r0
- cmp r0, 0xFF
- bne _0802F336
- movs r0, 0x40
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F336:
- ldrb r0, [r7, 0x1]
- bl GameFreakRTC_ConvertFromBCD
- adds r6, r0, 0
- cmp r6, 0xFF
- beq _0802F34A
- cmp r6, 0
- beq _0802F34A
- cmp r6, 0xC
- ble _0802F352
-_0802F34A:
- movs r0, 0x80
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F352:
- ldrb r0, [r7, 0x2]
- bl GameFreakRTC_ConvertFromBCD
- adds r5, r0, 0
- cmp r5, 0xFF
- bne _0802F36A
- movs r1, 0x80
- lsls r1, 1
- adds r0, r1, 0
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F36A:
- cmp r6, 0x2
- bne _0802F384
- mov r0, r8
- bl GameFreakRTC_IsLeapYear
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gDaysInEachMonth
- ldr r1, [r1, 0x4]
- adds r0, r1
- b _0802F38E
- .pool
-_0802F384:
- ldr r0, =gDaysInEachMonth
- subs r1, r6, 0x1
- lsls r1, 2
- adds r1, r0
- ldr r0, [r1]
-_0802F38E:
- cmp r5, r0
- ble _0802F39E
- movs r1, 0x80
- lsls r1, 1
- adds r0, r1, 0
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F39E:
- ldrb r0, [r7, 0x4]
- bl GameFreakRTC_ConvertFromBCD
- adds r5, r0, 0
- cmp r5, 0x18
- ble _0802F3B6
- movs r1, 0x80
- lsls r1, 2
- adds r0, r1, 0
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F3B6:
- ldrb r0, [r7, 0x5]
- bl GameFreakRTC_ConvertFromBCD
- adds r5, r0, 0
- cmp r5, 0x3C
- ble _0802F3CE
- movs r1, 0x80
- lsls r1, 3
- adds r0, r1, 0
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F3CE:
- ldrb r0, [r7, 0x6]
- bl GameFreakRTC_ConvertFromBCD
- adds r5, r0, 0
- cmp r5, 0x3C
- ble _0802F3E6
- movs r1, 0x80
- lsls r1, 4
- adds r0, r1, 0
- orrs r4, r0
- lsls r0, r4, 16
- lsrs r4, r0, 16
-_0802F3E6:
- adds r0, r4, 0
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .pool
- thumb_func_end GameFreakRTC_TestForErrors
-
- thumb_func_start GameFreakRTC_Reset
-@ void GameFreakRTC_Reset()
-GameFreakRTC_Reset: @ 802F3F8
- push {lr}
- bl GameFreakRTC_ClearIME
- bl SiiRtcReset
- bl GameFreakRTC_RestoreIME
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_Reset
-
- thumb_func_start GameFreakRTC_FormatDecimalTimeString
-@ void GameFreakRTC_FormatDecimalTimeString(u8 *dest, s32 hour, s32 minute, s32 second)
-GameFreakRTC_FormatDecimalTimeString: @ 802F40C
- push {r4-r6,lr}
- adds r5, r2, 0
- adds r6, r3, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- movs r4, 0xF0
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r5, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r6, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- movs r1, 0xFF
- strb r1, [r0]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_FormatDecimalTimeString
-
- thumb_func_start GameFreakRTC_FormatHexTimeString
-@ void GameFreakRTC_FormatHexTimeString(u8 *dest, s32 hour, s32 minute, s32 second)
-GameFreakRTC_FormatHexTimeString: @ 802F444
- push {r4-r6,lr}
- adds r5, r2, 0
- adds r6, r3, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToHexStringN
- movs r4, 0xF0
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r5, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToHexStringN
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r6, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToHexStringN
- movs r1, 0xFF
- strb r1, [r0]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_FormatHexTimeString
-
- thumb_func_start GameFreakRTC_FormatHexTimeStringFromRTCInfo
-@ void GameFreakRTC_FormatHexTimeStringFromRTCInfo()
-GameFreakRTC_FormatHexTimeStringFromRTCInfo: @ 802F47C
- push {lr}
- ldr r3, =gUnknown_03000DC0
- ldrb r1, [r3, 0x4]
- ldrb r2, [r3, 0x5]
- ldrb r3, [r3, 0x6]
- bl GameFreakRTC_FormatHexTimeString
- pop {r0}
- bx r0
- .pool
- thumb_func_end GameFreakRTC_FormatHexTimeStringFromRTCInfo
-
- thumb_func_start GameFreakRTC_FormatDecimalYearMonthDayString
-@ void GameFreakRTC_FormatDecimalYearMonthDayString(u8 *dest, s32 year, s32 month, s32 dayOfMonth)
-GameFreakRTC_FormatDecimalYearMonthDayString: @ 802F494
- push {r4-r6,lr}
- adds r5, r2, 0
- adds r6, r3, 0
- movs r2, 0x2
- movs r3, 0x4
- bl ConvertIntToDecimalStringN
- movs r4, 0xAE
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r5, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r6, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- movs r1, 0xFF
- strb r1, [r0]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_FormatDecimalYearMonthDayString
-
- thumb_func_start GameFreakRTC_FormatHexYearMonthDayString
-@ void GameFreakRTC_FormatHexYearMonthDayString(u8 *dest, s32 year, s32 month, s32 dayOfMonth)
-GameFreakRTC_FormatHexYearMonthDayString: @ 802F4CC
- push {r4-r6,lr}
- adds r5, r2, 0
- adds r6, r3, 0
- movs r2, 0x2
- movs r3, 0x4
- bl ConvertIntToHexStringN
- movs r4, 0xAE
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r5, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToHexStringN
- strb r4, [r0]
- adds r0, 0x1
- adds r1, r6, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToHexStringN
- movs r1, 0xFF
- strb r1, [r0]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_FormatHexYearMonthDayString
-
- thumb_func_start GameFreakRTC_GetRTCDelta
-@ void GameFreakRTC_GetRTCDelta(RTCInfo *rtc, GameDateTime *delta, GameDateTime *dateTime)
-GameFreakRTC_GetRTCDelta: @ 802F504
- push {r4-r7,lr}
- adds r5, r0, 0
- adds r7, r1, 0
- adds r6, r2, 0
- bl GameFreakRTC_GetNumDaysInternal
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- ldrb r0, [r5, 0x6]
- bl GameFreakRTC_ConvertFromBCD
- ldrb r1, [r6, 0x4]
- subs r0, r1
- strb r0, [r7, 0x4]
- ldrb r0, [r5, 0x5]
- bl GameFreakRTC_ConvertFromBCD
- ldrb r1, [r6, 0x3]
- subs r0, r1
- strb r0, [r7, 0x3]
- ldrb r0, [r5, 0x4]
- bl GameFreakRTC_ConvertFromBCD
- ldrb r1, [r6, 0x2]
- subs r0, r1
- strb r0, [r7, 0x2]
- ldrh r0, [r6]
- subs r4, r0
- strh r4, [r7]
- ldrb r1, [r7, 0x4]
- movs r0, 0x4
- ldrsb r0, [r7, r0]
- cmp r0, 0
- bge _0802F556
- adds r0, r1, 0
- adds r0, 0x3C
- strb r0, [r7, 0x4]
- ldrb r0, [r7, 0x3]
- subs r0, 0x1
- strb r0, [r7, 0x3]
-_0802F556:
- ldrb r1, [r7, 0x3]
- movs r0, 0x3
- ldrsb r0, [r7, r0]
- cmp r0, 0
- bge _0802F56C
- adds r0, r1, 0
- adds r0, 0x3C
- strb r0, [r7, 0x3]
- ldrb r0, [r7, 0x2]
- subs r0, 0x1
- strb r0, [r7, 0x2]
-_0802F56C:
- ldrb r1, [r7, 0x2]
- movs r0, 0x2
- ldrsb r0, [r7, r0]
- cmp r0, 0
- bge _0802F582
- adds r0, r1, 0
- adds r0, 0x18
- strb r0, [r7, 0x2]
- ldrh r0, [r7]
- subs r0, 0x1
- strh r0, [r7]
-_0802F582:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_GetRTCDelta
-
- thumb_func_start GameFreakRTC_CalcLocalDateTime
-@ void GameFreakRTC_CalcLocalDateTime()
-GameFreakRTC_CalcLocalDateTime: @ 802F588
- push {r4,lr}
- ldr r4, =gUnknown_03000DC0
- adds r0, r4, 0
- bl GameFreakRTC_GetRTCDateTime
- ldr r1, =gUnknown_03005CF8
- ldr r0, =gSaveBlock2Ptr
- ldr r2, [r0]
- adds r2, 0x98
- adds r0, r4, 0
- bl GameFreakRTC_GetRTCDelta
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end GameFreakRTC_CalcLocalDateTime
-
- thumb_func_start GameFreakRTC_CalcRTCToLocalDelta_DayZero
-@ void GameFreakRTC_CalcRTCToLocalDelta_DayZero(u8 hour, u8 minute)
-GameFreakRTC_CalcRTCToLocalDelta_DayZero: @ 802F5B4
- push {lr}
- adds r3, r0, 0
- adds r2, r1, 0
- movs r0, 0
- adds r1, r3, 0
- movs r3, 0
- bl GameFreakRTC_CalcRTCToLocalDelta
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_CalcRTCToLocalDelta_DayZero
-
- thumb_func_start GameFreakRTC_CalcRTCToLocalDelta
-@ void GameFreakRTC_CalcRTCToLocalDelta(u16 numDays, u8 hour, u8 minute, u8 second)
-GameFreakRTC_CalcRTCToLocalDelta: @ 802F5C8
- push {r4,r5,lr}
- ldr r4, =gUnknown_03005CF8
- strh r0, [r4]
- strb r1, [r4, 0x2]
- strb r2, [r4, 0x3]
- strb r3, [r4, 0x4]
- ldr r5, =gUnknown_03000DC0
- adds r0, r5, 0
- bl GameFreakRTC_GetRTCDateTime
- ldr r0, =gSaveBlock2Ptr
- ldr r1, [r0]
- adds r1, 0x98
- adds r0, r5, 0
- adds r2, r4, 0
- bl GameFreakRTC_GetRTCDelta
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end GameFreakRTC_CalcRTCToLocalDelta
-
- thumb_func_start GameFreakRTC_GetDelta
-@ void GameFreakRTC_GetDelta(GameDateTime *delta, GameDateTime *dateTime1, GameDateTime *dateTime2)
-GameFreakRTC_GetDelta: @ 802F5FC
- push {r4-r6,lr}
- adds r4, r0, 0
- ldrb r3, [r2, 0x4]
- ldrb r0, [r1, 0x4]
- subs r5, r3, r0
- strb r5, [r4, 0x4]
- ldrb r3, [r2, 0x3]
- ldrb r0, [r1, 0x3]
- subs r6, r3, r0
- strb r6, [r4, 0x3]
- ldrb r0, [r2, 0x2]
- ldrb r3, [r1, 0x2]
- subs r0, r3
- strb r0, [r4, 0x2]
- ldrh r0, [r2]
- ldrh r1, [r1]
- subs r0, r1
- strh r0, [r4]
- lsls r0, r5, 24
- cmp r0, 0
- bge _0802F630
- adds r0, r5, 0
- adds r0, 0x3C
- strb r0, [r4, 0x4]
- subs r0, r6, 0x1
- strb r0, [r4, 0x3]
-_0802F630:
- ldrb r1, [r4, 0x3]
- movs r0, 0x3
- ldrsb r0, [r4, r0]
- cmp r0, 0
- bge _0802F646
- adds r0, r1, 0
- adds r0, 0x3C
- strb r0, [r4, 0x3]
- ldrb r0, [r4, 0x2]
- subs r0, 0x1
- strb r0, [r4, 0x2]
-_0802F646:
- ldrb r1, [r4, 0x2]
- movs r0, 0x2
- ldrsb r0, [r4, r0]
- cmp r0, 0
- bge _0802F65C
- adds r0, r1, 0
- adds r0, 0x18
- strb r0, [r4, 0x2]
- ldrh r0, [r4]
- subs r0, 0x1
- strh r0, [r4]
-_0802F65C:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end GameFreakRTC_GetDelta
-
- thumb_func_start GameFreakRTC_GetNumMinutes
-@ u16 GameFreakRTC_GetNumMinutes()
-GameFreakRTC_GetNumMinutes: @ 802F664
- push {r4,lr}
- ldr r4, =gUnknown_03000DC0
- adds r0, r4, 0
- bl GameFreakRTC_GetRTCDateTime
- adds r0, r4, 0
- bl GameFreakRTC_GetNumDaysInternal
- lsls r0, 16
- lsrs r0, 16
- lsls r1, r0, 1
- adds r1, r0
- lsls r0, r1, 4
- subs r0, r1
- lsls r0, 5
- ldrb r2, [r4, 0x4]
- lsls r1, r2, 4
- subs r1, r2
- lsls r1, 2
- adds r0, r1
- ldrb r4, [r4, 0x5]
- adds r0, r4
- pop {r4}
- pop {r1}
- bx r1
- .pool
- thumb_func_end GameFreakRTC_GetNumMinutes
-
- thumb_func_start GameFreakRTC_GetNumDays
-@ u16 GameFreakRTC_GetNumDays()
-GameFreakRTC_GetNumDays: @ 802F69C
- push {lr}
- ldr r0, =gUnknown_03000DC0
- bl GameFreakRTC_GetNumDaysInternal
- lsls r0, 16
- lsrs r0, 16
- pop {r1}
- bx r1
- .pool
- thumb_func_end GameFreakRTC_GetNumDays
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/scrcmd.s b/asm/scrcmd.s
index 0dfd6503f..eb34c29e4 100644
--- a/asm/scrcmd.s
+++ b/asm/scrcmd.s
@@ -1507,7 +1507,7 @@ s2C_unknown: @ 8099DD8
lsls r1, 24
lsrs r1, 24
adds r0, r4, 0
- bl GameFreakRTC_CalcRTCToLocalDelta_DayZero
+ bl RtcInitLocalTimeOffset
movs r0, 0
pop {r4,r5}
pop {r1}
@@ -1528,9 +1528,9 @@ s2D_unknown: @ 8099E10
@ int s2E_unknown(script_env *env)
s2E_unknown: @ 8099E1C
push {lr}
- bl GameFreakRTC_CalcLocalDateTime
+ bl RtcCalcLocalTime
ldr r2, =gSpecialVar_0x8000
- ldr r1, =gUnknown_03005CF8
+ ldr r1, =gLocalTime
movs r0, 0x2
ldrsb r0, [r1, r0]
strh r0, [r2]
diff --git a/asm/tv.s b/asm/tv.s
index 068279b36..94c38d69b 100644
--- a/asm/tv.s
+++ b/asm/tv.s
@@ -5676,7 +5676,7 @@ _080EEF84:
adds r1, r2
movs r0, 0x2
strb r0, [r1]
- ldr r0, =gUnknown_03005CF8
+ ldr r0, =gLocalTime
ldrb r0, [r0, 0x2]
lsls r0, 24
asrs r0, 24
diff --git a/asm/wallclock.s b/asm/wallclock.s
index 3ba217531..b74ac29b2 100644
--- a/asm/wallclock.s
+++ b/asm/wallclock.s
@@ -785,7 +785,7 @@ sub_8134EA4: @ 8134EA4
ldrsh r0, [r4, r1]
movs r2, 0xE
ldrsh r1, [r4, r2]
- bl GameFreakRTC_CalcRTCToLocalDelta_DayZero
+ bl RtcInitLocalTimeOffset
movs r0, 0x1
negs r0, r0
movs r1, 0
@@ -1128,13 +1128,13 @@ sub_8135130: @ 8135130
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
- bl GameFreakRTC_CalcLocalDateTime
+ bl RtcCalcLocalTime
ldr r1, =gTasks
lsls r0, r4, 2
adds r0, r4
lsls r0, 3
adds r6, r0, r1
- ldr r5, =gUnknown_03005CF8
+ ldr r5, =gLocalTime
movs r0, 0x2
ldrsb r0, [r5, r0]
strh r0, [r6, 0xC]
diff --git a/data/rtc.inc b/data/rtc.inc
index ebb0fac3d..496a5e5c8 100644
--- a/data/rtc.inc
+++ b/data/rtc.inc
@@ -1,5 +1,5 @@
.align 2
-gDefaultRTCInfo:: @ 82FECC0
+sRtcDummy:: @ 82FECC0
.byte 0 @ year
.byte 1 @ month
.byte 1 @ day of month
@@ -13,7 +13,7 @@ gDefaultRTCInfo:: @ 82FECC0
.2byte 0 @ padding
.align 2
-gDaysInEachMonth:: @ 82FECCC
+sNumDaysInMonths:: @ 82FECCC
.4byte 31 @ January
.4byte 28 @ February
.4byte 31 @ March
diff --git a/include/global.h b/include/global.h
index 25fe47635..c201b554f 100644
--- a/include/global.h
+++ b/include/global.h
@@ -87,6 +87,14 @@ struct UCoords16
u16 y;
};
+struct Time
+{
+ /*0x00*/ s16 days;
+ /*0x02*/ s8 hours;
+ /*0x03*/ s8 minutes;
+ /*0x04*/ s8 seconds;
+};
+
struct Pokedex
{
/*0x00*/ u8 order;
@@ -118,6 +126,9 @@ struct SaveBlock2
u16 optionsBattleSceneOff:1; // whether battle animations are disabled
u16 regionMapZoom:1; // whether the map is zoomed in
/*0x18*/ struct Pokedex pokedex;
+ /*0x90*/ u8 filler_90[0x8];
+ /*0x98*/ struct Time localTimeOffset;
+ /*0xA0*/ struct Time lastBerryTreeUpdate;
};
extern struct SaveBlock2 *gSaveBlock2Ptr;
diff --git a/include/pokemon.h b/include/pokemon.h
index b3381a4b0..299a25391 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -1,3 +1,6 @@
+#ifndef GUARD_POKEMON_H
+#define GUARD_POKEMON_H
+
#define MON_DATA_PERSONALITY 0
#define MON_DATA_OT_ID 1
#define MON_DATA_NICKNAME 2
@@ -308,4 +311,6 @@ struct BattleMove
// u32 GetMonData(struct Pokemon *mon, s32 field, u8 *data);
u32 GetMonData();
-u8 pokemon_species_get_gender_info(u16 species, u32 personality); \ No newline at end of file
+u8 pokemon_species_get_gender_info(u16 species, u32 personality);
+
+#endif // GUARD_POKEMON_H
diff --git a/include/rtc.h b/include/rtc.h
index fdc5ad709..5ee6a5316 100644
--- a/include/rtc.h
+++ b/include/rtc.h
@@ -22,7 +22,7 @@ extern struct Time gLocalTime;
void RtcDisableInterrupts(void);
void RtcRestoreInterrupts(void);
u32 ConvertBcdToBinary(u8 bcd);
-bool8 IsLeapYear(u8 year);
+bool8 IsLeapYear(u32 year);
u16 ConvertDateToDayCount(u8 year, u8 month, u8 day);
u16 RtcGetDayCount(struct SiiRtcInfo *rtc);
void RtcInit(void);
diff --git a/ld_script.txt b/ld_script.txt
index c55bbae97..b173a90bf 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -49,7 +49,7 @@ SECTIONS {
src/sprite.o(.text);
src/string_util.o(.text);
asm/link.o(.text);
- asm/rtc.o(.text);
+ src/rtc.o(.text);
asm/main_menu.o(.text);
asm/rom3.o(.text);
src/decompress.o(.text);
diff --git a/src/rtc.c b/src/rtc.c
new file mode 100644
index 000000000..7dabb2efa
--- /dev/null
+++ b/src/rtc.c
@@ -0,0 +1,329 @@
+#include "global.h"
+#include "rtc.h"
+#include "string_util.h"
+#include "text.h"
+
+extern u16 sErrorStatus;
+extern struct SiiRtcInfo sRtc;
+extern u8 sProbeResult;
+extern u16 sSavedIme;
+
+extern struct Time gLocalTime;
+
+extern const struct SiiRtcInfo sRtcDummy;
+
+extern const s32 sNumDaysInMonths[12];
+
+void RtcDisableInterrupts(void)
+{
+ sSavedIme = REG_IME;
+ REG_IME = 0;
+}
+
+void RtcRestoreInterrupts(void)
+{
+ REG_IME = sSavedIme;
+}
+
+u32 ConvertBcdToBinary(u8 bcd)
+{
+ if (bcd > 0x9F)
+ return 0xFF;
+
+ if ((bcd & 0xF) <= 9)
+ return (10 * ((bcd >> 4) & 0xF)) + (bcd & 0xF);
+ else
+ return 0xFF;
+}
+
+bool8 IsLeapYear(u32 year)
+{
+ if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
+ return TRUE;
+
+ return FALSE;
+}
+
+u16 ConvertDateToDayCount(u8 year, u8 month, u8 day)
+{
+ s32 i;
+ u16 dayCount = 0;
+
+ for (i = year - 1; i >= 0; i--)
+ {
+ dayCount += 365;
+
+ if (IsLeapYear(i) == TRUE)
+ dayCount++;
+ }
+
+ for (i = 0; i < month - 1; i++)
+ dayCount += sNumDaysInMonths[i];
+
+ if (month > MONTH_FEB && IsLeapYear(year) == TRUE)
+ dayCount++;
+
+ dayCount += day;
+
+ return dayCount;
+}
+
+u16 RtcGetDayCount(struct SiiRtcInfo *rtc)
+{
+ u8 year = ConvertBcdToBinary(rtc->year);
+ u8 month = ConvertBcdToBinary(rtc->month);
+ u8 day = ConvertBcdToBinary(rtc->day);
+ return ConvertDateToDayCount(year, month, day);
+}
+
+void RtcInit(void)
+{
+ sErrorStatus = 0;
+
+ RtcDisableInterrupts();
+ SiiRtcUnprotect();
+ sProbeResult = SiiRtcProbe();
+ RtcRestoreInterrupts();
+
+ if ((sProbeResult & 0xF) != 1)
+ {
+ sErrorStatus = RTC_INIT_ERROR;
+ return;
+ }
+
+ if (sProbeResult & 0xF0)
+ sErrorStatus = RTC_INIT_WARNING;
+ else
+ sErrorStatus = 0;
+
+ RtcGetRawInfo(&sRtc);
+ sErrorStatus = RtcCheckInfo(&sRtc);
+}
+
+u16 RtcGetErrorStatus(void)
+{
+ return sErrorStatus;
+}
+
+void RtcGetInfo(struct SiiRtcInfo *rtc)
+{
+ if (sErrorStatus & RTC_ERR_FLAG_MASK)
+ *rtc = sRtcDummy;
+ else
+ RtcGetRawInfo(rtc);
+}
+
+void RtcGetDateTime(struct SiiRtcInfo *rtc)
+{
+ RtcDisableInterrupts();
+ SiiRtcGetDateTime(rtc);
+ RtcRestoreInterrupts();
+}
+
+void RtcGetStatus(struct SiiRtcInfo *rtc)
+{
+ RtcDisableInterrupts();
+ SiiRtcGetStatus(rtc);
+ RtcRestoreInterrupts();
+}
+
+void RtcGetRawInfo(struct SiiRtcInfo *rtc)
+{
+ RtcGetStatus(rtc);
+ RtcGetDateTime(rtc);
+}
+
+u16 RtcCheckInfo(struct SiiRtcInfo *rtc)
+{
+ u16 errorFlags = 0;
+ s32 year;
+ s32 month;
+ s32 value;
+
+ if (rtc->status & SIIRTCINFO_POWER)
+ errorFlags |= RTC_ERR_POWER_FAILURE;
+
+ if (!(rtc->status & SIIRTCINFO_24HOUR))
+ errorFlags |= RTC_ERR_12HOUR_CLOCK;
+
+ year = ConvertBcdToBinary(rtc->year);
+
+ if (year == 0xFF)
+ errorFlags |= RTC_ERR_INVALID_YEAR;
+
+ month = ConvertBcdToBinary(rtc->month);
+
+ if (month == 0xFF || month == 0 || month > 12)
+ errorFlags |= RTC_ERR_INVALID_MONTH;
+
+ value = ConvertBcdToBinary(rtc->day);
+
+ if (value == 0xFF)
+ errorFlags |= RTC_ERR_INVALID_DAY;
+
+ if (month == MONTH_FEB)
+ {
+ if (value > IsLeapYear(year) + sNumDaysInMonths[month - 1])
+ errorFlags |= RTC_ERR_INVALID_DAY;
+ }
+ else
+ {
+ if (value > sNumDaysInMonths[month - 1])
+ errorFlags |= RTC_ERR_INVALID_DAY;
+ }
+
+ value = ConvertBcdToBinary(rtc->hour);
+
+ if (value > 24)
+ errorFlags |= RTC_ERR_INVALID_HOUR;
+
+ value = ConvertBcdToBinary(rtc->minute);
+
+ if (value > 60)
+ errorFlags |= RTC_ERR_INVALID_MINUTE;
+
+ value = ConvertBcdToBinary(rtc->second);
+
+ if (value > 60)
+ errorFlags |= RTC_ERR_INVALID_SECOND;
+
+ return errorFlags;
+}
+
+void RtcReset(void)
+{
+ RtcDisableInterrupts();
+ SiiRtcReset();
+ RtcRestoreInterrupts();
+}
+
+void FormatDecimalTime(u8 *dest, s32 hour, s32 minute, s32 second)
+{
+ dest = ConvertIntToDecimalStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest++ = CHAR_COLON;
+ dest = ConvertIntToDecimalStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest++ = CHAR_COLON;
+ dest = ConvertIntToDecimalStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest = EOS;
+}
+
+void FormatHexTime(u8 *dest, s32 hour, s32 minute, s32 second)
+{
+ dest = ConvertIntToHexStringN(dest, hour, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest++ = CHAR_COLON;
+ dest = ConvertIntToHexStringN(dest, minute, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest++ = CHAR_COLON;
+ dest = ConvertIntToHexStringN(dest, second, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest = EOS;
+}
+
+void FormatHexRtcTime(u8 *dest)
+{
+ FormatHexTime(dest, sRtc.hour, sRtc.minute, sRtc.second);
+}
+
+void FormatDecimalDate(u8 *dest, s32 year, s32 month, s32 day)
+{
+ dest = ConvertIntToDecimalStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4);
+ *dest++ = CHAR_HYPHEN;
+ dest = ConvertIntToDecimalStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest++ = CHAR_HYPHEN;
+ dest = ConvertIntToDecimalStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest = EOS;
+}
+
+void FormatHexDate(u8 *dest, s32 year, s32 month, s32 day)
+{
+ dest = ConvertIntToHexStringN(dest, year, STR_CONV_MODE_LEADING_ZEROS, 4);
+ *dest++ = CHAR_HYPHEN;
+ dest = ConvertIntToHexStringN(dest, month, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest++ = CHAR_HYPHEN;
+ dest = ConvertIntToHexStringN(dest, day, STR_CONV_MODE_LEADING_ZEROS, 2);
+ *dest = EOS;
+}
+
+void RtcCalcTimeDifference(struct SiiRtcInfo *rtc, struct Time *result, struct Time *t)
+{
+ u16 days = RtcGetDayCount(rtc);
+ result->seconds = ConvertBcdToBinary(rtc->second) - t->seconds;
+ result->minutes = ConvertBcdToBinary(rtc->minute) - t->minutes;
+ result->hours = ConvertBcdToBinary(rtc->hour) - t->hours;
+ result->days = days - t->days;
+
+ if (result->seconds < 0)
+ {
+ result->seconds += 60;
+ --result->minutes;
+ }
+
+ if (result->minutes < 0)
+ {
+ result->minutes += 60;
+ --result->hours;
+ }
+
+ if (result->hours < 0)
+ {
+ result->hours += 24;
+ --result->days;
+ }
+}
+
+void RtcCalcLocalTime(void)
+{
+ RtcGetInfo(&sRtc);
+ RtcCalcTimeDifference(&sRtc, &gLocalTime, &gSaveBlock2Ptr->localTimeOffset);
+}
+
+void RtcInitLocalTimeOffset(s32 hour, s32 minute)
+{
+ RtcCalcLocalTimeOffset(0, hour, minute, 0);
+}
+
+void RtcCalcLocalTimeOffset(s32 days, s32 hours, s32 minutes, s32 seconds)
+{
+ gLocalTime.days = days;
+ gLocalTime.hours = hours;
+ gLocalTime.minutes = minutes;
+ gLocalTime.seconds = seconds;
+ RtcGetInfo(&sRtc);
+ RtcCalcTimeDifference(&sRtc, &gSaveBlock2Ptr->localTimeOffset, &gLocalTime);
+}
+
+void CalcTimeDifference(struct Time *result, struct Time *t1, struct Time *t2)
+{
+ result->seconds = t2->seconds - t1->seconds;
+ result->minutes = t2->minutes - t1->minutes;
+ result->hours = t2->hours - t1->hours;
+ result->days = t2->days - t1->days;
+
+ if (result->seconds < 0)
+ {
+ result->seconds += 60;
+ --result->minutes;
+ }
+
+ if (result->minutes < 0)
+ {
+ result->minutes += 60;
+ --result->hours;
+ }
+
+ if (result->hours < 0)
+ {
+ result->hours += 24;
+ --result->days;
+ }
+}
+
+u32 RtcGetMinuteCount(void)
+{
+ RtcGetInfo(&sRtc);
+ return (24 * 60) * RtcGetDayCount(&sRtc) + 60 * sRtc.hour + sRtc.minute;
+}
+
+u16 RtcGetLocalDayCount(void)
+{
+ return RtcGetDayCount(&sRtc);
+}
+
diff --git a/sym_bss.txt b/sym_bss.txt
index 73309e148..6480c7ecd 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -112,16 +112,16 @@ gUnknown_03000DAC: @ 3000DAC
gUnknown_03000DB0: @ 3000DB0
.space 0x8
-gUnknown_03000DB8: @ 3000DB8
+sErrorStatus: @ 3000DB8
.space 0x8
-gUnknown_03000DC0: @ 3000DC0
+sRtc: @ 3000DC0
.space 0xC
-gUnknown_03000DCC: @ 3000DCC
+sProbeResult: @ 3000DCC
.space 0x2
-gUnknown_03000DCE: @ 3000DCE
+sSavedIme: @ 3000DCE
.space 0x2
gUnknown_03000DD0: @ 3000DD0
diff --git a/sym_common.txt b/sym_common.txt
index 99a3f670a..eb2a055c9 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -201,7 +201,7 @@ gUnknown_03005CD5: @ 3005CD5
gUnknown_03005CDE: @ 3005CDE
.space 0x1A
-gUnknown_03005CF8: @ 3005CF8
+gLocalTime: @ 3005CF8
.space 0x8
gUnknown_03005D00: @ 3005D00