summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2023-09-25 17:32:19 +0200
committerGitHub <noreply@github.com>2023-09-25 08:32:19 -0700
commit4ba08394238a50c9dd5c049a80cb6ae2c04da481 (patch)
tree6ccdb5ecfba30f9ad19f5928842122489bf6a144
parent2ecf3d6345004f696656eceb320c44a07bfbd4fa (diff)
lb_rtc OK (#102)
* lb_rtc OK * fixes * Use equality enum values
-rw-r--r--include/6F8A60.h43
-rw-r--r--include/721EC0.h3
-rw-r--r--include/7220C0.h3
-rw-r--r--include/722310.h3
-rw-r--r--include/722880.h3
-rw-r--r--include/722970.h2
-rw-r--r--include/722AB0.h3
-rw-r--r--include/code_variables.h5
-rw-r--r--include/lb_rtc.h42
-rw-r--r--include/m_event.h1
-rw-r--r--include/padmgr.h4
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt66
-rw-r--r--src/code/lb_rtc.c593
-rw-r--r--src/code/m_player_call.c1
-rw-r--r--src/code/m_start_data_init.c2
-rw-r--r--yamls/jp/code.yaml10
16 files changed, 689 insertions, 95 deletions
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 }