diff options
-rw-r--r-- | asm/clock.s | 10 | ||||
-rw-r--r-- | asm/main_menu.s | 2 | ||||
-rw-r--r-- | asm/new_game.s | 2 | ||||
-rw-r--r-- | asm/pokemon_3.s | 8 | ||||
-rw-r--r-- | asm/reset_rtc_screen.s | 16 | ||||
-rw-r--r-- | asm/rom6.s | 10 | ||||
-rw-r--r-- | asm/rom_8184DA4.s | 10 | ||||
-rw-r--r-- | asm/roulette.s | 10 | ||||
-rw-r--r-- | asm/rtc.s | 819 | ||||
-rw-r--r-- | asm/scrcmd.s | 6 | ||||
-rw-r--r-- | asm/tv.s | 2 | ||||
-rw-r--r-- | asm/wallclock.s | 6 | ||||
-rw-r--r-- | data/rtc.inc | 4 | ||||
-rw-r--r-- | include/global.h | 11 | ||||
-rw-r--r-- | include/pokemon.h | 7 | ||||
-rw-r--r-- | include/rtc.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/rtc.c | 329 | ||||
-rw-r--r-- | sym_bss.txt | 8 | ||||
-rw-r--r-- | sym_common.txt | 2 |
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 @@ -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] @@ -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 |