From 4ba08394238a50c9dd5c049a80cb6ae2c04da481 Mon Sep 17 00:00:00 2001 From: Prakxo <87568477+Prakxo@users.noreply.github.com> Date: Mon, 25 Sep 2023 17:32:19 +0200 Subject: lb_rtc OK (#102) * lb_rtc OK * fixes * Use equality enum values --- include/6F8A60.h | 43 --- include/721EC0.h | 3 +- include/7220C0.h | 3 +- include/722310.h | 3 +- include/722880.h | 3 +- include/722970.h | 2 +- include/722AB0.h | 3 +- include/code_variables.h | 5 - include/lb_rtc.h | 42 +++ include/m_event.h | 1 + include/padmgr.h | 4 +- linker_scripts/jp/symbol_addrs_code.txt | 66 ++-- src/code/lb_rtc.c | 593 ++++++++++++++++++++++++++++++++ src/code/m_player_call.c | 1 - src/code/m_start_data_init.c | 2 +- yamls/jp/code.yaml | 10 +- 16 files changed, 689 insertions(+), 95 deletions(-) delete mode 100644 include/6F8A60.h create mode 100644 src/code/lb_rtc.c diff --git a/include/6F8A60.h b/include/6F8A60.h deleted file mode 100644 index c26e350..0000000 --- a/include/6F8A60.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef C_6F8A60_H -#define C_6F8A60_H - -#include "ultra64.h" - -struct lbRTC_time_c; - -// void func_800D4DC0_jp(); -// void func_800D4E20_jp(); -// void func_800D4E94_jp(); -// void func_800D4F18_jp(); -// void func_800D4F6C_jp(); -// void func_800D4FB8_jp(); -// void func_800D5004_jp(); -void lbRTC_GetTime(struct lbRTC_time_c* time); -// void func_800D5104_jp(); -// void func_800D5164_jp(); -// void func_800D51E0_jp(); -// void func_800D52C0_jp(); -// void func_800D53A4_jp(); -// void func_800D53DC_jp(); -// void func_800D5414_jp(); -// void func_800D5480_jp(); -// void func_800D54DC_jp(); -// void func_800D56B8_jp(); -// void func_800D56CC_jp(); -// void func_800D572C_jp(); -// void func_800D579C_jp(); -// void func_800D57FC_jp(); -// void func_800D585C_jp(); -// void func_800D58BC_jp(); -// void func_800D5930_jp(); -// void func_800D5944_jp(); -// void func_800D59E8_jp(); -// void func_800D5A8C_jp(); -// void func_800D5B34_jp(); -// void func_800D5BDC_jp(); -// void func_800D5C84_jp(); -// void func_800D5CF8_jp(); -void lbRTC_TimeCopy(struct lbRTC_time_c* dst, struct lbRTC_time_c* src); -// void func_800D5D94_jp(); - -#endif diff --git a/include/721EC0.h b/include/721EC0.h index 9296c41..bb56a98 100644 --- a/include/721EC0.h +++ b/include/721EC0.h @@ -2,7 +2,8 @@ #define C_721EC0_H #include "ultra64.h" +#include "lb_rtc.h" -// void func_800FE220_jp(); +s32 func_800FE220_jp(OSMesgQueue*, lbRTC_time_c*); #endif diff --git a/include/7220C0.h b/include/7220C0.h index e36b227..1d16207 100644 --- a/include/7220C0.h +++ b/include/7220C0.h @@ -2,8 +2,9 @@ #define C_7220C0_H #include "ultra64.h" +#include "lb_rtc.h" -// void func_800FE420_jp(); +s32 func_800FE420_jp(OSMesgQueue*, lbRTC_time_c*); // void func_800FE480_jp(); #endif diff --git a/include/722310.h b/include/722310.h index 5b59b12..c455c90 100644 --- a/include/722310.h +++ b/include/722310.h @@ -2,7 +2,8 @@ #define C_722310_H #include "ultra64.h" +#include "lb_rtc.h" -// void func_800FE670_jp(); +s32 func_800FE670_jp(OSMesgQueue*, lbRTC_time_c*); #endif diff --git a/include/722880.h b/include/722880.h index e23491c..cde4dad 100644 --- a/include/722880.h +++ b/include/722880.h @@ -2,7 +2,8 @@ #define C_722880_H #include "ultra64.h" +#include "lb_rtc.h" -// void func_800FEBE0_jp(); +void func_800FEBE0_jp(OSMesgQueue*, lbRTC_time_c*); #endif diff --git a/include/722970.h b/include/722970.h index 9d3349f..2aa8158 100644 --- a/include/722970.h +++ b/include/722970.h @@ -3,6 +3,6 @@ #include "ultra64.h" -// void func_800FECD0_jp(); +s32 func_800FECD0_jp(OSMesgQueue*); #endif diff --git a/include/722AB0.h b/include/722AB0.h index 46fab88..143aeb2 100644 --- a/include/722AB0.h +++ b/include/722AB0.h @@ -2,9 +2,10 @@ #define C_722AB0_H #include "ultra64.h" +#include "lb_rtc.h" // void func_800FEE10_jp(); // void func_800FEF9C_jp(); -// void func_800FF060_jp(); +void func_800FF060_jp(lbRTC_time_c*, lbRTC_time_c*); #endif diff --git a/include/code_variables.h b/include/code_variables.h index c5c1192..eb70e01 100644 --- a/include/code_variables.h +++ b/include/code_variables.h @@ -789,9 +789,6 @@ extern vs32 D_8010EFB0_jp; // TODO: Determine where this goes // extern UNK_TYPE D_8010EFB8_jp; // extern UNK_TYPE D_8010EFC0_jp; // extern UNK_TYPE D_8010EFC8_jp; -// extern UNK_TYPE D_8010EFD0_jp; -// extern UNK_TYPE D_8010EFD4_jp; -// extern UNK_TYPE D_8010EFD8_jp; // extern UNK_TYPE D_8010EFE0_jp; // extern UNK_TYPE D_8010EFFC_jp; // extern UNK_TYPE D_8010F3DC_jp; @@ -1965,8 +1962,6 @@ extern MtxF MtxF_clear; // extern UNK_TYPE B_80145370_jp; // extern UNK_TYPE B_80145390_jp; // extern UNK_TYPE B_80145610_jp; -// extern UNK_TYPE B_80145620_jp; -// extern UNK_TYPE B_80145628_jp; // extern UNK_TYPE B_80145630_jp; // extern UNK_TYPE B_801457E0_jp; // extern UNK_TYPE B_80145800_jp; diff --git a/include/lb_rtc.h b/include/lb_rtc.h index 18cdd3a..1394b30 100644 --- a/include/lb_rtc.h +++ b/include/lb_rtc.h @@ -100,4 +100,46 @@ typedef enum RTC_EQUALITY_FLAGS { #define lbRTC_IS_LEAPYEAR(year) \ (((year % 4) == 0 && ((year % 100) != 0)) || ((year % 400) == 0)) +s32 lbRTC_Initial(void); +s32 lbRTC_IsOki(lbRTC_time_c* ptr); +s32 lbRTC_IsAbnormal(void); +void lbRTC_Sampling(void); +void func_800D4F6C_jp(lbRTC_time_c* time); +void func_800D4FB8_jp(lbRTC_time_c* time); +void lbRTC_SetTime(lbRTC_time_c* time); +void lbRTC_GetTime(lbRTC_time_c* time); +lbRTC_day_t lbRTC_GetDaysByMonth(lbRTC_year_t year, lbRTC_month_t month); +s32 lbRTC_IsEqualDate(lbRTC_year_t y0, lbRTC_month_t m0, lbRTC_day_t d0, lbRTC_year_t y1, + lbRTC_month_t m1, lbRTC_day_t d1); +s32 lbRTC_IsEqualTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1, s32 flags); +s32 lbRTC_IsOverTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1); +s32 lbRTC_IsJustAtRTC(const lbRTC_time_c* time, s32 flags); +s32 lbRTC_IsOverRTC(const lbRTC_time_c* time); +s32 lbRTC_IsOverWeekRTC(const lbRTC_time_c* t0, lbRTC_weekday_t week); +void func_800D5480_jp(lbRTC_time_c* t0, lbRTC_time_c* t1); +s32 lbRTC_GetIntervalDays(const lbRTC_time_c* t0, const lbRTC_time_c* t1); +void lbRTC_Add_YY(lbRTC_time_c* time, s32 years); +void lbRTC_Add_MM(lbRTC_time_c* time, s32 month); +void lbRTC_Add_DD(lbRTC_time_c* time, s32 day); +void lbRTC_Add_hh(lbRTC_time_c* time, s32 hour); +void lbRTC_Add_mm(lbRTC_time_c* time, s32 min); +void lbRTC_Add_ss(lbRTC_time_c* time, s32 sec); +void lbRTC_Add_Date(lbRTC_time_c* time, const lbRTC_time_c* add_time); +void lbRTC_Sub_YY(lbRTC_time_c* time, s32 year); +void lbRTC_Sub_MM(lbRTC_time_c* time, s32 month); +void lbRTC_Sub_DD(lbRTC_time_c* time, s32 days); +void lbRTC_Sub_hh(lbRTC_time_c* time, s32 hour); +void lbRTC_Sub_mm(lbRTC_time_c* time, s32 min); +void lbRTC_Sub_ss(lbRTC_time_c* time, s32 sec); +void lbRTC_Sub_Date(lbRTC_time_c* time, const lbRTC_time_c* sub_time); +lbRTC_weekday_t lbRTC_Week(lbRTC_year_t year, lbRTC_month_t month, lbRTC_day_t day); +void lbRTC_TimeCopy(lbRTC_time_c* dst, const lbRTC_time_c* src); +s32 lbRTC_IsValidTime(const lbRTC_time_c* time); + +extern s32 l_lbRTC_isInitial; +extern s32 l_lbRTC_IsSampled; + +extern s32 B_80145620_jp; +extern lbRTC_time_c l_lbRTC_Time; + #endif diff --git a/include/m_event.h b/include/m_event.h index 67c911a..e92d17b 100644 --- a/include/m_event.h +++ b/include/m_event.h @@ -2,6 +2,7 @@ #define M_EVENT_H #include "ultra64.h" +#include "unk.h" typedef struct mEv_event_save_c { /* 0x00 */ char unk00[0x9C]; diff --git a/include/padmgr.h b/include/padmgr.h index 6978d1b..af1220f 100644 --- a/include/padmgr.h +++ b/include/padmgr.h @@ -32,8 +32,8 @@ do { \ } while (0) -// void padmgr_LockSerialMesgQ(); -// void padmgr_UnlockSerialMesgQ(); +OSMesgQueue* padmgr_LockSerialMesgQ(void); +void padmgr_UnlockSerialMesgQ(OSMesgQueue*); // void padmgr_LockContData(); // void padmgr_UnlockContData(); // void func_800D6AD4_jp(); diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt index 70c5fd0..149aba0 100644 --- a/linker_scripts/jp/symbol_addrs_code.txt +++ b/linker_scripts/jp/symbol_addrs_code.txt @@ -3448,40 +3448,40 @@ irqmgr_HandlePreNMI500 = 0x800D4B04; // type:func IrqMgr_HandleRetrace = 0x800D4B24; // type:func irqmgr_Main = 0x800D4BEC; // type:func CreateIRQManager = 0x800D4CBC; // type:func -func_800D4DC0_jp = 0x800D4DC0; // type:func -func_800D4E20_jp = 0x800D4E20; // type:func -func_800D4E94_jp = 0x800D4E94; // type:func -func_800D4F18_jp = 0x800D4F18; // type:func +lbRTC_Initial = 0x800D4DC0; // type:func +lbRTC_IsOki = 0x800D4E20; // type:func +lbRTC_IsAbnormal = 0x800D4E94; // type:func +lbRTC_Sampling = 0x800D4F18; // type:func func_800D4F6C_jp = 0x800D4F6C; // type:func func_800D4FB8_jp = 0x800D4FB8; // type:func -func_800D5004_jp = 0x800D5004; // type:func +lbRTC_SetTime = 0x800D5004; // type:func lbRTC_GetTime = 0x800D5090; // type:func -func_800D5104_jp = 0x800D5104; // type:func -func_800D5164_jp = 0x800D5164; // type:func -func_800D51E0_jp = 0x800D51E0; // type:func -func_800D52C0_jp = 0x800D52C0; // type:func -func_800D53A4_jp = 0x800D53A4; // type:func -func_800D53DC_jp = 0x800D53DC; // type:func -func_800D5414_jp = 0x800D5414; // type:func +lbRTC_GetDaysByMonth = 0x800D5104; // type:func +lbRTC_IsEqualDate = 0x800D5164; // type:func +lbRTC_IsEqualTime = 0x800D51E0; // type:func +lbRTC_IsOverTime = 0x800D52C0; // type:func +lbRTC_IsJustAtRTC = 0x800D53A4; // type:func +lbRTC_IsOverRTC = 0x800D53DC; // type:func +lbRTC_IsOverWeekRTC = 0x800D5414; // type:func func_800D5480_jp = 0x800D5480; // type:func -func_800D54DC_jp = 0x800D54DC; // type:func -func_800D56B8_jp = 0x800D56B8; // type:func -func_800D56CC_jp = 0x800D56CC; // type:func -func_800D572C_jp = 0x800D572C; // type:func -func_800D579C_jp = 0x800D579C; // type:func -func_800D57FC_jp = 0x800D57FC; // type:func -func_800D585C_jp = 0x800D585C; // type:func -func_800D58BC_jp = 0x800D58BC; // type:func -func_800D5930_jp = 0x800D5930; // type:func -func_800D5944_jp = 0x800D5944; // type:func -func_800D59E8_jp = 0x800D59E8; // type:func -func_800D5A8C_jp = 0x800D5A8C; // type:func -func_800D5B34_jp = 0x800D5B34; // type:func -func_800D5BDC_jp = 0x800D5BDC; // type:func -func_800D5C84_jp = 0x800D5C84; // type:func -func_800D5CF8_jp = 0x800D5CF8; // type:func +lbRTC_GetIntervalDays = 0x800D54DC; // type:func +lbRTC_Add_YY = 0x800D56B8; // type:func +lbRTC_Add_MM = 0x800D56CC; // type:func +lbRTC_Add_DD = 0x800D572C; // type:func +lbRTC_Add_hh = 0x800D579C; // type:func +lbRTC_Add_mm = 0x800D57FC; // type:func +lbRTC_Add_ss = 0x800D585C; // type:func +lbRTC_Add_Date = 0x800D58BC; // type:func +lbRTC_Sub_YY = 0x800D5930; // type:func +lbRTC_Sub_MM = 0x800D5944; // type:func +lbRTC_Sub_DD = 0x800D59E8; // type:func +lbRTC_Sub_hh = 0x800D5A8C; // type:func +lbRTC_Sub_mm = 0x800D5B34; // type:func +lbRTC_Sub_ss = 0x800D5BDC; // type:func +lbRTC_Sub_Date = 0x800D5C84; // type:func +lbRTC_Week = 0x800D5CF8; // type:func lbRTC_TimeCopy = 0x800D5D6C; // type:func -func_800D5D94_jp = 0x800D5D94; // type:func +lbRTC_IsValidTime = 0x800D5D94; // type:func func_800D5E70_jp = 0x800D5E70; // type:func func_800D5EA8_jp = 0x800D5EA8; // type:func func_800D5EE4_jp = 0x800D5EE4; // type:func @@ -4983,9 +4983,9 @@ ResetStatus = 0x8010EFB0; // ResetTime = 0x8010EFB8; // RetraceTime = 0x8010EFC0; // RetraceCount = 0x8010EFC8; // -D_8010EFD0_jp = 0x8010EFD0; // -D_8010EFD4_jp = 0x8010EFD4; // -D_8010EFD8_jp = 0x8010EFD8; // +l_lbRTC_isInitial = 0x8010EFD0; // +l_lbRTC_isSampled = 0x8010EFD4; // +b_time = 0x8010EFD8; // D_8010EFE0_jp = 0x8010EFE0; // type:u8 D_8010EFFC_jp = 0x8010EFFC; // D_8010F3DC_jp = 0x8010F3DC; // @@ -6189,7 +6189,7 @@ B_80145370_jp = 0x80145370; // type:s8 irqmgr_class = 0x80145390; // B_80145610_jp = 0x80145610; // B_80145620_jp = 0x80145620; // -B_80145628_jp = 0x80145628; // type:u8 +l_lbRTC_Time = 0x80145628; // B_80145630_jp = 0x80145630; // B_801457E0_jp = 0x801457E0; // B_80145800_jp = 0x80145800; // diff --git a/src/code/lb_rtc.c b/src/code/lb_rtc.c new file mode 100644 index 0000000..8935435 --- /dev/null +++ b/src/code/lb_rtc.c @@ -0,0 +1,593 @@ +#include "lb_rtc.h" +#include "m_common_data.h" +#include "padmgr.h" +#include "722970.h" +#include "721EC0.h" +#include "7220C0.h" +#include "722310.h" +#include "722AB0.h" +#include "722880.h" +#include "macros.h" +#include "attributes.h" + +s32 l_lbRTC_isInitial = 1; +s32 l_lbRTC_IsSampled = 0; + +s32 B_80145620_jp; +lbRTC_time_c l_lbRTC_Time; + +s32 lbRTC_Initial() { + OSMesgQueue* mq; + + if (l_lbRTC_isInitial == 1) { + mq = padmgr_LockSerialMesgQ(); + l_lbRTC_isInitial = 0; + B_80145620_jp = func_800FECD0_jp(mq); + padmgr_UnlockSerialMesgQ(mq); + } + return B_80145620_jp; +} + +s32 lbRTC_IsOki(lbRTC_time_c* ptr) { + s32 isInitial; + OSMesgQueue* mq; + + isInitial = lbRTC_Initial(); + + if (isInitial == 0) { + mq = padmgr_LockSerialMesgQ(); + isInitial = func_800FE220_jp(mq, ptr); + padmgr_UnlockSerialMesgQ(mq); + if (isInitial == 0) { + return isInitial; + } + } + l_lbRTC_isInitial = 1; + return isInitial; +} + +s32 lbRTC_IsAbnormal() { + lbRTC_time_c time; + s32 temp UNUSED; + s32 res = lbRTC_IsOki(&time); + + if ((res == 0) && (l_lbRTC_IsSampled == 1)) { + s32 baseTimer = (l_lbRTC_Time.sec + (l_lbRTC_Time.min * 60)); + + if ((time.sec + (time.min * 60)) != baseTimer) { + return res; + } + } + return res; +} + +void lbRTC_Sampling() { + lbRTC_time_c time; + + if ((lbRTC_IsOki(&time) == 0) && (!l_lbRTC_IsSampled)) { + l_lbRTC_Time.sec = time.sec; + l_lbRTC_Time.min = time.min; + l_lbRTC_IsSampled = 1; + } +} + +void func_800D4F6C_jp(lbRTC_time_c* time) { + OSMesgQueue* mq; + + if (lbRTC_Initial() == 0) { + mq = padmgr_LockSerialMesgQ(); + func_800FEBE0_jp(mq, time); + padmgr_UnlockSerialMesgQ(mq); + } +} + +void func_800D4FB8_jp(lbRTC_time_c* time) { + OSMesgQueue* mq; + + if (lbRTC_Initial() == 0) { + mq = padmgr_LockSerialMesgQ(); + func_800FE420_jp(mq, time); + padmgr_UnlockSerialMesgQ(mq); + } +} + +void lbRTC_SetTime(lbRTC_time_c* time) { + OSMesgQueue* mq; + + if (common_data.time.rtcEnabled == 1 && !common_data.time.rtcCrashed) { + time->weekday = lbRTC_Week(time->year, time->month, time->day); + mq = padmgr_LockSerialMesgQ(); + func_800FE670_jp(mq, time); + padmgr_UnlockSerialMesgQ(mq); + } else { + lbRTC_TimeCopy(&common_data.time.rtcTime, time); + } +} + +void lbRTC_GetTime(lbRTC_time_c* time) { + OSMesgQueue* mq; + + if (common_data.time.rtcEnabled == 1 && !common_data.time.rtcCrashed) { + mq = padmgr_LockSerialMesgQ(); + func_800FE220_jp(mq, time); + padmgr_UnlockSerialMesgQ(mq); + } else { + lbRTC_TimeCopy(time, &common_data.time.rtcTime); + } +} + +const lbRTC_day_t days_month[2][lbRTC_MONTHS_MAX + 1] = { + // Regular year + { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + + // Leap year + { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +}; + +lbRTC_day_t lbRTC_GetDaysByMonth(lbRTC_year_t year, lbRTC_month_t month) { + s32 leap = !(year & 3) ? 1 : 0; + s32 idx = leap == 1 ? 1 : 0; + + return days_month[idx][month]; +} + +typedef union lbRTCYMD { + s32 raw; + lbRTC_ymd_t ymd; +} lbRTCYMD; + +s32 lbRTC_IsEqualDate(lbRTC_year_t y0, lbRTC_month_t m0, lbRTC_day_t d0, lbRTC_year_t y1, lbRTC_month_t m1, + lbRTC_day_t d1) { + lbRTCYMD ymd0; + lbRTCYMD ymd1; + s32 res; + + ymd0.ymd.year = y0; + ymd0.ymd.month = m0; + ymd0.ymd.day = d0; + + ymd1.ymd.year = y1; + ymd1.ymd.month = m1; + ymd1.ymd.day = d1; + + res = ymd0.raw - ymd1.raw; + if (res == 0) { + return lbRTC_EQUAL; + } + + if (res < 0) { + return lbRTC_LESS; + } + return lbRTC_OVER; +} + +s32 lbRTC_IsEqualTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1, s32 flags) { + s32 equal = 0; + + if (flags & lbRTC_CHECK_SECONDS) { + if (t0->sec == t1->sec) { + equal |= lbRTC_CHECK_SECONDS; + } + } + + if (flags & lbRTC_CHECK_MINUTES) { + if (t0->min == t1->min) { + equal |= lbRTC_CHECK_MINUTES; + } + } + + if (flags & lbRTC_CHECK_HOURS) { + if (t0->hour == t1->hour) { + equal |= lbRTC_CHECK_HOURS; + } + } + + if (flags & lbRTC_CHECK_WEEKDAYS) { + if (t0->weekday == t1->weekday) { + equal |= lbRTC_CHECK_WEEKDAYS; + } + } + + if (flags & lbRTC_CHECK_DAYS) { + if (t0->day == t1->day) { + equal |= lbRTC_CHECK_DAYS; + } + } + + if (flags & lbRTC_CHECK_MONTHS) { + if (t0->month == t1->month) { + equal |= lbRTC_CHECK_MONTHS; + } + } + + if (flags & lbRTC_CHECK_YEARS) { + if (t0->year == t1->year) { + equal |= lbRTC_CHECK_YEARS; + } + } + + return flags == (equal & flags); +} + +s32 lbRTC_IsOverTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1) { + + if (t1->year < t0->year) { + return lbRTC_LESS; + } + + if (t1->year == t0->year) { + if (t1->month >= t0->month) { + if (t1->month == t0->month) { + if (t1->day >= t0->day) { + if (t1->day == t0->day) { + if (t1->hour >= t0->hour) { + if (t1->hour == t0->hour) { + if (t1->min >= t0->min) { + if (t1->min == t0->min) { + if (t1->sec < t0->sec) { + return lbRTC_LESS; + } + } + } else { + return lbRTC_LESS; + } + } + } else { + return lbRTC_LESS; + } + } + } else { + return lbRTC_LESS; + } + } + } else { + return lbRTC_LESS; + } + } + + return lbRTC_OVER; +} + +s32 lbRTC_IsJustAtRTC(const lbRTC_time_c* time, s32 flags) { + lbRTC_time_c rtcTime; + + lbRTC_GetTime(&rtcTime); + + return lbRTC_IsEqualTime(&rtcTime, time, flags); +} + +s32 lbRTC_IsOverRTC(const lbRTC_time_c* time) { + lbRTC_time_c rtcTime; + + lbRTC_GetTime(&rtcTime); + + return lbRTC_IsOverTime(time, &rtcTime) == lbRTC_OVER; +} + +s32 lbRTC_IsOverWeekRTC(const lbRTC_time_c* t0, lbRTC_weekday_t week) { + s32 curWeek; + lbRTC_time_c t1; + + curWeek = week - t0->weekday; + t1 = *t0; + + if (curWeek <= 0) { + curWeek += 7; + } + + t1.hour = 0; + t1.min = 0; + t1.sec = 0; + + lbRTC_Add_DD(&t1, curWeek); + lbRTC_IsOverRTC(&t1); +} + +void func_800D5480_jp(lbRTC_time_c* t0, lbRTC_time_c* t1) { + + lbRTC_time_c t2; + lbRTC_time_c t3; + + t2 = *t0; + t3 = *t1; + + func_800FF060_jp(&t3, &t2); +} + +const int total_days[2][lbRTC_MONTHS_MAX + 1] = { + // Standard year + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }, + // Leap year + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } +}; + +s32 lbRTC_GetIntervalDays(const lbRTC_time_c* t0, const lbRTC_time_c* t1) { + s32 leapPeriod = (t1->year - t0->year) / 4; + s32 years = (t1->year - t0->year) % 4; + s32 lessLeap = (t0->year % 4) == 0; + s32 overLeap = (t1->year % 4) == 0; + s32 leapAdd = ((4 - (t0->year % 4)) % 4) < years; + + s32 days; + + if (t0->year > t1->year) { + return 0; + } else { + if (t0->year == t1->year) { + if (t0->month > t1->month) { + return 0; + } else { + if (t0->month == t1->month) { + if (t0->day > t1->day) { + return 0; + } else { + if (t0->day == t1->day) { + if (t0->hour > t1->hour) { + return 0; + } else { + if (t0->hour == t1->hour) { + if (t0->min > t1->min) { + return 0; + } + } + } + } + } + } + } + } + } + + days = leapPeriod * 1461 + years * 365 + leapAdd; + + days += t1->day - 1; + days += total_days[overLeap][t1->month - 1]; + + days -= t0->day - 1; + days -= total_days[lessLeap][t0->month - 1]; + + return days; +} + +void lbRTC_Add_YY(lbRTC_time_c* time, s32 years) { + time->year += (u16)years; +} + +void lbRTC_Add_MM(lbRTC_time_c* time, s32 month) { + s32 timeMonth = time->month; + + timeMonth += month; + + if (timeMonth > lbRTC_MONTHS_MAX) { + lbRTC_Add_YY(time, timeMonth / lbRTC_MONTHS_MAX); + timeMonth %= lbRTC_MONTHS_MAX; + } + + time->month = (lbRTC_month_t)timeMonth; +} + +void lbRTC_Add_DD(lbRTC_time_c* time, s32 day) { + s32 days = lbRTC_GetDaysByMonth(time->year, (lbRTC_month_t)time->month); + s32 timeDay = time->day; + + timeDay += day; + + if (timeDay > days) { + timeDay -= days; + lbRTC_Add_MM(time, 1); + } + + time->day = (lbRTC_day_t)timeDay; +} + +void lbRTC_Add_hh(lbRTC_time_c* time, s32 hour) { + s32 timeHour = time->hour; + + timeHour += hour; + if (timeHour >= lbRTC_HOURS_PER_DAY) { + lbRTC_Add_DD(time, timeHour / lbRTC_HOURS_PER_DAY); + timeHour %= lbRTC_HOURS_PER_DAY; + } + + time->hour = (lbRTC_hour_t)timeHour; +} + +void lbRTC_Add_mm(lbRTC_time_c* time, s32 min) { + s32 timeSec = time->min; + + timeSec += min; + if (timeSec >= lbRTC_MINUTES_PER_HOUR) { + lbRTC_Add_hh(time, timeSec / lbRTC_MINUTES_PER_HOUR); + timeSec %= lbRTC_MINUTES_PER_HOUR; + } + + time->min = (lbRTC_min_t)timeSec; +} + +void lbRTC_Add_ss(lbRTC_time_c* time, s32 sec) { + int timeSec = time->sec; + + timeSec += sec; + if (timeSec >= lbRTC_SECONDS_PER_MINUTE) { + lbRTC_Add_mm(time, timeSec / lbRTC_SECONDS_PER_MINUTE); + timeSec %= lbRTC_SECONDS_PER_MINUTE; + } + + time->sec = (lbRTC_sec_t)timeSec; +} + +void lbRTC_Add_Date(lbRTC_time_c* time, const lbRTC_time_c* add_time) { + lbRTC_Add_ss(time, add_time->sec); + lbRTC_Add_mm(time, add_time->min); + lbRTC_Add_hh(time, add_time->hour); + lbRTC_Add_DD(time, add_time->day); + lbRTC_Add_MM(time, add_time->month); + lbRTC_Add_YY(time, add_time->year); +} + +void lbRTC_Sub_YY(lbRTC_time_c* time, s32 year) { + time->year -= (lbRTC_year_t)year; +} + +void lbRTC_Sub_MM(lbRTC_time_c* time, s32 month) { + s32 calcMonth = time->month - month; + if (calcMonth < 1) { + s32 temp = calcMonth; + s32 year; + + if (calcMonth == 0) { + calcMonth = lbRTC_MONTHS_MAX; + year = 1; + } else { + temp = ABS(calcMonth); + year = temp / lbRTC_MONTHS_MAX + 1; + calcMonth = lbRTC_MONTHS_MAX - (temp % lbRTC_MONTHS_MAX); + } + + lbRTC_Sub_YY(time, year); + } + + time->month = (lbRTC_month_t)calcMonth; +} + +void lbRTC_Sub_DD(lbRTC_time_c* time, s32 days) { + s32 currentDay = time->day; + s32 day; + + if (time->month == lbRTC_JANUARY) { + day = lbRTC_GetDaysByMonth(time->year, lbRTC_MONTHS_MAX); + } else { + day = lbRTC_GetDaysByMonth(time->year, (time->month - 1)); + } + + currentDay -= days; + + if (currentDay <= 0) { + if (currentDay == 0) { + currentDay = day; + } else { + currentDay += day; + } + + lbRTC_Sub_MM(time, 1); + } + + time->day = (lbRTC_day_t)currentDay; +} + +void lbRTC_Sub_hh(lbRTC_time_c* time, s32 hour) { + s32 timeHour = time->hour; + timeHour -= hour; + + if (timeHour < 0) { + s32 temp = timeHour; + s32 days; + + temp = ABS(timeHour); + days = temp / lbRTC_HOURS_PER_DAY + 1; + timeHour = lbRTC_HOURS_PER_DAY - (temp % lbRTC_HOURS_PER_DAY); + + if (timeHour == lbRTC_HOURS_PER_DAY) { + timeHour = 0; + days--; + } + + lbRTC_Sub_DD(time, days); + } + + time->hour = (lbRTC_hour_t)timeHour; +} + +void lbRTC_Sub_mm(lbRTC_time_c* time, s32 min) { + s32 timeMin = time->min; + timeMin -= min; + + if (timeMin < 0) { + s32 temp = timeMin; + s32 hours; + + temp = ABS(timeMin); + hours = temp / lbRTC_MINUTES_PER_HOUR + 1; + timeMin = lbRTC_MINUTES_PER_HOUR - (temp % lbRTC_MINUTES_PER_HOUR); + + if (timeMin == lbRTC_MINUTES_PER_HOUR) { + timeMin = 0; + hours--; + } + + lbRTC_Sub_hh(time, hours); + } + + time->min = (lbRTC_min_t)timeMin; +} + +void lbRTC_Sub_ss(lbRTC_time_c* time, s32 sec) { + s32 timeSec = time->sec; + timeSec -= sec; + + if (timeSec < 0) { + s32 temp = timeSec; + s32 mins; + + temp = ABS(timeSec); + mins = temp / lbRTC_SECONDS_PER_MINUTE + 1; + timeSec = lbRTC_SECONDS_PER_MINUTE - (temp % lbRTC_SECONDS_PER_MINUTE); + + if (timeSec == lbRTC_SECONDS_PER_MINUTE) { + timeSec = 0; + mins--; + } + + lbRTC_Sub_mm(time, mins); + } + + time->sec = (lbRTC_sec_t)timeSec; +} + +void lbRTC_Sub_Date(lbRTC_time_c* time, const lbRTC_time_c* sub_time) { + lbRTC_Sub_ss(time, sub_time->sec); + lbRTC_Sub_mm(time, sub_time->min); + lbRTC_Sub_hh(time, sub_time->hour); + lbRTC_Sub_DD(time, sub_time->day); + lbRTC_Sub_MM(time, sub_time->month); + lbRTC_Sub_YY(time, sub_time->year); +} + +const lbRTC_time_c a_time = { 0, 0, 0, 1, 0, 1, 1901 }; + +lbRTC_weekday_t lbRTC_Week(lbRTC_year_t year, lbRTC_month_t month, lbRTC_day_t day) { + + lbRTC_time_c b_time = { 0, 0, 0, 0, 0, 0, 0000 }; + + b_time.year = year; + b_time.month = month; + b_time.day = day; + + return (lbRTC_weekday_t)((lbRTC_GetIntervalDays(&a_time, &b_time) + 2) % lbRTC_WEEKDAYS_MAX); +} + +void lbRTC_TimeCopy(lbRTC_time_c* dst, const lbRTC_time_c* src) { + *dst = *src; +} + +const lbRTC_day_t day_tbl[] = { 00, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + +s32 lbRTC_IsValidTime(const lbRTC_time_c* time) { + s32 res; + + if ((time->year < lbRTC_YEAR_MIN || time->year > lbRTC_YEAR_MAX) || (time->month == lbRTC_MONTHS_BEGIN) || + (time->month > lbRTC_MONTHS_MAX) || (time->day == 0) || (time->hour > lbRTC_HOURS_PER_DAY - 1) || + (time->min > lbRTC_MINUTES_PER_HOUR - 1) || (time->sec > lbRTC_SECONDS_PER_MINUTE - 1)) { + res = 0; + } else { + if (time->day == 29 && time->month == lbRTC_FEBRUARY) { + res = !(time->year & 3) ? 1 : 0; + } else if (time->day > day_tbl[time->month]) { + res = 0; + } else { + res = 1; + } + } + + return res; +} diff --git a/src/code/m_player_call.c b/src/code/m_player_call.c index 308eade..3f8a68c 100644 --- a/src/code/m_player_call.c +++ b/src/code/m_player_call.c @@ -1,4 +1,3 @@ -#include "prevent_bss_reordering.h" #include "ultra64.h" #include "m_actor.h" #include "m_actor_dlftbls.h" diff --git a/src/code/m_start_data_init.c b/src/code/m_start_data_init.c index c564b0d..519e519 100644 --- a/src/code/m_start_data_init.c +++ b/src/code/m_start_data_init.c @@ -17,7 +17,7 @@ #include "6E7AD0.h" #include "6ECD90.h" #include "6EDD10.h" -#include "6F8A60.h" +#include "lb_rtc.h" #include "global.h" #include "libc64/qrand.h" #include "m_all_grow.h" diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml index 63d1f80..5951d13 100644 --- a/yamls/jp/code.yaml +++ b/yamls/jp/code.yaml @@ -95,7 +95,7 @@ - [0x6F7500, asm, code/gfxalloc] - [0x6F7580, asm, code/graph] - [0x6F83B0, c, code/irqmgr] - - [0x6F8A60, asm, code/6F8A60] + - [0x6F8A60, c, code/lb_rtc] - [0x6F9B10, asm, code/6F9B10] - [0x6FA030, asm, code/listalloc] - [0x6FA180, asm, code/main] @@ -162,7 +162,8 @@ - [0x732C30, .data, code/game] - [0x732C40, data, code/732C40] - [0x732C50, .data, code/irqmgr] - - [0x732C70, data, code/732C70] + - [0x732C70, .data, code/lb_rtc] + - [0x732C80, data, code/732C80] - [0x733160, .data, code/sys_math_atan] - [0x733970, .data, code/sys_matrix] - [0x7339F0, .data, code/sys_ucode] @@ -231,7 +232,7 @@ - [0x73B980, .rodata, code/game] - [0x73B9C0, rodata, code/73B9C0] - [0x73BA50, .rodata, code/irqmgr] - - [0x73BA70, rodata, code/73BA70] + - [0x73BA70, .rodata, code/lb_rtc] - [0x73BB10, rodata, code/73BB10] - [0x73BCA0, rodata, code/73BCA0] - [0x73BD20, rodata, code/73BD20] @@ -271,7 +272,8 @@ - { start: 0x73F4D0, type: .bss, vram: 0x80145020, name: code/game } - { start: 0x73F4D0, type: bss, vram: 0x80145060, name: code/80145060 } - { start: 0x73F4D0, type: .bss, vram: 0x80145390, name: code/irqmgr } - - { start: 0x73F4D0, type: bss, vram: 0x80145620, name: code/80145620} + - { start: 0x73F4D0, type: .bss, vram: 0x80145620, name: code/lb_rtc} + - { start: 0x73F4D0, type: bss, vram: 0x80145630, name: code/80145630} - { start: 0x73F4D0, type: .bss, vram: 0x801462B0, name: code/sys_matrix } - { start: 0x73F4D0, type: bss, vram: 0x801462C0, name: code/801462C0 } - { start: 0x73F4D0, type: .bss, vram: 0x801492C0, name: code/zurumode } -- cgit v1.2.3